diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj
index fb76988..69353fd 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/AcaciaZPushPlugin.csproj
@@ -275,6 +275,12 @@
+
+ UserControl
+
+
+ SignaturesSettings.cs
+
@@ -549,6 +555,9 @@
SharedFoldersDialog.cs
+
+ SignaturesSettings.cs
+
ResXFileCodeGenerator
Resources.Designer.cs
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/FeatureSignatures.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/FeatureSignatures.cs
index 32faec6..4d0fc38 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/FeatureSignatures.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/FeatureSignatures.cs
@@ -17,6 +17,7 @@ using Acacia.Features.GAB;
/// Consult LICENSE file for details
using Acacia.Stubs;
using Acacia.Stubs.OutlookWrappers;
+using Acacia.UI;
using Acacia.Utils;
using Acacia.ZPush;
using Acacia.ZPush.Connect;
@@ -39,6 +40,15 @@ namespace Acacia.Features.Signatures
{
#region Debug options
+ [AcaciaOption("If set, the local signature is always set to the server signature. If not set, the local signature will be set " +
+ "only if it is unspecified. ")]
+ public bool AlwaysSetLocal
+ {
+ get { return GetOption(OPTION_ALWAYS_SET_LOCAL); }
+ set { SetOption(OPTION_ALWAYS_SET_LOCAL, value); }
+ }
+ private static readonly BoolOption OPTION_ALWAYS_SET_LOCAL = new BoolOption("AlwaysSetLocal", false);
+
[AcaciaOption("The format for local names of synchronised signatures, to prevent overwriting local signatures. May contain %account% and %name%.")]
public string SignatureLocalName
{
@@ -93,29 +103,49 @@ namespace Acacia.Features.Signatures
}
}
+
+ internal void ResyncAll()
+ {
+ foreach(ZPushAccount account in Watcher.Accounts.GetAccounts())
+ {
+ if (account.Confirmed == ZPushAccount.ConfirmationType.IsZPush)
+ {
+ SyncSignatures(account, null);
+ }
+ }
+ }
+
+ ///
+ /// Syncs the signatures for the account.
+ ///
+ /// The account
+ /// The signature hash. If null, the hash will not be checked and a hard sync will be done.
private void SyncSignatures(ZPushAccount account, string serverSignatureHash)
{
if (!account.Capabilities.Has("signatures"))
return;
- Logger.Instance.Trace(this, "Checking signature hash for account {0}: {1}", account, serverSignatureHash);
+ // Check hash if needed
+ if (serverSignatureHash != null)
+ {
+ Logger.Instance.Trace(this, "Checking signature hash for account {0}: {1}", account, serverSignatureHash);
+ if (serverSignatureHash == account.Account.LocalSignaturesHash)
+ return;
+ }
// Fetch signatures if there is a change
- if (serverSignatureHash != account.Account.LocalSignaturesHash)
+ try
{
- try
- {
- Logger.Instance.Debug(this, "Updating signatures: {0}", account);
- FetchSignatures(account);
+ Logger.Instance.Debug(this, "Updating signatures: {0}", account);
+ string hash = FetchSignatures(account);
- // Store updated hash
- account.Account.LocalSignaturesHash = serverSignatureHash;
- Logger.Instance.Debug(this, "Updated signatures: {0}", account);
- }
- catch (Exception e)
- {
- Logger.Instance.Error(this, "Error fetching signatures: {0}: {1}", account, e);
- }
+ // Store updated hash
+ account.Account.LocalSignaturesHash = hash;
+ Logger.Instance.Debug(this, "Updated signatures: {0}: {1}", account, hash);
+ }
+ catch (Exception e)
+ {
+ Logger.Instance.Error(this, "Error fetching signatures: {0}: {1}", account, e);
}
}
@@ -146,7 +176,12 @@ namespace Acacia.Features.Signatures
{
}
- private void FetchSignatures(ZPushAccount account)
+ ///
+ /// Fetches the signatures for the account.
+ ///
+ /// The account.
+ /// The signature hash
+ private string FetchSignatures(ZPushAccount account)
{
Logger.Instance.Debug(this, "Fetching signatures for account {0}", account);
using (ZPushConnection connection = account.Connect())
@@ -166,17 +201,25 @@ namespace Acacia.Features.Signatures
}
// Set default signatures if available and none are set
- if (!string.IsNullOrEmpty(result.new_message) && string.IsNullOrEmpty(account.Account.SignatureNewMessage))
+ if (!string.IsNullOrEmpty(result.new_message) && ShouldSetSignature(account.Account.SignatureNewMessage))
{
account.Account.SignatureNewMessage = fullNames[result.new_message];
}
- if (!string.IsNullOrEmpty(result.replyforward_message) && string.IsNullOrEmpty(account.Account.SignatureReplyForwardMessage))
+ if (!string.IsNullOrEmpty(result.replyforward_message) && ShouldSetSignature(account.Account.SignatureReplyForwardMessage))
{
account.Account.SignatureReplyForwardMessage = fullNames[result.replyforward_message];
}
+
+ return result.hash;
}
}
+ private bool ShouldSetSignature(string currentSignature)
+ {
+ return string.IsNullOrEmpty(currentSignature) || AlwaysSetLocal;
+ }
+
+
#endregion
private string StoreSignature(ISignatures signatures, ZPushAccount account, Signature signatureInfo)
@@ -334,5 +377,14 @@ namespace Acacia.Features.Signatures
}
}
}
+
+ #region Settings
+
+ public override FeatureSettings GetSettings()
+ {
+ return new SignaturesSettings(this);
+ }
+
+ #endregion
}
}
\ No newline at end of file
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.Designer.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.Designer.cs
new file mode 100644
index 0000000..9740c08
--- /dev/null
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.Designer.cs
@@ -0,0 +1,79 @@
+namespace Acacia.Features.Signatures
+{
+ partial class SignaturesSettings
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SignaturesSettings));
+ this._layout = new System.Windows.Forms.TableLayoutPanel();
+ this.checkForceSet = new System.Windows.Forms.CheckBox();
+ this.buttonResync = new System.Windows.Forms.Button();
+ this._layout.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // _layout
+ //
+ resources.ApplyResources(this._layout, "_layout");
+ this._layout.Controls.Add(this.checkForceSet, 0, 0);
+ this._layout.Controls.Add(this.buttonResync, 0, 1);
+ this._layout.Name = "_layout";
+ //
+ // checkForceSet
+ //
+ resources.ApplyResources(this.checkForceSet, "checkForceSet");
+ this.checkForceSet.Name = "checkForceSet";
+ this.checkForceSet.UseVisualStyleBackColor = true;
+ this.checkForceSet.CheckedChanged += new System.EventHandler(this.checkForceSet_CheckedChanged);
+ //
+ // buttonResync
+ //
+ resources.ApplyResources(this.buttonResync, "buttonResync");
+ this.buttonResync.Name = "buttonResync";
+ this.buttonResync.UseVisualStyleBackColor = true;
+ this.buttonResync.Click += new System.EventHandler(this.buttonResync_Click);
+ //
+ // SignaturesSettings
+ //
+ resources.ApplyResources(this, "$this");
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.SystemColors.Window;
+ this.Controls.Add(this._layout);
+ this.Name = "SignaturesSettings";
+ this._layout.ResumeLayout(false);
+ this._layout.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TableLayoutPanel _layout;
+ private System.Windows.Forms.CheckBox checkForceSet;
+ private System.Windows.Forms.Button buttonResync;
+ }
+}
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.cs
new file mode 100644
index 0000000..87ad446
--- /dev/null
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.cs
@@ -0,0 +1,84 @@
+/// Copyright 2016 Kopano b.v.
+///
+/// This program is free software: you can redistribute it and/or modify
+/// it under the terms of the GNU Affero General Public License, version 3,
+/// as published by the Free Software Foundation.
+///
+/// This program is distributed in the hope that it will be useful,
+/// but WITHOUT ANY WARRANTY; without even the implied warranty of
+/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+/// GNU Affero General Public License for more details.
+///
+/// You should have received a copy of the GNU Affero General Public License
+/// along with this program.If not, see.
+///
+/// Consult LICENSE file for details
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Acacia.ZPush;
+using Acacia.UI;
+
+namespace Acacia.Features.Signatures
+{
+ public partial class SignaturesSettings : FeatureSettings
+ {
+ private readonly FeatureSignatures _feature;
+ public override Feature Feature
+ {
+ get
+ {
+ return _feature;
+ }
+ }
+
+ public SignaturesSettings(FeatureSignatures feature = null)
+ {
+ this._feature = feature;
+
+ InitializeComponent();
+
+ // Allow null feature for designer
+ if (feature != null)
+ {
+ checkForceSet.Checked = feature.AlwaysSetLocal;
+ }
+ }
+
+ override public void Apply()
+ {
+ }
+
+ private void CheckDirty()
+ {
+ Dirty = false;
+ }
+
+ private void buttonResync_Click(object sender, EventArgs e)
+ {
+ if (_feature != null)
+ {
+ ProgressDialog.Execute("SignaturesSync",
+ (ct) =>
+ {
+ _feature.ResyncAll();
+ return 0;
+ }
+ );
+ }
+ }
+
+ private void checkForceSet_CheckedChanged(object sender, EventArgs e)
+ {
+ if (_feature != null)
+ _feature.AlwaysSetLocal = checkForceSet.Checked;
+ }
+ }
+}
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.resx
new file mode 100644
index 0000000..49becf8
--- /dev/null
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Signatures/SignaturesSettings.resx
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ True
+
+
+
+ GrowAndShrink
+
+
+ 1
+
+
+ True
+
+
+ Fill
+
+
+
+ 4, 4
+
+
+ 4, 4, 4, 4
+
+
+ 152, 17
+
+
+ 0
+
+
+ Override local signatures
+
+
+ checkForceSet
+
+
+ System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ _layout
+
+
+ 0
+
+
+ True
+
+
+ 3, 28
+
+
+ 8, 0, 8, 0
+
+
+ 154, 23
+
+
+ 1
+
+
+ Resynchronise signatures
+
+
+ buttonResync
+
+
+ System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ _layout
+
+
+ 1
+
+
+ Fill
+
+
+ 0, 0
+
+
+ 2, 2, 2, 2
+
+
+ 2
+
+
+ 160, 54
+
+
+ 0
+
+
+ _layout
+
+
+ System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ $this
+
+
+ 0
+
+
+ <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="checkForceSet" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="buttonResync" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100,Absolute,20" /><Rows Styles="AutoSize,0,AutoSize,0" /></TableLayoutSettings>
+
+
+ True
+
+
+ 6, 13
+
+
+ True
+
+
+ GrowAndShrink
+
+
+ 2, 2, 2, 2
+
+
+ 160, 54
+
+
+ SignaturesSettings
+
+
+ Acacia.UI.FeatureSettings, Kopano, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null
+
+
\ 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 204b24a..ae43403 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.Designer.cs
@@ -132,6 +132,15 @@ namespace Acacia.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to Signatures.
+ ///
+ internal static string Feature_Signatures {
+ get {
+ return ResourceManager.GetString("Feature_Signatures", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to Address Book for {0}.
///
@@ -1019,6 +1028,24 @@ namespace Acacia.Properties {
}
}
+ ///
+ /// Looks up a localized string similar to The signatures are being synchronised..
+ ///
+ internal static string SignaturesSync_Label {
+ get {
+ return ResourceManager.GetString("SignaturesSync_Label", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Signatures.
+ ///
+ internal static string SignaturesSync_Title {
+ get {
+ return ResourceManager.GetString("SignaturesSync_Title", resourceCulture);
+ }
+ }
+
///
/// Looks up a localized string similar to There is an error with the security certificate for server {0}. Do you want to allow the connection anyway?.
///
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx
index a8eb0c0..c75b51b 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Properties/Resources.resx
@@ -445,4 +445,13 @@
Password unavailable
+
+ Signatures
+
+
+ The signatures are being synchronised.
+
+
+ Signatures
+
\ No newline at end of file
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/UI/SettingsDialog.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/UI/SettingsDialog.resx
index fae433e..65262a9 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/UI/SettingsDialog.resx
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/UI/SettingsDialog.resx
@@ -126,14 +126,10 @@
- 358, 4
-
-
-
- 4, 4, 4, 4
+ 269, 3
- 100, 33
+ 75, 27
0
@@ -157,13 +153,10 @@
True
- 250, 4
-
-
- 4, 4, 4, 4
+ 188, 3
- 100, 33
+ 75, 27
1
@@ -187,13 +180,10 @@
True
- 142, 4
-
-
- 4, 4, 4, 4
+ 107, 3
- 100, 33
+ 75, 27
2
@@ -213,6 +203,7 @@
2
+
Bottom
@@ -220,16 +211,13 @@
RightToLeft
- 0, 394
-
-
- 4, 4, 4, 4
+ 0, 374
- 0, 0, 7, 0
+ 0, 0, 5, 0
- 469, 37
+ 352, 30
0
@@ -250,16 +238,13 @@
True
- 8, 16
+ 6, 13
True
- 469, 431
-
-
- 4, 4, 4, 4
+ 352, 404
CenterParent
@@ -271,6 +256,6 @@
SettingsDialog
- System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ Acacia.UI.KopanoDialog, Kopano, Version=0.1.0.0, Culture=neutral, PublicKeyToken=null
\ No newline at end of file