MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { JNIEnv* env = AndroidRuntime::getJNIEnv(); MtpProperty* result = NULL; bool writable = false; switch (property) { case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: writable = true; // fall through case MTP_DEVICE_PROPERTY_IMAGE_SIZE: result = new MtpProperty(property, MTP_TYPE_STR, writable); // get current value 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); // for read-only properties it is safe to assume current value is default value if (!writable) result->setDefaultValue(str); env->ReleaseCharArrayElements(mStringBuffer, str, 0); } else { ALOGE("unable to read device property, response: %04X", ret); } break; } checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; }
MtpResponseCode MtpServer::doGetDevicePropDesc() { MtpDeviceProperty propCode = mRequest.getParameter(1); LOGV("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::doGetObjectPropDesc() { MtpObjectProperty propCode = mRequest.getParameter(1); MtpObjectFormat format = mRequest.getParameter(2); LOGV("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); MTPD("GetDevicePropDesc %s\n", MtpDebug::getDevicePropCodeName(propCode)); mDatabase->lockMutex(); MtpProperty* property = mDatabase->getDevicePropertyDesc(propCode); mDatabase->unlockMutex(); if (!property) { MTPE("MtpServer::doGetDevicePropDesc property not supported\n"); return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED; } property->write(mData); delete property; return MTP_RESPONSE_OK; }
MtpResponseCode MtpServer::doGetObjectPropDesc() { MtpObjectProperty propCode = mRequest.getParameter(1); MtpObjectFormat format = mRequest.getParameter(2); MTPD("MtpServer::doGetObjectPropDesc %s %s\n", MtpDebug::getObjectPropCodeName(propCode), MtpDebug::getFormatCodeName(format)); mDatabase->lockMutex(); MtpProperty* property = mDatabase->getObjectPropertyDesc(propCode, format); mDatabase->unlockMutex(); if (!property) { MTPE("MtpServer::doGetObjectPropDesc propery not supported\n"); return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED; } property->write(mData); delete property; return MTP_RESPONSE_OK; }
//virtual MtpProperty* MozMtpDatabase::getObjectPropertyDesc(MtpObjectProperty aProperty, MtpObjectFormat aFormat) { MTP_LOG("Property: %s 0x%08x", ObjectPropertyAsStr(aProperty), aProperty); MtpProperty* result = nullptr; switch (aProperty) { case MTP_PROPERTY_PROTECTION_STATUS: result = new MtpProperty(aProperty, MTP_TYPE_UINT16); break; case MTP_PROPERTY_OBJECT_FORMAT: result = new MtpProperty(aProperty, MTP_TYPE_UINT16, false, aFormat); break; case MTP_PROPERTY_STORAGE_ID: case MTP_PROPERTY_PARENT_OBJECT: case MTP_PROPERTY_WIDTH: case MTP_PROPERTY_HEIGHT: case MTP_PROPERTY_IMAGE_BIT_DEPTH: result = new MtpProperty(aProperty, MTP_TYPE_UINT32); break; case MTP_PROPERTY_OBJECT_SIZE: result = new MtpProperty(aProperty, MTP_TYPE_UINT64); break; case MTP_PROPERTY_DISPLAY_NAME: case MTP_PROPERTY_NAME: result = new MtpProperty(aProperty, MTP_TYPE_STR); break; case MTP_PROPERTY_OBJECT_FILE_NAME: result = new MtpProperty(aProperty, MTP_TYPE_STR, true); break; case MTP_PROPERTY_DATE_CREATED: case MTP_PROPERTY_DATE_MODIFIED: case MTP_PROPERTY_DATE_ADDED: result = new MtpProperty(aProperty, MTP_TYPE_STR); result->setFormDateTime(); break; case MTP_PROPERTY_PERSISTENT_UID: result = new MtpProperty(aProperty, MTP_TYPE_UINT128); break; default: break; } return result; }
MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, MtpObjectFormat format) { MtpProperty* result = NULL; switch (property) { case MTP_PROPERTY_OBJECT_FORMAT: // use format as default value result = new MtpProperty(property, MTP_TYPE_UINT16, false, format); break; case MTP_PROPERTY_PROTECTION_STATUS: case MTP_PROPERTY_TRACK: result = new MtpProperty(property, MTP_TYPE_UINT16); break; case MTP_PROPERTY_STORAGE_ID: case MTP_PROPERTY_PARENT_OBJECT: case MTP_PROPERTY_DURATION: 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_NAME: case MTP_PROPERTY_DISPLAY_NAME: case MTP_PROPERTY_ARTIST: case MTP_PROPERTY_ALBUM_NAME: case MTP_PROPERTY_ALBUM_ARTIST: case MTP_PROPERTY_GENRE: case MTP_PROPERTY_COMPOSER: case MTP_PROPERTY_DESCRIPTION: result = new MtpProperty(property, MTP_TYPE_STR); break; case MTP_PROPERTY_DATE_MODIFIED: case MTP_PROPERTY_DATE_ADDED: case MTP_PROPERTY_ORIGINAL_RELEASE_DATE: result = new MtpProperty(property, MTP_TYPE_STR); result->setFormDateTime(); break; case MTP_PROPERTY_OBJECT_FILE_NAME: // We allow renaming files and folders result = new MtpProperty(property, MTP_TYPE_STR, true); break; } return result; }
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; }
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 (size_t 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)); } } } } } }