Monotone-Parent: 2a8fb061b8e9b14122e6737e18c8011d5717b81a

Monotone-Revision: 79e96bad18e27c8d142f04fe18be100bc2a7e975

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2011-08-05T23:35:18
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2011-08-05 23:35:18 +00:00
parent c21e42814f
commit 982b6f70a4
3 changed files with 73 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2011-08-05 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/NSString+MAPIStore.m (-convertHexStringToBytes): new
method that returns an NSData from a string of hex values
represented as text.
2011-08-04 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreDraftsMessage.m (-getMessageData:inMemCtx:):

View File

@ -29,6 +29,8 @@
- (char *) asUnicodeInMemCtx: (void *) memCtx;
- (NSData *) convertHexStringToBytes;
@end
#endif /* NSSTRING+MAPISTORE_H */

View File

@ -44,4 +44,69 @@
return unicode;
}
- (BOOL) _decodeHexByte: (uint8_t *) byte
atPos: (NSUInteger) pos
{
BOOL error = NO;
unichar byteChar;
byteChar = [self characterAtIndex: pos];
if (byteChar >= 48 && byteChar <= 57)
*byte = (uint8_t) byteChar - 48;
else if (byteChar >= 65 && byteChar <= 70)
*byte = (uint8_t) byteChar - 55;
else if (byteChar >= 97 && byteChar <= 102)
*byte = (uint8_t) byteChar - 87;
else
error = YES;
return error;
}
- (BOOL) _decodeHexPair: (uint8_t *) byte
atPos: (NSUInteger) pos
{
BOOL error;
uint8_t lowValue, highValue;
error = [self _decodeHexByte: &highValue atPos: pos];
if (!error)
{
error = [self _decodeHexByte: &lowValue atPos: pos + 1];
if (!error)
*byte = highValue << 4 | lowValue;
}
return error;
}
- (NSData *) convertHexStringToBytes
{
NSUInteger count, strLen, bytesLen;
uint8_t *bytes, *currentByte;
NSData *decoded = nil;
BOOL error = NO;
strLen = [self length];
if ((strLen % 2) == 0)
{
bytesLen = strLen / 2;
bytes = NSZoneCalloc (NULL, bytesLen, sizeof (uint8_t));
currentByte = bytes;
for (count = 0; !error && count < strLen; count += 2)
{
error = [self _decodeHexPair: currentByte atPos: count];
currentByte++;
}
if (error)
NSZoneFree (NULL, bytes);
else
decoded = [NSData dataWithBytesNoCopy: bytes
length: bytesLen
freeWhenDone: YES];
}
return decoded;
}
@end