This is NeXTMail.m in view mode; [Download] [Up]
#import "NeXTMail.h"
#import "StringStorage.h"
#import "EnhancedApp.h"
#import "FileName.h"
#import "support.h"
#include <sys/file.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/stat.h>
const char rtfHeader[] = "{\\rtf0\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\n";
const char templateAttach[] = "{{\\attachment0 %s\n}\n";
const char tarCmd[] = "tar chf - -C %s * | compress > %s";
const char envelopeAddition[] = "NeXT-Attachment: %s, %d, 1/1, 9999, 0\n";
@implementation NeXTMail
-initForMUA: (const char *)anApp andMTA: (const char *)aMailer
{
[super initForMUA: anApp andMTA: aMailer];
tmpDir = [[StringStorage alloc] init:"/tmp/.nextmail"];
[tmpDir mktemp];
mkdir([tmpDir stringValue],0700);
attachFile = [[StringStorage alloc] init: [tmpDir stringValue]];
[attachFile appendStringValue: ".attach"];
chdir([tmpDir stringValue]);
[mailFile setStringValue: "/tmp/.mail"];
[mailFile mktemp];
fp = fopen([mailFile stringValue], "a");
if(!fp)
NXLogError("Failed to open %s", [mailFile stringValue]);
return self;
}
- free
{
int x,cnt;
fclose(fp);
unlink([mailFile stringValue]); /* unlink the mail file */
unlink([attachFile stringValue]); /* unlink the compressed tar file */
chdir([tmpDir stringValue]); /* clean up the enclosure directory */
unlink("index.rtf");
for(x = 0, cnt = [attachments count]; x < cnt; x++)
unlink([[attachments objectAt: x] basename]);
chdir([NXApp appDirectory]);
rmdir([tmpDir stringValue]); /* remove it */
[tmpDir free];
[attachFile free];
return [super free];
}
- buildBody
{
id aFile;
struct stat sbuf;
int indexFile, cnt, x;
char c;
char attachString[3 * FILENAME_MAX], resultName[FILENAME_MAX];
[super buildBody];
indexFile = open("index.rtf",O_RDWR|O_CREAT,0600);
if(indexFile == -1)
{
NXLogError("Could not create index.rtf\n");
return nil;
}
write(indexFile, rtfHeader, (size_t)strlen(rtfHeader));
/* SUCKS - FIX LATER */
for(x = 0, cnt = [body strlen]; x < cnt; x++)
{
c = *(char*)[body elementAt: x];
switch(c)
{
case '\134':
write(indexFile,"\134\134",2);
break;
case '\n':
write(indexFile,"\134\n",2);
break;
default:
write(indexFile,&c,1);
break;
}
}
for(x = 0, cnt = [attachments count]; x < cnt; x++)
{
aFile = [attachments objectAt: x];
sprintf(attachString, templateAttach, [aFile basename]);
write(indexFile, attachString, (size_t)strlen(attachString));
symlink([aFile stringValue],[aFile basename]);
}
write(indexFile,"}\n",2);
close(indexFile);
/* build compressed tar file */
sprintf(attachString,tarCmd,[tmpDir stringValue], [attachFile stringValue]);
system(attachString);
sprintf(resultName,".tar.%d%s", getpid(), [attachFile basename]);
/* update envelope */
stat([attachFile stringValue],&sbuf);
sprintf(attachString,envelopeAddition,resultName,sbuf.st_size);
fwrite(attachString,1,strlen(attachString),fp);
fwrite("\n",1,1,fp);
/* uueencode and append */
uuencode(resultName, [attachFile stringValue], fp, 0666);
return self;
}
+ (BOOL)supportsAttachments
{
return YES;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.