From f1937cd3d6ded60a0fe71a0b9cf2422affe38dbf Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 20 Sep 2017 14:56:54 +0300 Subject: [PATCH] [KOE-142] Now suppressing moving of any shared folder or into a shared folder. This prevents deletion of folders moved into shared folders. Also added the SuppressHierarchyChanges property to enable/disable it. --- .../SharedFolders/FeatureSharedFolders.cs | 52 +++++++++++++------ .../ZPush/FolderRegistration.cs | 19 +++++++ 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs index 4970a03..3d2bd9a 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs @@ -314,12 +314,32 @@ namespace Acacia.Features.SharedFolders } } + [AcaciaOption("If enabled, modifications to the local hierarchy of shared folders is suppressed. " + + "This should only be disabled for debug purposes.")] + public bool SuppressHierarchyChanges + { + get { return GetOption(OPTION_SUPPRESS_HIERARCHY_CHANGES); } + set { SetOption(OPTION_SUPPRESS_HIERARCHY_CHANGES, value); } + } + private static readonly BoolOption OPTION_SUPPRESS_HIERARCHY_CHANGES = + new BoolOption("SuppressHierarchyChanges", true); + private void SetupHierarchyChangeSuppression() { - Watcher.WatchFolder(new SharedFolderRegistration(this), - OnSharedFolderDiscovered, - OnSharedFolderChanged, - OnSharedFolderRemoved); + if (SuppressHierarchyChanges) + { + Watcher.WatchFolder(new SharedFolderRegistration(this), + OnSharedFolderDiscovered, + OnSharedFolderChanged, + OnSharedFolderRemoved); + + // Register for any folder move + Watcher.WatchFolder(new FolderRegistrationAny(this), + (folder) => + { + folder.BeforeFolderMove += Folder_BeforeFolderMove; + }); + } } private void OnSharedFolderDiscovered(IFolder folder) @@ -340,8 +360,6 @@ namespace Acacia.Features.SharedFolders } else { - folder.BeforeFolderMove += Folder_BeforeFolderMove; - // Check if it was renamed before the events were fully set up CheckSharedFolderRename(folder); } @@ -349,15 +367,19 @@ namespace Acacia.Features.SharedFolders private void Folder_BeforeFolderMove(IFolder src, IFolder moveTo, ref bool cancel) { - Logger.Instance.Fatal(this, "SHARED FOLDER MOVE: {0}", moveTo.Name); - - MessageBox.Show(ThisAddIn.Instance.Window, - Properties.Resources.SharedFolders_LocalFolder_Body, - Properties.Resources.SharedFolders_LocalFolder_Title, - MessageBoxButtons.OK, - MessageBoxIcon.Warning - ); - cancel = true; + if (src.SyncId?.IsShared == true || moveTo.SyncId?.IsShared == true) + { + // Suppress any move of or into a shared folder + Logger.Instance.Warning(this, "Shared folder move: {0} - {1}", src.Name, moveTo.Name); + + MessageBox.Show(ThisAddIn.Instance.Window, + Properties.Resources.SharedFolders_LocalFolder_Body, + Properties.Resources.SharedFolders_LocalFolder_Title, + MessageBoxButtons.OK, + MessageBoxIcon.Warning + ); + cancel = true; + } } private void OnSharedFolderChanged(IFolder folder) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/FolderRegistration.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/FolderRegistration.cs index 3d5f2b2..fe8c32e 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/FolderRegistration.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/FolderRegistration.cs @@ -36,6 +36,25 @@ namespace Acacia.ZPush abstract public bool IsApplicable(IFolder folder); } + public class FolderRegistrationAny : FolderRegistration + { + public FolderRegistrationAny(Feature feature) + : + base(feature) + { + } + + public override bool IsApplicable(IFolder folder) + { + return folder != null; + } + + public override string ToString() + { + return Feature.Name; + } + } + public class FolderRegistrationTyped : FolderRegistration { private readonly ItemType _itemType;