This is MailMessage.m in view mode; [Download] [Up]
/* -*-C-*- ******************************************************************************* * * File: MailMessage.m * RCS: /usr/local/sources/CVS/mailapp-utilities/MailMessage.m,v 1.2 1996/12/01 17:03:01 tom Exp * Description: Handle mailmessages for searchmail * Author: Carl Edman * Created: Wed Mar 29 10:18:11 1995 * Modified: Fri Apr 7 09:59:56 1995 (Carl Edman) cedman@freedom.princeton.edu * Language: C * Package: N/A * Status: Experimental (Do Not Distribute) * * (C) Copyright 1995, but otherwise this file is perfect freeware. * ******************************************************************************* */ #import <appkit/appkit.h> #import <indexing/indexing.h> #import <ctype.h> #import <libc.h> #import "MailMessage.h" #import "MailBox.h" #import "mailutil.h" #import "mailtoc.h" static int getbox(id box,char **tocbuf,int *toclen,char **mboxbuf,int *mboxlen) { return 0; } @implementation MailMessage -finishReading { return self; } -source:aTranscriber didReadRecord:(unsigned int)aHandle { return self; } -source:aTranscriber willWriteRecord:(unsigned int)aHandle { return self; } -(const char *)header:(const char *)header { char *mboxbuf,*tocbuf; int mboxlen,toclen; struct message_index *m; int moff,mlen,hlen; char *mbase,*p; if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return ""; if (pos+len>toclen) return ""; m=(struct message_index *)(tocbuf+pos); moff=NXSwapBigLongToHost(m->mes_offset); mlen=NXSwapBigLongToHost(m->mes_length); if (moff+mlen>mboxlen) return ""; mbase=mboxbuf+moff; hlen=strlen(header); for(p=mbase;p<mbase+mlen;) { if (!strncmp(p,header,hlen)) { char *beg=p+hlen,*ret; for(p=beg;p<mbase+mlen;p++) if (*(p-1)=='\n' && *p!='\t') { p--; break; } ret=malloc(p-beg+1); strncpy(ret,beg,p-beg); ret[p-beg]='\0'; return ret; } if (*p=='\n') break; while ((*p!='\n')&&(p<mbase+mlen)) p++; p++; } return ""; } -initInBox:(id)nbox at:(unsigned int)npos { char *mboxbuf,*tocbuf; int mboxlen,toclen; struct message_index *m; box=nbox; pos=npos; if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) { [self free]; return nil; } if (pos+sizeof(struct message_index)>toclen) { [self free]; return nil; } m=(struct message_index *)(tocbuf+pos); len=NXSwapBigLongToHost(m->record_length); if (pos+len>toclen) { [self free]; return nil; } crc=calc_crc(tocbuf+pos,len); return self; } -(BOOL)validate { char *mboxbuf,*tocbuf; int mboxlen,toclen; struct message_index *m; if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return NO; if (pos+len>toclen) return NO; m=(struct message_index *)(tocbuf+pos); if (len!=NXSwapBigLongToHost(m->record_length)) return NO; if (crc!=calc_crc(tocbuf+pos,len)) return NO; return YES; } -(id)box { return box; } -(unsigned short)len { return len; } -(unsigned int)position { return pos; } -(const char *)messageHeaders { char *mboxbuf,*tocbuf; int mboxlen,toclen; struct message_index *m; int moff,mlen; char *mbase,*p; if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return ""; if (pos+len>toclen) return ""; m=(struct message_index *)(tocbuf+pos); moff=NXSwapBigLongToHost(m->mes_offset); mlen=NXSwapBigLongToHost(m->mes_length); if (moff+mlen>mboxlen) return ""; mbase=mboxbuf+moff; for(p=mbase;p<mbase+mlen;) { if (*p=='\n') break; while ((*p!='\n')&&(p<mbase+mlen)) p++; p++; } { char *ret=malloc(p-mbase+1); strncpy(ret,mbase,p-mbase); ret[p-mbase]='\0'; return ret; } } -(const char *)messageContent { char *mboxbuf,*tocbuf; int mboxlen,toclen; struct message_index *m; int moff,mlen; char *mbase,*p,*ret; if (getbox(box,&tocbuf,&toclen,&mboxbuf,&mboxlen)) return ""; if (pos+len>toclen) return ""; m=(struct message_index *)(tocbuf+pos); p=m->data; p+=strlen(p)+1; p+=strlen(p)+1; if (*p) { int fd, i; char path[MAXPATHLEN]; if ((i=mailboxdir(path))<0) return ""; path[i++]='/'; /* XXX strcat(path,mailboxdir); */ strcat(path,p); strcat(path,"/index.rtf"); if ((fd=open(path,O_RDONLY))<0) return ""; if ((i=filesize(path))<0) return ""; p=malloc(i+1); if (read(fd,p,i)!=i) { close(fd); return ""; } close(fd); p[i]='\0'; return p; } moff=NXSwapBigLongToHost(m->mes_offset); mlen=NXSwapBigLongToHost(m->mes_length); if (moff+mlen>mboxlen) return ""; mbase=mboxbuf+moff; for(p=mbase;p<mbase+mlen;) { if (*p=='\n') break; while ((*p!='\n')&&(p<mbase+mlen)) p++; p++; } p++; ret=malloc(mbase+mlen-p+1); strncpy(ret,p,mbase+mlen-p+1); ret[mbase+mlen-p+1]='\0'; return ret; } -(const char *)messageSubject { return [self header:"Subject: "]; } -(const char *)messageFrom { return [self header:"From: "]; } -(const char *)messageTo { return [self header:"To: "]; } -(const char *)messageDate { return [self header:"Date: "]; } -(const char *)messageId { return [self header:"Message-Id: "]; } -(const char *)messageNextReference { return [self header:"Next-Reference: "]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.