public void LoadFolderStateTest()
        {
            var stateManager = new StateManager(ServiceResolver.GetService <IStateMachine>());

            stateManager.UserDevice = new UserDevice()
            {
                DeviceId = "100"
            };


            var syncKey     = stateManager.GetNewSyncKey("0");
            var folderState = new FolderHierarchyState
            {
                Folders = new List <FolderState>
                {
                    new FolderState()
                    {
                        Name       = "Contacts",
                        FolderType = 1,
                        ParentId   = "0",
                        ServerId   = "1234"
                    },
                    new FolderState()
                    {
                        Name       = "Inbox",
                        FolderType = 1,
                        ParentId   = "1234",
                        ServerId   = "12345"
                    }
                }
            };

            stateManager.SaveFolderState(syncKey, folderState);
            var savedFolderState = stateManager.LoadFolderState(syncKey);

            Assert.IsNotNull(savedFolderState);
            Assert.IsTrue(savedFolderState.Folders.Count == folderState.Folders.Count);
        }
Beispiel #2
0
        protected override FolderSyncResponse HandleRequest()
        {
            var newSyncKey = (SyncKey)StateManager.GetNewSyncKey(SyncKey);

            try
            {
                var allServerFolders = FolderService.GetAllFolders(StateManager.UserDevice.Credential);
                var newFolderState   = new FolderHierarchyState
                {
                    Folders = allServerFolders.Select(syncFolder => new FolderState
                    {
                        ServerId   = syncFolder.Id,
                        ParentId   = syncFolder.ParentId,
                        FolderType = (int)syncFolder.Type,
                        Name       = syncFolder.DisplayName
                    }).ToList()
                };
                //MS-ASCMD: 2.2.2.4
                //All folders MUST be returned to the client when initial folder synchronization is done with a synchronization key of 0 (zero)
                if (SyncKey == "0")
                {
                    //May be Sync Key of Zero need to send headers(Supporting Versions and Supporting Commands) to Client

                    StateManager.SaveFolderState(newSyncKey, newFolderState);

                    var response = new FolderSyncResponse
                    {
                        SyncKey      = newSyncKey,
                        AddedFolders = allServerFolders,
                        Status       = eFolderSyncStatus.Success
                    };
                    return(response);
                }
                else
                {
                    var folderState = StateManager.LoadFolderState(SyncKey);
                    if (folderState == null)
                    {
                        throw new StateNotFoundException("State Not Found. SyncKey:" + SyncKey);
                    }

                    var deviceFolders = folderState.Folders.Select(fs => new SyncableFolder
                    {
                        Id          = fs.ServerId,
                        ParentId    = fs.ParentId,
                        DisplayName = fs.Name,
                        Type        = (eFolderType)fs.FolderType
                    }).ToList();

                    var newFolders     = allServerFolders.Except(deviceFolders, new FolderComparerByServerId()).ToList();
                    var deletedFolders = deviceFolders.Except(allServerFolders, new FolderComparerByServerId()).ToList();

                    var intersectFolders    = allServerFolders.Intersect(deviceFolders, new FolderComparerByServerId());
                    var folderValueComparer = new FolderComparerByValue();
                    var changedFolders      = (from serverFolder in intersectFolders let deviceFolder = deviceFolders.FirstOrDefault(x => x.Id == serverFolder.Id) where !folderValueComparer.Equals(serverFolder, deviceFolder) select serverFolder).ToList();

                    StateManager.SaveFolderState(newSyncKey, newFolderState);
                    var response = new FolderSyncResponse
                    {
                        Status                  = eFolderSyncStatus.Success,
                        SyncKey                 = newSyncKey,
                        AddedFolders            = newFolders,
                        UpdatedFolders          = changedFolders,
                        DeletedFoldersServerIds = deletedFolders.Select(x => x.Id).ToList()
                    };

                    return(response);
                }
            }
            catch (StateNotFoundException ex)
            {
                return(ErrorResponse(eFolderSyncStatus.SyncKeyError));
            }
            catch (Exception ex)
            {
                return(ErrorResponse(eFolderSyncStatus.ServerError));
            }
        }
Beispiel #3
0
 public void SaveFolderState(SyncKey syncKey, FolderHierarchyState folderState)
 {
     StateMachine.SaveFolderState(UserDevice.DeviceId, syncKey, folderState);
 }