MtpDevice.cpp revision 5ed68d29a140e14c8d46980fa844548eb33b1e87
15ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood/* 25ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 35ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * 45ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 55ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * you may not use this file except in compliance with the License. 65ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * You may obtain a copy of the License at 75ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * 85ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 95ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * 105ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * Unless required by applicable law or agreed to in writing, software 115ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 125ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * See the License for the specific language governing permissions and 145ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood * limitations under the License. 155ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood */ 165ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 175ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <stdio.h> 185ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <stdlib.h> 195ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <sys/types.h> 205ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <sys/ioctl.h> 215ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <sys/stat.h> 225ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <fcntl.h> 235ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <errno.h> 245ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 255ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include <usbhost/usbhost.h> 265ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 275ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpDevice.h" 285ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpDebug.h" 295ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpDeviceInfo.h" 305ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpObjectInfo.h" 315ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpStorageInfo.h" 325ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood#include "MtpStringBuffer.h" 335ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 345ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodnamespace android { 355ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 365ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpDevice::MtpDevice(struct usb_device* device, int interface, 375ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood struct usb_endpoint *ep_in, struct usb_endpoint *ep_out, 385ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood struct usb_endpoint *ep_intr) 395ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood : mDevice(device), 405ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mInterface(interface), 415ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mEndpointIn(ep_in), 425ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mEndpointOut(ep_out), 435ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mEndpointIntr(ep_intr), 445ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mDeviceInfo(NULL), 455ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mID(usb_device_get_unique_id(device)), 465ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mSessionID(0), 475ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mTransactionID(0) 485ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood{ 495ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 505ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 515ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpDevice::~MtpDevice() { 525ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood close(); 535ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 545ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 555ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodvoid MtpDevice::initialize() { 565ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood openSession(); 575ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mDeviceInfo = getDeviceInfo(); 585ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (mDeviceInfo) { 595ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mDeviceInfo->print(); 605ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 615ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 625ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 635ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodvoid MtpDevice::close() { 645ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (mDevice) { 655ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood usb_device_release_interface(mDevice, mInterface); 665ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood usb_device_close(mDevice); 675ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mDevice = NULL; 685ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 695ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 705ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 715ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodconst char* MtpDevice::getDeviceName() { 725ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (mDevice) 735ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return usb_device_get_name(mDevice); 745ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood else 755ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return "???"; 765ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 775ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 785ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodbool MtpDevice::openSession() { 795ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodprintf("openSession\n"); 805ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mSessionID = 0; 815ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mTransactionID = 0; 825ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpSessionID newSession = 1; 835ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.reset(); 845ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setParameter(1, newSession); 855ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!sendRequest(MTP_OPERATION_OPEN_SESSION)) 865ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return false; 875ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponseCode ret = readResponse(); 885ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret == MTP_RESPONSE_SESSION_ALREADY_OPEN) 895ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood newSession = mResponse.getParameter(1); 905ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood else if (ret != MTP_RESPONSE_OK) 915ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return false; 925ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 935ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mSessionID = newSession; 945ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mTransactionID = 1; 955ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return true; 965ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 975ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 985ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodbool MtpDevice::closeSession() { 995ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood // FIXME 1005ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return true; 1015ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 1025ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1035ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpDeviceInfo* MtpDevice::getDeviceInfo() { 1045ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.reset(); 1055ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!sendRequest(MTP_OPERATION_GET_DEVICE_INFO)) 1065ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1075ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!readData()) 1085ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1095ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponseCode ret = readResponse(); 1105ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodprintf("getDeviceInfo returned %04X\n", ret); 1115ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret == MTP_RESPONSE_OK) { 1125ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpDeviceInfo* info = new MtpDeviceInfo; 1135ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood info->read(mData); 1145ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return info; 1155ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 1165ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1175ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 1185ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1195ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpStorageIDList* MtpDevice::getStorageIDs() { 1205ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.reset(); 1215ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!sendRequest(MTP_OPERATION_GET_STORAGE_IDS)) 1225ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1235ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!readData()) 1245ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1255ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponseCode ret = readResponse(); 1265ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret == MTP_RESPONSE_OK) { 1275ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return mData.getAUInt32(); 1285ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 1295ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1305ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 1315ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1325ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpStorageInfo* MtpDevice::getStorageInfo(MtpStorageID storageID) { 1335ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.reset(); 1345ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setParameter(1, storageID); 1355ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!sendRequest(MTP_OPERATION_GET_STORAGE_INFO)) 1365ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1375ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!readData()) 1385ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1395ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponseCode ret = readResponse(); 1405ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodprintf("getStorageInfo returned %04X\n", ret); 1415ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret == MTP_RESPONSE_OK) { 1425ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpStorageInfo* info = new MtpStorageInfo(storageID); 1435ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood info->read(mData); 1445ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return info; 1455ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 1465ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1475ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 1485ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1495ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpObjectHandleList* MtpDevice::getObjectHandles(MtpStorageID storageID, 1505ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpObjectFormat format, MtpObjectHandle parent) { 1515ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.reset(); 1525ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setParameter(1, storageID); 1535ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setParameter(2, format); 1545ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setParameter(3, parent); 1555ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!sendRequest(MTP_OPERATION_GET_OBJECT_HANDLES)) 1565ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1575ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!readData()) 1585ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1595ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponseCode ret = readResponse(); 1605ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodprintf("getObjectHandles returned %04X\n", ret); 1615ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret == MTP_RESPONSE_OK) { 1625ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return mData.getAUInt32(); 1635ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 1645ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1655ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 1665ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1675ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpObjectInfo* MtpDevice::getObjectInfo(MtpObjectHandle handle) { 1685ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.reset(); 1695ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setParameter(1, handle); 1705ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!sendRequest(MTP_OPERATION_GET_OBJECT_INFO)) 1715ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1725ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (!readData()) 1735ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1745ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpResponseCode ret = readResponse(); 1755ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodprintf("getObjectInfo returned %04X\n", ret); 1765ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret == MTP_RESPONSE_OK) { 1775ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood MtpObjectInfo* info = new MtpObjectInfo(handle); 1785ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood info->read(mData); 1795ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return info; 1805ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 1815ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return NULL; 1825ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 1835ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1845ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodbool MtpDevice::sendRequest(MtpOperationCode operation) { 1855ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood printf("sendRequest: %s\n", MtpDebug::getOperationCodeName(operation)); 1865ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setOperationCode(operation); 1875ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (mTransactionID > 0) 1885ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.setTransactionID(mTransactionID++); 1895ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood int ret = mRequest.write(mEndpointOut); 1905ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mRequest.dump(); 1915ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return (ret > 0); 1925ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 1935ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 1945ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodbool MtpDevice::sendData(MtpOperationCode operation) { 1955ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood printf("sendData\n"); 1965ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mData.setOperationCode(mRequest.getOperationCode()); 1975ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mData.setTransactionID(mRequest.getTransactionID()); 1985ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood int ret = mData.write(mEndpointOut); 1995ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mData.dump(); 2005ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return (ret > 0); 2015ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 2025ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 2035ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwoodbool MtpDevice::readData() { 2045ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mData.reset(); 2055ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood int ret = mData.read(mEndpointIn); 2065ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood printf("readData returned %d\n", ret); 2075ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret >= MTP_CONTAINER_HEADER_SIZE) { 2085ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mData.dump(); 2095ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return true; 2105ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 2115ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood else { 2125ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood printf("readResponse failed\n"); 2135ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return false; 2145ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 2155ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 2165ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 2175ed68d29a140e14c8d46980fa844548eb33b1e87Mike LockwoodMtpResponseCode MtpDevice::readResponse() { 2185ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood printf("readResponse\n"); 2195ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood int ret = mResponse.read(mEndpointIn); 2205ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood if (ret >= MTP_CONTAINER_HEADER_SIZE) { 2215ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood mResponse.dump(); 2225ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return mResponse.getResponseCode(); 2235ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 2245ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood else { 2255ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood printf("readResponse failed\n"); 2265ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood return -1; 2275ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood } 2285ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} 2295ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood 2305ed68d29a140e14c8d46980fa844548eb33b1e87Mike Lockwood} // namespace android 231