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); }
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)); } }
public void SaveFolderState(SyncKey syncKey, FolderHierarchyState folderState) { StateMachine.SaveFolderState(UserDevice.DeviceId, syncKey, folderState); }