mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-05-12 06:55:26 +00:00
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:
@@ -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
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
@interface NSData (SOGoMailUtilities)
|
||||
|
||||
- (NSData *) bodyDataFromEncoding: (NSString *) encoding;
|
||||
- (NSString *) decodedSubject;
|
||||
- (NSString *) decodedString;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
- (NSString *) htmlToText;
|
||||
- (NSString *) stringByConvertingCRLNToHTML;
|
||||
- (int) indexOf: (unichar) _c;
|
||||
- (NSString *) decodedSubject;
|
||||
- (NSString *) decodedHeader;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"];
|
||||
|
||||
@@ -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"];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user