From: helge Date: Fri, 25 Mar 2005 21:03:54 +0000 (+0000) Subject: implemented content datasource for mailfolders X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5288db8fab7529bc35b0795b51439742d498fb34;p=scalable-opengroupware.org implemented content datasource for mailfolders git-svn-id: http://svn.opengroupware.org/SOGo/trunk@641 d1b88da0-ebda-0310-925b-ed51d893ca5b --- diff --git a/SOGo/SoObjects/Mailer/ChangeLog b/SOGo/SoObjects/Mailer/ChangeLog index 4911223e..3505afe1 100644 --- a/SOGo/SoObjects/Mailer/ChangeLog +++ b/SOGo/SoObjects/Mailer/ChangeLog @@ -1,5 +1,9 @@ 2005-03-25 Helge Hess - + + * SOGoMailFolder.m: implemented content datasource for efficient WebDAV + listings (currently uses hardcoded parts and has inefficient DASL + support) (v0.9.82) + * v0.9.81 * SOGoMailFolder.m: implemented mailbox renaming using WebDAV MOVE diff --git a/SOGo/SoObjects/Mailer/GNUmakefile b/SOGo/SoObjects/Mailer/GNUmakefile index a6cf7580..2aabb591 100644 --- a/SOGo/SoObjects/Mailer/GNUmakefile +++ b/SOGo/SoObjects/Mailer/GNUmakefile @@ -18,6 +18,7 @@ Mailer_OBJC_FILES += \ SOGoMailAccount.m \ SOGoMailFolder.m \ SOGoMailObject.m \ + SOGoMailFolderDataSource.m \ \ SOGoMailBodyPart.m \ SOGoImageMailBodyPart.m \ diff --git a/SOGo/SoObjects/Mailer/SOGoMailFolder.m b/SOGo/SoObjects/Mailer/SOGoMailFolder.m index 4cdcd78f..57e070b9 100644 --- a/SOGo/SoObjects/Mailer/SOGoMailFolder.m +++ b/SOGo/SoObjects/Mailer/SOGoMailFolder.m @@ -24,6 +24,7 @@ #include "SOGoMailAccount.h" #include "SOGoMailManager.h" #include "SOGoMailboxInfo.h" +#include "SOGoMailFolderDataSource.h" #include "common.h" @implementation SOGoMailFolder @@ -79,6 +80,14 @@ return self->filenames; } +- (EODataSource *)contentDataSourceInContext:(id)_ctx { + SOGoMailFolderDataSource *ds; + + ds = [[SOGoMailFolderDataSource alloc] initWithImap4URL:[self imap4URL] + imap4Password:[self imap4Password]]; + return [ds autorelease]; +} + /* mailbox raw ops */ - (NSException *)primaryFetchMailboxInfo { diff --git a/SOGo/SoObjects/Mailer/SOGoMailFolderDataSource.h b/SOGo/SoObjects/Mailer/SOGoMailFolderDataSource.h new file mode 100644 index 00000000..8f6a8856 --- /dev/null +++ b/SOGo/SoObjects/Mailer/SOGoMailFolderDataSource.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2005 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#ifndef __Mailer_SOGoMailFolderDataSource_H__ +#define __Mailer_SOGoMailFolderDataSource_H__ + +#include + +/* + SOGoMailFolderDataSource + + This is used as the contentDataSource in the SOGoMailFolder, that is, as the + object to retrieve WebDAV listings of an IMAP4 folder. +*/ + +@class NSString, NSURL, NSArray; +@class EOFetchSpecification; + +@interface SOGoMailFolderDataSource : EODataSource +{ + EOFetchSpecification *fetchSpecification; + NSURL *imap4URL; + NSString *imap4Password; +} + +- (id)initWithImap4URL:(NSURL *)_imap4URL imap4Password:(NSString *)_pwd; + +/* accessors */ + +- (void)setFetchSpecification:(EOFetchSpecification *)_fetchSpec; +- (EOFetchSpecification *)fetchSpecification; + +- (NSURL *)imap4URL; + +/* operations */ + +- (NSArray *)fetchObjects; + +@end + +#endif /* SOGoMailFolderDataSource */ diff --git a/SOGo/SoObjects/Mailer/SOGoMailFolderDataSource.m b/SOGo/SoObjects/Mailer/SOGoMailFolderDataSource.m new file mode 100644 index 00000000..8f5f33bf --- /dev/null +++ b/SOGo/SoObjects/Mailer/SOGoMailFolderDataSource.m @@ -0,0 +1,216 @@ +/* + Copyright (C) 2005 SKYRIX Software AG + + This file is part of OpenGroupware.org. + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#include "SOGoMailFolderDataSource.h" +#include "SOGoMailManager.h" +#include +#include +#include "common.h" + +@implementation SOGoMailFolderDataSource + +static BOOL debugOn = NO; + +- (id)initWithImap4URL:(NSURL *)_imap4URL imap4Password:(NSString *)_pwd { + if (_imap4URL == nil) { + [self release]; + return nil; + } + + if ((self = [super init])) { + self->imap4URL = [_imap4URL copy]; + self->imap4Password = [_pwd copy]; + } + return self; +} +- (id)init { + return [self initWithImap4URL:nil imap4Password:nil]; +} + +- (void)dealloc { + [self->imap4Password release]; + [self->imap4URL release]; + [self->fetchSpecification release]; + [super dealloc]; +} + +/* accessors */ + +- (void)setFetchSpecification:(EOFetchSpecification *)_fetchSpec { + if ([_fetchSpec isEqual:self->fetchSpecification]) return; + + ASSIGN(self->fetchSpecification, _fetchSpec); + [self postDataSourceChangedNotification]; +} +- (EOFetchSpecification *)fetchSpecification { + return self->fetchSpecification; +} + +- (NSURL *)imap4URL { + return self->imap4URL; +} + +- (SOGoMailManager *)mailManager { + static SOGoMailManager *mm = nil; + if (mm == nil) mm = [[SOGoMailManager defaultMailManager] retain]; + return mm; +} + +/* fetches */ + +- (NSArray *)partsForWebDAVPropertyNames:(NSArray *)_names { + // TODO: implement + static NSArray *parts = nil; + + // [self logWithFormat:@"props: %@", _names]; + + if (parts == nil) { + parts = [[NSArray alloc] initWithObjects: + @"FLAGS", @"ENVELOPE", @"RFC822.SIZE", nil]; + } + return parts; +} + +- (void)addRecordsForFolderNames:(NSArray *)_n toArray:(NSMutableArray *)_r { + unsigned i, count; + + for (i = 0, count = [_n count]; i < count; i++) { + NSDictionary *rec; + NSString *keys[2], *values[2]; + + keys[0] = @"{DAV:}href"; values[0] = [_n objectAtIndex:i]; + keys[1] = @"davResourceType"; values[1] = @"collection"; + rec = [[NSDictionary alloc] initWithObjects:values forKeys:keys count:2]; + [_r addObject:rec]; + [rec release]; + } +} + +- (void)addRecordsForUIDs:(NSArray *)_uids toArray:(NSMutableArray *)_r { + NSAutoreleasePool *pool; + NSArray *partNames, *results; + unsigned i, count; + + if ([_uids count] == 0) + return; + + pool = [[NSAutoreleasePool alloc] init]; + + partNames = [self partsForWebDAVPropertyNames: + [[self fetchSpecification] selectedWebDAVPropertyNames]]; + + results = [[self mailManager] fetchUIDs:_uids inURL:self->imap4URL + parts:partNames password:self->imap4Password]; + results = [results valueForKey:@"fetch"]; + + for (i = 0, count = [results count]; i < count; i++) { + NGImap4Envelope *envelope; + NSDictionary *result; + NSDictionary *rec; + NSString *keys[6]; + id values[6]; + + result = [results objectAtIndex:i]; + envelope = [result valueForKey:@"envelope"]; + // NSLog(@"RES: %@", result); + + keys[0] = @"{DAV:}href"; + values[0] = [[[result objectForKey:@"uid"] stringValue] + stringByAppendingString:@".mail"]; + keys[1] = @"davResourceType"; + values[1] = @""; + keys[2] = @"davContentLength"; + values[2] = [result objectForKey:@"size"]; + keys[3] = @"davDisplayName"; + values[3] = [envelope subject]; + keys[4] = @"davLastModified"; + values[4] = [envelope date]; + + rec = [[NSDictionary alloc] initWithObjects:values forKeys:keys count:5]; + [_r addObject:rec]; + [rec release]; + } + + [pool release]; +} + +/* operations */ + +- (NSArray *)fetchObjects { + NSMutableArray *results; + EOQualifier *qualifier; + NSArray *sortOrderings; + NSArray *uids, *folderNames; + unsigned total; + + // TODO: support [fs davBulkTargetKeys] + if ([[self fetchSpecification] davBulkTargetKeys] != nil) { + [self logWithFormat:@"unsupported fetch specification"]; + return nil; + } + + /* fetch message uids */ + + // TODO: translate WebDAV qualifier and sort-ordering into IMAP4 one + uids = [[self mailManager] fetchUIDsInURL:self->imap4URL + qualifier:nil sortOrdering:@"DATE" + password:self->imap4Password]; + + /* fetch folders */ + + folderNames = [[self mailManager] subfoldersForURL:self->imap4URL + password:self->imap4Password]; + + /* builds results */ + + if ((total = ([uids count] + [folderNames count])) == 0) + return [NSArray array]; + + results = [NSMutableArray arrayWithCapacity:total]; + + [self addRecordsForFolderNames:folderNames toArray:results]; + [self addRecordsForUIDs:uids toArray:results]; + + /* filter and sort results */ + + if ((qualifier = [[self fetchSpecification] qualifier]) != nil) + results = (id)[results filteredArrayUsingQualifier:qualifier]; + + if ((sortOrderings = [[self fetchSpecification] sortOrderings]) != nil) { + if (qualifier != nil) + results = (id)[results sortedArrayUsingKeyOrderArray:sortOrderings]; + else + [results sortUsingKeyOrderArray:sortOrderings]; + } + + return results; +} + +/* logging */ + +- (NSString *)loggingPrefix { + return @"[mailfolder-ds]"; +} +- (BOOL)isDebuggingEnabled { + return debugOn; +} + +@end /* SOGoMailFolderDataSource */ diff --git a/SOGo/SoObjects/Mailer/Version b/SOGo/SoObjects/Mailer/Version index 9550b82f..a5afd5ea 100644 --- a/SOGo/SoObjects/Mailer/Version +++ b/SOGo/SoObjects/Mailer/Version @@ -1,6 +1,6 @@ # Version file -SUBMINOR_VERSION:=81 +SUBMINOR_VERSION:=82 # v0.9.69 requires libNGMime v4.5.210 # v0.9.55 requires libNGExtensions v4.5.136