1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net.wifi.p2p.nsd;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21
22import java.util.ArrayList;
23import java.util.List;
24
25/**
26 * A class for storing service information that is advertised
27 * over a Wi-Fi peer-to-peer setup
28 *
29 * @see WifiP2pUpnpServiceInfo
30 * @see WifiP2pDnsSdServiceInfo
31 */
32public class WifiP2pServiceInfo implements Parcelable {
33
34    /**
35     * All service protocol types.
36     */
37    public static final int SERVICE_TYPE_ALL             = 0;
38
39    /**
40     * DNS based service discovery protocol.
41     */
42    public static final int SERVICE_TYPE_BONJOUR         = 1;
43
44    /**
45     * UPnP protocol.
46     */
47    public static final int SERVICE_TYPE_UPNP            = 2;
48
49    /**
50     * WS-Discovery protocol
51     * @hide
52     */
53    public static final int SERVICE_TYPE_WS_DISCOVERY    = 3;
54
55    /**
56     * Vendor Specific protocol
57     */
58    public static final int SERVICE_TYPE_VENDOR_SPECIFIC = 255;
59
60    /**
61     * the list of query string for wpa_supplicant
62     *
63     * e.g)
64     * # IP Printing over TCP (PTR) (RDATA=MyPrinter._ipp._tcp.local.)
65     * {"bonjour", "045f697070c00c000c01", "094d795072696e746572c027"
66     *
67     * # IP Printing over TCP (TXT) (RDATA=txtvers=1,pdl=application/postscript)
68     * {"bonjour", "096d797072696e746572045f697070c00c001001",
69     *  "09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074"}
70     *
71     * [UPnP]
72     * # UPnP uuid
73     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012"}
74     *
75     * # UPnP rootdevice
76     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"}
77     *
78     * # UPnP device
79     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp
80     * -org:device:InternetGatewayDevice:1"}
81     *
82     *  # UPnP service
83     * {"upnp", "10", "uuid:6859dede-8574-59ab-9322-123456789012::urn:schemas-upnp
84     * -org:service:ContentDirectory:2"}
85     */
86    private List<String> mQueryList;
87
88    /**
89     * This is only used in subclass.
90     *
91     * @param queryList query string for wpa_supplicant
92     * @hide
93     */
94    protected WifiP2pServiceInfo(List<String> queryList) {
95        if (queryList == null) {
96            throw new IllegalArgumentException("query list cannot be null");
97        }
98        mQueryList = queryList;
99    }
100
101   /**
102    * Return the list of the query string for wpa_supplicant.
103    *
104    * @return the list of the query string for wpa_supplicant.
105    * @hide
106    */
107   public List<String> getSupplicantQueryList() {
108       return mQueryList;
109   }
110
111   /**
112    * Converts byte array to hex string.
113    *
114    * @param data
115    * @return hex string.
116    * @hide
117    */
118   static String bin2HexStr(byte[] data) {
119       StringBuffer sb = new StringBuffer();
120
121       for (byte b: data) {
122           String s = null;
123           try {
124               s = Integer.toHexString(b & 0xff);
125           } catch (Exception e) {
126               e.printStackTrace();
127               return null;
128           }
129           //add 0 padding
130           if (s.length() == 1) {
131               sb.append('0');
132           }
133           sb.append(s);
134       }
135       return sb.toString();
136   }
137
138   @Override
139   public boolean equals(Object o) {
140       if (o == this) {
141           return true;
142       }
143       if (!(o instanceof WifiP2pServiceInfo)) {
144           return false;
145       }
146
147       WifiP2pServiceInfo servInfo = (WifiP2pServiceInfo)o;
148       return  mQueryList.equals(servInfo.mQueryList);
149   }
150
151   @Override
152   public int hashCode() {
153       int result = 17;
154       result = 31 * result + (mQueryList == null ? 0 : mQueryList.hashCode());
155       return result;
156   }
157
158    /** Implement the Parcelable interface {@hide} */
159    public int describeContents() {
160        return 0;
161    }
162
163    /** Implement the Parcelable interface {@hide} */
164    public void writeToParcel(Parcel dest, int flags) {
165        dest.writeStringList(mQueryList);
166    }
167
168    /** Implement the Parcelable interface {@hide} */
169    public static final Creator<WifiP2pServiceInfo> CREATOR =
170        new Creator<WifiP2pServiceInfo>() {
171            public WifiP2pServiceInfo createFromParcel(Parcel in) {
172
173                List<String> data = new ArrayList<String>();
174                in.readStringList(data);
175                return new WifiP2pServiceInfo(data);
176            }
177
178            public WifiP2pServiceInfo[] newArray(int size) {
179                return new WifiP2pServiceInfo[size];
180            }
181        };
182}
183