propagate from branch 'ca.inverse.sogo.1_3_14' (head 5a2446cca5cd90dd3efdec2eec1633c328178659)
to branch 'ca.inverse.sogo' (head ab03ed37df567704b10ca118f26a816bdccc83e0) Monotone-Parent: 5a2446cca5cd90dd3efdec2eec1633c328178659 Monotone-Parent: ab03ed37df567704b10ca118f26a816bdccc83e0 Monotone-Revision: be8cb88c243416af5fba817c001afc33ead04b69 Monotone-Author: flachapelle@inverse.ca Monotone-Date: 2012-03-22T18:05:26 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
commit
af3dc4a903
29
ChangeLog
29
ChangeLog
|
@ -3,6 +3,12 @@
|
||||||
* UI/MailerUI/UIxMailFolderActions.m (-emptyTrashAction:): we now
|
* UI/MailerUI/UIxMailFolderActions.m (-emptyTrashAction:): we now
|
||||||
unsubscribe from the folders found in the trash.
|
unsubscribe from the folders found in the trash.
|
||||||
|
|
||||||
|
2012-03-22 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
|
* OpenChange/MAPIStoreTasksMessage.m (-save):
|
||||||
|
PidLidPercentComplete is a double, that we need to convert in
|
||||||
|
order to obtain the proper value.
|
||||||
|
|
||||||
2012-03-21 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
2012-03-21 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
* SoObjects/SOGo/SOGoUserManager.m (_compactAndCompleteContacts:):
|
* SoObjects/SOGo/SOGoUserManager.m (_compactAndCompleteContacts:):
|
||||||
|
@ -22,6 +28,29 @@
|
||||||
(_contentForEditingFromKeys:): prefer the HTML part over the text
|
(_contentForEditingFromKeys:): prefer the HTML part over the text
|
||||||
part when composing HTML messages.
|
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>
|
2012-03-19 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
* Main/SOGo+DAV.m (_fillCollections:where:matches:inContext:):
|
* Main/SOGo+DAV.m (_fillCollections:where:matches:inContext:):
|
||||||
|
|
|
@ -97,6 +97,8 @@ extern NSTimeZone *utcTZ;
|
||||||
inMemCtx: (TALLOC_CTX *) memCtx;
|
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||||
- (int) getPidTagStartDate: (void **) data
|
- (int) getPidTagStartDate: (void **) data
|
||||||
inMemCtx: (TALLOC_CTX *) memCtx;
|
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||||
|
- (int) getPidLidAppointmentSequence: (void **) data
|
||||||
|
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||||
- (int) getPidLidAppointmentStateFlags: (void **) data
|
- (int) getPidLidAppointmentStateFlags: (void **) data
|
||||||
inMemCtx: (TALLOC_CTX *) memCtx;
|
inMemCtx: (TALLOC_CTX *) memCtx;
|
||||||
- (int) getPidLidResponseStatus: (void **) data
|
- (int) getPidLidResponseStatus: (void **) data
|
||||||
|
|
|
@ -162,6 +162,7 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
method = [[event parent] method];
|
method = [[event parent] method];
|
||||||
if ([method length] > 0)
|
if ([method length] > 0)
|
||||||
{
|
{
|
||||||
|
method = [method uppercaseString];
|
||||||
[method retain];
|
[method retain];
|
||||||
if ([method isEqualToString: @"REPLY"])
|
if ([method isEqualToString: @"REPLY"])
|
||||||
{
|
{
|
||||||
|
@ -657,6 +658,14 @@ static NSCharacterSet *hexCharacterSet = nil;
|
||||||
return MAPISTORE_SUCCESS;
|
return MAPISTORE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (int) getPidLidAppointmentSequence: (void **) data
|
||||||
|
inMemCtx: (TALLOC_CTX *) memCtx
|
||||||
|
{
|
||||||
|
*data = MAPILongValue (memCtx, [[event sequence] unsignedIntValue]);
|
||||||
|
|
||||||
|
return MAPISTORE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
- (int) getPidLidAppointmentStateFlags: (void **) data
|
- (int) getPidLidAppointmentStateFlags: (void **) data
|
||||||
inMemCtx: (TALLOC_CTX *) memCtx
|
inMemCtx: (TALLOC_CTX *) memCtx
|
||||||
{
|
{
|
||||||
|
|
|
@ -166,6 +166,13 @@
|
||||||
return [[self appointmentWrapper] getPidTagStartDate: data inMemCtx: memCtx];
|
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
|
- (int) getPidLidAppointmentStateFlags: (void **) data
|
||||||
inMemCtx: (TALLOC_CTX *) memCtx
|
inMemCtx: (TALLOC_CTX *) memCtx
|
||||||
{
|
{
|
||||||
|
@ -718,14 +725,28 @@
|
||||||
vCalendar = [newEvent parent];
|
vCalendar = [newEvent parent];
|
||||||
[vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"];
|
[vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"];
|
||||||
[newEvent setCreated: now];
|
[newEvent setCreated: now];
|
||||||
|
// CREATED = PidTagCreationTime
|
||||||
|
value = [properties objectForKey: MAPIPropertyKey (PidTagCreationTime)];
|
||||||
|
if (value)
|
||||||
|
[newEvent setCreated: value];
|
||||||
[newEvent setUid: uid];
|
[newEvent setUid: uid];
|
||||||
content = [vCalendar versitString];
|
content = [vCalendar versitString];
|
||||||
}
|
}
|
||||||
|
|
||||||
vCalendar = [iCalCalendar parseSingleFromSource: content];
|
vCalendar = [iCalCalendar parseSingleFromSource: content];
|
||||||
newEvent = [[vCalendar events] objectAtIndex: 0];
|
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
|
// summary
|
||||||
value = [properties
|
value = [properties
|
||||||
|
@ -973,6 +994,11 @@
|
||||||
[newEvent setOrganizer: nil];
|
[newEvent setOrganizer: nil];
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// SEQUENCE = PidLidAppointmentSequence
|
||||||
|
value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentSequence)];
|
||||||
|
if (value)
|
||||||
|
[newEvent setSequence: value];
|
||||||
|
|
||||||
ownerUser = [[self userContext] sogoUser];
|
ownerUser = [[self userContext] sogoUser];
|
||||||
if (organizerIsSet)
|
if (organizerIsSet)
|
||||||
{
|
{
|
||||||
|
@ -1009,7 +1035,10 @@
|
||||||
}
|
}
|
||||||
[person setParticipationStatus: newPartStat];
|
[person setParticipationStatus: newPartStat];
|
||||||
newParticipationStatus = [person partStatWithDefault];
|
newParticipationStatus = [person partStatWithDefault];
|
||||||
|
|
||||||
|
value = [properties objectForKey: MAPIPropertyKey (PidLidAttendeeCriticalChange)];
|
||||||
|
if (value && ![value isNever])
|
||||||
|
[newEvent setTimeStampAsDate: value];
|
||||||
// if (newPartStat // != iCalPersonPartStatUndefined
|
// if (newPartStat // != iCalPersonPartStatUndefined
|
||||||
// )
|
// )
|
||||||
// {
|
// {
|
||||||
|
|
|
@ -331,6 +331,7 @@
|
||||||
NSString *status, *priority;
|
NSString *status, *priority;
|
||||||
NSCalendarDate *now;
|
NSCalendarDate *now;
|
||||||
NSInteger tzOffset;
|
NSInteger tzOffset;
|
||||||
|
double doubleValue;
|
||||||
|
|
||||||
vToDo = [sogoObject component: YES secure: NO];
|
vToDo = [sogoObject component: YES secure: NO];
|
||||||
vCalendar = [vToDo parent];
|
vCalendar = [vToDo parent];
|
||||||
|
@ -452,7 +453,11 @@
|
||||||
// is always set to 0, no matter what value is set in Outlook
|
// is always set to 0, no matter what value is set in Outlook
|
||||||
value = [properties objectForKey: MAPIPropertyKey (PidLidPercentComplete)];
|
value = [properties objectForKey: MAPIPropertyKey (PidLidPercentComplete)];
|
||||||
if (value)
|
if (value)
|
||||||
[vToDo setPercentComplete: [value stringValue]];
|
{
|
||||||
|
doubleValue = [value doubleValue];
|
||||||
|
[vToDo setPercentComplete:
|
||||||
|
[NSString stringWithFormat: @"%d", (int) (doubleValue * 100)]];
|
||||||
|
}
|
||||||
|
|
||||||
now = [NSCalendarDate date];
|
now = [NSCalendarDate date];
|
||||||
if ([sogoObject isNew])
|
if ([sogoObject isNew])
|
||||||
|
|
|
@ -43,7 +43,7 @@ id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *);
|
||||||
id NSObjectFromValuePointer (enum MAPITAGS, const void *);
|
id NSObjectFromValuePointer (enum MAPITAGS, const void *);
|
||||||
|
|
||||||
NSComparisonResult MAPICNCompare (uint64_t cn1, uint64_t cn2, 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 *
|
static inline NSNumber *
|
||||||
MAPIPropertyKey (enum MAPITAGS propTag)
|
MAPIPropertyKey (enum MAPITAGS propTag)
|
||||||
|
|
|
@ -298,7 +298,8 @@ MAPICNCompare (uint64_t cn1, uint64_t cn2, void *unused)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSComparisonResult MAPIChangeKeyGUIDCompare (NSData *ck1, NSData *ck2, void *unused)
|
NSComparisonResult
|
||||||
|
MAPIChangeKeyGUIDCompare (id ck1, id ck2, void *unused)
|
||||||
{
|
{
|
||||||
NSUInteger count;
|
NSUInteger count;
|
||||||
const unsigned char *ptr1, *ptr2;
|
const unsigned char *ptr1, *ptr2;
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
+ (id) dateFromFileTime: (const struct FILETIME *) timeValue;
|
+ (id) dateFromFileTime: (const struct FILETIME *) timeValue;
|
||||||
- (struct FILETIME *) asFileTimeInMemCtx: (void *) memCtx;
|
- (struct FILETIME *) asFileTimeInMemCtx: (void *) memCtx;
|
||||||
|
|
||||||
|
- (BOOL) isNever; /* occurs on 4500-12-31 */
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#endif /* NSCALENDARDATE+MAPISTORE_H */
|
#endif /* NSCALENDARDATE+MAPISTORE_H */
|
||||||
|
|
|
@ -114,4 +114,17 @@ _setupRefDate ()
|
||||||
return timeValue;
|
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
|
@end
|
||||||
|
|
|
@ -38,14 +38,15 @@
|
||||||
|
|
||||||
@implementation NSObject (MAPIStoreTallocHelpers)
|
@implementation NSObject (MAPIStoreTallocHelpers)
|
||||||
|
|
||||||
static int MAPIStoreTallocWrapperDestroy (void *data)
|
static int
|
||||||
|
MAPIStoreTallocWrapperDestroy (void *data)
|
||||||
{
|
{
|
||||||
struct MAPIStoreTallocWrapper *wrapper;
|
struct MAPIStoreTallocWrapper *wrapper;
|
||||||
NSAutoreleasePool *pool;
|
NSAutoreleasePool *pool;
|
||||||
|
|
||||||
pool = [NSAutoreleasePool new];
|
pool = [NSAutoreleasePool new];
|
||||||
wrapper = data;
|
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];
|
[wrapper->MAPIStoreSOGoObject release];
|
||||||
[pool release];
|
[pool release];
|
||||||
|
|
||||||
|
@ -57,10 +58,10 @@ static int MAPIStoreTallocWrapperDestroy (void *data)
|
||||||
struct MAPIStoreTallocWrapper *wrapper;
|
struct MAPIStoreTallocWrapper *wrapper;
|
||||||
|
|
||||||
wrapper = talloc_zero (tallocCtx, struct MAPIStoreTallocWrapper);
|
wrapper = talloc_zero (tallocCtx, struct MAPIStoreTallocWrapper);
|
||||||
wrapper->MAPIStoreSOGoObject = self;
|
|
||||||
[wrapper->MAPIStoreSOGoObject retain];
|
|
||||||
talloc_set_destructor ((void *) wrapper, MAPIStoreTallocWrapperDestroy);
|
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;
|
return wrapper;
|
||||||
}
|
}
|
||||||
|
|
|
@ -635,6 +635,54 @@
|
||||||
getCNForUID: nameInContainer];
|
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
|
- (NSString *) davResourceId
|
||||||
{
|
{
|
||||||
return [NSString stringWithFormat: @"urn:uuid:%@", nameInContainer];
|
return [NSString stringWithFormat: @"urn:uuid:%@", nameInContainer];
|
||||||
|
|
6
Version
6
Version
|
@ -2,6 +2,6 @@
|
||||||
# This file is included by library makefiles to set the version information
|
# This file is included by library makefiles to set the version information
|
||||||
# of the executable.
|
# of the executable.
|
||||||
|
|
||||||
MAJOR_VERSION=1
|
MAJOR_VERSION=2
|
||||||
MINOR_VERSION=3
|
MINOR_VERSION=0
|
||||||
SUBMINOR_VERSION=14
|
SUBMINOR_VERSION=0
|
||||||
|
|
Loading…
Reference in a new issue