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 }