public SyncStateMetadata GetMetadataFromPropertyBag(IStorePropertyBag propertyBag, string displayName, ISyncLogger syncLogger = null) { byte[] byteArray = null; if (!DeviceSyncStateMetadata.TryGetPropertyFromBag <byte[]>(propertyBag, InternalSchema.SyncFolderSourceKey, out byteArray, syncLogger)) { syncLogger.TraceDebug <string>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[DeviceSyncStateMetadata.GetMetadataFromPropertyBag] Creating custom sync state metadata for folder '{0}'", displayName); return(new SyncStateMetadata(this, displayName, null, null)); } StoreObjectId storeObjectId = StoreObjectId.Deserialize(byteArray); syncLogger.TraceDebug <string, StoreObjectId>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[DeviceSyncStateMetadata.GetMetadataFromPropertyBag] Found SyncFolderSourceKey for {0}, so it is a FolderSyncState: {1}", displayName, storeObjectId); long localCommitTimeMax = 0L; int deletedCountTotal = 0; int syncKey = 0; int airSyncFilter = 0; bool conversationMode = false; int airSyncSettingsHash = 0; int airSyncMaxItems = 0; VariantConfigurationSnapshot snapshot = VariantConfiguration.GetSnapshot(MachineSettingsContext.Local, null, null); bool flag = snapshot != null && snapshot.DataStorage.IgnoreInessentialMetaDataLoadErrors != null && snapshot.DataStorage.IgnoreInessentialMetaDataLoadErrors.Enabled; syncLogger.TraceDebug <bool>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[DeviceSyncStateMetadata.GetMetadataFromPropertyBag] ignoreInessentialMetaDataLoadErrors: {0}", flag); long airSyncLastSyncTime; bool flag2 = DeviceSyncStateMetadata.TryGetPropertyFromBag <long>(propertyBag, AirSyncStateSchema.MetadataLastSyncTime, out airSyncLastSyncTime, syncLogger) && DeviceSyncStateMetadata.TryGetPropertyFromBag <long>(propertyBag, AirSyncStateSchema.MetadataLocalCommitTimeMax, out localCommitTimeMax, syncLogger) && DeviceSyncStateMetadata.TryGetPropertyFromBag <int>(propertyBag, AirSyncStateSchema.MetadataDeletedCountTotal, out deletedCountTotal, syncLogger) && DeviceSyncStateMetadata.TryGetPropertyFromBag <int>(propertyBag, AirSyncStateSchema.MetadataSyncKey, out syncKey, syncLogger) && DeviceSyncStateMetadata.TryGetPropertyFromBag <int>(propertyBag, AirSyncStateSchema.MetadataFilter, out airSyncFilter, syncLogger) && DeviceSyncStateMetadata.TryGetPropertyFromBag <bool>(propertyBag, AirSyncStateSchema.MetadataConversationMode, out conversationMode, syncLogger) && DeviceSyncStateMetadata.TryGetPropertyFromBag <int>(propertyBag, AirSyncStateSchema.MetadataSettingsHash, out airSyncSettingsHash, syncLogger); bool flag3 = flag2 && DeviceSyncStateMetadata.TryGetPropertyFromBag <int>(propertyBag, AirSyncStateSchema.MetadataMaxItems, out airSyncMaxItems, syncLogger); flag2 = (flag ? flag2 : flag3); if (flag2) { syncLogger.TraceDebug <string>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[DeviceSyncStateMetadata.GetMetadataFromPropertyBag] Creating FolderSync metadata for folder '{0}'", displayName); return(new FolderSyncStateMetadata(this, displayName, null, null, localCommitTimeMax, deletedCountTotal, syncKey, conversationMode, airSyncFilter, airSyncLastSyncTime, airSyncSettingsHash, airSyncMaxItems, storeObjectId)); } syncLogger.TraceDebug <string>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[DeviceSyncStateMetadata.GetMetadataFromPropertyBag] Failed to get nullSync properties for sync folder '{0}'.", displayName); return(new FolderSyncStateMetadata(this, displayName, null, null, 0L, 0, 0, false, 0, 0L, 0, 0, storeObjectId)); }
public SyncStateMetadata(DeviceSyncStateMetadata parentDevice, string name, StoreObjectId folderSyncStateId, StoreObjectId itemSyncStateId) { ArgumentValidator.ThrowIfNull("parentDevice", parentDevice); ArgumentValidator.ThrowIfNullOrEmpty("name", name); this.ParentDevice = parentDevice; this.Name = name; this.FolderSyncStateId = folderSyncStateId; this.ItemSyncStateId = itemSyncStateId; this.ParentDevice.TryAdd(this, null); }
private static SyncStateStorage GetSyncStateStorage(MailboxSession session, DeviceSyncStateMetadata deviceMetadata, ISyncLogger syncLogger = null) { if (deviceMetadata == null) { return(null); } if (syncLogger == null) { syncLogger = TracingLogger.Singleton; } Folder folder = null; SyncStateStorage syncStateStorage = null; bool flag = false; SyncStateStorage result; try { try { folder = Folder.Bind(session, deviceMetadata.DeviceFolderId, SyncStateStorage.loggingEnabledAndCreateTimeAsArray); syncStateStorage = new SyncStateStorage(folder, deviceMetadata, syncLogger); } catch (ObjectNotFoundException) { syncLogger.TraceDebug <DeviceSyncStateMetadata>(ExTraceGlobals.SyncTracer, 0L, "[SyncStateStorage.Create] Did not find SyncStateStorage for device {0}. Removing from cache.", deviceMetadata); UserSyncStateMetadata userSyncStateMetadata = UserSyncStateMetadataCache.Singleton.Get(session, syncLogger); userSyncStateMetadata.TryRemove(deviceMetadata.Id, syncLogger); deviceMetadata = userSyncStateMetadata.GetDevice(session, deviceMetadata.Id, syncLogger); if (deviceMetadata != null) { folder = Folder.Bind(session, deviceMetadata.DeviceFolderId, SyncStateStorage.loggingEnabledAndCreateTimeAsArray); syncStateStorage = new SyncStateStorage(folder, deviceMetadata, syncLogger); } } flag = true; result = syncStateStorage; } finally { if (!flag) { if (syncStateStorage != null) { syncStateStorage.Dispose(); syncStateStorage = null; } if (folder != null) { folder.Dispose(); folder = null; } } } return(result); }
public static SyncStateStorage Create(MailboxSession mailboxSession, DeviceIdentity deviceIdentity, StateStorageFeatures features, bool onlySetPropsIfAlreadyExists, ISyncLogger syncLogger = null) { if (syncLogger == null) { syncLogger = TracingLogger.Singleton; } EnumValidator.ThrowIfInvalid <StateStorageFeatures>(features, "features"); SyncStateTypeFactory.GetInstance().RegisterInternalBuilders(); UserSyncStateMetadata userSyncStateMetadata = UserSyncStateMetadataCache.Singleton.Get(mailboxSession, syncLogger); DeviceSyncStateMetadata deviceSyncStateMetadata = userSyncStateMetadata.GetDevice(mailboxSession, deviceIdentity, syncLogger); SyncStateStorage syncStateStorage = (deviceSyncStateMetadata == null) ? null : SyncStateStorage.GetSyncStateStorage(mailboxSession, deviceSyncStateMetadata, syncLogger); if (syncStateStorage == null || onlySetPropsIfAlreadyExists) { Folder folder = null; SyncStateStorage syncStateStorage2 = null; bool flag = false; try { folder = SyncStateStorage.CreateAndSaveFolder(mailboxSession, mailboxSession.GetDefaultFolderId(DefaultFolderType.SyncRoot), CreateMode.OpenIfExists, deviceIdentity.CompositeKey, null, (syncStateStorage == null) ? null : syncStateStorage.folder, syncLogger); if (deviceSyncStateMetadata != null && deviceSyncStateMetadata.DeviceFolderId != folder.Id.ObjectId) { userSyncStateMetadata.TryRemove(deviceSyncStateMetadata.Id, syncLogger); deviceSyncStateMetadata = null; } if (deviceSyncStateMetadata == null) { deviceSyncStateMetadata = new DeviceSyncStateMetadata(mailboxSession, folder.Id.ObjectId, syncLogger); deviceSyncStateMetadata = userSyncStateMetadata.GetOrAdd(deviceSyncStateMetadata); } syncStateStorage2 = new SyncStateStorage(folder, deviceSyncStateMetadata, syncLogger); flag = true; return(syncStateStorage2); } finally { if (!flag) { if (syncStateStorage2 != null) { syncStateStorage2.Dispose(); syncStateStorage2 = null; } if (folder != null) { folder.Dispose(); folder = null; } } } return(syncStateStorage); } return(syncStateStorage); }
public DeviceSyncStateMetadata GetDevice(MailboxSession mailboxSession, DeviceIdentity deviceIdentity, ISyncLogger syncLogger = null) { if (syncLogger == null) { syncLogger = TracingLogger.Singleton; } DeviceSyncStateMetadata result; if (this.devices.TryGetValue(deviceIdentity, out result)) { syncLogger.TraceDebug <DeviceIdentity>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[UserSyncStateMetadata.GetDevice] Cache hit for device: {0}", deviceIdentity); return(result); } syncLogger.TraceDebug <DeviceIdentity>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[UserSyncStateMetadata.GetDevice] Cache MISS for device: {0}", deviceIdentity); DeviceSyncStateMetadata result2; using (Folder syncRootFolder = this.GetSyncRootFolder(mailboxSession, syncLogger)) { using (QueryResult queryResult = syncRootFolder.FolderQuery(FolderQueryFlags.None, null, UserSyncStateMetadata.displayNameSort, new PropertyDefinition[] { FolderSchema.DisplayName, FolderSchema.Id })) { if (queryResult.SeekToCondition(SeekReference.OriginBeginning, new ComparisonFilter(ComparisonOperator.Equal, FolderSchema.DisplayName, deviceIdentity.CompositeKey))) { IStorePropertyBag storePropertyBag = queryResult.GetPropertyBags(1)[0]; StoreObjectId objectId = ((VersionedId)storePropertyBag.TryGetProperty(FolderSchema.Id)).ObjectId; string text = (string)storePropertyBag.TryGetProperty(FolderSchema.DisplayName); DeviceSyncStateMetadata deviceSyncStateMetadata = new DeviceSyncStateMetadata(mailboxSession, objectId, syncLogger); DeviceSyncStateMetadata orAdd = this.devices.GetOrAdd(deviceIdentity, deviceSyncStateMetadata); if (!object.ReferenceEquals(deviceSyncStateMetadata, orAdd)) { syncLogger.TraceDebug <DeviceIdentity>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[UserSyncStateMetadata.GetDevice] Race condition adding new device '{0}' to cache. Disarding new instance.", deviceIdentity); } else { syncLogger.TraceDebug <DeviceIdentity>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[UserSyncStateMetadata.GetDevice] Added new device instance to user cache: {0}", deviceIdentity); } result2 = orAdd; } else { syncLogger.TraceDebug <SmtpAddress, DeviceIdentity>(ExTraceGlobals.SyncProcessTracer, (long)this.GetHashCode(), "[UserSyncStateMetadata.GetDevice] Mailbox '{0}' does not contain a device folder for '{1}'", mailboxSession.MailboxOwner.MailboxInfo.PrimarySmtpAddress, deviceIdentity); result2 = null; } } } return(result2); }
public FolderSyncStateMetadata(DeviceSyncStateMetadata parentDevice, string name, StoreObjectId folderSyncStateId, StoreObjectId itemSyncStateId, long localCommitTimeMax, int deletedCountTotal, int syncKey, bool conversationMode, int airSyncFilter, long airSyncLastSyncTime, int airSyncSettingsHash, int airSyncMaxItems, StoreObjectId ipmFolderId) : base(parentDevice, name, folderSyncStateId, itemSyncStateId) { ArgumentValidator.ThrowIfNull("ipmFolderId", ipmFolderId); ArgumentValidator.ThrowIfNull("parentDevice", parentDevice); this.IPMFolderId = ipmFolderId; this.AirSyncLocalCommitTime = localCommitTimeMax; this.AirSyncDeletedCountTotal = deletedCountTotal; this.AirSyncSyncKey = syncKey; this.AirSyncConversationMode = conversationMode; this.AirSyncFilter = airSyncFilter; this.AirSyncLastSyncTime = airSyncLastSyncTime; this.AirSyncSettingsHash = airSyncSettingsHash; this.AirSyncMaxItems = airSyncMaxItems; }
public static SyncStateStorage Bind(MailboxSession mailboxSession, DeviceIdentity deviceIdentity, ISyncLogger syncLogger = null) { if (syncLogger == null) { syncLogger = TracingLogger.Singleton; } ArgumentValidator.ThrowIfNull("mailboxSession", mailboxSession); SyncStateTypeFactory.GetInstance().RegisterInternalBuilders(); UserSyncStateMetadata userSyncStateMetadata = UserSyncStateMetadataCache.Singleton.Get(mailboxSession, syncLogger); DeviceSyncStateMetadata device = userSyncStateMetadata.GetDevice(mailboxSession, deviceIdentity, syncLogger); if (device != null) { return(SyncStateStorage.GetSyncStateStorage(mailboxSession, device, syncLogger)); } return(null); }
private SyncStateStorage(Folder folder, DeviceSyncStateMetadata deviceMetadata, ISyncLogger syncLogger = null) { this.syncLogger = (syncLogger ?? TracingLogger.Singleton); StorageGlobals.TraceConstructIDisposable(this); this.disposeTracker = this.GetDisposeTracker(); this.folder = folder; this.DeviceMetadata = deviceMetadata; if (this.folder.DisplayName != this.DeviceMetadata.Id.CompositeKey) { throw new ArgumentException(string.Format("[SyncStateStorage.ctor] The folder name '{0}' and the metadata name '{1}' should match.", this.folder.DisplayName, deviceMetadata.Id)); } this.creationTime = (ExDateTime)this.folder.TryGetProperty(StoreObjectSchema.CreationTime); long num = 0L; long.TryParse(this.folder.GetValueOrDefault <string>(SyncStateStorage.airsyncLockProp, "0"), NumberStyles.Any, CultureInfo.InvariantCulture, out num); this.airsyncLock = ((num == 0L) ? ExDateTime.MinValue : ExDateTime.FromBinary(num)); this.syncRootFolderId = folder.ParentId; }
public DeviceSyncStateMetadata GetOrAdd(DeviceSyncStateMetadata toAdd) { return(this.devices.GetOrAdd(toAdd.Id, toAdd)); }
public FolderSyncStateMetadata(DeviceSyncStateMetadata parentDevice, string name, StoreObjectId folderSyncStateId, StoreObjectId itemSyncStateId, StoreObjectId ipmFolderId) : this(parentDevice, name, folderSyncStateId, itemSyncStateId, 0L, 0, 0, false, 0, 0L, 0, 0, ipmFolderId) { }