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