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>
* NSString+NGCards.m (-asCalendarDate): added handling of date that

View File

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

View File

@ -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

View File

@ -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;

View File

@ -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];