Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48114f72 authored by Mike Lockwood's avatar Mike Lockwood Committed by Android (Google) Code Review
Browse files

Merge "MTP: work in progress on expanded property support"

parents ec95d932 828d19dd
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -311,9 +311,12 @@ public final class Mtp
        // Object properties we support
        public static final int PROPERTY_STORAGE_ID = 0xDC01;
        public static final int PROPERTY_OBJECT_FORMAT = 0xDC02;
        public static final int PROPERTY_PROTECTION_STATUS = 0xDC03;
        public static final int PROPERTY_OBJECT_SIZE = 0xDC04;
        public static final int PROPERTY_OBJECT_FILE_NAME = 0xDC07;
        public static final int PROPERTY_DATE_MODIFIED = 0xDC09;
        public static final int PROPERTY_PARENT_OBJECT = 0xDC0B;
        public static final int PROPERTY_PERSISTENT_UID = 0xDC41;

        /**
         * Object is not protected. It may be modified and deleted, and its properties
+18 −15
Original line number Diff line number Diff line
@@ -66,14 +66,6 @@ public class MtpDatabase {

    private final MediaScanner mMediaScanner;

    // MTP property codes
    private static final int MTP_PROPERTY_STORAGE_ID = 0xDC01;
    private static final int MTP_PROPERTY_OBJECT_FORMAT = 0xDC02;
    private static final int MTP_PROPERTY_OBJECT_SIZE = 0xDC04;
    private static final int MTP_PROPERTY_OBJECT_FILE_NAME = 0xDC07;
    private static final int MTP_PROPERTY_DATE_MODIFIED = 0xDC09;
    private static final int MTP_PROPERTY_PARENT_OBJECT = 0xDC0B;

    // MTP response codes
    private static final int MTP_RESPONSE_OK = 0x2001;
    private static final int MTP_RESPONSE_GENERAL_ERROR = 0x2002;
@@ -271,25 +263,36 @@ public class MtpDatabase {
        boolean isString = false;

        switch (property) {
            case MTP_PROPERTY_STORAGE_ID:
            case Mtp.Object.PROPERTY_STORAGE_ID:
                outIntValue[0] = mStorageID;
                return MTP_RESPONSE_OK;
            case MTP_PROPERTY_OBJECT_FORMAT:
            case Mtp.Object.PROPERTY_OBJECT_FORMAT:
                column = MtpObjects.ObjectColumns.FORMAT;
                break;
            case MTP_PROPERTY_OBJECT_SIZE:
            case Mtp.Object.PROPERTY_PROTECTION_STATUS:
                // protection status is always 0
                outIntValue[0] = 0;
                return MTP_RESPONSE_OK;
            case Mtp.Object.PROPERTY_OBJECT_SIZE:
                column = MtpObjects.ObjectColumns.SIZE;
                break;
            case MTP_PROPERTY_OBJECT_FILE_NAME:
            case Mtp.Object.PROPERTY_OBJECT_FILE_NAME:
                column = MtpObjects.ObjectColumns.DATA;
                isString = true;
                break;
            case MTP_PROPERTY_DATE_MODIFIED:
            case Mtp.Object.PROPERTY_DATE_MODIFIED:
                column = MtpObjects.ObjectColumns.DATE_MODIFIED;
                break;
            case MTP_PROPERTY_PARENT_OBJECT:
            case Mtp.Object.PROPERTY_PARENT_OBJECT:
                column = MtpObjects.ObjectColumns.PARENT;
                break;
            case Mtp.Object.PROPERTY_PERSISTENT_UID:
                // PUID is concatenation of storageID and object handle
                long puid = mStorageID;
                puid <<= 32;
                puid += handle;
                outIntValue[0] = puid;
                return MTP_RESPONSE_OK;
            default:
                return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
        }
@@ -305,7 +308,7 @@ public class MtpDatabase {
                    String value = c.getString(1);
                    int start = 0;

                    if (property == MTP_PROPERTY_OBJECT_FILE_NAME) {
                    if (property == Mtp.Object.PROPERTY_OBJECT_FILE_NAME) {
                        // extract name from full path
                        int lastSlash = value.lastIndexOf('/');
                        if (lastSlash >= 0) {
+91 −5
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@

#include "MtpDatabase.h"
#include "MtpDataPacket.h"
#include "MtpProperty.h"
#include "MtpUtils.h"
#include "mtp.h"

@@ -45,6 +46,7 @@ static jmethodID method_getSupportedCaptureFormats;
static jmethodID method_getSupportedObjectProperties;
static jmethodID method_getSupportedDeviceProperties;
static jmethodID method_getObjectProperty;
static jmethodID method_setObjectProperty;
static jmethodID method_getObjectInfo;
static jmethodID method_getObjectFilePath;
static jmethodID method_deleteFile;
@@ -98,10 +100,22 @@ public:
    virtual MtpObjectPropertyList*  getSupportedObjectProperties(MtpObjectFormat format);
    virtual MtpDevicePropertyList*  getSupportedDeviceProperties();

    virtual MtpResponseCode         getObjectProperty(MtpObjectHandle handle,
    virtual MtpResponseCode         getObjectPropertyValue(MtpObjectHandle handle,
                                            MtpObjectProperty property,
                                            MtpDataPacket& packet);

    virtual MtpResponseCode         setObjectPropertyValue(MtpObjectHandle handle,
                                            MtpObjectProperty property,
                                            MtpDataPacket& packet);

    virtual MtpResponseCode         getDevicePropertyValue(MtpDeviceProperty property,
                                            MtpDataPacket& packet);

    virtual MtpResponseCode         setDevicePropertyValue(MtpDeviceProperty property,
                                            MtpDataPacket& packet);

    virtual MtpResponseCode         resetDeviceProperty(MtpDeviceProperty property);

    virtual MtpResponseCode         getObjectInfo(MtpObjectHandle handle,
                                            MtpDataPacket& packet);

@@ -116,6 +130,11 @@ public:

    virtual MtpResponseCode         setObjectReferences(MtpObjectHandle handle,
                                            MtpObjectHandleList* references);

    virtual MtpProperty*            getObjectPropertyDesc(MtpObjectProperty property,
                                            MtpObjectFormat format);

    virtual MtpProperty*            getDevicePropertyDesc(MtpDeviceProperty property);
};

// ----------------------------------------------------------------------------
@@ -292,7 +311,7 @@ MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() {
    return list;
}

MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle,
MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle,
                                            MtpObjectProperty property,
                                            MtpDataPacket& packet) {
    int         type;
@@ -310,6 +329,15 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle,
    jlong longValue = longValues[0];
    env->ReleaseLongArrayElements(mLongBuffer, longValues, 0);

    // special case MTP_PROPERTY_DATE_MODIFIED, which is a string to MTP
    // but stored internally as a uint64
    if (property == MTP_PROPERTY_DATE_MODIFIED) {
        char    date[20];
        formatDateTime(longValue, date, sizeof(date));
        packet.putString(date);
        return MTP_RESPONSE_OK;
    }

    switch (type) {
        case MTP_TYPE_INT8:
            packet.putInt8(longValue);
@@ -335,6 +363,12 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle,
        case MTP_TYPE_UINT64:
            packet.putUInt64(longValue);
            break;
        case MTP_TYPE_INT128:
            packet.putInt128(longValue);
            break;
        case MTP_TYPE_UINT128:
            packet.putInt128(longValue);
            break;
        case MTP_TYPE_STR:
        {
            jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
@@ -351,6 +385,26 @@ MtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle,
    return MTP_RESPONSE_OK;
}

MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle,
                                            MtpObjectProperty property,
                                            MtpDataPacket& packet) {
    return -1;
}

MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property,
                                            MtpDataPacket& packet) {
    return -1;
}

MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property,
                                            MtpDataPacket& packet) {
    return -1;
}

MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty property) {
    return -1;
}

MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle,
                                            MtpDataPacket& packet) {
    char    date[20];
@@ -372,9 +426,10 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle,
    uint64_t modified = longValues[1];
    env->ReleaseLongArrayElements(mLongBuffer, longValues, 0);

    int associationType = (format == MTP_FORMAT_ASSOCIATION ?
                            MTP_ASSOCIATION_TYPE_GENERIC_FOLDER :
                            MTP_ASSOCIATION_TYPE_UNDEFINED);
//    int associationType = (format == MTP_FORMAT_ASSOCIATION ?
//                            MTP_ASSOCIATION_TYPE_GENERIC_FOLDER :
//                            MTP_ASSOCIATION_TYPE_UNDEFINED);
    int associationType = MTP_ASSOCIATION_TYPE_UNDEFINED;

    packet.putUInt32(storageID);
    packet.putUInt16(format);
@@ -497,6 +552,37 @@ MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle,
    return result;
}

MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property,
                                            MtpObjectFormat format) {
    MtpProperty* result = NULL;
    switch (property) {
        case MTP_PROPERTY_OBJECT_FORMAT:
        case MTP_PROPERTY_PROTECTION_STATUS:
            result = new MtpProperty(property, MTP_TYPE_UINT16);
            break;
        case MTP_PROPERTY_STORAGE_ID:
        case MTP_PROPERTY_PARENT_OBJECT:
            result = new MtpProperty(property, MTP_TYPE_UINT32);
            break;
        case MTP_PROPERTY_OBJECT_SIZE:
            result = new MtpProperty(property, MTP_TYPE_UINT64);
            break;
        case MTP_PROPERTY_PERSISTENT_UID:
            result = new MtpProperty(property, MTP_TYPE_UINT128);
            break;
        case MTP_PROPERTY_OBJECT_FILE_NAME:
        case MTP_PROPERTY_DATE_MODIFIED:
            result = new MtpProperty(property, MTP_TYPE_STR);
            break;
    }

    return result;
}

MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) {
    return NULL;
}

#endif // HAVE_ANDROID_OS

// ----------------------------------------------------------------------------
+11 −1
Original line number Diff line number Diff line
@@ -242,6 +242,16 @@ void MtpDataPacket::putUInt128(const uint128_t& value) {
    putUInt32(value[3]);
}

void MtpDataPacket::putInt128(int64_t value) {
    putInt64(value);
    putUInt64(value < 0 ? 0xFFFFFFFFFFFFFFFF : 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++)
@@ -363,7 +373,7 @@ int MtpDataPacket::readDataHeader(int fd) {
int MtpDataPacket::write(int fd) {
    MtpPacket::putUInt32(MTP_CONTAINER_LENGTH_OFFSET, mPacketSize);
    MtpPacket::putUInt16(MTP_CONTAINER_TYPE_OFFSET, MTP_CONTAINER_TYPE_DATA);

    dump();
    // send header separately from data
    int ret = ::write(fd, mBuffer, MTP_CONTAINER_HEADER_SIZE);
    if (ret == MTP_CONTAINER_HEADER_SIZE)
+2 −0
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ public:
    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);
Loading