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.net.wifi.p2p.WifiP2pManager;
2021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.os.Parcel;
2121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.os.Parcelable;
2221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
2321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/**
248bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * A class for creating a service discovery request for use with
258bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@link WifiP2pManager#addServiceRequest} and {@link WifiP2pManager#removeServiceRequest}
2621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *
278bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * <p>This class is used to create service discovery request for custom
288bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * vendor specific service discovery protocol {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}
298bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * or to search all service protocols {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL}.
3021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *
318bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * <p>For the purpose of creating a UPnP or Bonjour service request, use
328bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest} respectively.
3321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *
348bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pManager}
358bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pUpnpServiceRequest}
368bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pDnsSdServiceRequest}
3721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */
3821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffpublic class WifiP2pServiceRequest implements Parcelable {
3921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
4021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
418bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * Service discovery protocol. It's defined in table63 in Wi-Fi Direct specification.
4221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
438bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff    private int mProtocolType;
4421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
4521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
4621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * The length of the service request TLV.
4721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * The value is equal to 2 plus the number of octets in the
4821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * query data field.
4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private int mLength;
5121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
5221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
5321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Service transaction ID.
5421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * This is a nonzero value used to match the service request/response TLVs.
5521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
5621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private int mTransId;
5721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
5821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
5921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * The hex dump string of query data for the requested service information.
6021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
618bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * e.g) DnsSd apple file sharing over tcp (dns name=_afpovertcp._tcp.local.)
6221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * 0b5f6166706f766572746370c00c000c01
6321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
6421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private String mQuery;
6521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
6621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
6721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * This constructor is only used in newInstance().
6821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
698bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * @param protocolType service discovery protocol.
7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param query The part of service specific query.
7121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @hide
7221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
738bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff    protected WifiP2pServiceRequest(int protocolType, String query) {
7421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        validateQuery(query);
7521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
768bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        mProtocolType = protocolType;
7721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        mQuery = query;
7821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (query != null) {
7921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            mLength = query.length()/2 + 2;
8021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        } else {
8121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            mLength = 2;
8221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
8321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
8421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
8521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
8621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * This constructor is only used in Parcelable.
8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
8821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param serviceType service discovery type.
8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param length the length of service discovery packet.
9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param transId the transaction id
9121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param query The part of service specific query.
9221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
9321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private WifiP2pServiceRequest(int serviceType, int length,
9421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            int transId, String query) {
958bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        mProtocolType = serviceType;
9621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        mLength = length;
9721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        mTransId = transId;
9821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        mQuery = query;
9921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
10021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
10121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
10221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Return transaction id.
10321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
10421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return transaction id
10521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @hide
10621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
10721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public int getTransactionId() {
10821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return mTransId;
10921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
11021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
11121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
11221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Set transaction id.
11321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
11421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param id
11521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @hide
11621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
11721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public void setTransactionId(int id) {
11821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        mTransId = id;
11921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
12021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
12121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
12221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Return wpa_supplicant request string.
12321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
12421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * The format is the hex dump of the following frame.
12521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <pre>
12621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * _______________________________________________________________
12721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * |        Length (2)        |   Type (1)   | Transaction ID (1) |
12821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * |                  Query Data (variable)                       |
12921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * </pre>
13021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
13121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return wpa_supplicant request string.
13221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @hide
13321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
13421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public String getSupplicantQuery() {
13521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        StringBuffer sb = new StringBuffer();
13621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        // length is retained as little endian format.
13721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append(String.format("%02x", (mLength) & 0xff));
13821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append(String.format("%02x", (mLength >> 8) & 0xff));
1398bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        sb.append(String.format("%02x", mProtocolType));
14021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        sb.append(String.format("%02x", mTransId));
14121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (mQuery != null) {
14221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            sb.append(mQuery);
14321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
14421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
14521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return sb.toString();
14621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
14721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
14821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
14921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * Validate query.
15021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
15121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * <p>If invalid, throw IllegalArgumentException.
15221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @param query The part of service specific query.
15321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
15421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    private void validateQuery(String query) {
15521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (query == null) {
15621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            return;
15721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
15821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
15921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        int UNSIGNED_SHORT_MAX = 0xffff;
16021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (query.length()%2 == 1) {
16121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            throw new IllegalArgumentException(
16221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                    "query size is invalid. query=" + query);
16321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
16421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (query.length()/2 > UNSIGNED_SHORT_MAX) {
16521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            throw new IllegalArgumentException(
16621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                    "query size is too large. len=" + query.length());
16721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
16821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
16921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        // check whether query is hex string.
17021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        query = query.toLowerCase();
17121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        char[] chars = query.toCharArray();
17221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        for (char c: chars) {
17321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            if (!((c >= '0' && c <= '9') ||
17421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                    (c >= 'a' && c <= 'f'))){
17521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                throw new IllegalArgumentException(
17621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                        "query should be hex string. query=" + query);
17721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
17821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
17921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
18021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
18121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
1828bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * Create a service discovery request.
18321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
1848bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * @param protocolType can be {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL}
1858bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * or {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}.
1868bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * In order to create a UPnP or Bonjour service request, use
1878bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest}
1888bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * respectively
18921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
1908bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * @param queryData hex string that is vendor specific.  Can be null.
19121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return service discovery request.
19221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
1938bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff    public static WifiP2pServiceRequest newInstance(int protocolType, String queryData) {
1948bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        return new WifiP2pServiceRequest(protocolType, queryData);
19521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
19621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
19721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /**
1988bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * Create a service discovery request.
19921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
2008bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * @param protocolType can be {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL}
2018bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * or {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}.
2028bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * In order to create a UPnP or Bonjour service request, use
2038bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest}
2048bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff     * respectively
20521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     *
20621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     * @return service discovery request.
20721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff     */
2088bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff    public static WifiP2pServiceRequest newInstance(int protocolType ) {
2098bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        return new WifiP2pServiceRequest(protocolType, null);
21021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
21121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
21221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    @Override
21321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public boolean equals(Object o) {
21421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (o == this) {
21521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            return true;
21621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
21721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (!(o instanceof WifiP2pServiceRequest)) {
21821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            return false;
21921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
22021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
22121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        WifiP2pServiceRequest req = (WifiP2pServiceRequest)o;
22221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
22321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        /*
22421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * Not compare transaction id.
22521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         * Transaction id may be changed on each service discovery operation.
22621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff         */
2278bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        if ((req.mProtocolType != mProtocolType) ||
22821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                (req.mLength != mLength)) {
22921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            return false;
23021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
23121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
23221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        if (req.mQuery == null && mQuery == null) {
23321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            return true;
23421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        } else if (req.mQuery != null) {
23521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            return req.mQuery.equals(mQuery);
23621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        }
23721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return false;
23821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff   }
23921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
24021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    @Override
24121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public int hashCode() {
24221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        int result = 17;
2438bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        result = 31 * result + mProtocolType;
24421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        result = 31 * result + mLength;
24521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        result = 31 * result + (mQuery == null ? 0 : mQuery.hashCode());
24621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return result;
24721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
24821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
24921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
25021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public int describeContents() {
25121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        return 0;
25221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
25321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
25421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
25521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public void writeToParcel(Parcel dest, int flags) {
2568bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff        dest.writeInt(mProtocolType);
25721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        dest.writeInt(mLength);
25821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        dest.writeInt(mTransId);
25921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        dest.writeString(mQuery);
26021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    }
26121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
26221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
26321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff    public static final Creator<WifiP2pServiceRequest> CREATOR =
26421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        new Creator<WifiP2pServiceRequest>() {
26521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            public WifiP2pServiceRequest createFromParcel(Parcel in) {
26621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                int servType = in.readInt();
26721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                int length = in.readInt();
26821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                int transId = in.readInt();
26921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                String query = in.readString();
27021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return new WifiP2pServiceRequest(servType, length, transId, query);
27121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
27221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff
27321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            public WifiP2pServiceRequest[] newArray(int size) {
27421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff                return new WifiP2pServiceRequest[size];
27521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff            }
27621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff        };
27721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff}
278