Monotone-Parent: 5b2308236e314d73f37013a208e925564c2b223e

Monotone-Revision: c4fe19a1a6dc722f667408c4597a414722b94c7d

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2010-12-13T16:28:18
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2010-12-13 16:28:18 +00:00
parent fac3cf8947
commit 946ad356a7
5 changed files with 411 additions and 0 deletions

View File

@ -1,3 +1,13 @@
2010-12-13 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/SOGoMAPIFSFolder.[hm]: new class module that
implements a SOGoFolder subclass that stores and retrives data
to/and from the file system in the form of a plist.
* OpenChange/SOGoMAPIFSMessage.[hm]: new class module that
implements a SOGoObject subclass that stores and retrives data
to/and from the file system in the form of a plist.
2010-12-09 Ludovic Marcotte <lmarcotte@inverse.ca>
* SoObject/SOGo/SQLSource.m - added SHA password

View File

@ -0,0 +1,47 @@
/* SOGoMAPIFSFolder.h - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef SOGOMAPIFSFOLDER_H
#define SOGOMAPIFSFOLDER_H
#import <SOGo/SOGoFolder.h>
@class NSURL;
@class SOGoMAPIFSMessage;
@interface SOGoMAPIFSFolder : SOGoFolder
{
NSString *directory;
BOOL directoryIsSane;
}
+ (id) folderWithURL: (NSURL *) url;
- (id) initWithURL: (NSURL *) url;
- (NSString *) directory;
- (SOGoMAPIFSMessage *) newMessage;
@end
#endif /* SOGOMAPIFSFOLDER_H */

View File

@ -0,0 +1,216 @@
/* SOGoMAPIFSFolder.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSException.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSString.h>
#import <Foundation/NSValue.h>
#import <Foundation/NSURL.h>
#import <NGExtensions/NSObject+Logs.h>
#import "SOGoMAPIFSMessage.h"
#import "SOGoMAPIFSFolder.h"
#undef DEBUG
#include <mapistore/mapistore.h>
#include <mapistore/mapistore_errors.h>
#include <libmapiproxy.h>
#include <param.h>
static NSString *privateDir = nil;
@implementation SOGoMAPIFSFolder
+ (void) initialize
{
struct loadparm_context *lpCtx;
const char *cPrivateDir;
if (!privateDir)
{
lpCtx = loadparm_init_global (true);
cPrivateDir = lpcfg_private_dir (lpCtx);
privateDir = [NSString stringWithUTF8String: cPrivateDir];
[privateDir retain];
}
}
+ (id) folderWithURL: (NSURL *) url
{
SOGoMAPIFSFolder *newFolder;
newFolder = [[self alloc] initWithURL: url];
[newFolder autorelease];
return newFolder;
}
- (id) init
{
if ((self = [super init]))
{
directory = nil;
directoryIsSane = NO;
}
return self;
}
- (void) dealloc
{
[directory release];
[super dealloc];
}
- (id) initWithURL: (NSURL *) url
{
NSString *path;
if ((self = [self init]))
{
path = [url path];
if (![path hasSuffix: @"/"])
path = [NSString stringWithFormat: @"%@/", path];
directory = [NSString stringWithFormat: @"%@/SOGo/%@/%@%@",
privateDir, [url user], [url host], path];
[self logWithFormat: @"directory: %@", directory];
[directory retain];
ASSIGN (nameInContainer, [path stringByDeletingLastPathComponent]);
}
return self;
}
- (NSString *) directory
{
return directory;
}
- (SOGoMAPIFSMessage *) newMessage
{
NSString *filename;
filename = [NSString stringWithFormat: @"%@.plist",
[SOGoObject globallyUniqueObjectId]];
return [SOGoMAPIFSMessage objectWithName: filename inContainer: self];
}
- (void) _ensureDirectorySanity
{
NSFileManager *fm;
NSDictionary *attributes;
BOOL isDir;
fm = [NSFileManager defaultManager];
if ([fm fileExistsAtPath: directory isDirectory: &isDir])
{
if (!isDir)
[NSException raise: @"MAPIStoreIOException"
format: @"object at path '%@' is not a directory",
directory];
}
else
{
attributes
= [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: 0700]
forKey: NSFilePosixPermissions];
[fm createDirectoryAtPath: directory
attributes: attributes];
}
directoryIsSane = YES;
}
- (NSArray *) _objectsInDirectory: (BOOL) dirs
{
NSFileManager *fm;
NSArray *contents;
NSMutableArray *files;
NSUInteger count, max;
NSString *file, *fullName;
BOOL isDir;
if (!directoryIsSane)
[self _ensureDirectorySanity];
fm = [NSFileManager defaultManager];
contents = [fm directoryContentsAtPath: directory];
max = [contents count];
files = [NSMutableArray arrayWithCapacity: max];
for (count = 0; count < max; count++)
{
file = [contents objectAtIndex: count];
fullName = [directory stringByAppendingPathComponent: file];
if ([fm fileExistsAtPath: fullName
isDirectory: &isDir]
&& dirs == isDir)
[files addObject: file];
}
return files;
}
- (NSArray *) toManyRelationshipKeys
{
return [self _objectsInDirectory: YES];
}
- (NSArray *) toOneRelationshipKeys
{
return [self _objectsInDirectory: NO];
}
- (id) lookupName: (NSString *) fileName
inContext: (WOContext *) woContext
acquire: (BOOL) acquire
{
NSFileManager *fm;
NSString *fullName;
id object;
BOOL isDir;
if (!directoryIsSane)
[self _ensureDirectorySanity];
fm = [NSFileManager defaultManager];
fullName = [directory stringByAppendingPathComponent: fileName];
if ([fm fileExistsAtPath: fullName
isDirectory: &isDir])
{
if (isDir)
object = [SOGoMAPIFSFolder objectWithName: fileName
inContainer: self];
else
object = [SOGoMAPIFSMessage objectWithName: fileName
inContainer: self];
}
else
object = nil;
return object;
}
@end

View File

@ -0,0 +1,39 @@
/* SOGoMAPIFSMessage.h - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef SOGOMAPIFSMESSAGE_H
#define SOGOMAPIFSMESSAGE_H
#import <SOGo/SOGoObject.h>
@class NSDictionary;
@interface SOGoMAPIFSMessage : SOGoObject
{
NSDictionary *properties;
}
- (NSDictionary *) properties;
@end
#endif /* SOGOMAPIFSMESSAGE_H */

