Monotone-Parent: f643d3c57f70e9da6cd4bbc6b07967927a9a0d53

Monotone-Revision: 053b5d33cbcf453e7c7216c0b2a168a0f0ffa0d5

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2012-09-06T20:54:29
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2012-09-06 20:54:29 +00:00
parent fcc4334f76
commit 868c7b19cd
3 changed files with 74 additions and 6 deletions

View File

@ -1,5 +1,10 @@
2012-09-06 Wolfgang Sourdeau <wsourdeau@inverse.ca> 2012-09-06 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/NSString+MAPIStore.m
(-stringByReplacingPercentEscapesUsingEncoding:): reimplemented
method properly, to work-around the weird behaviour of the
original in GNUstep.
* OpenChange/MAPIStoreMailContext.m * OpenChange/MAPIStoreMailContext.m
(+listContextsForUser:withTDBIndexing:inMemCtx:): we escape the (+listContextsForUser:withTDBIndexing:inMemCtx:): we escape the
url string of non-ascii folder names. url string of non-ascii folder names.

View File

@ -34,6 +34,8 @@
- (NSData *) convertHexStringToBytes; - (NSData *) convertHexStringToBytes;
- (NSString *) stringByReplacingPercentEscapesUsingEncoding: (NSStringEncoding) encoding;
@end @end
#endif /* NSSTRING+MAPISTORE_H */ #endif /* NSSTRING+MAPISTORE_H */

View File

@ -67,19 +67,38 @@
return unicode; return unicode;
} }
- (char) _decodeHexByte: (char) byteChar
{
char newByte;
if (byteChar >= 48 && byteChar <= 57)
newByte = (uint8_t) byteChar - 48;
else if (byteChar >= 65 && byteChar <= 70)
newByte = (uint8_t) byteChar - 55;
else if (byteChar >= 97 && byteChar <= 102)
newByte = (uint8_t) byteChar - 87;
else
newByte = -1;
return newByte;
}
- (BOOL) _decodeHexByte: (uint8_t *) byte - (BOOL) _decodeHexByte: (uint8_t *) byte
atPos: (NSUInteger) pos atPos: (NSUInteger) pos
{ {
BOOL error = NO; BOOL error = NO;
char newByte;
unichar byteChar; unichar byteChar;
byteChar = [self characterAtIndex: pos]; byteChar = [self characterAtIndex: pos];
if (byteChar >= 48 && byteChar <= 57) if (byteChar < 256)
*byte = (uint8_t) byteChar - 48; {
else if (byteChar >= 65 && byteChar <= 70) newByte = [self _decodeHexByte: (char) byteChar];
*byte = (uint8_t) byteChar - 55; if (newByte == -1)
else if (byteChar >= 97 && byteChar <= 102) error = YES;
*byte = (uint8_t) byteChar - 87; else
*byte = newByte;
}
else else
error = YES; error = YES;
@ -132,4 +151,46 @@
return decoded; return decoded;
} }
- (NSString *) stringByReplacingPercentEscapesUsingEncoding: (NSStringEncoding) encoding
{
NSString *newString;
NSData *data;
NSUInteger count, length, newCount;
const char *bytes;
char *newBytes;
char newByte0, newByte1;
data = [self dataUsingEncoding: NSASCIIStringEncoding];
length = [data length];
bytes = [data bytes];
newBytes = NSZoneMalloc (NULL, sizeof (char) * length);
newCount = 0;
for (count = 0; count < length; count++)
{
if (bytes[count] == '%')
{
newByte0 = [self _decodeHexByte: bytes[count+1]];
newByte1 = [self _decodeHexByte: bytes[count+2]];
if ((newByte0 != -1) && (newByte1 != -1))
{
newBytes[newCount] = (((newByte0 << 4) & 0xf0)
| (newByte1 & 0x0f));
count += 2;
}
else
newBytes[newCount] = bytes[count];
}
else
newBytes[newCount] = bytes[count];
newCount++;
}
data = [NSData dataWithBytesNoCopy: newBytes length: newCount freeWhenDone: YES];
newString = [[NSString alloc]
initWithData: data encoding: encoding];
[newString autorelease];
return newString;
}
@end @end