From 9ba795d7aa00d101b64b3760a1e963a5531176e5 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 25 Jan 2017 14:49:00 +0100 Subject: [PATCH] [KOE-14] Added restart dialog to secondary contacts folder sync. --- src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln | 16 +++- .../FeatureSecondaryContacts.cs | 69 +++++++++++++++--- .../Properties/Resources.Designer.cs | 18 +++++ .../Properties/Resources.resx | 8 ++ .../Stubs/OutlookWrappers/OutlookWrapper.cs | 9 ++- .../AcaciaZPushPlugin/ThisAddIn.cs | 32 ++++++++ .../AcaciaZPushPlugin/ZPush/ZPushAccount.cs | 2 +- .../OutlookRestarter/App.config | 6 ++ .../OutlookRestarter/Kopano.ico | Bin 0 -> 370070 bytes .../OutlookRestarter/OutlookRestarter.csproj | 69 ++++++++++++++++++ .../OutlookRestarter/Program.cs | 20 +++++ .../Properties/AssemblyInfo.cs | 36 +++++++++ 12 files changed, 270 insertions(+), 15 deletions(-) create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/App.config create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/Kopano.ico create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/OutlookRestarter.csproj create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/Program.cs create mode 100644 src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln b/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln index 905ae8e..eb30fbe 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AcaciaZPushPlugin", "AcaciaZPushPlugin\AcaciaZPushPlugin.csproj", "{1A7427A5-F814-4B07-98B2-C67D758B65D6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PluginDebugger", "PluginDebugger\PluginDebugger.csproj", "{9258AD17-0A25-4669-A95C-93EC70882551}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OutlookRestarter", "OutlookRestarter\OutlookRestarter.csproj", "{222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,6 +43,18 @@ Global {9258AD17-0A25-4669-A95C-93EC70882551}.Release|x64.Build.0 = Release|Any CPU {9258AD17-0A25-4669-A95C-93EC70882551}.Release|x86.ActiveCfg = Release|Any CPU {9258AD17-0A25-4669-A95C-93EC70882551}.Release|x86.Build.0 = Release|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x64.ActiveCfg = Debug|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x64.Build.0 = Debug|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x86.ActiveCfg = Debug|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Debug|x86.Build.0 = Debug|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|Any CPU.Build.0 = Release|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x64.ActiveCfg = Release|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x64.Build.0 = Release|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x86.ActiveCfg = Release|Any CPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs index baa5cc8..4952c4d 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/SecondaryContacts/FeatureSecondaryContacts.cs @@ -26,6 +26,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Windows.Forms; using static Acacia.DebugOptions; namespace Acacia.Features.SecondaryContacts @@ -57,6 +58,10 @@ namespace Acacia.Features.SecondaryContacts } } + // Contains the ids of folders for which we've shown a warning. This is both to prevent + // warning multiple times and to detect the case when the app has been restarted. + private readonly HashSet _warnedFolders = new HashSet(); + public FeatureSecondaryContacts() { @@ -68,27 +73,67 @@ namespace Acacia.Features.SecondaryContacts OnUnpatchedFolderDiscovered); } - private void OnUnpatchedFolderDiscovered(IFolder folder) { string strippedName = folder.Name.StripSuffix(SUFFIX_CONTACTS); Logger.Instance.Debug(this, "Patching secondary contacts folder: {0}", strippedName); - // Note that somehow it fails if these are updated in one go, so do the steps individually + // To patch we need to do the following + // 1) Update the sync type from 18 to 14 + // 2) Update the container class from Note to Contact + // 3) Patch the name + // Note that the above steps need to be done in this order and individually for this to work. + // + // At some point after 2 we also need to restart Outlook to make it appear in the list of contact folders. + // So, when the folder is detected, we make it invisible and perform steps 1 and 2. We issue a warning + // that Outlook must be restarted. When the folder is detected again and is invisible, that means we've restarted + // At this point the name is patched and the folder is made visible. - // Sync type - Logger.Instance.Trace(this, "Setting sync type"); - folder.SetProperty(OutlookConstants.PR_EAS_SYNCTYPE, (int)OutlookConstants.SyncType.UserContact); + if (!folder.AttrHidden) + { + // Stage 1 - // Container type - Logger.Instance.Trace(this, "Setting container class"); - folder.SetProperty(OutlookConstants.PR_CONTAINER_CLASS, "IPF.Contact"); + // Sync type + Logger.Instance.Trace(this, "Setting sync type"); + folder.SetProperty(OutlookConstants.PR_EAS_SYNCTYPE, (int)OutlookConstants.SyncType.UserContact); - // And the name - Logger.Instance.Trace(this, "Patching name"); - folder.Name = strippedName; + // Container type + Logger.Instance.Trace(this, "Setting container class"); + folder.SetProperty(OutlookConstants.PR_CONTAINER_CLASS, "IPF.Contact"); - Logger.Instance.Debug(this, "Patched secondary contacts folder: {0}", strippedName); + // Make it invisible. + folder.AttrHidden = true; + + Logger.Instance.Debug(this, "Patched secondary contacts folder: {0}", strippedName); + // Register and show a warning, if not already done. + // Note that patching may be done multiple times. + if (!_warnedFolders.Contains(folder.EntryId)) + { + _warnedFolders.Add(folder.EntryId); + + if (MessageBox.Show(StringUtil.GetResourceString("SecondaryContactsPatched_Body", strippedName), + StringUtil.GetResourceString("SecondaryContactsPatched_Title"), + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning + ) == DialogResult.Yes) + { + ThisAddIn.Instance.Restart(); + } + } + } + // If _warnedFolders does not contain the folder (and it's hidden), this means Outlook was restarted. + else if (!_warnedFolders.Contains(folder.EntryId)) + { + // Stage 2 + + // Patch the name + Logger.Instance.Trace(this, "Patching name"); + folder.Name = strippedName; + + // Show it + folder.AttrHidden = false; + Logger.Instance.Debug(this, "Shown secondary contacts folder: {0}", strippedName); + } } } } \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs index 22a01c6..f2f609e 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs @@ -785,6 +785,24 @@ namespace Acacia.Properties { } } + /// + /// Looks up a localized string similar to To synchronise the contacts folder '{0}', Outlook must be restarted. Click 'Yes' to restart Outlook now, or 'No' if you plan to restart Outlook later.. + /// + internal static string SecondaryContactsPatched_Body { + get { + return ResourceManager.GetString("SecondaryContactsPatched_Body", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Contacts folder. + /// + internal static string SecondaryContactsPatched_Title { + get { + return ResourceManager.GetString("SecondaryContactsPatched_Title", resourceCulture); + } + } + /// /// Looks up a localized string similar to Unable to open the shared folder. Please ensure you have permission to open the shared folder.. /// diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx index ccf7cde..93b5c6b 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx @@ -431,4 +431,12 @@ Shows the about dialog, which contains licensing and version information. + + To synchronise the contacts folder '{0}', Outlook must be restarted. Click 'Yes' to restart Outlook now, or 'No' if you plan to restart Outlook later. + Shown when a secondary contact folder is detected, to inform the user that a restart is required + + + Contacts folder + Shown when a secondary contact folder is detected, to inform the user that a restart is required + \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs index 2bb4efe..36e4bcf 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs @@ -112,7 +112,14 @@ namespace Acacia.Stubs.OutlookWrappers { get { - return Props.GetProperty(OutlookConstants.PR_ATTR_HIDDEN); + try + { + return Props.GetProperty(OutlookConstants.PR_ATTR_HIDDEN); + } + catch(System.Exception) + { + return false; + } } set { diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs index 9006c34..269c820 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ThisAddIn.cs @@ -29,6 +29,9 @@ using Acacia.UI; using Acacia.ZPush; using System.Globalization; using Acacia.UI.Outlook; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Reflection; namespace Acacia { @@ -188,6 +191,35 @@ namespace Acacia #endregion + #region Misc helpers + + public void SendReceive() + { + Outlook.NameSpace session = Application.Session; + session.SendAndReceive(false); + ComRelease.Release(session); + } + + public void Restart() + { + // Can not use the assembly location, as that is in the GAC + string codeBase = Assembly.GetExecutingAssembly().CodeBase; + UriBuilder uri = new UriBuilder(codeBase); + string path = Uri.UnescapeDataString(uri.Path); + // Create the path to the restarter + path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(path), "OutlookRestarter.exe"); + + // Run that + Process process = new Process(); + process.StartInfo = new ProcessStartInfo(path, Environment.CommandLine); + process.Start(); + + // And close us + Application.Quit(); + } + + #endregion + #region Ribbons private OutlookUI _outlookUI; diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs index 3e70eac..09fc992 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushAccount.cs @@ -72,7 +72,7 @@ namespace Acacia.ZPush /// public void SendReceive() { - ThisAddIn.Instance.Application.Session.SendAndReceive(false); + ThisAddIn.Instance.SendReceive(); } #endregion diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/App.config b/src/AcaciaZPushPlugin/OutlookRestarter/App.config new file mode 100644 index 0000000..d740e88 --- /dev/null +++ b/src/AcaciaZPushPlugin/OutlookRestarter/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/Kopano.ico b/src/AcaciaZPushPlugin/OutlookRestarter/Kopano.ico new file mode 100644 index 0000000000000000000000000000000000000000..0b80522fe0d35a771be5385301e2e0e0d5377d9f GIT binary patch literal 370070 zcmeHw3A`jpU1q)4GxTr{u-w;c?g15$U6f_IUu9Lj?ir9FKxM7a3nxRMuUUS(V4X z`WGFM8JQ9P>-)z)A|vxP8Y_*PHTYX;9B7<%;IziipuDx^kIz_XybkB0$RD>GjSrl4 zdgEaai;v%R|3>4h&pW+w;DA5AZKLtZ^G|Qw7CGB{?rDw2L*8I2r4zMj9riN`m;@>+fp*k#*l$OjJD~hQq&=jc zC%f(S$kkPpbz{pUP-_XaoAJ2cjyCQH%zwyZ|0d+8kbaTEX-Cm2;sT2UYHcaTeAOh- z@#B6c>Ja;X>#={*W1sjBd_W66z~%x~vjO9$o)QrD4@a#u_8I##3IB-?Xt_ARd_X-d z#<;GE1Q^egml4<>?gN^b3$)D#RK*sIk9tX9f^lEiSKb!~w40a^Cf*g0JPgYppHgsJZB<-w%^x>ar7=2?>}6?aX;+~}$SnF@OC`*f^e10*3t=1!uRJ1WGP}F7`{aw`WkyZ{vQ+?a;_yyaWvUiCN+bb{^={n9cY4b@?i2g>r^u1pI)905 z&q!Ua1d_kY6J!5lz)#uM`3?KaH6iQ0q!JMJfq9PmhW(Q2(a1IlOe+E4-NpQd{b?m< z*P8^&Er9_0_poul+`2UCO#;(Mz+(Psq-EEd1gax}ij4dBqej4st@BsMG>wy-C6J8! z%~qLXe#3swc4Ey}PXeiN|56;6@fn|Czj~%=9OW#5)VOch&spBqyh)%a5=h2_-Vy0Q;BYZwlFbAG+lDPMsb<+W7Y<|BJ`{jmS^=@=I8c^?-di zw)FrCqsBjs^KOm^AHey38OMFYzPDeD>5BQ!0=B>6@qW_h#J_yNukaT5fK{9`A5c^L zR|)$V|DEmERFxd}`B}1?u`hc7KHSwCD%>`^ju({_6pPr z3^ilcuwN~O1G915f3)%139&!O2gGZFHW#Rtaiq90?56}$@wPcu*jHRHjE~F1 z^?+ZcIF4h_5Zbae!IIlXn*8osUuoz2pFyl|F~3(Vp6?0!=K!xKJpL8akHdXf&wJ!I z-2MO@+nQh+KqWq|0`}X@w!=Pnsr5QP%@EjkF+cJH!0JDG>ZQ}JoEt;2lT3-6h{g6n{M3y1dhx0E{~1-DNECPyU6bhynoSSex5o1C|}X% z1K@is4oK;wh=&38?}hTGN{Ic>wxjmFDO=fFdHk zOOs*0D~l?XfOkFXd%DMdUgLh+AB1thCS}Sv05sThfr1%Wg8isv<9@+(GY>h*v%U)( zcL(mivS9qvAA~-@JsTuV<^$%@YPR>582dN+`AHD-+w=X^V zZ}pQnrqVE@9#BY^$ydHfe?>>uU>;`IPLuh81X z0QT(Ej1ov;|I--%%d)3e>-?7q`!?OH)0aw{vU@l7xu+R7R%k(af#r#uhJ{bGY2KI08_%G_bKg4}l z4t;=I4{(2L%$^HOX$^QT=3{>3hW)9fSH2s7cdhxqrG#VuFdyLd2V4!_z>_^2oX{-0 zYkeh-`6K^~FS2$1acU3N{2vUQ?0Wo{ZR{WE1MJ=5aaIu5C(rlGJKz5_zSC=adnQx2 zy9(de(q6w;mwfCW?*r_cqC+jCi~aIG-#6?JRqwzG%==wj3?Fb8VE^kC82d;10GkU8 zG=pRxEPOy&*ZGrizwUpNYp{j~p9S7E_CL>Kf7$Q&g!s*(oU94ry8-cOL1pu-`0Q%zqNJbN}(D@r`a<>+3=F z+8q9{av1+7#~%E@m}kGPxE7c)zOpxZej<pNleWp7yU?Sg31W86P0*x5|tC zPa5`npqt47zKJFLzrtg`?y-N`*Y*1Vd`k?nD$RO;;$&cdt)%0Af_?Y^XRnzUf6W`w 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 + + + + Debug + AnyCPU + {222C4DA5-FA31-471A-B127-5E0C6AD2CB3C} + WinExe + Properties + OutlookRestarter + OutlookRestarter + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + ..\Build\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + ..\Build\Release\ + TRACE + prompt + 4 + + + Kopano.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/Program.cs b/src/AcaciaZPushPlugin/OutlookRestarter/Program.cs new file mode 100644 index 0000000..8e86e2e --- /dev/null +++ b/src/AcaciaZPushPlugin/OutlookRestarter/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OutlookRestarter +{ + class Program + { + [STAThread] + static void Main(string[] args) + { + Process process = new Process(); + process.StartInfo = new ProcessStartInfo(args[0], string.Join(" ", args.Skip(1))); + process.Start(); + } + } +} diff --git a/src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs b/src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0472212 --- /dev/null +++ b/src/AcaciaZPushPlugin/OutlookRestarter/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OutlookRestarter")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OutlookRestarter")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("222c4da5-fa31-471a-b127-5e0c6ad2cb3c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")]