Esempio n. 1
0
        private void OneItemIsOlder(ISynchronizedItem olderItem, ISynchronizedItem newerItem)
        {
            olderItem.UpdateStatus(ItemStatusEnum.Older);
            olderItem.SyncCommand.SetCommandAction(() => { return(olderItem.Item.CopyTo(newerItem.FullPath)); });

            newerItem.UpdateStatus(ItemStatusEnum.Newer);
            newerItem.SyncCommand.SetCommandAction(() => { return(newerItem.Item.CopyTo(olderItem.FullPath)); });
        }
Esempio n. 2
0
        private void OneItemIsMissing(ISynchronizedItem missingItem, ISynchronizedItem thereIsItem)
        {
            missingItem.UpdateStatus(ItemStatusEnum.Missing);
            missingItem.SyncCommand.SetCommandAction(() => thereIsItem.Item.Delete());

            thereIsItem.UpdateStatus(ItemStatusEnum.ThereIs);
            thereIsItem.SyncCommand.SetCommandAction(() => thereIsItem.Item.CopyTo(missingItem.FullPath));
        }
        public static void SyncSuccess(ISynchronizedItem <TState> item, TState validState)
        {
            TState  previous = item.State;
            Boolean result   = item.Sync(validState);

            Assert.IsTrue(result);
            Assert.IsFalse(previous.Equals(validState));
            Assert.IsTrue(item.State.Equals(validState));
        }
Esempio n. 4
0
        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="synchronizedItem">Элемент синхронизации, на основе которого создаётся модель представления.</param>
        public ItemViewModel(ISynchronizedItem synchronizedItem)
        {
            _synchronizedItem = synchronizedItem;
            _synchronizedItem.SyncErrorEvent     += (string message) => { SyncErrorEvent?.Invoke(message); };
            _synchronizedItem.StatusChangedEvent += () => { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Status))); };
            _synchronizedItem.SyncCommand.CommandActionChangedEvent += RefreshAcceptCommand;

            RefreshAcceptCommand();
        }
        public static void SyncFail(ISynchronizedItem <TState> item, TState failState)
        {
            TState  previous = item.State;
            Boolean result   = item.Sync(failState);

            Assert.IsFalse(result);
            Assert.IsFalse(previous.Equals(failState));
            Assert.IsTrue(item.State.Equals(previous));
        }
Esempio n. 6
0
 private void SetEventsSynchronizedItem(ISynchronizedItem synchronizedItem)
 {
     if (synchronizedItem.Item != null)
     {
         synchronizedItem.Item.DeletedEvent += ItemDeleted;
     }
     synchronizedItem.FinishedSyncEvent += FinishedSync;
     synchronizedItem.CopiedFromToEvent += CopiedFromItem;
     synchronizedItem.StartedSyncEvent  += () => InProcessChange(true);
 }
Esempio n. 7
0
 private void CopiedFromItem(ISynchronizedItem sourceSynchronizedItem, IItem newItem)
 {
     if (sourceSynchronizedItem == LeftItem)
     {
         RightItem.UpdateItem(newItem);
     }
     else
     {
         LeftItem.UpdateItem(newItem);
     }
 }
        /// <summary>
        /// Задание статуса и комманд синхронизации для синхронизируемого элемента, исходя из дочерних неидентичных строк.
        /// </summary>
        /// <param name="synchronizedItem">Синхронизируемый элемент, для которого задаётся статус и команды.</param>
        /// <param name="status">Задаваемй статус.</param>
        /// <param name="actionCommands">Команды синхронизации.</param>
        private void SetItemStatusAndCommands(ISynchronizedItem synchronizedItem, ItemStatusEnum status, IEnumerable <Func <Task> > actionCommands)
        {
            synchronizedItem.UpdateStatus(status, _statusCommentsFromChildren.ContainsKey(status) ?
                                          _statusCommentsFromChildren[status] : null);

            // Если нет, команды, но должна быть, исходя из дочерних элементов,
            // то можно команду представить как последовательное выпонения команд дочерних элементов.
            if (status != ItemStatusEnum.Equally)
            {
                synchronizedItem.SyncCommand.SetCommandAction(async() =>
                {
                    foreach (var actionCommand in actionCommands)
                    {
                        await actionCommand.Invoke();
                    }
                });
            }
        }
