From c2b0dc6e26997122efd3473811f631c5dcfed0a0 Mon Sep 17 00:00:00 2001
From: Patrick Simpson
Date: Wed, 25 Oct 2017 11:00:44 +0200
Subject: [PATCH] [KOE-146] Free/Busy server now tries another port if the
standard port is in use.
---
.../Features/FreeBusy/FeatureFreeBusy.cs | 45 +++++++++++++++++--
1 file changed, 42 insertions(+), 3 deletions(-)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/FreeBusy/FeatureFreeBusy.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/FreeBusy/FeatureFreeBusy.cs
index 869ef06..c47c0d2 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/FreeBusy/FeatureFreeBusy.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/FreeBusy/FeatureFreeBusy.cs
@@ -113,13 +113,54 @@ namespace Acacia.Features.FreeBusy
private const string REG_VALUE = @"Read URL";
internal const string URL_IDENTIFIER = "zpush";
private const int DEFAULT_PORT = 18632;
- private const string URL_PREFIX = @"http://127.0.0.1:{0}/" + URL_IDENTIFIER + "/";
+ private const string URL_BASE = @"http://127.0.0.1:";
+ private const string URL_PREFIX = URL_BASE + @"{0}/" + URL_IDENTIFIER + "/";
+
+ // The placeholders in URL are replaced by Outlook
private const string URL = URL_PREFIX + "%NAME%@%SERVER%";
private void Worker()
{
Port = DEFAULT_PORT;
+ // Check the URL to reuse the port number if possible
+ try
+ {
+ using (RegistryKey key = OutlookRegistryUtils.OpenOutlookKey(REG_KEY))
+ {
+ if (key != null)
+ {
+ string oldURL = key.GetValueString(REG_VALUE);
+ if (oldURL.StartsWith(URL_BASE))
+ {
+ string rest = oldURL.Substring(URL_BASE.Length);
+ int sep = rest.IndexOf('/');
+ if (sep >= 0)
+ rest = rest.Substring(0, sep);
+ int port = int.Parse(rest);
+ if (port > 0 && port < 65536)
+ Port = port;
+ }
+ }
+ }
+ }
+ catch (Exception) { Port = DEFAULT_PORT; }
+
+ TcpListener listener;
+
+ listener = new TcpListener(IPAddress.Loopback, Port);
+ try
+ {
+ listener.Start();
+ }
+ catch(SocketException)
+ {
+ // Error opening port, try with a default one
+ listener = new TcpListener(IPAddress.Loopback, 0);
+ listener.Start();
+ Port = ((IPEndPoint)listener.LocalEndpoint).Port;
+ }
+
// Register URL
using (RegistryKey key = OutlookRegistryUtils.OpenOutlookKey(REG_KEY, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree))
{
@@ -135,8 +176,6 @@ namespace Acacia.Features.FreeBusy
FreeBusyServer server = new FreeBusyServer(this);
// Run
- TcpListener listener = new TcpListener(IPAddress.Loopback, Port);
- listener.Start();
for (;;)
{
Interlocked.Increment(ref _iterationCount);