121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/*
221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Copyright (C) 2012 The Android Open Source Project
321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *
421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License");
521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * you may not use this file except in compliance with the License.
621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * You may obtain a copy of the License at
721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *
821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *      http://www.apache.org/licenses/LICENSE-2.0
921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *
1021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Unless required by applicable law or agreed to in writing, software
1121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS,
1221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * See the License for the specific language governing permissions and
1421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * limitations under the License.
1521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */
1621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
1721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffpackage android.net.wifi.p2p.nsd;
1821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
1921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.ArrayList;
2021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.List;
21fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkeyimport java.util.Locale;
2221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.UUID;
2321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
2421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/**
258bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * A class for storing Upnp service information that is advertised
268bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * over a Wi-Fi peer-to-peer setup.
278bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff *
288bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see android.net.wifi.p2p.WifiP2pManager#addLocalService}
298bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see android.net.wifi.p2p.WifiP2pManager#removeLocalService}
308bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pServiceInfo}
318bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pDnsSdServiceInfo}
3221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */
3321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffpublic class WifiP2pUpnpServiceInfo extends WifiP2pServiceInfo {
3421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
3521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
3621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * UPnP version 1.0.
3721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
3821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <pre>Query Version should always be set to 0x10 if the query values are
3921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * compatible with UPnP Device Architecture 1.0.
4021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @hide
4121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
4221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final int VERSION_1_0 = 0x10;
4321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
4421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
4521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * This constructor is only used in newInstance().
4621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
4721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param queryList
4821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private WifiP2pUpnpServiceInfo(List<String> queryList) {
5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        super(queryList);
5121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
5221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
5321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
5421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Create UPnP service information object.
5521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
5621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param uuid a string representation of this UUID in the following format,
5721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  as per <a href="http://www.ietf.org/rfc/rfc4122.txt">RFC 4122</a>.<br>
5821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  e.g) 6859dede-8574-59ab-9332-123456789012
5921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param device a string representation of this device in the following format,
6021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * as per
6121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <a href="http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf">
6221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  UPnP Device Architecture1.1</a><br>
6321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  e.g) urn:schemas-upnp-org:device:MediaServer:1
6421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param services a string representation of this service in the following format,
6521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * as per
6621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <a href="http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf">
6721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  UPnP Device Architecture1.1</a><br>
6821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  e.g) urn:schemas-upnp-org:service:ContentDirectory:1
6921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return UPnP service information object.
7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
7121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static WifiP2pUpnpServiceInfo newInstance(String uuid,
7221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            String device, List<String> services) {
7321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (uuid == null || device == null) {
7421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            throw new IllegalArgumentException("uuid or device cannnot be null");
7521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
7621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        UUID.fromString(uuid);
7721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
7821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        ArrayList<String> info = new ArrayList<String>();
7921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
8021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        info.add(createSupplicantQuery(uuid, null));
8121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        info.add(createSupplicantQuery(uuid, "upnp:rootdevice"));
8221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        info.add(createSupplicantQuery(uuid, device));
8321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (services != null) {
8421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            for (String service:services) {
8521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                info.add(createSupplicantQuery(uuid, service));
8621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
8821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return new WifiP2pUpnpServiceInfo(info);
9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
9121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
9221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
9321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Create wpa_supplicant service query for upnp.
9421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
9521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param uuid
9621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param data
9721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return wpa_supplicant service query for upnp
9821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
9921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private static String createSupplicantQuery(String uuid, String data) {
10021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        StringBuffer sb = new StringBuffer();
10121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append("upnp ");
102fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey        sb.append(String.format(Locale.US, "%02x ", VERSION_1_0));
10321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append("uuid:");
10421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append(uuid);
10521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (data != null) {
10621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            sb.append("::");
10721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            sb.append(data);
10821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
10921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return sb.toString();
11021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
11121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff}
112