Home | History | Annotate | Download | only in mtp
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #define LOG_TAG "MtpDataPacket"
     18 
     19 #include "MtpDataPacket.h"
     20 
     21 #include <algorithm>
     22 #include <fcntl.h>
     23 #include <stdio.h>
     24 #include <sys/types.h>
     25 #include <usbhost/usbhost.h>
     26 #include "MtpStringBuffer.h"
     27 #include "IMtpHandle.h"
     28 
     29 namespace android {
     30 
     31 namespace {
     32 // Reads the exact |count| bytes from |fd| to |buf|.
     33 // Returns |count| if it succeed to read the bytes. Otherwise returns -1. If it reaches EOF, the
     34 // function regards it as an error.
     35 ssize_t readExactBytes(int fd, void* buf, size_t count) {
     36     if (count > SSIZE_MAX) {
     37         return -1;
     38     }
     39     size_t read_count = 0;
     40     while (read_count < count) {
     41         int result = read(fd, static_cast<int8_t*>(buf) + read_count, count - read_count);
     42         // Assume that EOF is error.
     43         if (result <= 0) {
     44             return -1;
     45         }
     46         read_count += result;
     47     }
     48     return read_count == count ? count : -1;
     49 }
     50 }  // namespace
     51 
     52 MtpDataPacket::MtpDataPacket()
     53     :   MtpPacket(MTP_BUFFER_SIZE),   // MAX_USBFS_BUFFER_SIZE
     54         mOffset(MTP_CONTAINER_HEADER_SIZE)
     55 {
     56 }
     57 
     58 MtpDataPacket::~MtpDataPacket() {
     59 }
     60 
     61 void MtpDataPacket::reset() {
     62     MtpPacket::reset();
     63     mOffset = MTP_CONTAINER_HEADER_SIZE;
     64 }
     65 
     66 void MtpDataPacket::setOperationCode(MtpOperationCode code) {
     67     MtpPacket::putUInt16(MTP_CONTAINER_CODE_OFFSET, code);
     68 }
     69 
     70 void MtpDataPacket::setTransactionID(MtpTransactionID id) {
     71     MtpPacket::putUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET, id);
     72 }
     73 
     74 bool MtpDataPacket::getUInt8(uint8_t& value) {
     75     if (mPacketSize - mOffset < sizeof(value))
     76         return false;
     77     value = mBuffer[mOffset++];
     78     return true;
     79 }
     80 
     81 bool MtpDataPacket::getUInt16(uint16_t& value) {
     82     if (mPacketSize - mOffset < sizeof(value))
     83         return false;
     84     int offset = mOffset;
     85     value = (uint16_t)mBuffer[offset] | ((uint16_t)mBuffer[offset + 1] << 8);
     86     mOffset += sizeof(value);
     87     return true;
     88 }
     89 
     90 bool MtpDataPacket::getUInt32(uint32_t& value) {
     91     if (mPacketSize - mOffset < sizeof(value))
     92         return false;
     93     int offset = mOffset;
     94     value = (uint32_t)mBuffer[offset] | ((uint32_t)mBuffer[offset + 1] << 8) |
     95            ((uint32_t)mBuffer[offset + 2] << 16)  | ((uint32_t)mBuffer[offset + 3] << 24);
     96     mOffset += sizeof(value);
     97     return true;
     98 }
     99 
    100 bool MtpDataPacket::getUInt64(uint64_t& value) {
    101     if (mPacketSize - mOffset < sizeof(value))
    102         return false;
    103     int offset = mOffset;
    104     value = (uint64_t)mBuffer[offset] | ((uint64_t)mBuffer[offset + 1] << 8) |
    105            ((uint64_t)mBuffer[offset + 2] << 16) | ((uint64_t)mBuffer[offset + 3] << 24) |
    106            ((uint64_t)mBuffer[offset + 4] << 32) | ((uint64_t)mBuffer[offset + 5] << 40) |
    107            ((uint64_t)mBuffer[offset + 6] << 48)  | ((uint64_t)mBuffer[offset + 7] << 56);
    108     mOffset += sizeof(value);
    109     return true;
    110 }
    111 
    112 bool MtpDataPacket::getUInt128(uint128_t& value) {
    113     return getUInt32(value[0]) && getUInt32(value[1]) && getUInt32(value[2]) && getUInt32(value[3]);
    114 }
    115 
    116 bool MtpDataPacket::getString(MtpStringBuffer& string)
    117 {
    118     return string.readFromPacket(this);
    119 }
    120 
    121 Int8List* MtpDataPacket::getAInt8() {
    122     uint32_t count;
    123     if (!getUInt32(count))
    124         return NULL;
    125     Int8List* result = new Int8List;
    126     for (uint32_t i = 0; i < count; i++) {
    127         int8_t value;
    128         if (!getInt8(value)) {
    129             delete result;
    130             return NULL;
    131         }
    132         result->push(value);
    133     }
    134     return result;
    135 }
    136 
    137 UInt8List* MtpDataPacket::getAUInt8() {
    138     uint32_t count;
    139     if (!getUInt32(count))
    140         return NULL;
    141     UInt8List* result = new UInt8List;
    142     for (uint32_t i = 0; i < count; i++) {
    143         uint8_t value;
    144         if (!getUInt8(value)) {
    145             delete result;
    146             return NULL;
    147         }
    148         result->push(value);
    149     }
    150     return result;
    151 }
    152 
    153 Int16List* MtpDataPacket::getAInt16() {
    154     uint32_t count;
    155     if (!getUInt32(count))
    156         return NULL;
    157     Int16List* result = new Int16List;
    158     for (uint32_t i = 0; i < count; i++) {
    159         int16_t value;
    160         if (!getInt16(value)) {
    161             delete result;
    162             return NULL;
    163         }
    164         result->push(value);
    165     }
    166     return result;
    167 }
    168 
    169 UInt16List* MtpDataPacket::getAUInt16() {
    170     uint32_t count;
    171     if (!getUInt32(count))
    172         return NULL;
    173     UInt16List* result = new UInt16List;
    174     for (uint32_t i = 0; i < count; i++) {
    175         uint16_t value;
    176         if (!getUInt16(value)) {
    177             delete result;
    178             return NULL;
    179         }
    180         result->push(value);
    181     }
    182     return result;
    183 }
    184 
    185 Int32List* MtpDataPacket::getAInt32() {
    186     uint32_t count;
    187     if (!getUInt32(count))
    188         return NULL;
    189     Int32List* result = new Int32List;
    190     for (uint32_t i = 0; i < count; i++) {
    191         int32_t value;
    192         if (!getInt32(value)) {
    193             delete result;
    194             return NULL;
    195         }
    196         result->push(value);
    197     }
    198     return result;
    199 }
    200 
    201 UInt32List* MtpDataPacket::getAUInt32() {
    202     uint32_t count;
    203     if (!getUInt32(count))
    204         return NULL;
    205     UInt32List* result = new UInt32List;
    206     for (uint32_t i = 0; i < count; i++) {
    207         uint32_t value;
    208         if (!getUInt32(value)) {
    209             delete result;
    210             return NULL;
    211         }
    212         result->push(value);
    213     }
    214     return result;
    215 }
    216 
    217 Int64List* MtpDataPacket::getAInt64() {
    218     uint32_t count;
    219     if (!getUInt32(count))
    220         return NULL;
    221     Int64List* result = new Int64List;
    222     for (uint32_t i = 0; i < count; i++) {
    223         int64_t value;
    224         if (!getInt64(value)) {
    225             delete result;
    226             return NULL;
    227         }
    228         result->push(value);
    229     }
    230     return result;
    231 }
    232 
    233 UInt64List* MtpDataPacket::getAUInt64() {
    234     uint32_t count;
    235     if (!getUInt32(count))
    236         return NULL;
    237     UInt64List* result = new UInt64List;
    238     for (uint32_t i = 0; i < count; i++) {
    239         uint64_t value;
    240         if (!getUInt64(value)) {
    241             delete result;
    242             return NULL;
    243         }
    244         result->push(value);
    245     }
    246     return result;
    247 }
    248 
    249 void MtpDataPacket::putInt8(int8_t value) {
    250     allocate(mOffset + 1);
    251     mBuffer[mOffset++] = (uint8_t)value;
    252     if (mPacketSize < mOffset)
    253         mPacketSize = mOffset;
    254 }
    255 
    256 void MtpDataPacket::putUInt8(uint8_t value) {
    257     allocate(mOffset + 1);
    258     mBuffer[mOffset++] = (uint8_t)value;
    259     if (mPacketSize < mOffset)
    260         mPacketSize = mOffset;
    261 }
    262 
    263 void MtpDataPacket::putInt16(int16_t value) {
    264     allocate(mOffset + 2);
    265     mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
    266     mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
    267     if (mPacketSize < mOffset)
    268         mPacketSize = mOffset;
    269 }
    270 
    271 void MtpDataPacket::putUInt16(uint16_t value) {
    272     allocate(mOffset + 2);
    273     mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
    274     mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
    275     if (mPacketSize < mOffset)
    276         mPacketSize = mOffset;
    277 }
    278 
    279 void MtpDataPacket::putInt32(int32_t value) {
    280     allocate(mOffset + 4);
    281     mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
    282     mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
    283     mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
    284     mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
    285     if (mPacketSize < mOffset)
    286         mPacketSize = mOffset;
    287 }
    288 
    289 void MtpDataPacket::putUInt32(uint32_t value) {
    290     allocate(mOffset + 4);
    291     mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
    292     mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
    293     mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
    294     mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
    295     if (mPacketSize < mOffset)
    296         mPacketSize = mOffset;
    297 }
    298 
    299 void MtpDataPacket::putInt64(int64_t value) {
    300     allocate(mOffset + 8);
    301     mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
    302     mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
    303     mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
    304     mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
    305     mBuffer[mOffset++] = (uint8_t)((value >> 32) & 0xFF);
    306     mBuffer[mOffset++] = (uint8_t)((value >> 40) & 0xFF);
    307     mBuffer[mOffset++] = (uint8_t)((value >> 48) & 0xFF);
    308     mBuffer[mOffset++] = (uint8_t)((value >> 56) & 0xFF);
    309     if (mPacketSize < mOffset)
    310         mPacketSize = mOffset;
    311 }
    312 
    313 void MtpDataPacket::putUInt64(uint64_t value) {
    314     allocate(mOffset + 8);
    315     mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
    316     mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
    317     mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
    318     mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
    319     mBuffer[mOffset++] = (uint8_t)((value >> 32) & 0xFF);
    320     mBuffer[mOffset++] = (uint8_t)((value >> 40) & 0xFF);
    321     mBuffer[mOffset++] = (uint8_t)((value >> 48) & 0xFF);
    322     mBuffer[mOffset++] = (uint8_t)((value >> 56) & 0xFF);
    323     if (mPacketSize < mOffset)
    324         mPacketSize = mOffset;
    325 }
    326 
    327 void MtpDataPacket::putInt128(const int128_t& value) {
    328     putInt32(value[0]);
    329     putInt32(value[1]);
    330     putInt32(value[2]);
    331     putInt32(value[3]);
    332 }
    333 
    334 void MtpDataPacket::putUInt128(const uint128_t& value) {
    335     putUInt32(value[0]);
    336     putUInt32(value[1]);
    337     putUInt32(value[2]);
    338     putUInt32(value[3]);
    339 }
    340 
    341 void MtpDataPacket::putInt128(int64_t value) {
    342     putInt64(value);
    343     putInt64(value < 0 ? -1 : 0);
    344 }
    345 
    346 void MtpDataPacket::putUInt128(uint64_t value) {
    347     putUInt64(value);
    348     putUInt64(0);
    349 }
    350 
    351 void MtpDataPacket::putAInt8(const int8_t* values, int count) {
    352     putUInt32(count);
    353     for (int i = 0; i < count; i++)
    354         putInt8(*values++);
    355 }
    356 
    357 void MtpDataPacket::putAUInt8(const uint8_t* values, int count) {
    358     putUInt32(count);
    359     for (int i = 0; i < count; i++)
    360         putUInt8(*values++);
    361 }
    362 
    363 void MtpDataPacket::putAInt16(const int16_t* values, int count) {
    364     putUInt32(count);
    365     for (int i = 0; i < count; i++)
    366         putInt16(*values++);
    367 }
    368 
    369 void MtpDataPacket::putAUInt16(const uint16_t* values, int count) {
    370     putUInt32(count);
    371     for (int i = 0; i < count; i++)
    372         putUInt16(*values++);
    373 }
    374 
    375 void MtpDataPacket::putAUInt16(const UInt16List* values) {
    376     size_t count = (values ? values->size() : 0);
    377     putUInt32(count);
    378     for (size_t i = 0; i < count; i++)
    379         putUInt16((*values)[i]);
    380 }
    381 
    382 void MtpDataPacket::putAInt32(const int32_t* values, int count) {
    383     putUInt32(count);
    384     for (int i = 0; i < count; i++)
    385         putInt32(*values++);
    386 }
    387 
    388 void MtpDataPacket::putAUInt32(const uint32_t* values, int count) {
    389     putUInt32(count);
    390     for (int i = 0; i < count; i++)
    391         putUInt32(*values++);
    392 }
    393 
    394 void MtpDataPacket::putAUInt32(const UInt32List* list) {
    395     if (!list) {
    396         putEmptyArray();
    397     } else {
    398         size_t size = list->size();
    399         putUInt32(size);
    400         for (size_t i = 0; i < size; i++)
    401             putUInt32((*list)[i]);
    402     }
    403 }
    404 
    405 void MtpDataPacket::putAInt64(const int64_t* values, int count) {
    406     putUInt32(count);
    407     for (int i = 0; i < count; i++)
    408         putInt64(*values++);
    409 }
    410 
    411 void MtpDataPacket::putAUInt64(const uint64_t* values, int count) {
    412     putUInt32(count);
    413     for (int i = 0; i < count; i++)
    414         putUInt64(*values++);
    415 }
    416 
    417 void MtpDataPacket::putString(const MtpStringBuffer& string) {
    418     string.writeToPacket(this);
    419 }
    420 
    421 void MtpDataPacket::putString(const char* s) {
    422     MtpStringBuffer string(s);
    423     string.writeToPacket(this);
    424 }
    425 
    426 void MtpDataPacket::putString(const uint16_t* string) {
    427     int count = 0;
    428     for (int i = 0; i <= MTP_STRING_MAX_CHARACTER_NUMBER; i++) {
    429         if (string[i])
    430             count++;
    431         else
    432             break;
    433     }
    434     putUInt8(count > 0 ? count + 1 : 0);
    435     for (int i = 0; i < count; i++)
    436         putUInt16(string[i]);
    437     // only terminate with zero if string is not empty
    438     if (count > 0)
    439         putUInt16(0);
    440 }
    441 
    442 #ifdef MTP_DEVICE
    443 int MtpDataPacket::read(IMtpHandle *h) {
    444     int ret = h->read(mBuffer, MTP_BUFFER_SIZE);
    445     if (ret < MTP_CONTAINER_HEADER_SIZE)
    446         return -1;
    447     mPacketSize = ret;
    448     mOffset = MTP_CONTAINER_HEADER_SIZE;
    449     return ret;
    450 }
    451 
    452 int MtpDataPacket::write(IMtpHandle *h) {
    453     MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
    454     MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
    455     int ret = h->write(mBuffer, mPacketSize);
    456     return (ret < 0 ? ret : 0);
    457 }
    458 
    459 int MtpDataPacket::writeData(IMtpHandle *h, void* data, uint32_t length) {
    460     allocate(length + MTP_CONTAINER_HEADER_SIZE);
    461     memcpy(mBuffer + MTP_CONTAINER_HEADER_SIZE, data, length);
    462     length += MTP_CONTAINER_HEADER_SIZE;
    463     MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, length);
    464     MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
    465     int ret = h->write(mBuffer, length);
    466     return (ret < 0 ? ret : 0);
    467 }
    468 
    469 #endif // MTP_DEVICE
    470 
    471 #ifdef MTP_HOST
    472 int MtpDataPacket::read(struct usb_request *request) {
    473     // first read the header
    474     request->buffer = mBuffer;
    475     request->buffer_length = mBufferSize;
    476     int length = transfer(request);
    477     if (length >= MTP_CONTAINER_HEADER_SIZE) {
    478         // look at the length field to see if the data spans multiple packets
    479         uint32_t totalLength = MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET);
    480         allocate(totalLength);
    481         while (totalLength > static_cast<uint32_t>(length)) {
    482             request->buffer = mBuffer + length;
    483             request->buffer_length = totalLength - length;
    484             int ret = transfer(request);
    485             if (ret >= 0)
    486                 length += ret;
    487             else {
    488                 length = ret;
    489                 break;
    490             }
    491         }
    492     }
    493     if (length >= 0)
    494         mPacketSize = length;
    495     return length;
    496 }
    497 
    498 int MtpDataPacket::readData(struct usb_request *request, void* buffer, int length) {
    499     int read = 0;
    500     while (read < length) {
    501         request->buffer = (char *)buffer + read;
    502         request->buffer_length = length - read;
    503         int ret = transfer(request);
    504         if (ret < 0) {
    505             return ret;
    506         }
    507         read += ret;
    508     }
    509     return read;
    510 }
    511 
    512 // Queue a read request.  Call readDataWait to wait for result
    513 int MtpDataPacket::readDataAsync(struct usb_request *req) {
    514     if (usb_request_queue(req)) {
    515         ALOGE("usb_endpoint_queue failed, errno: %d", errno);
    516         return -1;
    517     }
    518     return 0;
    519 }
    520 
    521 // Wait for result of readDataAsync
    522 int MtpDataPacket::readDataWait(struct usb_device *device) {
    523     struct usb_request *req = usb_request_wait(device, -1);
    524     return (req ? req->actual_length : -1);
    525 }
    526 
    527 int MtpDataPacket::readDataHeader(struct usb_request *request) {
    528     request->buffer = mBuffer;
    529     request->buffer_length = request->max_packet_size;
    530     int length = transfer(request);
    531     if (length >= 0)
    532         mPacketSize = length;
    533     return length;
    534 }
    535 
    536 int MtpDataPacket::write(struct usb_request *request, UrbPacketDivisionMode divisionMode) {
    537     if (mPacketSize < MTP_CONTAINER_HEADER_SIZE || mPacketSize > MTP_BUFFER_SIZE) {
    538         ALOGE("Illegal packet size.");
    539         return -1;
    540     }
    541 
    542     MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
    543     MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
    544 
    545     size_t processedBytes = 0;
    546     while (processedBytes < mPacketSize) {
    547         const size_t write_size =
    548                 processedBytes == 0 && divisionMode == FIRST_PACKET_ONLY_HEADER ?
    549                         MTP_CONTAINER_HEADER_SIZE : mPacketSize - processedBytes;
    550         request->buffer = mBuffer + processedBytes;
    551         request->buffer_length = write_size;
    552         const int result = transfer(request);
    553         if (result < 0) {
    554             ALOGE("Failed to write bytes to the device.");
    555             return -1;
    556         }
    557         processedBytes += result;
    558     }
    559 
    560     return processedBytes == mPacketSize ? processedBytes : -1;
    561 }
    562 
    563 int MtpDataPacket::write(struct usb_request *request,
    564                          UrbPacketDivisionMode divisionMode,
    565                          int fd,
    566                          size_t payloadSize) {
    567     // Obtain the greatest multiple of minimum packet size that is not greater than
    568     // MTP_BUFFER_SIZE.
    569     if (request->max_packet_size <= 0) {
    570         ALOGE("Cannot determine bulk transfer size due to illegal max packet size %d.",
    571               request->max_packet_size);
    572         return -1;
    573     }
    574     const size_t maxBulkTransferSize =
    575             MTP_BUFFER_SIZE - (MTP_BUFFER_SIZE % request->max_packet_size);
    576     const size_t containerLength = payloadSize + MTP_CONTAINER_HEADER_SIZE;
    577     size_t processedBytes = 0;
    578     bool readError = false;
    579 
    580     // Bind the packet with given request.
    581     request->buffer = mBuffer;
    582     allocate(maxBulkTransferSize);
    583 
    584     while (processedBytes < containerLength) {
    585         size_t bulkTransferSize = 0;
    586 
    587         // prepare header.
    588         const bool headerSent = processedBytes != 0;
    589         if (!headerSent) {
    590             MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, containerLength);
    591             MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
    592             bulkTransferSize += MTP_CONTAINER_HEADER_SIZE;
    593         }
    594 
    595         // Prepare payload.
    596         if (headerSent || divisionMode == FIRST_PACKET_HAS_PAYLOAD) {
    597             const size_t processedPayloadBytes =
    598                     headerSent ? processedBytes - MTP_CONTAINER_HEADER_SIZE : 0;
    599             const size_t maxRead = payloadSize - processedPayloadBytes;
    600             const size_t maxWrite = maxBulkTransferSize - bulkTransferSize;
    601             const size_t bulkTransferPayloadSize = std::min(maxRead, maxWrite);
    602             // prepare payload.
    603             if (!readError) {
    604                 const ssize_t result = readExactBytes(
    605                         fd,
    606                         mBuffer + bulkTransferSize,
    607                         bulkTransferPayloadSize);
    608                 if (result < 0) {
    609                     ALOGE("Found an error while reading data from FD. Send 0 data instead.");
    610                     readError = true;
    611                 }
    612             }
    613             if (readError) {
    614                 memset(mBuffer + bulkTransferSize, 0, bulkTransferPayloadSize);
    615             }
    616             bulkTransferSize += bulkTransferPayloadSize;
    617         }
    618 
    619         // Bulk transfer.
    620         mPacketSize = bulkTransferSize;
    621         request->buffer_length = bulkTransferSize;
    622         const int result = transfer(request);
    623         if (result != static_cast<ssize_t>(bulkTransferSize)) {
    624             // Cannot recover writing error.
    625             ALOGE("Found an error while write data to MtpDevice.");
    626             return -1;
    627         }
    628 
    629         // Update variables.
    630         processedBytes += bulkTransferSize;
    631     }
    632 
    633     return readError ? -1 : processedBytes;
    634 }
    635 
    636 #endif // MTP_HOST
    637 
    638 void* MtpDataPacket::getData(int* outLength) const {
    639     int length = mPacketSize - MTP_CONTAINER_HEADER_SIZE;
    640     if (length > 0) {
    641         void* result = malloc(length);
    642         if (result) {
    643             memcpy(result, mBuffer + MTP_CONTAINER_HEADER_SIZE, length);
    644             *outLength = length;
    645             return result;
    646         }
    647     }
    648     *outLength = 0;
    649     return NULL;
    650 }
    651 
    652 }  // namespace android
    653