propagate from branch 'ca.inverse.sogo.1_3_14' (head 3c8a49fe7ef93ec55aaeef9dd064be1de6052cfe)

to branch 'ca.inverse.sogo' (head d93bbab8d949fa50be1d182af68b2eecf4c79105)

Monotone-Parent: 3c8a49fe7ef93ec55aaeef9dd064be1de6052cfe
Monotone-Parent: d93bbab8d949fa50be1d182af68b2eecf4c79105
Monotone-Revision: 8d867d6c59e7ebea428c107ce0681159571e7c90

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2012-03-21T15:50:33
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau
2012-03-21 15:50:33 +00:00
11 changed files with 141 additions and 13 deletions

View File

@@ -17,6 +17,29 @@
(_contentForEditingFromKeys:): prefer the HTML part over the text
part when composing HTML messages.
2012-03-20 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* SoObjects/SOGo/SOGoUserFolder.m (-davLastName, -davFirstName):
quick and dirty implementation of those getters.
* OpenChange/MAPIStoreAppointmentWrapper.m (-_setupITIPContext):
ensure method is uppercase.
* OpenChange/MAPIStoreCalendarMessage.m
(-getPidLidAppointmentSequence:inMemCtx:): new getter.
(-save): properly initialize CREATED, LAST-MODIFIED, DTSTAMP and
SEQUENCE from MAPI properties.
* OpenChange/MAPIStoreAppointmentWrapper.m
(-getPidLidAppointmentSequence:inMemCtx:): new getter.
* OpenChange/NSDate+MAPIStore.m (-isNever): new accessor for dates
occurring in 4500.
* OpenChange/MAPIStoreTypes.m (MAPIChangeKeyGUIDCompare): NSData
arguments passed as "id" due to the pickiness of some versions of
gcc.
2012-03-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Main/SOGo+DAV.m (_fillCollections:where:matches:inContext:):

View File

@@ -97,6 +97,8 @@ extern NSTimeZone *utcTZ;
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidTagStartDate: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentSequence: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidAppointmentStateFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx;
- (int) getPidLidResponseStatus: (void **) data

View File

@@ -162,6 +162,7 @@ static NSCharacterSet *hexCharacterSet = nil;
method = [[event parent] method];
if ([method length] > 0)
{
method = [method uppercaseString];
[method retain];
if ([method isEqualToString: @"REPLY"])
{
@@ -657,6 +658,14 @@ static NSCharacterSet *hexCharacterSet = nil;
return MAPISTORE_SUCCESS;
}
- (int) getPidLidAppointmentSequence: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
*data = MAPILongValue (memCtx, [[event sequence] unsignedIntValue]);
return MAPISTORE_SUCCESS;
}
- (int) getPidLidAppointmentStateFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{

View File

@@ -166,6 +166,13 @@
return [[self appointmentWrapper] getPidTagStartDate: data inMemCtx: memCtx];
}
- (int) getPidLidAppointmentSequence: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
return [[self appointmentWrapper] getPidLidAppointmentSequence: data
inMemCtx: memCtx];
}
- (int) getPidLidAppointmentStateFlags: (void **) data
inMemCtx: (TALLOC_CTX *) memCtx
{
@@ -718,14 +725,28 @@
vCalendar = [newEvent parent];
[vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"];
[newEvent setCreated: now];
// CREATED = PidTagCreationTime
value = [properties objectForKey: MAPIPropertyKey (PidTagCreationTime)];
if (value)
[newEvent setCreated: value];
[newEvent setUid: uid];
content = [vCalendar versitString];
}
vCalendar = [iCalCalendar parseSingleFromSource: content];
newEvent = [[vCalendar events] objectAtIndex: 0];
[newEvent setTimeStampAsDate: now];
[newEvent setLastModified: now];
// DTSTAMP = PidLidOwnerCriticalChange or PidLidAttendeeCriticalChange
value = [properties objectForKey: MAPIPropertyKey (PidLidOwnerCriticalChange)];
if (!value || [value isNever])
value = now;
[newEvent setTimeStampAsDate: value];
// LAST-MODIFIED = PidTagLastModificationTime
value = [properties objectForKey: MAPIPropertyKey (PidTagLastModificationTime)];
if (!value)
value = now;
[newEvent setLastModified: value];
// summary
value = [properties
@@ -973,6 +994,11 @@
[newEvent setOrganizer: nil];
else
{
// SEQUENCE = PidLidAppointmentSequence
value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentSequence)];
if (value)
[newEvent setSequence: value];
ownerUser = [[self userContext] sogoUser];
if (organizerIsSet)
{
@@ -1009,7 +1035,10 @@
}
[person setParticipationStatus: newPartStat];
newParticipationStatus = [person partStatWithDefault];
value = [properties objectForKey: MAPIPropertyKey (PidLidAttendeeCriticalChange)];
if (value && ![value isNever])
[newEvent setTimeStampAsDate: value];
// if (newPartStat // != iCalPersonPartStatUndefined
// )
// {

View File

@@ -43,7 +43,7 @@ id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *);
id NSObjectFromValuePointer (enum MAPITAGS, const void *);
NSComparisonResult MAPICNCompare (uint64_t cn1, uint64_t cn2, void *);
NSComparisonResult MAPIChangeKeyGUIDCompare (NSData *ck1, NSData *ck2, void *);
NSComparisonResult MAPIChangeKeyGUIDCompare (id ck1, id ck2, void *);
static inline NSNumber *
MAPIPropertyKey (enum MAPITAGS propTag)

