diff --git a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m index 21fea26d1..fa380226a 100644 --- a/ActiveSync/SOGoActiveSyncDispatcher+Sync.m +++ b/ActiveSync/SOGoActiveSyncDispatcher+Sync.m @@ -269,6 +269,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (void) processSyncAddCommand: (id ) theDocumentElement inCollection: (id) theCollection withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType + objectsToTouch: (NSMutableArray *) objectsToTouch inBuffer: (NSMutableString *) theBuffer { NSMutableDictionary *folderMetadata, *dateCache, *syncCache, *uidCache, *allValues; @@ -280,6 +281,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. int i; additions = (id)[theDocumentElement getElementsByTagName: @"Add"]; + if ([additions count]) { for (i = 0; i < [additions count]; i++) @@ -375,6 +377,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } + if ([sogoObject isKindOfClass: [SOGoAppointmentObject class]] && [sogoObject resourceHasAutoAccepted]) + [objectsToTouch addObject: sogoObject]; + // Update syncCache folderMetadata = [self _folderMetadataForKey: [self _getNameInCache: theCollection withType: theFolderType]]; @@ -426,7 +431,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [theBuffer appendFormat: @"%@", easId]; [theBuffer appendFormat: @"%d", 1]; [theBuffer appendString: @""]; - } } } @@ -470,7 +474,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (void) processSyncChangeCommand: (id ) theDocumentElement inCollection: (id) theCollection withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType - inBuffer: (NSMutableString *) theBuffer + objectsToTouch: (NSMutableArray *) objectsToTouch + inBuffer: (NSMutableString *) theBuffer { NSDictionary *allChanges; NSString *serverId, *easId, *origServerId, *mergedFolder; @@ -510,6 +515,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self processSyncChangeCommand: theDocumentElement inCollection: [self collectionFromId: mergedFolder type: theFolderType] withType: theFolderType + objectsToTouch: objectsToTouch inBuffer: theBuffer]; continue; @@ -595,7 +601,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [o takeActiveSyncValues: allChanges inContext: context]; if (theFolderType == ActiveSyncEventFolder) - [sogoObject saveComponent: o force: YES]; + { + [sogoObject saveComponent: o force: YES]; + if ([sogoObject resourceHasAutoAccepted]) + [objectsToTouch addObject: sogoObject]; + } else [sogoObject saveComponent: o]; @@ -1646,6 +1656,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inCollection: (id) theCollection withType: (SOGoMicrosoftActiveSyncFolderType) theFolderType inBuffer: (NSMutableString *) theBuffer + objectsToTouch: (NSMutableArray *) objectsToTouch processed: (BOOL *) processed { id aCommand, element; @@ -1674,6 +1685,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self processSyncAddCommand: element inCollection: theCollection withType: theFolderType + objectsToTouch: objectsToTouch inBuffer: theBuffer]; *processed = YES; } @@ -1683,6 +1695,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [self processSyncChangeCommand: element inCollection: theCollection withType: theFolderType + objectsToTouch: objectsToTouch inBuffer: theBuffer]; *processed = YES; } @@ -1720,7 +1733,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *mimeTruncation, *filterType, *lastServerKey, *syncKeyInCache, *folderKey; NSMutableDictionary *folderMetadata, *folderOptions; - NSMutableArray *supportedElements, *supportedElementNames; + NSMutableArray *supportedElements, *supportedElementNames, *objectsToTouch; NSMutableString *changeBuffer, *commandsBuffer; id collection, value; @@ -1950,6 +1963,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // We process the commands from the request // + objectsToTouch = [NSMutableArray array]; + if (!first_sync) { NSMutableString *s; @@ -1962,6 +1977,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. inCollection: collection withType: folderType inBuffer: s + objectsToTouch: objectsToTouch processed: &processed]; // Windows phones don't like empty Responses tags - such as: . @@ -2280,6 +2296,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. [theBuffer appendString: changeBuffer]; [theBuffer appendString: @""]; + + // We touch objects (likely only SOGoAppointmentObjects for now) that might have been changed + // by the server and that we want the EAS client to re-pull. For example, that's the case for + // auto-accepted events by resources + for (i = 0; i < [objectsToTouch count]; i++) + { + sleep(1); + [[objectsToTouch objectAtIndex: i] touch]; + } } // diff --git a/SoObjects/Appointments/SOGoAppointmentObject.h b/SoObjects/Appointments/SOGoAppointmentObject.h index d3d80b869..667e1e22d 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.h +++ b/SoObjects/Appointments/SOGoAppointmentObject.h @@ -36,6 +36,9 @@ #import "SOGoCalendarComponent.h" @interface SOGoAppointmentObject : SOGoCalendarComponent +{ + BOOL _resourceHasAutoAccepted; +} - (NSException *) changeParticipationStatus: (NSString *) status withDelegate: (iCalPerson *) delegate @@ -57,6 +60,8 @@ - (NSException *) updateContentWithCalendar: (iCalCalendar *) calendar fromRequest: (WORequest *) rq; +- (BOOL) resourceHasAutoAccepted; + @end #endif /* __Appointments_SOGoAppointmentObject_H__ */ diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index 8a751b471..32a8105ab 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -550,7 +550,9 @@ NSEnumerator *enumerator; NSString *currentUID; SOGoUser *user, *currentUser; - + + _resourceHasAutoAccepted = NO; + // Build a list of the attendees uids attendees = [NSMutableArray arrayWithCapacity: [theAttendees count]]; enumerator = [theAttendees objectEnumerator]; @@ -690,6 +692,7 @@ { [[currentAttendee attributes] removeObjectForKey: @"RSVP"]; [currentAttendee setParticipationStatus: iCalPersonPartStatAccepted]; + _resourceHasAutoAccepted = YES; } } else @@ -760,6 +763,7 @@ // set the resource as one! [[currentAttendee attributes] removeObjectForKey: @"RSVP"]; [currentAttendee setParticipationStatus: iCalPersonPartStatAccepted]; + _resourceHasAutoAccepted = YES; } } // if ([user isResource]) ... @@ -2425,4 +2429,9 @@ inRecurrenceExceptionsForEvent: (iCalEvent *) theEvent return response; } +- (BOOL) resourceHasAutoAccepted +{ + return _resourceHasAutoAccepted; +} + @end /* SOGoAppointmentObject */