]> err.no Git - scalable-opengroupware.org/commitdiff
prepared message fetching
authorhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 1 Oct 2004 00:11:30 +0000 (00:11 +0000)
committerhelge <helge@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Fri, 1 Oct 2004 00:11:30 +0000 (00:11 +0000)
git-svn-id: http://svn.opengroupware.org/SOGo/trunk@336 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 1c64918b6d728c87f5f42a636a25030b9f3a16fb..6d95d2ea83387bbe55ddcd25c1e519a5023a5943 100644 (file)
@@ -1,3 +1,13 @@
+2004-10-01  Helge Hess  <helge.hess@opengroupware.org>
+
+       * v0.9.17
+
+       * SOGoMailFolder.m: -fetchUIDsMatchingQualifier:sortOrdering:range: was
+         added to retrieve message UIDs
+
+       * SOGoMailManager.m: added method for fetching message ids with server
+         side sorting
+
 2004-09-30  Helge Hess  <helge.hess@skyrix.com>
        
        * v0.9.16
index 373fbd7d13c911c88b13a8c66d979049adf8b93a..9febee9520e611901ec5a843752b1020fe731939 100644 (file)
@@ -24,6 +24,7 @@
 #define __Mailer_SOGoMailFolder_H__
 
 #include <SOGo/SoObjects/Mailer/SOGoMailBaseObject.h>
+#import <Foundation/NSRange.h>
 
 /*
   SOGoMailFolder
   The SOGoMailFolder maps to an IMAP4 folder from NGImap4.
 */
 
+@class NSArray;
+
 @interface SOGoMailFolder : SOGoMailBaseObject
 {
 }
 
+/* messages */
+
+- (NSArray *)fetchUIDsMatchingQualifier:(id)_q sortOrdering:(id)_so
+  range:(NSRange)_r;
+
 @end
 
 #endif /* __Mailer_SOGoMailFolder_H__ */
index 9f8d20c2944c6b6bbda92e497a0b94daa8e0149f..aae4b257f3d3d1c173ddde6945b5d8aa2b62eb53 100644 (file)
                             password:[self imap4Password]];
 }
 
+/* messages */
+
+- (NSArray *)fetchUIDsMatchingQualifier:(id)_q sortOrdering:(id)_so
+  range:(NSRange)_r
+{
+  return [[self mailManager] fetchUIDsInURL:[self imap4URL]
+                            qualifier:_q sortOrdering:_so range:_r
+                            password:[self imap4Password]];
+}
+
 /* name lookup */
 
 - (BOOL)isMessageKey:(NSString *)_key inContext:(id)_ctx {
index 0cf0e229b799810da06830329b6234f608348a10..f8ac75802cfc78975989b7304f1ed95d58585734 100644 (file)
@@ -23,6 +23,7 @@
 #define __Mailer_SOGoMailManager_H__
 
 #import <Foundation/NSObject.h>
+#import <Foundation/NSRange.h>
 
 /*
   SOGoMailManager
 - (NSString *)imap4FolderNameForURL:(NSURL *)_url;
 - (NSArray *)subfoldersForURL:(NSURL *)_url password:(NSString *)_pwd;
 
+/* messages */
+
+- (NSArray *)fetchUIDsInURL:(NSURL *)_url qualifier:(id)_q
+  sortOrdering:(id)_so range:(NSRange)_range password:(NSString *)_pwd;
+
 @end
 
 #endif /* __Mailer_SOGoMailManager_H__ */
index 8973495d2647d58990b95ffddd6c0cd545b62d84..2912ea7ffc8f61aa9ee2ccb1de50d79c00e88997 100644 (file)
@@ -49,6 +49,7 @@
 
 static BOOL           debugOn    = YES;
 static BOOL           debugCache = NO;
+static BOOL           debugKeys  = NO;
 static BOOL           poolingOff = NO;
 static NSTimeInterval PoolScanInterval = 5 * 60;
 
@@ -248,19 +249,19 @@ static NSTimeInterval PoolScanInterval = 5 * 60;
   /* Cyrus already tells us whether we need to check for children */
   flags = [result objectForKey:folderName];
   if ([flags containsObject:@"hasnochildren"]) {
-#if 0
-    [self debugWithFormat:@"folder %@ has no children.", folderName];
-#endif
+    if (debugKeys)
+      [self logWithFormat:@"folder %@ has no children.", folderName];
     return nil;
   }
 
-  [self debugWithFormat:@"all keys %@: %@", folderName, [result allKeys]];
+  if (debugKeys)
+    [self logWithFormat:@"all keys %@: %@", folderName, [result allKeys]];
   
   names = [self _getDirectChildren:[result allKeys] folderName:folderName];
-#if 0
-  [self debugWithFormat:@"subfolders of %@: %@", folderName, 
-       [names componentsJoinedByString:@","]];
-#endif
+  if (debugKeys) {
+    [self debugWithFormat:@"subfolders of %@: %@", folderName, 
+           [names componentsJoinedByString:@","]];
+  }
   return names;
 }
 
