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 android.os.Parcel;
2021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.os.Parcelable;
2121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
2221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.ArrayList;
2321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.List;
2421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
2521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/**
268bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * A class for storing service information that is advertised
278bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * over a Wi-Fi peer-to-peer setup
2821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *
2921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @see WifiP2pUpnpServiceInfo
308bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * @see WifiP2pDnsSdServiceInfo
3121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */
3221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffpublic class WifiP2pServiceInfo implements Parcelable {
3321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
3421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
3521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * All service protocol types.
3621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
3721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final int SERVICE_TYPE_ALL             = 0;
3821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
3921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
408bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * DNS based service discovery protocol.
4121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
4221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final int SERVICE_TYPE_BONJOUR         = 1;
4321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
4421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
4521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * UPnP protocol.
4621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
4721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final int SERVICE_TYPE_UPNP            = 2;
4821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * WS-Discovery protocol
518bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * @hide
5221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
5321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final int SERVICE_TYPE_WS_DISCOVERY    = 3;
5421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
5521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
5621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Vendor Specific protocol
5721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
5821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final int SERVICE_TYPE_VENDOR_SPECIFIC = 255;
5921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
6021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
6121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * the list of query string for wpa_supplicant
6221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
6321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * e.g)
6421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * # IP Printing over TCP (PTR) (RDATA=MyPrinter._ipp._tcp.local.)
6521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * {"bonjour", "045f697070c00c000c01", "094d795072696e746572c027"
6621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
6721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * # IP Printing over TCP (TXT) (RDATA=txtvers=1,pdl=application/postscript)
6821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * {"bonjour", "096d797072696e746572045f697070c00c001001",
6921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  "09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074"}
7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
7121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * [UPnP]
7221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * # UPnP uuid
7321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012"}
7421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
7521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * # UPnP rootdevice
7621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"}
7721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
7821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * # UPnP device
7921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp
8021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * -org:device:InternetGatewayDevice:1"}
8121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
8221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *  # UPnP service
8321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * {"upnp", "10", "uuid:6859dede-8574-59ab-9322-123456789012::urn:schemas-upnp
8421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * -org:service:ContentDirectory:2"}
8521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
8621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private List<String> mQueryList;
8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
8821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * This is only used in subclass.
9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
9121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param queryList query string for wpa_supplicant
9221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @hide
9321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
9421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    protected WifiP2pServiceInfo(List<String> queryList) {
9521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (queryList == null) {
9621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            throw new IllegalArgumentException("query list cannot be null");
9721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
9821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        mQueryList = queryList;
9921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
10021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
10121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   /**
10221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    * Return the list of the query string for wpa_supplicant.
10321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    *
10421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    * @return the list of the query string for wpa_supplicant.
10521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    * @hide
10621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    */
10721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   public List<String> getSupplicantQueryList() {
10821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       return mQueryList;
10921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   }
11021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
11121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   /**
11221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    * Converts byte array to hex string.
11321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    *
11421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    * @param data
11521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    * @return hex string.
11621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    * @hide
11721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    */
11821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   static String bin2HexStr(byte[] data) {
11921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       StringBuffer sb = new StringBuffer();
12021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
12121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       for (byte b: data) {
12221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           String s = null;
12321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           try {
12421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff               s = Integer.toHexString(b & 0xff);
12521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           } catch (Exception e) {
12621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff               e.printStackTrace();
12721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff               return null;
12821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           }
12921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           //add 0 padding
13021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           if (s.length() == 1) {
13121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff               sb.append('0');
13221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           }
13321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           sb.append(s);
13421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       }
13521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       return sb.toString();
13621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   }
13721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
13821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   @Override
13921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   public boolean equals(Object o) {
14021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       if (o == this) {
14121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           return true;
14221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       }
14321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       if (!(o instanceof WifiP2pServiceInfo)) {
14421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff           return false;
14521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       }
14621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
14721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       WifiP2pServiceInfo servInfo = (WifiP2pServiceInfo)o;
14821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       return  mQueryList.equals(servInfo.mQueryList);
14921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   }
15021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
15121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   @Override
15221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   public int hashCode() {
15321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       int result = 17;
15421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       result = 31 * result + (mQueryList == null ? 0 : mQueryList.hashCode());
15521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff       return result;
15621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   }
15721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
15821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
15921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public int describeContents() {
16021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return 0;
16121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
16221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
16321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
16421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public void writeToParcel(Parcel dest, int flags) {
16521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        dest.writeStringList(mQueryList);
16621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
16721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
16821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
16921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final Creator<WifiP2pServiceInfo> CREATOR =
17021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        new Creator<WifiP2pServiceInfo>() {
17121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            public WifiP2pServiceInfo createFromParcel(Parcel in) {
17221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
17321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                List<String> data = new ArrayList<String>();
17421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                in.readStringList(data);
17521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return new WifiP2pServiceInfo(data);
17621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
17721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
17821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            public WifiP2pServiceInfo[] newArray(int size) {
17921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return new WifiP2pServiceInfo[size];
18021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
18121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        };
18221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff}
183