merge of '8cea0b1a81fe57f8395b91cfc3ed8063d49995ca'

and 'f878485f243e179600dcdcf48b5dffc712d954ca'

Monotone-Parent: 8cea0b1a81fe57f8395b91cfc3ed8063d49995ca
Monotone-Parent: f878485f243e179600dcdcf48b5dffc712d954ca
Monotone-Revision: 263be06669bfcef33b9cb13a1171fdb0d4d5ec57

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2012-08-21T20:40:09
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Wolfgang Sourdeau 2012-08-21 20:40:09 +00:00
commit b1f3a8ebc6
9 changed files with 185 additions and 46 deletions

View File

@ -1,3 +1,26 @@
2012-08-21 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreFolder.m (-getPidTagAccessLevel)
(-getPidTagRights, -getPidTagAccessControlListData): fixed
methods.
* OpenChange/MAPIStoreMessage.m
(-getPidTagDeleteAfterSubmit:inMemCtx:): moved from
MAPIStoreMailMessage.
* OpenChange/MAPIStoreContactsMessage.m
(-getPidTagAlternateRecipientAllowed:inMemCtx:)
(-getPidTagMessageFlags:inMemCtx:)
(-getPidTagDeleteAfterSubmit:inMemCtx:): new getters.
* OpenChange/MAPIStoreGCSFolder.m
(-setChangeKey:forMessageWithKey:): removed useless method.
(-updateVersionsForMessageWithKey:withChangeKey:): set the change
key provided by the client as member of the predecessor
changelist, but never as the actual change key for the object.
This hopefully fixes the issue where Outlook deletes objects that
have a different change list than what they expect.
2012-08-17 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreCalendarMessage.m

View File

@ -110,6 +110,28 @@
return MAPISTORE_SUCCESS;
}
- (int) getPidTagAlternateRecipientAllowed: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getYes: data inMemCtx: memCtx];
}
- (int) getPidTagMessageFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, MSGFLAG_READ);
return MAPISTORE_SUCCESS;
}
- (int) getPidTagDeleteAfterSubmit: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (int) getPidTagMessageClass: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
@ -189,13 +211,34 @@
- (int) getPidLidFileUnder: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidTagDisplayName: data inMemCtx: memCtx];
NSString *surName, *givenName, *middleName;
NSMutableString *fileUnder;
CardElement *n;
n = [[sogoObject vCard] n];
surName = [n flattenedValueAtIndex: 0
forKey: @""];
fileUnder = [surName mutableCopy];
[fileUnder autorelease];
[fileUnder appendString: @","];
givenName = [n flattenedValueAtIndex: 1
forKey: @""];
if ([givenName length] > 0)
[fileUnder appendFormat: @" %@", givenName];
middleName = [n flattenedValueAtIndex: 2
forKey: @""];
if ([middleName length] > 0)
[fileUnder appendFormat: @" %@", middleName];
*data = [fileUnder asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}
- (int) getPidLidFileUnderId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0xffffffff);
*data = MAPILongValue (memCtx, 0x00008017); /* what ol2003 sets */
return MAPISTORE_SUCCESS;
}
@ -209,7 +252,7 @@
vCard = [sogoObject vCard];
fn = [vCard fn];
email = [vCard preferredEMail];
*data = [[NSString stringWithFormat: @"%@ <%@>", fn, email]
*data = [[NSString stringWithFormat: @"%@ (%@)", fn, email]
asUnicodeInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
@ -218,7 +261,8 @@
- (int) getPidLidEmail1OriginalDisplayName: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getPidLidEmail1DisplayName: data inMemCtx: memCtx];
return [self getPidLidEmail1EmailAddress: data
inMemCtx: memCtx];
}
- (int) getPidLidEmail1EmailAddress: (void **) data

View File

