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:
Francis Lachapelle 2012-03-22 18:05:26 +00:00
commit af3dc4a903
12 changed files with 153 additions and 14 deletions

View file

@ -3,6 +3,12 @@
* UI/MailerUI/UIxMailFolderActions.m (-emptyTrashAction:): we now
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>
* SoObjects/SOGo/SOGoUserManager.m (_compactAndCompleteContacts:):
@ -22,6 +28,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

@ -331,6 +331,7 @@
NSString *status, *priority;
NSCalendarDate *now;
NSInteger tzOffset;
double doubleValue;
vToDo = [sogoObject component: YES secure: NO];
vCalendar = [vToDo parent];
@ -452,7 +453,11 @@
// is always set to 0, no matter what value is set in Outlook
value = [properties objectForKey: MAPIPropertyKey (PidLidPercentComplete)];
if (value)
[vToDo setPercentComplete: [value stringValue]];
{
doubleValue = [value doubleValue];
[vToDo setPercentComplete:
[NSString stringWithFormat: @"%d", (int) (doubleValue * 100)]];
}
now = [NSCalendarDate date];
if ([sogoObject isNew])

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