/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.nsdchat; import android.content.Context; import android.net.nsd.NsdServiceInfo; import android.net.nsd.NsdManager; import android.util.Log; public class NsdHelper { Context mContext; NsdManager mNsdManager; NsdManager.ResolveListener mResolveListener; NsdManager.DiscoveryListener mDiscoveryListener; NsdManager.RegistrationListener mRegistrationListener; public static final String SERVICE_TYPE = "_http._tcp."; public static final String TAG = "NsdHelper"; public String mServiceName = "NsdChat"; NsdServiceInfo mService; public NsdHelper(Context context) { mContext = context; mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE); } public void initializeNsd() { initializeResolveListener(); //mNsdManager.init(mContext.getMainLooper(), this); } public void initializeDiscoveryListener() { mDiscoveryListener = new NsdManager.DiscoveryListener() { @Override public void onDiscoveryStarted(String regType) { Log.d(TAG, "Service discovery started"); } @Override public void onServiceFound(NsdServiceInfo service) { Log.d(TAG, "Service discovery success" + service); if (!service.getServiceType().equals(SERVICE_TYPE)) { Log.d(TAG, "Unknown Service Type: " + service.getServiceType()); } else if (service.getServiceName().equals(mServiceName)) { Log.d(TAG, "Same machine: " + mServiceName); } else if (service.getServiceName().contains(mServiceName)){ mNsdManager.resolveService(service, mResolveListener); } } @Override public void onServiceLost(NsdServiceInfo service) { Log.e(TAG, "service lost" + service); if (mService == service) { mService = null; } } @Override public void onDiscoveryStopped(String serviceType) { Log.i(TAG, "Discovery stopped: " + serviceType); } @Override public void onStartDiscoveryFailed(String serviceType, int errorCode) { Log.e(TAG, "Discovery failed: Error code:" + errorCode); } @Override public void onStopDiscoveryFailed(String serviceType, int errorCode) { Log.e(TAG, "Discovery failed: Error code:" + errorCode); } }; } public void initializeResolveListener() { mResolveListener = new NsdManager.ResolveListener() { @Override public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { Log.e(TAG, "Resolve failed" + errorCode); } @Override public void onServiceResolved(NsdServiceInfo serviceInfo) { Log.e(TAG, "Resolve Succeeded. " + serviceInfo); if (serviceInfo.getServiceName().equals(mServiceName)) { Log.d(TAG, "Same IP."); return; } mService = serviceInfo; } }; } public void initializeRegistrationListener() { mRegistrationListener = new NsdManager.RegistrationListener() { @Override public void onServiceRegistered(NsdServiceInfo NsdServiceInfo) { mServiceName = NsdServiceInfo.getServiceName(); Log.d(TAG, "Service registered: " + mServiceName); } @Override public void onRegistrationFailed(NsdServiceInfo arg0, int arg1) { Log.d(TAG, "Service registration failed: " + arg1); } @Override public void onServiceUnregistered(NsdServiceInfo arg0) { Log.d(TAG, "Service unregistered: " + arg0.getServiceName()); } @Override public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { Log.d(TAG, "Service unregistration failed: " + errorCode); } }; } public void registerService(int port) { tearDown(); // Cancel any previous registration request initializeRegistrationListener(); NsdServiceInfo serviceInfo = new NsdServiceInfo(); serviceInfo.setPort(port); serviceInfo.setServiceName(mServiceName); serviceInfo.setServiceType(SERVICE_TYPE); mNsdManager.registerService( serviceInfo, NsdManager.PROTOCOL_DNS_SD, mRegistrationListener); } public void discoverServices() { stopDiscovery(); // Cancel any existing discovery request initializeDiscoveryListener(); mNsdManager.discoverServices( SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener); } public void stopDiscovery() { if (mDiscoveryListener != null) { try { mNsdManager.stopServiceDiscovery(mDiscoveryListener); } finally { } mDiscoveryListener = null; } } public NsdServiceInfo getChosenServiceInfo() { return mService; } public void tearDown() { if (mRegistrationListener != null) { try { mNsdManager.unregisterService(mRegistrationListener); } finally { } mRegistrationListener = null; } } }