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
|
||||
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:):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
// )
|
||||
// {
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in a new issue