This is IConvertMIME.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "IConvertMIME.h"
#import <sys/file.h>
#import <streams/streams.h>
#import "IMMEditor.h"
#import "IBinaryD.h"
#import "ITextD.h"
#import "IArticleD.h"
#import "IOrderedListD.h"
#import "IMediaTable.h"
#import "IExternalD.h"
#import "mem_file_desc.h"
#import "data_types.h"
#import "errdebug.h"
int RTFparse();
char *Cleanse();
void concatstream();
char fontheader[2000];
NXStream *plain2rtf(), *ez2rtf(), *richtext2rtf(), *CreatertfHead();
@implementation IConvertMIME
- convertToMIME:(IArticleD *)article stream:(NXStream *)MimeArticleStream1
{
ITextD *bodyITextD;
BOOL isMultimedia;
InfoD *header;
NXStream *MimeArticleStream;
NXHashState state;
const char *key, *value;
struct mem_file_desc *file_desc_head = NULL;
struct mem_file_desc **fdpp = &file_desc_head;
struct mem_file_desc *fdp, *prevfdp;
id object;
int countObj;
int len,max,size;
char *buff;
// char *extension=NULL;
int n, ctr=0, plainonly=0;
char *contenttype=NULL;
char *bound=NULL;
extern int Ismultip;
countObj = [article objectCount];
countObj = countObj+2 ;
if ((bodyITextD = [article objectWithKey:INDEX_RTF]) != nil) {
isMultimedia = YES;
} else if ((bodyITextD = [article objectWithKey:PLAINTEXT]) != nil) {
isMultimedia = NO;
}
// if (strcmp(NXGetDefaultValue(OWNER,KANJICODE),"JIS")==0) {
// [bodyITextD kanjiCodeConvert:"euc_to_jis"];
// }
if ((header = [article dataForKey:HEADER_INFO]) == nil) {
// There is no header.tbl
} else {
// There is a header.tbl, namely normal.
if ([header infoForKey:"Mime-Version"] == nil ){
[header insertKey:"Mime-Version" value:"1.0"];
}
if ( countObj > 2 && (isMultimedia == YES)){
bound = (char *) calloc (200, sizeof(char));
sprintf(bound,"ISR.multimedia.%d.%d.%d",
getuid(), getpid(), ctr);
contenttype = (char *) calloc (200, sizeof(char));
sprintf(contenttype, "multipart/mixed ; boundary=""%s""", bound);
Ismultip=1;
ctr++;
[header insertKey:"Content-Type" value:contenttype];
} else if ( countObj == 2 && (isMultimedia == YES)){
bound = (char *) calloc (200, sizeof(char));
sprintf(bound,"ISR.multimedia.%d.%d.%d",
getuid(), getpid(), ctr);
[header insertKey:"Content-Type" value:"text/richtext"];
}else {
[header insertKey:"Content-Type" value:"text/plain"];
}
}
for (n = 0; countObj >= n+1 ; ++n) {
// for (n = 0; (object = [article objectAt:n]) != nil; ++n) {
// if (!strcmp(key = [object key], HEADER_INFO)) {
// continue;
// }
object = [article objectAt:n];
if ( object ){
if ((*fdpp = (struct mem_file_desc *)
malloc(sizeof(struct mem_file_desc))) == NULL) {
[NXApp terminate:self];
}
(void)strncpy((*fdpp)->fd_name, [object key], NAMSIZ);
// extension = rindex((*fdpp)->fd_name,'.');
// if (extension) {
// ++extension;
// extension = Cleanse(extension);
// } else extension = NULL;
(*fdpp)->fd_type = FD_STREAM;
// if ( extension ){
(*fdpp)->fd_stream = NXOpenMemory(NULL, 0, NX_READWRITE);
[object writeToStream:(*fdpp)->fd_stream];
(*fdpp)->fd_size = NXTell((*fdpp)->fd_stream);
NXSeek((*fdpp)->fd_stream, 0, NX_FROMSTART);
DBG(1, NXSaveToFile((*fdpp)->fd_stream, (*fdpp)->fd_name);)
NXSeek((*fdpp)->fd_stream, 0, NX_FROMSTART);
prevfdp = *fdpp;
fdpp = &(*fdpp)->fd_nextp;
if (!strcmp(key = [object key], PLAINTEXT)) {
plainonly=1;
break;
}
}else{
;
}
}
*fdpp = NULL;
MimeArticleStream = NXOpenMemory(NULL, 0, NX_READWRITE);
// terminate the posting
if ( isMultimedia == YES && plainonly == 0){
RTFparse(file_desc_head, MimeArticleStream, bound,countObj);
if ( countObj >= 3 )
NXPrintf(MimeArticleStream, "\r\n--%s-- ", bound);
}
else{
for (fdp = file_desc_head, n=0; fdp != NULL
; n++, fdp = fdp->fd_nextp) {
if(!strcmp(fdp->fd_name, PLAINTEXT)) {
NXSeek(fdp->fd_stream, (long)0,NX_FROMEND);
(long)size = NXTell(fdp->fd_stream);
NXSeek(fdp->fd_stream, (long)0,NX_FROMSTART);
NXGetMemoryBuffer(fdp->fd_stream,&buff,&len,&max);
NXWrite(MimeArticleStream, (const void *)buff, size);
break;
}
}
}
NXSeek(MimeArticleStream,(long)0, NX_FROMEND);
(long)size = NXTell(MimeArticleStream);
NXSeek(MimeArticleStream,(long)size-1, NX_FROMSTART);
NXPrintf(MimeArticleStream, "\r\n.\r\n");
state = [header initState];
while ([header nextState: &state key: (void **)&key value: (void **)&value]) {
NXPrintf(MimeArticleStream1, "%s: %s\r\n", key, value);
}
if ( *fontheader !='\0' ){
NXPrintf(MimeArticleStream1,"X-Fonttbl: {\\fonttbl%s}\r\n", fontheader);
fontheader[0]='\0';
}
// terminate header
NXPrintf(MimeArticleStream1, "\r\n");
concatstream(MimeArticleStream1, MimeArticleStream);
for (fdp = file_desc_head, n=0; fdp != NULL
; n++, fdp = fdp->fd_nextp) {
NXCloseMemory(fdp->fd_stream, NX_FREEBUFFER);
}
NXCloseMemory(MimeArticleStream,NX_FREEBUFFER);
NXSeek(MimeArticleStream1, (long)0, NX_FROMSTART);
DBG(1,NXSaveToFile(MimeArticleStream1, "MimeArticleStream");)
NXSeek(MimeArticleStream1, (long)0, NX_FROMSTART);
}
- convertToItem:(NXStream *)stream
{
id articleItem,mediaClass,mediaObject;
struct mem_file_desc *adpp,*temppp, *get_Item();
int i=0, plainonly=1;
NXStream *Body;
NXStream *plainBody;
NXStream *HBody;
NXStream *tmpStream;
char *extension=NULL;
char *temp_ext;
char *MsgId=NULL;
char *Mimeversion=NULL;
char *fonttbl=NULL;
char pathName[2048];
NXStream *crlfStream;
void tocrlf(NXStream *in, NXStream *out);
// convert '\n' --> '\r''\n'
// local disk convention is that the end of line is '\n', but MIME
// converter request '\r''\n' at the end
NXSeek (stream, (long)0, NX_FROMSTART);
crlfStream = NXOpenMemory (NULL, 0, NX_READWRITE);
tocrlf (stream, crlfStream);
NXSeek (crlfStream, (long)0, NX_FROMSTART);
temppp = get_Item(crlfStream);
NXCloseMemory (crlfStream, NX_FREEBUFFER);
for( adpp = temppp; adpp !=(struct mem_file_desc *)NULL ;
adpp = adpp->fd_nextp){
extension = rindex(adpp->fd_name, '.');
if (extension) {
++extension;
} else {
extension = (char *) calloc (15, sizeof(char));
strcpy(extension,"NULL_Extension");
}
temp_ext = (char *) calloc (100, sizeof(char));
strcpy(temp_ext,extension);
temp_ext=Cleanse(temp_ext);
if ( i == 0 ){
mediaClass =(id)[IMediaTable mediaClassForFileExtension:extension];
// There are really two kinds of .rtf objects: index.rtf and
// regular .rtf objects. The media table gives the object for
// index.rtf. Regular .rtf objects can be handled as binary
// objects.
if (mediaClass == (id)[IMediaTable mediaClassForFileExtension:
RTF_FILE_EXTENSION] && strcmp(adpp->fd_name, INDEX_RTF) != 0) {
mediaClass = [IBinaryD class];
}
mediaObject = [[(id)mediaClass allocFromZone:[self zone]]
initWithKey:adpp->fd_name];
NXSeek(adpp->fd_stream, (long)0,NX_FROMSTART);
[mediaObject readFromStream:adpp->fd_stream];
MsgId = [mediaObject infoForKey:MESSAGE_ID];
if (!MsgId){
MsgId = [mediaObject infoForKey:"Message-Id"];
if (!MsgId){
MsgId = [mediaObject infoForKey:"Message-id"];
if (!MsgId){
MsgId = (char *) calloc (200, sizeof(char));
strcpy(MsgId,"There_is_No_MessageID");
fprintf(stderr,"IConvertMIME:No Msg ID in the header\n");
}
}
}
fonttbl = [mediaObject infoForKey:"X-Fonttbl"];
if (!fonttbl){
fonttbl = [mediaObject infoForKey:"X-fonttbl"];
}
articleItem = [[IArticleD allocFromZone:[self zone]] initWithKey:MsgId];
Mimeversion = [mediaObject infoForKey:"Mime-Version"];
if (!Mimeversion){
if (!Mimeversion){
Mimeversion = [mediaObject infoForKey:"MIME-Version"];
if (!Mimeversion){
//fprintf(stderr,"IConvertMIME:No Mime-Version header\n");
Mimeversion = NULL;
}
}
}
DBG(1,NXSaveToFile(adpp->fd_stream, adpp->fd_name);)
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
[articleItem insertKeyedObject:mediaObject];
i++;
Body = NXOpenMemory(NULL,0,NX_READWRITE);
plainBody = NXOpenMemory(NULL,0,NX_READWRITE);
}else {
if ( Mimeversion == NULL ){
// There is no Mime-Version header in headers.
NXSeek(adpp->fd_stream, (long)0,NX_FROMSTART);
concatstream(plainBody,adpp->fd_stream);
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
}else{
// There is a Mime-Version header in headers.
if (!strcmp(temp_ext,"plain") ){
NXPrintf(Body,"\n");
concatstream(Body,tmpStream=plain2rtf(adpp->fd_stream));
concatstream(plainBody,adpp->fd_stream);
NXCloseMemory(tmpStream,NX_FREEBUFFER);
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
if ( plainonly )
plainonly=1;
else
plainonly=0;
}else if (!strcmp(temp_ext,"ez") ){
concatstream(Body,tmpStream=ez2rtf(adpp->fd_stream));
NXCloseMemory(tmpStream,NX_FREEBUFFER);
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
plainonly=0;
}else if (!strcmp(temp_ext,"next") ){
concatstream(Body,adpp->fd_stream);
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
plainonly=0;
strcpy(Mimeversion , "next");
}else if (!strcmp(temp_ext,"richtext") ){
NXPrintf(Body,"\n");
concatstream(Body,tmpStream=richtext2rtf(adpp->fd_stream));
NXCloseMemory(tmpStream,NX_FREEBUFFER);
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
plainonly=0;
}else{
plainonly=0;
NXPrintf(Body,
"\n{\\pard\\tx1280\\tx2560\\tx3840\\tx5120\\tx6400\\tx7680\\tx8960\\tx10240\\tx11520\\tx12800\\f0\\b0\\i0\\ul0\\fs32\\fc0{\\MMtiff%d %s\n}\n%c}", i++, adpp->fd_name, '\254');
if ( !strcmp(temp_ext,"local-file") ||
!strcmp(temp_ext,"x-news") ||
!strcmp(temp_ext,"anon-ftp")){
strncpy(pathName, adpp->fd_name, 2048);
*rindex(pathName,'.')= '\0';
mediaObject = [[IExternalD
allocFromZone:NXCreateZone(vm_page_size, vm_page_size, YES)]
initWithDomain:NXUniqueString(extension) andPath:pathName];
}else{
mediaClass =(id)[IMediaTable mediaClassForFileExtension:extension];
// There are really two kinds of .rtf objects: index.rtf
// and regular .rtf objects. The media table gives the
// object for index.rtf. Regular .rtf objects can be
// handled as binary objects.
if (mediaClass == (id)[IMediaTable
mediaClassForFileExtension:RTF_FILE_EXTENSION] &&
strcmp(adpp->fd_name, INDEX_RTF) != 0) {
mediaClass = [IBinaryD class];
}
if ( mediaClass != NULL ){
mediaObject = [[(id)mediaClass allocFromZone:[self zone]] initWithKey:adpp->fd_name];
NXSeek(adpp->fd_stream, (long)0,NX_FROMSTART);
[mediaObject readFromStream:adpp->fd_stream];
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
} else {
mediaObject = [IBinaryD allocFromZone: [self zone]];
[mediaObject initWithKey:adpp->fd_name];
[mediaObject readFromStream:adpp->fd_stream];
NXCloseMemory(adpp->fd_stream,NX_FREEBUFFER);
// [IMediaD getFileIconFor:mediaObject];
// [mediaObject setImage:icon];
}
[articleItem insertKeyedObject:mediaObject];
}
// [articleItem insertKeyedObject:mediaObject];
}
}
}
free(temp_ext);
}
if ( Mimeversion == NULL || plainonly == 1 ){
mediaObject = [[ITextD allocFromZone:[self zone]]
initWithKey:PLAINTEXT];
NXSeek(plainBody, (long)0,NX_FROMSTART);
[mediaObject readFromStream:plainBody];
// if (strcmp(NXGetDefaultValue(OWNER,KANJICODE),"JIS")==0) {
// [mediaObject kanjiCodeConvert:"jis_to_euc"];
// }
[articleItem insertKeyedObject:mediaObject];
DBG(1,NXSaveToFile(plainBody, PLAINTEXT);)
}else if (!strcmp(Mimeversion,"next")){
mediaObject = [[ITextD allocFromZone:[self zone]]
initWithKey:INDEX_RTF];
NXSeek(Body, (long)0,NX_FROMSTART);
[mediaObject readFromStream:Body];
// if (strcmp(NXGetDefaultValue(OWNER,KANJICODE),"JIS")==0) {
// [mediaObject kanjiCodeConvert:"jis_to_euc"];
// }
[articleItem insertKeyedObject:mediaObject];
DBG(1,NXSaveToFile(Body, INDEX_RTF);)
}else{
mediaObject = [[ITextD allocFromZone:[self zone]]
initWithKey:INDEX_RTF];
NXSeek(Body, (long)0,NX_FROMSTART);
HBody = NXOpenMemory(NULL,0,NX_READWRITE);
CreatertfHead(HBody, fonttbl);
fonttbl=NULL;
NXPrintf(HBody,"\n");
concatstream(HBody,Body);
NXPrintf(HBody,"}");
NXSeek(HBody, (long)0,NX_FROMSTART);
[mediaObject readFromStream:HBody];
// if (strcmp(NXGetDefaultValue(OWNER,KANJICODE),"JIS")==0) {
// [mediaObject kanjiCodeConvert:"jis_to_euc"];
// }
[articleItem insertKeyedObject:mediaObject];
DBG(1,NXSaveToFile(HBody, INDEX_RTF);)
NXCloseMemory(HBody,NX_FREEBUFFER);
}
NXCloseMemory(Body,NX_FREEBUFFER);
NXCloseMemory(plainBody,NX_FREEBUFFER);
free(temppp);
return(articleItem);
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.