blob: ab95af6f64b3d5f4938f35758073aff4f58c4c26 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net.wifi.p2p.nsd;
import android.net.wifi.p2p.WifiP2pDevice;
import java.util.ArrayList;
import java.util.List;
/**
* A class for a response of upnp service discovery.
*
* @hide
*/
public class WifiP2pUpnpServiceResponse extends WifiP2pServiceResponse {
/**
* UPnP version. should be {@link WifiP2pUpnpServiceInfo#VERSION_1_0}
*/
private int mVersion;
/**
* The list of Unique Service Name.
* e.g)
*{"uuid:6859dede-8574-59ab-9332-123456789012",
*"uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"}
*/
private List<String> mUniqueServiceNames;
/**
* Return UPnP version number.
*
* @return version number.
* @see WifiP2pUpnpServiceInfo#VERSION_1_0
*/
public int getVersion() {
return mVersion;
}
/**
* Return Unique Service Name strings.
*
* @return Unique Service Name.<br>
* e.g ) <br>
* <ul>
* <li>"uuid:6859dede-8574-59ab-9332-123456789012"
* <li>"uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"
* <li>"uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:device:
* MediaServer:2"
* <li>"uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:service:
* ContentDirectory:2"
* </ul>
*/
public List<String> getUniqueServiceNames() {
return mUniqueServiceNames;
}
/**
* hidden constructor.
*
* @param status status code
* @param transId transaction id
* @param dev source device
* @param data UPnP response data.
*/
protected WifiP2pUpnpServiceResponse(int status,
int transId, WifiP2pDevice dev, byte[] data) {
super(WifiP2pServiceInfo.SERVICE_TYPE_UPNP,
status, transId, dev, data);
if (!parse()) {
throw new IllegalArgumentException("Malformed upnp service response");
}
}
/**
* Parse UPnP service discovery response
*
* @return {@code true} if the operation succeeded
*/
private boolean parse() {
/*
* The data format is as follows.
*
* ______________________________________________________
* | Version (1) | USN (Variable) |
*/
if (mData == null) {
// the empty is OK.
return true;
}
if (mData.length < 1) {
return false;
}
mVersion = mData[0] & 0xff;
String[] names = new String(mData, 1, mData.length-1).split(",");
mUniqueServiceNames = new ArrayList<String>();
for (String name : names) {
mUniqueServiceNames.add(name);
}
return true;
}
@Override
public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("serviceType:UPnP(").append(mServiceType).append(")");
sbuf.append(" status:").append(Status.toString(mStatus));
sbuf.append(" srcAddr:").append(mDevice.deviceAddress);
sbuf.append(" version:").append(String.format("%02x", mVersion));
if (mUniqueServiceNames != null) {
for (String name : mUniqueServiceNames) {
sbuf.append(" usn:").append(name);
}
}
return sbuf.toString();
}
/**
* Create upnp service response.
*
* <pre>This is only used in{@link WifiP2pServiceResponse}
*
* @param status status code.
* @param transId transaction id.
* @param device source device.
* @param data UPnP response data.
* @return UPnP service response data.
* @hide
*/
static WifiP2pUpnpServiceResponse newInstance(int status,
int transId, WifiP2pDevice device, byte[] data) {
if (status != WifiP2pServiceResponse.Status.SUCCESS) {
return new WifiP2pUpnpServiceResponse(status, transId, device, null);
}
try {
return new WifiP2pUpnpServiceResponse(status, transId, device, data);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
return null;
}
}