public static bool DoesTypeExistWithThisId(ushort typeId)
        {
            List <ICustomSerializableBuilder> builderTableFromTypeId = SyncStateTypeFactory.GetBuilderTableFromTypeId(typeId);
            ushort num = SyncStateTypeFactory.TypeIndexFromTypeId(typeId);

            return((int)num < builderTableFromTypeId.Count && builderTableFromTypeId[(int)num].TypeId == typeId);
        }
        private void InternalRegisterBuilder(ICustomSerializableBuilder typeBuilder, ushort typeMask)
        {
            List <ICustomSerializableBuilder> builderTableFromTypeId = SyncStateTypeFactory.GetBuilderTableFromTypeId(typeMask);

            builderTableFromTypeId.Add(typeBuilder);
            typeBuilder.TypeId = (ushort)(builderTableFromTypeId.Count | (int)typeMask);
        }
 public ICustomSerializable BuildObject(ushort typeId)
 {
     if (!SyncStateTypeFactory.DoesTypeExistWithThisId(typeId))
     {
         throw new CustomSerializationException(ServerStrings.ExSyncStateCorrupted("typeId " + typeId));
     }
     return(SyncStateTypeFactory.GetBuilderTableFromTypeId(typeId)[(int)SyncStateTypeFactory.TypeIndexFromTypeId(typeId)].BuildObject());
 }
 private static List <ICustomSerializableBuilder> GetBuilderTableFromTypeId(ushort typeId)
 {
     if (!SyncStateTypeFactory.IsExternalType(typeId))
     {
         return(SyncStateTypeFactory.GetInstance().internalBuilderTable);
     }
     return(SyncStateTypeFactory.GetInstance().externalBuilderTable);
 }
Example #5
0
        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);
        }
Example #6
0
 private void AssertTypeRegisteredWithSyncStateFactory(RefT data)
 {
     if (data == null)
     {
         return;
     }
     if (!SyncStateTypeFactory.IsTypeRegistered(data))
     {
         "Type not registered.  Please call: SyncStateTypeFactory.GetInstance().RegisterBuilder(new " + data.GetType().ToString() + "()) before attempting to serialize this type through DeriveData.";
     }
 }
Example #7
0
        public static bool DeleteSyncStateStorage(MailboxSession mailboxSession, StoreObjectId deviceFolderId, DeviceIdentity deviceIdentity, ISyncLogger syncLogger = null)
        {
            if (syncLogger == null)
            {
                syncLogger = TracingLogger.Singleton;
            }
            ArgumentValidator.ThrowIfNull("mailboxSession", mailboxSession);
            ArgumentValidator.ThrowIfNull("folderId", deviceFolderId);
            bool result = false;

            SyncStateTypeFactory.GetInstance().RegisterInternalBuilders();
            UserSyncStateMetadata    userSyncStateMetadata    = UserSyncStateMetadataCache.Singleton.Get(mailboxSession, syncLogger);
            AggregateOperationResult aggregateOperationResult = mailboxSession.Delete(DeleteItemFlags.SoftDelete, new StoreId[]
            {
                deviceFolderId
            });

            syncLogger.Information <string>(ExTraceGlobals.SyncTracer, 0L, "SyncStateStorage::DeleteSyncStateStorage. Result = {0}", aggregateOperationResult.OperationResult.ToString());
            userSyncStateMetadata.TryRemove(deviceIdentity, syncLogger);
            List <DeviceSyncStateMetadata> allDevices = userSyncStateMetadata.GetAllDevices(mailboxSession, false, syncLogger);

            if (allDevices != null)
            {
                foreach (DeviceSyncStateMetadata deviceSyncStateMetadata in allDevices)
                {
                    syncLogger.Information <DeviceIdentity, DeviceIdentity>(ExTraceGlobals.SyncTracer, 0L, "SyncStateStorage::DeleteSyncStateStorage. Found device folder '{0}', Looking for folder '{1}'", deviceSyncStateMetadata.Id, deviceIdentity);
                    if (deviceSyncStateMetadata.Id.Equals(deviceIdentity))
                    {
                        try
                        {
                            aggregateOperationResult = mailboxSession.Delete(DeleteItemFlags.SoftDelete, new StoreId[]
                            {
                                deviceSyncStateMetadata.DeviceFolderId
                            });
                            syncLogger.Information <DeviceIdentity, DeviceIdentity, string>(ExTraceGlobals.SyncTracer, 0L, "SyncStateStorage::DeleteSyncStateStorage. try Deleting SyncState folder again.folderName:{0}, originalFolder:{1}, result:{2}", deviceSyncStateMetadata.Id, deviceIdentity, aggregateOperationResult.OperationResult.ToString());
                            continue;
                        }
                        catch
                        {
                            syncLogger.Information(ExTraceGlobals.SyncTracer, 0L, "SyncStateStorage::DeleteSyncStateStorage. Error deleting the sync state folder.");
                            continue;
                        }
                    }
                    if (deviceSyncStateMetadata.Id.IsProtocol("AirSync"))
                    {
                        result = true;
                        break;
                    }
                }
            }
            return(result);
        }
