diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index 032315762..e32ca7c60 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,11 @@ +2010-10-08 Wolfgang Sourdeau + + * NSString+NGCards.m (-unescapedFromCard): removed obsolete + method. + (-componentsWithSafeSeparator:): renamed to + "vCardSubvaluesWithSeparator:" with proper unescaping of versit + values by scanning each character one after another. + 2010-09-28 Francis Lachapelle * NSString+NGCards.m (-asCalendarDate): added handling of date that diff --git a/SOPE/NGCards/NGCardsSaxHandler.m b/SOPE/NGCards/NGCardsSaxHandler.m index aa8928b07..cf5beac68 100644 --- a/SOPE/NGCards/NGCardsSaxHandler.m +++ b/SOPE/NGCards/NGCardsSaxHandler.m @@ -211,7 +211,7 @@ free (content); content = NULL; // NSLog (@"content: '%@'", s); - contentValues = [s componentsWithSafeSeparator: ';']; + contentValues = [s vCardSubvaluesWithSeparator: ';']; } else contentValues = nil; diff --git a/SOPE/NGCards/NSString+NGCards.h b/SOPE/NGCards/NSString+NGCards.h index 4b3fa0eb4..1fdb9bfb0 100644 --- a/SOPE/NGCards/NSString+NGCards.h +++ b/SOPE/NGCards/NSString+NGCards.h @@ -34,14 +34,13 @@ - (NSString *) foldedForVersitCards; - (NSArray *) asCardAttributeValues; - (NSString *) escapedForCards; -- (NSString *) unescapedFromCard; - (NSString *) rfc822Email; - (NSTimeInterval) durationAsTimeInterval; - (NSCalendarDate *) asCalendarDate; - (BOOL) isAllDayDate; -- (NSArray *) componentsWithSafeSeparator: (unichar) separator; +- (NSArray *) vCardSubvaluesWithSeparator: (unichar) separator; @end diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index 1fb730337..75d5eacba 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -118,27 +118,6 @@ static NSString *commaSeparator = nil; return string; } -- (NSString *) unescapedFromCard -{ - NSString *string; - - string = [self stringByReplacingString: @"\\," - withString: @","]; - string = [string stringByReplacingString: @"\\:" - withString: @":"]; - string = [string stringByReplacingString: @"\\;" - withString: @";"]; - string = [string stringByReplacingString: @"\\n" - withString: @"\n"]; - string = [string stringByReplacingString: @"\\r" - withString: @"\r"]; - string = [string stringByReplacingString: @"\\\\" - withString: @"\\"]; - string = [string stringByReplacingString: @"\\N" // Outlook lameness - withString: @"\n"]; - return string; -} - - (NSTimeInterval) durationAsTimeInterval { /* @@ -287,52 +266,73 @@ static NSString *commaSeparator = nil; return ([self length] == 8); } -- (NSArray *) componentsWithSafeSeparator: (unichar) separator +- (NSArray *) vCardSubvaluesWithSeparator: (unichar) separator { NSMutableArray *components; - NSRange currentRange; - unichar *stringBuffer; + unichar *stringBuffer, *substringBuffer; + NSString *substring; unichar currentChar; - unsigned int count, length; + NSUInteger substringLength, count, max; BOOL escaped; - components = [NSMutableArray array]; + components = [NSMutableArray arrayWithCapacity: 5]; - length = [self length]; - stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * length); + max = [self length]; + stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max); [self getCharacters: stringBuffer]; + substringLength = 0; - currentRange = NSMakeRange(0, 0); - escaped = NO; - count = 0; - while (count < length) + substringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max); + + for (count = 0; count < max; count++) { + currentChar = stringBuffer[count]; if (escaped) - currentRange.length++; + { + escaped = NO; + if (currentChar == 'n' || currentChar == 'N') + substringBuffer[substringLength] = '\n'; + else if (currentChar == 'r') + substringBuffer[substringLength] = '\r'; + else + substringBuffer[substringLength] = currentChar; + substringLength++; + } else - { - currentChar = *(stringBuffer + count); - if (currentChar == '\\') - escaped = YES; - else if (currentChar == separator) - { - [components - addObject: [self substringWithRange: currentRange]]; - currentRange = NSMakeRange (count + 1, 0); - } - else - currentRange.length++; - } - count++; + { + if (currentChar == '\\') + escaped = YES; + else if (currentChar == separator) + { + substring + = [[NSString alloc] initWithCharactersNoCopy: substringBuffer + length: substringLength + freeWhenDone: YES]; + [components addObject: substring]; + [substring release]; + substringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max); + substringLength = 0; + } + else + { + substringBuffer[substringLength] = currentChar; + substringLength++; + } + } } - [components - addObject: [self substringWithRange: currentRange]]; + + substring = [[NSString alloc] initWithCharactersNoCopy: substringBuffer + length: substringLength + freeWhenDone: YES]; + [components addObject: substring]; + [substring release]; NSZoneFree (NULL, stringBuffer); return components; } + - (NSString *) rfc822Email { unsigned idx; diff --git a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m index 3686c9c54..7c2797bbc 100644 --- a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m +++ b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m @@ -381,7 +381,7 @@ static NSCharacterSet *whitespaceCharSet = nil; #endif *attr_ = attrName; - *value_ = [attrValue unescapedFromCard]; + *value_ = attrValue; } - (SaxAttributes *) _mapAttrs: (NSArray *) _attrs @@ -475,15 +475,12 @@ static NSCharacterSet *whitespaceCharSet = nil; NSString *testContent; /* This is called for all non-BEGIN|END types. */ - testContent = [[_content unescapedFromCard] stringByReplacingString: @";" - withString: @""]; - + testContent = [_content stringByReplacingString: @";" withString: @""]; if ([[testContent stringByTrimmingSpaces] length] > 0) { [self _beginTag: _tagName group: _group withAttrs: _attrs]; - a = [(VSSaxTag *)[VSSaxTag alloc] - initWithContentString: [_content unescapedFromCard]]; + a = [(VSSaxTag *)[VSSaxTag alloc] initWithContentString: _content]; if (a) { [elementList addObject: a];