home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / UNIX / Mail / mailapp-utilities-2.1-MIHS / Source / MailMessage.m < prev    next >
Encoding:
Text File  |  1996-12-01  |  5.5 KB  |  269 lines

  1. /* -*-C-*-
  2. *******************************************************************************
  3. *
  4. * File:         MailMessage.m
  5. * RCS:          /usr/local/sources/CVS/mailapp-utilities/MailMessage.m,v 1.2 1996/12/01 17:03:01 tom Exp
  6. * Description:  Handle mailmessages for searchmail
  7. * Author:       Carl Edman
  8. * Created:      Wed Mar 29 10:18:11 1995
  9. * Modified:     Fri Apr  7 09:59:56 1995 (Carl Edman) cedman@freedom.princeton.edu
  10. * Language:     C
  11. * Package:      N/A
  12. * Status:       Experimental (Do Not Distribute)
  13. *
  14. * (C) Copyright 1995, but otherwise this file is perfect freeware.
  15. *
  16. *******************************************************************************
  17. */
  18.  
  19. #import <appkit/appkit.h>
  20. #import <indexing/indexing.h>
  21. #import <ctype.h>
  22. #import <libc.h>
  23. #import "MailMessage.h"
  24. #import "MailBox.h"
  25. #import "mailutil.h"
  26. #import "mailtoc.h"
  27.  
  28. static int getbox(id box,char **tocbuf,int *toclen,char **mboxbuf,int *mboxlen)
  29.    {
  30.    return 0;
  31.    }
  32.  
  33. @implementation MailMessage
  34. -finishReading
  35.    {
  36.    return self;
  37.    }
  38.  
  39. -source:aTranscriber didReadRecord:(unsigned int)aHandle
  40.    {
  41.    return self;
  42.    }
  43.  
  44. -source:aTranscriber willWriteRecord:(unsigned int)aHandle
  45.    {
  46.    return self;
  47.    }
  48.  
  49. -(const char *)header:(const char *)header
  50.    {
  51.    char *mboxbuf,*tocbuf;
  52.    int mboxlen,toclen;
  53.    struct message_index *m;
  54.    int moff,mlen,hlen;
  55.    char *mbase,*p;
  56.       
  57.    if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return "";
  58.    if (pos+len>toclen) return "";
  59.  
  60.    m=(struct message_index *)(tocbuf+pos);
  61.    moff=NXSwapBigLongToHost(m->mes_offset);
  62.    mlen=NXSwapBigLongToHost(m->mes_length);
  63.  
  64.    if (moff+mlen>mboxlen) return "";
  65.    mbase=mboxbuf+moff;
  66.  
  67.    hlen=strlen(header);
  68.  
  69.    for(p=mbase;p<mbase+mlen;)
  70.       {
  71.       if (!strncmp(p,header,hlen))
  72.          {
  73.          char *beg=p+hlen,*ret;
  74.          
  75.          for(p=beg;p<mbase+mlen;p++)
  76.             if (*(p-1)=='\n' && *p!='\t') 
  77.                {
  78.                p--;
  79.                break;
  80.                }
  81.          ret=malloc(p-beg+1);
  82.          strncpy(ret,beg,p-beg);
  83.          ret[p-beg]='\0';
  84.          return ret;
  85.          }
  86.       if (*p=='\n') break;
  87.       while ((*p!='\n')&&(p<mbase+mlen)) p++;
  88.       p++;
  89.       }
  90.    
  91.    return "";
  92.    }
  93.  
  94. -initInBox:(id)nbox at:(unsigned int)npos
  95.    {
  96.    char *mboxbuf,*tocbuf;
  97.    int mboxlen,toclen;
  98.    struct message_index *m;
  99.  
  100.    box=nbox;
  101.    pos=npos;
  102.    
  103.    if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) { [self free]; return nil; }
  104.    if (pos+sizeof(struct message_index)>toclen) { [self free]; return nil; }
  105.  
  106.    m=(struct message_index *)(tocbuf+pos);
  107.    len=NXSwapBigLongToHost(m->record_length);
  108.    
  109.    if (pos+len>toclen) { [self free]; return nil; }
  110.  
  111.    crc=calc_crc(tocbuf+pos,len);
  112.    return self;
  113.    }
  114.  
  115. -(BOOL)validate
  116.    {
  117.    char *mboxbuf,*tocbuf;
  118.    int mboxlen,toclen;
  119.    struct message_index *m;
  120.  
  121.    if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return NO;
  122.    if (pos+len>toclen) return NO;
  123.  
  124.    m=(struct message_index *)(tocbuf+pos);
  125.    if (len!=NXSwapBigLongToHost(m->record_length)) return NO;
  126.    if (crc!=calc_crc(tocbuf+pos,len)) return NO;
  127.    return YES;
  128.    }
  129.  
  130. -(id)box
  131.    {
  132.    return box;
  133.    }
  134.  
  135. -(unsigned short)len
  136.    {
  137.    return len;
  138.    }
  139.  
  140. -(unsigned int)position
  141.    {
  142.    return pos;
  143.    }
  144.  
  145. -(const char *)messageHeaders
  146.    {
  147.    char *mboxbuf,*tocbuf;
  148.    int mboxlen,toclen;
  149.    struct message_index *m;
  150.    int moff,mlen;
  151.    char *mbase,*p;
  152.       
  153.    if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return "";
  154.    if (pos+len>toclen) return "";
  155.  
  156.    m=(struct message_index *)(tocbuf+pos);
  157.    moff=NXSwapBigLongToHost(m->mes_offset);
  158.    mlen=NXSwapBigLongToHost(m->mes_length);
  159.  
  160.    if (moff+mlen>mboxlen) return "";
  161.  
  162.    mbase=mboxbuf+moff;
  163.    for(p=mbase;p<mbase+mlen;)
  164.       {
  165.       if (*p=='\n') break;
  166.       while ((*p!='\n')&&(p<mbase+mlen)) p++;
  167.       p++;
  168.       }
  169.  
  170.       {
  171.       char *ret=malloc(p-mbase+1);
  172.       strncpy(ret,mbase,p-mbase);
  173.       ret[p-mbase]='\0';
  174.       return ret;
  175.       }
  176.    }
  177.  
  178. -(const char *)messageContent
  179.    {
  180.    char *mboxbuf,*tocbuf;
  181.    int mboxlen,toclen;
  182.    struct message_index *m;
  183.    int moff,mlen;
  184.    char *mbase,*p,*ret;
  185.       
  186.    if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return "";
  187.    if (pos+len>toclen) return "";
  188.  
  189.    m=(struct message_index *)(tocbuf+pos);
  190.  
  191.    p=m->data;
  192.    p+=strlen(p)+1;
  193.    p+=strlen(p)+1;
  194.  
  195.    if (*p)
  196.       {
  197.       int fd, i;
  198.       char path[MAXPATHLEN];
  199.  
  200.       if ((i=mailboxdir(path))<0) return "";
  201.       path[i++]='/';
  202.       /* XXX strcat(path,mailboxdir); */
  203.       
  204.       strcat(path,p);
  205.       strcat(path,"/index.rtf");
  206.       if ((fd=open(path,O_RDONLY))<0) return "";
  207.       if ((i=filesize(path))<0) return "";
  208.       p=malloc(i+1);
  209.       if (read(fd,p,i)!=i)
  210.          {
  211.          close(fd);
  212.          return "";
  213.          }
  214.       close(fd);
  215.       p[i]='\0';
  216.       return p;
  217.       }
  218.    
  219.    moff=NXSwapBigLongToHost(m->mes_offset);
  220.    mlen=NXSwapBigLongToHost(m->mes_length);
  221.  
  222.    if (moff+mlen>mboxlen) return "";
  223.    
  224.    mbase=mboxbuf+moff;
  225.    for(p=mbase;p<mbase+mlen;)
  226.       {
  227.       if (*p=='\n') break;
  228.       while ((*p!='\n')&&(p<mbase+mlen)) p++;
  229.       p++;
  230.       }
  231.    
  232.    p++;
  233.    ret=malloc(mbase+mlen-p+1);
  234.    strncpy(ret,p,mbase+mlen-p+1);
  235.    ret[mbase+mlen-p+1]='\0';
  236.    return ret;
  237.    }
  238.  
  239. -(const char *)messageSubject
  240.    {
  241.    return [self header:"Subject: "];
  242.    }
  243.  
  244. -(const char *)messageFrom
  245.    {
  246.    return [self header:"From: "];
  247.    }
  248.  
  249. -(const char *)messageTo
  250.    {
  251.    return [self header:"To: "];
  252.    }
  253.  
  254. -(const char *)messageDate
  255.    {
  256.    return [self header:"Date: "];
  257.    }
  258.  
  259. -(const char *)messageId
  260.    {
  261.    return [self header:"Message-Id: "];
  262.    }
  263.  
  264. -(const char *)messageNextReference
  265.    {
  266.    return [self header:"Next-Reference: "];
  267.    }
  268. @end
  269.