@ -25,6 +25,7 @@
#import <Foundation/NSArray.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSCalendarDate.h>
#import <Foundation/NSData.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSException.h>
#import <Foundation/NSString.h>
@ -46,6 +47,7 @@
#import "MAPIStoreSamDBUtils.h"
#import "MAPIStoreTypes.h"
#import "MAPIStoreUserContext.h"
#import "NSData+MAPIStore.h"
#import "NSDate+MAPIStore.h"
#import "NSString+MAPIStore.h"
#import "NSObject+MAPIStore.h"
@ -1315,7 +1317,51 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe
- (int) getPidTagAccessLevel: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, 0x01);
SOGoUser *ownerUser;
BOOL userIsOwner;
ownerUser = [[self userContext] sogoUser];
userIsOwner = [[context activeUser] isEqual: ownerUser];
*data = MAPILongValue (memCtx, (userIsOwner) ? 0x01 : 0x00);
return MAPISTORE_SUCCESS;
}
- (int) getPidTagRights: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
uint32_t rights = 0;
SOGoUser *ownerUser;
BOOL userIsOwner;
ownerUser = [[self userContext] sogoUser];
userIsOwner = [[context activeUser] isEqual: ownerUser];
if (userIsOwner || [self subscriberCanReadMessages])
rights |= RightsReadItems;
if (userIsOwner || [self subscriberCanCreateMessages])
rights |= RightsCreateItems;
if (userIsOwner || [self subscriberCanModifyMessages])
rights |= RightsEditOwn | RightsEditAll;
if (userIsOwner || [self subscriberCanDeleteMessages])
rights |= RightsDeleteOwn | RightsDeleteAll;
if ((userIsOwner || [self subscriberCanCreateSubFolders])
&& [self supportsSubFolders])
rights |= RightsCreateSubfolders;
if (userIsOwner)
rights |= RightsFolderOwner | RightsFolderContact;
*data = MAPILongValue (memCtx, rights);
return MAPISTORE_SUCCESS;
}
- (int) getPidTagAccessControlListData: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = [[NSData data] asBinaryInMemCtx: memCtx];
return MAPISTORE_SUCCESS;
}

View File

