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.sogomaint-2.0.2
commit
b1f3a8ebc6
23
ChangeLog
23
ChangeLog
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -45,6 +45,8 @@
|
|||
+ (id) dataWithChangeKeyGUID: (NSString *) guidString
|
||||
andCnt: (NSData *) globCnt;
|
||||
|
||||
- (void) hexDumpWithLineSize: (NSUInteger) lineSize;
|
||||
|
||||
@end
|
||||
|
||||
@interface NSMutableData (MAPIStoreDataTypes)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue