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