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;
2121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.UUID;
2221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
2321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/**
248bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * A class for storing Upnp service information that is advertised
258bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * over a Wi-Fi peer-to-peer setup.
268bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff *
278bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see android.net.wifi.p2p.WifiP2pManager#addLocalService}
288bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see android.net.wifi.p2p.WifiP2pManager#removeLocalService}
298bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pServiceInfo}
308bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pDnsSdServiceInfo}
3121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */
3221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffpublic class WifiP2pUpnpServiceInfo extends WifiP2pServiceInfo {
3321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
3421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
3521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * UPnP version 1.0.
3621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
3721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <pre>Query Version should always be set to 0x10 if the query values are
3821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * compatible with UPnP Device Architecture 1.0.
3921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @hide
4021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
4121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final int VERSION_1_0 = 0x10;
4221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
4321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
4421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * This constructor is only used in newInstance().
4521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
4621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param queryList
4721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
4821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private WifiP2pUpnpServiceInfo(List<String> queryList) {
4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        super(queryList);
5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
5121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
5221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
5321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Create UPnP service information object.
5421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
5521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param uuid a string representation of this UUID in the following format,
5621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  as per <a href="http://www.ietf.org/rfc/rfc4122.txt">RFC 4122</a>.<br>
5721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  e.g) 6859dede-8574-59ab-9332-123456789012
5821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param device a string representation of this device in the following format,
5921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * as per
6021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <a href="http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf">
6121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  UPnP Device Architecture1.1</a><br>
6221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  e.g) urn:schemas-upnp-org:device:MediaServer:1
6321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param services a string representation of this service in the following format,
6421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * as per
6521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <a href="http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf">
6621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  UPnP Device Architecture1.1</a><br>
6721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  e.g) urn:schemas-upnp-org:service:ContentDirectory:1
6821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return UPnP service information object.
6921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static WifiP2pUpnpServiceInfo newInstance(String uuid,
7121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            String device, List<String> services) {
7221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (uuid == null || device == null) {
7321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            throw new IllegalArgumentException("uuid or device cannnot be null");
7421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
7521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        UUID.fromString(uuid);
7621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
7721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        ArrayList<String> info = new ArrayList<String>();
7821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
7921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        info.add(createSupplicantQuery(uuid, null));
8021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        info.add(createSupplicantQuery(uuid, "upnp:rootdevice"));
8121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        info.add(createSupplicantQuery(uuid, device));
8221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (services != null) {
8321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            for (String service:services) {
8421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                info.add(createSupplicantQuery(uuid, service));
8521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
8621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
8821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return new WifiP2pUpnpServiceInfo(info);
8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
9121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
9221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Create wpa_supplicant service query for upnp.
9321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
9421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param uuid
9521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param data
9621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return wpa_supplicant service query for upnp
9721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
9821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private static String createSupplicantQuery(String uuid, String data) {
9921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        StringBuffer sb = new StringBuffer();
10021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append("upnp ");
10121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append(String.format("%02x ", VERSION_1_0));
10221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append("uuid:");
10321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append(uuid);
10421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (data != null) {
10521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            sb.append("::");
10621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            sb.append(data);
10721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
10821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return sb.toString();
10921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
11021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff}
111