]> err.no Git - sope/commitdiff
fixed parsing of long subjects
authorhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 2 Oct 2004 00:41:20 +0000 (00:41 +0000)
committerhelge <helge@e4a50df8-12e2-0310-a44c-efbce7f8a7e3>
Sat, 2 Oct 2004 00:41:20 +0000 (00:41 +0000)
git-svn-id: http://svn.opengroupware.org/SOPE/trunk@213 e4a50df8-12e2-0310-a44c-efbce7f8a7e3

sope-mime/ChangeLog
sope-mime/NGImap4/ChangeLog
sope-mime/NGImap4/NGImap4Envelope.h
sope-mime/NGImap4/NGImap4Envelope.m
sope-mime/NGImap4/NGImap4ResponseParser.m
sope-mime/Version

index 78965794d33efd6c65f9637410e01ab5eaca595d..737d468c732c12f1538c35c2f9b3d0b367f7c846 100644 (file)
@@ -1,5 +1,7 @@
 2004-10-02  Helge Hess  <helge.hess@opengroupware.org>
 
+       * NGImap4: fixed long subject envelope processing (v4.3.186)
+
        * NGImap4: improved processing of envelope responses (v4.3.185)
 
 2004-10-01  Helge Hess  <helge.hess@opengroupware.org>
index eb060bacf9554ba60a78c553a2f1616839e2328e..b3bf7ba59294cc9f2246d9d6f7ec8fa641880af6 100644 (file)
@@ -1,5 +1,8 @@
 2004-10-02  Helge Hess  <helge.hess@opengroupware.org>
 
+       * NGImap4ResponseParser.m: support data-style subjects in envelopes
+         (v4.3.186)
+
        * NGImap4ResponseNormalizer.m: pass on envelope raw responses in
          normalized responses (v4.3.185)
 
index e44bf9144626b3cea904e9e5e278c386be752738..8a0e5ea2b4393aa3879440c76e099be928a8c4a1 100644 (file)
@@ -37,7 +37,7 @@
 {
 @public
   NSCalendarDate         *date;
-  NSString               *subject;
+  id                     subject; /* can be either NSData or NSString */
   NSString               *inReplyTo;
   NSString               *msgId;
   NGImap4EnvelopeAddress *from;
@@ -51,7 +51,7 @@
 /* accessors */
 
 - (NSCalendarDate *)date;
-- (NSString *)subject;
+- (id)subject;
 - (NSString *)inReplyTo;
 - (NSString *)messageID;
 - (NGImap4EnvelopeAddress *)from;
index 8e2bb0822e128bf04c211bb7ed7e0be9b57eb069..cbeb169024807e4b446e1a3117500e7994aa53af 100644 (file)
@@ -44,7 +44,7 @@
 - (NSCalendarDate *)date {
   return self->date;
 }
-- (NSString *)subject {
+- (id)subject {
   return self->subject;
 }
 - (NSString *)inReplyTo {
index c03db7bdaa0501dce445b0575ba55c64bd9c4ea6..05f7b90aa706a97a6663bbe3242c7ff28ef088cc 100644 (file)
@@ -146,6 +146,7 @@ static NSNull           *null   = nil;
   defCStringEncoding = [NSString defaultCStringEncoding];
   
   debugOn             = [ud boolForKey:@"ImapDebugEnabled"];
+  debugDataOn         = [ud boolForKey:@"ImapDebugDataEnabled"];
   UseMemoryMappedData = [ud boolForKey:@"NoMemoryMappedDataForImapBlobs"]?0:1;
   Imap4MMDataBoundary = [ud integerForKey:@"Imap4MMDataBoundary"];
   
@@ -452,7 +453,7 @@ static void _parseSieveRespone(NGImap4ResponseParser *self,
   /* got header */
   result = nil;  
   
-  _consume(self, 1);
+  _consume(self, 1); // '{'
   if ((sizeNum = _parseUnsigned(self)) == nil) {
     NSException *e;
 
@@ -624,10 +625,11 @@ static void _parseUntaggedResponse(NGImap4ResponseParser *self,
 
 - (NSString *)_parseQuotedString {
   /* parse a quoted string, eg '"' */
-  if (_la(self, 0) != '"')
-    return nil;
-  _consume(self, 1);
-  return _parseUntil(self, '"');
+  if (_la(self, 0) == '"') {
+    _consume(self, 1);
+    return _parseUntil(self, '"');
+  }
+  return nil;
 }
 - (void)_consumeOptionalSpace {
   if (_la(self, 0) == ' ') _consume(self, 1);
@@ -948,9 +950,21 @@ static BOOL _parseThreadResponse(NGImap4ResponseParser *self,
   return YES;
 }
 
-- (id)_parseQuotedStringOrNIL {
+- (NSString *)_parseQuotedStringOrNIL {
   if (_la(self, 0) == '"')
     return [self _parseQuotedString];
+  if (_matchesString(self, "NIL")) {
+    _consume(self, 3);
+    return (id)null;
+  }
+  return nil;
+}
+- (id)_parseQuotedStringOrDataOrNIL {
+  if (_la(self, 0) == '"')
+    return [self _parseQuotedString];
+  if (_la(self, 0) == '{')
+    return [self _parseData];
+  
   if (_matchesString(self, "NIL")) {
     _consume(self, 3);
     return null;
@@ -1078,41 +1092,72 @@ static BOOL _parseThreadResponse(NGImap4ResponseParser *self,
   
   /* parse subject */
   
-  if ((tmp = [self _parseQuotedStringOrNIL]))
+  if ((tmp = [self _parseQuotedStringOrDataOrNIL])) {
+    // TODO: that one is an issue, the client does know the requested charset
+    //       but doesn't pass it down to the parser? Requiring the client to
+    //       deal with NSData's is a bit overkill?
     env->subject = [tmp isNotNull] ? [tmp copy] : nil;
-  [self _consumeOptionalSpace];
-
+    [self _consumeOptionalSpace];
+  }
+  else {
+    [self logWithFormat:@"ERROR(%s): failed on subject(%c): %@",
+         __PRETTY_FUNCTION__, _la(self, 0), self->serverResponseDebug];
+    return nil;
+  }
+  [self logWithFormat:@"XX2: %c %@", _la(self, 0), self->serverResponseDebug];
+  
   /* parse addresses */
   
-  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil)
+  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil) {
     env->from = [tmp isNotNull] ? [[tmp lastObject] copy] : nil;
-  [self _consumeOptionalSpace];
-  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil)
+    [self _consumeOptionalSpace];
+  }
+  else {
+    [self logWithFormat:@"ERROR(%s): failed on from.", __PRETTY_FUNCTION__];
+    return nil;
+  }
+  [self logWithFormat:@"XX3: %c %@", _la(self, 0), self->serverResponseDebug];
+  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil) {
     env->sender = [tmp isNotNull] ? [[tmp lastObject] copy] : nil;
-  [self _consumeOptionalSpace];
-  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil)
+    [self _consumeOptionalSpace];
+  }
+  else {
+    [self logWithFormat:@"ERROR(%s): failed on sender.", __PRETTY_FUNCTION__];
+    return nil;
+  }
+  [self logWithFormat:@"XX3: %c %@", _la(self, 0), self->serverResponseDebug];
+  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil) {
     env->replyTo = [tmp isNotNull] ? [[tmp lastObject] copy] : nil;
-  [self _consumeOptionalSpace];
+    [self _consumeOptionalSpace];
+  }
   
-  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil)
+  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil) {
     env->to = [tmp isNotNull] ? [tmp copy] : nil;
-  [self _consumeOptionalSpace];
-  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil)
+    [self _consumeOptionalSpace];
+  }
+  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil) {
     env->cc = [tmp isNotNull] ? [tmp copy] : nil;
-  [self _consumeOptionalSpace];
-  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil)
+    [self _consumeOptionalSpace];
+  }
+  if ((tmp = [self _parseEnvelopeAddressStructures]) != nil) {
     env->bcc = [tmp isNotNull] ? [tmp copy] : nil;
-  [self _consumeOptionalSpace];
-  
-  if ((tmp = [self _parseQuotedStringOrNIL]))
+    [self _consumeOptionalSpace];
+  }
+
+  if ((tmp = [self _parseQuotedStringOrNIL])) {
     env->inReplyTo = [tmp isNotNull] ? [tmp copy] : nil;
-  [self _consumeOptionalSpace];
-  if ((tmp = [self _parseQuotedStringOrNIL]))
+    [self _consumeOptionalSpace];
+  }
+  if ((tmp = [self _parseQuotedStringOrNIL])) {
     env->msgId = [tmp isNotNull] ? [tmp copy] : nil;
-  [self _consumeOptionalSpace];
+    [self _consumeOptionalSpace];
+  }
   
