Monotone-Parent: 5bdd362f0346da09b105a6a7054e67410a0dcee5
Monotone-Revision: 53f6a0a8eb5d41aa85332c3cc20b7eeca0bb9da7 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-08-08T19:02:49 Monotone-Branch: ca.inverse.sogomaint-2.0.2
parent
8b8f079992
commit
cec8d052af
|
@ -1,5 +1,9 @@
|
|||
2011-08-08 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* OpenChange/MAPIStoreCalendarMessage.m (-save): fixed attendees
|
||||
handling (only change the attendee partstat) and avoid saving the
|
||||
event when the newpartstat is "undefined".
|
||||
|
||||
* OpenChange/MAPIStoreAppointmentWrapper.m
|
||||
(-getPrOwnerApptId:inMemCtx:): properly reimplemented the method
|
||||
following the spec.
|
||||
|
|
|
@ -113,12 +113,24 @@
|
|||
return [[self appointmentWrapper] getPrMessageClass: data inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
- (int) getPrOwnerApptId: (void **) data
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
return [[self appointmentWrapper] getPrOwnerApptId: data inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
- (int) getPrStartDate: (void **) data
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
return [[self appointmentWrapper] getPrStartDate: data inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
- (int) getPidLidAppointmentStateFlags: (void **) data
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
return [[self appointmentWrapper] getPidLidAppointmentStateFlags: data inMemCtx: memCtx];
|
||||
}
|
||||
|
||||
- (int) getPidLidAppointmentStartWhole: (void **) data
|
||||
inMemCtx: (TALLOC_CTX *) memCtx
|
||||
{
|
||||
|
@ -313,19 +325,22 @@
|
|||
|
||||
- (void) save
|
||||
{
|
||||
WOContext *woContext;
|
||||
iCalCalendar *vCalendar;
|
||||
iCalDateTime *start, *end;
|
||||
iCalTimeZone *tz;
|
||||
NSCalendarDate *now;
|
||||
NSString *content, *tzName;
|
||||
iCalEvent *newEvent;
|
||||
iCalPerson *userPerson;
|
||||
NSUInteger responseStatus = 0;
|
||||
SOGoUser *activeUser;
|
||||
id value;
|
||||
|
||||
[self logWithFormat: @"-save, event props:"];
|
||||
// MAPIStoreDumpMessageProperties (newProperties);
|
||||
|
||||
now = [NSCalendarDate date];
|
||||
|
||||
content = [sogoObject contentAsString];
|
||||
if (![content length])
|
||||
{
|
||||
|
@ -333,64 +348,108 @@
|
|||
vCalendar = [newEvent parent];
|
||||
[vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"];
|
||||
content = [vCalendar versitString];
|
||||
[newEvent setCreated: now];
|
||||
}
|
||||
|
||||
vCalendar = [iCalCalendar parseSingleFromSource: content];
|
||||
newEvent = [[vCalendar events] objectAtIndex: 0];
|
||||
|
||||
// summary
|
||||
value = [newProperties
|
||||
objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)];
|
||||
if (value)
|
||||
[newEvent setSummary: value];
|
||||
|
||||
// Location
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PidLidLocation)];
|
||||
if (value)
|
||||
[newEvent setLocation: value];
|
||||
|
||||
tzName = [[self ownerTimeZone] name];
|
||||
tz = [iCalTimeZone timeZoneForName: tzName];
|
||||
[vCalendar addTimeZone: tz];
|
||||
|
||||
// start
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PR_START_DATE)];
|
||||
if (!value)
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PidLidAppointmentStartWhole)];
|
||||
if (value)
|
||||
{
|
||||
start = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtstart"];
|
||||
[start setTimeZone: tz];
|
||||
[start setDateTime: value];
|
||||
}
|
||||
|
||||
// end
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PR_END_DATE)];
|
||||
if (!value)
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PidLidAppointmentEndWhole)];
|
||||
if (value)
|
||||
{
|
||||
end = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtend"];
|
||||
[end setTimeZone: tz];
|
||||
[end setDateTime: value];
|
||||
}
|
||||
|
||||
now = [NSCalendarDate date];
|
||||
if ([sogoObject isNew])
|
||||
{
|
||||
[newEvent setCreated: now];
|
||||
}
|
||||
activeUser = [[self context] activeUser];
|
||||
userPerson = [newEvent userAsAttendee: activeUser];
|
||||
[newEvent setTimeStampAsDate: now];
|
||||
|
||||
// Organizer and attendees
|
||||
value
|
||||
= [newProperties objectForKey: MAPIPropertyKey (PidLidResponseStatus)];
|
||||
if (value)
|
||||
responseStatus = [value unsignedLongValue];
|
||||
|
||||
woContext = [[self context] woContext];
|
||||
if (responseStatus == 0)
|
||||
if (userPerson)
|
||||
{
|
||||
// iCalPersonPartStat newPartStat;
|
||||
NSString *newPartStat;
|
||||
|
||||
value
|
||||
= [newProperties objectForKey: MAPIPropertyKey (PidLidResponseStatus)];
|
||||
if (value)
|
||||
responseStatus = [value unsignedLongValue];
|
||||
|
||||
switch (responseStatus)
|
||||
{
|
||||
case 0x02: /* respTentative */
|
||||
// newPartStat = iCalPersonPartStatTentative;
|
||||
newPartStat = @"TENTATIVE";
|
||||
break;
|
||||
case 0x03: /* respAccepted */
|
||||
// newPartStat = iCalPersonPartStatAccepted;
|
||||
newPartStat = @"ACCEPTED";
|
||||
break;
|
||||
case 0x04: /* respDeclined */
|
||||
// newPartStat = iCalPersonPartStatDeclined;
|
||||
newPartStat = @"DECLINED";
|
||||
break;
|
||||
default:
|
||||
newPartStat = nil;
|
||||
}
|
||||
|
||||
if (newPartStat // != iCalPersonPartStatUndefined
|
||||
)
|
||||
{
|
||||
// iCalPerson *participant;
|
||||
|
||||
// participant = [newEvent userAsAttendee: activeUser];
|
||||
// [participant setParticipationStatus: newPartStat];
|
||||
// [sogoObject saveComponent: newEvent];
|
||||
|
||||
[sogoObject changeParticipationStatus: newPartStat
|
||||
withDelegate: nil];
|
||||
// [[self context] tearDownRequest];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[newEvent setLastModified: now];
|
||||
|
||||
// summary
|
||||
value = [newProperties
|
||||
objectForKey: MAPIPropertyKey (PR_NORMALIZED_SUBJECT_UNICODE)];
|
||||
if (value)
|
||||
[newEvent setSummary: value];
|
||||
|
||||
// Location
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PidLidLocation)];
|
||||
if (value)
|
||||
[newEvent setLocation: value];
|
||||
|
||||
tzName = [[self ownerTimeZone] name];
|
||||
tz = [iCalTimeZone timeZoneForName: tzName];
|
||||
[vCalendar addTimeZone: tz];
|
||||
|
||||
// start
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PR_START_DATE)];
|
||||
if (!value)
|
||||
value = [newProperties
|
||||
objectForKey: MAPIPropertyKey (PidLidAppointmentStartWhole)];
|
||||
if (value)
|
||||
{
|
||||
start = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtstart"];
|
||||
[start setTimeZone: tz];
|
||||
[start setDateTime: value];
|
||||
}
|
||||
|
||||
// end
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PR_END_DATE)];
|
||||
if (!value)
|
||||
value = [newProperties objectForKey: MAPIPropertyKey (PidLidAppointmentEndWhole)];
|
||||
if (value)
|
||||
{
|
||||
end = (iCalDateTime *) [newEvent uniqueChildWithTag: @"dtend"];
|
||||
[end setTimeZone: tz];
|
||||
[end setDateTime: value];
|
||||
}
|
||||
|
||||
/* recurrence */
|
||||
value = [newProperties
|
||||
objectForKey: MAPIPropertyKey (PidLidAppointmentRecur)];
|
||||
if (value)
|
||||
[self _setupRecurrenceInCalendar: vCalendar
|
||||
fromData: value];
|
||||
|
||||
// Organizer
|
||||
value = [newProperties objectForKey: @"recipients"];
|
||||
if (value)
|
||||
{
|
||||
|
@ -399,7 +458,7 @@
|
|||
iCalPerson *person;
|
||||
int i;
|
||||
|
||||
dict = [[woContext activeUser] primaryIdentity];
|
||||
dict = [activeUser primaryIdentity];
|
||||
person = [iCalPerson new];
|
||||
[person setCn: [dict objectForKey: @"fullName"]];
|
||||
[person setEmail: [dict objectForKey: @"email"]];
|
||||
|
@ -422,48 +481,13 @@
|
|||
// FIXME: We must NOT always rely on this
|
||||
if (![newEvent isAttendee: [person rfc822Email]])
|
||||
[newEvent addToAttendees: person];
|
||||
|
||||
|
||||
[person release];
|
||||
}
|
||||
}
|
||||
|
||||
[sogoObject saveComponent: newEvent];
|
||||
}
|
||||
else
|
||||
{
|
||||
iCalPersonPartStat newPartStat;
|
||||
|
||||
switch (responseStatus)
|
||||
{
|
||||
case 0x02: /* respTentative */
|
||||
newPartStat = iCalPersonPartStatTentative;
|
||||
break;
|
||||
case 0x03: /* respAccepted */
|
||||
newPartStat = iCalPersonPartStatAccepted;
|
||||
break;
|
||||
case 0x04: /* respDeclined */
|
||||
newPartStat = iCalPersonPartStatDeclined;
|
||||
break;
|
||||
default:
|
||||
newPartStat = iCalPersonPartStatUndefined;
|
||||
}
|
||||
|
||||
if (newPartStat != iCalPersonPartStatUndefined)
|
||||
{
|
||||
iCalPerson *participant;
|
||||
|
||||
participant = [newEvent userAsAttendee: [woContext activeUser]];
|
||||
[participant setParticipationStatus: newPartStat];
|
||||
}
|
||||
}
|
||||
|
||||
/* recurrence */
|
||||
value = [newProperties
|
||||
objectForKey: MAPIPropertyKey (PidLidAppointmentRecur)];
|
||||
if (value)
|
||||
[self _setupRecurrenceInCalendar: vCalendar
|
||||
fromData: value];
|
||||
|
||||
// [sogoObject saveContentString: [vCalendar versitString]];
|
||||
[sogoObject saveComponent: newEvent];
|
||||
}
|
||||
|
||||
- (id) lookupAttachment: (NSString *) childKey
|
||||
|
|
Loading…
Reference in New Issue