From 966877a9a085c0be308f9c2b5ba5857680067d59 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 14 Sep 2021 00:22:25 +0200 Subject: [PATCH] Queue resolver calls Signed-off-by: Jonathan Bagg --- QZeroConfNsdManager.java | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/QZeroConfNsdManager.java b/QZeroConfNsdManager.java index 8164bba..9c28003 100644 --- a/QZeroConfNsdManager.java +++ b/QZeroConfNsdManager.java @@ -28,6 +28,7 @@ package qtzeroconf; import java.util.Map; +import java.util.ArrayList; import android.util.Log; @@ -52,6 +53,10 @@ public class QZeroConfNsdManager { private NsdManager.RegistrationListener registrationListener; private String registrationName; // The original service name that was given for registration, it might change on collisions + // There can only be one resolver at a time per application, we'll need to queue the resolving + static private ArrayList resolverQueue = new ArrayList(); + static private NsdServiceInfo pendingResolve = null; + public QZeroConfNsdManager(int id, Context context) { super(); this.id = id; @@ -103,7 +108,7 @@ public class QZeroConfNsdManager { @Override public void onServiceFound(NsdServiceInfo service) { - nsdManager.resolveService(service, initializeResolveListener()); + enqueueResolver(service); } @Override @@ -133,7 +138,12 @@ public class QZeroConfNsdManager { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { - Log.d(TAG, "Resolving failed for: " + serviceInfo.getServiceName() + " " + serviceInfo.getServiceType() + ": " + errorCode); + Log.w(TAG, "Resolving failed for: " + serviceInfo.getServiceName() + " " + serviceInfo.getServiceType() + ": " + errorCode); + if (errorCode == NsdManager.FAILURE_ALREADY_ACTIVE) { + enqueueResolver(pendingResolve); + } + pendingResolve = null; + processResolverQueue(); } @Override @@ -146,6 +156,8 @@ public class QZeroConfNsdManager { serviceInfo.getPort(), serviceInfo.getAttributes() ); + pendingResolve = null; + processResolverQueue(); } }; } @@ -177,4 +189,21 @@ public class QZeroConfNsdManager { } }; } + + private void enqueueResolver(NsdServiceInfo serviceInfo) { + resolverQueue.add(serviceInfo); + processResolverQueue(); + } + + private void processResolverQueue() { + if (resolverQueue.isEmpty()) { + return; + } + if (pendingResolve != null) { + return; + } + pendingResolve = resolverQueue.get(0); + resolverQueue.remove(0); + nsdManager.resolveService(pendingResolve, initializeResolveListener()); + } }