116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood/* 216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * you may not use this file except in compliance with the License. 616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * You may obtain a copy of the License at 716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * 1016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * Unless required by applicable law or agreed to in writing, software 1116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * See the License for the specific language governing permissions and 1416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood * limitations under the License. 1516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood */ 1616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 17b14e588bec4d5e39e61b020b5b575f2ce555d316Mike Lockwood#define LOG_TAG "MtpRequestPacket" 18b14e588bec4d5e39e61b020b5b575f2ce555d316Mike Lockwood 1916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <stdio.h> 2016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <sys/types.h> 2116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include <fcntl.h> 2216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 23487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include "IMtpHandle.h" 2416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#include "MtpRequestPacket.h" 2516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 2642d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood#include <usbhost/usbhost.h> 2742d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood 287850ef999740f214a1990a9c090d3f3865d435aaMike Lockwoodnamespace android { 297850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood 3016864bae0f51c32c456da2c43adf7a057c0c4882Mike LockwoodMtpRequestPacket::MtpRequestPacket() 31ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood : MtpPacket(512), 32ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood mParameterCount(0) 3316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood{ 3416864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood} 3516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 3616864bae0f51c32c456da2c43adf7a057c0c4882Mike LockwoodMtpRequestPacket::~MtpRequestPacket() { 3716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood} 3816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 3916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#ifdef MTP_DEVICE 40487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint MtpRequestPacket::read(IMtpHandle *h) { 41487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int ret = h->read(mBuffer, mBufferSize); 42ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood if (ret < 0) { 43ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood // file read error 44ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood return ret; 45ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood } 46ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood 47ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood // request packet should have 12 byte header followed by 0 to 5 32-bit arguments 48b3be006498f28f2630264135e88d266b540bcec3Daichi Hirono const size_t read_size = static_cast<size_t>(ret); 49b3be006498f28f2630264135e88d266b540bcec3Daichi Hirono if (read_size >= MTP_CONTAINER_HEADER_SIZE 50b3be006498f28f2630264135e88d266b540bcec3Daichi Hirono && read_size <= MTP_CONTAINER_HEADER_SIZE + 5 * sizeof(uint32_t) 51b3be006498f28f2630264135e88d266b540bcec3Daichi Hirono && ((read_size - MTP_CONTAINER_HEADER_SIZE) & 3) == 0) { 52b3be006498f28f2630264135e88d266b540bcec3Daichi Hirono mPacketSize = read_size; 53b3be006498f28f2630264135e88d266b540bcec3Daichi Hirono mParameterCount = (read_size - MTP_CONTAINER_HEADER_SIZE) / sizeof(uint32_t); 54ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood } else { 55ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood ALOGE("Malformed MTP request packet"); 56ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood ret = -1; 57ab063847e6e893740749029a04cce1f6b7345ed5Mike Lockwood } 5816864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood return ret; 5916864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood} 6016864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#endif 6116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood 6216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#ifdef MTP_HOST 6316864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood // write our buffer to the given endpoint (host mode) 6442d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwoodint MtpRequestPacket::write(struct usb_request *request) 6516864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood{ 6616864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize); 6716864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_COMMAND); 6842d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood request->buffer = mBuffer; 6942d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood request->buffer_length = mPacketSize; 7042d0b79a787814d42e4c6f9dfe14f13cc0f6a758Mike Lockwood return transfer(request); 7116864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood} 7216864bae0f51c32c456da2c43adf7a057c0c4882Mike Lockwood#endif 737850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood 747850ef999740f214a1990a9c090d3f3865d435aaMike Lockwood} // namespace android 75