File indexing completed on 2025-02-02 04:47:49
0001 /* 0002 * SPDX-FileCopyrightText: 2023 Albert Vaca Cintora <albertvaka@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 package org.kde.kdeconnect.Backends.LanBackend; 0008 0009 import android.net.nsd.NsdManager; 0010 import android.net.nsd.NsdServiceInfo; 0011 import android.util.Log; 0012 0013 import androidx.annotation.NonNull; 0014 0015 import java.util.LinkedList; 0016 0017 public class NsdResolveQueue { 0018 0019 static final String LOG_TAG = "NsdResolveQueue"; 0020 0021 final @NonNull NsdManager mNsdManager; 0022 0023 private final Object mLock = new Object(); 0024 private final LinkedList<PendingResolve> mResolveRequests = new LinkedList<>(); 0025 0026 public NsdResolveQueue(NsdManager nsdManager) { 0027 this.mNsdManager = nsdManager; 0028 } 0029 0030 private static class PendingResolve { 0031 final @NonNull NsdServiceInfo serviceInfo; 0032 final @NonNull NsdManager.ResolveListener listener; 0033 0034 private PendingResolve(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) { 0035 this.serviceInfo = serviceInfo; 0036 this.listener = listener; 0037 } 0038 } 0039 0040 public void resolveOrEnqueue(@NonNull NsdServiceInfo serviceInfo, @NonNull NsdManager.ResolveListener listener) { 0041 synchronized (mLock) { 0042 for (PendingResolve existing : mResolveRequests) { 0043 if (serviceInfo.getServiceName().equals(existing.serviceInfo.getServiceName())) { 0044 Log.i(LOG_TAG, "Not enqueuing a new resolve request for the same service: " + serviceInfo.getServiceName()); 0045 return; 0046 } 0047 } 0048 mResolveRequests.addLast(new PendingResolve(serviceInfo, new ListenerWrapper(listener))); 0049 0050 if (mResolveRequests.size() == 1) { 0051 resolveNextRequest(); 0052 } 0053 } 0054 } 0055 0056 private class ListenerWrapper implements NsdManager.ResolveListener { 0057 private final @NonNull NsdManager.ResolveListener mListener; 0058 0059 private ListenerWrapper(@NonNull NsdManager.ResolveListener listener) { 0060 mListener = listener; 0061 } 0062 0063 @Override 0064 public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { 0065 mListener.onResolveFailed(serviceInfo, errorCode); 0066 0067 synchronized (mLock) { 0068 mResolveRequests.pop(); 0069 resolveNextRequest(); 0070 } 0071 } 0072 0073 @Override 0074 public void onServiceResolved(NsdServiceInfo serviceInfo) { 0075 mListener.onServiceResolved(serviceInfo); 0076 0077 synchronized (mLock) { 0078 mResolveRequests.pop(); 0079 resolveNextRequest(); 0080 } 0081 } 0082 } 0083 0084 private void resolveNextRequest() { 0085 if (!mResolveRequests.isEmpty()) { 0086 PendingResolve request = mResolveRequests.getFirst(); 0087 mNsdManager.resolveService(request.serviceInfo, request.listener); 0088 } 0089 } 0090 0091 }