From 6314010a00663446849cac0c17fb3620d5d80197 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Fri, 13 Apr 2018 15:09:53 +0300 Subject: [PATCH] [KOE-168] Added upgrading of existing shared folders --- .../Features/SendAs/FeatureSendAs.cs | 94 ++++++++++++++++++- .../SharedFolders/FeatureSharedFolders.cs | 15 ++- .../SharedFolders/SharedFoldersDialog.cs | 19 +++- .../Properties/Resources.Designer.cs | 11 ++- .../Properties/Resources.resx | 5 +- .../AcaciaZPushPlugin/ZPush/ZPushSync.cs | 8 +- 6 files changed, 137 insertions(+), 15 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs index 49cb32f..6844f27 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SendAs/FeatureSendAs.cs @@ -28,6 +28,7 @@ using static Acacia.DebugOptions; using Acacia.Features.GAB; using Acacia.Features.SyncState; using System.Windows.Forms; +using System.Threading; namespace Acacia.Features.SendAs { @@ -60,6 +61,9 @@ namespace Acacia.Features.SendAs MailEvents.Respond += MailEvents_Respond; } } + + // Upgrade after accounts are determined + Watcher.AccountsScanned += CheckUpgrades; } } @@ -184,10 +188,6 @@ namespace Acacia.Features.SendAs MessageBoxIcon.Error ); } - else - { - - } } } @@ -234,13 +234,50 @@ namespace Acacia.Features.SendAs internal void UpdateSendAsAddresses(ZPushAccount zpush, ICollection shares) { + UpdateSendAsAddresses(zpush, shares, false); + } + + private void UpdateSendAsAddresses(ZPushAccount zpush, ICollection shares, bool checkUpgradeFolders) + { + + SharedFolder firstFailure = null; foreach (SharedFolder folder in shares) { if (!folder.FlagSendAsOwner) continue; // Resolve it - FindSendAsAddress(zpush, folder); + string address = FindSendAsAddress(zpush, folder); + if (checkUpgradeFolders && address == null) + { + // This is an update from an old shared folder. See if it can be resolved + address = UpgradeSharedFolderAddress(zpush, folder); + if (address == null) + { + // Still not resolved, mark a failure for later + if (firstFailure == null) + firstFailure = folder; + } + } + } + + if (firstFailure != null) + { + ThisAddIn.Instance.InUI(() => + { + if (MessageBox.Show(ThisAddIn.Instance.Window, + string.Format(Properties.Resources.SharedFolders_SendAsUpdateFailed_Label, firstFailure.Name), + Properties.Resources.SharedFolders_SendAsFailed_Title, + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning + ) == DialogResult.Yes) + { + + SharedFoldersDialog dialog = new SharedFoldersDialog(_sharedFolders, zpush, firstFailure.SyncId); + dialog.SuppressInitialSendAsWarning = true; + dialog.ShowDialog(); + } + }, false); } } @@ -275,5 +312,52 @@ namespace Acacia.Features.SendAs } #endregion + + #region Upgrading of old send-as folders + + private void CheckUpgrades() + { + // To determine the send-as address, we need the GAB. So wait for that to finish updating. + FeatureGAB gab = ThisAddIn.Instance.GetFeature(); + if (gab != null) + gab.SyncFinished += CheckUpgradesGabSynced; + } + + private string UpgradeSharedFolderAddress(ZPushAccount zpush, SharedFolder folder) + { + string address = FindSendAsAddress(zpush, folder.Store); + if (string.IsNullOrWhiteSpace(address)) + return null; + + // Store it + folder.SendAsAddress = address; + StoreSyncIdAddress(zpush, folder); + zpush.SetSendAsAddress(folder.BackendId, address); + return address; + } + + private void CheckUpgradesGabSynced(GABHandler gab) + { + ThisAddIn.Instance.InUI(() => + { + ZPushAccount account = gab.ActiveAccount; + ICollection shares = _sharedFolders.GetCachedFolders(account); + if (shares == null) + { + using (SharedFoldersManager manager = _sharedFolders.Manage(account)) + { + shares = manager.GetCurrentShares(null); + } + } + + if (shares != null) + { + UpdateSendAsAddresses(account, shares, true); + } + }, false); + } + + #endregion + } } diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs index 7b0e709..496f019 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/FeatureSharedFolders.cs @@ -113,10 +113,15 @@ namespace Acacia.Features.SharedFolders ZPushAccount account = Watcher.Accounts.GetAccount(folder); if (account != null) { - new SharedFoldersDialog(this, account, folder.SyncId).ShowDialog(); + ManageFolder(account, folder.SyncId); } } + public void ManageFolder(ZPushAccount account, SyncId folderId) + { + new SharedFoldersDialog(this, account, folderId).ShowDialog(); + } + private void ManageFolders() { ZPushAccount account = Watcher.CurrentZPushAccount(); @@ -174,6 +179,14 @@ namespace Acacia.Features.SharedFolders } } + public ICollection GetCachedFolders(ZPushAccount zpush) + { + Dictionary shared = zpush.GetFeatureData>(this, KEY_SHARES); + if (shared == null) + return null; + return shared.Values; + } + public SharedFolder GetSharedFolder(IFolder folder) { if (folder == null) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs index 254cdbe..0602308 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SharedFolders/SharedFoldersDialog.cs @@ -99,6 +99,12 @@ namespace Acacia.Features.SharedFolders private ZPushAccount _initialAccount; private SharedFolder _initialFolder; + public bool SuppressInitialSendAsWarning + { + get; + set; + } + public SharedFoldersDialog(FeatureSharedFolders feature, ZPushAccount account, SyncId initial = null) { // If this is a shared store, open the account it's a share for, with the request account as the initial @@ -883,9 +889,16 @@ namespace Acacia.Features.SharedFolders } else if (checkSendAs.Checked) { - MessageBox.Show(Properties.Resources.SharedFolders_SendAsFailed_Label, - Properties.Resources.SharedFolders_SendAsFailed_Title, - MessageBoxButtons.OK, MessageBoxIcon.Information); + if (SuppressInitialSendAsWarning) + { + SuppressInitialSendAsWarning = false; + } + else + { + MessageBox.Show(Properties.Resources.SharedFolders_SendAsFailed_Label, + Properties.Resources.SharedFolders_SendAsFailed_Title, + MessageBoxButtons.OK, MessageBoxIcon.Information); + } } } diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs index ccb844b..6146aa8 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs @@ -1167,7 +1167,7 @@ namespace Acacia.Properties { } /// - /// Looks up a localized string similar to Unable to determine the email address for the folder. Send-as will only work if you specify the email address manually.. + /// Looks up a localized string similar to Unable to determine the send-as email address for the folder. Send-as will only work if you specify the email address manually.. /// internal static string SharedFolders_SendAsFailed_Label { get { @@ -1184,6 +1184,15 @@ namespace Acacia.Properties { } } + /// + /// Looks up a localized string similar to Unable to determine the send-as email address for the existing shared folder {0}. Send-as will only work if you specify the email address manually. Would you like to open the Shared Folders dialog?. + /// + internal static string SharedFolders_SendAsUpdateFailed_Label { + get { + return ResourceManager.GetString("SharedFolders_SendAsUpdateFailed_Label", resourceCulture); + } + } + /// /// Looks up a localized string similar to There are unsaved changes. Do you really want to to discard these?. /// diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx index 737d12e..838b56d 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx @@ -531,9 +531,12 @@ Please contact your system administrator for any required changes. Open stores - Unable to determine the email address for the folder. Send-as will only work if you specify the email address manually. + Unable to determine the send-as email address for the folder. Send-as will only work if you specify the email address manually. Shared Folders + + Unable to determine the send-as email address for the existing shared folder {0}. Send-as will only work if you specify the email address manually. Would you like to open the Shared Folders dialog? + \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs index 759f3e9..7b07fb6 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushSync.cs @@ -266,8 +266,8 @@ namespace Acacia.ZPush // Need to keep a reference to keep receiving events _syncObject = addIn.GetSyncObject(); - _syncObject.SyncStart += SyncObject_SyncStart; - _syncObject.SyncEnd += SyncObject_SyncEnd; + _syncObject.SyncEnd += SyncObject_SyncPeriodics; + _syncObject.SyncEnd += SyncObject_SyncOneOffTasks; watcher.AccountDiscovered += Watcher_AccountDiscovered; } } @@ -489,7 +489,7 @@ namespace Acacia.ZPush /// /// Invoked when an explicit send and receive is performed, invokes any tasks. /// - private void SyncObject_SyncStart() + private void SyncObject_SyncPeriodics() { // TODO: this checks _started, others don't. Also, this is probably invoked on // start-up, as is AccountDiscoverd. Does that mean tasks are invoked twice @@ -506,7 +506,7 @@ namespace Acacia.ZPush /// /// Invoked after an explicit send and receive is performed, invokes any tasks. /// - private void SyncObject_SyncEnd() + private void SyncObject_SyncOneOffTasks() { AcaciaTask task; while (_endTasks.TryDequeue(out task))