diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs index d928f6e..d03a91d 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Constants.cs @@ -71,6 +71,7 @@ namespace Acacia public const string ZPUSH_HEADER_GAB_NAME = "X-Push-GAB-Name"; public const string ZPUSH_HEADER_CAPABILITIES = "X-Push-Capabilities"; + public const string ZPUSH_HEADER_CLIENT_CAPABILITIES = "X-Push-Plugin-Capabilities"; public const string ZPUSH_HEADER_PLUGIN = "X-Push-Plugin"; public const string ZPUSH_HEADER_VERSION = "X-Z-Push-Version"; diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs index afc0d80..ac4608c 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/Feature.cs @@ -63,6 +63,11 @@ namespace Acacia.Features get { return ThisAddIn.Instance.Application; } } + virtual public void GetCapabilities(ZPushCapabilities caps) + { + caps.Add(Name); + } + #region Debug options public static string GetFeatureName(Type featureType) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs index e527ed8..3392646 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/Connect/ZPushConnection.cs @@ -280,7 +280,7 @@ namespace Acacia.ZPush.Connect string url = string.Format(ACTIVESYNC_URL, _account.ServerURL, _account.DeviceId, request.Command, _account.UserName, "WindowsOutlook"); - // Parse the body + // Construct the body WBXMLDocument doc = new WBXMLDocument(); doc.LoadXml(request.Body); doc.VersionNumber = 1.3; @@ -292,6 +292,9 @@ namespace Acacia.ZPush.Connect { Logger.Instance.Trace(this, "Sending request: {0} -> {1}", _account.ServerURL, doc.ToXMLString()); content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-sync.wbxml"); + string caps = ZPushCapabilities.Client.ToString(); + Logger.Instance.Trace(this, "Sending request: {0} -> {1}: {2}", _account.ServerURL, caps, doc.ToXMLString()); + content.Headers.Add(Constants.ZPUSH_HEADER_CLIENT_CAPABILITIES, caps); using (HttpResponseMessage response = _client.PostAsync(url, content, _cancel).Result) { return new Response(response); diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs index 9792e08..742c9a6 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/ZPush/ZPushCapabilities.cs @@ -1,4 +1,6 @@ -/// Copyright 2016 Kopano b.v. + +using Acacia.Features; +/// 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, @@ -13,7 +15,6 @@ /// along with this program.If not, see. /// /// Consult LICENSE file for details - using System; using System.Collections.Generic; using System.ComponentModel; @@ -50,9 +51,26 @@ namespace Acacia.ZPush return _capabilities.Contains(capability); } + public void Add(string capability) + { + _capabilities.Add(capability); + } + public override string ToString() { return string.Join(",", _capabilities); } + + public static ZPushCapabilities Client + { + get + { + ZPushCapabilities caps = new ZPushCapabilities(); + foreach (Feature feature in ThisAddIn.Instance.Features) + feature.GetCapabilities(caps); + + return caps; + } + } } }