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))