private static void UpdateSyncMetadata(IWorkbook workbook, PlatformService platformService, LaunchArgumentDescriptor descriptor) { // update sync metadata if appropriate var loadFileAsync = platformService.LoadFileAsync <SynchronizationMetadata>(SynchronizationMetadata.Filename); loadFileAsync.Wait(500); if (loadFileAsync.IsCompleted && loadFileAsync.Result != null) { SynchronizationMetadata syncMetadata = loadFileAsync.Result; // update the descriptor of the edited task if (!syncMetadata.EditedTasks.ContainsKey(descriptor.Task.Id)) { syncMetadata.EditedTasks.Add(descriptor.Task.Id, TaskProperties.Completed); } else { syncMetadata.EditedTasks[descriptor.Task.Id] |= TaskProperties.Completed; } // check if the completion of this tasks created a new task that should be flagged for future sync as "new task" // (that happens if the task is recurring) var newTask = workbook.Tasks.FirstOrDefault(t => t.Folder == descriptor.Task.Folder && t.Title == descriptor.Task.Title && t.SyncId == null); if (newTask != null && !syncMetadata.AddedTasks.Contains(newTask.Id)) { syncMetadata.AddedTasks.Add(newTask.Id); } platformService.SaveFileAsync(syncMetadata, SynchronizationMetadata.Filename).Wait(500); } }
private static async Task SaveMetadataAsync(SynchronizationMetadata metadata) { await WinIsolatedStorage.SaveAsync(metadata, SynchronizationMetadata.Filename); }
private async Task UpdateWorkbookAsync(SynchronizationMetadata metadata) { // load a new workbook from the persisted db to have the latest version var lastPersistence = new WinPersistenceLayer(); IWorkbook lastWorkbook = lastPersistence.Open(); foreach (string folderName in metadata.AfterSyncEditedFolders) { var newFolder = lastWorkbook.Folders.FirstOrDefault(f => f.Name.Equals(folderName, StringComparison.OrdinalIgnoreCase)); var oldFolder = this.workbook.Folders.FirstOrDefault(f => newFolder != null ? f.Id == newFolder.Id : f.Name == folderName); if (newFolder == null) { // folder was deleted this.workbook.RemoveFolder(folderName); } else if (oldFolder != null) { // folder was updated ModelHelper.CloneFolder(oldFolder, newFolder); } else { // folder was created oldFolder = this.workbook.AddFolder(folderName, newFolder.SyncId, newFolder.Id); ModelHelper.CloneFolder(oldFolder, newFolder); } } metadata.AfterSyncEditedFolders.Clear(); foreach (string contextName in metadata.AfterSyncEditedContexts) { var newContext = lastWorkbook.Contexts.FirstOrDefault(c => c.Name.Equals(contextName, StringComparison.OrdinalIgnoreCase)); var oldContext = this.workbook.Contexts.FirstOrDefault(c => newContext != null ? c.Id == newContext.Id : c.Name == contextName); if (newContext == null) { // context was deleted this.workbook.RemoveContext(contextName); } else if (oldContext != null) { // context was updated oldContext.Name = newContext.Name; oldContext.Order = newContext.Order; } else { // context was created this.workbook.AddContext(contextName, newContext.SyncId, newContext.Id); } } metadata.AfterSyncEditedContexts.Clear(); foreach (string smartviewName in metadata.AfterSyncEditedSmartViews) { var newSmartView = lastWorkbook.SmartViews.FirstOrDefault(c => c.Name.Equals(smartviewName, StringComparison.OrdinalIgnoreCase)); var oldSmartView = this.workbook.SmartViews.FirstOrDefault(c => newSmartView != null ? c.Id == newSmartView.Id : c.Name == smartviewName); if (newSmartView == null) { // smart view was deleted this.workbook.RemoveSmartView(smartviewName); } else if (oldSmartView != null) { // smart view was updated oldSmartView.Name = newSmartView.Name; oldSmartView.Order = newSmartView.Order; oldSmartView.Rules = newSmartView.Rules; } else { // smart view was created var smartview = this.workbook.AddSmartView(smartviewName, newSmartView.Rules, newSmartView.Id); smartview.SyncId = newSmartView.SyncId; } } metadata.AfterSyncEditedSmartViews.Clear(); foreach (int id in metadata.AfterSyncEditedTasks) { var oldTask = this.workbook.Tasks.FirstOrDefault(t => t.Id == id); var newTask = lastWorkbook.Tasks.FirstOrDefault(t => t.Id == id); if (newTask == null) { // task was deleted if (oldTask != null) { oldTask.Delete(); } } else if (oldTask != null) { // task was updated ModelHelper.CloneTask(oldTask, newTask, this.workbook); } else { // task was created oldTask = this.workbook.CreateTask(newTask.Id); ModelHelper.CloneTask(oldTask, newTask, this.workbook); } } metadata.AfterSyncEditedTasks.Clear(); lastPersistence.CloseDatabase(); await this.WriteSyncMetadataAsync(metadata); }