NsdManager.java revision 7d024d372431effc87168afdc7cbe387680c4935
17d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff/*
27d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Copyright (C) 2012 The Android Open Source Project
37d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *
47d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License");
57d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * you may not use this file except in compliance with the License.
67d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * You may obtain a copy of the License at
77d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *
87d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *      http://www.apache.org/licenses/LICENSE-2.0
97d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *
107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Unless required by applicable law or agreed to in writing, software
117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS,
127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * See the License for the specific language governing permissions and
147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * limitations under the License.
157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */
167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffpackage android.net.nsd;
187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.content.Context;
207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Binder;
217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.IBinder;
227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Handler;
237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Looper;
247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Message;
257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.RemoteException;
267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Messenger;
277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.util.Log;
287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport com.android.internal.util.AsyncChannel;
307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport com.android.internal.util.Protocol;
317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff/**
337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * The Network Service Discovery Manager class provides the API for service
347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * discovery. Service discovery enables applications to discover and connect with services
357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * on a network. Example applications include a game application discovering another instance
367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * of the game application or a printer application discovering other printers on a network.
377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *
387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * <p> The API is asynchronous and responses to requests from an application are on listener
397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * callbacks provided by the application. The application needs to do an initialization with
407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * {@link #initialize} before doing any operation.
417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *
427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * <p> Android currently supports DNS based service discovery and it is limited to a local
437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * network with the use of multicast DNS. In future, this class will be
447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * extended to support other service discovery mechanisms.
457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *
467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Get an instance of this class by calling {@link android.content.Context#getSystemService(String)
477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Context.getSystemService(Context.NSD_SERVICE)}.
487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @hide
497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff *
507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */
517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffpublic class NsdManager {
527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    private static final String TAG = "NsdManager";
537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    INsdManager mService;
547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    private static final int BASE = Protocol.BASE_NSD_MANAGER;
567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int DISCOVER_SERVICES                       = BASE + 1;
597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int DISCOVER_SERVICES_STARTED               = BASE + 2;
617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int DISCOVER_SERVICES_FAILED                = BASE + 3;
637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int SERVICE_FOUND                           = BASE + 4;
657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int SERVICE_LOST                            = BASE + 5;
677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int STOP_DISCOVERY                          = BASE + 6;
707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int STOP_DISCOVERY_FAILED                   = BASE + 7;
727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int STOP_DISCOVERY_SUCCEEDED                = BASE + 8;
747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int REGISTER_SERVICE                        = BASE + 9;
777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int REGISTER_SERVICE_FAILED                 = BASE + 10;
797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int REGISTER_SERVICE_SUCCEEDED              = BASE + 11;
817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int UPDATE_SERVICE                          = BASE + 12;
847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int UPDATE_SERVICE_FAILED                   = BASE + 13;
867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int UPDATE_SERVICE_SUCCEEDED                = BASE + 14;
887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int RESOLVE_SERVICE                         = BASE + 15;
917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int RESOLVE_SERVICE_FAILED                  = BASE + 16;
937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** @hide */
947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int RESOLVE_SERVICE_SUCCEEDED               = BASE + 17;
957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Create a new Nsd instance. Applications use
987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * {@link android.content.Context#NSD_SERVICE Context.NSD_SERVICE}.
1007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * @param service the Binder interface
1017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * @hide - hide this because it takes in a parameter of type INsdManager, which
1027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * is a system private class.
1037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
1047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public NsdManager(INsdManager service) {
1057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        mService = service;
1067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
1077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
1097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Indicates that the operation failed due to an internal error.
1107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
1117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int ERROR               = 0;
1127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
1147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Indicates that the operation failed because service discovery is unsupported on the device.
1157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
1167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int UNSUPPORTED         = 1;
1177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
1197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Indicates that the operation failed because the framework is busy and
1207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * unable to service the request
1217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
1227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static final int BUSY                = 2;
1237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /** Interface for callback invocation when framework channel is connected or lost */
1257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public interface ChannelListener {
1267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onChannelConnected(Channel c);
1277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        /**
1287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff         * The channel to the framework has been disconnected.
1297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff         * Application could try re-initializing using {@link #initialize}
1307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff         */
1317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onChannelDisconnected();
1327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
1337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public interface ActionListener {
1357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onFailure(int errorCode);
1377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onSuccess();
1397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
1407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public interface DnsSdDiscoveryListener {
1427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onFailure(int errorCode);
1447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onStarted(String registrationType);
1467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onServiceFound(DnsSdServiceInfo serviceInfo);
1487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onServiceLost(DnsSdServiceInfo serviceInfo);
1507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
1527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public interface DnsSdRegisterListener {
1547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onFailure(int errorCode);
1567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onServiceRegistered(int registeredId, DnsSdServiceInfo serviceInfo);
1587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
1597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public interface DnsSdUpdateRegistrationListener {
1617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onFailure(int errorCode);
1637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onServiceUpdated(int registeredId, DnsSdTxtRecord txtRecord);
1657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
1667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public interface DnsSdResolveListener {
1687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onFailure(int errorCode);
1707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        public void onServiceResolved(DnsSdServiceInfo serviceInfo);
1727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
1737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
1757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * A channel that connects the application to the NetworkService framework.
1767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Most service operations require a Channel as an argument. An instance of Channel is obtained
1777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * by doing a call on {@link #initialize}
1787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
1797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public static class Channel {
1807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        Channel(Looper looper, ChannelListener l) {
1817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            mAsyncChannel = new AsyncChannel();
1827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            mHandler = new ServiceHandler(looper);
1837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            mChannelListener = l;
1847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        }
1857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        private ChannelListener mChannelListener;
1867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        private DnsSdDiscoveryListener mDnsSdDiscoveryListener;
1877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        private ActionListener mDnsSdStopDiscoveryListener;
1887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        private DnsSdRegisterListener mDnsSdRegisterListener;
1897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        private DnsSdUpdateRegistrationListener mDnsSdUpdateListener;
1907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        private DnsSdResolveListener mDnsSdResolveListener;
1917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        AsyncChannel mAsyncChannel;
1937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        ServiceHandler mHandler;
1947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        class ServiceHandler extends Handler {
1957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            ServiceHandler(Looper looper) {
1967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                super(looper);
1977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            }
1987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
1997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            @Override
2007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            public void handleMessage(Message message) {
2017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                switch (message.what) {
2027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
2037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
2047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED:
2067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mChannelListener != null) {
2077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mChannelListener.onChannelConnected(Channel.this);
2087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
2117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mChannelListener != null) {
2127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mChannelListener.onChannelDisconnected();
2137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mChannelListener = null;
2147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case DISCOVER_SERVICES_STARTED:
2177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdDiscoveryListener != null) {
2187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdDiscoveryListener.onStarted((String) message.obj);
2197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case DISCOVER_SERVICES_FAILED:
2227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdDiscoveryListener != null) {
2237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdDiscoveryListener.onFailure(message.arg1);
2247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case SERVICE_FOUND:
2277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdDiscoveryListener != null) {
2287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdDiscoveryListener.onServiceFound(
2297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                                    (DnsSdServiceInfo) message.obj);
2307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case SERVICE_LOST:
2337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdDiscoveryListener != null) {
2347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdDiscoveryListener.onServiceLost(
2357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                                    (DnsSdServiceInfo) message.obj);
2367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case STOP_DISCOVERY_FAILED:
2397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdStopDiscoveryListener != null) {
2407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdStopDiscoveryListener.onFailure(message.arg1);
2417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case STOP_DISCOVERY_SUCCEEDED:
2447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdStopDiscoveryListener != null) {
2457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdStopDiscoveryListener.onSuccess();
2467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case REGISTER_SERVICE_FAILED:
2497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdRegisterListener != null) {
2507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdRegisterListener.onFailure(message.arg1);
2517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case REGISTER_SERVICE_SUCCEEDED:
2547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdRegisterListener != null) {
2557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdRegisterListener.onServiceRegistered(message.arg1,
2567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                                    (DnsSdServiceInfo) message.obj);
2577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case UPDATE_SERVICE_FAILED:
2607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdUpdateListener != null) {
2617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdUpdateListener.onFailure(message.arg1);
2627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case UPDATE_SERVICE_SUCCEEDED:
2657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdUpdateListener != null) {
2667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdUpdateListener.onServiceUpdated(message.arg1,
2677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                                    (DnsSdTxtRecord) message.obj);
2687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case RESOLVE_SERVICE_FAILED:
2717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdResolveListener != null) {
2727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdResolveListener.onFailure(message.arg1);
2737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    case RESOLVE_SERVICE_SUCCEEDED:
2767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        if (mDnsSdResolveListener != null) {
2777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                            mDnsSdResolveListener.onServiceResolved(
2787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                                    (DnsSdServiceInfo) message.obj);
2797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        }
2807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                    default:
2827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        Log.d(TAG, "Ignored " + message);
2837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                        break;
2847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                }
2857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            }
2867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        }
2877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff   }
2887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
2897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
2907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Registers the application with the service discovery framework. This function
2917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * must be the first to be called before any other operations are performed. No service
2927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * discovery operations must be performed until the ChannelListener callback notifies
2937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * that the channel is connected
2947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     *
2957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * @param srcContext is the context of the source
2967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * @param srcLooper is the Looper on which the callbacks are receivied
2977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * @param listener for callback at loss of framework communication.
2987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
2997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void initialize(Context srcContext, Looper srcLooper, ChannelListener listener) {
3007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        Messenger messenger = getMessenger();
3017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (messenger == null) throw new RuntimeException("Failed to initialize");
3027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (listener == null) throw new IllegalArgumentException("ChannelListener cannot be null");
3037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        Channel c = new Channel(srcLooper, listener);
3057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mAsyncChannel.connect(srcContext, c.mHandler, messenger);
3067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
3097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Set the listener for service discovery. Can be null.
3107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
3117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void setDiscoveryListener(Channel c, DnsSdDiscoveryListener b) {
3127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mDnsSdDiscoveryListener = b;
3147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
3177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Set the listener for stop service discovery. Can be null.
3187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
3197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void setStopDiscoveryListener(Channel c, ActionListener a) {
3207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mDnsSdStopDiscoveryListener = a;
3227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
3257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Set the listener for service registration. Can be null.
3267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
3277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void setRegisterListener(Channel c, DnsSdRegisterListener b) {
3287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mDnsSdRegisterListener = b;
3307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
3337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Set the listener for service registration. Can be null.
3347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
3357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void setUpdateRegistrationListener(Channel c, DnsSdUpdateRegistrationListener b) {
3367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mDnsSdUpdateListener = b;
3387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
3417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Set the listener for service resolution. Can be null.
3427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
3437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void setResolveListener(Channel c, DnsSdResolveListener b) {
3447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mDnsSdResolveListener = b;
3467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void registerService(Channel c, DnsSdServiceInfo serviceInfo) {
3497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (serviceInfo == null) throw new IllegalArgumentException("Null serviceInfo");
3517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mAsyncChannel.sendMessage(REGISTER_SERVICE, serviceInfo);
3527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void updateService(Channel c, int registeredId, DnsSdTxtRecord txtRecord) {
3557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mAsyncChannel.sendMessage(UPDATE_SERVICE, registeredId, 0, txtRecord);
3577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void discoverServices(Channel c, String serviceType) {
3607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c.mDnsSdDiscoveryListener == null) throw new
3627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                IllegalStateException("Discovery listener needs to be set first");
3637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        DnsSdServiceInfo s = new DnsSdServiceInfo();
3647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        s.setServiceType(serviceType);
3657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mAsyncChannel.sendMessage(DISCOVER_SERVICES, s);
3667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void stopServiceDiscovery(Channel c) {
3697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mAsyncChannel.sendMessage(STOP_DISCOVERY);
3717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    public void resolveService(Channel c, DnsSdServiceInfo serviceInfo) {
3747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
3757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (serviceInfo == null) throw new IllegalArgumentException("Null serviceInfo");
3767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        if (c.mDnsSdResolveListener == null) throw new
3777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff                IllegalStateException("Resolve listener needs to be set first");
3787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        c.mAsyncChannel.sendMessage(RESOLVE_SERVICE, serviceInfo);
3797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff
3817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    /**
3827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * Get a reference to NetworkService handler. This is used to establish
3837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * an AsyncChannel communication with the service
3847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     *
3857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     * @return Messenger pointing to the NetworkService handler
3867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff     */
3877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    private Messenger getMessenger() {
3887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        try {
3897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            return mService.getMessenger();
3907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        } catch (RemoteException e) {
3917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff            return null;
3927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff        }
3937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff    }
3947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff}
395