From a67e4762dcdedd007f75f10eff6f5f1a44a03ea6 Mon Sep 17 00:00:00 2001 From: Matt Ronge Date: Tue, 14 Aug 2007 21:22:34 -0500 Subject: [PATCH] Single mime parts now need to be fetched by hand --- Source/CTCoreMessage.m | 1 + Source/CTMIME_ImagePart.h | 1 - Source/CTMIME_ImagePart.m | 22 ++-------- Source/CTMIME_SinglePart.h | 14 ++++++- Source/CTMIME_SinglePart.m | 83 +++++++++++++++++++++++++------------- Source/CTMIME_TextPart.h | 1 - Source/CTMIME_TextPart.m | 28 ++++--------- 7 files changed, 82 insertions(+), 68 deletions(-) diff --git a/Source/CTCoreMessage.m b/Source/CTCoreMessage.m index 10f763b..90c6723 100644 --- a/Source/CTCoreMessage.m +++ b/Source/CTCoreMessage.m @@ -135,6 +135,7 @@ char * etpan_encode_mime_header(char * phrase) [self _buildUpBodyText:[mime content] result:result]; } else if ([mime isKindOfClass:[CTMIME_TextPart class]]) { + [(CTMIME_TextPart *)mime fetchPart]; [result appendString:[mime content]]; } else if ([mime isKindOfClass:[CTMIME_MultiPart class]]) { diff --git a/Source/CTMIME_ImagePart.h b/Source/CTMIME_ImagePart.h index 494c880..95ac087 100644 --- a/Source/CTMIME_ImagePart.h +++ b/Source/CTMIME_ImagePart.h @@ -33,7 +33,6 @@ #import "CTMIME_SinglePart.h" @interface CTMIME_ImagePart : CTMIME_SinglePart { - NSImage *mImage; } - (id)content; - (void)setImage:(NSImage *)image; diff --git a/Source/CTMIME_ImagePart.m b/Source/CTMIME_ImagePart.m index 484fb18..3c72573 100644 --- a/Source/CTMIME_ImagePart.m +++ b/Source/CTMIME_ImagePart.m @@ -33,23 +33,14 @@ @implementation CTMIME_ImagePart -- (id)initWithMIMEStruct:(struct mailmime *)mime forMessage:(struct mailmessage *)message { - self = [super init]; - if (self) { - NSData *data = [self parsePart:mime forMessage:message]; - mImage = [[NSImage alloc] initWithData:data]; - } - return self; -} - - (id)content { - return mImage; + return [[[NSImage alloc] initWithData:self.data] autorelease]; } - (void)setImage:(NSImage *)image { - [image release]; - [mImage release]; - mImage = image; + // The data is all local, so we don't want it to do any fetching + self.fetched = YES; + //TODO Implement me } - (struct mailmime *)buildMIMEStruct { @@ -79,9 +70,4 @@ // assert(r == MAILIMF_NO_ERROR); // return mime_sub; } - -- (void)dealloc { - [mImage release]; - [super dealloc]; -} @end diff --git a/Source/CTMIME_SinglePart.h b/Source/CTMIME_SinglePart.h index b6ddcd6..d9592fb 100644 --- a/Source/CTMIME_SinglePart.h +++ b/Source/CTMIME_SinglePart.h @@ -33,6 +33,18 @@ #import "CTMIME.h" @interface CTMIME_SinglePart : CTMIME { + struct mailmime *mMime; + struct mailmessage *mMessage; + + NSData *mData; + BOOL mAttached; + BOOL mFetched; + NSString *mFilename; } -- (NSData *)parsePart:(struct mailmime *)mime forMessage:(struct mailmessage *)message; +@property BOOL attached; +@property BOOL fetched; +@property(retain) NSString *filename; +@property(retain) NSData *data; + +- (void)fetchPart; @end diff --git a/Source/CTMIME_SinglePart.m b/Source/CTMIME_SinglePart.m index 1e5debd..e921876 100644 --- a/Source/CTMIME_SinglePart.m +++ b/Source/CTMIME_SinglePart.m @@ -35,34 +35,63 @@ #import "MailCoreTypes.h" @implementation CTMIME_SinglePart -- (NSData *)parsePart:(struct mailmime *)mime forMessage:(struct mailmessage *)message { - struct mailmime_single_fields *mimeFields = NULL; - - int encoding = MAILMIME_MECHANISM_8BIT; - mimeFields = mailmime_single_fields_new(mime->mm_mime_fields, mime->mm_content_type); - if (mimeFields != NULL && mimeFields->fld_encoding != NULL) - encoding = mimeFields->fld_encoding->enc_type; - - char *fetchedData; - size_t fetchedDataLen; - int r = mailmessage_fetch_section(message, mime, &fetchedData, &fetchedDataLen); - if (r != MAIL_NO_ERROR) { - mailmessage_fetch_result_free(message, fetchedData); - RaiseException(CTMIMEParseError, CTMIMEParseErrorDesc); - } +@synthesize attached=mAttached; +@synthesize filename=mFilename; +@synthesize data=mData; +@synthesize fetched=mFetched; - size_t current_index = 0; - char * result; - size_t result_len; - r = mailmime_part_parse(fetchedData, fetchedDataLen, ¤t_index, encoding, &result, &result_len); - if (r != MAILIMF_NO_ERROR) { - mailmime_decoded_part_free(result); - RaiseException(CTMIMEParseError, CTMIMEParseErrorDesc); +- (id)initWithMIMEStruct:(struct mailmime *)mime + forMessage:(struct mailmessage *)message { + self = [super init]; + if (self) { + self.attached = NO; + self.filename = nil; + self.data = nil; + mMime = mime; + mMessage = message; + self.fetched = NO; } - NSData *data = [NSData dataWithBytes:result length:result_len]; - mailmessage_fetch_result_free(message, fetchedData); - mailmime_decoded_part_free(result); - mailmime_single_fields_free(mimeFields); - return data; + return self; +} + +- (void)fetchPart { + if (self.fetched == NO) { + struct mailmime_single_fields *mimeFields = NULL; + + int encoding = MAILMIME_MECHANISM_8BIT; + mimeFields = mailmime_single_fields_new(mMime->mm_mime_fields, mMime->mm_content_type); + if (mimeFields != NULL && mimeFields->fld_encoding != NULL) + encoding = mimeFields->fld_encoding->enc_type; + + char *fetchedData; + size_t fetchedDataLen; + int r = mailmessage_fetch_section(mMessage, mMime, &fetchedData, &fetchedDataLen); + if (r != MAIL_NO_ERROR) { + mailmessage_fetch_result_free(mMessage, fetchedData); + RaiseException(CTMIMEParseError, CTMIMEParseErrorDesc); + } + + size_t current_index = 0; + char * result; + size_t result_len; + r = mailmime_part_parse(fetchedData, fetchedDataLen, ¤t_index, encoding, &result, &result_len); + if (r != MAILIMF_NO_ERROR) { + mailmime_decoded_part_free(result); + RaiseException(CTMIMEParseError, CTMIMEParseErrorDesc); + } + NSData *data = [NSData dataWithBytes:result length:result_len]; + mailmessage_fetch_result_free(mMessage, fetchedData); + mailmime_decoded_part_free(result); + mailmime_single_fields_free(mimeFields); + self.data = data; + self.fetched = YES; + } +} + +- (void)dealloc { + [mData release]; + [mFilename release]; + //The structs are held by CTCoreMessage so we don't have to free them + [super dealloc]; } @end diff --git a/Source/CTMIME_TextPart.h b/Source/CTMIME_TextPart.h index 203ddce..413f195 100644 --- a/Source/CTMIME_TextPart.h +++ b/Source/CTMIME_TextPart.h @@ -33,7 +33,6 @@ #import "CTMIME_SinglePart.h" @interface CTMIME_TextPart : CTMIME_SinglePart { - NSString *myString; } + (id)mimeTextPartWithString:(NSString *)str; - (id)initWithString:(NSString *)string; diff --git a/Source/CTMIME_TextPart.m b/Source/CTMIME_TextPart.m index deb5481..25a9bd8 100644 --- a/Source/CTMIME_TextPart.m +++ b/Source/CTMIME_TextPart.m @@ -39,31 +39,23 @@ return [[[CTMIME_TextPart alloc] initWithString:str] autorelease]; } -- (id)initWithMIMEStruct:(struct mailmime *)mime forMessage:(struct mailmessage *)message { - self = [super init]; - if (self) { - NSData *data = [self parsePart:mime forMessage:message]; - myString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; - } - return self; -} - - (id)initWithString:(NSString *)string { self = [super init]; if (self) { - myString = [string retain]; + [self setString:string]; } return self; } - (id)content { - return myString; + NSString *str = [[NSString alloc] initWithData:self.data encoding:NSASCIIStringEncoding]; + return [str autorelease]; } - (void)setString:(NSString *)str { - [str retain]; - [myString release]; - myString = str; + self.data = [str dataUsingEncoding:NSASCIIStringEncoding]; + // The data is all local, so we don't want it to do any fetching + self.fetched = YES; } - (struct mailmime *)buildMIMEStruct { @@ -89,13 +81,9 @@ mime_sub = mailmime_new_empty(content, mime_fields); assert(mime_sub != NULL); - r = mailmime_set_body_text(mime_sub, strdup([myString cStringUsingEncoding:NSASCIIStringEncoding]), [myString length]); + NSString *str = [self content]; + r = mailmime_set_body_text(mime_sub, strdup([str cStringUsingEncoding:NSASCIIStringEncoding]), [str length]); assert(r == MAILIMF_NO_ERROR); return mime_sub; } - -- (void)dealloc { - [myString release]; - [super dealloc]; -} @end