Loading media/jni/android_media_MtpDatabase.cpp +16 −2 Original line number Diff line number Diff line Loading @@ -456,7 +456,6 @@ MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet) { int type; if (!getDevicePropertyInfo(property, type)) Loading Loading @@ -782,11 +781,26 @@ MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { switch (property) { case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: { // writeable string properties result = new MtpProperty(property, MTP_TYPE_STR, true); // FIXME - set current value here! // set current value JNIEnv* env = AndroidRuntime::getJNIEnv(); jint ret = env->CallIntMethod(mDatabase, method_getDeviceProperty, (jint)property, mLongBuffer, mStringBuffer); if (ret == MTP_RESPONSE_OK) { jchar* str = env->GetCharArrayElements(mStringBuffer, 0); result->setCurrentValue(str); env->ReleaseCharArrayElements(mStringBuffer, str, 0); } else { LOGE("unable to read device property, response: %04X", ret); } checkAndClearExceptionFromCallback(env, __FUNCTION__); break; } } return result; } Loading media/mtp/MtpProperty.cpp +52 −32 Original line number Diff line number Diff line Loading @@ -36,10 +36,10 @@ MtpProperty::MtpProperty() mEnumLength(0), mEnumValues(NULL) { mDefaultValue.str = NULL; mCurrentValue.str = NULL; mMinimumValue.str = NULL; mMaximumValue.str = 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, Loading @@ -66,28 +66,28 @@ MtpProperty::MtpProperty(MtpPropertyCode propCode, if (defaultValue) { switch (type) { case MTP_TYPE_INT8: mDefaultValue.i8 = defaultValue; mDefaultValue.u.i8 = defaultValue; break; case MTP_TYPE_UINT8: mDefaultValue.u8 = defaultValue; mDefaultValue.u.u8 = defaultValue; break; case MTP_TYPE_INT16: mDefaultValue.i16 = defaultValue; mDefaultValue.u.i16 = defaultValue; break; case MTP_TYPE_UINT16: mDefaultValue.u16 = defaultValue; mDefaultValue.u.u16 = defaultValue; break; case MTP_TYPE_INT32: mDefaultValue.i32 = defaultValue; mDefaultValue.u.i32 = defaultValue; break; case MTP_TYPE_UINT32: mDefaultValue.u32 = defaultValue; mDefaultValue.u.u32 = defaultValue; break; case MTP_TYPE_INT64: mDefaultValue.i64 = defaultValue; mDefaultValue.u.i64 = defaultValue; break; case MTP_TYPE_UINT64: mDefaultValue.u64 = defaultValue; mDefaultValue.u.u64 = defaultValue; break; default: LOGE("unknown type %04X in MtpProperty::MtpProperty", type); Loading Loading @@ -203,6 +203,26 @@ void MtpProperty::write(MtpDataPacket& packet) { } } 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::print() { LOGV("MtpProperty %04X\n", mCode); LOGV(" type %04X\n", mType); Loading @@ -215,43 +235,43 @@ void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) { switch (mType) { case MTP_TYPE_INT8: case MTP_TYPE_AINT8: value.i8 = packet.getInt8(); value.u.i8 = packet.getInt8(); break; case MTP_TYPE_UINT8: case MTP_TYPE_AUINT8: value.u8 = packet.getUInt8(); value.u.u8 = packet.getUInt8(); break; case MTP_TYPE_INT16: case MTP_TYPE_AINT16: value.i16 = packet.getInt16(); value.u.i16 = packet.getInt16(); break; case MTP_TYPE_UINT16: case MTP_TYPE_AUINT16: value.u16 = packet.getUInt16(); value.u.u16 = packet.getUInt16(); break; case MTP_TYPE_INT32: case MTP_TYPE_AINT32: value.i32 = packet.getInt32(); value.u.i32 = packet.getInt32(); break; case MTP_TYPE_UINT32: case MTP_TYPE_AUINT32: value.u32 = packet.getUInt32(); value.u.u32 = packet.getUInt32(); break; case MTP_TYPE_INT64: case MTP_TYPE_AINT64: value.i64 = packet.getInt64(); value.u.i64 = packet.getInt64(); break; case MTP_TYPE_UINT64: case MTP_TYPE_AUINT64: value.u64 = packet.getUInt64(); value.u.u64 = packet.getUInt64(); break; case MTP_TYPE_INT128: case MTP_TYPE_AINT128: packet.getInt128(value.i128); packet.getInt128(value.u.i128); break; case MTP_TYPE_UINT128: case MTP_TYPE_AUINT128: packet.getUInt128(value.u128); packet.getUInt128(value.u.u128); break; case MTP_TYPE_STR: packet.getString(stringBuffer); Loading @@ -268,43 +288,43 @@ void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) { switch (mType) { case MTP_TYPE_INT8: case MTP_TYPE_AINT8: packet.putInt8(value.i8); packet.putInt8(value.u.i8); break; case MTP_TYPE_UINT8: case MTP_TYPE_AUINT8: packet.putUInt8(value.u8); packet.putUInt8(value.u.u8); break; case MTP_TYPE_INT16: case MTP_TYPE_AINT16: packet.putInt16(value.i16); packet.putInt16(value.u.i16); break; case MTP_TYPE_UINT16: case MTP_TYPE_AUINT16: packet.putUInt16(value.u16); packet.putUInt16(value.u.u16); break; case MTP_TYPE_INT32: case MTP_TYPE_AINT32: packet.putInt32(value.i32); packet.putInt32(value.u.i32); break; case MTP_TYPE_UINT32: case MTP_TYPE_AUINT32: packet.putUInt32(value.u32); packet.putUInt32(value.u.u32); break; case MTP_TYPE_INT64: case MTP_TYPE_AINT64: packet.putInt64(value.i64); packet.putInt64(value.u.i64); break; case MTP_TYPE_UINT64: case MTP_TYPE_AUINT64: packet.putUInt64(value.u64); packet.putUInt64(value.u.u64); break; case MTP_TYPE_INT128: case MTP_TYPE_AINT128: packet.putInt128(value.i128); packet.putInt128(value.u.i128); break; case MTP_TYPE_UINT128: case MTP_TYPE_AUINT128: packet.putUInt128(value.u128); packet.putUInt128(value.u.u128); break; case MTP_TYPE_STR: if (value.str) Loading media/mtp/MtpProperty.h +20 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,23 @@ 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; Loading Loading @@ -68,6 +85,9 @@ public: void read(MtpDataPacket& packet); void write(MtpDataPacket& packet); void setDefaultValue(const uint16_t* string); void setCurrentValue(const uint16_t* string); void print(); inline bool isDeviceProperty() const { Loading media/mtp/MtpStringBuffer.cpp +30 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,13 @@ MtpStringBuffer::MtpStringBuffer(const char* src) 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) Loading Loading @@ -88,6 +95,29 @@ void MtpStringBuffer::set(const char* src) { 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; Loading media/mtp/MtpStringBuffer.h +3 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ class MtpDataPacket; 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; Loading @@ -35,10 +36,12 @@ private: 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; Loading Loading
media/jni/android_media_MtpDatabase.cpp +16 −2 Original line number Diff line number Diff line Loading @@ -456,7 +456,6 @@ MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, MtpDataPacket& packet) { int type; if (!getDevicePropertyInfo(property, type)) Loading Loading @@ -782,11 +781,26 @@ MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { switch (property) { case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: { // writeable string properties result = new MtpProperty(property, MTP_TYPE_STR, true); // FIXME - set current value here! // set current value JNIEnv* env = AndroidRuntime::getJNIEnv(); jint ret = env->CallIntMethod(mDatabase, method_getDeviceProperty, (jint)property, mLongBuffer, mStringBuffer); if (ret == MTP_RESPONSE_OK) { jchar* str = env->GetCharArrayElements(mStringBuffer, 0); result->setCurrentValue(str); env->ReleaseCharArrayElements(mStringBuffer, str, 0); } else { LOGE("unable to read device property, response: %04X", ret); } checkAndClearExceptionFromCallback(env, __FUNCTION__); break; } } return result; } Loading
media/mtp/MtpProperty.cpp +52 −32 Original line number Diff line number Diff line Loading @@ -36,10 +36,10 @@ MtpProperty::MtpProperty() mEnumLength(0), mEnumValues(NULL) { mDefaultValue.str = NULL; mCurrentValue.str = NULL; mMinimumValue.str = NULL; mMaximumValue.str = 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, Loading @@ -66,28 +66,28 @@ MtpProperty::MtpProperty(MtpPropertyCode propCode, if (defaultValue) { switch (type) { case MTP_TYPE_INT8: mDefaultValue.i8 = defaultValue; mDefaultValue.u.i8 = defaultValue; break; case MTP_TYPE_UINT8: mDefaultValue.u8 = defaultValue; mDefaultValue.u.u8 = defaultValue; break; case MTP_TYPE_INT16: mDefaultValue.i16 = defaultValue; mDefaultValue.u.i16 = defaultValue; break; case MTP_TYPE_UINT16: mDefaultValue.u16 = defaultValue; mDefaultValue.u.u16 = defaultValue; break; case MTP_TYPE_INT32: mDefaultValue.i32 = defaultValue; mDefaultValue.u.i32 = defaultValue; break; case MTP_TYPE_UINT32: mDefaultValue.u32 = defaultValue; mDefaultValue.u.u32 = defaultValue; break; case MTP_TYPE_INT64: mDefaultValue.i64 = defaultValue; mDefaultValue.u.i64 = defaultValue; break; case MTP_TYPE_UINT64: mDefaultValue.u64 = defaultValue; mDefaultValue.u.u64 = defaultValue; break; default: LOGE("unknown type %04X in MtpProperty::MtpProperty", type); Loading Loading @@ -203,6 +203,26 @@ void MtpProperty::write(MtpDataPacket& packet) { } } 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::print() { LOGV("MtpProperty %04X\n", mCode); LOGV(" type %04X\n", mType); Loading @@ -215,43 +235,43 @@ void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) { switch (mType) { case MTP_TYPE_INT8: case MTP_TYPE_AINT8: value.i8 = packet.getInt8(); value.u.i8 = packet.getInt8(); break; case MTP_TYPE_UINT8: case MTP_TYPE_AUINT8: value.u8 = packet.getUInt8(); value.u.u8 = packet.getUInt8(); break; case MTP_TYPE_INT16: case MTP_TYPE_AINT16: value.i16 = packet.getInt16(); value.u.i16 = packet.getInt16(); break; case MTP_TYPE_UINT16: case MTP_TYPE_AUINT16: value.u16 = packet.getUInt16(); value.u.u16 = packet.getUInt16(); break; case MTP_TYPE_INT32: case MTP_TYPE_AINT32: value.i32 = packet.getInt32(); value.u.i32 = packet.getInt32(); break; case MTP_TYPE_UINT32: case MTP_TYPE_AUINT32: value.u32 = packet.getUInt32(); value.u.u32 = packet.getUInt32(); break; case MTP_TYPE_INT64: case MTP_TYPE_AINT64: value.i64 = packet.getInt64(); value.u.i64 = packet.getInt64(); break; case MTP_TYPE_UINT64: case MTP_TYPE_AUINT64: value.u64 = packet.getUInt64(); value.u.u64 = packet.getUInt64(); break; case MTP_TYPE_INT128: case MTP_TYPE_AINT128: packet.getInt128(value.i128); packet.getInt128(value.u.i128); break; case MTP_TYPE_UINT128: case MTP_TYPE_AUINT128: packet.getUInt128(value.u128); packet.getUInt128(value.u.u128); break; case MTP_TYPE_STR: packet.getString(stringBuffer); Loading @@ -268,43 +288,43 @@ void MtpProperty::writeValue(MtpDataPacket& packet, MtpPropertyValue& value) { switch (mType) { case MTP_TYPE_INT8: case MTP_TYPE_AINT8: packet.putInt8(value.i8); packet.putInt8(value.u.i8); break; case MTP_TYPE_UINT8: case MTP_TYPE_AUINT8: packet.putUInt8(value.u8); packet.putUInt8(value.u.u8); break; case MTP_TYPE_INT16: case MTP_TYPE_AINT16: packet.putInt16(value.i16); packet.putInt16(value.u.i16); break; case MTP_TYPE_UINT16: case MTP_TYPE_AUINT16: packet.putUInt16(value.u16); packet.putUInt16(value.u.u16); break; case MTP_TYPE_INT32: case MTP_TYPE_AINT32: packet.putInt32(value.i32); packet.putInt32(value.u.i32); break; case MTP_TYPE_UINT32: case MTP_TYPE_AUINT32: packet.putUInt32(value.u32); packet.putUInt32(value.u.u32); break; case MTP_TYPE_INT64: case MTP_TYPE_AINT64: packet.putInt64(value.i64); packet.putInt64(value.u.i64); break; case MTP_TYPE_UINT64: case MTP_TYPE_AUINT64: packet.putUInt64(value.u64); packet.putUInt64(value.u.u64); break; case MTP_TYPE_INT128: case MTP_TYPE_AINT128: packet.putInt128(value.i128); packet.putInt128(value.u.i128); break; case MTP_TYPE_UINT128: case MTP_TYPE_AUINT128: packet.putUInt128(value.u128); packet.putUInt128(value.u.u128); break; case MTP_TYPE_STR: if (value.str) Loading
media/mtp/MtpProperty.h +20 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,23 @@ 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; Loading Loading @@ -68,6 +85,9 @@ public: void read(MtpDataPacket& packet); void write(MtpDataPacket& packet); void setDefaultValue(const uint16_t* string); void setCurrentValue(const uint16_t* string); void print(); inline bool isDeviceProperty() const { Loading
media/mtp/MtpStringBuffer.cpp +30 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,13 @@ MtpStringBuffer::MtpStringBuffer(const char* src) 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) Loading Loading @@ -88,6 +95,29 @@ void MtpStringBuffer::set(const char* src) { 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; Loading
media/mtp/MtpStringBuffer.h +3 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ class MtpDataPacket; 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; Loading @@ -35,10 +36,12 @@ private: 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; Loading