@@ -270,7 +271,7 @@ static NSTimeInterval PoolScanInterval = 5 * 60;
   NGImap4Client *client;
   NSDictionary  *result;
 
-  if (debugOn)
+  if (debugKeys)
     [self debugWithFormat:@"subfolders for URL: %@ ...",[_url absoluteString]];
   
   /* check cache */
@@ -327,6 +328,44 @@ static NSTimeInterval PoolScanInterval = 5 * 60;
   return [self extractSubfoldersForURL:_url fromResultSet:result];
 }
 
+/* messages */
+
+- (NSArray *)fetchUIDsInURL:(NSURL *)_url qualifier:(id)_qualifier
+  sortOrdering:(id)_so range:(NSRange)_range password:(NSString *)_pwd
+{
+  /* 
+     sortOrdering can be an NSString, an EOSortOrdering or an array of EOS.
+  */
+  NGImap4Client *client;
+  NSDictionary  *result;
+  NSArray       *uids;
+  
+  if ((client = [self imap4ClientForURL:_url password:_pwd]) == nil)
+    return nil;
+  
+  result = [client select:[self imap4FolderNameForURL:_url]];
+  if (![[result valueForKey:@"result"] boolValue]) {
+    [self logWithFormat:@"ERROR: could not select URL: %@", _url];
+    return nil;
+  }
+  
+  result = [client sort:_so qualifier:_qualifier encoding:@"UTF-8"];
+  if (![[result valueForKey:@"result"] boolValue]) {
+    [self logWithFormat:@"ERROR: could not sort contents of URL: %@", _url];
+    return nil;
+  }
+  
+  uids = [result valueForKey:@"sort"];
+  if (![uids isNotNull]) {
+    [self logWithFormat:@"ERROR: got no UIDs for URL: %@: %@", _url, result];
+    return nil;
+  }
+
+  // TODO: range
+  
+  return uids;
+}
+
 /* debugging */
 
 - (BOOL)isDebuggingEnabled {
index cf9e5c1262bbe256db9dcbe38538f8ad07693b99..33dfbe1b04726220aa5142e7e070a02c182f5657 100644 (file)
@@ -1,3 +1,3 @@
 # $Id$
 
-SUBMINOR_VERSION:=15
+SUBMINOR_VERSION:=17
index 4816b73c75e56710852c7a94d5371e5abf5f493d..7893672e095d839b091c8af40b9836b318b6d578 100644 (file)
 @end
 
 #include "common.h"
+#include <NGImap4/NGImap4Client.h>
+#include <SOGo/SoObjects/Mailer/SOGoMailFolder.h>
 
 @implementation UIxMailListView
 
-@end
+- (id)defaultAction {
+  [self logWithFormat:@"default action ..."];
+
+  [self logWithFormat:@"UIDs: %@",
+       [[self clientObject] fetchUIDsMatchingQualifier:nil
+                            sortOrdering:@"SUBJECT"
+                            range:NSMakeRange(0, 1000000)]];
+  return self;
+}
+
+@end /* UIxMailListView */