private void AfterUpdate(BaseItem sourceItem, BaseItem targetItem) { if (targetItem.Association == null) { targetItem.Association = sourceItem.Association; } targetItem.ChangeNumber = sourceItem.ChangeNumber; var link = LinkStatusTableModel.GetDefault().GetItem(sourceItem); if (link != null) { link.ChangeNumber = sourceItem.ChangeNumber; LinkStatusTableModel.GetDefault().UpdateItem(link, link.Id); targetItem.Id = link.TargetItemId; ItemTableModel.GetDefault().UpdateItem(sourceItem, sourceItem.Id); ItemTableModel.GetDefault().UpdateItem(targetItem, targetItem.Id); } var historyEntry = new SyncHistoryEntry(); historyEntry.CreateDate = DateTime.Now; historyEntry.SourceItemId = sourceItem.Id; historyEntry.TargetItemId = targetItem.Id; historyEntry.Result = sourceItem.AdapterType == _sourceEntityAdapter.GetType() ? SyncResult.Sent : SyncResult.Received; SyncHistoryTableModel.GetDefault().InsertItem(historyEntry); }
public void RemoveInstantUploadAssociations() { foreach (var association in GetInstantUploadAssociations()) { FolderAssociationTableModel.GetDefault().DeleteItem(association.Id); LinkStatusTableModel.GetDefault().DeleteLinksFromAssociation(association); ItemTableModel.GetDefault().DeleteItem(association.RemoteFolderId); ItemTableModel.GetDefault().DeleteItem(association.LocalFolderId); ItemTableModel.GetDefault().DeleteItemsFromAssociation(association); } }
public async Task <FolderAssociation> AddFolderToSyncAsync(StorageFolder folder, DavItem remoteFolderItem, bool allowInstantUpload = false) { StorageApplicationPermissions.FutureAccessList.Add(folder); var properties = await folder.Properties.RetrievePropertiesAsync(new List <string> { "System.DateModified" }); FolderAssociation fa = new FolderAssociation { IsActive = true, LocalFolderId = 0, RemoteFolderId = 0, SyncDirection = SyncDirection.FullSync, LastSync = DateTime.MinValue }; if (allowInstantUpload) { fa.SyncDirection = SyncDirection.UploadOnly; fa.SupportsInstantUpload = true; } FolderAssociationTableModel.GetDefault().InsertItem(fa); fa = FolderAssociationTableModel.GetDefault().GetLastInsertItem(); BaseItem li = new LocalItem { IsCollection = true, LastModified = ((DateTimeOffset)properties["System.DateModified"]).LocalDateTime, EntityId = folder.Path, Association = fa, }; var testFolder = await StorageFolder.GetFolderFromPathAsync(folder.Path); if (testFolder.Path != folder.Path) { li.EntityId = testFolder.Path; } ItemTableModel.GetDefault().InsertItem(li); li = ItemTableModel.GetDefault().GetLastInsertItem(); remoteFolderItem.Association = fa; ItemTableModel.GetDefault().InsertItem(remoteFolderItem); var ri = ItemTableModel.GetDefault().GetLastInsertItem(); fa.RemoteFolderId = ri.Id; fa.LocalFolderId = li.Id; FolderAssociationTableModel.GetDefault().UpdateItem(fa, fa.Id); var link = new LinkStatus(li, ri); LinkStatusTableModel.GetDefault().InsertItem(link); return(fa); }
protected override async Task ProcessItems() { if (Configuration.Configuration.UploadViaWifiOnly) { var internetConnectionProfile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile(); if (internetConnectionProfile != null && !internetConnectionProfile.IsWlanConnectionProfile) { return; } } List <dynamic> itemsToUpdate = new List <dynamic>(); if (_itemsToUpdate.Count != 0) { var links = LinkStatusTableModel.GetDefault().GetAllItems(); foreach (var baseItem in _itemsToUpdate) { var existingItem = ItemTableModel.GetDefault().GetItem(baseItem); if (existingItem == null) { _itemsToAdd.Add(baseItem); } else { var itemsToProcess = (from link in links .Where(x => x.SourceItemId == existingItem.Id || x.TargetItemId == existingItem.Id) .DefaultIfEmpty() select new { LinkStatus = link, BaseItem = existingItem }).ToList(); _itemsToAdd.AddRange((from item in itemsToProcess where item.LinkStatus == null select item.BaseItem).ToList()); itemsToUpdate.AddRange((from item in itemsToProcess where item.LinkStatus != null select item).ToList()); } } } await ProcessAdds(_itemsToAdd); await ProcessUpdates(itemsToUpdate); }
public async Task <FolderAssociation> AddFolderToSyncAsync(StorageFolder folder, DavItem remoteFolderItem, SyncDirection direction = SyncDirection.FullSync) { StorageApplicationPermissions.FutureAccessList.Add(folder); var properties = await folder.Properties.RetrievePropertiesAsync(new List <string> { "System.DateModified" }); FolderAssociation fa = new FolderAssociation { IsActive = true, LocalFolderId = 0, RemoteFolderId = 0, SyncDirection = direction, LastSync = DateTime.MinValue }; FolderAssociationTableModel.GetDefault().InsertItem(fa); fa = FolderAssociationTableModel.GetDefault().GetLastInsertItem(); var path = folder.Path.Replace("\\USERS\\", "\\Users\\"); BaseItem li = new LocalItem { IsCollection = true, LastModified = ((DateTimeOffset)properties["System.DateModified"]).LocalDateTime, EntityId = path, Association = fa, }; ItemTableModel.GetDefault().InsertItem(li); li = ItemTableModel.GetDefault().GetLastInsertItem(); remoteFolderItem.Association = fa; ItemTableModel.GetDefault().InsertItem(remoteFolderItem); var ri = ItemTableModel.GetDefault().GetLastInsertItem(); fa.RemoteFolderId = ri.Id; fa.LocalFolderId = li.Id; FolderAssociationTableModel.GetDefault().UpdateItem(fa, fa.Id); var link = new LinkStatus(li, ri); LinkStatusTableModel.GetDefault().InsertItem(link); return(fa); }
public override async Task DeleteItem(BaseItem item) { long fileId; var link = LinkStatusTableModel.GetDefault().GetItem(item); if (link == null) { await LogHelper.Write($"LinkStatus could not be found: EntityId: {item.EntityId} Id: {item.Id}"); return; } fileId = item.Id == link.SourceItemId ? link.TargetItemId : link.SourceItemId; var fileItem = ItemTableModel.GetDefault().GetItem(fileId); if (fileItem == null) { return; } if (item.IsCollection) { if (new DirectoryInfo(fileItem.EntityId).Exists) { var folder = await StorageFolder.GetFolderFromPathAsync(fileItem.EntityId); await folder.DeleteAsync(StorageDeleteOption.PermanentDelete); } } else { if (new FileInfo(fileItem.EntityId).Exists) { var file = await StorageFile.GetFileFromPathAsync(fileItem.EntityId); await file.DeleteAsync(StorageDeleteOption.PermanentDelete); } } }
public override async Task DeleteItem(BaseItem item) { var link = LinkStatusTableModel.GetDefault().GetItem(item); if (link == null) { await LogHelper.Write($"LinkStatus could not be found: EntityId: {item.EntityId} Id: {item.Id}"); return; } var davId = item.Id == link.SourceItemId ? link.TargetItemId : link.SourceItemId; var davItem = ItemTableModel.GetDefault().GetItem(davId); if (davItem == null) { return; } if (await _davClient.Exists(new Uri(davItem.EntityId, UriKind.RelativeOrAbsolute))) { await _davClient.Delete(new Uri(davItem.EntityId, UriKind.RelativeOrAbsolute)); } }
private void AfterInsert(BaseItem sourceItem, BaseItem targetItem) { if (targetItem.Association == null) { targetItem.Association = sourceItem.Association; } //check if item with same path already exists var existingItem = ItemTableModel.GetDefault().GetItem(targetItem); if (existingItem != null) { ItemTableModel.GetDefault().UpdateItem(targetItem, existingItem.Id); targetItem.Id = existingItem.Id; } else { ItemTableModel.GetDefault().InsertItem(targetItem); targetItem = ItemTableModel.GetDefault().GetLastInsertItem(); } if (LinkStatusTableModel.GetDefault().GetItem(sourceItem) == null) { var link = new LinkStatus(sourceItem, targetItem); LinkStatusTableModel.GetDefault().InsertItem(link); } var historyEntry = new SyncHistoryEntry(); historyEntry.CreateDate = DateTime.Now; historyEntry.SourceItemId = sourceItem.Id; historyEntry.TargetItemId = targetItem.Id; historyEntry.Result = sourceItem.AdapterType == _sourceEntityAdapter.GetType() ? SyncResult.Sent : SyncResult.Received; SyncHistoryTableModel.GetDefault().InsertItem(historyEntry); }
protected virtual async Task ProcessItems() { await LogHelper.Write($"Starting Sync.. BackgroundTask: {_isBackgroundTask}"); await SetExecutionStatus(ExecutionStatus.Active); var items = ItemTableModel.GetDefault().GetAllItems().ToList(); var links = LinkStatusTableModel.GetDefault().GetAllItems().ToList(); var itemsToProcess = (from baseItem in items .Where(i => i.Association.SyncDirection == SyncDirection.DownloadOnly && i.AdapterType == _targetEntityAdapter.GetType() || i.Association.SyncDirection == SyncDirection.UploadOnly && i.AdapterType == _sourceEntityAdapter.GetType() || i.Association.SyncDirection == SyncDirection.FullSync) from link in links .Where(x => x.SourceItemId == baseItem.Id || x.TargetItemId == baseItem.Id) .DefaultIfEmpty() select new { LinkStatus = link, BaseItem = baseItem }).ToList(); var itemsToAdd = (from item in itemsToProcess where item.LinkStatus == null select item.BaseItem).ToList(); var itemsToUpdate = (from item in itemsToProcess where item.BaseItem.ChangeNumber > item.LinkStatus?.ChangeNumber select item).ToList(); _totalCount += itemsToUpdate.Count + itemsToAdd.Count; await ProcessAdds(itemsToAdd); await ProcessUpdates(itemsToUpdate); }
protected override async Task ProcessItems() { List <dynamic> itemsToUpdate = new List <dynamic>(); if (_itemsToUpdate.Count != 0) { var links = LinkStatusTableModel.GetDefault().GetAllItems(); foreach (var baseItem in _itemsToUpdate) { var existingItem = ItemTableModel.GetDefault().GetItem(baseItem); if (existingItem == null) { _itemsToAdd.Add(baseItem); } else { var itemsToProcess = (from link in links .Where(x => x.SourceItemId == existingItem.Id || x.TargetItemId == existingItem.Id) .DefaultIfEmpty() select new { LinkStatus = link, BaseItem = existingItem }).ToList(); _itemsToAdd.AddRange((from item in itemsToProcess where item.LinkStatus == null select item.BaseItem).ToList()); itemsToUpdate.AddRange((from item in itemsToProcess where item.LinkStatus != null select item).ToList()); } } } await ProcessAdds(_itemsToAdd); await ProcessUpdates(itemsToUpdate); }
protected async Task ProcessDeletions(List <BaseItem> deletedItems) { await SetExecutionStatus(ExecutionStatus.Deletions); foreach (var item in deletedItems) { try { if (item.AdapterType == _targetEntityAdapter.GetType() && item.Association.SyncDirection == SyncDirection.FullSync) { await _sourceEntityAdapter.DeleteItem(item); } if (item.AdapterType == _sourceEntityAdapter.GetType() && item.Association.SyncDirection == SyncDirection.FullSync) { await _targetEntityAdapter.DeleteItem(item); } var link = LinkStatusTableModel.GetDefault().GetItem(item); if (link != null && item.Association.SyncDirection == SyncDirection.FullSync) { //the linked item should only be deleted from the database if its a full sync //otherwise changes might not be tracked anymore if the user makes changes to the sync direction var linkedItem = ItemTableModel.GetDefault().GetItem(link.TargetItemId); if (linkedItem != null) { if (linkedItem.IsCollection) { var childItems = ItemTableModel.GetDefault().GetFilesForFolder(linkedItem.EntityId); foreach (var childItem in childItems) { var childLink = LinkStatusTableModel.GetDefault().GetItem(childItem); if (childLink != null) { LinkStatusTableModel.GetDefault().DeleteItem(childLink.Id); } ItemTableModel.GetDefault().DeleteItem(childItem.Id); } } ItemTableModel.GetDefault().DeleteItem(linkedItem.Id); var historyEntry = new SyncHistoryEntry(); historyEntry.CreateDate = DateTime.Now; historyEntry.Result = SyncResult.Deleted; historyEntry.OldItemDisplayName = item.DisplayName; SyncHistoryTableModel.GetDefault().InsertItem(historyEntry); } } if (link != null) { LinkStatusTableModel.GetDefault().DeleteItem(link.Id); } if (item.IsCollection) { var childItems = ItemTableModel.GetDefault().GetFilesForFolder(item.EntityId); foreach (var childItem in childItems) { ItemTableModel.GetDefault().DeleteItem(childItem.Id); _deletedCount++; } } ItemTableModel.GetDefault().DeleteItem(item.Id); _deletedCount++; } catch (Exception e) { ToastHelper.SendToast(string.Format("Message: {0}, EntitityId: {1}", e.Message, item.EntityId)); await LogHelper.Write(string.Format("Message: {0}, EntitityId: {1} StackTrace:\r\n{2}", e.Message, item.EntityId, e.StackTrace)); } } }
public void RemoveFromSyncedFolders(FolderAssociation association) { ItemTableModel.GetDefault().DeleteItemsFromAssociation(association); LinkStatusTableModel.GetDefault().DeleteLinksFromAssociation(association); FolderAssociationTableModel.GetDefault().DeleteItem(association.Id); }