/// <summary> /// Returns the external data repository synchronization object by a unique foreign key from synchronization metadata. /// </summary> /// <param name="schema">Schema.</param> /// <param name="itemMetadata">Synchronization metadata.</param> /// <returns>Created instance of <see cref="IRemoteItem"/>.</returns> public override IRemoteItem LoadSyncItem(SyncItemSchema schema, ItemMetadata itemMetadata) { SysSyncMetaData syncItemMetadata = itemMetadata.FirstOrDefault(item => item.SyncSchemaName == "Activity"); if (syncItemMetadata == null) { var notChangedAppointment = CreateExchangeAppointment(schema, null, string.Empty, TimeZone); notChangedAppointment.State = SyncState.None; return(notChangedAppointment); } string itemId = GetRemoteId(syncItemMetadata); ExchangeBase remoteItem; var appointment = SafeBindItem <Exchange.Appointment>(Service, new Exchange.ItemId(itemId)); if (appointment == null && _userConnection.GetIsFeatureEnabled("SyncDeletedAppointments")) { appointment = GetAppointmentByLocalIdProperty(syncItemMetadata); } if (appointment != null) { remoteItem = CreateExchangeAppointment(schema, appointment, TimeZone); remoteItem.Action = SyncAction.Update; } else { string itemRemoteId = syncItemMetadata.RemoteId; appointment = new Exchange.Appointment(Service); remoteItem = CreateExchangeAppointment(schema, appointment, itemRemoteId, TimeZone); remoteItem.State = SyncState.Deleted; remoteItem.Action = SyncAction.Delete; } return(remoteItem); }
/// <summary> /// Loads exchange appointment from exchange, filtered by related <paramref name="activityMetadata"/> to /// activity unique identifier. /// </summary> /// <param name="activityMetadata">Activity instance synchronization metadata.</param> /// <returns>If appointment with activity id found, returns <see cref="Exchange.Appointment"/> instance. /// Otherwise returns null.</returns> private Exchange.Appointment GetAppointmentByLocalIdProperty(SysSyncMetaData activityMetadata) { var localId = activityMetadata.LocalId; var filters = new Exchange.SearchFilter.SearchFilterCollection(Exchange.LogicalOperator.And); var customPropSetFilter = new Exchange.SearchFilter.IsEqualTo(ExchangeUtilityImpl.LocalIdProperty, localId.ToString()); filters.Add(customPropSetFilter); foreach (var noteFolder in Folders) { Exchange.PropertySet idOnlyPropertySet = new Exchange.PropertySet(Exchange.BasePropertySet.IdOnly); var itemView = new Exchange.ItemView(1) { PropertySet = idOnlyPropertySet }; IEnumerable <Exchange.Item> itemCollection = GetCalendarItemsByFilter(noteFolder, filters, itemView); if (itemCollection == null) { continue; } foreach (Exchange.Item item in itemCollection) { Exchange.Appointment appointment = SafeBindItem <Exchange.Appointment>(Service, item.Id); if (appointment != null) { return(appointment); } } } return(null); }
/// <summary>Gets remote Id from extend property.</summary> /// <param name="syncItemMetadata">Synchronization metadata.</param> /// <returns>Unique identifier item in remote storage.</returns> public string GetRemoteId(SysSyncMetaData syncItemMetadata) { if (!(syncItemMetadata.ExtraParameters).IsNullOrEmpty()) { JObject activityExtendProperty = JObject.Parse(syncItemMetadata.ExtraParameters); return((string)activityExtendProperty["RemoteId"]); } else { throw new ItemNotFoundException("Extra parameters is empty"); } }
/// <summary> /// Returns activity hash stored in activity synchronization metadata. /// </summary> /// <param name="itemMetadata"><see cref="ItemMetadata"/> instance.</param> /// <returns>Stored activity hash.</returns> protected virtual string GetActivityHashFromMetadata(ItemMetadata itemMetadata) { string result = string.Empty; if (itemMetadata != null) { SysSyncMetaData activityMetaData = itemMetadata.FirstOrDefault(item => item.SyncSchemaName == "Activity"); if (activityMetaData != null) { string extraParameters = activityMetaData.ExtraParameters; if (!extraParameters.IsNullOrEmpty()) { JObject activityExtendProperty = JObject.Parse(activityMetaData.ExtraParameters); result = (string)activityExtendProperty["ActivityHash"]; } } } return(result); }