summaryrefslogtreecommitdiffstats
path: root/media/mtp
diff options
context:
space:
mode:
Diffstat (limited to 'media/mtp')
-rw-r--r--media/mtp/Android.mk75
-rw-r--r--media/mtp/MtpDataPacket.cpp490
-rw-r--r--media/mtp/MtpDataPacket.h124
-rw-r--r--media/mtp/MtpDatabase.h113
-rw-r--r--media/mtp/MtpDebug.cpp402
-rw-r--r--media/mtp/MtpDebug.h37
-rw-r--r--media/mtp/MtpDevice.cpp835
-rw-r--r--media/mtp/MtpDevice.h116
-rw-r--r--media/mtp/MtpDeviceInfo.cpp97
-rw-r--r--media/mtp/MtpDeviceInfo.h54
-rw-r--r--media/mtp/MtpEventPacket.cpp70
-rw-r--r--media/mtp/MtpEventPacket.h48
-rw-r--r--media/mtp/MtpObjectInfo.cpp108
-rw-r--r--media/mtp/MtpObjectInfo.h60
-rw-r--r--media/mtp/MtpPacket.cpp166
-rw-r--r--media/mtp/MtpPacket.h72
-rw-r--r--media/mtp/MtpProperty.cpp534
-rw-r--r--media/mtp/MtpProperty.h114
-rw-r--r--media/mtp/MtpRequestPacket.cpp60
-rw-r--r--media/mtp/MtpRequestPacket.h50
-rw-r--r--media/mtp/MtpResponsePacket.cpp60
-rw-r--r--media/mtp/MtpResponsePacket.h48
-rw-r--r--media/mtp/MtpServer.cpp1210
-rw-r--r--media/mtp/MtpServer.h154
-rw-r--r--media/mtp/MtpStorage.cpp86
-rw-r--r--media/mtp/MtpStorage.h59
-rw-r--r--media/mtp/MtpStorageInfo.cpp72
-rw-r--r--media/mtp/MtpStorageInfo.h49
-rw-r--r--media/mtp/MtpStringBuffer.cpp171
-rw-r--r--media/mtp/MtpStringBuffer.h57
-rw-r--r--media/mtp/MtpTypes.h78
-rw-r--r--media/mtp/MtpUtils.cpp80
-rw-r--r--media/mtp/MtpUtils.h29
-rw-r--r--media/mtp/mtp.h492
34 files changed, 0 insertions, 6270 deletions
diff --git a/media/mtp/Android.mk b/media/mtp/Android.mk
deleted file mode 100644
index fc7fc4f..0000000
--- a/media/mtp/Android.mk
+++ /dev/null
@@ -1,75 +0,0 @@
-#
-# Copyright (C) 2010 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- MtpDataPacket.cpp \
- MtpDebug.cpp \
- MtpDevice.cpp \
- MtpEventPacket.cpp \
- MtpDeviceInfo.cpp \
- MtpObjectInfo.cpp \
- MtpPacket.cpp \
- MtpProperty.cpp \
- MtpRequestPacket.cpp \
- MtpResponsePacket.cpp \
- MtpServer.cpp \
- MtpStorageInfo.cpp \
- MtpStringBuffer.cpp \
- MtpStorage.cpp \
- MtpUtils.cpp \
-
-LOCAL_MODULE:= libmtp
-
-LOCAL_CFLAGS := -DMTP_DEVICE -DMTP_HOST
-
-# Needed for <bionic_time.h>
-LOCAL_C_INCLUDES := bionic/libc/private
-
-LOCAL_SHARED_LIBRARIES := libutils libcutils libusbhost libbinder
-
-include $(BUILD_SHARED_LIBRARY)
-
-ifeq ($(HOST_OS),linux)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
- MtpDataPacket.cpp \
- MtpDebug.cpp \
- MtpDevice.cpp \
- MtpEventPacket.cpp \
- MtpDeviceInfo.cpp \
- MtpObjectInfo.cpp \
- MtpPacket.cpp \
- MtpProperty.cpp \
- MtpRequestPacket.cpp \
- MtpResponsePacket.cpp \
- MtpStorageInfo.cpp \
- MtpStringBuffer.cpp \
- MtpStorage.cpp \
- MtpUtils.cpp \
-
-LOCAL_MODULE:= libmtp
-
-LOCAL_CFLAGS := -DMTP_HOST
-
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-endif
diff --git a/media/mtp/MtpDataPacket.cpp b/media/mtp/MtpDataPacket.cpp
deleted file mode 100644
index 930f0b0..0000000
--- a/media/mtp/MtpDataPacket.cpp
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpDataPacket"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#include <usbhost/usbhost.h>
-
-#include "MtpDataPacket.h"
-#include "MtpStringBuffer.h"
-
-#define MTP_BUFFER_SIZE 16384
-
-namespace android {
-
-MtpDataPacket::MtpDataPacket()
- : MtpPacket(MTP_BUFFER_SIZE), // MAX_USBFS_BUFFER_SIZE
- mOffset(MTP_CONTAINER_HEADER_SIZE)
-{
-}
-
-MtpDataPacket::~MtpDataPacket() {
-}
-
-void MtpDataPacket::reset() {
- MtpPacket::reset();
- mOffset = MTP_CONTAINER_HEADER_SIZE;
-}
-
-void MtpDataPacket::setOperationCode(MtpOperationCode code) {
- MtpPacket::putUInt16(MTP_CONTAINER_CODE_OFFSET, code);
-}
-
-void MtpDataPacket::setTransactionID(MtpTransactionID id) {
- MtpPacket::putUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET, id);
-}
-
-uint16_t MtpDataPacket::getUInt16() {
- int offset = mOffset;
- uint16_t result = (uint16_t)mBuffer[offset] | ((uint16_t)mBuffer[offset + 1] << 8);
- mOffset += 2;
- return result;
-}
-
-uint32_t MtpDataPacket::getUInt32() {
- int offset = mOffset;
- uint32_t result = (uint32_t)mBuffer[offset] | ((uint32_t)mBuffer[offset + 1] << 8) |
- ((uint32_t)mBuffer[offset + 2] << 16) | ((uint32_t)mBuffer[offset + 3] << 24);
- mOffset += 4;
- return result;
-}
-
-uint64_t MtpDataPacket::getUInt64() {
- int offset = mOffset;
- uint64_t result = (uint64_t)mBuffer[offset] | ((uint64_t)mBuffer[offset + 1] << 8) |
- ((uint64_t)mBuffer[offset + 2] << 16) | ((uint64_t)mBuffer[offset + 3] << 24) |
- ((uint64_t)mBuffer[offset + 4] << 32) | ((uint64_t)mBuffer[offset + 5] << 40) |
- ((uint64_t)mBuffer[offset + 6] << 48) | ((uint64_t)mBuffer[offset + 7] << 56);
- mOffset += 8;
- return result;
-}
-
-void MtpDataPacket::getUInt128(uint128_t& value) {
- value[0] = getUInt32();
- value[1] = getUInt32();
- value[2] = getUInt32();
- value[3] = getUInt32();
-}
-
-void MtpDataPacket::getString(MtpStringBuffer& string)
-{
- string.readFromPacket(this);
-}
-
-Int8List* MtpDataPacket::getAInt8() {
- Int8List* result = new Int8List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getInt8());
- return result;
-}
-
-UInt8List* MtpDataPacket::getAUInt8() {
- UInt8List* result = new UInt8List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getUInt8());
- return result;
-}
-
-Int16List* MtpDataPacket::getAInt16() {
- Int16List* result = new Int16List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getInt16());
- return result;
-}
-
-UInt16List* MtpDataPacket::getAUInt16() {
- UInt16List* result = new UInt16List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getUInt16());
- return result;
-}
-
-Int32List* MtpDataPacket::getAInt32() {
- Int32List* result = new Int32List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getInt32());
- return result;
-}
-
-UInt32List* MtpDataPacket::getAUInt32() {
- UInt32List* result = new UInt32List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getUInt32());
- return result;
-}
-
-Int64List* MtpDataPacket::getAInt64() {
- Int64List* result = new Int64List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getInt64());
- return result;
-}
-
-UInt64List* MtpDataPacket::getAUInt64() {
- UInt64List* result = new UInt64List;
- int count = getUInt32();
- for (int i = 0; i < count; i++)
- result->push(getUInt64());
- return result;
-}
-
-void MtpDataPacket::putInt8(int8_t value) {
- allocate(mOffset + 1);
- mBuffer[mOffset++] = (uint8_t)value;
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt8(uint8_t value) {
- allocate(mOffset + 1);
- mBuffer[mOffset++] = (uint8_t)value;
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt16(int16_t value) {
- allocate(mOffset + 2);
- mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt16(uint16_t value) {
- allocate(mOffset + 2);
- mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt32(int32_t value) {
- allocate(mOffset + 4);
- mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt32(uint32_t value) {
- allocate(mOffset + 4);
- mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt64(int64_t value) {
- allocate(mOffset + 8);
- mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 32) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 40) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 48) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 56) & 0xFF);
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putUInt64(uint64_t value) {
- allocate(mOffset + 8);
- mBuffer[mOffset++] = (uint8_t)(value & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 8) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 16) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 24) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 32) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 40) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 48) & 0xFF);
- mBuffer[mOffset++] = (uint8_t)((value >> 56) & 0xFF);
- if (mPacketSize < mOffset)
- mPacketSize = mOffset;
-}
-
-void MtpDataPacket::putInt128(const int128_t& value) {
- putInt32(value[0]);
- putInt32(value[1]);
- putInt32(value[2]);
- putInt32(value[3]);
-}
-
-void MtpDataPacket::putUInt128(const uint128_t& value) {
- putUInt32(value[0]);
- putUInt32(value[1]);
- putUInt32(value[2]);
- putUInt32(value[3]);
-}
-
-void MtpDataPacket::putInt128(int64_t value) {
- putInt64(value);
- putInt64(value < 0 ? -1 : 0);
-}
-
-void MtpDataPacket::putUInt128(uint64_t value) {
- putUInt64(value);
- putUInt64(0);
-}
-
-void MtpDataPacket::putAInt8(const int8_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putInt8(*values++);
-}
-
-void MtpDataPacket::putAUInt8(const uint8_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putUInt8(*values++);
-}
-
-void MtpDataPacket::putAInt16(const int16_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putInt16(*values++);
-}
-
-void MtpDataPacket::putAUInt16(const uint16_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putUInt16(*values++);
-}
-
-void MtpDataPacket::putAUInt16(const UInt16List* values) {
- size_t count = (values ? values->size() : 0);
- putUInt32(count);
- for (size_t i = 0; i < count; i++)
- putUInt16((*values)[i]);
-}
-
-void MtpDataPacket::putAInt32(const int32_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putInt32(*values++);
-}
-
-void MtpDataPacket::putAUInt32(const uint32_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putUInt32(*values++);
-}
-
-void MtpDataPacket::putAUInt32(const UInt32List* list) {
- if (!list) {
- putEmptyArray();
- } else {
- size_t size = list->size();
- putUInt32(size);
- for (size_t i = 0; i < size; i++)
- putUInt32((*list)[i]);
- }
-}
-
-void MtpDataPacket::putAInt64(const int64_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putInt64(*values++);
-}
-
-void MtpDataPacket::putAUInt64(const uint64_t* values, int count) {
- putUInt32(count);
- for (int i = 0; i < count; i++)
- putUInt64(*values++);
-}
-
-void MtpDataPacket::putString(const MtpStringBuffer& string) {
- string.writeToPacket(this);
-}
-
-void MtpDataPacket::putString(const char* s) {
- MtpStringBuffer string(s);
- string.writeToPacket(this);
-}
-
-void MtpDataPacket::putString(const uint16_t* string) {
- int count = 0;
- for (int i = 0; i < 256; i++) {
- if (string[i])
- count++;
- else
- break;
- }
- putUInt8(count > 0 ? count + 1 : 0);
- for (int i = 0; i < count; i++)
- putUInt16(string[i]);
- // only terminate with zero if string is not empty
- if (count > 0)
- putUInt16(0);
-}
-
-#ifdef MTP_DEVICE
-int MtpDataPacket::read(int fd) {
- int ret = ::read(fd, mBuffer, MTP_BUFFER_SIZE);
- if (ret < MTP_CONTAINER_HEADER_SIZE)
- return -1;
- mPacketSize = ret;
- mOffset = MTP_CONTAINER_HEADER_SIZE;
- return ret;
-}
-
-int MtpDataPacket::write(int fd) {
- MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
- MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
- int ret = ::write(fd, mBuffer, mPacketSize);
- return (ret < 0 ? ret : 0);
-}
-
-int MtpDataPacket::writeData(int fd, void* data, uint32_t length) {
- allocate(length);
- memcpy(mBuffer + MTP_CONTAINER_HEADER_SIZE, data, length);
- length += MTP_CONTAINER_HEADER_SIZE;
- MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, length);
- MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
- int ret = ::write(fd, mBuffer, length);
- return (ret < 0 ? ret : 0);
-}
-
-#endif // MTP_DEVICE
-
-#ifdef MTP_HOST
-int MtpDataPacket::read(struct usb_request *request) {
- // first read the header
- request->buffer = mBuffer;
- request->buffer_length = mBufferSize;
- int length = transfer(request);
- if (length >= MTP_CONTAINER_HEADER_SIZE) {
- // look at the length field to see if the data spans multiple packets
- uint32_t totalLength = MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET);
- allocate(totalLength);
- while (totalLength > length) {
- request->buffer = mBuffer + length;
- request->buffer_length = totalLength - length;
- int ret = transfer(request);
- if (ret >= 0)
- length += ret;
- else {
- length = ret;
- break;
- }
- }
- }
- if (length >= 0)
- mPacketSize = length;
- return length;
-}
-
-int MtpDataPacket::readData(struct usb_request *request, void* buffer, int length) {
- int read = 0;
- while (read < length) {
- request->buffer = (char *)buffer + read;
- request->buffer_length = length - read;
- int ret = transfer(request);
- if (ret < 0) {
- return ret;
- }
- read += ret;
- }
- return read;
-}
-
-// Queue a read request. Call readDataWait to wait for result
-int MtpDataPacket::readDataAsync(struct usb_request *req) {
- if (usb_request_queue(req)) {
- ALOGE("usb_endpoint_queue failed, errno: %d", errno);
- return -1;
- }
- return 0;
-}
-
-// Wait for result of readDataAsync
-int MtpDataPacket::readDataWait(struct usb_device *device) {
- struct usb_request *req = usb_request_wait(device);
- return (req ? req->actual_length : -1);
-}
-
-int MtpDataPacket::readDataHeader(struct usb_request *request) {
- request->buffer = mBuffer;
- request->buffer_length = request->max_packet_size;
- int length = transfer(request);
- if (length >= 0)
- mPacketSize = length;
- return length;
-}
-
-int MtpDataPacket::writeDataHeader(struct usb_request *request, uint32_t length) {
- MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, length);
- MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
- request->buffer = mBuffer;
- request->buffer_length = MTP_CONTAINER_HEADER_SIZE;
- int ret = transfer(request);
- return (ret < 0 ? ret : 0);
-}
-
-int MtpDataPacket::write(struct usb_request *request) {
- MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
- MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);
-
- // send header separately from data
- request->buffer = mBuffer;
- request->buffer_length = MTP_CONTAINER_HEADER_SIZE;
- int ret = transfer(request);
- if (ret == MTP_CONTAINER_HEADER_SIZE) {
- request->buffer = mBuffer + MTP_CONTAINER_HEADER_SIZE;
- request->buffer_length = mPacketSize - MTP_CONTAINER_HEADER_SIZE;
- ret = transfer(request);
- }
- return (ret < 0 ? ret : 0);
-}
-
-int MtpDataPacket::write(struct usb_request *request, void* buffer, uint32_t length) {
- request->buffer = buffer;
- request->buffer_length = length;
- int ret = transfer(request);
- return (ret < 0 ? ret : 0);
-}
-
-#endif // MTP_HOST
-
-void* MtpDataPacket::getData(int& outLength) const {
- int length = mPacketSize - MTP_CONTAINER_HEADER_SIZE;
- if (length > 0) {
- void* result = malloc(length);
- if (result) {
- memcpy(result, mBuffer + MTP_CONTAINER_HEADER_SIZE, length);
- outLength = length;
- return result;
- }
- }
- outLength = 0;
- return NULL;
-}
-
-} // namespace android
diff --git a/media/mtp/MtpDataPacket.h b/media/mtp/MtpDataPacket.h
deleted file mode 100644
index 2b81063..0000000
--- a/media/mtp/MtpDataPacket.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_DATA_PACKET_H
-#define _MTP_DATA_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-struct usb_device;
-struct usb_request;
-
-namespace android {
-
-class MtpStringBuffer;
-
-class MtpDataPacket : public MtpPacket {
-private:
- // current offset for get/put methods
- int mOffset;
-
-public:
- MtpDataPacket();
- virtual ~MtpDataPacket();
-
- virtual void reset();
-
- void setOperationCode(MtpOperationCode code);
- void setTransactionID(MtpTransactionID id);
-
- inline const uint8_t* getData() const { return mBuffer + MTP_CONTAINER_HEADER_SIZE; }
- inline uint8_t getUInt8() { return (uint8_t)mBuffer[mOffset++]; }
- inline int8_t getInt8() { return (int8_t)mBuffer[mOffset++]; }
- uint16_t getUInt16();
- inline int16_t getInt16() { return (int16_t)getUInt16(); }
- uint32_t getUInt32();
- inline int32_t getInt32() { return (int32_t)getUInt32(); }
- uint64_t getUInt64();
- inline int64_t getInt64() { return (int64_t)getUInt64(); }
- void getUInt128(uint128_t& value);
- inline void getInt128(int128_t& value) { getUInt128((uint128_t&)value); }
- void getString(MtpStringBuffer& string);
-
- Int8List* getAInt8();
- UInt8List* getAUInt8();
- Int16List* getAInt16();
- UInt16List* getAUInt16();
- Int32List* getAInt32();
- UInt32List* getAUInt32();
- Int64List* getAInt64();
- UInt64List* getAUInt64();
-
- void putInt8(int8_t value);
- void putUInt8(uint8_t value);
- void putInt16(int16_t value);
- void putUInt16(uint16_t value);
- void putInt32(int32_t value);
- void putUInt32(uint32_t value);
- void putInt64(int64_t value);
- void putUInt64(uint64_t value);
- void putInt128(const int128_t& value);
- void putUInt128(const uint128_t& value);
- void putInt128(int64_t value);
- void putUInt128(uint64_t value);
-
- void putAInt8(const int8_t* values, int count);
- void putAUInt8(const uint8_t* values, int count);
- void putAInt16(const int16_t* values, int count);
- void putAUInt16(const uint16_t* values, int count);
- void putAUInt16(const UInt16List* values);
- void putAInt32(const int32_t* values, int count);
- void putAUInt32(const uint32_t* values, int count);
- void putAUInt32(const UInt32List* list);
- void putAInt64(const int64_t* values, int count);
- void putAUInt64(const uint64_t* values, int count);
- void putString(const MtpStringBuffer& string);
- void putString(const char* string);
- void putString(const uint16_t* string);
- inline void putEmptyString() { putUInt8(0); }
- inline void putEmptyArray() { putUInt32(0); }
-
-
-#ifdef MTP_DEVICE
- // fill our buffer with data from the given file descriptor
- int read(int fd);
-
- // write our data to the given file descriptor
- int write(int fd);
- int writeData(int fd, void* data, uint32_t length);
-#endif
-
-#ifdef MTP_HOST
- int read(struct usb_request *request);
- int readData(struct usb_request *request, void* buffer, int length);
- int readDataAsync(struct usb_request *req);
- int readDataWait(struct usb_device *device);
- int readDataHeader(struct usb_request *ep);
-
- int writeDataHeader(struct usb_request *ep, uint32_t length);
- int write(struct usb_request *ep);
- int write(struct usb_request *ep, void* buffer, uint32_t length);
-#endif
-
- inline bool hasData() const { return mPacketSize > MTP_CONTAINER_HEADER_SIZE; }
- inline uint32_t getContainerLength() const { return MtpPacket::getUInt32(MTP_CONTAINER_LENGTH_OFFSET); }
- void* getData(int& outLength) const;
-};
-
-}; // namespace android
-
-#endif // _MTP_DATA_PACKET_H
diff --git a/media/mtp/MtpDatabase.h b/media/mtp/MtpDatabase.h
deleted file mode 100644
index 4e6ac7a..0000000
--- a/media/mtp/MtpDatabase.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_DATABASE_H
-#define _MTP_DATABASE_H
-
-#include "MtpTypes.h"
-
-namespace android {
-
-class MtpDataPacket;
-class MtpProperty;
-class MtpObjectInfo;
-
-class MtpDatabase {
-public:
- virtual ~MtpDatabase() {}
-
- // called from SendObjectInfo to reserve a database entry for the incoming file
- virtual MtpObjectHandle beginSendObject(const char* path,
- MtpObjectFormat format,
- MtpObjectHandle parent,
- MtpStorageID storage,
- uint64_t size,
- time_t modified) = 0;
-
- // called to report success or failure of the SendObject file transfer
- // success should signal a notification of the new object's creation,
- // failure should remove the database entry created in beginSendObject
- virtual void endSendObject(const char* path,
- MtpObjectHandle handle,
- MtpObjectFormat format,
- bool succeeded) = 0;
-
- virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID,
- MtpObjectFormat format,
- MtpObjectHandle parent) = 0;
-
- virtual int getNumObjects(MtpStorageID storageID,
- MtpObjectFormat format,
- MtpObjectHandle parent) = 0;
-
- // callee should delete[] the results from these
- // results can be NULL
- virtual MtpObjectFormatList* getSupportedPlaybackFormats() = 0;
- virtual MtpObjectFormatList* getSupportedCaptureFormats() = 0;
- virtual MtpObjectPropertyList* getSupportedObjectProperties(MtpObjectFormat format) = 0;
- virtual MtpDevicePropertyList* getSupportedDeviceProperties() = 0;
-
- virtual MtpResponseCode getObjectPropertyValue(MtpObjectHandle handle,
- MtpObjectProperty property,
- MtpDataPacket& packet) = 0;
-
- virtual MtpResponseCode setObjectPropertyValue(MtpObjectHandle handle,
- MtpObjectProperty property,
- MtpDataPacket& packet) = 0;
-
- virtual MtpResponseCode getDevicePropertyValue(MtpDeviceProperty property,
- MtpDataPacket& packet) = 0;
-
- virtual MtpResponseCode setDevicePropertyValue(MtpDeviceProperty property,
- MtpDataPacket& packet) = 0;
-
- virtual MtpResponseCode resetDeviceProperty(MtpDeviceProperty property) = 0;
-
- virtual MtpResponseCode getObjectPropertyList(MtpObjectHandle handle,
- uint32_t format, uint32_t property,
- int groupCode, int depth,
- MtpDataPacket& packet) = 0;
-
- virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle,
- MtpObjectInfo& info) = 0;
-
- virtual void* getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) = 0;
-
- virtual MtpResponseCode getObjectFilePath(MtpObjectHandle handle,
- MtpString& outFilePath,
- int64_t& outFileLength,
- MtpObjectFormat& outFormat) = 0;
-
- virtual MtpResponseCode deleteFile(MtpObjectHandle handle) = 0;
-
- virtual MtpObjectHandleList* getObjectReferences(MtpObjectHandle handle) = 0;
-
- virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle,
- MtpObjectHandleList* references) = 0;
-
- virtual MtpProperty* getObjectPropertyDesc(MtpObjectProperty property,
- MtpObjectFormat format) = 0;
-
- virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property) = 0;
-
- virtual void sessionStarted() = 0;
-
- virtual void sessionEnded() = 0;
-};
-
-}; // namespace android
-
-#endif // _MTP_DATABASE_H
diff --git a/media/mtp/MtpDebug.cpp b/media/mtp/MtpDebug.cpp
deleted file mode 100644
index 9f3037d..0000000
--- a/media/mtp/MtpDebug.cpp
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "MtpDebug.h"
-
-namespace android {
-
-struct CodeEntry {
- const char* name;
- uint16_t code;
-};
-
-static const CodeEntry sOperationCodes[] = {
- { "MTP_OPERATION_GET_DEVICE_INFO", 0x1001 },
- { "MTP_OPERATION_OPEN_SESSION", 0x1002 },
- { "MTP_OPERATION_CLOSE_SESSION", 0x1003 },
- { "MTP_OPERATION_GET_STORAGE_IDS", 0x1004 },
- { "MTP_OPERATION_GET_STORAGE_INFO", 0x1005 },
- { "MTP_OPERATION_GET_NUM_OBJECTS", 0x1006 },
- { "MTP_OPERATION_GET_OBJECT_HANDLES", 0x1007 },
- { "MTP_OPERATION_GET_OBJECT_INFO", 0x1008 },
- { "MTP_OPERATION_GET_OBJECT", 0x1009 },
- { "MTP_OPERATION_GET_THUMB", 0x100A },
- { "MTP_OPERATION_DELETE_OBJECT", 0x100B },
- { "MTP_OPERATION_SEND_OBJECT_INFO", 0x100C },
- { "MTP_OPERATION_SEND_OBJECT", 0x100D },
- { "MTP_OPERATION_INITIATE_CAPTURE", 0x100E },
- { "MTP_OPERATION_FORMAT_STORE", 0x100F },
- { "MTP_OPERATION_RESET_DEVICE", 0x1010 },
- { "MTP_OPERATION_SELF_TEST", 0x1011 },
- { "MTP_OPERATION_SET_OBJECT_PROTECTION", 0x1012 },
- { "MTP_OPERATION_POWER_DOWN", 0x1013 },
- { "MTP_OPERATION_GET_DEVICE_PROP_DESC", 0x1014 },
- { "MTP_OPERATION_GET_DEVICE_PROP_VALUE", 0x1015 },
- { "MTP_OPERATION_SET_DEVICE_PROP_VALUE", 0x1016 },
- { "MTP_OPERATION_RESET_DEVICE_PROP_VALUE", 0x1017 },
- { "MTP_OPERATION_TERMINATE_OPEN_CAPTURE", 0x1018 },
- { "MTP_OPERATION_MOVE_OBJECT", 0x1019 },
- { "MTP_OPERATION_COPY_OBJECT", 0x101A },
- { "MTP_OPERATION_GET_PARTIAL_OBJECT", 0x101B },
- { "MTP_OPERATION_INITIATE_OPEN_CAPTURE", 0x101C },
- { "MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED", 0x9801 },
- { "MTP_OPERATION_GET_OBJECT_PROP_DESC", 0x9802 },
- { "MTP_OPERATION_GET_OBJECT_PROP_VALUE", 0x9803 },
- { "MTP_OPERATION_SET_OBJECT_PROP_VALUE", 0x9804 },
- { "MTP_OPERATION_GET_OBJECT_PROP_LIST", 0x9805 },
- { "MTP_OPERATION_SET_OBJECT_PROP_LIST", 0x9806 },
- { "MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC", 0x9807 },
- { "MTP_OPERATION_SEND_OBJECT_PROP_LIST", 0x9808 },
- { "MTP_OPERATION_GET_OBJECT_REFERENCES", 0x9810 },
- { "MTP_OPERATION_SET_OBJECT_REFERENCES", 0x9811 },
- { "MTP_OPERATION_SKIP", 0x9820 },
- // android extensions
- { "MTP_OPERATION_GET_PARTIAL_OBJECT_64", 0x95C1 },
- { "MTP_OPERATION_SEND_PARTIAL_OBJECT", 0x95C2 },
- { "MTP_OPERATION_TRUNCATE_OBJECT", 0x95C3 },
- { "MTP_OPERATION_BEGIN_EDIT_OBJECT", 0x95C4 },
- { "MTP_OPERATION_END_EDIT_OBJECT", 0x95C5 },
- { 0, 0 },
-};
-
-static const CodeEntry sFormatCodes[] = {
- { "MTP_FORMAT_UNDEFINED", 0x3000 },
- { "MTP_FORMAT_ASSOCIATION", 0x3001 },
- { "MTP_FORMAT_SCRIPT", 0x3002 },
- { "MTP_FORMAT_EXECUTABLE", 0x3003 },
- { "MTP_FORMAT_TEXT", 0x3004 },
- { "MTP_FORMAT_HTML", 0x3005 },
- { "MTP_FORMAT_DPOF", 0x3006 },
- { "MTP_FORMAT_AIFF", 0x3007 },
- { "MTP_FORMAT_WAV", 0x3008 },
- { "MTP_FORMAT_MP3", 0x3009 },
- { "MTP_FORMAT_AVI", 0x300A },
- { "MTP_FORMAT_MPEG", 0x300B },
- { "MTP_FORMAT_ASF", 0x300C },
- { "MTP_FORMAT_DEFINED", 0x3800 },
- { "MTP_FORMAT_EXIF_JPEG", 0x3801 },
- { "MTP_FORMAT_TIFF_EP", 0x3802 },
- { "MTP_FORMAT_FLASHPIX", 0x3803 },
- { "MTP_FORMAT_BMP", 0x3804 },
- { "MTP_FORMAT_CIFF", 0x3805 },
- { "MTP_FORMAT_GIF", 0x3807 },
- { "MTP_FORMAT_JFIF", 0x3808 },
- { "MTP_FORMAT_CD", 0x3809 },
- { "MTP_FORMAT_PICT", 0x380A },
- { "MTP_FORMAT_PNG", 0x380B },
- { "MTP_FORMAT_TIFF", 0x380D },
- { "MTP_FORMAT_TIFF_IT", 0x380E },
- { "MTP_FORMAT_JP2", 0x380F },
- { "MTP_FORMAT_JPX", 0x3810 },
- { "MTP_FORMAT_UNDEFINED_FIRMWARE", 0xB802 },
- { "MTP_FORMAT_WINDOWS_IMAGE_FORMAT", 0xB881 },
- { "MTP_FORMAT_UNDEFINED_AUDIO", 0xB900 },
- { "MTP_FORMAT_WMA", 0xB901 },
- { "MTP_FORMAT_OGG", 0xB902 },
- { "MTP_FORMAT_AAC", 0xB903 },
- { "MTP_FORMAT_AUDIBLE", 0xB904 },
- { "MTP_FORMAT_FLAC", 0xB906 },
- { "MTP_FORMAT_UNDEFINED_VIDEO", 0xB980 },
- { "MTP_FORMAT_WMV", 0xB981 },
- { "MTP_FORMAT_MP4_CONTAINER", 0xB982 },
- { "MTP_FORMAT_MP2", 0xB983 },
- { "MTP_FORMAT_3GP_CONTAINER", 0xB984 },
- { "MTP_FORMAT_UNDEFINED_COLLECTION", 0xBA00 },
- { "MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM", 0xBA01 },
- { "MTP_FORMAT_ABSTRACT_IMAGE_ALBUM", 0xBA02 },
- { "MTP_FORMAT_ABSTRACT_AUDIO_ALBUM", 0xBA03 },
- { "MTP_FORMAT_ABSTRACT_VIDEO_ALBUM", 0xBA04 },
- { "MTP_FORMAT_ABSTRACT_AV_PLAYLIST", 0xBA05 },
- { "MTP_FORMAT_ABSTRACT_CONTACT_GROUP", 0xBA06 },
- { "MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER", 0xBA07 },
- { "MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION", 0xBA08 },
- { "MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST", 0xBA09 },
- { "MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST", 0xBA0A },
- { "MTP_FORMAT_ABSTRACT_MEDIACAST", 0xBA0B },
- { "MTP_FORMAT_WPL_PLAYLIST", 0xBA10 },
- { "MTP_FORMAT_M3U_PLAYLIST", 0xBA11 },
- { "MTP_FORMAT_MPL_PLAYLIST", 0xBA12 },
- { "MTP_FORMAT_ASX_PLAYLIST", 0xBA13 },
- { "MTP_FORMAT_PLS_PLAYLIST", 0xBA14 },
- { "MTP_FORMAT_UNDEFINED_DOCUMENT", 0xBA80 },
- { "MTP_FORMAT_ABSTRACT_DOCUMENT", 0xBA81 },
- { "MTP_FORMAT_XML_DOCUMENT", 0xBA82 },
- { "MTP_FORMAT_MS_WORD_DOCUMENT", 0xBA83 },
- { "MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT", 0xBA84 },
- { "MTP_FORMAT_MS_EXCEL_SPREADSHEET", 0xBA85 },
- { "MTP_FORMAT_MS_POWERPOINT_PRESENTATION", 0xBA86 },
- { "MTP_FORMAT_UNDEFINED_MESSAGE", 0xBB00 },
- { "MTP_FORMAT_ABSTRACT_MESSSAGE", 0xBB01 },
- { "MTP_FORMAT_UNDEFINED_CONTACT", 0xBB80 },
- { "MTP_FORMAT_ABSTRACT_CONTACT", 0xBB81 },
- { "MTP_FORMAT_VCARD_2", 0xBB82 },
- { 0, 0 },
-};
-
-static const CodeEntry sObjectPropCodes[] = {
- { "MTP_PROPERTY_STORAGE_ID", 0xDC01 },
- { "MTP_PROPERTY_OBJECT_FORMAT", 0xDC02 },
- { "MTP_PROPERTY_PROTECTION_STATUS", 0xDC03 },
- { "MTP_PROPERTY_OBJECT_SIZE", 0xDC04 },
- { "MTP_PROPERTY_ASSOCIATION_TYPE", 0xDC05 },
- { "MTP_PROPERTY_ASSOCIATION_DESC", 0xDC06 },
- { "MTP_PROPERTY_OBJECT_FILE_NAME", 0xDC07 },
- { "MTP_PROPERTY_DATE_CREATED", 0xDC08 },
- { "MTP_PROPERTY_DATE_MODIFIED", 0xDC09 },
- { "MTP_PROPERTY_KEYWORDS", 0xDC0A },
- { "MTP_PROPERTY_PARENT_OBJECT", 0xDC0B },
- { "MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS", 0xDC0C },
- { "MTP_PROPERTY_HIDDEN", 0xDC0D },
- { "MTP_PROPERTY_SYSTEM_OBJECT", 0xDC0E },
- { "MTP_PROPERTY_PERSISTENT_UID", 0xDC41 },
- { "MTP_PROPERTY_SYNC_ID", 0xDC42 },
- { "MTP_PROPERTY_PROPERTY_BAG", 0xDC43 },
- { "MTP_PROPERTY_NAME", 0xDC44 },
- { "MTP_PROPERTY_CREATED_BY", 0xDC45 },
- { "MTP_PROPERTY_ARTIST", 0xDC46 },
- { "MTP_PROPERTY_DATE_AUTHORED", 0xDC47 },
- { "MTP_PROPERTY_DESCRIPTION", 0xDC48 },
- { "MTP_PROPERTY_URL_REFERENCE", 0xDC49 },
- { "MTP_PROPERTY_LANGUAGE_LOCALE", 0xDC4A },
- { "MTP_PROPERTY_COPYRIGHT_INFORMATION", 0xDC4B },
- { "MTP_PROPERTY_SOURCE", 0xDC4C },
- { "MTP_PROPERTY_ORIGIN_LOCATION", 0xDC4D },
- { "MTP_PROPERTY_DATE_ADDED", 0xDC4E },
- { "MTP_PROPERTY_NON_CONSUMABLE", 0xDC4F },
- { "MTP_PROPERTY_CORRUPT_UNPLAYABLE", 0xDC50 },
- { "MTP_PROPERTY_PRODUCER_SERIAL_NUMBER", 0xDC51 },
- { "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT", 0xDC81 },
- { "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE", 0xDC82 },
- { "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT", 0xDC83 },
- { "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH", 0xDC84 },
- { "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION", 0xDC85 },
- { "MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA", 0xDC86 },
- { "MTP_PROPERTY_WIDTH", 0xDC87 },
- { "MTP_PROPERTY_HEIGHT", 0xDC88 },
- { "MTP_PROPERTY_DURATION", 0xDC89 },
- { "MTP_PROPERTY_RATING", 0xDC8A },
- { "MTP_PROPERTY_TRACK", 0xDC8B },
- { "MTP_PROPERTY_GENRE", 0xDC8C },
- { "MTP_PROPERTY_CREDITS", 0xDC8D },
- { "MTP_PROPERTY_LYRICS", 0xDC8E },
- { "MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID", 0xDC8F },
- { "MTP_PROPERTY_PRODUCED_BY", 0xDC90 },
- { "MTP_PROPERTY_USE_COUNT", 0xDC91 },
- { "MTP_PROPERTY_SKIP_COUNT", 0xDC92 },
- { "MTP_PROPERTY_LAST_ACCESSED", 0xDC93 },
- { "MTP_PROPERTY_PARENTAL_RATING", 0xDC94 },
- { "MTP_PROPERTY_META_GENRE", 0xDC95 },
- { "MTP_PROPERTY_COMPOSER", 0xDC96 },
- { "MTP_PROPERTY_EFFECTIVE_RATING", 0xDC97 },
- { "MTP_PROPERTY_SUBTITLE", 0xDC98 },
- { "MTP_PROPERTY_ORIGINAL_RELEASE_DATE", 0xDC99 },
- { "MTP_PROPERTY_ALBUM_NAME", 0xDC9A },
- { "MTP_PROPERTY_ALBUM_ARTIST", 0xDC9B },
- { "MTP_PROPERTY_MOOD", 0xDC9C },
- { "MTP_PROPERTY_DRM_STATUS", 0xDC9D },
- { "MTP_PROPERTY_SUB_DESCRIPTION", 0xDC9E },
- { "MTP_PROPERTY_IS_CROPPED", 0xDCD1 },
- { "MTP_PROPERTY_IS_COLOUR_CORRECTED", 0xDCD2 },
- { "MTP_PROPERTY_IMAGE_BIT_DEPTH", 0xDCD3 },
- { "MTP_PROPERTY_F_NUMBER", 0xDCD4 },
- { "MTP_PROPERTY_EXPOSURE_TIME", 0xDCD5 },
- { "MTP_PROPERTY_EXPOSURE_INDEX", 0xDCD6 },
- { "MTP_PROPERTY_TOTAL_BITRATE", 0xDE91 },
- { "MTP_PROPERTY_BITRATE_TYPE", 0xDE92 },
- { "MTP_PROPERTY_SAMPLE_RATE", 0xDE93 },
- { "MTP_PROPERTY_NUMBER_OF_CHANNELS", 0xDE94 },
- { "MTP_PROPERTY_AUDIO_BIT_DEPTH", 0xDE95 },
- { "MTP_PROPERTY_SCAN_TYPE", 0xDE97 },
- { "MTP_PROPERTY_AUDIO_WAVE_CODEC", 0xDE99 },
- { "MTP_PROPERTY_AUDIO_BITRATE", 0xDE9A },
- { "MTP_PROPERTY_VIDEO_FOURCC_CODEC", 0xDE9B },
- { "MTP_PROPERTY_VIDEO_BITRATE", 0xDE9C },
- { "MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS", 0xDE9D },
- { "MTP_PROPERTY_KEYFRAME_DISTANCE", 0xDE9E },
- { "MTP_PROPERTY_BUFFER_SIZE", 0xDE9F },
- { "MTP_PROPERTY_ENCODING_QUALITY", 0xDEA0 },
- { "MTP_PROPERTY_ENCODING_PROFILE", 0xDEA1 },
- { "MTP_PROPERTY_DISPLAY_NAME", 0xDCE0 },
- { "MTP_PROPERTY_BODY_TEXT", 0xDCE1 },
- { "MTP_PROPERTY_SUBJECT", 0xDCE2 },
- { "MTP_PROPERTY_PRIORITY", 0xDCE3 },
- { "MTP_PROPERTY_GIVEN_NAME", 0xDD00 },
- { "MTP_PROPERTY_MIDDLE_NAMES", 0xDD01 },
- { "MTP_PROPERTY_FAMILY_NAME", 0xDD02 },
- { "MTP_PROPERTY_PREFIX", 0xDD03 },
- { "MTP_PROPERTY_SUFFIX", 0xDD04 },
- { "MTP_PROPERTY_PHONETIC_GIVEN_NAME", 0xDD05 },
- { "MTP_PROPERTY_PHONETIC_FAMILY_NAME", 0xDD06 },
- { "MTP_PROPERTY_EMAIL_PRIMARY", 0xDD07 },
- { "MTP_PROPERTY_EMAIL_PERSONAL_1", 0xDD08 },
- { "MTP_PROPERTY_EMAIL_PERSONAL_2", 0xDD09 },
- { "MTP_PROPERTY_EMAIL_BUSINESS_1", 0xDD0A },
- { "MTP_PROPERTY_EMAIL_BUSINESS_2", 0xDD0B },
- { "MTP_PROPERTY_EMAIL_OTHERS", 0xDD0C },
- { "MTP_PROPERTY_PHONE_NUMBER_PRIMARY", 0xDD0D },
- { "MTP_PROPERTY_PHONE_NUMBER_PERSONAL", 0xDD0E },
- { "MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2", 0xDD0F },
- { "MTP_PROPERTY_PHONE_NUMBER_BUSINESS", 0xDD10 },
- { "MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2", 0xDD11 },
- { "MTP_PROPERTY_PHONE_NUMBER_MOBILE", 0xDD12 },
- { "MTP_PROPERTY_PHONE_NUMBER_MOBILE_2", 0xDD13 },
- { "MTP_PROPERTY_FAX_NUMBER_PRIMARY", 0xDD14 },
- { "MTP_PROPERTY_FAX_NUMBER_PERSONAL", 0xDD15 },
- { "MTP_PROPERTY_FAX_NUMBER_BUSINESS", 0xDD16 },
- { "MTP_PROPERTY_PAGER_NUMBER", 0xDD17 },
- { "MTP_PROPERTY_PHONE_NUMBER_OTHERS", 0xDD18 },
- { "MTP_PROPERTY_PRIMARY_WEB_ADDRESS", 0xDD19 },
- { "MTP_PROPERTY_PERSONAL_WEB_ADDRESS", 0xDD1A },
- { "MTP_PROPERTY_BUSINESS_WEB_ADDRESS", 0xDD1B },
- { "MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS", 0xDD1C },
- { "MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_2", 0xDD1D },
- { "MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_3", 0xDD1E },
- { "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL", 0xDD1F },
- { "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1", 0xDD20 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2", 0xDD21 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY", 0xDD22 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION", 0xDD23 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE", 0xDD24 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY", 0xDD25 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL", 0xDD26 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1", 0xDD27 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2", 0xDD28 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY", 0xDD29 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION", 0xDD2A },
- { "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE", 0xDD2B },
- { "MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY", 0xDD2C },
- { "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL", 0xDD2D },
- { "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1", 0xDD2E },
- { "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2", 0xDD2F },
- { "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY", 0xDD30 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION", 0xDD31 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE", 0xDD32 },
- { "MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY", 0xDD33 },
- { "MTP_PROPERTY_ORGANIZATION_NAME", 0xDD34 },
- { "MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME", 0xDD35 },
- { "MTP_PROPERTY_ROLE", 0xDD36 },
- { "MTP_PROPERTY_BIRTHDATE", 0xDD37 },
- { "MTP_PROPERTY_MESSAGE_TO", 0xDD40 },
- { "MTP_PROPERTY_MESSAGE_CC", 0xDD41 },
- { "MTP_PROPERTY_MESSAGE_BCC", 0xDD42 },
- { "MTP_PROPERTY_MESSAGE_READ", 0xDD43 },
- { "MTP_PROPERTY_MESSAGE_RECEIVED_TIME", 0xDD44 },
- { "MTP_PROPERTY_MESSAGE_SENDER", 0xDD45 },
- { "MTP_PROPERTY_ACTIVITY_BEGIN_TIME", 0xDD50 },
- { "MTP_PROPERTY_ACTIVITY_END_TIME", 0xDD51 },
- { "MTP_PROPERTY_ACTIVITY_LOCATION", 0xDD52 },
- { "MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES", 0xDD54 },
- { "MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES", 0xDD55 },
- { "MTP_PROPERTY_ACTIVITY_RESOURCES", 0xDD56 },
- { "MTP_PROPERTY_ACTIVITY_ACCEPTED", 0xDD57 },
- { "MTP_PROPERTY_ACTIVITY_TENTATIVE", 0xDD58 },
- { "MTP_PROPERTY_ACTIVITY_DECLINED", 0xDD59 },
- { "MTP_PROPERTY_ACTIVITY_REMAINDER_TIME", 0xDD5A },
- { "MTP_PROPERTY_ACTIVITY_OWNER", 0xDD5B },
- { "MTP_PROPERTY_ACTIVITY_STATUS", 0xDD5C },
- { "MTP_PROPERTY_OWNER", 0xDD5D },
- { "MTP_PROPERTY_EDITOR", 0xDD5E },
- { "MTP_PROPERTY_WEBMASTER", 0xDD5F },
- { "MTP_PROPERTY_URL_SOURCE", 0xDD60 },
- { "MTP_PROPERTY_URL_DESTINATION", 0xDD61 },
- { "MTP_PROPERTY_TIME_BOOKMARK", 0xDD62 },
- { "MTP_PROPERTY_OBJECT_BOOKMARK", 0xDD63 },
- { "MTP_PROPERTY_BYTE_BOOKMARK", 0xDD64 },
- { "MTP_PROPERTY_LAST_BUILD_DATE", 0xDD70 },
- { "MTP_PROPERTY_TIME_TO_LIVE", 0xDD71 },
- { "MTP_PROPERTY_MEDIA_GUID", 0xDD72 },
- { 0, 0 },
-};
-
-static const CodeEntry sDevicePropCodes[] = {
- { "MTP_DEVICE_PROPERTY_UNDEFINED", 0x5000 },
- { "MTP_DEVICE_PROPERTY_BATTERY_LEVEL", 0x5001 },
- { "MTP_DEVICE_PROPERTY_FUNCTIONAL_MODE", 0x5002 },
- { "MTP_DEVICE_PROPERTY_IMAGE_SIZE", 0x5003 },
- { "MTP_DEVICE_PROPERTY_COMPRESSION_SETTING", 0x5004 },
- { "MTP_DEVICE_PROPERTY_WHITE_BALANCE", 0x5005 },
- { "MTP_DEVICE_PROPERTY_RGB_GAIN", 0x5006 },
- { "MTP_DEVICE_PROPERTY_F_NUMBER", 0x5007 },
- { "MTP_DEVICE_PROPERTY_FOCAL_LENGTH", 0x5008 },
- { "MTP_DEVICE_PROPERTY_FOCUS_DISTANCE", 0x5009 },
- { "MTP_DEVICE_PROPERTY_FOCUS_MODE", 0x500A },
- { "MTP_DEVICE_PROPERTY_EXPOSURE_METERING_MODE", 0x500B },
- { "MTP_DEVICE_PROPERTY_FLASH_MODE", 0x500C },
- { "MTP_DEVICE_PROPERTY_EXPOSURE_TIME", 0x500D },
- { "MTP_DEVICE_PROPERTY_EXPOSURE_PROGRAM_MODE", 0x500E },
- { "MTP_DEVICE_PROPERTY_EXPOSURE_INDEX", 0x500F },
- { "MTP_DEVICE_PROPERTY_EXPOSURE_BIAS_COMPENSATION", 0x5010 },
- { "MTP_DEVICE_PROPERTY_DATETIME", 0x5011 },
- { "MTP_DEVICE_PROPERTY_CAPTURE_DELAY", 0x5012 },
- { "MTP_DEVICE_PROPERTY_STILL_CAPTURE_MODE", 0x5013 },
- { "MTP_DEVICE_PROPERTY_CONTRAST", 0x5014 },
- { "MTP_DEVICE_PROPERTY_SHARPNESS", 0x5015 },
- { "MTP_DEVICE_PROPERTY_DIGITAL_ZOOM", 0x5016 },
- { "MTP_DEVICE_PROPERTY_EFFECT_MODE", 0x5017 },
- { "MTP_DEVICE_PROPERTY_BURST_NUMBER", 0x5018 },
- { "MTP_DEVICE_PROPERTY_BURST_INTERVAL", 0x5019 },
- { "MTP_DEVICE_PROPERTY_TIMELAPSE_NUMBER", 0x501A },
- { "MTP_DEVICE_PROPERTY_TIMELAPSE_INTERVAL", 0x501B },
- { "MTP_DEVICE_PROPERTY_FOCUS_METERING_MODE", 0x501C },
- { "MTP_DEVICE_PROPERTY_UPLOAD_URL", 0x501D },
- { "MTP_DEVICE_PROPERTY_ARTIST", 0x501E },
- { "MTP_DEVICE_PROPERTY_COPYRIGHT_INFO", 0x501F },
- { "MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER", 0xD401 },
- { "MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME", 0xD402 },
- { "MTP_DEVICE_PROPERTY_VOLUME", 0xD403 },
- { "MTP_DEVICE_PROPERTY_SUPPORTED_FORMATS_ORDERED", 0xD404 },
- { "MTP_DEVICE_PROPERTY_DEVICE_ICON", 0xD405 },
- { "MTP_DEVICE_PROPERTY_PLAYBACK_RATE", 0xD410 },
- { "MTP_DEVICE_PROPERTY_PLAYBACK_OBJECT", 0xD411 },
- { "MTP_DEVICE_PROPERTY_PLAYBACK_CONTAINER_INDEX", 0xD412 },
- { "MTP_DEVICE_PROPERTY_SESSION_INITIATOR_VERSION_INFO", 0xD406 },
- { "MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE", 0xD407 },
- { 0, 0 },
-};
-
-static const char* getCodeName(uint16_t code, const CodeEntry* table) {
- const CodeEntry* entry = table;
- while (entry->name) {
- if (entry->code == code)
- return entry->name;
- entry++;
- }
- return "UNKNOWN";
-}
-
-const char* MtpDebug::getOperationCodeName(MtpOperationCode code) {
- return getCodeName(code, sOperationCodes);
-}
-
-const char* MtpDebug::getFormatCodeName(MtpObjectFormat code) {
- if (code == 0)
- return "NONE";
- return getCodeName(code, sFormatCodes);
-}
-
-const char* MtpDebug::getObjectPropCodeName(MtpPropertyCode code) {
- if (code == 0)
- return "NONE";
- return getCodeName(code, sObjectPropCodes);
-}
-
-const char* MtpDebug::getDevicePropCodeName(MtpPropertyCode code) {
- if (code == 0)
- return "NONE";
- return getCodeName(code, sDevicePropCodes);
-}
-
-} // namespace android
diff --git a/media/mtp/MtpDebug.h b/media/mtp/MtpDebug.h
deleted file mode 100644
index 5b53e31..0000000
--- a/media/mtp/MtpDebug.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_DEBUG_H
-#define _MTP_DEBUG_H
-
-// #define LOG_NDEBUG 0
-#include <utils/Log.h>
-
-#include "MtpTypes.h"
-
-namespace android {
-
-class MtpDebug {
-public:
- static const char* getOperationCodeName(MtpOperationCode code);
- static const char* getFormatCodeName(MtpObjectFormat code);
- static const char* getObjectPropCodeName(MtpPropertyCode code);
- static const char* getDevicePropCodeName(MtpPropertyCode code);
-};
-
-}; // namespace android
-
-#endif // _MTP_DEBUG_H
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp
deleted file mode 100644
index bf7795c..0000000
--- a/media/mtp/MtpDevice.cpp
+++ /dev/null
@@ -1,835 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpDevice"
-
-#include "MtpDebug.h"
-#include "MtpDevice.h"
-#include "MtpDeviceInfo.h"
-#include "MtpObjectInfo.h"
-#include "MtpProperty.h"
-#include "MtpStorageInfo.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <endian.h>
-
-#include <usbhost/usbhost.h>
-
-namespace android {
-
-#if 0
-static bool isMtpDevice(uint16_t vendor, uint16_t product) {
- // Sandisk Sansa Fuze
- if (vendor == 0x0781 && product == 0x74c2)
- return true;
- // Samsung YP-Z5
- if (vendor == 0x04e8 && product == 0x503c)
- return true;
- return false;
-}
-#endif
-
-MtpDevice* MtpDevice::open(const char* deviceName, int fd) {
- struct usb_device *device = usb_device_new(deviceName, fd);
- if (!device) {
- ALOGE("usb_device_new failed for %s", deviceName);
- return NULL;
- }
-
- struct usb_descriptor_header* desc;
- struct usb_descriptor_iter iter;
-
- usb_descriptor_iter_init(device, &iter);
-
- while ((desc = usb_descriptor_iter_next(&iter)) != NULL) {
- if (desc->bDescriptorType == USB_DT_INTERFACE) {
- struct usb_interface_descriptor *interface = (struct usb_interface_descriptor *)desc;
-
- if (interface->bInterfaceClass == USB_CLASS_STILL_IMAGE &&
- interface->bInterfaceSubClass == 1 && // Still Image Capture
- interface->bInterfaceProtocol == 1) // Picture Transfer Protocol (PIMA 15470)
- {
- char* manufacturerName = usb_device_get_manufacturer_name(device);
- char* productName = usb_device_get_product_name(device);
- ALOGD("Found camera: \"%s\" \"%s\"\n", manufacturerName, productName);
- free(manufacturerName);
- free(productName);
- } else if (interface->bInterfaceClass == 0xFF &&
- interface->bInterfaceSubClass == 0xFF &&
- interface->bInterfaceProtocol == 0) {
- char* interfaceName = usb_device_get_string(device, interface->iInterface);
- if (!interfaceName) {
- continue;
- } else if (strcmp(interfaceName, "MTP")) {
- free(interfaceName);
- continue;
- }
- free(interfaceName);
-
- // Looks like an android style MTP device
- char* manufacturerName = usb_device_get_manufacturer_name(device);
- char* productName = usb_device_get_product_name(device);
- ALOGD("Found MTP device: \"%s\" \"%s\"\n", manufacturerName, productName);
- free(manufacturerName);
- free(productName);
- }
-#if 0
- else {
- // look for special cased devices based on vendor/product ID
- // we are doing this mainly for testing purposes
- uint16_t vendor = usb_device_get_vendor_id(device);
- uint16_t product = usb_device_get_product_id(device);
- if (!isMtpDevice(vendor, product)) {
- // not an MTP or PTP device
- continue;
- }
- // request MTP OS string and descriptor
- // some music players need to see this before entering MTP mode.
- char buffer[256];
- memset(buffer, 0, sizeof(buffer));
- int ret = usb_device_control_transfer(device,
- USB_DIR_IN|USB_RECIP_DEVICE|USB_TYPE_STANDARD,
- USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) | 0xEE,
- 0, buffer, sizeof(buffer), 0);
- printf("usb_device_control_transfer returned %d errno: %d\n", ret, errno);
- if (ret > 0) {
- printf("got MTP string %s\n", buffer);
- ret = usb_device_control_transfer(device,
- USB_DIR_IN|USB_RECIP_DEVICE|USB_TYPE_VENDOR, 1,
- 0, 4, buffer, sizeof(buffer), 0);
- printf("OS descriptor got %d\n", ret);
- } else {
- printf("no MTP string\n");
- }
- }
-#endif
- // if we got here, then we have a likely MTP or PTP device
-
- // interface should be followed by three endpoints
- struct usb_endpoint_descriptor *ep;
- struct usb_endpoint_descriptor *ep_in_desc = NULL;
- struct usb_endpoint_descriptor *ep_out_desc = NULL;
- struct usb_endpoint_descriptor *ep_intr_desc = NULL;
- for (int i = 0; i < 3; i++) {
- ep = (struct usb_endpoint_descriptor *)usb_descriptor_iter_next(&iter);
- if (!ep || ep->bDescriptorType != USB_DT_ENDPOINT) {
- ALOGE("endpoints not found\n");
- usb_device_close(device);
- return NULL;
- }
- if (ep->bmAttributes == USB_ENDPOINT_XFER_BULK) {
- if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
- ep_in_desc = ep;
- else
- ep_out_desc = ep;
- } else if (ep->bmAttributes == USB_ENDPOINT_XFER_INT &&
- ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK) {
- ep_intr_desc = ep;
- }
- }
- if (!ep_in_desc || !ep_out_desc || !ep_intr_desc) {
- ALOGE("endpoints not found\n");
- usb_device_close(device);
- return NULL;
- }
-
- if (usb_device_claim_interface(device, interface->bInterfaceNumber)) {
- ALOGE("usb_device_claim_interface failed errno: %d\n", errno);
- usb_device_close(device);
- return NULL;
- }
-
- MtpDevice* mtpDevice = new MtpDevice(device, interface->bInterfaceNumber,
- ep_in_desc, ep_out_desc, ep_intr_desc);
- mtpDevice->initialize();
- return mtpDevice;
- }
- }
-
- usb_device_close(device);
- ALOGE("device not found");
- return NULL;
-}
-
-MtpDevice::MtpDevice(struct usb_device* device, int interface,
- const struct usb_endpoint_descriptor *ep_in,
- const struct usb_endpoint_descriptor *ep_out,
- const struct usb_endpoint_descriptor *ep_intr)
- : mDevice(device),
- mInterface(interface),
- mRequestIn1(NULL),
- mRequestIn2(NULL),
- mRequestOut(NULL),
- mRequestIntr(NULL),
- mDeviceInfo(NULL),
- mSessionID(0),
- mTransactionID(0),
- mReceivedResponse(false)
-{
- mRequestIn1 = usb_request_new(device, ep_in);
- mRequestIn2 = usb_request_new(device, ep_in);
- mRequestOut = usb_request_new(device, ep_out);
- mRequestIntr = usb_request_new(device, ep_intr);
-}
-
-MtpDevice::~MtpDevice() {
- close();
- for (int i = 0; i < mDeviceProperties.size(); i++)
- delete mDeviceProperties[i];
- usb_request_free(mRequestIn1);
- usb_request_free(mRequestIn2);
- usb_request_free(mRequestOut);
- usb_request_free(mRequestIntr);
-}
-
-void MtpDevice::initialize() {
- openSession();
- mDeviceInfo = getDeviceInfo();
- if (mDeviceInfo) {
- if (mDeviceInfo->mDeviceProperties) {
- int count = mDeviceInfo->mDeviceProperties->size();
- for (int i = 0; i < count; i++) {
- MtpDeviceProperty propCode = (*mDeviceInfo->mDeviceProperties)[i];
- MtpProperty* property = getDevicePropDesc(propCode);
- if (property)
- mDeviceProperties.push(property);
- }
- }
- }
-}
-
-void MtpDevice::close() {
- if (mDevice) {
- usb_device_release_interface(mDevice, mInterface);
- usb_device_close(mDevice);
- mDevice = NULL;
- }
-}
-
-void MtpDevice::print() {
- if (mDeviceInfo) {
- mDeviceInfo->print();
-
- if (mDeviceInfo->mDeviceProperties) {
- ALOGI("***** DEVICE PROPERTIES *****\n");
- int count = mDeviceInfo->mDeviceProperties->size();
- for (int i = 0; i < count; i++) {
- MtpDeviceProperty propCode = (*mDeviceInfo->mDeviceProperties)[i];
- MtpProperty* property = getDevicePropDesc(propCode);
- if (property) {
- property->print();
- delete property;
- }
- }
- }
- }
-
- if (mDeviceInfo->mPlaybackFormats) {
- ALOGI("***** OBJECT PROPERTIES *****\n");
- int count = mDeviceInfo->mPlaybackFormats->size();
- for (int i = 0; i < count; i++) {
- MtpObjectFormat format = (*mDeviceInfo->mPlaybackFormats)[i];
- ALOGI("*** FORMAT: %s\n", MtpDebug::getFormatCodeName(format));
- MtpObjectPropertyList* props = getObjectPropsSupported(format);
- if (props) {
- for (int j = 0; j < props->size(); j++) {
- MtpObjectProperty prop = (*props)[j];
- MtpProperty* property = getObjectPropDesc(prop, format);
- if (property) {
- property->print();
- delete property;
- } else {
- ALOGE("could not fetch property: %s",
- MtpDebug::getObjectPropCodeName(prop));
- }
- }
- }
- }
- }
-}
-
-const char* MtpDevice::getDeviceName() {
- if (mDevice)
- return usb_device_get_name(mDevice);
- else
- return "???";
-}
-
-bool MtpDevice::openSession() {
- Mutex::Autolock autoLock(mMutex);
-
- mSessionID = 0;
- mTransactionID = 0;
- MtpSessionID newSession = 1;
- mRequest.reset();
- mRequest.setParameter(1, newSession);
- if (!sendRequest(MTP_OPERATION_OPEN_SESSION))
- return false;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_SESSION_ALREADY_OPEN)
- newSession = mResponse.getParameter(1);
- else if (ret != MTP_RESPONSE_OK)
- return false;
-
- mSessionID = newSession;
- mTransactionID = 1;
- return true;
-}
-
-bool MtpDevice::closeSession() {
- // FIXME
- return true;
-}
-
-MtpDeviceInfo* MtpDevice::getDeviceInfo() {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- if (!sendRequest(MTP_OPERATION_GET_DEVICE_INFO))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- MtpDeviceInfo* info = new MtpDeviceInfo;
- info->read(mData);
- return info;
- }
- return NULL;
-}
-
-MtpStorageIDList* MtpDevice::getStorageIDs() {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- if (!sendRequest(MTP_OPERATION_GET_STORAGE_IDS))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- return mData.getAUInt32();
- }
- return NULL;
-}
-
-MtpStorageInfo* MtpDevice::getStorageInfo(MtpStorageID storageID) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- mRequest.setParameter(1, storageID);
- if (!sendRequest(MTP_OPERATION_GET_STORAGE_INFO))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- MtpStorageInfo* info = new MtpStorageInfo(storageID);
- info->read(mData);
- return info;
- }
- return NULL;
-}
-
-MtpObjectHandleList* MtpDevice::getObjectHandles(MtpStorageID storageID,
- MtpObjectFormat format, MtpObjectHandle parent) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- mRequest.setParameter(1, storageID);
- mRequest.setParameter(2, format);
- mRequest.setParameter(3, parent);
- if (!sendRequest(MTP_OPERATION_GET_OBJECT_HANDLES))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- return mData.getAUInt32();
- }
- return NULL;
-}
-
-MtpObjectInfo* MtpDevice::getObjectInfo(MtpObjectHandle handle) {
- Mutex::Autolock autoLock(mMutex);
-
- // FIXME - we might want to add some caching here
-
- mRequest.reset();
- mRequest.setParameter(1, handle);
- if (!sendRequest(MTP_OPERATION_GET_OBJECT_INFO))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- MtpObjectInfo* info = new MtpObjectInfo(handle);
- info->read(mData);
- return info;
- }
- return NULL;
-}
-
-void* MtpDevice::getThumbnail(MtpObjectHandle handle, int& outLength) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- mRequest.setParameter(1, handle);
- if (sendRequest(MTP_OPERATION_GET_THUMB) && readData()) {
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- return mData.getData(outLength);
- }
- }
- outLength = 0;
- return NULL;
-}
-
-MtpObjectHandle MtpDevice::sendObjectInfo(MtpObjectInfo* info) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- MtpObjectHandle parent = info->mParent;
- if (parent == 0)
- parent = MTP_PARENT_ROOT;
-
- mRequest.setParameter(1, info->mStorageID);
- mRequest.setParameter(2, info->mParent);
-
- mData.putUInt32(info->mStorageID);
- mData.putUInt16(info->mFormat);
- mData.putUInt16(info->mProtectionStatus);
- mData.putUInt32(info->mCompressedSize);
- mData.putUInt16(info->mThumbFormat);
- mData.putUInt32(info->mThumbCompressedSize);
- mData.putUInt32(info->mThumbPixWidth);
- mData.putUInt32(info->mThumbPixHeight);
- mData.putUInt32(info->mImagePixWidth);
- mData.putUInt32(info->mImagePixHeight);
- mData.putUInt32(info->mImagePixDepth);
- mData.putUInt32(info->mParent);
- mData.putUInt16(info->mAssociationType);
- mData.putUInt32(info->mAssociationDesc);
- mData.putUInt32(info->mSequenceNumber);
- mData.putString(info->mName);
-
- char created[100], modified[100];
- formatDateTime(info->mDateCreated, created, sizeof(created));
- formatDateTime(info->mDateModified, modified, sizeof(modified));
-
- mData.putString(created);
- mData.putString(modified);
- if (info->mKeywords)
- mData.putString(info->mKeywords);
- else
- mData.putEmptyString();
-
- if (sendRequest(MTP_OPERATION_SEND_OBJECT_INFO) && sendData()) {
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- info->mStorageID = mResponse.getParameter(1);
- info->mParent = mResponse.getParameter(2);
- info->mHandle = mResponse.getParameter(3);
- return info->mHandle;
- }
- }
- return (MtpObjectHandle)-1;
-}
-
-bool MtpDevice::sendObject(MtpObjectInfo* info, int srcFD) {
- Mutex::Autolock autoLock(mMutex);
-
- int remaining = info->mCompressedSize;
- mRequest.reset();
- mRequest.setParameter(1, info->mHandle);
- if (sendRequest(MTP_OPERATION_SEND_OBJECT)) {
- // send data header
- writeDataHeader(MTP_OPERATION_SEND_OBJECT, remaining);
-
- char buffer[65536];
- while (remaining > 0) {
- int count = read(srcFD, buffer, sizeof(buffer));
- if (count > 0) {
- int written = mData.write(mRequestOut, buffer, count);
- // FIXME check error
- remaining -= count;
- } else {
- break;
- }
- }
- }
- MtpResponseCode ret = readResponse();
- return (remaining == 0 && ret == MTP_RESPONSE_OK);
-}
-
-bool MtpDevice::deleteObject(MtpObjectHandle handle) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- mRequest.setParameter(1, handle);
- if (sendRequest(MTP_OPERATION_DELETE_OBJECT)) {
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK)
- return true;
- }
- return false;
-}
-
-MtpObjectHandle MtpDevice::getParent(MtpObjectHandle handle) {
- MtpObjectInfo* info = getObjectInfo(handle);
- if (info) {
- MtpObjectHandle parent = info->mParent;
- delete info;
- return parent;
- } else {
- return -1;
- }
-}
-
-MtpObjectHandle MtpDevice::getStorageID(MtpObjectHandle handle) {
- MtpObjectInfo* info = getObjectInfo(handle);
- if (info) {
- MtpObjectHandle storageId = info->mStorageID;
- delete info;
- return storageId;
- } else {
- return -1;
- }
-}
-
-MtpObjectPropertyList* MtpDevice::getObjectPropsSupported(MtpObjectFormat format) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- mRequest.setParameter(1, format);
- if (!sendRequest(MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- return mData.getAUInt16();
- }
- return NULL;
-
-}
-
-MtpProperty* MtpDevice::getDevicePropDesc(MtpDeviceProperty code) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- mRequest.setParameter(1, code);
- if (!sendRequest(MTP_OPERATION_GET_DEVICE_PROP_DESC))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- MtpProperty* property = new MtpProperty;
- property->read(mData);
- return property;
- }
- return NULL;
-}
-
-MtpProperty* MtpDevice::getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format) {
- Mutex::Autolock autoLock(mMutex);
-
- mRequest.reset();
- mRequest.setParameter(1, code);
- mRequest.setParameter(2, format);
- if (!sendRequest(MTP_OPERATION_GET_OBJECT_PROP_DESC))
- return NULL;
- if (!readData())
- return NULL;
- MtpResponseCode ret = readResponse();
- if (ret == MTP_RESPONSE_OK) {
- MtpProperty* property = new MtpProperty;
- property->read(mData);
- return property;
- }
- return NULL;
-}
-
-bool MtpDevice::readObject(MtpObjectHandle handle,
- bool (* callback)(void* data, int offset, int length, void* clientData),
- int objectSize, void* clientData) {
- Mutex::Autolock autoLock(mMutex);
- bool result = false;
-
- mRequest.reset();
- mRequest.setParameter(1, handle);
- if (sendRequest(MTP_OPERATION_GET_OBJECT)
- && mData.readDataHeader(mRequestIn1)) {
- uint32_t length = mData.getContainerLength();
- if (length - MTP_CONTAINER_HEADER_SIZE != objectSize) {
- ALOGE("readObject error objectSize: %d, length: %d",
- objectSize, length);
- goto fail;
- }
- length -= MTP_CONTAINER_HEADER_SIZE;
- uint32_t remaining = length;
- int offset = 0;
-
- int initialDataLength = 0;
- void* initialData = mData.getData(initialDataLength);
- if (initialData) {
- if (initialDataLength > 0) {
- if (!callback(initialData, 0, initialDataLength, clientData))
- goto fail;
- remaining -= initialDataLength;
- offset += initialDataLength;
- }
- free(initialData);
- }
-
- // USB reads greater than 16K don't work
- char buffer1[16384], buffer2[16384];
- mRequestIn1->buffer = buffer1;
- mRequestIn2->buffer = buffer2;
- struct usb_request* req = mRequestIn1;
- void* writeBuffer = NULL;
- int writeLength = 0;
-
- while (remaining > 0 || writeBuffer) {
- if (remaining > 0) {
- // queue up a read request
- req->buffer_length = (remaining > sizeof(buffer1) ? sizeof(buffer1) : remaining);
- if (mData.readDataAsync(req)) {
- ALOGE("readDataAsync failed");
- goto fail;
- }
- } else {
- req = NULL;
- }
-
- if (writeBuffer) {
- // write previous buffer
- if (!callback(writeBuffer, offset, writeLength, clientData)) {
- ALOGE("write failed");
- // wait for pending read before failing
- if (req)
- mData.readDataWait(mDevice);
- goto fail;
- }
- offset += writeLength;
- writeBuffer = NULL;
- }
-
- // wait for read to complete
- if (req) {
- int read = mData.readDataWait(mDevice);
- if (read < 0)
- goto fail;
-
- if (read > 0) {
- writeBuffer = req->buffer;
- writeLength = read;
- remaining -= read;
- req = (req == mRequestIn1 ? mRequestIn2 : mRequestIn1);
- } else {
- writeBuffer = NULL;
- }
- }
- }
-
- MtpResponseCode response = readResponse();
- if (response == MTP_RESPONSE_OK)
- result = true;
- }
-
-fail:
- return result;
-}
-
-
-// reads the object's data and writes it to the specified file path
-bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int group, int perm) {
- ALOGD("readObject: %s", destPath);
- int fd = ::open(destPath, O_RDWR | O_CREAT | O_TRUNC);
- if (fd < 0) {
- ALOGE("open failed for %s", destPath);
- return false;
- }
-
- fchown(fd, getuid(), group);
- // set permissions
- int mask = umask(0);
- fchmod(fd, perm);
- umask(mask);
-
- Mutex::Autolock autoLock(mMutex);
- bool result = false;
-
- mRequest.reset();
- mRequest.setParameter(1, handle);
- if (sendRequest(MTP_OPERATION_GET_OBJECT)
- && mData.readDataHeader(mRequestIn1)) {
- uint32_t length = mData.getContainerLength();
- if (length < MTP_CONTAINER_HEADER_SIZE)
- goto fail;
- length -= MTP_CONTAINER_HEADER_SIZE;
- uint32_t remaining = length;
-
- int initialDataLength = 0;
- void* initialData = mData.getData(initialDataLength);
- if (initialData) {
- if (initialDataLength > 0) {
- if (write(fd, initialData, initialDataLength) != initialDataLength) {
- free(initialData);
- goto fail;
- }
- remaining -= initialDataLength;
- }
- free(initialData);
- }
-
- // USB reads greater than 16K don't work
- char buffer1[16384], buffer2[16384];
- mRequestIn1->buffer = buffer1;
- mRequestIn2->buffer = buffer2;
- struct usb_request* req = mRequestIn1;
- void* writeBuffer = NULL;
- int writeLength = 0;
-
- while (remaining > 0 || writeBuffer) {
- if (remaining > 0) {
- // queue up a read request
- req->buffer_length = (remaining > sizeof(buffer1) ? sizeof(buffer1) : remaining);
- if (mData.readDataAsync(req)) {
- ALOGE("readDataAsync failed");
- goto fail;
- }
- } else {
- req = NULL;
- }
-
- if (writeBuffer) {
- // write previous buffer
- if (write(fd, writeBuffer, writeLength) != writeLength) {
- ALOGE("write failed");
- // wait for pending read before failing
- if (req)
- mData.readDataWait(mDevice);
- goto fail;
- }
- writeBuffer = NULL;
- }
-
- // wait for read to complete
- if (req) {
- int read = mData.readDataWait(mDevice);
- if (read < 0)
- goto fail;
-
- if (read > 0) {
- writeBuffer = req->buffer;
- writeLength = read;
- remaining -= read;
- req = (req == mRequestIn1 ? mRequestIn2 : mRequestIn1);
- } else {
- writeBuffer = NULL;
- }
- }
- }
-
- MtpResponseCode response = readResponse();
- if (response == MTP_RESPONSE_OK)
- result = true;
- }
-
-fail:
- ::close(fd);
- return result;
-}
-
-bool MtpDevice::sendRequest(MtpOperationCode operation) {
- ALOGV("sendRequest: %s\n", MtpDebug::getOperationCodeName(operation));
- mReceivedResponse = false;
- mRequest.setOperationCode(operation);
- if (mTransactionID > 0)
- mRequest.setTransactionID(mTransactionID++);
- int ret = mRequest.write(mRequestOut);
- mRequest.dump();
- return (ret > 0);
-}
-
-bool MtpDevice::sendData() {
- ALOGV("sendData\n");
- mData.setOperationCode(mRequest.getOperationCode());
- mData.setTransactionID(mRequest.getTransactionID());
- int ret = mData.write(mRequestOut);
- mData.dump();
- return (ret > 0);
-}
-
-bool MtpDevice::readData() {
- mData.reset();
- int ret = mData.read(mRequestIn1);
- ALOGV("readData returned %d\n", ret);
- if (ret >= MTP_CONTAINER_HEADER_SIZE) {
- if (mData.getContainerType() == MTP_CONTAINER_TYPE_RESPONSE) {
- ALOGD("got response packet instead of data packet");
- // we got a response packet rather than data
- // copy it to mResponse
- mResponse.copyFrom(mData);
- mReceivedResponse = true;
- return false;
- }
- mData.dump();
- return true;
- }
- else {
- ALOGV("readResponse failed\n");
- return false;
- }
-}
-
-bool MtpDevice::writeDataHeader(MtpOperationCode operation, int dataLength) {
- mData.setOperationCode(operation);
- mData.setTransactionID(mRequest.getTransactionID());
- return (!mData.writeDataHeader(mRequestOut, dataLength));
-}
-
-MtpResponseCode MtpDevice::readResponse() {
- ALOGV("readResponse\n");
- if (mReceivedResponse) {
- mReceivedResponse = false;
- return mResponse.getResponseCode();
- }
- int ret = mResponse.read(mRequestIn1);
- // handle zero length packets, which might occur if the data transfer
- // ends on a packet boundary
- if (ret == 0)
- ret = mResponse.read(mRequestIn1);
- if (ret >= MTP_CONTAINER_HEADER_SIZE) {
- mResponse.dump();
- return mResponse.getResponseCode();
- } else {
- ALOGD("readResponse failed\n");
- return -1;
- }
-}
-
-} // namespace android
diff --git a/media/mtp/MtpDevice.h b/media/mtp/MtpDevice.h
deleted file mode 100644
index b69203e..0000000
--- a/media/mtp/MtpDevice.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_DEVICE_H
-#define _MTP_DEVICE_H
-
-#include "MtpRequestPacket.h"
-#include "MtpDataPacket.h"
-#include "MtpResponsePacket.h"
-#include "MtpTypes.h"
-
-#include <utils/threads.h>
-
-struct usb_device;
-struct usb_request;
-struct usb_endpoint_descriptor;
-
-namespace android {
-
-class MtpDeviceInfo;
-class MtpObjectInfo;
-class MtpStorageInfo;
-
-class MtpDevice {
-private:
- struct usb_device* mDevice;
- int mInterface;
- struct usb_request* mRequestIn1;
- struct usb_request* mRequestIn2;
- struct usb_request* mRequestOut;
- struct usb_request* mRequestIntr;
- MtpDeviceInfo* mDeviceInfo;
- MtpPropertyList mDeviceProperties;
-
- // current session ID
- MtpSessionID mSessionID;
- // current transaction ID
- MtpTransactionID mTransactionID;
-
- MtpRequestPacket mRequest;
- MtpDataPacket mData;
- MtpResponsePacket mResponse;
- // set to true if we received a response packet instead of a data packet
- bool mReceivedResponse;
-
- // to ensure only one MTP transaction at a time
- Mutex mMutex;
-
-public:
- MtpDevice(struct usb_device* device, int interface,
- const struct usb_endpoint_descriptor *ep_in,
- const struct usb_endpoint_descriptor *ep_out,
- const struct usb_endpoint_descriptor *ep_intr);
-
- static MtpDevice* open(const char* deviceName, int fd);
-
- virtual ~MtpDevice();
-
- void initialize();
- void close();
- void print();
- const char* getDeviceName();
-
- bool openSession();
- bool closeSession();
-
- MtpDeviceInfo* getDeviceInfo();
- MtpStorageIDList* getStorageIDs();
- MtpStorageInfo* getStorageInfo(MtpStorageID storageID);
- MtpObjectHandleList* getObjectHandles(MtpStorageID storageID, MtpObjectFormat format,
- MtpObjectHandle parent);
- MtpObjectInfo* getObjectInfo(MtpObjectHandle handle);
- void* getThumbnail(MtpObjectHandle handle, int& outLength);
- MtpObjectHandle sendObjectInfo(MtpObjectInfo* info);
- bool sendObject(MtpObjectInfo* info, int srcFD);
- bool deleteObject(MtpObjectHandle handle);
- MtpObjectHandle getParent(MtpObjectHandle handle);
- MtpObjectHandle getStorageID(MtpObjectHandle handle);
-
- MtpObjectPropertyList* getObjectPropsSupported(MtpObjectFormat format);
-
- MtpProperty* getDevicePropDesc(MtpDeviceProperty code);
- MtpProperty* getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format);
-
- bool readObject(MtpObjectHandle handle,
- bool (* callback)(void* data, int offset,
- int length, void* clientData),
- int objectSize, void* clientData);
- bool readObject(MtpObjectHandle handle, const char* destPath, int group,
- int perm);
-
-private:
- bool sendRequest(MtpOperationCode operation);
- bool sendData();
- bool readData();
- bool writeDataHeader(MtpOperationCode operation, int dataLength);
- MtpResponseCode readResponse();
-
-};
-
-}; // namespace android
-
-#endif // _MTP_DEVICE_H
diff --git a/media/mtp/MtpDeviceInfo.cpp b/media/mtp/MtpDeviceInfo.cpp
deleted file mode 100644
index 108e2b8..0000000
--- a/media/mtp/MtpDeviceInfo.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpDeviceInfo"
-
-#include "MtpDebug.h"
-#include "MtpDataPacket.h"
-#include "MtpDeviceInfo.h"
-#include "MtpStringBuffer.h"
-
-namespace android {
-
-MtpDeviceInfo::MtpDeviceInfo()
- : mStandardVersion(0),
- mVendorExtensionID(0),
- mVendorExtensionVersion(0),
- mVendorExtensionDesc(NULL),
- mFunctionalCode(0),
- mOperations(NULL),
- mEvents(NULL),
- mDeviceProperties(NULL),
- mCaptureFormats(NULL),
- mPlaybackFormats(NULL),
- mManufacturer(NULL),
- mModel(NULL),
- mVersion(NULL),
- mSerial(NULL)
-{
-}
-
-MtpDeviceInfo::~MtpDeviceInfo() {
- if (mVendorExtensionDesc)
- free(mVendorExtensionDesc);
- delete mOperations;
- delete mEvents;
- delete mDeviceProperties;
- delete mCaptureFormats;
- delete mPlaybackFormats;
- if (mManufacturer)
- free(mManufacturer);
- if (mModel)
- free(mModel);
- if (mVersion)
- free(mVersion);
- if (mSerial)
- free(mSerial);
-}
-
-void MtpDeviceInfo::read(MtpDataPacket& packet) {
- MtpStringBuffer string;
-
- // read the device info
- mStandardVersion = packet.getUInt16();
- mVendorExtensionID = packet.getUInt32();
- mVendorExtensionVersion = packet.getUInt16();
-
- packet.getString(string);
- mVendorExtensionDesc = strdup((const char *)string);
-
- mFunctionalCode = packet.getUInt16();
- mOperations = packet.getAUInt16();
- mEvents = packet.getAUInt16();
- mDeviceProperties = packet.getAUInt16();
- mCaptureFormats = packet.getAUInt16();
- mPlaybackFormats = packet.getAUInt16();
-
- packet.getString(string);
- mManufacturer = strdup((const char *)string);
- packet.getString(string);
- mModel = strdup((const char *)string);
- packet.getString(string);
- mVersion = strdup((const char *)string);
- packet.getString(string);
- mSerial = strdup((const char *)string);
-}
-
-void MtpDeviceInfo::print() {
- ALOGV("Device Info:\n\tmStandardVersion: %d\n\tmVendorExtensionID: %d\n\tmVendorExtensionVersiony: %d\n",
- mStandardVersion, mVendorExtensionID, mVendorExtensionVersion);
- ALOGV("\tmVendorExtensionDesc: %s\n\tmFunctionalCode: %d\n\tmManufacturer: %s\n\tmModel: %s\n\tmVersion: %s\n\tmSerial: %s\n",
- mVendorExtensionDesc, mFunctionalCode, mManufacturer, mModel, mVersion, mSerial);
-}
-
-} // namespace android
diff --git a/media/mtp/MtpDeviceInfo.h b/media/mtp/MtpDeviceInfo.h
deleted file mode 100644
index 2abaa10..0000000
--- a/media/mtp/MtpDeviceInfo.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_DEVICE_INFO_H
-#define _MTP_DEVICE_INFO_H
-
-struct stat;
-
-namespace android {
-
-class MtpDataPacket;
-
-class MtpDeviceInfo {
-public:
- uint16_t mStandardVersion;
- uint32_t mVendorExtensionID;
- uint16_t mVendorExtensionVersion;
- char* mVendorExtensionDesc;
- uint16_t mFunctionalCode;
- UInt16List* mOperations;
- UInt16List* mEvents;
- MtpDevicePropertyList* mDeviceProperties;
- MtpObjectFormatList* mCaptureFormats;
- MtpObjectFormatList* mPlaybackFormats;
- char* mManufacturer;
- char* mModel;
- char* mVersion;
- char* mSerial;
-
-public:
- MtpDeviceInfo();
- virtual ~MtpDeviceInfo();
-
- void read(MtpDataPacket& packet);
-
- void print();
-};
-
-}; // namespace android
-
-#endif // _MTP_DEVICE_INFO_H
diff --git a/media/mtp/MtpEventPacket.cpp b/media/mtp/MtpEventPacket.cpp
deleted file mode 100644
index d2fca42..0000000
--- a/media/mtp/MtpEventPacket.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpEventPacket"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-
-#ifdef MTP_DEVICE
-#include <linux/usb/f_mtp.h>
-#endif
-
-#include "MtpEventPacket.h"
-
-#include <usbhost/usbhost.h>
-
-namespace android {
-
-MtpEventPacket::MtpEventPacket()
- : MtpPacket(512)
-{
-}
-
-MtpEventPacket::~MtpEventPacket() {
-}
-
-#ifdef MTP_DEVICE
-int MtpEventPacket::write(int fd) {
- struct mtp_event event;
-
- putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
- putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_EVENT);
-
- event.data = mBuffer;
- event.length = mPacketSize;
- int ret = ::ioctl(fd, MTP_SEND_EVENT, (unsigned long)&event);
- return (ret < 0 ? ret : 0);
-}
-#endif
-
-#ifdef MTP_HOST
-int MtpEventPacket::read(struct usb_request *request) {
- request->buffer = mBuffer;
- request->buffer_length = mBufferSize;
- int ret = transfer(request);
- if (ret >= 0)
- mPacketSize = ret;
- else
- mPacketSize = 0;
- return ret;
-}
-#endif
-
-} // namespace android
-
diff --git a/media/mtp/MtpEventPacket.h b/media/mtp/MtpEventPacket.h
deleted file mode 100644
index 660baad..0000000
--- a/media/mtp/MtpEventPacket.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_EVENT_PACKET_H
-#define _MTP_EVENT_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-namespace android {
-
-class MtpEventPacket : public MtpPacket {
-
-public:
- MtpEventPacket();
- virtual ~MtpEventPacket();
-
-#ifdef MTP_DEVICE
- // write our data to the given file descriptor
- int write(int fd);
-#endif
-
-#ifdef MTP_HOST
- // read our buffer with the given request
- int read(struct usb_request *request);
-#endif
-
- inline MtpEventCode getEventCode() const { return getContainerCode(); }
- inline void setEventCode(MtpEventCode code)
- { return setContainerCode(code); }
-};
-
-}; // namespace android
-
-#endif // _MTP_EVENT_PACKET_H
diff --git a/media/mtp/MtpObjectInfo.cpp b/media/mtp/MtpObjectInfo.cpp
deleted file mode 100644
index cd15343..0000000
--- a/media/mtp/MtpObjectInfo.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpObjectInfo"
-
-#include "MtpDebug.h"
-#include "MtpDataPacket.h"
-#include "MtpObjectInfo.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-
-namespace android {
-
-MtpObjectInfo::MtpObjectInfo(MtpObjectHandle handle)
- : mHandle(handle),
- mStorageID(0),
- mFormat(0),
- mProtectionStatus(0),
- mCompressedSize(0),
- mThumbFormat(0),
- mThumbCompressedSize(0),
- mThumbPixWidth(0),
- mThumbPixHeight(0),
- mImagePixWidth(0),
- mImagePixHeight(0),
- mImagePixDepth(0),
- mParent(0),
- mAssociationType(0),
- mAssociationDesc(0),
- mSequenceNumber(0),
- mName(NULL),
- mDateCreated(0),
- mDateModified(0),
- mKeywords(NULL)
-{
-}
-
-MtpObjectInfo::~MtpObjectInfo() {
- if (mName)
- free(mName);
- if (mKeywords)
- free(mKeywords);
-}
-
-void MtpObjectInfo::read(MtpDataPacket& packet) {
- MtpStringBuffer string;
- time_t time;
-
- mStorageID = packet.getUInt32();
- mFormat = packet.getUInt16();
- mProtectionStatus = packet.getUInt16();
- mCompressedSize = packet.getUInt32();
- mThumbFormat = packet.getUInt16();
- mThumbCompressedSize = packet.getUInt32();
- mThumbPixWidth = packet.getUInt32();
- mThumbPixHeight = packet.getUInt32();
- mImagePixWidth = packet.getUInt32();
- mImagePixHeight = packet.getUInt32();
- mImagePixDepth = packet.getUInt32();
- mParent = packet.getUInt32();
- mAssociationType = packet.getUInt16();
- mAssociationDesc = packet.getUInt32();
- mSequenceNumber = packet.getUInt32();
-
- packet.getString(string);
- mName = strdup((const char *)string);
-
- packet.getString(string);
- if (parseDateTime((const char*)string, time))
- mDateCreated = time;
-
- packet.getString(string);
- if (parseDateTime((const char*)string, time))
- mDateModified = time;
-
- packet.getString(string);
- mKeywords = strdup((const char *)string);
-}
-
-void MtpObjectInfo::print() {
- ALOGD("MtpObject Info %08X: %s\n", mHandle, mName);
- ALOGD(" mStorageID: %08X mFormat: %04X mProtectionStatus: %d\n",
- mStorageID, mFormat, mProtectionStatus);
- ALOGD(" mCompressedSize: %d mThumbFormat: %04X mThumbCompressedSize: %d\n",
- mCompressedSize, mFormat, mThumbCompressedSize);
- ALOGD(" mThumbPixWidth: %d mThumbPixHeight: %d\n", mThumbPixWidth, mThumbPixHeight);
- ALOGD(" mImagePixWidth: %d mImagePixHeight: %d mImagePixDepth: %d\n",
- mImagePixWidth, mImagePixHeight, mImagePixDepth);
- ALOGD(" mParent: %08X mAssociationType: %04X mAssociationDesc: %04X\n",
- mParent, mAssociationType, mAssociationDesc);
- ALOGD(" mSequenceNumber: %d mDateCreated: %ld mDateModified: %ld mKeywords: %s\n",
- mSequenceNumber, mDateCreated, mDateModified, mKeywords);
-}
-
-} // namespace android
diff --git a/media/mtp/MtpObjectInfo.h b/media/mtp/MtpObjectInfo.h
deleted file mode 100644
index c7a449c..0000000
--- a/media/mtp/MtpObjectInfo.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_OBJECT_INFO_H
-#define _MTP_OBJECT_INFO_H
-
-#include "MtpTypes.h"
-
-namespace android {
-
-class MtpDataPacket;
-
-class MtpObjectInfo {
-public:
- MtpObjectHandle mHandle;
- MtpStorageID mStorageID;
- MtpObjectFormat mFormat;
- uint16_t mProtectionStatus;
- uint32_t mCompressedSize;
- MtpObjectFormat mThumbFormat;
- uint32_t mThumbCompressedSize;
- uint32_t mThumbPixWidth;
- uint32_t mThumbPixHeight;
- uint32_t mImagePixWidth;
- uint32_t mImagePixHeight;
- uint32_t mImagePixDepth;
- MtpObjectHandle mParent;
- uint16_t mAssociationType;
- uint32_t mAssociationDesc;
- uint32_t mSequenceNumber;
- char* mName;
- time_t mDateCreated;
- time_t mDateModified;
- char* mKeywords;
-
-public:
- MtpObjectInfo(MtpObjectHandle handle);
- virtual ~MtpObjectInfo();
-
- void read(MtpDataPacket& packet);
-
- void print();
-};
-
-}; // namespace android
-
-#endif // _MTP_OBJECT_INFO_H
diff --git a/media/mtp/MtpPacket.cpp b/media/mtp/MtpPacket.cpp
deleted file mode 100644
index dd07843..0000000
--- a/media/mtp/MtpPacket.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpPacket"
-
-#include "MtpDebug.h"
-#include "MtpPacket.h"
-#include "mtp.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <usbhost/usbhost.h>
-
-namespace android {
-
-MtpPacket::MtpPacket(int bufferSize)
- : mBuffer(NULL),
- mBufferSize(bufferSize),
- mAllocationIncrement(bufferSize),
- mPacketSize(0)
-{
- mBuffer = (uint8_t *)malloc(bufferSize);
- if (!mBuffer) {
- ALOGE("out of memory!");
- abort();
- }
-}
-
-MtpPacket::~MtpPacket() {
- if (mBuffer)
- free(mBuffer);
-}
-
-void MtpPacket::reset() {
- allocate(MTP_CONTAINER_HEADER_SIZE);
- mPacketSize = MTP_CONTAINER_HEADER_SIZE;
- memset(mBuffer, 0, mBufferSize);
-}
-
-void MtpPacket::allocate(int length) {
- if (length > mBufferSize) {
- int newLength = length + mAllocationIncrement;
- mBuffer = (uint8_t *)realloc(mBuffer, newLength);
- if (!mBuffer) {
- ALOGE("out of memory!");
- abort();
- }
- mBufferSize = newLength;
- }
-}
-
-void MtpPacket::dump() {
-#define DUMP_BYTES_PER_ROW 16
- char buffer[500];
- char* bufptr = buffer;
-
- for (int i = 0; i < mPacketSize; i++) {
- sprintf(bufptr, "%02X ", mBuffer[i]);
- bufptr += strlen(bufptr);
- if (i % DUMP_BYTES_PER_ROW == (DUMP_BYTES_PER_ROW - 1)) {
- ALOGV("%s", buffer);
- bufptr = buffer;
- }
- }
- if (bufptr != buffer) {
- // print last line
- ALOGV("%s", buffer);
- }
- ALOGV("\n");
-}
-
-void MtpPacket::copyFrom(const MtpPacket& src) {
- int length = src.mPacketSize;
- allocate(length);
- mPacketSize = length;
- memcpy(mBuffer, src.mBuffer, length);
-}
-
-uint16_t MtpPacket::getUInt16(int offset) const {
- return ((uint16_t)mBuffer[offset + 1] << 8) | (uint16_t)mBuffer[offset];
-}
-
-uint32_t MtpPacket::getUInt32(int offset) const {
- return ((uint32_t)mBuffer[offset + 3] << 24) | ((uint32_t)mBuffer[offset + 2] << 16) |
- ((uint32_t)mBuffer[offset + 1] << 8) | (uint32_t)mBuffer[offset];
-}
-
-void MtpPacket::putUInt16(int offset, uint16_t value) {
- mBuffer[offset++] = (uint8_t)(value & 0xFF);
- mBuffer[offset++] = (uint8_t)((value >> 8) & 0xFF);
-}
-
-void MtpPacket::putUInt32(int offset, uint32_t value) {
- mBuffer[offset++] = (uint8_t)(value & 0xFF);
- mBuffer[offset++] = (uint8_t)((value >> 8) & 0xFF);
- mBuffer[offset++] = (uint8_t)((value >> 16) & 0xFF);
- mBuffer[offset++] = (uint8_t)((value >> 24) & 0xFF);
-}
-
-uint16_t MtpPacket::getContainerCode() const {
- return getUInt16(MTP_CONTAINER_CODE_OFFSET);
-}
-
-void MtpPacket::setContainerCode(uint16_t code) {
- putUInt16(MTP_CONTAINER_CODE_OFFSET, code);
-}
-
-uint16_t MtpPacket::getContainerType() const {
- return getUInt16(MTP_CONTAINER_TYPE_OFFSET);
-}
-
-MtpTransactionID MtpPacket::getTransactionID() const {
- return getUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET);
-}
-
-void MtpPacket::setTransactionID(MtpTransactionID id) {
- putUInt32(MTP_CONTAINER_TRANSACTION_ID_OFFSET, id);
-}
-
-uint32_t MtpPacket::getParameter(int index) const {
- if (index < 1 || index > 5) {
- ALOGE("index %d out of range in MtpPacket::getParameter", index);
- return 0;
- }
- return getUInt32(MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t));
-}
-
-void MtpPacket::setParameter(int index, uint32_t value) {
- if (index < 1 || index > 5) {
- ALOGE("index %d out of range in MtpPacket::setParameter", index);
- return;
- }
- int offset = MTP_CONTAINER_PARAMETER_OFFSET + (index - 1) * sizeof(uint32_t);
- if (mPacketSize < offset + sizeof(uint32_t))
- mPacketSize = offset + sizeof(uint32_t);
- putUInt32(offset, value);
-}
-
-#ifdef MTP_HOST
-int MtpPacket::transfer(struct usb_request* request) {
- int result = usb_device_bulk_transfer(request->dev,
- request->endpoint,
- request->buffer,
- request->buffer_length,
- 0);
- request->actual_length = result;
- return result;
-}
-#endif
-
-} // namespace android
diff --git a/media/mtp/MtpPacket.h b/media/mtp/MtpPacket.h
deleted file mode 100644
index 0ffb1d3..0000000
--- a/media/mtp/MtpPacket.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_PACKET_H
-#define _MTP_PACKET_H
-
-#include "MtpTypes.h"
-
-struct usb_request;
-
-namespace android {
-
-class MtpPacket {
-
-protected:
- uint8_t* mBuffer;
- // current size of the buffer
- int mBufferSize;
- // number of bytes to add when resizing the buffer
- int mAllocationIncrement;
- // size of the data in the packet
- int mPacketSize;
-
-public:
- MtpPacket(int bufferSize);
- virtual ~MtpPacket();
-
- // sets packet size to the default container size and sets buffer to zero
- virtual void reset();
-
- void allocate(int length);
- void dump();
- void copyFrom(const MtpPacket& src);
-
- uint16_t getContainerCode() const;
- void setContainerCode(uint16_t code);
-
- uint16_t getContainerType() const;
-
- MtpTransactionID getTransactionID() const;
- void setTransactionID(MtpTransactionID id);
-
- uint32_t getParameter(int index) const;
- void setParameter(int index, uint32_t value);
-
-#ifdef MTP_HOST
- int transfer(struct usb_request* request);
-#endif
-
-protected:
- uint16_t getUInt16(int offset) const;
- uint32_t getUInt32(int offset) const;
- void putUInt16(int offset, uint16_t value);
- void putUInt32(int offset, uint32_t value);
-};
-
-}; // namespace android
-
-#endif // _MTP_PACKET_H
diff --git a/media/mtp/MtpProperty.cpp b/media/mtp/MtpProperty.cpp
deleted file mode 100644
index 64dd45b..0000000
--- a/media/mtp/MtpProperty.cpp
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpProperty"
-
-#include "MtpDataPacket.h"
-#include "MtpDebug.h"
-#include "MtpProperty.h"
-#include "MtpStringBuffer.h"
-#include "MtpUtils.h"
-
-namespace android {
-
-MtpProperty::MtpProperty()
- : mCode(0),
- mType(0),
- mWriteable(false),
- mDefaultArrayLength(0),
- mDefaultArrayValues(NULL),
- mCurrentArrayLength(0),
- mCurrentArrayValues(NULL),
- mGroupCode(0),
- mFormFlag(kFormNone),
- mEnumLength(0),
- mEnumValues(NULL)
-{
- memset(&mDefaultValue, 0, sizeof(mDefaultValue));
- memset(&mCurrentValue, 0, sizeof(mCurrentValue));
- memset(&mMinimumValue, 0, sizeof(mMinimumValue));
- memset(&mMaximumValue, 0, sizeof(mMaximumValue));
-}
-
-MtpProperty::MtpProperty(MtpPropertyCode propCode,
- MtpDataType type,
- bool writeable,
- int defaultValue)
- : mCode(propCode),
- mType(type),
- mWriteable(writeable),
- mDefaultArrayLength(0),
- mDefaultArrayValues(NULL),
- mCurrentArrayLength(0),
- mCurrentArrayValues(NULL),
- mGroupCode(0),
- mFormFlag(kFormNone),
- mEnumLength(0),
- mEnumValues(NULL)
-{
- memset(&mDefaultValue, 0, sizeof(mDefaultValue));
- memset(&mCurrentValue, 0, sizeof(mCurrentValue));
- memset(&mMinimumValue, 0, sizeof(mMinimumValue));
- memset(&mMaximumValue, 0, sizeof(mMaximumValue));
-
- if (defaultValue) {
- switch (type) {
- case MTP_TYPE_INT8:
- mDefaultValue.u.i8 = defaultValue;
- break;
- case MTP_TYPE_UINT8:
- mDefaultValue.u.u8 = defaultValue;
- break;
- case MTP_TYPE_INT16:
- mDefaultValue.u.i16 = defaultValue;
- break;
- case MTP_TYPE_UINT16:
- mDefaultValue.u.u16 = defaultValue;
- break;
- case MTP_TYPE_INT32:
- mDefaultValue.u.i32 = defaultValue;
- break;
- case MTP_TYPE_UINT32:
- mDefaultValue.u.u32 = defaultValue;
- break;
- case MTP_TYPE_INT64:
- mDefaultValue.u.i64 = defaultValue;
- break;
- case MTP_TYPE_UINT64:
- mDefaultValue.u.u64 = defaultValue;
- break;
- default:
- ALOGE("unknown type %04X in MtpProperty::MtpProperty", type);
- }
- }
-}
-
-MtpProperty::~MtpProperty() {
- if (mType == MTP_TYPE_STR) {
- // free all strings
- free(mDefaultValue.str);
- free(mCurrentValue.str);
- free(mMinimumValue.str);
- free(mMaximumValue.str);
- if (mDefaultArrayValues) {
- for (int i = 0; i < mDefaultArrayLength; i++)
- free(mDefaultArrayValues[i].str);
- }
- if (mCurrentArrayValues) {
- for (int i = 0; i < mCurrentArrayLength; i++)
- free(mCurrentArrayValues[i].str);
- }
- if (mEnumValues) {
- for (int i = 0; i < mEnumLength; i++)
- free(mEnumValues[i].str);
- }
- }
- delete[] mDefaultArrayValues;
- delete[] mCurrentArrayValues;
- delete[] mEnumValues;
-}
-
-void MtpProperty::read(MtpDataPacket& packet) {
- mCode = packet.getUInt16();
- bool deviceProp = isDeviceProperty();
- mType = packet.getUInt16();
- mWriteable = (packet.getUInt8() == 1);
- switch (mType) {
- case MTP_TYPE_AINT8:
- case MTP_TYPE_AUINT8:
- case MTP_TYPE_AINT16:
- case MTP_TYPE_AUINT16:
- case MTP_TYPE_AINT32:
- case MTP_TYPE_AUINT32:
- case MTP_TYPE_AINT64:
- case MTP_TYPE_AUINT64:
- case MTP_TYPE_AINT128:
- case MTP_TYPE_AUINT128:
- mDefaultArrayValues = readArrayValues(packet, mDefaultArrayLength);
- if (deviceProp)
- mCurrentArrayValues = readArrayValues(packet, mCurrentArrayLength);
- break;
- default:
- readValue(packet, mDefaultValue);
- if (deviceProp)
- readValue(packet, mCurrentValue);
- }
- if (!deviceProp)
- mGroupCode = packet.getUInt32();
- mFormFlag = packet.getUInt8();
-
- if (mFormFlag == kFormRange) {
- readValue(packet, mMinimumValue);
- readValue(packet, mMaximumValue);
- readValue(packet, mStepSize);
- } else if (mFormFlag == kFormEnum) {
- mEnumLength = packet.getUInt16();
- mEnumValues = new MtpPropertyValue[mEnumLength];
- for (int i = 0; i < mEnumLength; i++)
- readValue(packet, mEnumValues[i]);
- }
-}
-
-void MtpProperty::write(MtpDataPacket& packet) {
- bool deviceProp = isDeviceProperty();
-
- packet.putUInt16(mCode);
- packet.putUInt16(mType);
- packet.putUInt8(mWriteable ? 1 : 0);
-
- switch (mType) {
- case MTP_TYPE_AINT8:
- case MTP_TYPE_AUINT8:
- case MTP_TYPE_AINT16:
- case MTP_TYPE_AUINT16:
- case MTP_TYPE_AINT32:
- case MTP_TYPE_AUINT32:
- case MTP_TYPE_AINT64:
- case MTP_TYPE_AUINT64:
- case MTP_TYPE_AINT128:
- case MTP_TYPE_AUINT128:
- writeArrayValues(packet, mDefaultArrayValues, mDefaultArrayLength);
- if (deviceProp)
- writeArrayValues(packet, mCurrentArrayValues, mCurrentArrayLength);
- break;
- default:
- writeValue(packet, mDefaultValue);
- if (deviceProp)
- writeValue(packet, mCurrentValue);
- }
- packet.putUInt32(mGroupCode);
- if (!deviceProp)
- packet.putUInt8(mFormFlag);
- if (mFormFlag == kFormRange) {
- writeValue(packet, mMinimumValue);
- writeValue(packet, mMaximumValue);
- writeValue(packet, mStepSize);
- } else if (mFormFlag == kFormEnum) {
- packet.putUInt16(mEnumLength);
- for (int i = 0; i < mEnumLength; i++)
- writeValue(packet, mEnumValues[i]);
- }
-}
-
-void MtpProperty::setDefaultValue(const uint16_t* string) {
- free(mDefaultValue.str);
- if (string) {
- MtpStringBuffer buffer(string);
- mDefaultValue.str = strdup(buffer);
- }
- else
- mDefaultValue.str = NULL;
-}
-
-void MtpProperty::setCurrentValue(const uint16_t* string) {
- free(mCurrentValue.str);
- if (string) {
- MtpStringBuffer buffer(string);
- mCurrentValue.str = strdup(buffer);
- }
- else
- mCurrentValue.str = NULL;
-}
-
-void MtpProperty::setFormRange(int min, int max, int step) {
- mFormFlag = kFormRange;
- switch (mType) {
- case MTP_TYPE_INT8:
- mMinimumValue.u.i8 = min;
- mMaximumValue.u.i8 = max;
- mStepSize.u.i8 = step;
- break;
- case MTP_TYPE_UINT8:
- mMinimumValue.u.u8 = min;
- mMaximumValue.u.u8 = max;
- mStepSize.u.u8 = step;
- break;
- case MTP_TYPE_INT16:
- mMinimumValue.u.i16 = min;
- mMaximumValue.u.i16 = max;
- mStepSize.u.i16 = step;
- break;
- case MTP_TYPE_UINT16:
- mMinimumValue.u.u16 = min;
- mMaximumValue.u.u16 = max;
- mStepSize.u.u16 = step;
- break;
- case MTP_TYPE_INT32:
- mMinimumValue.u.i32 = min;
- mMaximumValue.u.i32 = max;
- mStepSize.u.i32 = step;
- break;
- case MTP_TYPE_UINT32:
- mMinimumValue.u.u32 = min;
- mMaximumValue.u.u32 = max;
- mStepSize.u.u32 = step;
- break;
- case MTP_TYPE_INT64:
- mMinimumValue.u.i64 = min;
- mMaximumValue.u.i64 = max;
- mStepSize.u.i64 = step;
- break;
- case MTP_TYPE_UINT64:
- mMinimumValue.u.u64 = min;
- mMaximumValue.u.u64 = max;
- mStepSize.u.u64 = step;
- break;
- default:
- ALOGE("unsupported type for MtpProperty::setRange");
- break;
- }
-}
-
-void MtpProperty::setFormEnum(const int* values, int count) {
- mFormFlag = kFormEnum;
- delete[] mEnumValues;
- mEnumValues = new MtpPropertyValue[count];
- mEnumLength = count;
-
- for (int i = 0; i < count; i++) {
- int value = *values++;
- switch (mType) {
- case MTP_TYPE_INT8:
- mEnumValues[i].u.i8 = value;
- break;
- case MTP_TYPE_UINT8:
- mEnumValues[i].u.u8 = value;
- break;
- case MTP_TYPE_INT16:
- mEnumValues[i].u.i16 = value;
- break;
- case MTP_TYPE_UINT16:
- mEnumValues[i].u.u16 = value;
- break;
- case MTP_TYPE_INT32:
- mEnumValues[i].u.i32 = value;
- break;
- case MTP_TYPE_UINT32:
- mEnumValues[i].u.u32 = value;
- break;
- case MTP_TYPE_INT64:
- mEnumValues[i].u.i64 = value;
- break;
- case MTP_TYPE_UINT64:
- mEnumValues[i].u.u64 = value;
- break;
- default:
- ALOGE("unsupported type for MtpProperty::setEnum");
- break;
- }
- }
-}
-
-void MtpProperty::setFormDateTime() {
- mFormFlag = kFormDateTime;
-}
-
-void MtpProperty::print() {
- MtpString buffer;
- bool deviceProp = isDeviceProperty();
- if (deviceProp)
- ALOGI(" %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode);
- else
- ALOGI(" %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode);
- ALOGI(" type %04X", mType);
- ALOGI(" writeable %s", (mWriteable ? "true" : "false"));
- buffer = " default value: ";
- print(mDefaultValue, buffer);
- ALOGI("%s", (const char *)buffer);
- if (deviceProp) {
- buffer = " current value: ";
- print(mCurrentValue, buffer);
- ALOGI("%s", (const char *)buffer);
- }
- switch (mFormFlag) {
- case kFormNone:
- break;
- case kFormRange:
- buffer = " Range (";
- print(mMinimumValue, buffer);
- buffer += ", ";
- print(mMaximumValue, buffer);
- buffer += ", ";
- print(mStepSize, buffer);
- buffer += ")";
- ALOGI("%s", (const char *)buffer);
- break;
- case kFormEnum:
- buffer = " Enum { ";
- for (int i = 0; i < mEnumLength; i++) {
- print(mEnumValues[i], buffer);
- buffer += " ";
- }
- buffer += "}";
- ALOGI("%s", (const char *)buffer);
- break;
- case kFormDateTime:
- ALOGI(" DateTime\n");
- break;
- default:
- ALOGI(" form %d\n", mFormFlag);
- break;
- }
-}
-
-void MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) {
- switch (mType) {
- case MTP_TYPE_INT8:
- buffer.appendFormat("%d", value.u.i8);
- break;
- case MTP_TYPE_UINT8:
- buffer.appendFormat("%d", value.u.u8);
- break;
- case MTP_TYPE_INT16:
- buffer.appendFormat("%d", value.u.i16);
- break;
- case MTP_TYPE_UINT16:
- buffer.appendFormat("%d", value.u.u16);
- break;
- case MTP_TYPE_INT32:
- buffer.appendFormat("%d", value.u.i32);
- break;
- case MTP_TYPE_UINT32:
- buffer.appendFormat("%d", value.u.u32);
- break;
- case MTP_TYPE_INT64:
- buffer.appendFormat("%lld", value.u.i64);
- break;
- case MTP_TYPE_UINT64:
- buffer.appendFormat("%lld", value.u.u64);
- break;
- case MTP_TYPE_INT128:
- buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1],
- value.u.i128[2], value.u.i128[3]);
- break;
- case MTP_TYPE_UINT128:
- buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1],
- value.u.u128[2], value.u.u128[3]);
- break;
- case MTP_TYPE_STR:
- buffer.appendFormat("%s", value.str);
- break;
- default:
- ALOGE("unsupported type for MtpProperty::print\n");
- break;
- }
-}
-
-void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) {
- MtpStringBuffer stringBuffer;
-
- switch (mType) {
- case MTP_TYPE_INT8:
- case MTP_TYPE_AINT8:
- value.u.i8 = packet.getInt8();
- break;
- case MTP_TYPE_UINT8:
- case MTP_TYPE_AUINT8:
- value.u.u8 = packet.getUInt8();
- break;
- case MTP_TYPE_INT16:
- case MTP_TYPE_AINT16:
- value.u.i16 = packet.getInt16();
- break;
- case MTP_TYPE_UINT16:
- case MTP_TYPE_AUINT16:
- value.u.u16 = packet.getUInt16();
- break;
- case MTP_TYPE_INT32:
- case MTP_TYPE_AINT32:
- value.u.i32 = packet.getInt32();
- break;
- case MTP_TYPE_UINT32:
- case MTP_TYPE_AUINT32:
- value.u.u32 = packet.getUInt32();
- break;
- case MTP_TYPE_INT64:
- case MTP_TYPE_AINT64:
- value.u.i64 = packet.getInt64();
- break;
- case MTP_TYPE_UINT64:
- case MTP_TYPE_AUINT64:
- value.u.u64 = packet.getUInt64();
- break;
- case MTP_TYPE_INT128:
- case MTP_TYPE_AINT128:
- packet.getInt128(value.u.i128);
- break;
- case MTP_TYPE_UINT128:
- case MTP_TYPE_AUINT128:
- packet.getUInt128(value.u.u128);
- break;
- case MTP_TYPE_STR:
- packet.getString(stringBuffer);
- value.str = strdup(stringBuffer);
- break;
- default:
- ALOGE("unknown type %04X in MtpProperty::readValue", mType);
- }
-}
-
-void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) {
- MtpStringBuffer stringBuffer;
-
- switch (mType) {
- case MTP_TYPE_INT8:
- case MTP_TYPE_AINT8:
- packet.putInt8(value.u.i8);
- break;
- case MTP_TYPE_UINT8:
- case MTP_TYPE_AUINT8:
- packet.putUInt8(value.u.u8);
- break;
- case MTP_TYPE_INT16:
- case MTP_TYPE_AINT16:
- packet.putInt16(value.u.i16);
- break;
- case MTP_TYPE_UINT16:
- case MTP_TYPE_AUINT16:
- packet.putUInt16(value.u.u16);
- break;
- case MTP_TYPE_INT32:
- case MTP_TYPE_AINT32:
- packet.putInt32(value.u.i32);
- break;
- case MTP_TYPE_UINT32:
- case MTP_TYPE_AUINT32:
- packet.putUInt32(value.u.u32);
- break;
- case MTP_TYPE_INT64:
- case MTP_TYPE_AINT64:
- packet.putInt64(value.u.i64);
- break;
- case MTP_TYPE_UINT64:
- case MTP_TYPE_AUINT64:
- packet.putUInt64(value.u.u64);
- break;
- case MTP_TYPE_INT128:
- case MTP_TYPE_AINT128:
- packet.putInt128(value.u.i128);
- break;
- case MTP_TYPE_UINT128:
- case MTP_TYPE_AUINT128:
- packet.putUInt128(value.u.u128);
- break;
- case MTP_TYPE_STR:
- if (value.str)
- packet.putString(value.str);
- else
- packet.putEmptyString();
- break;
- default:
- ALOGE("unknown type %04X in MtpProperty::writeValue", mType);
- }
-}
-
-MtpPropertyValue* MtpProperty::readArrayValues(MtpDataPacket& packet, int& length) {
- length = packet.getUInt32();
- if (length == 0)
- return NULL;
- MtpPropertyValue* result = new MtpPropertyValue[length];
- for (int i = 0; i < length; i++)
- readValue(packet, result[i]);
- return result;
-}
-
-void MtpProperty::writeArrayValues(MtpDataPacket& packet, MtpPropertyValue* values, int length) {
- packet.putUInt32(length);
- for (int i = 0; i < length; i++)
- writeValue(packet, values[i]);
-}
-
-} // namespace android
diff --git a/media/mtp/MtpProperty.h b/media/mtp/MtpProperty.h
deleted file mode 100644
index 06ca56e..0000000
--- a/media/mtp/MtpProperty.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_PROPERTY_H
-#define _MTP_PROPERTY_H
-
-#include "MtpTypes.h"
-
-namespace android {
-
-class MtpDataPacket;
-
-struct MtpPropertyValue {
- union {
- int8_t i8;
- uint8_t u8;
- int16_t i16;
- uint16_t u16;
- int32_t i32;
- uint32_t u32;
- int64_t i64;
- uint64_t u64;
- int128_t i128;
- uint128_t u128;
- } u;
- // string in UTF8 format
- char* str;
-};
-
-class MtpProperty {
-public:
- MtpPropertyCode mCode;
- MtpDataType mType;
- bool mWriteable;
- MtpPropertyValue mDefaultValue;
- MtpPropertyValue mCurrentValue;
-
- // for array types
- int mDefaultArrayLength;
- MtpPropertyValue* mDefaultArrayValues;
- int mCurrentArrayLength;
- MtpPropertyValue* mCurrentArrayValues;
-
- enum {
- kFormNone = 0,
- kFormRange = 1,
- kFormEnum = 2,
- kFormDateTime = 3,
- };
-
- uint32_t mGroupCode;
- uint8_t mFormFlag;
-
- // for range form
- MtpPropertyValue mMinimumValue;
- MtpPropertyValue mMaximumValue;
- MtpPropertyValue mStepSize;
-
- // for enum form
- int mEnumLength;
- MtpPropertyValue* mEnumValues;
-
-public:
- MtpProperty();
- MtpProperty(MtpPropertyCode propCode,
- MtpDataType type,
- bool writeable = false,
- int defaultValue = 0);
- virtual ~MtpProperty();
-
- inline MtpPropertyCode getPropertyCode() const { return mCode; }
-
- void read(MtpDataPacket& packet);
- void write(MtpDataPacket& packet);
-
- void setDefaultValue(const uint16_t* string);
- void setCurrentValue(const uint16_t* string);
-
- void setFormRange(int min, int max, int step);
- void setFormEnum(const int* values, int count);
- void setFormDateTime();
-
- void print();
- void print(MtpPropertyValue& value, MtpString& buffer);
-
- inline bool isDeviceProperty() const {
- return ( ((mCode & 0xF000) == 0x5000)
- || ((mCode & 0xF800) == 0xD000));
- }
-
-private:
- void readValue(MtpDataPacket& packet, MtpPropertyValue& value);
- void writeValue(MtpDataPacket& packet, MtpPropertyValue& value);
- MtpPropertyValue* readArrayValues(MtpDataPacket& packet, int& length);
- void writeArrayValues(MtpDataPacket& packet,
- MtpPropertyValue* values, int length);
-};
-
-}; // namespace android
-
-#endif // _MTP_PROPERTY_H
diff --git a/media/mtp/MtpRequestPacket.cpp b/media/mtp/MtpRequestPacket.cpp
deleted file mode 100644
index 0e58e01..0000000
--- a/media/mtp/MtpRequestPacket.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpRequestPacket"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#include "MtpRequestPacket.h"
-
-#include <usbhost/usbhost.h>
-
-namespace android {
-
-MtpRequestPacket::MtpRequestPacket()
- : MtpPacket(512)
-{
-}
-
-MtpRequestPacket::~MtpRequestPacket() {
-}
-
-#ifdef MTP_DEVICE
-int MtpRequestPacket::read(int fd) {
- int ret = ::read(fd, mBuffer, mBufferSize);
- if (ret >= 0)
- mPacketSize = ret;
- else
- mPacketSize = 0;
- return ret;
-}
-#endif
-
-#ifdef MTP_HOST
- // write our buffer to the given endpoint (host mode)
-int MtpRequestPacket::write(struct usb_request *request)
-{
- putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
- putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_COMMAND);
- request->buffer = mBuffer;
- request->buffer_length = mPacketSize;
- return transfer(request);
-}
-#endif
-
-} // namespace android
diff --git a/media/mtp/MtpRequestPacket.h b/media/mtp/MtpRequestPacket.h
deleted file mode 100644
index 1201f11..0000000
--- a/media/mtp/MtpRequestPacket.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_REQUEST_PACKET_H
-#define _MTP_REQUEST_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-struct usb_request;
-
-namespace android {
-
-class MtpRequestPacket : public MtpPacket {
-
-public:
- MtpRequestPacket();
- virtual ~MtpRequestPacket();
-
-#ifdef MTP_DEVICE
- // fill our buffer with data from the given file descriptor
- int read(int fd);
-#endif
-
-#ifdef MTP_HOST
- // write our buffer to the given endpoint
- int write(struct usb_request *request);
-#endif
-
- inline MtpOperationCode getOperationCode() const { return getContainerCode(); }
- inline void setOperationCode(MtpOperationCode code)
- { return setContainerCode(code); }
-};
-
-}; // namespace android
-
-#endif // _MTP_REQUEST_PACKET_H
diff --git a/media/mtp/MtpResponsePacket.cpp b/media/mtp/MtpResponsePacket.cpp
deleted file mode 100644
index c2b41e4..0000000
--- a/media/mtp/MtpResponsePacket.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpResponsePacket"
-
-#include <stdio.h>
-#include <sys/types.h>
-#include <fcntl.h>
-
-#include "MtpResponsePacket.h"
-
-#include <usbhost/usbhost.h>
-
-namespace android {
-
-MtpResponsePacket::MtpResponsePacket()
- : MtpPacket(512)
-{
-}
-
-MtpResponsePacket::~MtpResponsePacket() {
-}
-
-#ifdef MTP_DEVICE
-int MtpResponsePacket::write(int fd) {
- putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
- putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_RESPONSE);
- int ret = ::write(fd, mBuffer, mPacketSize);
- return (ret < 0 ? ret : 0);
-}
-#endif
-
-#ifdef MTP_HOST
-int MtpResponsePacket::read(struct usb_request *request) {
- request->buffer = mBuffer;
- request->buffer_length = mBufferSize;
- int ret = transfer(request);
- if (ret >= 0)
- mPacketSize = ret;
- else
- mPacketSize = 0;
- return ret;
-}
-#endif
-
-} // namespace android
-
diff --git a/media/mtp/MtpResponsePacket.h b/media/mtp/MtpResponsePacket.h
deleted file mode 100644
index 592ad4a..0000000
--- a/media/mtp/MtpResponsePacket.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_RESPONSE_PACKET_H
-#define _MTP_RESPONSE_PACKET_H
-
-#include "MtpPacket.h"
-#include "mtp.h"
-
-namespace android {
-
-class MtpResponsePacket : public MtpPacket {
-
-public:
- MtpResponsePacket();
- virtual ~MtpResponsePacket();
-
-#ifdef MTP_DEVICE
- // write our data to the given file descriptor
- int write(int fd);
-#endif
-
-#ifdef MTP_HOST
- // read our buffer with the given request
- int read(struct usb_request *request);
-#endif
-
- inline MtpResponseCode getResponseCode() const { return getContainerCode(); }
- inline void setResponseCode(MtpResponseCode code)
- { return setContainerCode(code); }
-};
-
-}; // namespace android
-
-#endif // _MTP_RESPONSE_PACKET_H
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
deleted file mode 100644
index 5606187..0000000
--- a/media/mtp/MtpServer.cpp
+++ /dev/null
@@ -1,1210 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <dirent.h>
-
-#include <cutils/properties.h>
-
-#define LOG_TAG "MtpServer"
-
-#include "MtpDebug.h"
-#include "MtpDatabase.h"
-#include "MtpObjectInfo.h"
-#include "MtpProperty.h"
-#include "MtpServer.h"
-#include "MtpStorage.h"
-#include "MtpStringBuffer.h"
-
-#include <linux/usb/f_mtp.h>
-
-namespace android {
-
-static const MtpOperationCode kSupportedOperationCodes[] = {
- MTP_OPERATION_GET_DEVICE_INFO,
- MTP_OPERATION_OPEN_SESSION,
- MTP_OPERATION_CLOSE_SESSION,
- MTP_OPERATION_GET_STORAGE_IDS,
- MTP_OPERATION_GET_STORAGE_INFO,
- MTP_OPERATION_GET_NUM_OBJECTS,
- MTP_OPERATION_GET_OBJECT_HANDLES,
- MTP_OPERATION_GET_OBJECT_INFO,
- MTP_OPERATION_GET_OBJECT,
- MTP_OPERATION_GET_THUMB,
- MTP_OPERATION_DELETE_OBJECT,
- MTP_OPERATION_SEND_OBJECT_INFO,
- MTP_OPERATION_SEND_OBJECT,
-// MTP_OPERATION_INITIATE_CAPTURE,
-// MTP_OPERATION_FORMAT_STORE,
-// MTP_OPERATION_RESET_DEVICE,
-// MTP_OPERATION_SELF_TEST,
-// MTP_OPERATION_SET_OBJECT_PROTECTION,
-// MTP_OPERATION_POWER_DOWN,
- MTP_OPERATION_GET_DEVICE_PROP_DESC,
- MTP_OPERATION_GET_DEVICE_PROP_VALUE,
- MTP_OPERATION_SET_DEVICE_PROP_VALUE,
- MTP_OPERATION_RESET_DEVICE_PROP_VALUE,
-// MTP_OPERATION_TERMINATE_OPEN_CAPTURE,
-// MTP_OPERATION_MOVE_OBJECT,
-// MTP_OPERATION_COPY_OBJECT,
- MTP_OPERATION_GET_PARTIAL_OBJECT,
-// MTP_OPERATION_INITIATE_OPEN_CAPTURE,
- MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED,
- MTP_OPERATION_GET_OBJECT_PROP_DESC,
- MTP_OPERATION_GET_OBJECT_PROP_VALUE,
- MTP_OPERATION_SET_OBJECT_PROP_VALUE,
- MTP_OPERATION_GET_OBJECT_PROP_LIST,
-// MTP_OPERATION_SET_OBJECT_PROP_LIST,
-// MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC,
-// MTP_OPERATION_SEND_OBJECT_PROP_LIST,
- MTP_OPERATION_GET_OBJECT_REFERENCES,
- MTP_OPERATION_SET_OBJECT_REFERENCES,
-// MTP_OPERATION_SKIP,
- // Android extension for direct file IO
- MTP_OPERATION_GET_PARTIAL_OBJECT_64,
- MTP_OPERATION_SEND_PARTIAL_OBJECT,
- MTP_OPERATION_TRUNCATE_OBJECT,
- MTP_OPERATION_BEGIN_EDIT_OBJECT,
- MTP_OPERATION_END_EDIT_OBJECT,
-};
-
-static const MtpEventCode kSupportedEventCodes[] = {
- MTP_EVENT_OBJECT_ADDED,
- MTP_EVENT_OBJECT_REMOVED,
- MTP_EVENT_STORE_ADDED,
- MTP_EVENT_STORE_REMOVED,
-};
-
-MtpServer::MtpServer(int fd, MtpDatabase* database, bool ptp,
- int fileGroup, int filePerm, int directoryPerm)
- : mFD(fd),
- mDatabase(database),
- mPtp(ptp),
- mFileGroup(fileGroup),
- mFilePermission(filePerm),
- mDirectoryPermission(directoryPerm),
- mSessionID(0),
- mSessionOpen(false),
- mSendObjectHandle(kInvalidObjectHandle),
- mSendObjectFormat(0),
- mSendObjectFileSize(0)
-{
-}
-
-MtpServer::~MtpServer() {
-}
-
-void MtpServer::addStorage(MtpStorage* storage) {
- Mutex::Autolock autoLock(mMutex);
-
- mStorages.push(storage);
- sendStoreAdded(storage->getStorageID());
-}
-
-void MtpServer::removeStorage(MtpStorage* storage) {
- Mutex::Autolock autoLock(mMutex);
-
- for (int i = 0; i < mStorages.size(); i++) {
- if (mStorages[i] == storage) {
- mStorages.removeAt(i);
- sendStoreRemoved(storage->getStorageID());
- break;
- }
- }
-}
-
-MtpStorage* MtpServer::getStorage(MtpStorageID id) {
- if (id == 0)
- return mStorages[0];
- for (int i = 0; i < mStorages.size(); i++) {
- MtpStorage* storage = mStorages[i];
- if (storage->getStorageID() == id)
- return storage;
- }
- return NULL;
-}
-
-bool MtpServer::hasStorage(MtpStorageID id) {
- if (id == 0 || id == 0xFFFFFFFF)
- return mStorages.size() > 0;
- return (getStorage(id) != NULL);
-}
-
-void MtpServer::run() {
- int fd = mFD;
-
- ALOGV("MtpServer::run fd: %d\n", fd);
-
- while (1) {
- int ret = mRequest.read(fd);
- if (ret < 0) {
- ALOGV("request read returned %d, errno: %d", ret, errno);
- if (errno == ECANCELED) {
- // return to top of loop and wait for next command
- continue;
- }
- break;
- }
- MtpOperationCode operation = mRequest.getOperationCode();
- MtpTransactionID transaction = mRequest.getTransactionID();
-
- ALOGV("operation: %s", MtpDebug::getOperationCodeName(operation));
- mRequest.dump();
-
- // FIXME need to generalize this
- bool dataIn = (operation == MTP_OPERATION_SEND_OBJECT_INFO
- || operation == MTP_OPERATION_SET_OBJECT_REFERENCES
- || operation == MTP_OPERATION_SET_OBJECT_PROP_VALUE
- || operation == MTP_OPERATION_SET_DEVICE_PROP_VALUE);
- if (dataIn) {
- int ret = mData.read(fd);
- if (ret < 0) {
- ALOGE("data read returned %d, errno: %d", ret, errno);
- if (errno == ECANCELED) {
- // return to top of loop and wait for next command
- continue;
- }
- break;
- }
- ALOGV("received data:");
- mData.dump();
- } else {
- mData.reset();
- }
-
- if (handleRequest()) {
- if (!dataIn && mData.hasData()) {
- mData.setOperationCode(operation);
- mData.setTransactionID(transaction);
- ALOGV("sending data:");
- mData.dump();
- ret = mData.write(fd);
- if (ret < 0) {
- ALOGE("request write returned %d, errno: %d", ret, errno);
- if (errno == ECANCELED) {
- // return to top of loop and wait for next command
- continue;
- }
- break;
- }
- }
-
- mResponse.setTransactionID(transaction);
- ALOGV("sending response %04X", mResponse.getResponseCode());
- ret = mResponse.write(fd);
- mResponse.dump();
- if (ret < 0) {
- ALOGE("request write returned %d, errno: %d", ret, errno);
- if (errno == ECANCELED) {
- // return to top of loop and wait for next command
- continue;
- }
- break;
- }
- } else {
- ALOGV("skipping response\n");
- }
- }
-
- // commit any open edits
- int count = mObjectEditList.size();
- for (int i = 0; i < count; i++) {
- ObjectEdit* edit = mObjectEditList[i];
- commitEdit(edit);
- delete edit;
- }
- mObjectEditList.clear();
-
- if (mSessionOpen)
- mDatabase->sessionEnded();
- close(fd);
- mFD = -1;
-}
-
-void MtpServer::sendObjectAdded(MtpObjectHandle handle) {
- ALOGV("sendObjectAdded %d\n", handle);
- sendEvent(MTP_EVENT_OBJECT_ADDED, handle);
-}
-
-void MtpServer::sendObjectRemoved(MtpObjectHandle handle) {
- ALOGV("sendObjectRemoved %d\n", handle);
- sendEvent(MTP_EVENT_OBJECT_REMOVED, handle);
-}
-
-void MtpServer::sendStoreAdded(MtpStorageID id) {
- ALOGV("sendStoreAdded %08X\n", id);
- sendEvent(MTP_EVENT_STORE_ADDED, id);
-}
-
-void MtpServer::sendStoreRemoved(MtpStorageID id) {
- ALOGV("sendStoreRemoved %08X\n", id);
- sendEvent(MTP_EVENT_STORE_REMOVED, id);
-}
-
-void MtpServer::sendEvent(MtpEventCode code, uint32_t param1) {
- if (mSessionOpen) {
- mEvent.setEventCode(code);
- mEvent.setTransactionID(mRequest.getTransactionID());
- mEvent.setParameter(1, param1);
- int ret = mEvent.write(mFD);
- ALOGV("mEvent.write returned %d\n", ret);
- }
-}
-
-void MtpServer::addEditObject(MtpObjectHandle handle, MtpString& path,
- uint64_t size, MtpObjectFormat format, int fd) {
- ObjectEdit* edit = new ObjectEdit(handle, path, size, format, fd);
- mObjectEditList.add(edit);
-}
-
-MtpServer::ObjectEdit* MtpServer::getEditObject(MtpObjectHandle handle) {
- int count = mObjectEditList.size();
- for (int i = 0; i < count; i++) {
- ObjectEdit* edit = mObjectEditList[i];
- if (edit->mHandle == handle) return edit;
- }
- return NULL;
-}
-
-void MtpServer::removeEditObject(MtpObjectHandle handle) {
- int count = mObjectEditList.size();
- for (int i = 0; i < count; i++) {
- ObjectEdit* edit = mObjectEditList[i];
- if (edit->mHandle == handle) {
- delete edit;
- mObjectEditList.removeAt(i);
- return;
- }
- }
- ALOGE("ObjectEdit not found in removeEditObject");
-}
-
-void MtpServer::commitEdit(ObjectEdit* edit) {
- mDatabase->endSendObject((const char *)edit->mPath, edit->mHandle, edit->mFormat, true);
-}
-
-
-bool MtpServer::handleRequest() {
- Mutex::Autolock autoLock(mMutex);
-
- MtpOperationCode operation = mRequest.getOperationCode();
- MtpResponseCode response;
-
- mResponse.reset();
-
- if (mSendObjectHandle != kInvalidObjectHandle && operation != MTP_OPERATION_SEND_OBJECT) {
- // FIXME - need to delete mSendObjectHandle from the database
- ALOGE("expected SendObject after SendObjectInfo");
- mSendObjectHandle = kInvalidObjectHandle;
- }
-
- switch (operation) {
- case MTP_OPERATION_GET_DEVICE_INFO:
- response = doGetDeviceInfo();
- break;
- case MTP_OPERATION_OPEN_SESSION:
- response = doOpenSession();
- break;
- case MTP_OPERATION_CLOSE_SESSION:
- response = doCloseSession();
- break;
- case MTP_OPERATION_GET_STORAGE_IDS:
- response = doGetStorageIDs();
- break;
- case MTP_OPERATION_GET_STORAGE_INFO:
- response = doGetStorageInfo();
- break;
- case MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED:
- response = doGetObjectPropsSupported();
- break;
- case MTP_OPERATION_GET_OBJECT_HANDLES:
- response = doGetObjectHandles();
- break;
- case MTP_OPERATION_GET_NUM_OBJECTS:
- response = doGetNumObjects();
- break;
- case MTP_OPERATION_GET_OBJECT_REFERENCES:
- response = doGetObjectReferences();
- break;
- case MTP_OPERATION_SET_OBJECT_REFERENCES:
- response = doSetObjectReferences();
- break;
- case MTP_OPERATION_GET_OBJECT_PROP_VALUE:
- response = doGetObjectPropValue();
- break;
- case MTP_OPERATION_SET_OBJECT_PROP_VALUE:
- response = doSetObjectPropValue();
- break;
- case MTP_OPERATION_GET_DEVICE_PROP_VALUE:
- response = doGetDevicePropValue();
- break;
- case MTP_OPERATION_SET_DEVICE_PROP_VALUE:
- response = doSetDevicePropValue();
- break;
- case MTP_OPERATION_RESET_DEVICE_PROP_VALUE:
- response = doResetDevicePropValue();
- break;
- case MTP_OPERATION_GET_OBJECT_PROP_LIST:
- response = doGetObjectPropList();
- break;
- case MTP_OPERATION_GET_OBJECT_INFO:
- response = doGetObjectInfo();
- break;
- case MTP_OPERATION_GET_OBJECT:
- response = doGetObject();
- break;
- case MTP_OPERATION_GET_THUMB:
- response = doGetThumb();
- break;
- case MTP_OPERATION_GET_PARTIAL_OBJECT:
- case MTP_OPERATION_GET_PARTIAL_OBJECT_64:
- response = doGetPartialObject(operation);
- break;
- case MTP_OPERATION_SEND_OBJECT_INFO:
- response = doSendObjectInfo();
- break;
- case MTP_OPERATION_SEND_OBJECT:
- response = doSendObject();
- break;
- case MTP_OPERATION_DELETE_OBJECT:
- response = doDeleteObject();
- break;
- case MTP_OPERATION_GET_OBJECT_PROP_DESC:
- response = doGetObjectPropDesc();
- break;
- case MTP_OPERATION_GET_DEVICE_PROP_DESC:
- response = doGetDevicePropDesc();
- break;
- case MTP_OPERATION_SEND_PARTIAL_OBJECT:
- response = doSendPartialObject();
- break;
- case MTP_OPERATION_TRUNCATE_OBJECT:
- response = doTruncateObject();
- break;
- case MTP_OPERATION_BEGIN_EDIT_OBJECT:
- response = doBeginEditObject();
- break;
- case MTP_OPERATION_END_EDIT_OBJECT:
- response = doEndEditObject();
- break;
- default:
- ALOGE("got unsupported command %s", MtpDebug::getOperationCodeName(operation));
- response = MTP_RESPONSE_OPERATION_NOT_SUPPORTED;
- break;
- }
-
- if (response == MTP_RESPONSE_TRANSACTION_CANCELLED)
- return false;
- mResponse.setResponseCode(response);
- return true;
-}
-
-MtpResponseCode MtpServer::doGetDeviceInfo() {
- MtpStringBuffer string;
- char prop_value[PROPERTY_VALUE_MAX];
-
- MtpObjectFormatList* playbackFormats = mDatabase->getSupportedPlaybackFormats();
- MtpObjectFormatList* captureFormats = mDatabase->getSupportedCaptureFormats();
- MtpDevicePropertyList* deviceProperties = mDatabase->getSupportedDeviceProperties();
-
- // fill in device info
- mData.putUInt16(MTP_STANDARD_VERSION);
- if (mPtp) {
- mData.putUInt32(0);
- } else {
- // MTP Vendor Extension ID
- mData.putUInt32(6);
- }
- mData.putUInt16(MTP_STANDARD_VERSION);
- if (mPtp) {
- // no extensions
- string.set("");
- } else {
- // MTP extensions
- string.set("microsoft.com: 1.0; android.com: 1.0;");
- }
- mData.putString(string); // MTP Extensions
- mData.putUInt16(0); //Functional Mode
- mData.putAUInt16(kSupportedOperationCodes,
- sizeof(kSupportedOperationCodes) / sizeof(uint16_t)); // Operations Supported
- mData.putAUInt16(kSupportedEventCodes,
- sizeof(kSupportedEventCodes) / sizeof(uint16_t)); // Events Supported
- mData.putAUInt16(deviceProperties); // Device Properties Supported
- mData.putAUInt16(captureFormats); // Capture Formats
- mData.putAUInt16(playbackFormats); // Playback Formats
-
- property_get("ro.product.manufacturer", prop_value, "unknown manufacturer");
- string.set(prop_value);
- mData.putString(string); // Manufacturer
-
- property_get("ro.product.model", prop_value, "MTP Device");
- string.set(prop_value);
- mData.putString(string); // Model
- string.set("1.0");
- mData.putString(string); // Device Version
-
- property_get("ro.serialno", prop_value, "????????");
- string.set(prop_value);
- mData.putString(string); // Serial Number
-
- delete playbackFormats;
- delete captureFormats;
- delete deviceProperties;
-
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doOpenSession() {
- if (mSessionOpen) {
- mResponse.setParameter(1, mSessionID);
- return MTP_RESPONSE_SESSION_ALREADY_OPEN;
- }
- mSessionID = mRequest.getParameter(1);
- mSessionOpen = true;
-
- mDatabase->sessionStarted();
-
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doCloseSession() {
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
- mSessionID = 0;
- mSessionOpen = false;
- mDatabase->sessionEnded();
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetStorageIDs() {
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
-
- int count = mStorages.size();
- mData.putUInt32(count);
- for (int i = 0; i < count; i++)
- mData.putUInt32(mStorages[i]->getStorageID());
-
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetStorageInfo() {
- MtpStringBuffer string;
-
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
- MtpStorageID id = mRequest.getParameter(1);
- MtpStorage* storage = getStorage(id);
- if (!storage)
- return MTP_RESPONSE_INVALID_STORAGE_ID;
-
- mData.putUInt16(storage->getType());
- mData.putUInt16(storage->getFileSystemType());
- mData.putUInt16(storage->getAccessCapability());
- mData.putUInt64(storage->getMaxCapacity());
- mData.putUInt64(storage->getFreeSpace());
- mData.putUInt32(1024*1024*1024); // Free Space in Objects
- string.set(storage->getDescription());
- mData.putString(string);
- mData.putEmptyString(); // Volume Identifier
-
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetObjectPropsSupported() {
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
- MtpObjectFormat format = mRequest.getParameter(1);
- MtpObjectPropertyList* properties = mDatabase->getSupportedObjectProperties(format);
- mData.putAUInt16(properties);
- delete properties;
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetObjectHandles() {
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
- MtpStorageID storageID = mRequest.getParameter(1); // 0xFFFFFFFF for all storage
- MtpObjectFormat format = mRequest.getParameter(2); // 0 for all formats
- MtpObjectHandle parent = mRequest.getParameter(3); // 0xFFFFFFFF for objects with no parent
- // 0x00000000 for all objects
-
- if (!hasStorage(storageID))
- return MTP_RESPONSE_INVALID_STORAGE_ID;
-
- MtpObjectHandleList* handles = mDatabase->getObjectList(storageID, format, parent);
- mData.putAUInt32(handles);
- delete handles;
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetNumObjects() {
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
- MtpStorageID storageID = mRequest.getParameter(1); // 0xFFFFFFFF for all storage
- MtpObjectFormat format = mRequest.getParameter(2); // 0 for all formats
- MtpObjectHandle parent = mRequest.getParameter(3); // 0xFFFFFFFF for objects with no parent
- // 0x00000000 for all objects
- if (!hasStorage(storageID))
- return MTP_RESPONSE_INVALID_STORAGE_ID;
-
- int count = mDatabase->getNumObjects(storageID, format, parent);
- if (count >= 0) {
- mResponse.setParameter(1, count);
- return MTP_RESPONSE_OK;
- } else {
- mResponse.setParameter(1, 0);
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- }
-}
-
-MtpResponseCode MtpServer::doGetObjectReferences() {
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
-
- // FIXME - check for invalid object handle
- MtpObjectHandleList* handles = mDatabase->getObjectReferences(handle);
- if (handles) {
- mData.putAUInt32(handles);
- delete handles;
- } else {
- mData.putEmptyArray();
- }
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSetObjectReferences() {
- if (!mSessionOpen)
- return MTP_RESPONSE_SESSION_NOT_OPEN;
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpStorageID handle = mRequest.getParameter(1);
-
- MtpObjectHandleList* references = mData.getAUInt32();
- MtpResponseCode result = mDatabase->setObjectReferences(handle, references);
- delete references;
- return result;
-}
-
-MtpResponseCode MtpServer::doGetObjectPropValue() {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
- MtpObjectProperty property = mRequest.getParameter(2);
- ALOGV("GetObjectPropValue %d %s\n", handle,
- MtpDebug::getObjectPropCodeName(property));
-
- return mDatabase->getObjectPropertyValue(handle, property, mData);
-}
-
-MtpResponseCode MtpServer::doSetObjectPropValue() {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
- MtpObjectProperty property = mRequest.getParameter(2);
- ALOGV("SetObjectPropValue %d %s\n", handle,
- MtpDebug::getObjectPropCodeName(property));
-
- return mDatabase->setObjectPropertyValue(handle, property, mData);
-}
-
-MtpResponseCode MtpServer::doGetDevicePropValue() {
- MtpDeviceProperty property = mRequest.getParameter(1);
- ALOGV("GetDevicePropValue %s\n",
- MtpDebug::getDevicePropCodeName(property));
-
- return mDatabase->getDevicePropertyValue(property, mData);
-}
-
-MtpResponseCode MtpServer::doSetDevicePropValue() {
- MtpDeviceProperty property = mRequest.getParameter(1);
- ALOGV("SetDevicePropValue %s\n",
- MtpDebug::getDevicePropCodeName(property));
-
- return mDatabase->setDevicePropertyValue(property, mData);
-}
-
-MtpResponseCode MtpServer::doResetDevicePropValue() {
- MtpDeviceProperty property = mRequest.getParameter(1);
- ALOGV("ResetDevicePropValue %s\n",
- MtpDebug::getDevicePropCodeName(property));
-
- return mDatabase->resetDeviceProperty(property);
-}
-
-MtpResponseCode MtpServer::doGetObjectPropList() {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
-
- MtpObjectHandle handle = mRequest.getParameter(1);
- // use uint32_t so we can support 0xFFFFFFFF
- uint32_t format = mRequest.getParameter(2);
- uint32_t property = mRequest.getParameter(3);
- int groupCode = mRequest.getParameter(4);
- int depth = mRequest.getParameter(5);
- ALOGV("GetObjectPropList %d format: %s property: %s group: %d depth: %d\n",
- handle, MtpDebug::getFormatCodeName(format),
- MtpDebug::getObjectPropCodeName(property), groupCode, depth);
-
- return mDatabase->getObjectPropertyList(handle, format, property, groupCode, depth, mData);
-}
-
-MtpResponseCode MtpServer::doGetObjectInfo() {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
- MtpObjectInfo info(handle);
- MtpResponseCode result = mDatabase->getObjectInfo(handle, info);
- if (result == MTP_RESPONSE_OK) {
- char date[20];
-
- mData.putUInt32(info.mStorageID);
- mData.putUInt16(info.mFormat);
- mData.putUInt16(info.mProtectionStatus);
-
- // if object is being edited the database size may be out of date
- uint32_t size = info.mCompressedSize;
- ObjectEdit* edit = getEditObject(handle);
- if (edit)
- size = (edit->mSize > 0xFFFFFFFFLL ? 0xFFFFFFFF : (uint32_t)edit->mSize);
- mData.putUInt32(size);
-
- mData.putUInt16(info.mThumbFormat);
- mData.putUInt32(info.mThumbCompressedSize);
- mData.putUInt32(info.mThumbPixWidth);
- mData.putUInt32(info.mThumbPixHeight);
- mData.putUInt32(info.mImagePixWidth);
- mData.putUInt32(info.mImagePixHeight);
- mData.putUInt32(info.mImagePixDepth);
- mData.putUInt32(info.mParent);
- mData.putUInt16(info.mAssociationType);
- mData.putUInt32(info.mAssociationDesc);
- mData.putUInt32(info.mSequenceNumber);
- mData.putString(info.mName);
- mData.putEmptyString(); // date created
- formatDateTime(info.mDateModified, date, sizeof(date));
- mData.putString(date); // date modified
- mData.putEmptyString(); // keywords
- }
- return result;
-}
-
-MtpResponseCode MtpServer::doGetObject() {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
- MtpString pathBuf;
- int64_t fileLength;
- MtpObjectFormat format;
- int result = mDatabase->getObjectFilePath(handle, pathBuf, fileLength, format);
- if (result != MTP_RESPONSE_OK)
- return result;
-
- const char* filePath = (const char *)pathBuf;
- mtp_file_range mfr;
- mfr.fd = open(filePath, O_RDONLY);
- if (mfr.fd < 0) {
- return MTP_RESPONSE_GENERAL_ERROR;
- }
- mfr.offset = 0;
- mfr.length = fileLength;
- mfr.command = mRequest.getOperationCode();
- mfr.transaction_id = mRequest.getTransactionID();
-
- // then transfer the file
- int ret = ioctl(mFD, MTP_SEND_FILE_WITH_HEADER, (unsigned long)&mfr);
- ALOGV("MTP_SEND_FILE_WITH_HEADER returned %d\n", ret);
- close(mfr.fd);
- if (ret < 0) {
- if (errno == ECANCELED)
- return MTP_RESPONSE_TRANSACTION_CANCELLED;
- else
- return MTP_RESPONSE_GENERAL_ERROR;
- }
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetThumb() {
- MtpObjectHandle handle = mRequest.getParameter(1);
- size_t thumbSize;
- void* thumb = mDatabase->getThumbnail(handle, thumbSize);
- if (thumb) {
- // send data
- mData.setOperationCode(mRequest.getOperationCode());
- mData.setTransactionID(mRequest.getTransactionID());
- mData.writeData(mFD, thumb, thumbSize);
- free(thumb);
- return MTP_RESPONSE_OK;
- } else {
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-}
-
-MtpResponseCode MtpServer::doGetPartialObject(MtpOperationCode operation) {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
- uint64_t offset;
- uint32_t length;
- offset = mRequest.getParameter(2);
- if (operation == MTP_OPERATION_GET_PARTIAL_OBJECT_64) {
- // android extension with 64 bit offset
- uint64_t offset2 = mRequest.getParameter(3);
- offset = offset | (offset2 << 32);
- length = mRequest.getParameter(4);
- } else {
- // standard GetPartialObject
- length = mRequest.getParameter(3);
- }
- MtpString pathBuf;
- int64_t fileLength;
- MtpObjectFormat format;
- int result = mDatabase->getObjectFilePath(handle, pathBuf, fileLength, format);
- if (result != MTP_RESPONSE_OK)
- return result;
- if (offset + length > fileLength)
- length = fileLength - offset;
-
- const char* filePath = (const char *)pathBuf;
- mtp_file_range mfr;
- mfr.fd = open(filePath, O_RDONLY);
- if (mfr.fd < 0) {
- return MTP_RESPONSE_GENERAL_ERROR;
- }
- mfr.offset = offset;
- mfr.length = length;
- mfr.command = mRequest.getOperationCode();
- mfr.transaction_id = mRequest.getTransactionID();
- mResponse.setParameter(1, length);
-
- // transfer the file
- int ret = ioctl(mFD, MTP_SEND_FILE_WITH_HEADER, (unsigned long)&mfr);
- ALOGV("MTP_SEND_FILE_WITH_HEADER returned %d\n", ret);
- close(mfr.fd);
- if (ret < 0) {
- if (errno == ECANCELED)
- return MTP_RESPONSE_TRANSACTION_CANCELLED;
- else
- return MTP_RESPONSE_GENERAL_ERROR;
- }
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSendObjectInfo() {
- MtpString path;
- MtpStorageID storageID = mRequest.getParameter(1);
- MtpStorage* storage = getStorage(storageID);
- MtpObjectHandle parent = mRequest.getParameter(2);
- if (!storage)
- return MTP_RESPONSE_INVALID_STORAGE_ID;
-
- // special case the root
- if (parent == MTP_PARENT_ROOT) {
- path = storage->getPath();
- parent = 0;
- } else {
- int64_t length;
- MtpObjectFormat format;
- int result = mDatabase->getObjectFilePath(parent, path, length, format);
- if (result != MTP_RESPONSE_OK)
- return result;
- if (format != MTP_FORMAT_ASSOCIATION)
- return MTP_RESPONSE_INVALID_PARENT_OBJECT;
- }
-
- // read only the fields we need
- mData.getUInt32(); // storage ID
- MtpObjectFormat format = mData.getUInt16();
- mData.getUInt16(); // protection status
- mSendObjectFileSize = mData.getUInt32();
- mData.getUInt16(); // thumb format
- mData.getUInt32(); // thumb compressed size
- mData.getUInt32(); // thumb pix width
- mData.getUInt32(); // thumb pix height
- mData.getUInt32(); // image pix width
- mData.getUInt32(); // image pix height
- mData.getUInt32(); // image bit depth
- mData.getUInt32(); // parent
- uint16_t associationType = mData.getUInt16();
- uint32_t associationDesc = mData.getUInt32(); // association desc
- mData.getUInt32(); // sequence number
- MtpStringBuffer name, created, modified;
- mData.getString(name); // file name
- mData.getString(created); // date created
- mData.getString(modified); // date modified
- // keywords follow
-
- ALOGV("name: %s format: %04X\n", (const char *)name, format);
- time_t modifiedTime;
- if (!parseDateTime(modified, modifiedTime))
- modifiedTime = 0;
-
- if (path[path.size() - 1] != '/')
- path += "/";
- path += (const char *)name;
-
- // check space first
- if (mSendObjectFileSize > storage->getFreeSpace())
- return MTP_RESPONSE_STORAGE_FULL;
- uint64_t maxFileSize = storage->getMaxFileSize();
- // check storage max file size
- if (maxFileSize != 0) {
- // if mSendObjectFileSize is 0xFFFFFFFF, then all we know is the file size
- // is >= 0xFFFFFFFF
- if (mSendObjectFileSize > maxFileSize || mSendObjectFileSize == 0xFFFFFFFF)
- return MTP_RESPONSE_OBJECT_TOO_LARGE;
- }
-
- ALOGD("path: %s parent: %d storageID: %08X", (const char*)path, parent, storageID);
- MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path,
- format, parent, storageID, mSendObjectFileSize, modifiedTime);
- if (handle == kInvalidObjectHandle) {
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- if (format == MTP_FORMAT_ASSOCIATION) {
- mode_t mask = umask(0);
- int ret = mkdir((const char *)path, mDirectoryPermission);
- umask(mask);
- if (ret && ret != -EEXIST)
- return MTP_RESPONSE_GENERAL_ERROR;
- chown((const char *)path, getuid(), mFileGroup);
-
- // SendObject does not get sent for directories, so call endSendObject here instead
- mDatabase->endSendObject(path, handle, MTP_FORMAT_ASSOCIATION, MTP_RESPONSE_OK);
- } else {
- mSendObjectFilePath = path;
- // save the handle for the SendObject call, which should follow
- mSendObjectHandle = handle;
- mSendObjectFormat = format;
- }
-
- mResponse.setParameter(1, storageID);
- mResponse.setParameter(2, parent);
- mResponse.setParameter(3, handle);
-
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSendObject() {
- if (!hasStorage())
- return MTP_RESPONSE_GENERAL_ERROR;
- MtpResponseCode result = MTP_RESPONSE_OK;
- mode_t mask;
- int ret, initialData;
-
- if (mSendObjectHandle == kInvalidObjectHandle) {
- ALOGE("Expected SendObjectInfo before SendObject");
- result = MTP_RESPONSE_NO_VALID_OBJECT_INFO;
- goto done;
- }
-
- // read the header, and possibly some data
- ret = mData.read(mFD);
- if (ret < MTP_CONTAINER_HEADER_SIZE) {
- result = MTP_RESPONSE_GENERAL_ERROR;
- goto done;
- }
- initialData = ret - MTP_CONTAINER_HEADER_SIZE;
-
- mtp_file_range mfr;
- mfr.fd = open(mSendObjectFilePath, O_RDWR | O_CREAT | O_TRUNC);
- if (mfr.fd < 0) {
- result = MTP_RESPONSE_GENERAL_ERROR;
- goto done;
- }
- fchown(mfr.fd, getuid(), mFileGroup);
- // set permissions
- mask = umask(0);
- fchmod(mfr.fd, mFilePermission);
- umask(mask);
-
- if (initialData > 0)
- ret = write(mfr.fd, mData.getData(), initialData);
-
- if (mSendObjectFileSize - initialData > 0) {
- mfr.offset = initialData;
- if (mSendObjectFileSize == 0xFFFFFFFF) {
- // tell driver to read until it receives a short packet
- mfr.length = 0xFFFFFFFF;
- } else {
- mfr.length = mSendObjectFileSize - initialData;
- }
-
- ALOGV("receiving %s\n", (const char *)mSendObjectFilePath);
- // transfer the file
- ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
- ALOGV("MTP_RECEIVE_FILE returned %d\n", ret);
- }
- close(mfr.fd);
-
- if (ret < 0) {
- unlink(mSendObjectFilePath);
- if (errno == ECANCELED)
- result = MTP_RESPONSE_TRANSACTION_CANCELLED;
- else
- result = MTP_RESPONSE_GENERAL_ERROR;
- }
-
-done:
- // reset so we don't attempt to send the data back
- mData.reset();
-
- mDatabase->endSendObject(mSendObjectFilePath, mSendObjectHandle, mSendObjectFormat,
- result == MTP_RESPONSE_OK);
- mSendObjectHandle = kInvalidObjectHandle;
- mSendObjectFormat = 0;
- return result;
-}
-
-static void deleteRecursive(const char* path) {
- char pathbuf[PATH_MAX];
- int pathLength = strlen(path);
- if (pathLength >= sizeof(pathbuf) - 1) {
- ALOGE("path too long: %s\n", path);
- }
- strcpy(pathbuf, path);
- if (pathbuf[pathLength - 1] != '/') {
- pathbuf[pathLength++] = '/';
- }
- char* fileSpot = pathbuf + pathLength;
- int pathRemaining = sizeof(pathbuf) - pathLength - 1;
-
- DIR* dir = opendir(path);
- if (!dir) {
- ALOGE("opendir %s failed: %s", path, strerror(errno));
- return;
- }
-
- struct dirent* entry;
- while ((entry = readdir(dir))) {
- const char* name = entry->d_name;
-
- // ignore "." and ".."
- if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) {
- continue;
- }
-
- int nameLength = strlen(name);
- if (nameLength > pathRemaining) {
- ALOGE("path %s/%s too long\n", path, name);
- continue;
- }
- strcpy(fileSpot, name);
-
- int type = entry->d_type;
- if (entry->d_type == DT_DIR) {
- deleteRecursive(pathbuf);
- rmdir(pathbuf);
- } else {
- unlink(pathbuf);
- }
- }
- closedir(dir);
-}
-
-static void deletePath(const char* path) {
- struct stat statbuf;
- if (stat(path, &statbuf) == 0) {
- if (S_ISDIR(statbuf.st_mode)) {
- deleteRecursive(path);
- rmdir(path);
- } else {
- unlink(path);
- }
- } else {
- ALOGE("deletePath stat failed for %s: %s", path, strerror(errno));
- }
-}
-
-MtpResponseCode MtpServer::doDeleteObject() {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
- MtpObjectFormat format = mRequest.getParameter(2);
- // FIXME - support deleting all objects if handle is 0xFFFFFFFF
- // FIXME - implement deleting objects by format
-
- MtpString filePath;
- int64_t fileLength;
- int result = mDatabase->getObjectFilePath(handle, filePath, fileLength, format);
- if (result == MTP_RESPONSE_OK) {
- ALOGV("deleting %s", (const char *)filePath);
- result = mDatabase->deleteFile(handle);
- // Don't delete the actual files unless the database deletion is allowed
- if (result == MTP_RESPONSE_OK) {
- deletePath((const char *)filePath);
- }
- }
-
- return result;
-}
-
-MtpResponseCode MtpServer::doGetObjectPropDesc() {
- MtpObjectProperty propCode = mRequest.getParameter(1);
- MtpObjectFormat format = mRequest.getParameter(2);
- ALOGV("GetObjectPropDesc %s %s\n", MtpDebug::getObjectPropCodeName(propCode),
- MtpDebug::getFormatCodeName(format));
- MtpProperty* property = mDatabase->getObjectPropertyDesc(propCode, format);
- if (!property)
- return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
- property->write(mData);
- delete property;
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doGetDevicePropDesc() {
- MtpDeviceProperty propCode = mRequest.getParameter(1);
- ALOGV("GetDevicePropDesc %s\n", MtpDebug::getDevicePropCodeName(propCode));
- MtpProperty* property = mDatabase->getDevicePropertyDesc(propCode);
- if (!property)
- return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED;
- property->write(mData);
- delete property;
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doSendPartialObject() {
- if (!hasStorage())
- return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
- MtpObjectHandle handle = mRequest.getParameter(1);
- uint64_t offset = mRequest.getParameter(2);
- uint64_t offset2 = mRequest.getParameter(3);
- offset = offset | (offset2 << 32);
- uint32_t length = mRequest.getParameter(4);
-
- ObjectEdit* edit = getEditObject(handle);
- if (!edit) {
- ALOGE("object not open for edit in doSendPartialObject");
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- // can't start writing past the end of the file
- if (offset > edit->mSize) {
- ALOGD("writing past end of object, offset: %lld, edit->mSize: %lld", offset, edit->mSize);
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- const char* filePath = (const char *)edit->mPath;
- ALOGV("receiving partial %s %lld %lld\n", filePath, offset, length);
-
- // read the header, and possibly some data
- int ret = mData.read(mFD);
- if (ret < MTP_CONTAINER_HEADER_SIZE)
- return MTP_RESPONSE_GENERAL_ERROR;
- int initialData = ret - MTP_CONTAINER_HEADER_SIZE;
-
- if (initialData > 0) {
- ret = write(edit->mFD, mData.getData(), initialData);
- offset += initialData;
- length -= initialData;
- }
-
- if (length > 0) {
- mtp_file_range mfr;
- mfr.fd = edit->mFD;
- mfr.offset = offset;
- mfr.length = length;
-
- // transfer the file
- ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
- ALOGV("MTP_RECEIVE_FILE returned %d", ret);
- }
- if (ret < 0) {
- mResponse.setParameter(1, 0);
- if (errno == ECANCELED)
- return MTP_RESPONSE_TRANSACTION_CANCELLED;
- else
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- // reset so we don't attempt to send this back
- mData.reset();
- mResponse.setParameter(1, length);
- uint64_t end = offset + length;
- if (end > edit->mSize) {
- edit->mSize = end;
- }
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doTruncateObject() {
- MtpObjectHandle handle = mRequest.getParameter(1);
- ObjectEdit* edit = getEditObject(handle);
- if (!edit) {
- ALOGE("object not open for edit in doTruncateObject");
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- uint64_t offset = mRequest.getParameter(2);
- uint64_t offset2 = mRequest.getParameter(3);
- offset |= (offset2 << 32);
- if (ftruncate(edit->mFD, offset) != 0) {
- return MTP_RESPONSE_GENERAL_ERROR;
- } else {
- edit->mSize = offset;
- return MTP_RESPONSE_OK;
- }
-}
-
-MtpResponseCode MtpServer::doBeginEditObject() {
- MtpObjectHandle handle = mRequest.getParameter(1);
- if (getEditObject(handle)) {
- ALOGE("object already open for edit in doBeginEditObject");
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- MtpString path;
- int64_t fileLength;
- MtpObjectFormat format;
- int result = mDatabase->getObjectFilePath(handle, path, fileLength, format);
- if (result != MTP_RESPONSE_OK)
- return result;
-
- int fd = open((const char *)path, O_RDWR | O_EXCL);
- if (fd < 0) {
- ALOGE("open failed for %s in doBeginEditObject (%d)", (const char *)path, errno);
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- addEditObject(handle, path, fileLength, format, fd);
- return MTP_RESPONSE_OK;
-}
-
-MtpResponseCode MtpServer::doEndEditObject() {
- MtpObjectHandle handle = mRequest.getParameter(1);
- ObjectEdit* edit = getEditObject(handle);
- if (!edit) {
- ALOGE("object not open for edit in doEndEditObject");
- return MTP_RESPONSE_GENERAL_ERROR;
- }
-
- commitEdit(edit);
- removeEditObject(handle);
- return MTP_RESPONSE_OK;
-}
-
-} // namespace android
diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h
deleted file mode 100644
index dfa8258..0000000
--- a/media/mtp/MtpServer.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_SERVER_H
-#define _MTP_SERVER_H
-
-#include "MtpRequestPacket.h"
-#include "MtpDataPacket.h"
-#include "MtpResponsePacket.h"
-#include "MtpEventPacket.h"
-#include "mtp.h"
-#include "MtpUtils.h"
-
-#include <utils/threads.h>
-
-namespace android {
-
-class MtpDatabase;
-class MtpStorage;
-
-class MtpServer {
-
-private:
- // file descriptor for MTP kernel driver
- int mFD;
-
- MtpDatabase* mDatabase;
-
- // appear as a PTP device
- bool mPtp;
-
- // group to own new files and folders
- int mFileGroup;
- // permissions for new files and directories
- int mFilePermission;
- int mDirectoryPermission;
-
- // current session ID
- MtpSessionID mSessionID;
- // true if we have an open session and mSessionID is valid
- bool mSessionOpen;
-
- MtpRequestPacket mRequest;
- MtpDataPacket mData;
- MtpResponsePacket mResponse;
- MtpEventPacket mEvent;
-
- MtpStorageList mStorages;
-
- // handle for new object, set by SendObjectInfo and used by SendObject
- MtpObjectHandle mSendObjectHandle;
- MtpObjectFormat mSendObjectFormat;
- MtpString mSendObjectFilePath;
- size_t mSendObjectFileSize;
-
- Mutex mMutex;
-
- // represents an MTP object that is being edited using the android extensions
- // for direct editing (BeginEditObject, SendPartialObject, TruncateObject and EndEditObject)
- class ObjectEdit {
- public:
- MtpObjectHandle mHandle;
- MtpString mPath;
- uint64_t mSize;
- MtpObjectFormat mFormat;
- int mFD;
-
- ObjectEdit(MtpObjectHandle handle, const char* path, uint64_t size,
- MtpObjectFormat format, int fd)
- : mHandle(handle), mPath(path), mSize(size), mFormat(format), mFD(fd) {
- }
-
- virtual ~ObjectEdit() {
- close(mFD);
- }
- };
- Vector<ObjectEdit*> mObjectEditList;
-
-public:
- MtpServer(int fd, MtpDatabase* database, bool ptp,
- int fileGroup, int filePerm, int directoryPerm);
- virtual ~MtpServer();
-
- MtpStorage* getStorage(MtpStorageID id);
- inline bool hasStorage() { return mStorages.size() > 0; }
- bool hasStorage(MtpStorageID id);
- void addStorage(MtpStorage* storage);
- void removeStorage(MtpStorage* storage);
-
- void run();
-
- void sendObjectAdded(MtpObjectHandle handle);
- void sendObjectRemoved(MtpObjectHandle handle);
-
-private:
- void sendStoreAdded(MtpStorageID id);
- void sendStoreRemoved(MtpStorageID id);
- void sendEvent(MtpEventCode code, uint32_t param1);
-
- void addEditObject(MtpObjectHandle handle, MtpString& path,
- uint64_t size, MtpObjectFormat format, int fd);
- ObjectEdit* getEditObject(MtpObjectHandle handle);
- void removeEditObject(MtpObjectHandle handle);
- void commitEdit(ObjectEdit* edit);
-
- bool handleRequest();
-
- MtpResponseCode doGetDeviceInfo();
- MtpResponseCode doOpenSession();
- MtpResponseCode doCloseSession();
- MtpResponseCode doGetStorageIDs();
- MtpResponseCode doGetStorageInfo();
- MtpResponseCode doGetObjectPropsSupported();
- MtpResponseCode doGetObjectHandles();
- MtpResponseCode doGetNumObjects();
- MtpResponseCode doGetObjectReferences();
- MtpResponseCode doSetObjectReferences();
- MtpResponseCode doGetObjectPropValue();
- MtpResponseCode doSetObjectPropValue();
- MtpResponseCode doGetDevicePropValue();
- MtpResponseCode doSetDevicePropValue();
- MtpResponseCode doResetDevicePropValue();
- MtpResponseCode doGetObjectPropList();
- MtpResponseCode doGetObjectInfo();
- MtpResponseCode doGetObject();
- MtpResponseCode doGetThumb();
- MtpResponseCode doGetPartialObject(MtpOperationCode operation);
- MtpResponseCode doSendObjectInfo();
- MtpResponseCode doSendObject();
- MtpResponseCode doDeleteObject();
- MtpResponseCode doGetObjectPropDesc();
- MtpResponseCode doGetDevicePropDesc();
- MtpResponseCode doSendPartialObject();
- MtpResponseCode doTruncateObject();
- MtpResponseCode doBeginEditObject();
- MtpResponseCode doEndEditObject();
-};
-
-}; // namespace android
-
-#endif // _MTP_SERVER_H
diff --git a/media/mtp/MtpStorage.cpp b/media/mtp/MtpStorage.cpp
deleted file mode 100644
index d77ca72..0000000
--- a/media/mtp/MtpStorage.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpStorage"
-
-#include "MtpDebug.h"
-#include "MtpDatabase.h"
-#include "MtpStorage.h"
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/statfs.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include <limits.h>
-
-namespace android {
-
-MtpStorage::MtpStorage(MtpStorageID id, const char* filePath,
- const char* description, uint64_t reserveSpace,
- bool removable, uint64_t maxFileSize)
- : mStorageID(id),
- mFilePath(filePath),
- mDescription(description),
- mMaxCapacity(0),
- mMaxFileSize(maxFileSize),
- mReserveSpace(reserveSpace),
- mRemovable(removable)
-{
- ALOGV("MtpStorage id: %d path: %s\n", id, filePath);
-}
-
-MtpStorage::~MtpStorage() {
-}
-
-int MtpStorage::getType() const {
- return (mRemovable ? MTP_STORAGE_REMOVABLE_RAM : MTP_STORAGE_FIXED_RAM);
-}
-
-int MtpStorage::getFileSystemType() const {
- return MTP_STORAGE_FILESYSTEM_HIERARCHICAL;
-}
-
-int MtpStorage::getAccessCapability() const {
- return MTP_STORAGE_READ_WRITE;
-}
-
-uint64_t MtpStorage::getMaxCapacity() {
- if (mMaxCapacity == 0) {
- struct statfs stat;
- if (statfs(getPath(), &stat))
- return -1;
- mMaxCapacity = (uint64_t)stat.f_blocks * (uint64_t)stat.f_bsize;
- }
- return mMaxCapacity;
-}
-
-uint64_t MtpStorage::getFreeSpace() {
- struct statfs stat;
- if (statfs(getPath(), &stat))
- return -1;
- uint64_t freeSpace = (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
- return (freeSpace > mReserveSpace ? freeSpace - mReserveSpace : 0);
-}
-
-const char* MtpStorage::getDescription() const {
- return (const char *)mDescription;
-}
-
-} // namespace android
diff --git a/media/mtp/MtpStorage.h b/media/mtp/MtpStorage.h
deleted file mode 100644
index e5a2e57..0000000
--- a/media/mtp/MtpStorage.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_STORAGE_H
-#define _MTP_STORAGE_H
-
-#include "MtpTypes.h"
-#include "mtp.h"
-
-namespace android {
-
-class MtpDatabase;
-
-class MtpStorage {
-
-private:
- MtpStorageID mStorageID;
- MtpString mFilePath;
- MtpString mDescription;
- uint64_t mMaxCapacity;
- uint64_t mMaxFileSize;
- // amount of free space to leave unallocated
- uint64_t mReserveSpace;
- bool mRemovable;
-
-public:
- MtpStorage(MtpStorageID id, const char* filePath,
- const char* description, uint64_t reserveSpace,
- bool removable, uint64_t maxFileSize);
- virtual ~MtpStorage();
-
- inline MtpStorageID getStorageID() const { return mStorageID; }
- int getType() const;
- int getFileSystemType() const;
- int getAccessCapability() const;
- uint64_t getMaxCapacity();
- uint64_t getFreeSpace();
- const char* getDescription() const;
- inline const char* getPath() const { return (const char *)mFilePath; }
- inline bool isRemovable() const { return mRemovable; }
- inline uint64_t getMaxFileSize() const { return mMaxFileSize; }
-};
-
-}; // namespace android
-
-#endif // _MTP_STORAGE_H
diff --git a/media/mtp/MtpStorageInfo.cpp b/media/mtp/MtpStorageInfo.cpp
deleted file mode 100644
index dcd37cd..0000000
--- a/media/mtp/MtpStorageInfo.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpStorageInfo"
-
-#include "MtpDebug.h"
-#include "MtpDataPacket.h"
-#include "MtpStorageInfo.h"
-#include "MtpStringBuffer.h"
-
-namespace android {
-
-MtpStorageInfo::MtpStorageInfo(MtpStorageID id)
- : mStorageID(id),
- mStorageType(0),
- mFileSystemType(0),
- mAccessCapability(0),
- mMaxCapacity(0),
- mFreeSpaceBytes(0),
- mFreeSpaceObjects(0),
- mStorageDescription(NULL),
- mVolumeIdentifier(NULL)
-{
-}
-
-MtpStorageInfo::~MtpStorageInfo() {
- if (mStorageDescription)
- free(mStorageDescription);
- if (mVolumeIdentifier)
- free(mVolumeIdentifier);
-}
-
-void MtpStorageInfo::read(MtpDataPacket& packet) {
- MtpStringBuffer string;
-
- // read the device info
- mStorageType = packet.getUInt16();
- mFileSystemType = packet.getUInt16();
- mAccessCapability = packet.getUInt16();
- mMaxCapacity = packet.getUInt64();
- mFreeSpaceBytes = packet.getUInt64();
- mFreeSpaceObjects = packet.getUInt32();
-
- packet.getString(string);
- mStorageDescription = strdup((const char *)string);
- packet.getString(string);
- mVolumeIdentifier = strdup((const char *)string);
-}
-
-void MtpStorageInfo::print() {
- ALOGD("Storage Info %08X:\n\tmStorageType: %d\n\tmFileSystemType: %d\n\tmAccessCapability: %d\n",
- mStorageID, mStorageType, mFileSystemType, mAccessCapability);
- ALOGD("\tmMaxCapacity: %lld\n\tmFreeSpaceBytes: %lld\n\tmFreeSpaceObjects: %d\n",
- mMaxCapacity, mFreeSpaceBytes, mFreeSpaceObjects);
- ALOGD("\tmStorageDescription: %s\n\tmVolumeIdentifier: %s\n",
- mStorageDescription, mVolumeIdentifier);
-}
-
-} // namespace android
diff --git a/media/mtp/MtpStorageInfo.h b/media/mtp/MtpStorageInfo.h
deleted file mode 100644
index 2cb626e..0000000
--- a/media/mtp/MtpStorageInfo.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_STORAGE_INFO_H
-#define _MTP_STORAGE_INFO_H
-
-#include "MtpTypes.h"
-
-namespace android {
-
-class MtpDataPacket;
-
-class MtpStorageInfo {
-public:
- MtpStorageID mStorageID;
- uint16_t mStorageType;
- uint16_t mFileSystemType;
- uint16_t mAccessCapability;
- uint64_t mMaxCapacity;
- uint64_t mFreeSpaceBytes;
- uint32_t mFreeSpaceObjects;
- char* mStorageDescription;
- char* mVolumeIdentifier;
-
-public:
- MtpStorageInfo(MtpStorageID id);
- virtual ~MtpStorageInfo();
-
- void read(MtpDataPacket& packet);
-
- void print();
-};
-
-}; // namespace android
-
-#endif // _MTP_STORAGE_INFO_H
diff --git a/media/mtp/MtpStringBuffer.cpp b/media/mtp/MtpStringBuffer.cpp
deleted file mode 100644
index fe8cf04..0000000
--- a/media/mtp/MtpStringBuffer.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpStringBuffer"
-
-#include <string.h>
-
-#include "MtpDataPacket.h"
-#include "MtpStringBuffer.h"
-
-namespace android {
-
-MtpStringBuffer::MtpStringBuffer()
- : mCharCount(0),
- mByteCount(1)
-{
- mBuffer[0] = 0;
-}
-
-MtpStringBuffer::MtpStringBuffer(const char* src)
- : mCharCount(0),
- mByteCount(1)
-{
- set(src);
-}
-
-MtpStringBuffer::MtpStringBuffer(const uint16_t* src)
- : mCharCount(0),
- mByteCount(1)
-{
- set(src);
-}
-
-MtpStringBuffer::MtpStringBuffer(const MtpStringBuffer& src)
- : mCharCount(src.mCharCount),
- mByteCount(src.mByteCount)
-{
- memcpy(mBuffer, src.mBuffer, mByteCount);
-}
-
-
-MtpStringBuffer::~MtpStringBuffer() {
-}
-
-void MtpStringBuffer::set(const char* src) {
- int length = strlen(src);
- if (length >= sizeof(mBuffer))
- length = sizeof(mBuffer) - 1;
- memcpy(mBuffer, src, length);
-
- // count the characters
- int count = 0;
- char ch;
- while ((ch = *src++) != 0) {
- if ((ch & 0x80) == 0) {
- // single byte character
- } else if ((ch & 0xE0) == 0xC0) {
- // two byte character
- if (! *src++) {
- // last character was truncated, so ignore last byte
- length--;
- break;
- }
- } else if ((ch & 0xF0) == 0xE0) {
- // 3 byte char
- if (! *src++) {
- // last character was truncated, so ignore last byte
- length--;
- break;
- }
- if (! *src++) {
- // last character was truncated, so ignore last two bytes
- length -= 2;
- break;
- }
- }
- count++;
- }
-
- mByteCount = length + 1;
- mBuffer[length] = 0;
- mCharCount = count;
-}
-
-void MtpStringBuffer::set(const uint16_t* src) {
- int count = 0;
- uint16_t ch;
- uint8_t* dest = mBuffer;
-
- while ((ch = *src++) != 0 && count < 255) {
- if (ch >= 0x0800) {
- *dest++ = (uint8_t)(0xE0 | (ch >> 12));
- *dest++ = (uint8_t)(0x80 | ((ch >> 6) & 0x3F));
- *dest++ = (uint8_t)(0x80 | (ch & 0x3F));
- } else if (ch >= 0x80) {
- *dest++ = (uint8_t)(0xC0 | (ch >> 6));
- *dest++ = (uint8_t)(0x80 | (ch & 0x3F));
- } else {
- *dest++ = ch;
- }
- count++;
- }
- *dest++ = 0;
- mCharCount = count;
- mByteCount = dest - mBuffer;
-}
-
-void MtpStringBuffer::readFromPacket(MtpDataPacket* packet) {
- int count = packet->getUInt8();
- uint8_t* dest = mBuffer;
- for (int i = 0; i < count; i++) {
- uint16_t ch = packet->getUInt16();
- if (ch >= 0x0800) {
- *dest++ = (uint8_t)(0xE0 | (ch >> 12));
- *dest++ = (uint8_t)(0x80 | ((ch >> 6) & 0x3F));
- *dest++ = (uint8_t)(0x80 | (ch & 0x3F));
- } else if (ch >= 0x80) {
- *dest++ = (uint8_t)(0xC0 | (ch >> 6));
- *dest++ = (uint8_t)(0x80 | (ch & 0x3F));
- } else {
- *dest++ = ch;
- }
- }
- *dest++ = 0;
- mCharCount = count;
- mByteCount = dest - mBuffer;
-}
-
-void MtpStringBuffer::writeToPacket(MtpDataPacket* packet) const {
- int count = mCharCount;
- const uint8_t* src = mBuffer;
- packet->putUInt8(count > 0 ? count + 1 : 0);
-
- // expand utf8 to 16 bit chars
- for (int i = 0; i < count; i++) {
- uint16_t ch;
- uint16_t ch1 = *src++;
- if ((ch1 & 0x80) == 0) {
- // single byte character
- ch = ch1;
- } else if ((ch1 & 0xE0) == 0xC0) {
- // two byte character
- uint16_t ch2 = *src++;
- ch = ((ch1 & 0x1F) << 6) | (ch2 & 0x3F);
- } else {
- // three byte character
- uint16_t ch2 = *src++;
- uint16_t ch3 = *src++;
- ch = ((ch1 & 0x0F) << 12) | ((ch2 & 0x3F) << 6) | (ch3 & 0x3F);
- }
- packet->putUInt16(ch);
- }
- // only terminate with zero if string is not empty
- if (count > 0)
- packet->putUInt16(0);
-}
-
-} // namespace android
diff --git a/media/mtp/MtpStringBuffer.h b/media/mtp/MtpStringBuffer.h
deleted file mode 100644
index cbc8307..0000000
--- a/media/mtp/MtpStringBuffer.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_STRING_BUFFER_H
-#define _MTP_STRING_BUFFER_H
-
-#include <stdint.h>
-
-namespace android {
-
-class MtpDataPacket;
-
-// Represents a utf8 string, with a maximum of 255 characters
-class MtpStringBuffer {
-
-private:
- // mBuffer contains string in UTF8 format
- // maximum 3 bytes/character, with 1 extra for zero termination
- uint8_t mBuffer[255 * 3 + 1];
- int mCharCount;
- int mByteCount;
-
-public:
- MtpStringBuffer();
- MtpStringBuffer(const char* src);
- MtpStringBuffer(const uint16_t* src);
- MtpStringBuffer(const MtpStringBuffer& src);
- virtual ~MtpStringBuffer();
-
- void set(const char* src);
- void set(const uint16_t* src);
-
- void readFromPacket(MtpDataPacket* packet);
- void writeToPacket(MtpDataPacket* packet) const;
-
- inline int getCharCount() const { return mCharCount; }
- inline int getByteCount() const { return mByteCount; }
-
- inline operator const char*() const { return (const char *)mBuffer; }
-};
-
-}; // namespace android
-
-#endif // _MTP_STRING_BUFFER_H
diff --git a/media/mtp/MtpTypes.h b/media/mtp/MtpTypes.h
deleted file mode 100644
index 720c854..0000000
--- a/media/mtp/MtpTypes.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_TYPES_H
-#define _MTP_TYPES_H
-
-#include <stdint.h>
-#include "utils/String8.h"
-#include "utils/Vector.h"
-
-namespace android {
-
-typedef int32_t int128_t[4];
-typedef uint32_t uint128_t[4];
-
-typedef uint16_t MtpOperationCode;
-typedef uint16_t MtpResponseCode;
-typedef uint16_t MtpEventCode;
-typedef uint32_t MtpSessionID;
-typedef uint32_t MtpStorageID;
-typedef uint32_t MtpTransactionID;
-typedef uint16_t MtpPropertyCode;
-typedef uint16_t MtpDataType;
-typedef uint16_t MtpObjectFormat;
-typedef MtpPropertyCode MtpDeviceProperty;
-typedef MtpPropertyCode MtpObjectProperty;
-
-// object handles are unique across all storage but only within a single session.
-// object handles cannot be reused after an object is deleted.
-// values 0x00000000 and 0xFFFFFFFF are reserved for special purposes.
-typedef uint32_t MtpObjectHandle;
-
-// Special values
-#define MTP_PARENT_ROOT 0xFFFFFFFF // parent is root of the storage
-#define kInvalidObjectHandle 0xFFFFFFFF
-
-class MtpStorage;
-class MtpDevice;
-class MtpProperty;
-
-typedef Vector<MtpStorage *> MtpStorageList;
-typedef Vector<MtpDevice*> MtpDeviceList;
-typedef Vector<MtpProperty*> MtpPropertyList;
-
-typedef Vector<uint8_t> UInt8List;
-typedef Vector<uint16_t> UInt16List;
-typedef Vector<uint32_t> UInt32List;
-typedef Vector<uint64_t> UInt64List;
-typedef Vector<int8_t> Int8List;
-typedef Vector<int16_t> Int16List;
-typedef Vector<int32_t> Int32List;
-typedef Vector<int64_t> Int64List;
-
-typedef UInt16List MtpObjectPropertyList;
-typedef UInt16List MtpDevicePropertyList;
-typedef UInt16List MtpObjectFormatList;
-typedef UInt32List MtpObjectHandleList;
-typedef UInt16List MtpObjectPropertyList;
-typedef UInt32List MtpStorageIDList;
-
-typedef String8 MtpString;
-
-}; // namespace android
-
-#endif // _MTP_TYPES_H
diff --git a/media/mtp/MtpUtils.cpp b/media/mtp/MtpUtils.cpp
deleted file mode 100644
index 6ec8876..0000000
--- a/media/mtp/MtpUtils.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "MtpUtils"
-
-#include <stdio.h>
-#include <time.h>
-
-#include <cutils/tztime.h>
-#include "MtpUtils.h"
-
-namespace android {
-
-/*
-DateTime strings follow a compatible subset of the definition found in ISO 8601, and
-take the form of a Unicode string formatted as: "YYYYMMDDThhmmss.s". In this
-representation, YYYY shall be replaced by the year, MM replaced by the month (01-12),
-DD replaced by the day (01-31), T is a constant character 'T' delimiting time from date,
-hh is replaced by the hour (00-23), mm is replaced by the minute (00-59), and ss by the
-second (00-59). The ".s" is optional, and represents tenths of a second.
-*/
-
-bool parseDateTime(const char* dateTime, time_t& outSeconds) {
- int year, month, day, hour, minute, second;
- struct tm tm;
-
- if (sscanf(dateTime, "%04d%02d%02dT%02d%02d%02d",
- &year, &month, &day, &hour, &minute, &second) != 6)
- return false;
- const char* tail = dateTime + 15;
- // skip optional tenth of second
- if (tail[0] == '.' && tail[1])
- tail += 2;
- //FIXME - support +/-hhmm
- bool useUTC = (tail[0] == 'Z');
-
- // hack to compute timezone
- time_t dummy;
- localtime_r(&dummy, &tm);
-
- tm.tm_sec = second;
- tm.tm_min = minute;
- tm.tm_hour = hour;
- tm.tm_mday = day;
- tm.tm_mon = month - 1; // mktime uses months in 0 - 11 range
- tm.tm_year = year - 1900;
- tm.tm_wday = 0;
- tm.tm_isdst = -1;
- if (useUTC)
- outSeconds = mktime(&tm);
- else
- outSeconds = mktime_tz(&tm, tm.tm_zone);
-
- return true;
-}
-
-void formatDateTime(time_t seconds, char* buffer, int bufferLength) {
- struct tm tm;
-
- localtime_r(&seconds, &tm);
- snprintf(buffer, bufferLength, "%04d%02d%02dT%02d%02d%02d",
- tm.tm_year + 1900,
- tm.tm_mon + 1, // localtime_r uses months in 0 - 11 range
- tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
-}
-
-} // namespace android
diff --git a/media/mtp/MtpUtils.h b/media/mtp/MtpUtils.h
deleted file mode 100644
index 61f9055..0000000
--- a/media/mtp/MtpUtils.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_UTILS_H
-#define _MTP_UTILS_H
-
-#include <stdint.h>
-
-namespace android {
-
-bool parseDateTime(const char* dateTime, time_t& outSeconds);
-void formatDateTime(time_t seconds, char* buffer, int bufferLength);
-
-}; // namespace android
-
-#endif // _MTP_UTILS_H
diff --git a/media/mtp/mtp.h b/media/mtp/mtp.h
deleted file mode 100644
index d270df5..0000000
--- a/media/mtp/mtp.h
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _MTP_H
-#define _MTP_H
-
-#include <stdint.h>
-#include <stdlib.h>
-
-#define MTP_STANDARD_VERSION 100
-
-// Container Types
-#define MTP_CONTAINER_TYPE_UNDEFINED 0
-#define MTP_CONTAINER_TYPE_COMMAND 1
-#define MTP_CONTAINER_TYPE_DATA 2
-#define MTP_CONTAINER_TYPE_RESPONSE 3
-#define MTP_CONTAINER_TYPE_EVENT 4
-
-// Container Offsets
-#define MTP_CONTAINER_LENGTH_OFFSET 0
-#define MTP_CONTAINER_TYPE_OFFSET 4
-#define MTP_CONTAINER_CODE_OFFSET 6
-#define MTP_CONTAINER_TRANSACTION_ID_OFFSET 8
-#define MTP_CONTAINER_PARAMETER_OFFSET 12
-#define MTP_CONTAINER_HEADER_SIZE 12
-
-// MTP Data Types
-#define MTP_TYPE_UNDEFINED 0x0000 // Undefined
-#define MTP_TYPE_INT8 0x0001 // Signed 8-bit integer
-#define MTP_TYPE_UINT8 0x0002 // Unsigned 8-bit integer
-#define MTP_TYPE_INT16 0x0003 // Signed 16-bit integer
-#define MTP_TYPE_UINT16 0x0004 // Unsigned 16-bit integer
-#define MTP_TYPE_INT32 0x0005 // Signed 32-bit integer
-#define MTP_TYPE_UINT32 0x0006 // Unsigned 32-bit integer
-#define MTP_TYPE_INT64 0x0007 // Signed 64-bit integer
-#define MTP_TYPE_UINT64 0x0008 // Unsigned 64-bit integer
-#define MTP_TYPE_INT128 0x0009 // Signed 128-bit integer
-#define MTP_TYPE_UINT128 0x000A // Unsigned 128-bit integer
-#define MTP_TYPE_AINT8 0x4001 // Array of signed 8-bit integers
-#define MTP_TYPE_AUINT8 0x4002 // Array of unsigned 8-bit integers
-#define MTP_TYPE_AINT16 0x4003 // Array of signed 16-bit integers
-#define MTP_TYPE_AUINT16 0x4004 // Array of unsigned 16-bit integers
-#define MTP_TYPE_AINT32 0x4005 // Array of signed 32-bit integers
-#define MTP_TYPE_AUINT32 0x4006 // Array of unsigned 32-bit integers
-#define MTP_TYPE_AINT64 0x4007 // Array of signed 64-bit integers
-#define MTP_TYPE_AUINT64 0x4008 // Array of unsigned 64-bit integers
-#define MTP_TYPE_AINT128 0x4009 // Array of signed 128-bit integers
-#define MTP_TYPE_AUINT128 0x400A // Array of unsigned 128-bit integers
-#define MTP_TYPE_STR 0xFFFF // Variable-length Unicode string
-
-// MTP Format Codes
-#define MTP_FORMAT_UNDEFINED 0x3000 // Undefined object
-#define MTP_FORMAT_ASSOCIATION 0x3001 // Association (for example, a folder)
-#define MTP_FORMAT_SCRIPT 0x3002 // Device model-specific script
-#define MTP_FORMAT_EXECUTABLE 0x3003 // Device model-specific binary executable
-#define MTP_FORMAT_TEXT 0x3004 // Text file
-#define MTP_FORMAT_HTML 0x3005 // Hypertext Markup Language file (text)
-#define MTP_FORMAT_DPOF 0x3006 // Digital Print Order Format file (text)
-#define MTP_FORMAT_AIFF 0x3007 // Audio clip
-#define MTP_FORMAT_WAV 0x3008 // Audio clip
-#define MTP_FORMAT_MP3 0x3009 // Audio clip
-#define MTP_FORMAT_AVI 0x300A // Video clip
-#define MTP_FORMAT_MPEG 0x300B // Video clip
-#define MTP_FORMAT_ASF 0x300C // Microsoft Advanced Streaming Format (video)
-#define MTP_FORMAT_DEFINED 0x3800 // Unknown image object
-#define MTP_FORMAT_EXIF_JPEG 0x3801 // Exchangeable File Format, JEIDA standard
-#define MTP_FORMAT_TIFF_EP 0x3802 // Tag Image File Format for Electronic Photography
-#define MTP_FORMAT_FLASHPIX 0x3803 // Structured Storage Image Format
-#define MTP_FORMAT_BMP 0x3804 // Microsoft Windows Bitmap file
-#define MTP_FORMAT_CIFF 0x3805 // Canon Camera Image File Format
-#define MTP_FORMAT_GIF 0x3807 // Graphics Interchange Format
-#define MTP_FORMAT_JFIF 0x3808 // JPEG File Interchange Format
-#define MTP_FORMAT_CD 0x3809 // PhotoCD Image Pac
-#define MTP_FORMAT_PICT 0x380A // Quickdraw Image Format
-#define MTP_FORMAT_PNG 0x380B // Portable Network Graphics
-#define MTP_FORMAT_TIFF 0x380D // Tag Image File Format
-#define MTP_FORMAT_TIFF_IT 0x380E // Tag Image File Format for Information Technology (graphic arts)
-#define MTP_FORMAT_JP2 0x380F // JPEG2000 Baseline File Format
-#define MTP_FORMAT_JPX 0x3810 // JPEG2000 Extended File Format
-#define MTP_FORMAT_UNDEFINED_FIRMWARE 0xB802
-#define MTP_FORMAT_WINDOWS_IMAGE_FORMAT 0xB881
-#define MTP_FORMAT_UNDEFINED_AUDIO 0xB900
-#define MTP_FORMAT_WMA 0xB901
-#define MTP_FORMAT_OGG 0xB902
-#define MTP_FORMAT_AAC 0xB903
-#define MTP_FORMAT_AUDIBLE 0xB904
-#define MTP_FORMAT_FLAC 0xB906
-#define MTP_FORMAT_UNDEFINED_VIDEO 0xB980
-#define MTP_FORMAT_WMV 0xB981
-#define MTP_FORMAT_MP4_CONTAINER 0xB982 // ISO 14496-1
-#define MTP_FORMAT_MP2 0xB983
-#define MTP_FORMAT_3GP_CONTAINER 0xB984 // 3GPP file format. Details: http://www.3gpp.org/ftp/Specs/html-info/26244.htm (page title - \u201cTransparent end-to-end packet switched streaming service, 3GPP file format\u201d).
-#define MTP_FORMAT_UNDEFINED_COLLECTION 0xBA00
-#define MTP_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM 0xBA01
-#define MTP_FORMAT_ABSTRACT_IMAGE_ALBUM 0xBA02
-#define MTP_FORMAT_ABSTRACT_AUDIO_ALBUM 0xBA03
-#define MTP_FORMAT_ABSTRACT_VIDEO_ALBUM 0xBA04
-#define MTP_FORMAT_ABSTRACT_AV_PLAYLIST 0xBA05
-#define MTP_FORMAT_ABSTRACT_CONTACT_GROUP 0xBA06
-#define MTP_FORMAT_ABSTRACT_MESSAGE_FOLDER 0xBA07
-#define MTP_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION 0xBA08
-#define MTP_FORMAT_ABSTRACT_AUDIO_PLAYLIST 0xBA09
-#define MTP_FORMAT_ABSTRACT_VIDEO_PLAYLIST 0xBA0A
-#define MTP_FORMAT_ABSTRACT_MEDIACAST 0xBA0B // For use with mediacasts; references multimedia enclosures of RSS feeds or episodic content
-#define MTP_FORMAT_WPL_PLAYLIST 0xBA10
-#define MTP_FORMAT_M3U_PLAYLIST 0xBA11
-#define MTP_FORMAT_MPL_PLAYLIST 0xBA12
-#define MTP_FORMAT_ASX_PLAYLIST 0xBA13
-#define MTP_FORMAT_PLS_PLAYLIST 0xBA14
-#define MTP_FORMAT_UNDEFINED_DOCUMENT 0xBA80
-#define MTP_FORMAT_ABSTRACT_DOCUMENT 0xBA81
-#define MTP_FORMAT_XML_DOCUMENT 0xBA82
-#define MTP_FORMAT_MS_WORD_DOCUMENT 0xBA83
-#define MTP_FORMAT_MHT_COMPILED_HTML_DOCUMENT 0xBA84
-#define MTP_FORMAT_MS_EXCEL_SPREADSHEET 0xBA85
-#define MTP_FORMAT_MS_POWERPOINT_PRESENTATION 0xBA86
-#define MTP_FORMAT_UNDEFINED_MESSAGE 0xBB00
-#define MTP_FORMAT_ABSTRACT_MESSSAGE 0xBB01
-#define MTP_FORMAT_UNDEFINED_CONTACT 0xBB80
-#define MTP_FORMAT_ABSTRACT_CONTACT 0xBB81
-#define MTP_FORMAT_VCARD_2 0xBB82
-
-// MTP Object Property Codes
-#define MTP_PROPERTY_STORAGE_ID 0xDC01
-#define MTP_PROPERTY_OBJECT_FORMAT 0xDC02
-#define MTP_PROPERTY_PROTECTION_STATUS 0xDC03
-#define MTP_PROPERTY_OBJECT_SIZE 0xDC04
-#define MTP_PROPERTY_ASSOCIATION_TYPE 0xDC05
-#define MTP_PROPERTY_ASSOCIATION_DESC 0xDC06
-#define MTP_PROPERTY_OBJECT_FILE_NAME 0xDC07
-#define MTP_PROPERTY_DATE_CREATED 0xDC08
-#define MTP_PROPERTY_DATE_MODIFIED 0xDC09
-#define MTP_PROPERTY_KEYWORDS 0xDC0A
-#define MTP_PROPERTY_PARENT_OBJECT 0xDC0B
-#define MTP_PROPERTY_ALLOWED_FOLDER_CONTENTS 0xDC0C
-#define MTP_PROPERTY_HIDDEN 0xDC0D
-#define MTP_PROPERTY_SYSTEM_OBJECT 0xDC0E
-#define MTP_PROPERTY_PERSISTENT_UID 0xDC41
-#define MTP_PROPERTY_SYNC_ID 0xDC42
-#define MTP_PROPERTY_PROPERTY_BAG 0xDC43
-#define MTP_PROPERTY_NAME 0xDC44
-#define MTP_PROPERTY_CREATED_BY 0xDC45
-#define MTP_PROPERTY_ARTIST 0xDC46
-#define MTP_PROPERTY_DATE_AUTHORED 0xDC47
-#define MTP_PROPERTY_DESCRIPTION 0xDC48
-#define MTP_PROPERTY_URL_REFERENCE 0xDC49
-#define MTP_PROPERTY_LANGUAGE_LOCALE 0xDC4A
-#define MTP_PROPERTY_COPYRIGHT_INFORMATION 0xDC4B
-#define MTP_PROPERTY_SOURCE 0xDC4C
-#define MTP_PROPERTY_ORIGIN_LOCATION 0xDC4D
-#define MTP_PROPERTY_DATE_ADDED 0xDC4E
-#define MTP_PROPERTY_NON_CONSUMABLE 0xDC4F
-#define MTP_PROPERTY_CORRUPT_UNPLAYABLE 0xDC50
-#define MTP_PROPERTY_PRODUCER_SERIAL_NUMBER 0xDC51
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_FORMAT 0xDC81
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_SIZE 0xDC82
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_HEIGHT 0xDC83
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_WIDTH 0xDC84
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DURATION 0xDC85
-#define MTP_PROPERTY_REPRESENTATIVE_SAMPLE_DATA 0xDC86
-#define MTP_PROPERTY_WIDTH 0xDC87
-#define MTP_PROPERTY_HEIGHT 0xDC88
-#define MTP_PROPERTY_DURATION 0xDC89
-#define MTP_PROPERTY_RATING 0xDC8A
-#define MTP_PROPERTY_TRACK 0xDC8B
-#define MTP_PROPERTY_GENRE 0xDC8C
-#define MTP_PROPERTY_CREDITS 0xDC8D
-#define MTP_PROPERTY_LYRICS 0xDC8E
-#define MTP_PROPERTY_SUBSCRIPTION_CONTENT_ID 0xDC8F
-#define MTP_PROPERTY_PRODUCED_BY 0xDC90
-#define MTP_PROPERTY_USE_COUNT 0xDC91
-#define MTP_PROPERTY_SKIP_COUNT 0xDC92
-#define MTP_PROPERTY_LAST_ACCESSED 0xDC93
-#define MTP_PROPERTY_PARENTAL_RATING 0xDC94
-#define MTP_PROPERTY_META_GENRE 0xDC95
-#define MTP_PROPERTY_COMPOSER 0xDC96
-#define MTP_PROPERTY_EFFECTIVE_RATING 0xDC97
-#define MTP_PROPERTY_SUBTITLE 0xDC98
-#define MTP_PROPERTY_ORIGINAL_RELEASE_DATE 0xDC99
-#define MTP_PROPERTY_ALBUM_NAME 0xDC9A
-#define MTP_PROPERTY_ALBUM_ARTIST 0xDC9B
-#define MTP_PROPERTY_MOOD 0xDC9C
-#define MTP_PROPERTY_DRM_STATUS 0xDC9D
-#define MTP_PROPERTY_SUB_DESCRIPTION 0xDC9E
-#define MTP_PROPERTY_IS_CROPPED 0xDCD1
-#define MTP_PROPERTY_IS_COLOUR_CORRECTED 0xDCD2
-#define MTP_PROPERTY_IMAGE_BIT_DEPTH 0xDCD3
-#define MTP_PROPERTY_F_NUMBER 0xDCD4
-#define MTP_PROPERTY_EXPOSURE_TIME 0xDCD5
-#define MTP_PROPERTY_EXPOSURE_INDEX 0xDCD6
-#define MTP_PROPERTY_TOTAL_BITRATE 0xDE91
-#define MTP_PROPERTY_BITRATE_TYPE 0xDE92
-#define MTP_PROPERTY_SAMPLE_RATE 0xDE93
-#define MTP_PROPERTY_NUMBER_OF_CHANNELS 0xDE94
-#define MTP_PROPERTY_AUDIO_BIT_DEPTH 0xDE95
-#define MTP_PROPERTY_SCAN_TYPE 0xDE97
-#define MTP_PROPERTY_AUDIO_WAVE_CODEC 0xDE99
-#define MTP_PROPERTY_AUDIO_BITRATE 0xDE9A
-#define MTP_PROPERTY_VIDEO_FOURCC_CODEC 0xDE9B
-#define MTP_PROPERTY_VIDEO_BITRATE 0xDE9C
-#define MTP_PROPERTY_FRAMES_PER_THOUSAND_SECONDS 0xDE9D
-#define MTP_PROPERTY_KEYFRAME_DISTANCE 0xDE9E
-#define MTP_PROPERTY_BUFFER_SIZE 0xDE9F
-#define MTP_PROPERTY_ENCODING_QUALITY 0xDEA0
-#define MTP_PROPERTY_ENCODING_PROFILE 0xDEA1
-#define MTP_PROPERTY_DISPLAY_NAME 0xDCE0
-#define MTP_PROPERTY_BODY_TEXT 0xDCE1
-#define MTP_PROPERTY_SUBJECT 0xDCE2
-#define MTP_PROPERTY_PRIORITY 0xDCE3
-#define MTP_PROPERTY_GIVEN_NAME 0xDD00
-#define MTP_PROPERTY_MIDDLE_NAMES 0xDD01
-#define MTP_PROPERTY_FAMILY_NAME 0xDD02
-#define MTP_PROPERTY_PREFIX 0xDD03
-#define MTP_PROPERTY_SUFFIX 0xDD04
-#define MTP_PROPERTY_PHONETIC_GIVEN_NAME 0xDD05
-#define MTP_PROPERTY_PHONETIC_FAMILY_NAME 0xDD06
-#define MTP_PROPERTY_EMAIL_PRIMARY 0xDD07
-#define MTP_PROPERTY_EMAIL_PERSONAL_1 0xDD08
-#define MTP_PROPERTY_EMAIL_PERSONAL_2 0xDD09
-#define MTP_PROPERTY_EMAIL_BUSINESS_1 0xDD0A
-#define MTP_PROPERTY_EMAIL_BUSINESS_2 0xDD0B
-#define MTP_PROPERTY_EMAIL_OTHERS 0xDD0C
-#define MTP_PROPERTY_PHONE_NUMBER_PRIMARY 0xDD0D
-#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL 0xDD0E
-#define MTP_PROPERTY_PHONE_NUMBER_PERSONAL_2 0xDD0F
-#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS 0xDD10
-#define MTP_PROPERTY_PHONE_NUMBER_BUSINESS_2 0xDD11
-#define MTP_PROPERTY_PHONE_NUMBER_MOBILE 0xDD12
-#define MTP_PROPERTY_PHONE_NUMBER_MOBILE_2 0xDD13
-#define MTP_PROPERTY_FAX_NUMBER_PRIMARY 0xDD14
-#define MTP_PROPERTY_FAX_NUMBER_PERSONAL 0xDD15
-#define MTP_PROPERTY_FAX_NUMBER_BUSINESS 0xDD16
-#define MTP_PROPERTY_PAGER_NUMBER 0xDD17
-#define MTP_PROPERTY_PHONE_NUMBER_OTHERS 0xDD18
-#define MTP_PROPERTY_PRIMARY_WEB_ADDRESS 0xDD19
-#define MTP_PROPERTY_PERSONAL_WEB_ADDRESS 0xDD1A
-#define MTP_PROPERTY_BUSINESS_WEB_ADDRESS 0xDD1B
-#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS 0xDD1C
-#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_2 0xDD1D
-#define MTP_PROPERTY_INSTANT_MESSANGER_ADDRESS_3 0xDD1E
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_FULL 0xDD1F
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_1 0xDD20
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_LINE_2 0xDD21
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_CITY 0xDD22
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_REGION 0xDD23
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE 0xDD24
-#define MTP_PROPERTY_POSTAL_ADDRESS_PERSONAL_COUNTRY 0xDD25
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_FULL 0xDD26
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_1 0xDD27
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_LINE_2 0xDD28
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_CITY 0xDD29
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_REGION 0xDD2A
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE 0xDD2B
-#define MTP_PROPERTY_POSTAL_ADDRESS_BUSINESS_COUNTRY 0xDD2C
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_FULL 0xDD2D
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_1 0xDD2E
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_LINE_2 0xDD2F
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_CITY 0xDD30
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_REGION 0xDD31
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_POSTAL_CODE 0xDD32
-#define MTP_PROPERTY_POSTAL_ADDRESS_OTHER_COUNTRY 0xDD33
-#define MTP_PROPERTY_ORGANIZATION_NAME 0xDD34
-#define MTP_PROPERTY_PHONETIC_ORGANIZATION_NAME 0xDD35
-#define MTP_PROPERTY_ROLE 0xDD36
-#define MTP_PROPERTY_BIRTHDATE 0xDD37
-#define MTP_PROPERTY_MESSAGE_TO 0xDD40
-#define MTP_PROPERTY_MESSAGE_CC 0xDD41
-#define MTP_PROPERTY_MESSAGE_BCC 0xDD42
-#define MTP_PROPERTY_MESSAGE_READ 0xDD43
-#define MTP_PROPERTY_MESSAGE_RECEIVED_TIME 0xDD44
-#define MTP_PROPERTY_MESSAGE_SENDER 0xDD45
-#define MTP_PROPERTY_ACTIVITY_BEGIN_TIME 0xDD50
-#define MTP_PROPERTY_ACTIVITY_END_TIME 0xDD51
-#define MTP_PROPERTY_ACTIVITY_LOCATION 0xDD52
-#define MTP_PROPERTY_ACTIVITY_REQUIRED_ATTENDEES 0xDD54
-#define MTP_PROPERTY_ACTIVITY_OPTIONAL_ATTENDEES 0xDD55
-#define MTP_PROPERTY_ACTIVITY_RESOURCES 0xDD56
-#define MTP_PROPERTY_ACTIVITY_ACCEPTED 0xDD57
-#define MTP_PROPERTY_ACTIVITY_TENTATIVE 0xDD58
-#define MTP_PROPERTY_ACTIVITY_DECLINED 0xDD59
-#define MTP_PROPERTY_ACTIVITY_REMAINDER_TIME 0xDD5A
-#define MTP_PROPERTY_ACTIVITY_OWNER 0xDD5B
-#define MTP_PROPERTY_ACTIVITY_STATUS 0xDD5C
-#define MTP_PROPERTY_OWNER 0xDD5D
-#define MTP_PROPERTY_EDITOR 0xDD5E
-#define MTP_PROPERTY_WEBMASTER 0xDD5F
-#define MTP_PROPERTY_URL_SOURCE 0xDD60
-#define MTP_PROPERTY_URL_DESTINATION 0xDD61
-#define MTP_PROPERTY_TIME_BOOKMARK 0xDD62
-#define MTP_PROPERTY_OBJECT_BOOKMARK 0xDD63
-#define MTP_PROPERTY_BYTE_BOOKMARK 0xDD64
-#define MTP_PROPERTY_LAST_BUILD_DATE 0xDD70
-#define MTP_PROPERTY_TIME_TO_LIVE 0xDD71
-#define MTP_PROPERTY_MEDIA_GUID 0xDD72
-
-// MTP Device Property Codes
-#define MTP_DEVICE_PROPERTY_UNDEFINED 0x5000
-#define MTP_DEVICE_PROPERTY_BATTERY_LEVEL 0x5001
-#define MTP_DEVICE_PROPERTY_FUNCTIONAL_MODE 0x5002
-#define MTP_DEVICE_PROPERTY_IMAGE_SIZE 0x5003
-#define MTP_DEVICE_PROPERTY_COMPRESSION_SETTING 0x5004
-#define MTP_DEVICE_PROPERTY_WHITE_BALANCE 0x5005
-#define MTP_DEVICE_PROPERTY_RGB_GAIN 0x5006
-#define MTP_DEVICE_PROPERTY_F_NUMBER 0x5007
-#define MTP_DEVICE_PROPERTY_FOCAL_LENGTH 0x5008
-#define MTP_DEVICE_PROPERTY_FOCUS_DISTANCE 0x5009
-#define MTP_DEVICE_PROPERTY_FOCUS_MODE 0x500A
-#define MTP_DEVICE_PROPERTY_EXPOSURE_METERING_MODE 0x500B
-#define MTP_DEVICE_PROPERTY_FLASH_MODE 0x500C
-#define MTP_DEVICE_PROPERTY_EXPOSURE_TIME 0x500D
-#define MTP_DEVICE_PROPERTY_EXPOSURE_PROGRAM_MODE 0x500E
-#define MTP_DEVICE_PROPERTY_EXPOSURE_INDEX 0x500F
-#define MTP_DEVICE_PROPERTY_EXPOSURE_BIAS_COMPENSATION 0x5010
-#define MTP_DEVICE_PROPERTY_DATETIME 0x5011
-#define MTP_DEVICE_PROPERTY_CAPTURE_DELAY 0x5012
-#define MTP_DEVICE_PROPERTY_STILL_CAPTURE_MODE 0x5013
-#define MTP_DEVICE_PROPERTY_CONTRAST 0x5014
-#define MTP_DEVICE_PROPERTY_SHARPNESS 0x5015
-#define MTP_DEVICE_PROPERTY_DIGITAL_ZOOM 0x5016
-#define MTP_DEVICE_PROPERTY_EFFECT_MODE 0x5017
-#define MTP_DEVICE_PROPERTY_BURST_NUMBER 0x5018
-#define MTP_DEVICE_PROPERTY_BURST_INTERVAL 0x5019
-#define MTP_DEVICE_PROPERTY_TIMELAPSE_NUMBER 0x501A
-#define MTP_DEVICE_PROPERTY_TIMELAPSE_INTERVAL 0x501B
-#define MTP_DEVICE_PROPERTY_FOCUS_METERING_MODE 0x501C
-#define MTP_DEVICE_PROPERTY_UPLOAD_URL 0x501D
-#define MTP_DEVICE_PROPERTY_ARTIST 0x501E
-#define MTP_DEVICE_PROPERTY_COPYRIGHT_INFO 0x501F
-#define MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER 0xD401
-#define MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME 0xD402
-#define MTP_DEVICE_PROPERTY_VOLUME 0xD403
-#define MTP_DEVICE_PROPERTY_SUPPORTED_FORMATS_ORDERED 0xD404
-#define MTP_DEVICE_PROPERTY_DEVICE_ICON 0xD405
-#define MTP_DEVICE_PROPERTY_PLAYBACK_RATE 0xD410
-#define MTP_DEVICE_PROPERTY_PLAYBACK_OBJECT 0xD411
-#define MTP_DEVICE_PROPERTY_PLAYBACK_CONTAINER_INDEX 0xD412
-#define MTP_DEVICE_PROPERTY_SESSION_INITIATOR_VERSION_INFO 0xD406
-#define MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE 0xD407
-
-// MTP Operation Codes
-#define MTP_OPERATION_GET_DEVICE_INFO 0x1001
-#define MTP_OPERATION_OPEN_SESSION 0x1002
-#define MTP_OPERATION_CLOSE_SESSION 0x1003
-#define MTP_OPERATION_GET_STORAGE_IDS 0x1004
-#define MTP_OPERATION_GET_STORAGE_INFO 0x1005
-#define MTP_OPERATION_GET_NUM_OBJECTS 0x1006
-#define MTP_OPERATION_GET_OBJECT_HANDLES 0x1007
-#define MTP_OPERATION_GET_OBJECT_INFO 0x1008
-#define MTP_OPERATION_GET_OBJECT 0x1009
-#define MTP_OPERATION_GET_THUMB 0x100A
-#define MTP_OPERATION_DELETE_OBJECT 0x100B
-#define MTP_OPERATION_SEND_OBJECT_INFO 0x100C
-#define MTP_OPERATION_SEND_OBJECT 0x100D
-#define MTP_OPERATION_INITIATE_CAPTURE 0x100E
-#define MTP_OPERATION_FORMAT_STORE 0x100F
-#define MTP_OPERATION_RESET_DEVICE 0x1010
-#define MTP_OPERATION_SELF_TEST 0x1011
-#define MTP_OPERATION_SET_OBJECT_PROTECTION 0x1012
-#define MTP_OPERATION_POWER_DOWN 0x1013
-#define MTP_OPERATION_GET_DEVICE_PROP_DESC 0x1014
-#define MTP_OPERATION_GET_DEVICE_PROP_VALUE 0x1015
-#define MTP_OPERATION_SET_DEVICE_PROP_VALUE 0x1016
-#define MTP_OPERATION_RESET_DEVICE_PROP_VALUE 0x1017
-#define MTP_OPERATION_TERMINATE_OPEN_CAPTURE 0x1018
-#define MTP_OPERATION_MOVE_OBJECT 0x1019
-#define MTP_OPERATION_COPY_OBJECT 0x101A
-#define MTP_OPERATION_GET_PARTIAL_OBJECT 0x101B
-#define MTP_OPERATION_INITIATE_OPEN_CAPTURE 0x101C
-#define MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED 0x9801
-#define MTP_OPERATION_GET_OBJECT_PROP_DESC 0x9802
-#define MTP_OPERATION_GET_OBJECT_PROP_VALUE 0x9803
-#define MTP_OPERATION_SET_OBJECT_PROP_VALUE 0x9804
-#define MTP_OPERATION_GET_OBJECT_PROP_LIST 0x9805
-#define MTP_OPERATION_SET_OBJECT_PROP_LIST 0x9806
-#define MTP_OPERATION_GET_INTERDEPENDENT_PROP_DESC 0x9807
-#define MTP_OPERATION_SEND_OBJECT_PROP_LIST 0x9808
-#define MTP_OPERATION_GET_OBJECT_REFERENCES 0x9810
-#define MTP_OPERATION_SET_OBJECT_REFERENCES 0x9811
-#define MTP_OPERATION_SKIP 0x9820
-
-// Android extensions for direct file IO
-
-// Same as GetPartialObject, but with 64 bit offset
-#define MTP_OPERATION_GET_PARTIAL_OBJECT_64 0x95C1
-// Same as GetPartialObject64, but copying host to device
-#define MTP_OPERATION_SEND_PARTIAL_OBJECT 0x95C2
-// Truncates file to 64 bit length
-#define MTP_OPERATION_TRUNCATE_OBJECT 0x95C3
-// Must be called before using SendPartialObject and TruncateObject
-#define MTP_OPERATION_BEGIN_EDIT_OBJECT 0x95C4
-// Called to commit changes made by SendPartialObject and TruncateObject
-#define MTP_OPERATION_END_EDIT_OBJECT 0x95C5
-
-// MTP Response Codes
-#define MTP_RESPONSE_UNDEFINED 0x2000
-#define MTP_RESPONSE_OK 0x2001
-#define MTP_RESPONSE_GENERAL_ERROR 0x2002
-#define MTP_RESPONSE_SESSION_NOT_OPEN 0x2003
-#define MTP_RESPONSE_INVALID_TRANSACTION_ID 0x2004
-#define MTP_RESPONSE_OPERATION_NOT_SUPPORTED 0x2005
-#define MTP_RESPONSE_PARAMETER_NOT_SUPPORTED 0x2006
-#define MTP_RESPONSE_INCOMPLETE_TRANSFER 0x2007
-#define MTP_RESPONSE_INVALID_STORAGE_ID 0x2008
-#define MTP_RESPONSE_INVALID_OBJECT_HANDLE 0x2009
-#define MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED 0x200A
-#define MTP_RESPONSE_INVALID_OBJECT_FORMAT_CODE 0x200B
-#define MTP_RESPONSE_STORAGE_FULL 0x200C
-#define MTP_RESPONSE_OBJECT_WRITE_PROTECTED 0x200D
-#define MTP_RESPONSE_STORE_READ_ONLY 0x200E
-#define MTP_RESPONSE_ACCESS_DENIED 0x200F
-#define MTP_RESPONSE_NO_THUMBNAIL_PRESENT 0x2010
-#define MTP_RESPONSE_SELF_TEST_FAILED 0x2011
-#define MTP_RESPONSE_PARTIAL_DELETION 0x2012
-#define MTP_RESPONSE_STORE_NOT_AVAILABLE 0x2013
-#define MTP_RESPONSE_SPECIFICATION_BY_FORMAT_UNSUPPORTED 0x2014
-#define MTP_RESPONSE_NO_VALID_OBJECT_INFO 0x2015
-#define MTP_RESPONSE_INVALID_CODE_FORMAT 0x2016
-#define MTP_RESPONSE_UNKNOWN_VENDOR_CODE 0x2017
-#define MTP_RESPONSE_CAPTURE_ALREADY_TERMINATED 0x2018
-#define MTP_RESPONSE_DEVICE_BUSY 0x2019
-#define MTP_RESPONSE_INVALID_PARENT_OBJECT 0x201A
-#define MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT 0x201B
-#define MTP_RESPONSE_INVALID_DEVICE_PROP_VALUE 0x201C
-#define MTP_RESPONSE_INVALID_PARAMETER 0x201D
-#define MTP_RESPONSE_SESSION_ALREADY_OPEN 0x201E
-#define MTP_RESPONSE_TRANSACTION_CANCELLED 0x201F
-#define MTP_RESPONSE_SPECIFICATION_OF_DESTINATION_UNSUPPORTED 0x2020
-#define MTP_RESPONSE_INVALID_OBJECT_PROP_CODE 0xA801
-#define MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT 0xA802
-#define MTP_RESPONSE_INVALID_OBJECT_PROP_VALUE 0xA803
-#define MTP_RESPONSE_INVALID_OBJECT_REFERENCE 0xA804
-#define MTP_RESPONSE_GROUP_NOT_SUPPORTED 0xA805
-#define MTP_RESPONSE_INVALID_DATASET 0xA806
-#define MTP_RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED 0xA807
-#define MTP_RESPONSE_SPECIFICATION_BY_DEPTH_UNSUPPORTED 0xA808
-#define MTP_RESPONSE_OBJECT_TOO_LARGE 0xA809
-#define MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED 0xA80A
-
-// MTP Event Codes
-#define MTP_EVENT_UNDEFINED 0x4000
-#define MTP_EVENT_CANCEL_TRANSACTION 0x4001
-#define MTP_EVENT_OBJECT_ADDED 0x4002
-#define MTP_EVENT_OBJECT_REMOVED 0x4003
-#define MTP_EVENT_STORE_ADDED 0x4004
-#define MTP_EVENT_STORE_REMOVED 0x4005
-#define MTP_EVENT_DEVICE_PROP_CHANGED 0x4006
-#define MTP_EVENT_OBJECT_INFO_CHANGED 0x4007
-#define MTP_EVENT_DEVICE_INFO_CHANGED 0x4008
-#define MTP_EVENT_REQUEST_OBJECT_TRANSFER 0x4009
-#define MTP_EVENT_STORE_FULL 0x400A
-#define MTP_EVENT_DEVICE_RESET 0x400B
-#define MTP_EVENT_STORAGE_INFO_CHANGED 0x400C
-#define MTP_EVENT_CAPTURE_COMPLETE 0x400D
-#define MTP_EVENT_UNREPORTED_STATUS 0x400E
-#define MTP_EVENT_OBJECT_PROP_CHANGED 0xC801
-#define MTP_EVENT_OBJECT_PROP_DESC_CHANGED 0xC802
-#define MTP_EVENT_OBJECT_REFERENCES_CHANGED 0xC803
-
-// Storage Type
-#define MTP_STORAGE_FIXED_ROM 0x0001
-#define MTP_STORAGE_REMOVABLE_ROM 0x0002
-#define MTP_STORAGE_FIXED_RAM 0x0003
-#define MTP_STORAGE_REMOVABLE_RAM 0x0004
-
-// Storage File System
-#define MTP_STORAGE_FILESYSTEM_FLAT 0x0001
-#define MTP_STORAGE_FILESYSTEM_HIERARCHICAL 0x0002
-#define MTP_STORAGE_FILESYSTEM_DCF 0x0003
-
-// Storage Access Capability
-#define MTP_STORAGE_READ_WRITE 0x0000
-#define MTP_STORAGE_READ_ONLY_WITHOUT_DELETE 0x0001
-#define MTP_STORAGE_READ_ONLY_WITH_DELETE 0x0002
-
-// Association Type
-#define MTP_ASSOCIATION_TYPE_UNDEFINED 0x0000
-#define MTP_ASSOCIATION_TYPE_GENERIC_FOLDER 0x0001
-
-#endif // _MTP_H