View File

@@ -298,7 +298,8 @@ MAPICNCompare (uint64_t cn1, uint64_t cn2, void *unused)
return result;
}
NSComparisonResult MAPIChangeKeyGUIDCompare (NSData *ck1, NSData *ck2, void *unused)
NSComparisonResult
MAPIChangeKeyGUIDCompare (id ck1, id ck2, void *unused)
{
NSUInteger count;
const unsigned char *ptr1, *ptr2;

View File

@@ -33,6 +33,8 @@
+ (id) dateFromFileTime: (const struct FILETIME *) timeValue;
- (struct FILETIME *) asFileTimeInMemCtx: (void *) memCtx;
- (BOOL) isNever; /* occurs on 4500-12-31 */
@end
#endif /* NSCALENDARDATE+MAPISTORE_H */

View File

@@ -114,4 +114,17 @@ _setupRefDate ()
return timeValue;
}
- (BOOL) isNever /* occurs on 4500-12-31 */
{
NSCalendarDate *calDate;
if ([self isKindOfClass: [NSCalendarDate class]])
calDate = (NSCalendarDate *) self;
else
calDate = [NSCalendarDate dateWithTimeIntervalSince1970:
[self timeIntervalSince1970]];
return [calDate yearOfCommonEra] == 4500;
}
@end

View File

@@ -38,14 +38,15 @@
@implementation NSObject (MAPIStoreTallocHelpers)
static int MAPIStoreTallocWrapperDestroy (void *data)
static int
MAPIStoreTallocWrapperDestroy (void *data)
{
struct MAPIStoreTallocWrapper *wrapper;
NSAutoreleasePool *pool;
pool = [NSAutoreleasePool new];
wrapper = data;
NSLog (@"destroying wrapped object (wrapper: %p; object: %p)...\n", wrapper, wrapper->MAPIStoreSOGoObject);
// NSLog (@"destroying wrapped object (wrapper: %p; object: %p)...\n", wrapper, wrapper->MAPIStoreSOGoObject);
[wrapper->MAPIStoreSOGoObject release];
[pool release];
@@ -57,10 +58,10 @@ static int MAPIStoreTallocWrapperDestroy (void *data)
struct MAPIStoreTallocWrapper *wrapper;
wrapper = talloc_zero (tallocCtx, struct MAPIStoreTallocWrapper);
wrapper->MAPIStoreSOGoObject = self;
[wrapper->MAPIStoreSOGoObject retain];
talloc_set_destructor ((void *) wrapper, MAPIStoreTallocWrapperDestroy);
NSLog (@"returning wrapper: %p; object: %p", wrapper, self);
wrapper->MAPIStoreSOGoObject = self;
[self retain];
// NSLog (@"returning wrapper: %p; object: %p", wrapper, self);
return wrapper;
}

View File

@@ -635,6 +635,54 @@
getCNForUID: nameInContainer];
}
/* For firstname and lastname, we handle "Firstname Blabla Lastname" and
"Lastname, Firstname Blabla" */
- (NSString *) davLastName
{
NSArray *parts;
NSString *cn, *lastName;
NSRange comma;
cn = [self davDisplayName];
comma = [cn rangeOfString: @","];
if (comma.location != NSNotFound)
lastName = [[cn substringToIndex: comma.location]
stringByTrimmingSpaces];
else
{
parts = [cn componentsSeparatedByString: @" "];
if ([parts count] > 0)
lastName = [parts lastObject];
else
lastName = nil;
}
return lastName;
}
- (NSString *) davFirstName
{
NSArray *parts;
NSString *subtext, *cn, *firstName;
NSRange comma;
cn = [self davDisplayName];
comma = [cn rangeOfString: @","];
if (comma.location != NSNotFound)
subtext = [[cn substringFromIndex: comma.location]
stringByTrimmingSpaces];
else
subtext = cn;
parts = [subtext componentsSeparatedByString: @" "];
if ([parts count] > 0)
firstName = [parts objectAtIndex: 0];
else
firstName = nil;
return firstName;
}
- (NSString *) davResourceId
{
return [NSString stringWithFormat: @"urn:uuid:%@", nameInContainer];

View File

@@ -2,6 +2,6 @@
# This file is included by library makefiles to set the version information
# of the executable.
MAJOR_VERSION=1
MINOR_VERSION=3
SUBMINOR_VERSION=14
MAJOR_VERSION=2
MINOR_VERSION=0
SUBMINOR_VERSION=0