Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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));
        }