Monotone-Parent: c0d3a6fd3a3c39a9526e90735a8863553573d2c5

Monotone-Revision: 3a26c13f547976a8cb598e6f141d4eaf0cb724ff

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2010-12-13T16:47:58
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2010-12-13 16:47:58 +00:00
parent eab9037cb3
commit 1306aaf659
3 changed files with 314 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2010-12-13 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreFileSystemBaseContext.[hm]: new base
MAPIStoreContext class that handles requests for objects based on
the SOGoMAPIFSFolder and SOGoMAPIFSMessage classes.
* MAPIStoreCommonViewsContext.[hm],
MAPIStoreDeferredActionsContext.[hm],
MAPIStoreDeletedItemsContext.[hm], MAPIStoreDraftsContext.[hm],

View File

@ -0,0 +1,32 @@
/* MAPIStoreFileSystemBaseContext.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 MAPISTOREFILESYSTEMBASECONTEXT_H
#define MAPISTOREFILESYSTEMBASECONTEXT_H
#import "MAPIStoreContext.h"
@interface MAPIStoreFileSystemBaseContext : MAPIStoreContext
@end
#endif /* MAPISTOREFILESYSTEMBASECONTEXT_H */

View File

@ -0,0 +1,278 @@
/* MAPIStoreFileSystemBaseContext.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.
*/
/* A generic parent class for all context that will store their data on the
disk in the form of a plist. */
#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
#import <Foundation/NSString.h>
#import <Foundation/NSURL.h>
#import <NGExtensions/NSObject+Logs.h>
#import "EOQualifier+MAPIFS.h"
#import "MAPIStoreMapping.h"
#import "MAPIStoreTypes.h"
#import "SOGoMAPIFSFolder.h"
#import "SOGoMAPIFSMessage.h"
#import "NSCalendarDate+MAPIStore.h"
#import "NSData+MAPIStore.h"
#import "NSString+MAPIStore.h"
#import "NSValue+MAPIStore.h"
#undef DEBUG
#include <talloc.h>
#include <mapistore/mapistore.h>
#include <mapistore/mapistore_errors.h>
#include <libmapi/libmapi.h>
#include <libmapiproxy.h>
#import "MAPIStoreFileSystemBaseContext.h"
@implementation MAPIStoreFileSystemBaseContext
+ (NSString *) MAPIModuleName
{
return nil;
}
- (void) setupModuleFolder
{
[self logWithFormat: @"invoked %s", __PRETTY_FUNCTION__];
moduleFolder = [SOGoMAPIFSFolder folderWithURL: [NSURL URLWithString: uri]];
[moduleFolder retain];
}
- (NSArray *) getFolderMessageKeys: (SOGoFolder *) folder
matchingQualifier: (EOQualifier *) qualifier
{
NSMutableArray *messageKeys;
NSArray *allKeys;
NSUInteger count, max;
NSString *messageKey;
allKeys = [(SOGoMAPIFSFolder *) folder toOneRelationshipKeys];
if (qualifier)
{
[self logWithFormat: @"%s: getting restricted keys", __PRETTY_FUNCTION__];
max = [allKeys count];
messageKeys = [NSMutableArray arrayWithCapacity: max];
for (count = 0; count < max; count++)
{
messageKey = [allKeys objectAtIndex: count];
if ([qualifier evaluateMAPIFSMessage:
[folder lookupName: messageKey
inContext: nil
acquire: NO]])
[messageKeys addObject: messageKey];
}
}
else
messageKeys = (NSMutableArray *) allKeys;
return messageKeys;
}
- (NSString *) backendIdentifierForProperty: (enum MAPITAGS) property
{
return [NSString stringWithFormat: @"%@", MAPIPropertyKey (property)];
}
- (id) createMessageInFolder: (id) parentFolder
{
return [moduleFolder newMessage];
}
- (enum MAPISTATUS) getMessageTableChildproperty: (void **) data
atURL: (NSString *) childURL
withTag: (enum MAPITAGS) proptag
inFolder: (SOGoFolder *) folder
withFID: (uint64_t) fid
{
SOGoMAPIFSMessage *message;
NSDictionary *properties;
NSString *folderURL;
MAPIStoreMapping *mapping;
uint16_t valueType;
uint32_t contextId;
uint64_t mappingId;
id value;
int rc;
message = [self lookupObject: childURL];
if (message)
{
properties = [message properties];
value = [properties objectForKey: MAPIPropertyKey (proptag)];
if (value)
{
rc = MAPI_E_SUCCESS;
// [self logWithFormat: @"property %.8x found", proptag];
valueType = (proptag & 0xffff);
switch (valueType)
{
case PT_NULL:
*data = NULL;
break;
case PT_SHORT:
*data = [value asShortInMemCtx: memCtx];
break;
case PT_LONG:
*data = [value asLongInMemCtx: memCtx];
break;
case PT_BOOLEAN:
*data = [value asBooleanInMemCtx: memCtx];
break;
case PT_DOUBLE:
*data = [value asDoubleInMemCtx: memCtx];
break;
case PT_UNICODE:
case PT_STRING8:
*data = [value asUnicodeInMemCtx: memCtx];
break;
case PT_SYSTIME:
*data = [value asFileTimeInMemCtx: memCtx];
break;
case PT_BINARY:
*data = [value asShortBinaryInMemCtx: memCtx];
break;
default:
[self errorWithFormat: @"object type not handled: %d (0x%.4x)",
valueType, valueType];
*data = NULL;
rc = MAPI_E_NO_SUPPORT;
}
}
else
{
if (proptag == PR_MID)
{
rc = MAPI_E_SUCCESS;
mapping = [MAPIStoreMapping sharedMapping];
mappingId = [mapping idFromURL: childURL];
if (mappingId == NSNotFound)
{
mappingId = [[properties objectForKey: @"mid"]
unsignedLongLongValue];
[mapping registerURL: childURL withID: mappingId];
folderURL = [mapping urlFromID: fid];
NSAssert (folderURL != nil,
@"folder URL is expected to be known here");
contextId = 0;
mapistore_search_context_by_uri (memCtx, [uri UTF8String] + 7,
&contextId);
NSAssert (contextId > 0, @"no matching context found");
mapistore_indexing_record_add_mid (memCtx, contextId, mappingId);
}
*data = MAPILongLongValue (memCtx, mappingId);
}
else
rc = [super getMessageTableChildproperty: data
atURL: childURL
withTag: proptag
inFolder: folder
withFID: fid];
}
}
else
{
[self logWithFormat: @"object at url '%@' *not* found", childURL];
rc = MAPI_E_INVALID_OBJECT;
}
return rc;
}
- (MAPIRestrictionState) evaluateBitmaskRestriction: (struct mapi_SBitmaskRestriction *) res
intoQualifier: (EOQualifier **) qualifier
{
[self errorWithFormat: @"%s: UNIMPLEMENTED METHOD, returning true",
__PRETTY_FUNCTION__];
// ^PR_VIEW_STYLE(0x68340003) & 0x00000001
return MAPIRestrictionStateAlwaysTrue;
}
- (int) openMessage: (struct mapistore_message *) msg
atURL: (NSString *) childURL
{
static enum MAPITAGS tags[] = { PR_SUBJECT_UNICODE, PR_HASATTACH,
PR_MESSAGE_DELIVERY_TIME, PR_MESSAGE_FLAGS,
PR_FLAG_STATUS, PR_SENSITIVITY,
PR_SENT_REPRESENTING_NAME_UNICODE,
PR_INTERNET_MESSAGE_ID_UNICODE,
PR_READ_RECEIPT_REQUESTED };
id child;
struct SRowSet *recipients;
struct SRow *properties;
NSInteger count, max;
int rc;
void *propValue;
[self logWithFormat: @"INCOMPLETE METHOD '%s' (%d): no recipient handling",
__FUNCTION__, __LINE__];
child = [self lookupObject: childURL];
if (child)
{
recipients = talloc_zero (memCtx, struct SRowSet);
recipients->cRows = 0;
recipients->aRow = NULL;
msg->recipients = recipients;
max = 9;
properties = talloc_zero (memCtx, struct SRow);
properties->cValues = 0;
properties->ulAdrEntryPad = 0;
properties->lpProps = talloc_array (properties, struct SPropValue, max);
for (count = 0; count < max; count++)
{
if ([self getMessageTableChildproperty: &propValue
atURL: childURL
withTag: tags[count]
inFolder: nil
withFID: 0]
== MAPI_E_SUCCESS)
{
set_SPropValue_proptag (&(properties->lpProps[properties->cValues]),
tags[count],
propValue);
properties->cValues++;
}
}
msg->properties = properties;
rc = MAPI_E_SUCCESS;
}
else
rc = MAPI_E_NOT_FOUND;
return rc;
}
@end