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 23fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkeyimport java.util.Locale; 24fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey 2521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/** 268bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * A class for creating a service discovery request for use with 278bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@link WifiP2pManager#addServiceRequest} and {@link WifiP2pManager#removeServiceRequest} 2821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 298bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * <p>This class is used to create service discovery request for custom 308bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * vendor specific service discovery protocol {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC} 318bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * or to search all service protocols {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL}. 3221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 338bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * <p>For the purpose of creating a UPnP or Bonjour service request, use 348bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest} respectively. 3521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 368bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pManager} 378bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pUpnpServiceRequest} 388bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@see WifiP2pDnsSdServiceRequest} 3921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 4021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffpublic class WifiP2pServiceRequest implements Parcelable { 4121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 4221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 438bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * Service discovery protocol. It's defined in table63 in Wi-Fi Direct specification. 4421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 458bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff private int mProtocolType; 4621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 4721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 4821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The length of the service request TLV. 4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The value is equal to 2 plus the number of octets in the 5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * query data field. 5121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 5221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private int mLength; 5321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 5421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 5521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Service transaction ID. 5621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * This is a nonzero value used to match the service request/response TLVs. 5721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 5821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private int mTransId; 5921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 6021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 6121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The hex dump string of query data for the requested service information. 6221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 638bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * e.g) DnsSd apple file sharing over tcp (dns name=_afpovertcp._tcp.local.) 6421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 0b5f6166706f766572746370c00c000c01 6521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 6621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private String mQuery; 6721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 6821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 6921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * This constructor is only used in newInstance(). 7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 718bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * @param protocolType service discovery protocol. 7221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param query The part of service specific query. 7321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @hide 7421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 758bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff protected WifiP2pServiceRequest(int protocolType, String query) { 7621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff validateQuery(query); 7721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 788bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff mProtocolType = protocolType; 7921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mQuery = query; 8021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (query != null) { 8121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mLength = query.length()/2 + 2; 8221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else { 8321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mLength = 2; 8421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 8521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 8621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 8821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * This constructor is only used in Parcelable. 8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param serviceType service discovery type. 9121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param length the length of service discovery packet. 9221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param transId the transaction id 9321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param query The part of service specific query. 9421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 9521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private WifiP2pServiceRequest(int serviceType, int length, 9621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int transId, String query) { 978bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff mProtocolType = serviceType; 9821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mLength = length; 9921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mTransId = transId; 10021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mQuery = query; 10121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 10221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 10321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 10421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Return transaction id. 10521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 10621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return transaction id 10721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @hide 10821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 10921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public int getTransactionId() { 11021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return mTransId; 11121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 11221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 11321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 11421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Set transaction id. 11521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 11621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param id 11721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @hide 11821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 11921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public void setTransactionId(int id) { 12021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mTransId = id; 12121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 12221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 12321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 12421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Return wpa_supplicant request string. 12521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 12621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The format is the hex dump of the following frame. 12721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <pre> 12821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * _______________________________________________________________ 12921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * | Length (2) | Type (1) | Transaction ID (1) | 13021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * | Query Data (variable) | 13121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * </pre> 13221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 13321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return wpa_supplicant request string. 13421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @hide 13521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 13621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public String getSupplicantQuery() { 13721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff StringBuffer sb = new StringBuffer(); 13821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // length is retained as little endian format. 139fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey sb.append(String.format(Locale.US, "%02x", (mLength) & 0xff)); 140fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey sb.append(String.format(Locale.US, "%02x", (mLength >> 8) & 0xff)); 141fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey sb.append(String.format(Locale.US, "%02x", mProtocolType)); 142fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey sb.append(String.format(Locale.US, "%02x", mTransId)); 14321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mQuery != null) { 14421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sb.append(mQuery); 14521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 14621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 14721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return sb.toString(); 14821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 14921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 15021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 15121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Validate query. 15221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 15321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <p>If invalid, throw IllegalArgumentException. 15421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param query The part of service specific query. 15521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 15621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void validateQuery(String query) { 15721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (query == null) { 15821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 15921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 16021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 16121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int UNSIGNED_SHORT_MAX = 0xffff; 16221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (query.length()%2 == 1) { 16321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff throw new IllegalArgumentException( 16421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff "query size is invalid. query=" + query); 16521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 16621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (query.length()/2 > UNSIGNED_SHORT_MAX) { 16721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff throw new IllegalArgumentException( 16821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff "query size is too large. len=" + query.length()); 16921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 17021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 17121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // check whether query is hex string. 172ee00b353a4070a9ddbdf67fa715dc84e7282f7c2Elliott Hughes query = query.toLowerCase(Locale.ROOT); 17321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff char[] chars = query.toCharArray(); 17421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (char c: chars) { 17521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!((c >= '0' && c <= '9') || 17621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff (c >= 'a' && c <= 'f'))){ 17721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff throw new IllegalArgumentException( 17821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff "query should be hex string. query=" + query); 17921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 18021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 18121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 18221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 18321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 1848bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * Create a service discovery request. 18521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 1868bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * @param protocolType can be {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL} 1878bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * or {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}. 1888bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * In order to create a UPnP or Bonjour service request, use 1898bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest} 1908bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * respectively 19121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 1928bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * @param queryData hex string that is vendor specific. Can be null. 19321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return service discovery request. 19421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 1958bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff public static WifiP2pServiceRequest newInstance(int protocolType, String queryData) { 1968bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff return new WifiP2pServiceRequest(protocolType, queryData); 19721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 19821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 19921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 2008bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * Create a service discovery request. 20121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 2028bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * @param protocolType can be {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL} 2038bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * or {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}. 2048bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * In order to create a UPnP or Bonjour service request, use 2058bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest} 2068bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff * respectively 20721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 20821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return service discovery request. 20921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 2108bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff public static WifiP2pServiceRequest newInstance(int protocolType ) { 2118bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff return new WifiP2pServiceRequest(protocolType, null); 21221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 21321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 21421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff @Override 21521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public boolean equals(Object o) { 21621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (o == this) { 21721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 21821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 21921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!(o instanceof WifiP2pServiceRequest)) { 22021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 22121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 22221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 22321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pServiceRequest req = (WifiP2pServiceRequest)o; 22421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 22521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 22621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Not compare transaction id. 22721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Transaction id may be changed on each service discovery operation. 22821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 2298bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff if ((req.mProtocolType != mProtocolType) || 23021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff (req.mLength != mLength)) { 23121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 23221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 23321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 23421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (req.mQuery == null && mQuery == null) { 23521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 23621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else if (req.mQuery != null) { 23721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return req.mQuery.equals(mQuery); 23821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 23921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 24021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 24121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 24221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff @Override 24321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public int hashCode() { 24421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int result = 17; 2458bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff result = 31 * result + mProtocolType; 24621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff result = 31 * result + mLength; 24721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff result = 31 * result + (mQuery == null ? 0 : mQuery.hashCode()); 24821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return result; 24921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 25021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 25121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** Implement the Parcelable interface {@hide} */ 25221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public int describeContents() { 25321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return 0; 25421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 25521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 25621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** Implement the Parcelable interface {@hide} */ 25721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public void writeToParcel(Parcel dest, int flags) { 2588bf825f48fde77cb2feb8720aac17093581bb085Irfan Sheriff dest.writeInt(mProtocolType); 25921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff dest.writeInt(mLength); 26021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff dest.writeInt(mTransId); 26121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff dest.writeString(mQuery); 26221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 26321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 26421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** Implement the Parcelable interface {@hide} */ 26521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public static final Creator<WifiP2pServiceRequest> CREATOR = 26621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff new Creator<WifiP2pServiceRequest>() { 26721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public WifiP2pServiceRequest createFromParcel(Parcel in) { 26821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int servType = in.readInt(); 26921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int length = in.readInt(); 27021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int transId = in.readInt(); 27121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String query = in.readString(); 27221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return new WifiP2pServiceRequest(servType, length, transId, query); 27321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 27421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 27521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public WifiP2pServiceRequest[] newArray(int size) { 27621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return new WifiP2pServiceRequest[size]; 27721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 27821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff }; 27921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 280