public override bool GetNewOperations(ISyncWatermark minSyncWatermark, ISyncWatermark maxSyncWatermark, bool enumerateDeletes, int numOperations, QueryFilter filter, Dictionary <ISyncItemId, ServerManifestEntry> newServerManifest) { base.CheckDisposed("GetNewOperations"); AirSyncDiagnostics.TraceInfo <int>(ExTraceGlobals.RequestsTracer, this, "EntitySyncProvider.GetNewOperations. numOperations = {0}", numOperations); if (newServerManifest == null) { throw new ArgumentNullException("newServerManifest"); } if (!enumerateDeletes) { throw new NotImplementedException("enumerateDeletes is false!"); } if (filter != null) { throw new NotImplementedException("filter is non-null! Filters are not supported on EntitySyncProvider"); } SyncCalendar syncCalendar = new SyncCalendar(this.CalendarSyncState, base.Folder.Session, base.Folder.Id.ObjectId, (CalendarFolder folder) => EntitySyncProvider.PropertiesToSync, this.WindowStart, this.WindowEnd, false, numOperations); IFolderSyncState folderSyncState; IList <KeyValuePair <StoreId, LocalizedException> > list; SyncCalendarResponse syncCalendarResponse = syncCalendar.Execute(out folderSyncState, out list); AirSyncDiagnostics.TraceInfo <IFolderSyncState>(ExTraceGlobals.RequestsTracer, this, "newSyncState:{0}", folderSyncState); SyncCalendarFolderSyncState syncCalendarFolderSyncState = (SyncCalendarFolderSyncState)folderSyncState; this.CalendarSyncState = new AirSyncCalendarSyncState(syncCalendarFolderSyncState.SerializeAsBase64String(), syncCalendarResponse.QueryResumptionPoint, syncCalendarResponse.OldWindowEnd); if (list.Count > 0 && Command.CurrentCommand.MailboxLogger != null) { StringBuilder stringBuilder = new StringBuilder(); foreach (KeyValuePair <StoreId, LocalizedException> keyValuePair in list) { stringBuilder.AppendFormat("Exception caught for item {0}\r\n{1}\r\n\r\n", keyValuePair.Key, keyValuePair.Value); } Command.CurrentCommand.MailboxLogger.SetData(MailboxLogDataName.CalendarSync_Exception, stringBuilder.ToString()); } AirSyncDiagnostics.TraceInfo <int>(ExTraceGlobals.RequestsTracer, this, "DeletedItems:{0}", syncCalendarResponse.DeletedItems.Count); foreach (StoreId storeId in syncCalendarResponse.DeletedItems) { ISyncItemId syncItemId = EntitySyncItemId.CreateFromId(storeId); newServerManifest.Add(syncItemId, new ServerManifestEntry(ChangeType.Delete, syncItemId, null)); } this.CopyListToDictionary(syncCalendarResponse.UpdatedItems, "UpdatedItems", newServerManifest); this.CopyListToDictionary(syncCalendarResponse.RecurrenceMastersWithInstances, "RecurrenceMastersWithInstances", newServerManifest); this.CopyListToDictionary(syncCalendarResponse.RecurrenceMastersWithoutInstances, "RecurrenceMastersWithoutInstances", newServerManifest); this.CopyListToDictionary(syncCalendarResponse.UnchangedRecurrenceMastersWithInstances, "UnchangedRecurrenceMastersWithInstances", newServerManifest); AirSyncDiagnostics.TraceInfo <bool>(ExTraceGlobals.RequestsTracer, this, "MoreAvailable:{0}", !syncCalendarResponse.IncludesLastItemInRange); return(!syncCalendarResponse.IncludesLastItemInRange); }
private void CopyListToDictionary(IList <SyncCalendarItemType> items, string listName, Dictionary <ISyncItemId, ServerManifestEntry> newServerManifest) { AirSyncDiagnostics.TraceInfo <string, int>(ExTraceGlobals.RequestsTracer, this, "{0}:{1}", listName, items.Count); foreach (SyncCalendarItemType syncCalendarItemType in items) { EntitySyncWatermark watermark = null; object obj; if (syncCalendarItemType.RowData != null && syncCalendarItemType.RowData.TryGetValue(ItemSchema.ArticleId, out obj) && !(obj is PropertyError)) { watermark = EntitySyncWatermark.CreateWithChangeNumber((int)obj); } ISyncItemId syncItemId = EntitySyncItemId.CreateFromId(syncCalendarItemType.ItemId); ServerManifestEntry serverManifestEntry = new ServerManifestEntry(ChangeType.Add, syncItemId, watermark); serverManifestEntry.MessageClass = "IPM.APPOINTMENT"; serverManifestEntry.CalendarItemType = syncCalendarItemType.CalendarItemType; OccurrenceStoreObjectId occurrenceStoreObjectId = StoreId.GetStoreObjectId(syncCalendarItemType.ItemId) as OccurrenceStoreObjectId; if (occurrenceStoreObjectId != null) { serverManifestEntry.SeriesMasterId = occurrenceStoreObjectId.GetMasterStoreObjectId(); } newServerManifest.Add(syncItemId, serverManifestEntry); } }
protected override bool GetNewOperations(int windowSize, Dictionary <ISyncItemId, ServerManifestEntry> tempServerManifest) { bool newOperations = base.GetNewOperations(windowSize, tempServerManifest); Dictionary <ISyncItemId, EntityFolderSync.OcurrenceInformation> masterItems = this.MasterItems; Dictionary <ISyncItemId, ServerManifestEntry> dictionary = new Dictionary <ISyncItemId, ServerManifestEntry>(); foreach (ServerManifestEntry serverManifestEntry in tempServerManifest.Values) { if (serverManifestEntry.ChangeType == ChangeType.Delete) { if (masterItems.ContainsKey(serverManifestEntry.Id)) { EntityFolderSync.OcurrenceInformation ocurrenceInformation = masterItems[serverManifestEntry.Id]; foreach (ISyncItemId syncItemId in ocurrenceInformation.Ocurrences) { dictionary.Add(syncItemId, new ServerManifestEntry(ChangeType.Delete, syncItemId, null)); } masterItems.Remove(serverManifestEntry.Id); } } else if (serverManifestEntry.ChangeType == ChangeType.Add) { if (serverManifestEntry.CalendarItemType == CalendarItemType.RecurringMaster) { if (masterItems.ContainsKey(serverManifestEntry.Id)) { EntityFolderSync.OcurrenceInformation ocurrenceInformation = masterItems[serverManifestEntry.Id]; for (int i = ocurrenceInformation.Ocurrences.Count - 1; i >= 0; i--) { if (!tempServerManifest.ContainsKey(ocurrenceInformation.Ocurrences[i])) { dictionary.Add(ocurrenceInformation.Ocurrences[i], new ServerManifestEntry(ChangeType.Delete, ocurrenceInformation.Ocurrences[i], null)); ocurrenceInformation.Ocurrences.RemoveAt(i); } } } } else if (serverManifestEntry.CalendarItemType == CalendarItemType.Occurrence || serverManifestEntry.CalendarItemType == CalendarItemType.Exception) { EntitySyncItemId key = EntitySyncItemId.CreateFromId(serverManifestEntry.SeriesMasterId); EntityFolderSync.OcurrenceInformation ocurrenceInformation; if (masterItems.ContainsKey(key)) { ocurrenceInformation = masterItems[key]; } else { ocurrenceInformation = new EntityFolderSync.OcurrenceInformation(); masterItems[key] = ocurrenceInformation; } if (!ocurrenceInformation.Ocurrences.Contains(serverManifestEntry.Id)) { ocurrenceInformation.Ocurrences.Add(serverManifestEntry.Id); } } } } foreach (ServerManifestEntry serverManifestEntry2 in dictionary.Values) { if (!tempServerManifest.ContainsKey(serverManifestEntry2.Id)) { tempServerManifest.Add(serverManifestEntry2.Id, serverManifestEntry2); } } this.MasterItems = masterItems; return(newOperations); }