Queue resolver calls

Signed-off-by: Jonathan Bagg <drwho@infidigm.net>
This commit is contained in:
Michael Zanetti
2021-09-14 00:22:25 +02:00
committed by Jonathan Bagg
parent 3f5650388c
commit 966877a9a0

View File

@ -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<NsdServiceInfo> resolverQueue = new ArrayList<NsdServiceInfo>();
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());
}
}