blob: e5691b7344162a1e66f8164b01d1d3a61ec703cb [file] [log] [blame]
Philip P. Moltmanna26b7752016-05-23 10:33:57 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.printservice.recommendation.plugin.samsung;
18
19import android.net.nsd.NsdManager;
20import android.net.nsd.NsdServiceInfo;
21import android.util.Pair;
22import com.android.printservice.recommendation.util.NsdResolveQueue;
23
24import java.util.LinkedList;
25
26final class ServiceResolveQueue {
27
28 private final NsdManager mNsdManager;
29 private final LinkedList<Pair<NsdServiceInfo, ResolveCallback>> mQueue = new LinkedList<>();
30 private final Object mLock = new Object();
31
32 private static Object sLock = new Object();
33 private static ServiceResolveQueue sInstance = null;
34 private final NsdResolveQueue mNsdResolveQueue;
35 private Pair<NsdServiceInfo, ResolveCallback> mCurrentRequest = null;
36
37 public static void createInstance(NsdManager nsdManager) {
38 if (sInstance == null) sInstance = new ServiceResolveQueue(nsdManager);
39 }
40
41 public static ServiceResolveQueue getInstance(NsdManager nsdManager) {
42 synchronized (sLock) {
43 createInstance(nsdManager);
44 return sInstance;
45 }
46 }
47
48 public static void destroyInstance() {
49 sInstance = null;
50 }
51
52 public interface ResolveCallback {
53 void serviceResolved(NsdServiceInfo nsdServiceInfo);
54 }
55
56 public ServiceResolveQueue(NsdManager nsdManager) {
57 mNsdManager = nsdManager;
58 mNsdResolveQueue = NsdResolveQueue.getInstance();
59 }
60
61 public void queueRequest(NsdServiceInfo serviceInfo, ResolveCallback callback) {
62 synchronized (mLock) {
63 Pair<NsdServiceInfo, ResolveCallback> newRequest = Pair.create(serviceInfo, callback);
64 if (mQueue.contains(newRequest)) return;
65 mQueue.add(newRequest);
66 makeNextRequest();
67 }
68 }
69
70 public void removeRequest(NsdServiceInfo serviceInfo, ResolveCallback callback) {
71 synchronized (mLock) {
72 Pair<NsdServiceInfo, ResolveCallback> newRequest = Pair.create(serviceInfo, callback);
73 mQueue.remove(newRequest);
74 if ((mCurrentRequest != null) && newRequest.equals(mCurrentRequest)) mCurrentRequest = null;
75 }
76 }
77
78 private void makeNextRequest() {
79 synchronized (mLock) {
80 if (mCurrentRequest != null) return;
81 if (mQueue.isEmpty()) return;
82 mCurrentRequest = mQueue.removeFirst();
83 mNsdResolveQueue.resolve(mNsdManager, mCurrentRequest.first,
84 new NsdManager.ResolveListener() {
85 @Override
86 public void onResolveFailed(NsdServiceInfo nsdServiceInfo, int i) {
87 synchronized (mLock) {
88 if (mCurrentRequest != null) mQueue.add(mCurrentRequest);
89 makeNextRequest();
90 }
91 }
92
93 @Override
94 public void onServiceResolved(NsdServiceInfo nsdServiceInfo) {
95 synchronized (mLock) {
96 if (mCurrentRequest != null) {
97 mCurrentRequest.second.serviceResolved(nsdServiceInfo);
98 mCurrentRequest = null;
99 }
100 makeNextRequest();
101 }
102 }
103 });
104
105 }
106 }
107
108
109}