See ChangeLog

Monotone-Parent: c55d7e01ad80c68ff71c3684827782f73ac196ef
Monotone-Revision: f094a21d8e470bf3e243d0c7413263f48be70226

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2009-11-25T02:34:24
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Francis Lachapelle
2009-11-25 02:34:24 +00:00
parent c8358a9f4f
commit 3c24d99fb3
8 changed files with 96 additions and 50 deletions
+8
View File
@@ -1,3 +1,11 @@
2009-11-24 Francis Lachapelle <flachapelle@inverse.ca>
* SoObjects/Mailer/NSData+Mail.m (-decodedString): renamed from
decodedSubject. The decoding algorithm is now recursive.
* SoObjects/Mailer/NSString+Mail.m (-decodedHeader): renamed from
decodedSubject. The string is now decoded by parts.
2009-11-24 Ludovic Marcotte <lmarcotte@inverse.ca>
* SoObjects/SOGo/SOGoGroup.m
+1 -1
View File
@@ -30,7 +30,7 @@
@interface NSData (SOGoMailUtilities)
- (NSData *) bodyDataFromEncoding: (NSString *) encoding;
- (NSString *) decodedSubject;
- (NSString *) decodedString;
@end
+73 -31
View File
@@ -54,73 +54,115 @@
return decodedData;
}
- (NSString *) decodedSubject
/*
* Excpected form is: "=?charset?encoding?encoded text?=".
*/
- (NSString *) decodedString
{
const char *cData, *endFlag;
unsigned int len;
NSString *decodedSubject;
const char *cData;
unsigned int len, i, j;
NSString *decodedString;
cData = [self bytes];
len = [self length];
decodedString = nil;
if (len)
{
decodedSubject = nil;
if (len > 6)
{
endFlag = cData + len - 2;
if (*cData == '=' && *(cData + 1) == '?'
&& *endFlag == '?' && *(endFlag + 1) == '=')
// Find beginning of encoded text
i = 1;
while ((*cData != '=' || *(cData+1) != '?') && i < len)
{
cData++;
i++;
}
if (*cData == '=' && *(cData+1) == '?')
{
NSString *enc;
int i;
cData += 2;
i = 2;
while (*cData != '?' && i < len)
if (i > 1)
decodedString = [[[NSString alloc] initWithData: [self subdataWithRange: NSMakeRange(0, (i-1))]
encoding: NSASCIIStringEncoding] autorelease];
cData += 2; // skip "=?"
i++;
j = i;
// Find next "?"
while (*cData != '?' && j < len)
{
cData++;
i++;
j++;
}
enc = [[[NSString alloc] initWithData:[self subdataWithRange: NSMakeRange(2, i-2)]
enc = [[[NSString alloc] initWithData:[self subdataWithRange: NSMakeRange(i, j-i)]
encoding: NSASCIIStringEncoding] autorelease];
if (i+3 < len)
i = j + 3; // skip "?q?"
if (i < (len-2))
{
NSData *d;
d = [self subdataWithRange: NSMakeRange(i+3, len-i-5)];
BOOL isQuotedPrintable = NO;
cData++;
// We check if we have a QP or Base64 encoding
if (*(cData+1) == 'q' || *(cData+1) == 'Q')
if (*cData == 'q' || *cData == 'Q')
isQuotedPrintable = YES;
// Find end of encoded text
j = i;
cData += 2; // skip "q?"
while ((*cData != '?' || *(cData+1) != '=') && (j+1) < len)
{
cData++;
j++;
}
d = [self subdataWithRange: NSMakeRange(i, j-i)];
if (isQuotedPrintable)
d = [d dataByDecodingQuotedPrintable];
else
d = [d dataByDecodingBase64];
decodedSubject = [NSString stringWithData: d usingEncodingNamed: enc];
if (decodedString)
{
decodedString = [NSString stringWithFormat: @"%@%@",
decodedString, [NSString stringWithData: d
usingEncodingNamed: enc]];
}
else
decodedString = [NSString stringWithData: d
usingEncodingNamed: enc];
j += 2; // skip "?="
if (j < len)
{
// Recursively decode the remaining part
decodedString = [NSString stringWithFormat: @"%@%@",
decodedString,
[[self subdataWithRange: NSMakeRange(j, len-j)] decodedString]];
}
}
else
decodedSubject = nil;
decodedString = nil;
}
}
if (!decodedSubject)
if (!decodedString)
{
decodedSubject
decodedString
= [[NSString alloc] initWithData: self
encoding: NSUTF8StringEncoding];
if (!decodedSubject)
decodedSubject
if (!decodedString)
decodedString
= [[NSString alloc] initWithData: self
encoding: NSISOLatin1StringEncoding];
[decodedSubject autorelease];
[decodedString autorelease];
}
}
else
decodedSubject = @"";
decodedString = @"";
return decodedSubject;
return decodedString;
}
@end
+1 -1
View File
@@ -30,7 +30,7 @@
- (NSString *) htmlToText;
- (NSString *) stringByConvertingCRLNToHTML;
- (int) indexOf: (unichar) _c;
- (NSString *) decodedSubject;
- (NSString *) decodedHeader;
@end
+8 -13
View File
@@ -438,21 +438,16 @@ convertChars (const char *oldString, unsigned int oldLength,
return -1;
}
- (NSString *) decodedSubject
- (NSString *) decodedHeader
{
NSString *decodedSubject;
NSString *decodedHeader;
if ([self hasPrefix: @"=?"] && [self hasSuffix: @"?="])
{
decodedSubject = [[self dataUsingEncoding: NSASCIIStringEncoding]
decodedSubject];
if (!decodedSubject)
decodedSubject = self;
}
else
decodedSubject = self;
return decodedSubject;
decodedHeader = [[self dataUsingEncoding: NSASCIIStringEncoding]
decodedString];
if (!decodedHeader)
decodedHeader = self;
return decodedHeader;
}
@end
+1 -1
View File
@@ -271,7 +271,7 @@ static BOOL debugSoParts = NO;
- (NSString *) decodedSubject
{
return [[self subject] decodedSubject];
return [[self subject] decodedHeader];
}
- (NSCalendarDate *) date
@@ -145,7 +145,7 @@
{
component = [[components objectAtIndex: count] email];
if (component)
[formattedComponents addObject: [component decodedSubject]];
[formattedComponents addObject: [component decodedHeader]];
}
return [formattedComponents componentsJoinedByString: @", "];
@@ -162,7 +162,7 @@
// -stringByDecodingQuotedPrintable for all details
if ([baseSubject isKindOfClass: [NSString class]])
baseSubject = [baseSubject dataUsingEncoding: NSASCIIStringEncoding];
subject = [baseSubject decodedSubject];
subject = [baseSubject decodedString];
if (![subject length])
subject = [self labelForKey: @"Untitled"];
+2 -1
View File
@@ -45,6 +45,7 @@
#import <EOControl/EOQualifier.h>
#import <SoObjects/Mailer/NSString+Mail.h>
#import <SoObjects/Mailer/SOGoDraftsFolder.h>
#import <SoObjects/Mailer/SOGoMailFolder.h>
#import <SoObjects/Mailer/SOGoMailObject.h>
@@ -202,7 +203,7 @@ static NSArray *udColumnOrder = nil;
NSString *subject;
baseSubject = [[message valueForKey: @"envelope"] subject];
subject = [baseSubject decodedSubject];
subject = [baseSubject decodedHeader];
if (![subject length])
subject = [self labelForKey: @"Untitled"];