]> err.no Git - scalable-opengroupware.org/commitdiff
more WebDAV tweaks
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 8 Oct 2004 14:27:37 +0000 (14:27 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 8 Oct 2004 14:27:37 +0000 (14:27 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@372 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailFolder.h
SOGo/SoObjects/Mailer/SOGoMailFolder.m
SOGo/SoObjects/Mailer/SOGoMailObject.m
SOGo/SoObjects/Mailer/Version

index 812f584935cfa68a5bfffc80218498d90e0f8bfd..7b0cddaeaefb9aecaff1a3c59a269356a50bfce9 100644 (file)
@@ -1,5 +1,15 @@
 2004-10-08  Helge Hess  <helge.hess@opengroupware.org>
 
+       * v0.9.30
+
+       * SOGoMailObject.m: added support for davContentLength, added
+         RFC822.SIZE to coreinfo attributes
+
+       * SOGoMailFolder.m: added .mail path extensions to generated
+         toOneRelationshipKeys
+
+       * SOGoMailObject.m: fixed body part id (starts with 1, not with 0)
+
        * v0.9.29
 
        * SOGoMailObject.m: added toOneRelationshipKeys/toManyRelationshipKeys
index 4b622cab16759212ff4539a1cb4a6e0e364f8743..3ec7f5dfa1b85641c888056ca50543b1ad116522 100644 (file)
@@ -38,6 +38,7 @@
 
 @interface SOGoMailFolder : SOGoMailBaseObject
 {
+  NSArray *filenames;
 }
 
 /* messages */
index b2104556fde3338f5392dabb1c0a8e02cde33b2a..0bb25c353bb5c441127d78758bcef678e0f76bca 100644 (file)
 
 @implementation SOGoMailFolder
 
+- (void)dealloc {
+  [self->filenames release];
+  [super dealloc];
+}
+
 /* IMAP4 */
 
 - (NSString *)relativeImap4Name {
                             password:[self imap4Password]];
 }
 - (NSArray *)toOneRelationshipKeys {
-  return [[self fetchUIDsMatchingQualifier:nil sortOrdering:@"DATE"]
-               valueForKey:@"stringValue"];
+  NSArray  *uids;
+  unsigned count;
+  
+  if (self->filenames != nil)
+    return [self->filenames isNotNull] ? self->filenames : nil;
+  
+  uids = [self fetchUIDsMatchingQualifier:nil sortOrdering:@"DATE"];
+  if ([uids isKindOfClass:[NSException class]])
+    return nil;
+  
+  if ((count = [uids count]) == 0) {
+    self->filenames = [[NSArray alloc] init];
+  }
+  else {
+    NSMutableArray *keys;
+    unsigned i;
+    
+    keys = [[NSMutableArray alloc] initWithCapacity:count];
+    for (i = 0; i < count; i++) {
+      NSString *k;
+
+      k = [[[uids objectAtIndex:i] stringValue]
+                 stringByAppendingString:@".mail"];
+      [keys addObject:k];
+    }
+    self->filenames = [keys copy];
+    [keys release];
+  }
+  return self->filenames;
 }
 
 /* messages */
index d6505d28f1c5e504b2e8d32c067453cd8b32d0d0..2ea6d67c05246166ebf7c3e51e96f8678103e58d 100644 (file)
 @implementation SOGoMailObject
 
 static NSArray *coreInfoKeys = nil;
+static BOOL heavyDebug = NO;
 
 + (void)initialize {
   /* Note: see SOGoMailManager.m for allowed IMAP4 keys */
   /* Note: "BODY" actually returns the structure! */
   coreInfoKeys = [[NSArray alloc] initWithObjects:
-                                   @"FLAGS", @"ENVELOPE", @"BODY", nil];
+                                   @"FLAGS", @"ENVELOPE", @"BODY",
+                                   @"RFC822.SIZE",
+                                   // not yet supported: @"INTERNALDATE",
+                                 nil];
 }
 
 - (void)dealloc {
@@ -46,7 +50,7 @@ static NSArray *coreInfoKeys = nil;
 /* IMAP4 */
 
 - (NSString *)relativeImap4Name {
-  return [self nameInContainer];
+  return [[self nameInContainer] stringByDeletingPathExtension];
 }
 
 /* hierarchy */
@@ -103,7 +107,7 @@ static NSArray *coreInfoKeys = nil;
       ma = [NSMutableArray arrayWithCapacity:count - i];
     
     ext = [self keyExtensionForPart:part];
-    key = [[NSString alloc] initWithFormat:@"%d%@", i, ext?ext:@""];
+    key = [[NSString alloc] initWithFormat:@"%d%@", i + 1, ext?ext:@""];
     [ma addObject:key];
     [key release];
   }
@@ -133,7 +137,7 @@ static NSArray *coreInfoKeys = nil;
     return [self->coreInfos isNotNull] ? self->coreInfos : nil;
 
   msgs = [[self clientObject] fetchParts:coreInfoKeys]; // returns dict
-  // [self logWithFormat:@"M: %@", msgs];
+  if (heavyDebug) [self logWithFormat:@"M: %@", msgs];
   msgs = [msgs valueForKey:@"fetch"];
   if ([msgs count] == 0)
     return nil;
@@ -170,17 +174,25 @@ static NSArray *coreInfoKeys = nil;
   NSString *p;
   id info;
   
-  info = [self bodyStructure];
+  if ((info = [self bodyStructure]) == nil) {
+    [self logWithFormat:@"ERROR: got no body part structure!"];
+    return nil;
+  }
+  
+  /* for each path component, eg 1,1,3 */
   pe = [_path objectEnumerator];
-  while ((p = [pe nextObject])) {
+  while ((p = [pe nextObject]) != nil && [info isNotNull]) {
     unsigned idx;
     NSArray  *parts;
     
+    [self logWithFormat:@"check PATH: %@", p];
     idx = [p intValue] - 1;
     
     parts = [info valueForKey:@"parts"];
     if (idx >= [parts count]) {
-      [self logWithFormat:@"ERROR: body part index out of bounds: %d", idx+1];
+      [self logWithFormat:
+             @"ERROR: body part index out of bounds(%d vs %d): %@", 
+             (idx + 1), [parts count], info];
       return nil;
     }
     info = [parts objectAtIndex:idx];
@@ -234,4 +246,16 @@ static NSArray *coreInfoKeys = nil;
   return NO;
 }
 
+- (id)davContentLength {
+  return [[self fetchCoreInfos] valueForKey:@"size"];
+}
+
+- (NSDate *)davCreationDate {
+  // TODO: use INTERNALDATE once NGImap4 supports that
+  return nil;
+}
+- (NSDate *)davLastModified {
+  return [self davCreationDate];
+}
+
 @end /* SOGoMailObject */
index 3631f8fc66cdf21de4aff18dbdf3b1e05e3abf16..d5906740cda9371acdbbdbd031e924c2a75dadff 100644 (file)
@@ -1,3 +1,3 @@
 # $Id$
 
-SUBMINOR_VERSION:=29
+SUBMINOR_VERSION:=30