-  if (_la(self, 0) != ')')
-    [self logWithFormat:@"WARNING: IMAP4 envelope not properly closed!"];
+  if (_la(self, 0) != ')') {
+    [self logWithFormat:@"WARNING: IMAP4 envelope not properly closed"
+           @" (c0=%c,c1=%c): %@",
+           _la(self, 0), _la(self, 1), self->serverResponseDebug];
+  }
   else
     _consume(self, 1);
   
@@ -1137,9 +1182,10 @@ static BOOL _parseThreadResponse(NGImap4ResponseParser *self,
     _consume(self, 6); /* "FETCH " */
     _consumeIfMatch(self, '(');
     while (_la(self, 0) != ')') { /* until closing parent */
-      NSString *key = nil;
+      NSString *key;
       
       key = [_parseUntil(self, ' ') lowercaseString];
+      [self logWithFormat:@"PARSE KEY: %@", key];
       if ([key hasPrefix:@"body["]) {
         NSDictionary *content;
         
@@ -1735,7 +1781,7 @@ static NSNumber *_parseUnsigned(NGImap4ResponseParser *self) {
 
 static NSString *_parseUntil(NGImap4ResponseParser *self, char _c) {
   /*
-    _parseUntil(self, char) consume the stop char
+    Note: this function consumes the stop char (_c)!
     normalize \r\n constructions
   */
   // TODO: optimize!
@@ -1750,9 +1796,10 @@ static NSString *_parseUntil(NGImap4ResponseParser *self, char _c) {
     _consume(self, 1);
     cnt++;
     if (cnt == 1024) {
-      if (str == nil)
+      if (str == nil) {
         str = (NSMutableString *)
           [NSMutableString stringWithCString:buf length:1024];
+      }
       else {
         NSString *s;
         
index 79942484e001c8ec74fcfb847f4f2a8a3decdffe..9033d0e8151711ac48a39632ae388c3604435cbb 100644 (file)
@@ -2,6 +2,6 @@
 
 MAJOR_VERSION:=4
 MINOR_VERSION:=3
-SUBMINOR_VERSION:=185
+SUBMINOR_VERSION:=186
 
 # v4.2.149 requires libNGStreams v4.2.34