From a3c056ea8435937e4de35f76c674c67f978036aa Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 17 Jan 2017 15:12:29 -0500 Subject: [PATCH] (fix) deep-search for text/calendar parts --- ActiveSync/SOGoMailObject+ActiveSync.m | 78 +++++++++++++++----------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/ActiveSync/SOGoMailObject+ActiveSync.m b/ActiveSync/SOGoMailObject+ActiveSync.m index e0ece4c8d..34bf09cde 100644 --- a/ActiveSync/SOGoMailObject+ActiveSync.m +++ b/ActiveSync/SOGoMailObject+ActiveSync.m @@ -726,12 +726,53 @@ struct GlobalObjectId { // // // -- (iCalCalendar *) calendarFromIMIPMessage +- (iCalCalendar *) _calendarFromParts: (NSArray *) parts + parent: (id) parent { NSDictionary *part; + id bodyPart; + int i; + + for (i = 0; i < [parts count]; i++) + { + part = [parts objectAtIndex: i]; + bodyPart = [parent lookupImap4BodyPartKey: [NSString stringWithFormat: @"%d", i+1] + inContext: self->context]; + + if ([[part objectForKey: @"type"] isEqualToString: @"text"] && + [[part objectForKey: @"subtype"] isEqualToString: @"calendar"]) + { + if (bodyPart) + { + iCalCalendar *calendar; + NSData *calendarData; + + calendarData = [bodyPart fetchBLOBWithPeek: YES]; + calendar = nil; + + NS_DURING + calendar = [iCalCalendar parseSingleFromSource: calendarData]; + NS_HANDLER + calendar = nil; + NS_ENDHANDLER + + return calendar; + } + } + else if ([[part objectForKey: @"type"] isEqualToString: @"multipart"]) + return [self _calendarFromParts: [part objectForKey: @"parts"] parent: bodyPart]; + } + + return nil; +} + +// +// +// +- (iCalCalendar *) calendarFromIMIPMessage +{ NSString *type, *subtype; NSArray *parts; - int i; type = [[[self bodyStructure] valueForKey: @"type"] lowercaseString]; subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString]; @@ -764,38 +805,7 @@ struct GlobalObjectId { parts = [[self bodyStructure] objectForKey: @"parts"]; if ([parts count] > 1) - { - for (i = 0; i < [parts count]; i++) - { - part = [parts objectAtIndex: i]; - - if ([[part objectForKey: @"type"] isEqualToString: @"text"] && - [[part objectForKey: @"subtype"] isEqualToString: @"calendar"]) - { - id bodyPart; - - bodyPart = [self lookupImap4BodyPartKey: [NSString stringWithFormat: @"%d", i+1] - inContext: self->context]; - - if (bodyPart) - { - iCalCalendar *calendar; - NSData *calendarData; - - calendarData = [bodyPart fetchBLOBWithPeek: YES]; - calendar = nil; - - NS_DURING - calendar = [iCalCalendar parseSingleFromSource: calendarData]; - NS_HANDLER - calendar = nil; - NS_ENDHANDLER - - return calendar; - } - } - } - } + return [self _calendarFromParts: parts parent: self]; return nil; }