View File

@ -0,0 +1,99 @@
/* SOGoMAPIFSMessage.m - this file is part of SOGo
*
* Copyright (C) 2010 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This file 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSFileManager.h>
#import <Foundation/NSException.h>
#import <Foundation/NSString.h>
#import <NGExtensions/NSObject+Logs.h>
#import "SOGoMAPIFSFolder.h"
#import "SOGoMAPIFSMessage.h"
@implementation SOGoMAPIFSMessage
- (id) init
{
if ((self = [super init]))
{
properties = nil;
}
return self;
}
- (void) dealloc
{
[properties release];
[super dealloc];
}
- (NSDictionary *) properties
{
NSString *filePath;
if (!properties)
{
filePath = [[container directory]
stringByAppendingPathComponent: nameInContainer];
properties = [[NSDictionary alloc]
initWithContentsOfFile: filePath];
}
return properties;
}
- (void) setMAPIProperties: (NSDictionary *) newProperties
{
ASSIGN (properties, newProperties);
}
- (void) MAPISave
{
NSString *filePath;
[self logWithFormat: @"-MAPISave"];
filePath = [[container directory]
stringByAppendingPathComponent: nameInContainer];
if (![properties writeToFile: filePath atomically: YES])
[NSException raise: @"MAPIStoreIOException"
format: @"could not save message"];
}
- (NSString *) davEntityTag
{
NSDictionary *attributes;
NSFileManager *fm;
NSString *filePath;
fm = [NSFileManager defaultManager];
filePath = [[container directory]
stringByAppendingPathComponent: nameInContainer];
attributes = [fm fileAttributesAtPath: filePath traverseLink: NO];
return [NSString stringWithFormat: @"%p", attributes];
}
@end