sogo/SoObjects/Mailer/SOGoDraftsFolder.m
Wolfgang Sourdeau 8682bd0a6e Monotone-Parent: c63043930112867a49e597782a3e8abfc45f8d27
Monotone-Revision: 3b6b3a0c9997e878297c4afee55f37405eef1aad

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-07-10T14:21:08
Monotone-Branch: ca.inverse.sogo
2007-07-10 14:21:08 +00:00

186 lines
4.8 KiB
Objective-C

/*
Copyright (C) 2004-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 "SOGoDraftsFolder.h"
#include "SOGoDraftObject.h"
#include <SOGo/SOGoUserFolder.h>
#include <NGExtensions/NSFileManager+Extensions.h>
#include "common.h"
#include <unistd.h>
@implementation SOGoDraftsFolder
static NSString *spoolFolder = nil;
+ (void)initialize {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
spoolFolder = [[ud stringForKey:@"SOGoMailSpoolPath"] copy];
if ([spoolFolder length] < 3)
spoolFolder = @"/tmp/";
NSLog(@"Note: using SOGo mail spool folder: %@", spoolFolder);
}
/* new objects */
- (NSString *)makeNewObjectNameInContext:(id)_ctx {
static int counter = 1; // THREAD
return [NSString stringWithFormat:@"draft_%08d_%08x", getpid(), counter++];
}
- (NSString *)newObjectBaseURLInContext:(id)_ctx {
NSString *s, *n;
n = [self makeNewObjectNameInContext:_ctx];
if (![n isNotNull]) return nil;
s = [self baseURLInContext:_ctx];
if (![s isNotNull]) return nil;
if (![s hasSuffix:@"/"]) s = [s stringByAppendingString:@"/"];
return [s stringByAppendingString:n];
}
- (id)newObjectInContext:(id)_ctx {
return [self lookupName:[self makeNewObjectNameInContext:_ctx]
inContext:_ctx acquire:NO];
}
/* draft folder functionality */
- (NSFileManager *)spoolFileManager {
return [NSFileManager defaultManager];
}
- (NSString *)spoolFolderPath {
return spoolFolder;
}
- (NSString *)userSpoolFolderPath {
NSString *p, *n;
p = [self spoolFolderPath];
n = [[self lookupUserFolder] nameInContainer];
return [p stringByAppendingPathComponent:n];
}
- (BOOL)_ensureUserSpoolFolderPath {
NSFileManager *fm;
if ((fm = [self spoolFileManager]) == nil) {
[self errorWithFormat:@"missing spool file manager!"];
return NO;
}
return [fm createDirectoriesAtPath:[self userSpoolFolderPath]
attributes:nil];
}
- (NSArray *)fetchMailNames {
NSString *p;
if ((p = [self userSpoolFolderPath]) == nil)
return nil;
return [[self spoolFileManager] directoryContentsAtPath:p];
}
/* folder methods (used by template) */
- (NSArray *)fetchUIDsMatchingQualifier:(id)_q sortOrdering:(id)_so {
// TODO: retrieve contained objects
NSArray *allUids;
allUids = [self fetchMailNames];
if (![allUids isNotNull]) {
[self logWithFormat:@"Note: no uids in drafts folder: %@",
[self userSpoolFolderPath]];
return [NSArray array];
}
// TODO: should sort uids (q=%@,so=%@): %@", _q, _so, allUids];
return allUids;
}
- (NSArray *)fetchUIDs:(NSArray *)_uids parts:(NSArray *)_parts {
/* FLAGS, ENVELOPE, RFC822.SIZE */
NSMutableArray *drafts;
unsigned i, count;
if (_uids == nil)
return nil;
if ((count = [_uids count]) == 0)
return [NSArray array];
drafts = [NSMutableArray arrayWithCapacity:count];
for (i = 0; i < count; i++) {
SOGoDraftObject *draft;
id parts;
draft = [self lookupName:[_uids objectAtIndex:i] inContext:nil acquire:NO];
if (![draft isNotNull] || [draft isKindOfClass:[NSException class]])
continue;
parts = [draft fetchParts:_parts];
if ([parts isNotNull])
[drafts addObject:parts];
}
return drafts;
}
/* name lookup */
- (id)lookupDraftMessage:(NSString *)_key inContext:(id)_ctx {
// TODO: we might want to check for existence prior controller creation
return [[[SOGoDraftObject alloc] initWithName:_key
inContainer:self] autorelease];
}
- (id)lookupName:(NSString *)_key inContext:(id)_ctx acquire:(BOOL)_flag {
id obj;
/* first check attributes directly bound to the application */
if ((obj = [super lookupName:_key inContext:_ctx acquire:NO]) != nil)
return obj;
if ((obj = [self lookupDraftMessage:_key inContext:_ctx]) != nil)
return obj;
/* return 404 to stop acquisition */
return [NSException exceptionWithHTTPStatus:404 /* Not Found */];
}
/* WebDAV */
- (BOOL)davIsCollection {
return YES;
}
- (NSArray *)toOneRelationshipKeys {
return [self fetchMailNames];
}
/* folder type */
- (NSString *)outlookFolderClass {
return @"IPF.Drafts";
}
@end /* SOGoDraftsFolder */