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