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);
        }
Пример #6
0
        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);
                }
            }
        }
Пример #7
0
        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);
 }