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.WifiP2pDevice; 2021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 2121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.ArrayList; 2221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.List; 2321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 2421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff/** 2521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * A class for a response of upnp service discovery. 2621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 2721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @hide 2821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 2921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffpublic class WifiP2pUpnpServiceResponse extends WifiP2pServiceResponse { 3021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 3121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 3221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * UPnP version. should be {@link WifiP2pUpnpServiceInfo#VERSION_1_0} 3321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 3421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private int mVersion; 3521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 3621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 3721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The list of Unique Service Name. 3821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * e.g) 3921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *{"uuid:6859dede-8574-59ab-9332-123456789012", 4021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff *"uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"} 4121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 4221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private List<String> mUniqueServiceNames; 4321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 4421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 4521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Return UPnP version number. 4621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 4721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return version number. 4821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @see WifiP2pUpnpServiceInfo#VERSION_1_0 4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public int getVersion() { 5121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return mVersion; 5221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 5321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 5421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 5521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Return Unique Service Name strings. 5621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 5721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return Unique Service Name.<br> 5821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * e.g ) <br> 5921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <ul> 6021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <li>"uuid:6859dede-8574-59ab-9332-123456789012" 6121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <li>"uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice" 6221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <li>"uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:device: 6321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * MediaServer:2" 6421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <li>"uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:service: 6521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * ContentDirectory:2" 6621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * </ul> 6721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 6821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public List<String> getUniqueServiceNames() { 6921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return mUniqueServiceNames; 7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 7121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 7221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 7321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * hidden constructor. 7421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 7521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param status status code 7621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param transId transaction id 7721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param dev source device 7821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param data UPnP response data. 7921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 8021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff protected WifiP2pUpnpServiceResponse(int status, 8121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int transId, WifiP2pDevice dev, byte[] data) { 8221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff super(WifiP2pServiceInfo.SERVICE_TYPE_UPNP, 8321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff status, transId, dev, data); 8421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!parse()) { 8521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff throw new IllegalArgumentException("Malformed upnp service response"); 8621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 8821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Parse UPnP service discovery response 9121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 9221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return {@code true} if the operation succeeded 9321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 9421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private boolean parse() { 9521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 9621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The data format is as follows. 9721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 9821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * ______________________________________________________ 9921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * | Version (1) | USN (Variable) | 10021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 10121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mData == null) { 10221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // the empty is OK. 10321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 10421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 10521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 10621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mData.length < 1) { 10721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 10821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 10921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 11021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mVersion = mData[0] & 0xff; 11121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff String[] names = new String(mData, 1, mData.length-1).split(","); 11221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mUniqueServiceNames = new ArrayList<String>(); 11321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (String name : names) { 11421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mUniqueServiceNames.add(name); 11521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 11621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 11721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 11821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 11921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff @Override 12021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public String toString() { 12121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff StringBuffer sbuf = new StringBuffer(); 12221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sbuf.append("serviceType:UPnP(").append(mServiceType).append(")"); 12321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sbuf.append(" status:").append(Status.toString(mStatus)); 12421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sbuf.append(" srcAddr:").append(mDevice.deviceAddress); 12521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sbuf.append(" version:").append(String.format("%02x", mVersion)); 12621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mUniqueServiceNames != null) { 12721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (String name : mUniqueServiceNames) { 12821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sbuf.append(" usn:").append(name); 12921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 13021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 13121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return sbuf.toString(); 13221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 13321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 13421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 13521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Create upnp service response. 13621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 13721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * <pre>This is only used in{@link WifiP2pServiceResponse} 13821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 13921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param status status code. 14021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param transId transaction id. 14121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param device source device. 14221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param data UPnP response data. 14321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return UPnP service response data. 14421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @hide 14521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 14621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff static WifiP2pUpnpServiceResponse newInstance(int status, 14721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int transId, WifiP2pDevice device, byte[] data) { 14821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (status != WifiP2pServiceResponse.Status.SUCCESS) { 14921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return new WifiP2pUpnpServiceResponse(status, transId, device, null); 15021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 15121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 15221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff try { 15321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return new WifiP2pUpnpServiceResponse(status, transId, device, data); 15421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } catch (IllegalArgumentException e) { 15521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff e.printStackTrace(); 15621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 15721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return null; 15821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 15921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff} 160