Example #8
0
        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);
        }
Example #9
0
        public override void DeserializeData(BinaryReader reader, ComponentDataPool componentDataPool)
        {
            if (reader.ReadBoolean())
            {
                base.Data = default(RefT);
                return;
            }
            ushort num = reader.ReadUInt16();

            if (!SyncStateTypeFactory.DoesTypeExistWithThisId(num))
            {
                throw new CustomSerializationException(ServerStrings.ExSyncStateCorrupted("Type " + num.ToString() + " not registered."));
            }
            base.Data = (RefT)((object)SyncStateTypeFactory.GetInstance().BuildObject(num));
            RefT data = base.Data;

            data.DeserializeData(reader, componentDataPool);
        }
Example #10
0
        public static bool DeleteSyncStateStorage(MailboxSession mailboxSession, DeviceIdentity deviceIdentity, ISyncLogger syncLogger = null)
        {
            if (syncLogger == null)
            {
                syncLogger = TracingLogger.Singleton;
            }
            ArgumentValidator.ThrowIfNull("mailboxSession", mailboxSession);
            syncLogger.Information <DeviceIdentity>(ExTraceGlobals.SyncTracer, 0L, "SyncStateStorage::DeleteSyncStateStorage. Need to delete folder {0}", deviceIdentity);
            SyncStateTypeFactory.GetInstance().RegisterInternalBuilders();
            UserSyncStateMetadata          userSyncStateMetadata = UserSyncStateMetadataCache.Singleton.Get(mailboxSession, syncLogger);
            List <DeviceSyncStateMetadata> allDevices            = userSyncStateMetadata.GetAllDevices(mailboxSession, false, syncLogger);
            bool result = false;

            if (allDevices != null)
            {
                foreach (DeviceSyncStateMetadata deviceSyncStateMetadata in allDevices)
                {
                    syncLogger.Information <DeviceIdentity>(ExTraceGlobals.SyncTracer, 0L, "SyncStateStorage::DeleteSyncStateStorage. Found syncstate folder {0}", deviceSyncStateMetadata.Id);
                    if (string.Compare(deviceSyncStateMetadata.Id.Protocol, deviceIdentity.Protocol, StringComparison.Ordinal) == 0)
                    {
                        if (deviceSyncStateMetadata.Id.Equals(deviceIdentity))
                        {
                            mailboxSession.Delete(DeleteItemFlags.SoftDelete, new StoreId[]
                            {
                                deviceSyncStateMetadata.DeviceFolderId
                            });
                            userSyncStateMetadata.TryRemove(deviceSyncStateMetadata.Id, syncLogger);
                        }
                        else
                        {
                            syncLogger.Information(ExTraceGlobals.SyncTracer, 0L, "SyncStateStorage::DeleteSyncStateStorage. found more devices with same protocol");
                            result = true;
                        }
                    }
                }
            }
            return(result);
        }
 public void RegisterInternalBuilders()
 {
     if (this.initialized)
     {
         return;
     }
     lock (this.thisLock)
     {
         if (!this.initialized)
         {
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new NullableData <Int32Data, int>(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new GenericDictionaryData <StringData, string, BooleanData, bool>(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new GenericDictionaryData <DerivedData <ISyncItemId>, ISyncItemId, FolderSync.ClientStateInformation>(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new GenericDictionaryData <DerivedData <ISyncItemId>, ISyncItemId, ServerManifestEntry>(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new GenericDictionaryData <DerivedData <ISyncItemId>, ISyncItemId, ClientManifestEntry>(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new MailboxSyncItemId(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new MailboxSyncWatermark(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new GenericDictionaryData <StoreObjectIdData, StoreObjectId, FolderStateEntry>(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new GenericDictionaryData <StoreObjectIdData, StoreObjectId, FolderManifestEntry>(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new StringData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new DateTimeData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new ByteData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new BooleanData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new Int32Data(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new UInt32Data(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new Int64Data(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new StoreObjectIdData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new ByteArrayData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new ConstStringData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new NullableDateTimeData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new ConversationIdData(), 0);
             SyncStateTypeFactory.GetInstance().InternalRegisterBuilder(new ADObjectIdData(), 0);
             this.initialized = true;
         }
     }
 }
 public static bool IsTypeRegistered(ICustomSerializableBuilder typeBuilder)
 {
     return(SyncStateTypeFactory.DoesTypeExistWithThisId(typeBuilder.TypeId));
 }