]> err.no Git - scalable-opengroupware.org/commitdiff
more mailer work
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sat, 2 Oct 2004 00:57:24 +0000 (00:57 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Sat, 2 Oct 2004 00:57:24 +0000 (00:57 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@337 d1b88da0-ebda-0310-925b-ed51d893ca5b

SOGo/SoObjects/Mailer/ChangeLog
SOGo/SoObjects/Mailer/SOGoMailFolder.h
SOGo/SoObjects/Mailer/SOGoMailFolder.m
SOGo/SoObjects/Mailer/SOGoMailManager.h
SOGo/SoObjects/Mailer/SOGoMailManager.m
SOGo/SoObjects/Mailer/Version
SOGo/UI/Mailer/UIxMailListView.m

index 6d95d2ea83387bbe55ddcd25c1e519a5023a5943..793d2f22b663de3bccaa39229078b856ab3b1dea 100644 (file)
@@ -1,5 +1,7 @@
 2004-10-01  Helge Hess  <helge.hess@opengroupware.org>
 
+       * more work on fetching mails (v0.9.18)
+
        * v0.9.17
 
        * SOGoMailFolder.m: -fetchUIDsMatchingQualifier:sortOrdering:range: was
index 9febee9520e611901ec5a843752b1020fe731939..82ac0d5d28ee6d60993055e7ec34597f6457eafe 100644 (file)
@@ -44,6 +44,7 @@
 
 - (NSArray *)fetchUIDsMatchingQualifier:(id)_q sortOrdering:(id)_so
   range:(NSRange)_r;
+- (NSArray *)fetchUIDs:(NSArray *)_uids parts:(NSArray *)_parts;
 
 @end
 
index aae4b257f3d3d1c173ddde6945b5d8aa2b62eb53..2d1c9dab6a54b4f1a6b6fd5047756be4a89cf29b 100644 (file)
                             password:[self imap4Password]];
 }
 
+- (NSArray *)fetchUIDs:(NSArray *)_uids parts:(NSArray *)_parts {
+  return [[self mailManager] fetchUIDs:_uids inURL:[self imap4URL]
+                            parts:_parts
+                            password:[self imap4Password]];
+}
+
 /* name lookup */
 
 - (BOOL)isMessageKey:(NSString *)_key inContext:(id)_ctx {
index f8ac75802cfc78975989b7304f1ed95d58585734..b431d0f19416ede7e58e64c01a055b3f4307723f 100644 (file)
@@ -56,6 +56,8 @@
 
 - (NSArray *)fetchUIDsInURL:(NSURL *)_url qualifier:(id)_q
   sortOrdering:(id)_so range:(NSRange)_range password:(NSString *)_pwd;
+- (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url
+  parts:(NSArray *)_parts password:(NSString *)_pwd;
 
 @end
 
index 2912ea7ffc8f61aa9ee2ccb1de50d79c00e88997..39efa9768b16588476a5a55678cf3874733230f0 100644 (file)
@@ -345,7 +345,7 @@ static NSTimeInterval PoolScanInterval = 5 * 60;
   
   result = [client select:[self imap4FolderNameForURL:_url]];
   if (![[result valueForKey:@"result"] boolValue]) {
-    [self logWithFormat:@"ERROR: could not select URL: %@", _url];
+    [self logWithFormat:@"ERROR: could not select URL: %@: %@", _url, result];
     return nil;
   }
   
@@ -360,12 +360,47 @@ static NSTimeInterval PoolScanInterval = 5 * 60;
     [self logWithFormat:@"ERROR: got no UIDs for URL: %@: %@", _url, result];
     return nil;
   }
-
-  // TODO: range
+  
+  // TODO: improve to use a single range call?
+  if (_range.location > 0) {
+    uids = [uids subarrayWithRange:NSMakeRange(_range.location,
+                                              [uids count]-_range.location)];
+  }
+  if ([uids count] > _range.length && _range.length != 0)
+    uids = [uids subarrayWithRange:NSMakeRange(0, _range.length)];
   
   return uids;
 }
 
+- (NSArray *)fetchUIDs:(NSArray *)_uids inURL:(NSURL *)_url
+  parts:(NSArray *)_parts password:(NSString *)_pwd
+{
+  NGImap4Client *client;
+  NSDictionary  *result;
+
+  if (_uids == nil)
+    return nil;
+  if ([_uids count] == 0)
+    return [NSArray array];
+  
+  if ((client = [self imap4ClientForURL:_url password:_pwd]) == nil)
+    return nil;
+
+#warning TODO: split uids into batches, otherwise Cyrus will complain
+  // not really important because we batch before (in the sort)
+  // if the list is too long, we get a:
+  //   "* BYE Fatal error: word too long"
+  
+  result = [client fetchUids:_uids parts:_parts];
+  if (![[result valueForKey:@"result"] boolValue]) {
+    [self logWithFormat:@"ERROR: could not fetch %d uids for url: %@",
+           [_uids count],_url];
+    return nil;
+  }
+  //[self logWithFormat:@"RESULT: %@", result];
+  return (id)result;
+}
+
 /* debugging */
 
 - (BOOL)isDebuggingEnabled {
index 33dfbe1b04726220aa5142e7e070a02c182f5657..cd35ad0fc7134df7fcc93aab18344f258f338c2b 100644 (file)
@@ -1,3 +1,3 @@
 # $Id$
 
-SUBMINOR_VERSION:=17
+SUBMINOR_VERSION:=18
index 7893672e095d839b091c8af40b9836b318b6d578..f94e21d8f6f7d41998a8de2da8a3922e806401c1 100644 (file)
 @implementation UIxMailListView
 
 - (id)defaultAction {
+  NSArray *uids;
+  NSArray *msgs;
+  
   [self logWithFormat:@"default action ..."];
+  
+  uids = [[self clientObject] fetchUIDsMatchingQualifier:nil
+                             sortOrdering:@"SUBJECT"
+                             range:NSMakeRange(0, 50)];
+  
+  [self logWithFormat:@"UIDs: %@", [uids componentsJoinedByString:@", "]];
 
-  [self logWithFormat:@"UIDs: %@",
-       [[self clientObject] fetchUIDsMatchingQualifier:nil
-                            sortOrdering:@"SUBJECT"
-                            range:NSMakeRange(0, 1000000)]];
+  /*
+    Allowed fetch keys:
+      UID
+      BODY.PEEK[<section>]<<partial>>
+      BODYSTRUCTURE
+      ENVELOPE        [this is a parsed header, but does not include type]
+      FLAGS
+      INTERNALDATE
+      RFC822
+      RFC822.HEADER
+      RFC822.SIZE
+      RFC822.TEXT
+  */
+  
+  msgs = [[self clientObject] fetchUIDs:uids 
+                             parts:[NSArray arrayWithObjects:
+                                              @"FLAGS",
+                                              @"ENVELOPE",
+                                            nil]];
+  [self logWithFormat:@"  msg #%d", [[msgs valueForKey:@"fetch"] count]];
+  // keys: envelope
+  
   return self;
 }