Esempio n. 9
0
        private void FinishedSync(ISynchronizedItem synchronizedItem)
        {
            var updatedItem = LeftItem == synchronizedItem ? RightItem : LeftItem;

            // Если Item == null, значит элемент удалили, и тут больше делать ничего не надо.
            if (updatedItem.Item != null)
            {
                StartLoadDirectoriesEvent?.Invoke();
                updatedItem.Item.Load().Wait();

                // Была выполнена синхронизация, и нам не известно, обновлялись, удалялись или добавлялись дочерние элементы,
                // поэтому заново загрузим дочерние элементы удаляем все дочерние элементы и заново загружаем.
                ClearChildItems();
                LoadChildItems();

                DirectoriesIsLoadedEvent?.Invoke(this);
            }

            InProcessChange(false);
        }
Esempio n. 10
0
 /// <summary>
 /// Простановка в модели синхронизируемых элементов статусов и команд синхронизации.
 /// </summary>
 /// <param name="item1">Модель одного элемента.</param>
 /// <param name="item2">Модель второго элемента.</param>
 public void UpdateStatusesAndCommands(ISynchronizedItem item1, ISynchronizedItem item2)
 {
     if (item1.Item == null)
     {
         OneItemIsMissing(item1, item2);
     }
     else if (item2.Item == null)
     {
         OneItemIsMissing(item2, item1);
     }
     else
     {
         string loadError = null;
         if ((loadError = (item1.Item as IDirectory)?.LastLoadError) != null ||
             (loadError = (item2.Item as IDirectory)?.LastLoadError) != null)
         {
             item1.UpdateStatus(ItemStatusEnum.LoadError, loadError);
             item2.UpdateStatus(ItemStatusEnum.LoadError, loadError);
             item1.SyncCommand.SetCommandAction(null);
             item2.SyncCommand.SetCommandAction(null);
         }
         else if (item1.Item.LastUpdate > item2.Item.LastUpdate)
         {
             OneItemIsOlder(item2, item1);
         }
         else if (item1.Item.LastUpdate < item2.Item.LastUpdate)
         {
             OneItemIsOlder(item1, item2);
         }
         else // Значит одинаковые
         {
             item1.UpdateStatus(ItemStatusEnum.Equally);
             item1.SyncCommand.SetCommandAction(null);
             item2.UpdateStatus(ItemStatusEnum.Equally);
             item2.SyncCommand.SetCommandAction(null);
         }
     }
 }
Esempio n. 11
0
        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="settingsRow">Строка настроек, соответствующая синхронизируемым элементам.</param>
        /// <param name="synchronizedItemFactory">Фабрика создания синхронизируемых элементов.</param>
        /// <param name="synchronizedItemMatcher">Объект, выполняющий сравнение синхронизируемых элементов между собой.</param>
        /// <param name="leftItem">Элемент синхронизации слева.</param>
        /// <param name="rightItem">Элемент синхронизации справва.</param>
        /// <param name="parentDirectories">Родительский элемент синхронизируемых директорий.</param>
        private SynchronizedItems(ISettingsRow settingsRow, ISynchronizedItemFactory synchronizedItemFactory,
                                  ISynchronizedItemsStatusAndCommandsUpdater statusAndCommandsUpdater, ISynchronizedItem leftItem, ISynchronizedItem rightItem)
        {
            (_settingsRow, _synchronizedItemFactory, _statusAndCommandsUpdater) =
                (settingsRow, synchronizedItemFactory, statusAndCommandsUpdater);
            (LeftItem, RightItem) = (leftItem, rightItem);

            SetEventsSynchronizedItem(LeftItem);
            SetEventsSynchronizedItem(RightItem);
        }
Esempio n. 12
0
 private ISynchronizedItems CreateISynchronizedItems(ISynchronizedItem leftSynchronizedItem, ISynchronizedItem rightSynchronizedItem)
 {
     return(new SynchronizedItems(_settingsRow, _synchronizedItemFactory, _statusAndCommandsUpdater,
                                  leftSynchronizedItem, rightSynchronizedItem));
 }
 public static void DefaultState(ISynchronizedItem <TState> item)
 {
     Assert.IsTrue(item.State.Equals(default(TState)));
 }
 private void ItemStatusUnknown(ISynchronizedItem item)
 {
     item.UpdateStatus(ItemStatusEnum.Unknown);
     item.SyncCommand.SetCommandAction(null);
 }
 /// <summary>
 /// Простановка в модели синхронизируемых элементов статусов и команд синхронизации.
 /// </summary>
 /// <param name="item1">Модель одного элемента.</param>
 /// <param name="item2">Модель второго элемента.</param>
 public void UpdateStatusesAndCommands(ISynchronizedItem item1, ISynchronizedItem item2)
 {
     _synchronizedItemMatcher.UpdateStatusesAndCommands(item1, item2);
 }
 public void UpdateStatusesAndCommands(ISynchronizedItem item1, ISynchronizedItem item2)
 {
     return;
 }