@ -45,11 +45,8 @@
withChangeKey: (NSData *) newChangeKey;
- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum;
- (NSNumber *) changeNumberForMessageWithKey: (NSString *) messageKey;
- (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey;
- (NSData *) predecessorChangeListForMessageWithKey: (NSString *) messageKey;
- (void) setChangeKey: (NSData *) changeKey
forMessageWithKey: (NSString *) messageKey;
- (NSArray *) activeUserRoles;

View File

@ -261,6 +261,7 @@ static Class NSNumberK;
- (void) _setChangeKey: (NSData *) changeKey
forMessageEntry: (NSMutableDictionary *) messageEntry
inChangeListOnly: (BOOL) inChangeListOnly
{
struct XID *xid;
NSString *guid;
@ -273,12 +274,15 @@ static Class NSNumberK;
globCnt = [NSData dataWithBytes: xid->Data length: xid->Size];
talloc_free (xid);
/* 1. set change key association */
changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys:
guid, @"GUID",
globCnt, @"LocalId",
nil];
[messageEntry setObject: changeKeyDict forKey: @"ChangeKey"];
if (!inChangeListOnly)
{
/* 1. set change key association */
changeKeyDict = [NSDictionary dictionaryWithObjectsAndKeys:
guid, @"GUID",
globCnt, @"LocalId",
nil];
[messageEntry setObject: changeKeyDict forKey: @"ChangeKey"];
}
/* 2. append/update predecessor change list */
changeList = [messageEntry objectForKey: @"PredecessorChangeList"];
@ -286,11 +290,10 @@ static Class NSNumberK;
{
changeList = [NSMutableDictionary new];
[messageEntry setObject: changeList
forKey: @"PredecessorChangeList"];
forKey: @"PredecessorChangeList"];
[changeList release];
}
[changeList setObject: globCnt
forKey: guid];
[changeList setObject: globCnt forKey: guid];
}
- (EOQualifier *) componentQualifier
@ -433,7 +436,8 @@ static Class NSNumberK;
[messageEntry setObject: changeNumber forKey: @"version"];
changeKey = [self getReplicaKeyFromGlobCnt: newChangeNum >> 16];
[self _setChangeKey: changeKey forMessageEntry: messageEntry];
[self _setChangeKey: changeKey forMessageEntry: messageEntry
inChangeListOnly: NO];
[mapping setObject: cLastModified forKey: changeNumber];
@ -464,10 +468,21 @@ static Class NSNumberK;
- (void) updateVersionsForMessageWithKey: (NSString *) messageKey
withChangeKey: (NSData *) newChangeKey
{
[self synchroniseCache];
NSMutableDictionary *messages, *messageEntry;
[self synchroniseCache];
if (newChangeKey)
[self setChangeKey: newChangeKey forMessageWithKey: messageKey];
{
messages = [[versionsMessage properties] objectForKey: @"Messages"];
messageEntry = [messages objectForKey: messageKey];
if (!messageEntry)
[NSException raise: @"MAPIStoreIOException"
format: @"no version record found for message '%@'",
messageKey];
[self _setChangeKey: newChangeKey forMessageEntry: messageEntry
inChangeListOnly: YES];
[versionsMessage save];
}
}
- (NSNumber *) lastModifiedFromMessageChangeNumber: (NSNumber *) changeNum
@ -493,26 +508,6 @@ static Class NSNumberK;
return changeNumber;
}
- (void) setChangeKey: (NSData *) changeKey
forMessageWithKey: (NSString *) messageKey
{
NSMutableDictionary *messages;
NSMutableDictionary *messageEntry;
messages = [[versionsMessage properties] objectForKey: @"Messages"];
messageEntry = [messages objectForKey: messageKey];
if (!messageEntry)
{
[self synchroniseCache];
messageEntry = [messages objectForKey: messageKey];
if (!messageEntry)
abort ();
}
[self _setChangeKey: changeKey forMessageEntry: messageEntry];
[versionsMessage save];
}
- (NSData *) changeKeyForMessageWithKey: (NSString *) messageKey
{
NSDictionary *messages, *changeKeyDict;

View File

@ -1000,12 +1000,6 @@ _compareBodyKeysByPriority (id entry1, id entry2, void *data)
return [self getNo: data inMemCtx: memCtx];
}
- (int) getPidTagDeleteAfterSubmit: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (int) getPidLidGlobalObjectId: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{

View File

@ -801,6 +801,12 @@ rtf2html (NSData *compressedRTF)
return [self getEmptyString: data inMemCtx: memCtx];
}
- (int) getPidTagDeleteAfterSubmit: (void **) data // TODO
inMemCtx: (TALLOC_CTX *) memCtx
{
return [self getNo: data inMemCtx: memCtx];
}
- (int) getPidTagDisplayTo: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{

View File

@ -45,6 +45,8 @@
+ (id) dataWithChangeKeyGUID: (NSString *) guidString
andCnt: (NSData *) globCnt;
- (void) hexDumpWithLineSize: (NSUInteger) lineSize;
@end
@interface NSMutableData (MAPIStoreDataTypes)

View File

@ -20,6 +20,8 @@
* Boston, MA 02111-1307, USA.
*/
#import <NGExtensions/NSObject+Logs.h>
#import "NSString+MAPIStore.h"
#import "NSData+MAPIStore.h"
@ -185,6 +187,36 @@ static void _fillFlatUIDWithGUID (struct FlatUID_r *flatUID, const struct GUID *
return changeKey;
}
- (void) hexDumpWithLineSize: (NSUInteger) lineSize
{
const char *bytes;
NSUInteger lineCount, count, max, charCount, charMax;
NSMutableString *line;
bytes = [self bytes];
max = [self length];
lineCount = 0;
for (count = 0; count < max; count++)
{
line = [NSMutableString stringWithFormat: @"%d: ", lineCount];
if (lineSize)
{
if ((max - count) > lineSize)
charMax = lineSize;
else
charMax = max - count;
}
else
charMax = max;
for (charCount = 0; charCount < charMax; charCount++)
[line appendFormat: @" %.2x", *(bytes + count + charCount)];
[self logWithFormat: @" %@", line];
count += charMax;
lineCount++;
}
}
@end
@implementation NSMutableData (MAPIStoreDataTypes)