Monotone-Parent: 20ebf3a5a63320cd182175f76e87a294bcbcffa3

Monotone-Revision: 9e18165e3392af8af437f5bf0e1146ac806d4210

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2010-10-08T12:43:43
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2010-10-08 12:43:43 +00:00
parent b391953aa4
commit b4f8503826
5 changed files with 62 additions and 58 deletions

View File

@ -1,3 +1,11 @@
2010-10-08 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* 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 <flachapelle@inverse.ca> 2010-09-28 Francis Lachapelle <flachapelle@inverse.ca>
* NSString+NGCards.m (-asCalendarDate): added handling of date that * NSString+NGCards.m (-asCalendarDate): added handling of date that

View File

@ -211,7 +211,7 @@
free (content); free (content);
content = NULL; content = NULL;
// NSLog (@"content: '%@'", s); // NSLog (@"content: '%@'", s);
contentValues = [s componentsWithSafeSeparator: ';']; contentValues = [s vCardSubvaluesWithSeparator: ';'];
} }
else else
contentValues = nil; contentValues = nil;

View File

@ -34,14 +34,13 @@
- (NSString *) foldedForVersitCards; - (NSString *) foldedForVersitCards;
- (NSArray *) asCardAttributeValues; - (NSArray *) asCardAttributeValues;
- (NSString *) escapedForCards; - (NSString *) escapedForCards;
- (NSString *) unescapedFromCard;
- (NSString *) rfc822Email; - (NSString *) rfc822Email;
- (NSTimeInterval) durationAsTimeInterval; - (NSTimeInterval) durationAsTimeInterval;
- (NSCalendarDate *) asCalendarDate; - (NSCalendarDate *) asCalendarDate;
- (BOOL) isAllDayDate; - (BOOL) isAllDayDate;
- (NSArray *) componentsWithSafeSeparator: (unichar) separator; - (NSArray *) vCardSubvaluesWithSeparator: (unichar) separator;
@end @end

View File

@ -118,27 +118,6 @@ static NSString *commaSeparator = nil;
return string; 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 - (NSTimeInterval) durationAsTimeInterval
{ {
/* /*
@ -287,52 +266,73 @@ static NSString *commaSeparator = nil;
return ([self length] == 8); return ([self length] == 8);
} }
- (NSArray *) componentsWithSafeSeparator: (unichar) separator - (NSArray *) vCardSubvaluesWithSeparator: (unichar) separator
{ {
NSMutableArray *components; NSMutableArray *components;
NSRange currentRange; unichar *stringBuffer, *substringBuffer;
unichar *stringBuffer; NSString *substring;
unichar currentChar; unichar currentChar;
unsigned int count, length; NSUInteger substringLength, count, max;
BOOL escaped; BOOL escaped;
components = [NSMutableArray array]; components = [NSMutableArray arrayWithCapacity: 5];
length = [self length]; max = [self length];
stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * length); stringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max);
[self getCharacters: stringBuffer]; [self getCharacters: stringBuffer];
substringLength = 0;
currentRange = NSMakeRange(0, 0); substringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max);
escaped = NO;
count = 0; for (count = 0; count < max; count++)
while (count < length)
{ {
currentChar = stringBuffer[count];
if (escaped) 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 else
{ {
currentChar = *(stringBuffer + count); if (currentChar == '\\')
if (currentChar == '\\') escaped = YES;
escaped = YES; else if (currentChar == separator)
else if (currentChar == separator) {
{ substring
[components = [[NSString alloc] initWithCharactersNoCopy: substringBuffer
addObject: [self substringWithRange: currentRange]]; length: substringLength
currentRange = NSMakeRange (count + 1, 0); freeWhenDone: YES];
} [components addObject: substring];
else [substring release];
currentRange.length++; substringBuffer = NSZoneMalloc (NULL, sizeof (unichar) * max);
} substringLength = 0;
count++; }
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); NSZoneFree (NULL, stringBuffer);
return components; return components;
} }
- (NSString *) rfc822Email - (NSString *) rfc822Email
{ {
unsigned idx; unsigned idx;

View File

@ -381,7 +381,7 @@ static NSCharacterSet *whitespaceCharSet = nil;
#endif #endif
*attr_ = attrName; *attr_ = attrName;
*value_ = [attrValue unescapedFromCard]; *value_ = attrValue;
} }
- (SaxAttributes *) _mapAttrs: (NSArray *) _attrs - (SaxAttributes *) _mapAttrs: (NSArray *) _attrs
@ -475,15 +475,12 @@ static NSCharacterSet *whitespaceCharSet = nil;
NSString *testContent; NSString *testContent;
/* This is called for all non-BEGIN|END types. */ /* This is called for all non-BEGIN|END types. */
testContent = [[_content unescapedFromCard] stringByReplacingString: @";" testContent = [_content stringByReplacingString: @";" withString: @""];
withString: @""];
if ([[testContent stringByTrimmingSpaces] length] > 0) if ([[testContent stringByTrimmingSpaces] length] > 0)
{ {
[self _beginTag: _tagName group: _group withAttrs: _attrs]; [self _beginTag: _tagName group: _group withAttrs: _attrs];
a = [(VSSaxTag *)[VSSaxTag alloc] a = [(VSSaxTag *)[VSSaxTag alloc] initWithContentString: _content];
initWithContentString: [_content unescapedFromCard]];
if (a) if (a)
{ {
[elementList addObject: a]; [elementList addObject: a];