Loading core/java/android/net/nsd/NsdManager.java +41 −8 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ import com.android.internal.util.Protocol; * http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt * * <p> The API is asynchronous and responses to requests from an application are on listener * callbacks on a seperate thread. * callbacks on a seperate internal thread. * * <p> There are three main operations the API supports - registration, discovery and resolution. * <pre> Loading Loading @@ -119,8 +119,8 @@ import com.android.internal.util.Protocol; * {@see NsdServiceInfo} */ public final class NsdManager { private static final String TAG = "NsdManager"; INsdManager mService; private static final String TAG = NsdManager.class.getSimpleName(); private static final boolean DBG = false; /** * Broadcast intent action to indicate whether network service discovery is Loading @@ -130,8 +130,7 @@ public final class NsdManager { * @see #EXTRA_NSD_STATE */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_NSD_STATE_CHANGED = "android.net.nsd.STATE_CHANGED"; public static final String ACTION_NSD_STATE_CHANGED = "android.net.nsd.STATE_CHANGED"; /** * The lookup key for an int that indicates whether network service discovery is enabled Loading Loading @@ -208,13 +207,47 @@ public final class NsdManager { /** Dns based service discovery protocol */ public static final int PROTOCOL_DNS_SD = 0x0001; private Context mContext; private static final SparseArray<String> EVENT_NAMES = new SparseArray<>(); static { EVENT_NAMES.put(DISCOVER_SERVICES, "DISCOVER_SERVICES"); EVENT_NAMES.put(DISCOVER_SERVICES_STARTED, "DISCOVER_SERVICES_STARTED"); EVENT_NAMES.put(DISCOVER_SERVICES_FAILED, "DISCOVER_SERVICES_FAILED"); EVENT_NAMES.put(SERVICE_FOUND, "SERVICE_FOUND"); EVENT_NAMES.put(SERVICE_LOST, "SERVICE_LOST"); EVENT_NAMES.put(STOP_DISCOVERY, "STOP_DISCOVERY"); EVENT_NAMES.put(STOP_DISCOVERY_FAILED, "STOP_DISCOVERY_FAILED"); EVENT_NAMES.put(STOP_DISCOVERY_SUCCEEDED, "STOP_DISCOVERY_SUCCEEDED"); EVENT_NAMES.put(REGISTER_SERVICE, "REGISTER_SERVICE"); EVENT_NAMES.put(REGISTER_SERVICE_FAILED, "REGISTER_SERVICE_FAILED"); EVENT_NAMES.put(REGISTER_SERVICE_SUCCEEDED, "REGISTER_SERVICE_SUCCEEDED"); EVENT_NAMES.put(UNREGISTER_SERVICE, "UNREGISTER_SERVICE"); EVENT_NAMES.put(UNREGISTER_SERVICE_FAILED, "UNREGISTER_SERVICE_FAILED"); EVENT_NAMES.put(UNREGISTER_SERVICE_SUCCEEDED, "UNREGISTER_SERVICE_SUCCEEDED"); EVENT_NAMES.put(RESOLVE_SERVICE, "RESOLVE_SERVICE"); EVENT_NAMES.put(RESOLVE_SERVICE_FAILED, "RESOLVE_SERVICE_FAILED"); EVENT_NAMES.put(RESOLVE_SERVICE_SUCCEEDED, "RESOLVE_SERVICE_SUCCEEDED"); EVENT_NAMES.put(ENABLE, "ENABLE"); EVENT_NAMES.put(DISABLE, "DISABLE"); EVENT_NAMES.put(NATIVE_DAEMON_EVENT, "NATIVE_DAEMON_EVENT"); } /** @hide */ public static String nameOf(int event) { String name = EVENT_NAMES.get(event); if (name == null) { return Integer.toString(event); } return name; } private final INsdManager mService; private final Context mContext; private static final int INVALID_LISTENER_KEY = 0; private static final int BUSY_LISTENER_KEY = -1; private int mListenerKey = 1; private final SparseArray mListenerMap = new SparseArray(); private final SparseArray<NsdServiceInfo> mServiceMap = new SparseArray<NsdServiceInfo>(); private final SparseArray<NsdServiceInfo> mServiceMap = new SparseArray<>(); private final Object mMapLock = new Object(); private final AsyncChannel mAsyncChannel = new AsyncChannel(); Loading Loading @@ -300,6 +333,7 @@ public final class NsdManager { @Override public void handleMessage(Message message) { if (DBG) Log.d(TAG, "received " + nameOf(message.what)); switch (message.what) { case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); Loading Loading @@ -377,7 +411,6 @@ public final class NsdManager { // if the listener is already in the map, reject it. Otherwise, add it and // return its key. private int putListener(Object listener, NsdServiceInfo s) { if (listener == null) return INVALID_LISTENER_KEY; int key; Loading services/core/java/com/android/server/NsdService.java +63 −72 Original line number Diff line number Diff line Loading @@ -56,46 +56,27 @@ public class NsdService extends INsdManager.Stub { private static final String TAG = "NsdService"; private static final String MDNS_TAG = "mDnsConnector"; private static final boolean DBG = false; private static final boolean DBG = true; private Context mContext; private ContentResolver mContentResolver; private NsdStateMachine mNsdStateMachine; private final Context mContext; private final ContentResolver mContentResolver; private final NsdStateMachine mNsdStateMachine; private final NativeDaemonConnector mNativeConnector; private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1); /** * Clients receiving asynchronous messages */ private HashMap<Messenger, ClientInfo> mClients = new HashMap<Messenger, ClientInfo>(); private final HashMap<Messenger, ClientInfo> mClients = new HashMap<>(); /* A map from unique id to client info */ private SparseArray<ClientInfo> mIdToClientInfoMap= new SparseArray<ClientInfo>(); private final SparseArray<ClientInfo> mIdToClientInfoMap= new SparseArray<>(); private AsyncChannel mReplyChannel = new AsyncChannel(); private final AsyncChannel mReplyChannel = new AsyncChannel(); private int INVALID_ID = 0; private static final int INVALID_ID = 0; private int mUniqueId = 1; private static final int BASE = Protocol.BASE_NSD_MANAGER; private static final int CMD_TO_STRING_COUNT = NsdManager.RESOLVE_SERVICE - BASE + 1; private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; static { sCmdToString[NsdManager.DISCOVER_SERVICES - BASE] = "DISCOVER"; sCmdToString[NsdManager.STOP_DISCOVERY - BASE] = "STOP-DISCOVER"; sCmdToString[NsdManager.REGISTER_SERVICE - BASE] = "REGISTER"; sCmdToString[NsdManager.UNREGISTER_SERVICE - BASE] = "UNREGISTER"; sCmdToString[NsdManager.RESOLVE_SERVICE - BASE] = "RESOLVE"; } private static String cmdToString(int cmd) { cmd -= BASE; if ((cmd >= 0) && (cmd < sCmdToString.length)) { return sCmdToString[cmd]; } else { return null; } } private class NsdStateMachine extends StateMachine { private final DefaultState mDefaultState = new DefaultState(); Loading @@ -104,7 +85,7 @@ public class NsdService extends INsdManager.Stub { @Override protected String getWhatToString(int what) { return cmdToString(what); return NsdManager.nameOf(what); } /** Loading Loading @@ -271,7 +252,6 @@ public class NsdService extends INsdManager.Stub { public boolean processMessage(Message msg) { ClientInfo clientInfo; NsdServiceInfo servInfo; boolean result = HANDLED; int id; switch (msg.what) { case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: Loading @@ -280,11 +260,9 @@ public class NsdService extends INsdManager.Stub { mClients.size() == 0) { startMDnsDaemon(); } result = NOT_HANDLED; break; return NOT_HANDLED; case AsyncChannel.CMD_CHANNEL_DISCONNECTED: result = NOT_HANDLED; break; return NOT_HANDLED; case NsdManager.DISABLE: //TODO: cleanup clients transitionTo(mDisabledState); Loading Loading @@ -395,25 +373,23 @@ public class NsdService extends INsdManager.Stub { case NsdManager.NATIVE_DAEMON_EVENT: NativeEvent event = (NativeEvent) msg.obj; if (!handleNativeEvent(event.code, event.raw, event.cooked)) { result = NOT_HANDLED; return NOT_HANDLED; } break; default: result = NOT_HANDLED; break; return NOT_HANDLED; } return result; return HANDLED; } private boolean handleNativeEvent(int code, String raw, String[] cooked) { boolean handled = true; NsdServiceInfo servInfo; int id = Integer.parseInt(cooked[1]); ClientInfo clientInfo = mIdToClientInfoMap.get(id); if (clientInfo == null) { Slog.e(TAG, "Unique id with no client mapping: " + id); handled = false; return handled; String name = NativeResponseCode.nameOf(code); Slog.e(TAG, String.format("id %d for %s has no client mapping", id, name)); return false; } /* This goes in response as msg.arg2 */ Loading @@ -422,42 +398,42 @@ public class NsdService extends INsdManager.Stub { // This can happen because of race conditions. For example, // SERVICE_FOUND may race with STOP_SERVICE_DISCOVERY, // and we may get in this situation. Slog.d(TAG, "Notification for a listener that is no longer active: " + id); handled = false; return handled; String name = NativeResponseCode.nameOf(code); Slog.d(TAG, String.format( "Notification %s for listener id %d that is no longer active", name, id)); return false; } if (DBG) { String name = NativeResponseCode.nameOf(code); Slog.d(TAG, String.format("Native daemon message %s: %s", name, raw)); } switch (code) { case NativeResponseCode.SERVICE_FOUND: /* NNN uniqueId serviceName regType domain */ if (DBG) Slog.d(TAG, "SERVICE_FOUND Raw: " + raw); servInfo = new NsdServiceInfo(cooked[2], cooked[3]); clientInfo.mChannel.sendMessage(NsdManager.SERVICE_FOUND, 0, clientId, servInfo); break; case NativeResponseCode.SERVICE_LOST: /* NNN uniqueId serviceName regType domain */ if (DBG) Slog.d(TAG, "SERVICE_LOST Raw: " + raw); servInfo = new NsdServiceInfo(cooked[2], cooked[3]); clientInfo.mChannel.sendMessage(NsdManager.SERVICE_LOST, 0, clientId, servInfo); break; case NativeResponseCode.SERVICE_DISCOVERY_FAILED: /* NNN uniqueId errorCode */ if (DBG) Slog.d(TAG, "SERVICE_DISC_FAILED Raw: " + raw); clientInfo.mChannel.sendMessage(NsdManager.DISCOVER_SERVICES_FAILED, NsdManager.FAILURE_INTERNAL_ERROR, clientId); break; case NativeResponseCode.SERVICE_REGISTERED: /* NNN regId serviceName regType */ if (DBG) Slog.d(TAG, "SERVICE_REGISTERED Raw: " + raw); servInfo = new NsdServiceInfo(cooked[2], null); clientInfo.mChannel.sendMessage(NsdManager.REGISTER_SERVICE_SUCCEEDED, id, clientId, servInfo); break; case NativeResponseCode.SERVICE_REGISTRATION_FAILED: /* NNN regId errorCode */ if (DBG) Slog.d(TAG, "SERVICE_REGISTER_FAILED Raw: " + raw); clientInfo.mChannel.sendMessage(NsdManager.REGISTER_SERVICE_FAILED, NsdManager.FAILURE_INTERNAL_ERROR, clientId); break; Loading @@ -469,7 +445,6 @@ public class NsdService extends INsdManager.Stub { break; case NativeResponseCode.SERVICE_RESOLVED: /* NNN resolveId fullName hostName port txtlen txtdata */ if (DBG) Slog.d(TAG, "SERVICE_RESOLVED Raw: " + raw); int index = 0; while (index < cooked[2].length() && cooked[2].charAt(index) != '.') { if (cooked[2].charAt(index) == '\\') { Loading Loading @@ -506,7 +481,6 @@ public class NsdService extends INsdManager.Stub { break; case NativeResponseCode.SERVICE_RESOLUTION_FAILED: /* NNN resolveId errorCode */ if (DBG) Slog.d(TAG, "SERVICE_RESOLVE_FAILED Raw: " + raw); stopResolveService(id); removeRequestMap(clientId, id, clientInfo); clientInfo.mResolvedService = null; Loading @@ -518,13 +492,11 @@ public class NsdService extends INsdManager.Stub { stopGetAddrInfo(id); removeRequestMap(clientId, id, clientInfo); clientInfo.mResolvedService = null; if (DBG) Slog.d(TAG, "SERVICE_RESOLVE_FAILED Raw: " + raw); clientInfo.mChannel.sendMessage(NsdManager.RESOLVE_SERVICE_FAILED, NsdManager.FAILURE_INTERNAL_ERROR, clientId); break; case NativeResponseCode.SERVICE_GET_ADDR_SUCCESS: /* NNN resolveId hostname ttl addr */ if (DBG) Slog.d(TAG, "SERVICE_GET_ADDR_SUCCESS Raw: " + raw); try { clientInfo.mResolvedService.setHost(InetAddress.getByName(cooked[4])); clientInfo.mChannel.sendMessage(NsdManager.RESOLVE_SERVICE_SUCCEEDED, Loading @@ -538,10 +510,9 @@ public class NsdService extends INsdManager.Stub { clientInfo.mResolvedService = null; break; default: handled = false; break; return false; } return handled; return true; } } } Loading Loading @@ -570,9 +541,6 @@ public class NsdService extends INsdManager.Stub { return sb.toString(); } private NativeDaemonConnector mNativeConnector; private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1); private NsdService(Context context) { mContext = context; mContentResolver = context.getContentResolver(); Loading Loading @@ -633,7 +601,7 @@ public class NsdService extends INsdManager.Stub { } /* These should be in sync with system/netd/server/ResponseCode.h */ class NativeResponseCode { static final class NativeResponseCode { public static final int SERVICE_DISCOVERY_FAILED = 602; public static final int SERVICE_FOUND = 603; public static final int SERVICE_LOST = 604; Loading @@ -649,6 +617,29 @@ public class NsdService extends INsdManager.Stub { public static final int SERVICE_GET_ADDR_FAILED = 611; public static final int SERVICE_GET_ADDR_SUCCESS = 612; private static final SparseArray<String> CODE_NAMES = new SparseArray<>(); static { CODE_NAMES.put(SERVICE_DISCOVERY_FAILED, "SERVICE_DISCOVERY_FAILED"); CODE_NAMES.put(SERVICE_FOUND, "SERVICE_FOUND"); CODE_NAMES.put(SERVICE_LOST, "SERVICE_LOST"); CODE_NAMES.put(SERVICE_REGISTRATION_FAILED, "SERVICE_REGISTRATION_FAILED"); CODE_NAMES.put(SERVICE_REGISTERED, "SERVICE_REGISTERED"); CODE_NAMES.put(SERVICE_RESOLUTION_FAILED, "SERVICE_RESOLUTION_FAILED"); CODE_NAMES.put(SERVICE_RESOLVED, "SERVICE_RESOLVED"); CODE_NAMES.put(SERVICE_UPDATED, "SERVICE_UPDATED"); CODE_NAMES.put(SERVICE_UPDATE_FAILED, "SERVICE_UPDATE_FAILED"); CODE_NAMES.put(SERVICE_GET_ADDR_FAILED, "SERVICE_GET_ADDR_FAILED"); CODE_NAMES.put(SERVICE_GET_ADDR_SUCCESS, "SERVICE_GET_ADDR_SUCCESS"); } static String nameOf(int code) { String name = CODE_NAMES.get(code); if (name == null) { return Integer.toString(code); } return name; } } private class NativeEvent { Loading Loading @@ -868,10 +859,10 @@ public class NsdService extends INsdManager.Stub { private NsdServiceInfo mResolvedService; /* A map from client id to unique id sent to mDns */ private SparseArray<Integer> mClientIds = new SparseArray<Integer>(); private final SparseArray<Integer> mClientIds = new SparseArray<>(); /* A map from client id to the type of the request we had received */ private SparseArray<Integer> mClientRequests = new SparseArray<Integer>(); private final SparseArray<Integer> mClientRequests = new SparseArray<>(); private ClientInfo(AsyncChannel c, Messenger m) { mChannel = c; Loading Loading
core/java/android/net/nsd/NsdManager.java +41 −8 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ import com.android.internal.util.Protocol; * http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt * * <p> The API is asynchronous and responses to requests from an application are on listener * callbacks on a seperate thread. * callbacks on a seperate internal thread. * * <p> There are three main operations the API supports - registration, discovery and resolution. * <pre> Loading Loading @@ -119,8 +119,8 @@ import com.android.internal.util.Protocol; * {@see NsdServiceInfo} */ public final class NsdManager { private static final String TAG = "NsdManager"; INsdManager mService; private static final String TAG = NsdManager.class.getSimpleName(); private static final boolean DBG = false; /** * Broadcast intent action to indicate whether network service discovery is Loading @@ -130,8 +130,7 @@ public final class NsdManager { * @see #EXTRA_NSD_STATE */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_NSD_STATE_CHANGED = "android.net.nsd.STATE_CHANGED"; public static final String ACTION_NSD_STATE_CHANGED = "android.net.nsd.STATE_CHANGED"; /** * The lookup key for an int that indicates whether network service discovery is enabled Loading Loading @@ -208,13 +207,47 @@ public final class NsdManager { /** Dns based service discovery protocol */ public static final int PROTOCOL_DNS_SD = 0x0001; private Context mContext; private static final SparseArray<String> EVENT_NAMES = new SparseArray<>(); static { EVENT_NAMES.put(DISCOVER_SERVICES, "DISCOVER_SERVICES"); EVENT_NAMES.put(DISCOVER_SERVICES_STARTED, "DISCOVER_SERVICES_STARTED"); EVENT_NAMES.put(DISCOVER_SERVICES_FAILED, "DISCOVER_SERVICES_FAILED"); EVENT_NAMES.put(SERVICE_FOUND, "SERVICE_FOUND"); EVENT_NAMES.put(SERVICE_LOST, "SERVICE_LOST"); EVENT_NAMES.put(STOP_DISCOVERY, "STOP_DISCOVERY"); EVENT_NAMES.put(STOP_DISCOVERY_FAILED, "STOP_DISCOVERY_FAILED"); EVENT_NAMES.put(STOP_DISCOVERY_SUCCEEDED, "STOP_DISCOVERY_SUCCEEDED"); EVENT_NAMES.put(REGISTER_SERVICE, "REGISTER_SERVICE"); EVENT_NAMES.put(REGISTER_SERVICE_FAILED, "REGISTER_SERVICE_FAILED"); EVENT_NAMES.put(REGISTER_SERVICE_SUCCEEDED, "REGISTER_SERVICE_SUCCEEDED"); EVENT_NAMES.put(UNREGISTER_SERVICE, "UNREGISTER_SERVICE"); EVENT_NAMES.put(UNREGISTER_SERVICE_FAILED, "UNREGISTER_SERVICE_FAILED"); EVENT_NAMES.put(UNREGISTER_SERVICE_SUCCEEDED, "UNREGISTER_SERVICE_SUCCEEDED"); EVENT_NAMES.put(RESOLVE_SERVICE, "RESOLVE_SERVICE"); EVENT_NAMES.put(RESOLVE_SERVICE_FAILED, "RESOLVE_SERVICE_FAILED"); EVENT_NAMES.put(RESOLVE_SERVICE_SUCCEEDED, "RESOLVE_SERVICE_SUCCEEDED"); EVENT_NAMES.put(ENABLE, "ENABLE"); EVENT_NAMES.put(DISABLE, "DISABLE"); EVENT_NAMES.put(NATIVE_DAEMON_EVENT, "NATIVE_DAEMON_EVENT"); } /** @hide */ public static String nameOf(int event) { String name = EVENT_NAMES.get(event); if (name == null) { return Integer.toString(event); } return name; } private final INsdManager mService; private final Context mContext; private static final int INVALID_LISTENER_KEY = 0; private static final int BUSY_LISTENER_KEY = -1; private int mListenerKey = 1; private final SparseArray mListenerMap = new SparseArray(); private final SparseArray<NsdServiceInfo> mServiceMap = new SparseArray<NsdServiceInfo>(); private final SparseArray<NsdServiceInfo> mServiceMap = new SparseArray<>(); private final Object mMapLock = new Object(); private final AsyncChannel mAsyncChannel = new AsyncChannel(); Loading Loading @@ -300,6 +333,7 @@ public final class NsdManager { @Override public void handleMessage(Message message) { if (DBG) Log.d(TAG, "received " + nameOf(message.what)); switch (message.what) { case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); Loading Loading @@ -377,7 +411,6 @@ public final class NsdManager { // if the listener is already in the map, reject it. Otherwise, add it and // return its key. private int putListener(Object listener, NsdServiceInfo s) { if (listener == null) return INVALID_LISTENER_KEY; int key; Loading
services/core/java/com/android/server/NsdService.java +63 −72 Original line number Diff line number Diff line Loading @@ -56,46 +56,27 @@ public class NsdService extends INsdManager.Stub { private static final String TAG = "NsdService"; private static final String MDNS_TAG = "mDnsConnector"; private static final boolean DBG = false; private static final boolean DBG = true; private Context mContext; private ContentResolver mContentResolver; private NsdStateMachine mNsdStateMachine; private final Context mContext; private final ContentResolver mContentResolver; private final NsdStateMachine mNsdStateMachine; private final NativeDaemonConnector mNativeConnector; private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1); /** * Clients receiving asynchronous messages */ private HashMap<Messenger, ClientInfo> mClients = new HashMap<Messenger, ClientInfo>(); private final HashMap<Messenger, ClientInfo> mClients = new HashMap<>(); /* A map from unique id to client info */ private SparseArray<ClientInfo> mIdToClientInfoMap= new SparseArray<ClientInfo>(); private final SparseArray<ClientInfo> mIdToClientInfoMap= new SparseArray<>(); private AsyncChannel mReplyChannel = new AsyncChannel(); private final AsyncChannel mReplyChannel = new AsyncChannel(); private int INVALID_ID = 0; private static final int INVALID_ID = 0; private int mUniqueId = 1; private static final int BASE = Protocol.BASE_NSD_MANAGER; private static final int CMD_TO_STRING_COUNT = NsdManager.RESOLVE_SERVICE - BASE + 1; private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT]; static { sCmdToString[NsdManager.DISCOVER_SERVICES - BASE] = "DISCOVER"; sCmdToString[NsdManager.STOP_DISCOVERY - BASE] = "STOP-DISCOVER"; sCmdToString[NsdManager.REGISTER_SERVICE - BASE] = "REGISTER"; sCmdToString[NsdManager.UNREGISTER_SERVICE - BASE] = "UNREGISTER"; sCmdToString[NsdManager.RESOLVE_SERVICE - BASE] = "RESOLVE"; } private static String cmdToString(int cmd) { cmd -= BASE; if ((cmd >= 0) && (cmd < sCmdToString.length)) { return sCmdToString[cmd]; } else { return null; } } private class NsdStateMachine extends StateMachine { private final DefaultState mDefaultState = new DefaultState(); Loading @@ -104,7 +85,7 @@ public class NsdService extends INsdManager.Stub { @Override protected String getWhatToString(int what) { return cmdToString(what); return NsdManager.nameOf(what); } /** Loading Loading @@ -271,7 +252,6 @@ public class NsdService extends INsdManager.Stub { public boolean processMessage(Message msg) { ClientInfo clientInfo; NsdServiceInfo servInfo; boolean result = HANDLED; int id; switch (msg.what) { case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: Loading @@ -280,11 +260,9 @@ public class NsdService extends INsdManager.Stub { mClients.size() == 0) { startMDnsDaemon(); } result = NOT_HANDLED; break; return NOT_HANDLED; case AsyncChannel.CMD_CHANNEL_DISCONNECTED: result = NOT_HANDLED; break; return NOT_HANDLED; case NsdManager.DISABLE: //TODO: cleanup clients transitionTo(mDisabledState); Loading Loading @@ -395,25 +373,23 @@ public class NsdService extends INsdManager.Stub { case NsdManager.NATIVE_DAEMON_EVENT: NativeEvent event = (NativeEvent) msg.obj; if (!handleNativeEvent(event.code, event.raw, event.cooked)) { result = NOT_HANDLED; return NOT_HANDLED; } break; default: result = NOT_HANDLED; break; return NOT_HANDLED; } return result; return HANDLED; } private boolean handleNativeEvent(int code, String raw, String[] cooked) { boolean handled = true; NsdServiceInfo servInfo; int id = Integer.parseInt(cooked[1]); ClientInfo clientInfo = mIdToClientInfoMap.get(id); if (clientInfo == null) { Slog.e(TAG, "Unique id with no client mapping: " + id); handled = false; return handled; String name = NativeResponseCode.nameOf(code); Slog.e(TAG, String.format("id %d for %s has no client mapping", id, name)); return false; } /* This goes in response as msg.arg2 */ Loading @@ -422,42 +398,42 @@ public class NsdService extends INsdManager.Stub { // This can happen because of race conditions. For example, // SERVICE_FOUND may race with STOP_SERVICE_DISCOVERY, // and we may get in this situation. Slog.d(TAG, "Notification for a listener that is no longer active: " + id); handled = false; return handled; String name = NativeResponseCode.nameOf(code); Slog.d(TAG, String.format( "Notification %s for listener id %d that is no longer active", name, id)); return false; } if (DBG) { String name = NativeResponseCode.nameOf(code); Slog.d(TAG, String.format("Native daemon message %s: %s", name, raw)); } switch (code) { case NativeResponseCode.SERVICE_FOUND: /* NNN uniqueId serviceName regType domain */ if (DBG) Slog.d(TAG, "SERVICE_FOUND Raw: " + raw); servInfo = new NsdServiceInfo(cooked[2], cooked[3]); clientInfo.mChannel.sendMessage(NsdManager.SERVICE_FOUND, 0, clientId, servInfo); break; case NativeResponseCode.SERVICE_LOST: /* NNN uniqueId serviceName regType domain */ if (DBG) Slog.d(TAG, "SERVICE_LOST Raw: " + raw); servInfo = new NsdServiceInfo(cooked[2], cooked[3]); clientInfo.mChannel.sendMessage(NsdManager.SERVICE_LOST, 0, clientId, servInfo); break; case NativeResponseCode.SERVICE_DISCOVERY_FAILED: /* NNN uniqueId errorCode */ if (DBG) Slog.d(TAG, "SERVICE_DISC_FAILED Raw: " + raw); clientInfo.mChannel.sendMessage(NsdManager.DISCOVER_SERVICES_FAILED, NsdManager.FAILURE_INTERNAL_ERROR, clientId); break; case NativeResponseCode.SERVICE_REGISTERED: /* NNN regId serviceName regType */ if (DBG) Slog.d(TAG, "SERVICE_REGISTERED Raw: " + raw); servInfo = new NsdServiceInfo(cooked[2], null); clientInfo.mChannel.sendMessage(NsdManager.REGISTER_SERVICE_SUCCEEDED, id, clientId, servInfo); break; case NativeResponseCode.SERVICE_REGISTRATION_FAILED: /* NNN regId errorCode */ if (DBG) Slog.d(TAG, "SERVICE_REGISTER_FAILED Raw: " + raw); clientInfo.mChannel.sendMessage(NsdManager.REGISTER_SERVICE_FAILED, NsdManager.FAILURE_INTERNAL_ERROR, clientId); break; Loading @@ -469,7 +445,6 @@ public class NsdService extends INsdManager.Stub { break; case NativeResponseCode.SERVICE_RESOLVED: /* NNN resolveId fullName hostName port txtlen txtdata */ if (DBG) Slog.d(TAG, "SERVICE_RESOLVED Raw: " + raw); int index = 0; while (index < cooked[2].length() && cooked[2].charAt(index) != '.') { if (cooked[2].charAt(index) == '\\') { Loading Loading @@ -506,7 +481,6 @@ public class NsdService extends INsdManager.Stub { break; case NativeResponseCode.SERVICE_RESOLUTION_FAILED: /* NNN resolveId errorCode */ if (DBG) Slog.d(TAG, "SERVICE_RESOLVE_FAILED Raw: " + raw); stopResolveService(id); removeRequestMap(clientId, id, clientInfo); clientInfo.mResolvedService = null; Loading @@ -518,13 +492,11 @@ public class NsdService extends INsdManager.Stub { stopGetAddrInfo(id); removeRequestMap(clientId, id, clientInfo); clientInfo.mResolvedService = null; if (DBG) Slog.d(TAG, "SERVICE_RESOLVE_FAILED Raw: " + raw); clientInfo.mChannel.sendMessage(NsdManager.RESOLVE_SERVICE_FAILED, NsdManager.FAILURE_INTERNAL_ERROR, clientId); break; case NativeResponseCode.SERVICE_GET_ADDR_SUCCESS: /* NNN resolveId hostname ttl addr */ if (DBG) Slog.d(TAG, "SERVICE_GET_ADDR_SUCCESS Raw: " + raw); try { clientInfo.mResolvedService.setHost(InetAddress.getByName(cooked[4])); clientInfo.mChannel.sendMessage(NsdManager.RESOLVE_SERVICE_SUCCEEDED, Loading @@ -538,10 +510,9 @@ public class NsdService extends INsdManager.Stub { clientInfo.mResolvedService = null; break; default: handled = false; break; return false; } return handled; return true; } } } Loading Loading @@ -570,9 +541,6 @@ public class NsdService extends INsdManager.Stub { return sb.toString(); } private NativeDaemonConnector mNativeConnector; private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1); private NsdService(Context context) { mContext = context; mContentResolver = context.getContentResolver(); Loading Loading @@ -633,7 +601,7 @@ public class NsdService extends INsdManager.Stub { } /* These should be in sync with system/netd/server/ResponseCode.h */ class NativeResponseCode { static final class NativeResponseCode { public static final int SERVICE_DISCOVERY_FAILED = 602; public static final int SERVICE_FOUND = 603; public static final int SERVICE_LOST = 604; Loading @@ -649,6 +617,29 @@ public class NsdService extends INsdManager.Stub { public static final int SERVICE_GET_ADDR_FAILED = 611; public static final int SERVICE_GET_ADDR_SUCCESS = 612; private static final SparseArray<String> CODE_NAMES = new SparseArray<>(); static { CODE_NAMES.put(SERVICE_DISCOVERY_FAILED, "SERVICE_DISCOVERY_FAILED"); CODE_NAMES.put(SERVICE_FOUND, "SERVICE_FOUND"); CODE_NAMES.put(SERVICE_LOST, "SERVICE_LOST"); CODE_NAMES.put(SERVICE_REGISTRATION_FAILED, "SERVICE_REGISTRATION_FAILED"); CODE_NAMES.put(SERVICE_REGISTERED, "SERVICE_REGISTERED"); CODE_NAMES.put(SERVICE_RESOLUTION_FAILED, "SERVICE_RESOLUTION_FAILED"); CODE_NAMES.put(SERVICE_RESOLVED, "SERVICE_RESOLVED"); CODE_NAMES.put(SERVICE_UPDATED, "SERVICE_UPDATED"); CODE_NAMES.put(SERVICE_UPDATE_FAILED, "SERVICE_UPDATE_FAILED"); CODE_NAMES.put(SERVICE_GET_ADDR_FAILED, "SERVICE_GET_ADDR_FAILED"); CODE_NAMES.put(SERVICE_GET_ADDR_SUCCESS, "SERVICE_GET_ADDR_SUCCESS"); } static String nameOf(int code) { String name = CODE_NAMES.get(code); if (name == null) { return Integer.toString(code); } return name; } } private class NativeEvent { Loading Loading @@ -868,10 +859,10 @@ public class NsdService extends INsdManager.Stub { private NsdServiceInfo mResolvedService; /* A map from client id to unique id sent to mDns */ private SparseArray<Integer> mClientIds = new SparseArray<Integer>(); private final SparseArray<Integer> mClientIds = new SparseArray<>(); /* A map from client id to the type of the request we had received */ private SparseArray<Integer> mClientRequests = new SparseArray<Integer>(); private final SparseArray<Integer> mClientRequests = new SparseArray<>(); private ClientInfo(AsyncChannel c, Messenger m) { mChannel = c; Loading