private void ReplacePlaceholders(ContactStringReplacer replacer, string signatureName)
        {
            if (string.IsNullOrEmpty(signatureName))
            {
                return;
            }

            using (ISignatures signatures = ThisAddIn.Instance.GetSignatures())
            {
                using (ISignature signature = signatures.Get(signatureName))
                {
                    if (signature == null)
                    {
                        return;
                    }

                    foreach (ISignatureFormat format in Enum.GetValues(typeof(ISignatureFormat)))
                    {
                        string template = signature.GetContentTemplate(format);
                        if (template != null)
                        {
                            string replaced = replacer.Replace(template);
                            signature.SetContent(replaced, format);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Fetches the signatures for the account.
        /// </summary>
        /// <param name="account">The account.</param>
        /// <returns>The signature hash</returns>
        private string FetchSignatures(ZPushAccount account)
        {
            Logger.Instance.Debug(this, "Fetching signatures for account {0}", account);
            using (ZPushConnection connection = account.Connect())
                using (ZPushWebServiceInfo infoService = connection.InfoService)
                {
                    GetSignatures result = infoService.Execute(new GetSignaturesRequest());

                    // Store the signatures
                    Dictionary <object, string> fullNames = new Dictionary <object, string>();
                    using (ISignatures signatures = ThisAddIn.Instance.GetSignatures())
                    {
                        foreach (Signature signature in result.all.Values)
                        {
                            string name = StoreSignature(signatures, account, signature);
                            fullNames.Add(signature.id, name);
                        }
                    }

                    // Set default signatures if available and none are set
                    if (!string.IsNullOrEmpty(result.new_message) && ShouldSetSignature(account.Account.SignatureNewMessage))
                    {
                        account.Account.SignatureNewMessage = fullNames[result.new_message];
                    }
                    if (!string.IsNullOrEmpty(result.replyforward_message) && ShouldSetSignature(account.Account.SignatureReplyForwardMessage))
                    {
                        account.Account.SignatureReplyForwardMessage = fullNames[result.replyforward_message];
                    }

                    return(result.hash);
                }
        }
 private string GetSignatureName(ISignatures signatures, ZPushAccount account, string name)
 {
     return(SignatureLocalName.ReplaceStringTokens("%", "%", new Dictionary <string, string>
     {
         { "account", account.Account.SmtpAddress },
         { "name", name }
     }));
 }
        private string StoreSignature(ISignatures signatures, ZPushAccount account, Signature signatureInfo)
        {
            string name = GetSignatureName(signatures, account, signatureInfo.name);

            // Remove any existing signature
            try
            {
                ISignature signature = signatures.Get(name);
                if (signature != null)
                {
                    try
                    {
                        signature.Delete();
                    }
                    finally
                    {
                        signature.Dispose();
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Instance.Error(this, "Unable to delete signature {0}: {1}", name, e);
            }

            // Create the new signature
            using (ISignature signature = signatures.Add(name))
            {
                if (!HasPlaceholders(signatureInfo))
                {
                    // Simple, set signature straight away
                    signature.SetContent(signatureInfo.content, signatureInfo.isHTML ? ISignatureFormat.HTML : ISignatureFormat.Text);
                }
                else
                {
                    // There are placeholders. Create a template and hook into the GAB for patching
                    signature.SetContentTemplate(signatureInfo.content, signatureInfo.isHTML ? ISignatureFormat.HTML : ISignatureFormat.Text);

                    // Try replacing straight away
                    GABHandler gab = FeatureGAB.FindGABForAccount(account);
                    if (gab != null)
                    {
                        ReplacePlaceholders(gab, name);
                    }
                }
            }

            return(name);
        }