internal static bool TryGetPropertyFromBag <T>(IStorePropertyBag propertyBag, PropertyDefinition propDef, ISyncLogger syncLogger, out T value) { if (syncLogger == null) { syncLogger = TracingLogger.Singleton; } object obj = null; try { obj = propertyBag.TryGetProperty(propDef); } catch (NotInBagPropertyErrorException) { syncLogger.TraceError <string>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderHierarchySync.TryGetPropertyFromBag] NotInBag exception for property {0}. Returning default value.", propDef.Name); value = default(T); return(false); } if (obj is T) { value = (T)((object)obj); return(true); } PropertyError propertyError = obj as PropertyError; if (propertyError != null) { syncLogger.TraceError <Type, string, PropertyErrorCode>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderHierarchySync.TryGetPropertyFromBag] Expected property of type {0} in bag for propDef {1}, but encountered error {2}.", typeof(T), propDef.Name, propertyError.PropertyErrorCode); } else { try { value = (T)((object)obj); return(true); } catch (InvalidCastException ex) { syncLogger.TraceError(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderHierarchySync.TryGetPropertyFromBag] Tried to cast property '{0}' with value '{1}' to type '{2}', but the cast failed with error '{3}'.", new object[] { propDef.Name, (obj == null) ? "<NULL>" : obj, typeof(T).FullName, ex }); } } value = default(T); return(false); }
private static bool TryGetPropertyFromBag <T>(IStorePropertyBag propertyBag, PropertyDefinition propDef, out T value, ISyncLogger syncLogger = null) { object obj = propertyBag.TryGetProperty(propDef); if (obj is T) { value = (T)((object)obj); return(true); } PropertyError propertyError = obj as PropertyError; if (propertyError != null) { syncLogger.TraceError <Type, string, PropertyErrorCode>(ExTraceGlobals.SyncProcessTracer, 0L, "[DeviceSyncStateMetadata.TryGetPropertyFromBag] Expected property of type {0} in bag for propDef {1}, but encountered error {2}.", typeof(T), propDef.Name, propertyError.PropertyErrorCode); } else { try { value = (T)((object)obj); return(true); } catch (InvalidCastException ex) { syncLogger.TraceError(ExTraceGlobals.SyncProcessTracer, 0L, "[DeviceSyncStateMetadata.TryGetPropertyFromBag] Tried to cast property '{0}' with value '{1}' to type '{2}', but the cast failed with error '{3}'.", new object[] { propDef.Name, (obj == null) ? "<NULL>" : obj, typeof(T).FullName, ex }); } } value = default(T); return(false); }
internal static FolderSyncState GetSyncState(SyncStateStorage syncStateStorage, Folder deviceFolder, ISyncProviderFactory syncProviderFactory, Func <SyncStateStorage, StoreObject, FolderSyncStateMetadata, SyncStateInfo, ISyncProviderFactory, bool, ISyncLogger, FolderSyncState> creator, ISyncLogger syncLogger = null) { if (syncLogger == null) { syncLogger = TracingLogger.Singleton; } ArgumentValidator.ThrowIfNull("syncStateStorage", syncStateStorage); ArgumentValidator.ThrowIfNull("deviceFolder", deviceFolder); ArgumentValidator.ThrowIfNull("syncProviderFactory", syncProviderFactory); byte[] collectionIdBytes = syncProviderFactory.GetCollectionIdBytes(); if (collectionIdBytes == null || collectionIdBytes.Length == 0) { throw new ArgumentException("SyncProviderFactory CollectionId bytes cannot be null or empty."); } StoreObjectId storeObjectId = null; try { storeObjectId = StoreObjectId.Deserialize(collectionIdBytes); } catch (ArgumentException innerException) { syncLogger.TraceError <string>(ExTraceGlobals.SyncTracer, 0L, "[FolderSyncState.GetSyncState(syncProviderFactory)] The IPMFolderBytes that the provider gave us are invalid for folder {0}", deviceFolder.DisplayName); throw new CorruptSyncStateException(ServerStrings.ExSyncStateCorrupted(deviceFolder.DisplayName), innerException); } FolderSyncStateMetadata folderSyncStateMetadata = null; if (!syncStateStorage.DeviceMetadata.SyncStatesByIPMFolderId.TryGetValue(storeObjectId, out folderSyncStateMetadata)) { syncLogger.TraceDebug <DeviceIdentity, string>(ExTraceGlobals.SyncTracer, 0L, "[FolderSyncState.GetSyncState(syncProviderFactory)] Cache miss for device {0}, IPM folder Id {1}", syncStateStorage.DeviceMetadata.Id, storeObjectId.ToBase64String()); return(null); } SyncStateMetadata syncStateMetadata = folderSyncStateMetadata; StoreObject storeObject = SyncState.GetSyncStateStoreObject(deviceFolder, ref syncStateMetadata, syncLogger, new PropertyDefinition[] { InternalSchema.SyncFolderSourceKey }); if (!object.ReferenceEquals(folderSyncStateMetadata, syncStateMetadata)) { FolderSyncStateMetadata folderSyncStateMetadata2 = syncStateMetadata as FolderSyncStateMetadata; if (folderSyncStateMetadata2 == null) { syncLogger.TraceDebug <string, string>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderSyncState.GetSyncState] Device {0} has non-folder sync state for {1}. Returning null.", deviceFolder.DisplayName, folderSyncStateMetadata.Name); if (storeObject != null) { storeObject.Dispose(); storeObject = null; } } else { syncLogger.TraceDebug <string, string>(ExTraceGlobals.SyncProcessTracer, 0L, "[FolderSyncState.GetSyncState] Device {0} had state folder sync state metadata for {1}. Replacing.", deviceFolder.DisplayName, folderSyncStateMetadata.Name); folderSyncStateMetadata = folderSyncStateMetadata2; } } if (storeObject == null) { return(null); } SyncStateInfo syncStateInfo = new FolderSyncStateInfo(folderSyncStateMetadata.Name); if (creator == null) { return(new FolderSyncState(syncStateStorage, storeObject, folderSyncStateMetadata, syncStateInfo, syncProviderFactory, false, syncLogger)); } return(creator(syncStateStorage, storeObject, folderSyncStateMetadata, syncStateInfo, syncProviderFactory, false, syncLogger)); }