* QControlKit.csproj:

* MainPage.xaml.cs:
* AppDelegate.cs:
* QControlKitXamDemo.csproj:
* QCueViewModel.cs:
* QControlKitXamDemo.iOS.csproj:
* QControlKitXamDemo.Android.csproj: Update Packages

* QServer.cs:
* QBrowser.cs:
* QWorkspace.cs:
* QEventArgs.cs:
* QEventHandlers.cs: Refine Server Found/Lost and Workspace
  Added/Removed
This commit is contained in:
2021-01-08 23:24:35 -06:00
parent b622462c0d
commit 87a9925668
12 changed files with 226 additions and 61 deletions
+55 -33
View File
@@ -5,61 +5,79 @@ using Serilog;
using QControlKit.Constants;
using QControlKit.Events;
using System;
using System.Collections.Generic;
using System.Linq;
namespace QControlKit
{
public class QBrowser
{
ZeroconfResolver.ResolverListener zeroconfTCPBrowser;
public ObservableCollection<QServer> servers = new ObservableCollection<QServer>();
public event QServerFoundHandler ServerFound;
public event QServerLostHandler ServerLost;
public event QServerUpdatedHandler ServerUpdatedWorkspaces;
public QBrowser()
{
zeroconfTCPBrowser = ZeroconfResolver.CreateListener(QBonjour.TCPService);
zeroconfTCPBrowser.ServiceFound += ZeroconfHostFound;
zeroconfTCPBrowser.ServiceLost += ZeroconfHostLost;
ProbeForQLabInstances();
}
private void ZeroconfHostLost(object sender, IZeroconfHost e)
public async void ProbeForQLabInstances()
{
Log.Information($"[browser] Lost {e.DisplayName} : {e.IPAddress}");
IReadOnlyList<IZeroconfHost> results = await
ZeroconfResolver.ResolveAsync(QBonjour.TCPService,TimeSpan.FromSeconds(3));
}
private void ZeroconfHostFound(object sender, IZeroconfHost e)
{
foreach(var service in e.Services)
foreach (var zeroconfHost in results)
{
if (service.Key.Equals(QBonjour.TCPService))
foreach (var service in zeroconfHost.Services)
{
Log.Information($"Found {e.DisplayName} : {e.IPAddress} : {service.Value.Port}");
QServer server = serverForAddress(e.IPAddress);
if(server == null)
if (service.Key.Equals(QBonjour.TCPService))
{
QServer serverToAdd = new QServer(e.IPAddress, service.Value.Port);
serverToAdd.name = e.DisplayName;
serverToAdd.zeroconfHost = e;
servers.Add(serverToAdd);
serverToAdd.refreshWorkspaces();
serverToAdd.ServerUpdated += OnServerUpdatedWorkspace;
OnServerFound(serverToAdd);
}
else
{
server.name = e.DisplayName;
QServer server = serverForAddress(zeroconfHost.IPAddress);
if (server == null)
{
Log.Information($"[qbrowser] Found {zeroconfHost.DisplayName} : {zeroconfHost.IPAddress} : {service.Value.Port}");
QServer serverToAdd = new QServer(zeroconfHost.IPAddress, service.Value.Port);
serverToAdd.name = zeroconfHost.DisplayName;
serverToAdd.zeroconfHost = zeroconfHost;
servers.Add(serverToAdd);
serverToAdd.refreshWorkspaces();
serverToAdd.ServerUpdated += OnServerUpdatedWorkspace;
OnServerFound(serverToAdd);
}
else
{
server.name = zeroconfHost.DisplayName;
server.refreshWorkspaces();
}
}
}
}
List<QServer> qServers = servers.ToList();
foreach(var server in qServers)
{
bool serverToBeRemoved = true;
foreach(var zeroconfHost in results){
QServer existingServer = serverForAddress(zeroconfHost.IPAddress);
if(server != null)
{
serverToBeRemoved = false;
}
}
if (serverToBeRemoved)
{
server.disconnect();
servers.Remove(server);
Log.Information($"[qbrowser] Lost {server.name} : {server.host} : {server.port}");
OnServerLost(server);
}
}
}
public QServer serverForAddress(string address)
@@ -93,6 +111,11 @@ namespace QControlKit
ServerFound?.Invoke(this, new QServerFoundArgs { server = server });
}
protected virtual void OnServerLost(QServer server)
{
ServerLost?.Invoke(this, new QServerLostArgs { server = server });
}
protected virtual void OnServerUpdatedWorkspace(object source, QServerUpdatedArgs args)
{
ServerUpdatedWorkspaces?.Invoke(this, args);
@@ -104,7 +127,6 @@ namespace QControlKit
{
server.disconnect();
}
zeroconfTCPBrowser.Dispose();
}
}
}