1d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood/* 2d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * Copyright (C) 2010 The Android Open Source Project 3d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * 4d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * you may not use this file except in compliance with the License. 6d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * You may obtain a copy of the License at 7d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * 8d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * 10d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * See the License for the specific language governing permissions and 14d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood * limitations under the License. 15d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood */ 16d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 17d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#define LOG_TAG "MtpDatabaseJNI" 18d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "utils/Log.h" 19d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang#include "utils/String8.h" 20d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 218409c0691fb128fef6244305977342776bddf919Jaesung Chung#include "android_media_Utils.h" 228409c0691fb128fef6244305977342776bddf919Jaesung Chung#include "mtp.h" 23f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang#include "IMtpDatabase.h" 24d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "MtpDataPacket.h" 259df53fae3afd1c6b5278216be2fd33a255602aefMike Lockwood#include "MtpObjectInfo.h" 26828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood#include "MtpProperty.h" 2759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood#include "MtpStringBuffer.h" 28d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "MtpUtils.h" 298409c0691fb128fef6244305977342776bddf919Jaesung Chung 308409c0691fb128fef6244305977342776bddf919Jaesung Chung#include "src/piex_types.h" 318409c0691fb128fef6244305977342776bddf919Jaesung Chung#include "src/piex.h" 32d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 33c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwoodextern "C" { 343cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen#include "libexif/exif-content.h" 353cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen#include "libexif/exif-data.h" 363cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen#include "libexif/exif-tag.h" 373cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen#include "libexif/exif-utils.h" 38c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood} 39c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood 408409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <android_runtime/AndroidRuntime.h> 418409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <android_runtime/Log.h> 428409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <jni.h> 4363f819203de3a029f2397510c48101b343441df3Chong Zhang#include <media/stagefright/NuMediaExtractor.h> 442279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h> 458409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <nativehelper/ScopedLocalRef.h> 468409c0691fb128fef6244305977342776bddf919Jaesung Chung 478409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <assert.h> 488409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <fcntl.h> 498409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <inttypes.h> 508409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <limits.h> 518409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <stdio.h> 528409c0691fb128fef6244305977342776bddf919Jaesung Chung#include <unistd.h> 538409c0691fb128fef6244305977342776bddf919Jaesung Chung 54d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodusing namespace android; 55d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 56d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 57d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 58d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodstatic jmethodID method_beginSendObject; 59d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodstatic jmethodID method_endSendObject; 60f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_rescanFile; 61d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectList; 627a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwoodstatic jmethodID method_getNumObjects; 634b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedPlaybackFormats; 644b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedCaptureFormats; 654b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedObjectProperties; 664b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedDeviceProperties; 67828d19dd96b05fa99abdc517701e5366543c324fMike Lockwoodstatic jmethodID method_setObjectProperty; 6859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwoodstatic jmethodID method_getDeviceProperty; 6959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwoodstatic jmethodID method_setDeviceProperty; 70e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwoodstatic jmethodID method_getObjectPropertyList; 71d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectInfo; 72d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectFilePath; 73f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_beginDeleteObject; 74f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_endDeleteObject; 75f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_beginMoveObject; 76f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_endMoveObject; 77f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_beginCopyObject; 78f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_endCopyObject; 799a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwoodstatic jmethodID method_getObjectReferences; 809a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwoodstatic jmethodID method_setObjectReferences; 812837eefc5459427138c080d445bb491c75630163Mike Lockwood 82d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jfieldID field_context; 83f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 84f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang// MtpPropertyList methods 85f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_getCode; 86f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_getCount; 87f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_getObjectHandles; 88f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_getPropertyCodes; 89f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_getDataTypes; 90f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_getLongValues; 91f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangstatic jmethodID method_getStringValues; 92f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 93f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 94f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangIMtpDatabase* getMtpDatabase(JNIEnv *env, jobject database) { 95f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang return (IMtpDatabase *)env->GetLongField(database, field_context); 96d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 97d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 98d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 99d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 100f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangclass MtpDatabase : public IMtpDatabase { 101d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodprivate: 102d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jobject mDatabase; 103d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray mIntBuffer; 104d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlongArray mLongBuffer; 105d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jcharArray mStringBuffer; 106d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 107d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodpublic: 108f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpDatabase(JNIEnv *env, jobject client); 109f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual ~MtpDatabase(); 110d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood void cleanup(JNIEnv *env); 111d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 112d815f79766984fce499e147ecbacc01914683f74Mike Lockwood virtual MtpObjectHandle beginSendObject(const char* path, 113d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 114d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent, 115f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID storage); 116d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 117f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual void endSendObject(MtpObjectHandle handle, bool succeeded); 118d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 119f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual void rescanFile(const char* path, 120f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpObjectHandle handle, 121f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpObjectFormat format); 122b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso 123d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, 124d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 125d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent); 126d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1277a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood virtual int getNumObjects(MtpStorageID storageID, 1287a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectFormat format, 1297a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectHandle parent); 1307a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood 1314b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood // callee should delete[] the results from these 1324b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood // results can be NULL 1334b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpObjectFormatList* getSupportedPlaybackFormats(); 1344b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpObjectFormatList* getSupportedCaptureFormats(); 1354b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpObjectPropertyList* getSupportedObjectProperties(MtpObjectFormat format); 1364b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpDevicePropertyList* getSupportedDeviceProperties(); 1374b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 138828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode getObjectPropertyValue(MtpObjectHandle handle, 139d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property, 140d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet); 141d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 142828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode setObjectPropertyValue(MtpObjectHandle handle, 143828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpObjectProperty property, 144828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet); 145828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 146828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode getDevicePropertyValue(MtpDeviceProperty property, 147828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet); 148828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 149828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode setDevicePropertyValue(MtpDeviceProperty property, 150828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet); 151828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 152828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode resetDeviceProperty(MtpDeviceProperty property); 153828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 154e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood virtual MtpResponseCode getObjectPropertyList(MtpObjectHandle handle, 1557d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood uint32_t format, uint32_t property, 156e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int groupCode, int depth, 157e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood MtpDataPacket& packet); 158e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 159d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle, 1609df53fae3afd1c6b5278216be2fd33a255602aefMike Lockwood MtpObjectInfo& info); 161d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 162c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood virtual void* getThumbnail(MtpObjectHandle handle, size_t& outThumbSize); 163c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood 16459c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood virtual MtpResponseCode getObjectFilePath(MtpObjectHandle handle, 165d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang MtpStringBuffer& outFilePath, 166365e03e4943b2d2f4d1e602409ab0e770ea77d1dMike Lockwood int64_t& outFileLength, 167365e03e4943b2d2f4d1e602409ab0e770ea77d1dMike Lockwood MtpObjectFormat& outFormat); 168f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual MtpResponseCode beginDeleteObject(MtpObjectHandle handle); 169f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual void endDeleteObject(MtpObjectHandle handle, bool succeeded); 170d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 17159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood bool getObjectPropertyInfo(MtpObjectProperty property, int& type); 17259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood bool getDevicePropertyInfo(MtpDeviceProperty property, int& type); 1739a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1749a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood virtual MtpObjectHandleList* getObjectReferences(MtpObjectHandle handle); 1759a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1769a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle, 1779a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood MtpObjectHandleList* references); 178828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 179828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpProperty* getObjectPropertyDesc(MtpObjectProperty property, 180828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpObjectFormat format); 181828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 182828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property); 1832837eefc5459427138c080d445bb491c75630163Mike Lockwood 184f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual MtpResponseCode beginMoveObject(MtpObjectHandle handle, MtpObjectHandle newParent, 185f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID newStorage); 186f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 187f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual void endMoveObject(MtpObjectHandle oldParent, MtpObjectHandle newParent, 188f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID oldStorage, MtpStorageID newStorage, 189f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpObjectHandle handle, bool succeeded); 190952558d4e5a51b5f69c7c0bc1e3d7fa8da1cbf3cJerry Zhang 191f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual MtpResponseCode beginCopyObject(MtpObjectHandle handle, MtpObjectHandle newParent, 192f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID newStorage); 193f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang virtual void endCopyObject(MtpObjectHandle handle, bool succeeded); 1942837eefc5459427138c080d445bb491c75630163Mike Lockwood 195d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 196d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1970a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood// ---------------------------------------------------------------------------- 1980a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 1990a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwoodstatic void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 2000a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood if (env->ExceptionCheck()) { 2013762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("An exception was thrown by callback '%s'.", methodName); 2020a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood LOGE_EX(env); 2030a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ExceptionClear(); 2040a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood } 2050a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood} 2060a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2070a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood// ---------------------------------------------------------------------------- 2080a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 209f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpDatabase::MtpDatabase(JNIEnv *env, jobject client) 210d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood : mDatabase(env->NewGlobalRef(client)), 211d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mIntBuffer(NULL), 212d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mLongBuffer(NULL), 213d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mStringBuffer(NULL) 214d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 215d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // create buffers for out arguments 216d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // we don't need to be thread-safe so this is OK 21715dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes jintArray intArray = env->NewIntArray(3); 21815dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes if (!intArray) { 21915dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes return; // Already threw. 22015dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes } 221d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mIntBuffer = (jintArray)env->NewGlobalRef(intArray); 22215dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes jlongArray longArray = env->NewLongArray(2); 22315dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes if (!longArray) { 22415dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes return; // Already threw. 22515dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes } 226d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mLongBuffer = (jlongArray)env->NewGlobalRef(longArray); 22763ffd78aaab0b0d04012312f0378b0c73b737a2aMike Lockwood // Needs to be long enough to hold a file path for getObjectFilePath() 22863ffd78aaab0b0d04012312f0378b0c73b737a2aMike Lockwood jcharArray charArray = env->NewCharArray(PATH_MAX + 1); 22915dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes if (!charArray) { 23015dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes return; // Already threw. 23115dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes } 232d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mStringBuffer = (jcharArray)env->NewGlobalRef(charArray); 233d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 234d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 235f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangvoid MtpDatabase::cleanup(JNIEnv *env) { 236d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mDatabase); 237d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mIntBuffer); 238d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mLongBuffer); 239d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mStringBuffer); 240d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 241d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 242f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpDatabase::~MtpDatabase() { 243d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 244d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 245f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpObjectHandle MtpDatabase::beginSendObject(const char* path, 246486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectFormat format, 247486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectHandle parent, 248f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID storage) { 249d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 2508839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood jstring pathStr = env->NewStringUTF(path); 2510a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject, 252f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang pathStr, (jint)format, (jint)parent, (jint)storage); 2530a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2548839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood if (pathStr) 2558839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(pathStr); 2560a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 2570a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 258d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 259d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 260f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangvoid MtpDatabase::endSendObject(MtpObjectHandle handle, bool succeeded) { 261d815f79766984fce499e147ecbacc01914683f74Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 262f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->CallVoidMethod(mDatabase, method_endSendObject, (jint)handle, (jboolean)succeeded); 2630a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2640a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 265d815f79766984fce499e147ecbacc01914683f74Mike Lockwood} 266d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 267f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangvoid MtpDatabase::rescanFile(const char* path, MtpObjectHandle handle, 268f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpObjectFormat format) { 269b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso JNIEnv* env = AndroidRuntime::getJNIEnv(); 270b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso jstring pathStr = env->NewStringUTF(path); 271f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->CallVoidMethod(mDatabase, method_rescanFile, pathStr, 272f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang (jint)handle, (jint)format); 273b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso 274b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso if (pathStr) 275b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso env->DeleteLocalRef(pathStr); 276b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso checkAndClearExceptionFromCallback(env, __FUNCTION__); 277b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso} 278b4aa69fd116d5486f224914350a57b4befddfe26kyle_tso 279f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpObjectHandleList* MtpDatabase::getObjectList(MtpStorageID storageID, 280486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectFormat format, 281486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectHandle parent) { 282d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 283d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectList, 284d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)storageID, (jint)format, (jint)parent); 285d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!array) 286d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return NULL; 287d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandleList* list = new MtpObjectHandleList(); 288d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 289d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jsize length = env->GetArrayLength(array); 2907a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood for (int i = 0; i < length; i++) 291d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang list->push_back(handles[i]); 2920a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 2938839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(array); 2940a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2950a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 2960a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 297d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 298d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 299f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangint MtpDatabase::getNumObjects(MtpStorageID storageID, 300486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectFormat format, 301486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectHandle parent) { 3027a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3030a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood int result = env->CallIntMethod(mDatabase, method_getNumObjects, 3047a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood (jint)storageID, (jint)format, (jint)parent); 3050a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3060a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 3070a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 3087a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood} 3097a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood 310f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpObjectFormatList* MtpDatabase::getSupportedPlaybackFormats() { 3114b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3124b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 3134b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedPlaybackFormats); 3144b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 3154b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 3164b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpObjectFormatList* list = new MtpObjectFormatList(); 3174b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* formats = env->GetIntArrayElements(array, 0); 3184b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 3194b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 320d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang list->push_back(formats[i]); 3210a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, formats, 0); 3228839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(array); 3230a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3240a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 3250a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 3264b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 3274b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 328f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpObjectFormatList* MtpDatabase::getSupportedCaptureFormats() { 3294b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3304b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 3314b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedCaptureFormats); 3324b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 3334b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 3344b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpObjectFormatList* list = new MtpObjectFormatList(); 3354b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* formats = env->GetIntArrayElements(array, 0); 3364b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 3374b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 338d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang list->push_back(formats[i]); 3390a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, formats, 0); 3408839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(array); 3410a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3420a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 3430a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 3444b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 3454b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 346f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpObjectPropertyList* MtpDatabase::getSupportedObjectProperties(MtpObjectFormat format) { 3474b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3484b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 3494b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedObjectProperties, (jint)format); 3504b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 3514b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 3524b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpObjectPropertyList* list = new MtpObjectPropertyList(); 3534b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* properties = env->GetIntArrayElements(array, 0); 3544b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 3554b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 356d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang list->push_back(properties[i]); 3570a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, properties, 0); 3588839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(array); 3590a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3600a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 3610a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 3624b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 3634b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 364f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpDevicePropertyList* MtpDatabase::getSupportedDeviceProperties() { 3654b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3664b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 3674b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedDeviceProperties); 3684b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 3694b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 3704b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpDevicePropertyList* list = new MtpDevicePropertyList(); 3714b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* properties = env->GetIntArrayElements(array, 0); 3724b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 3734b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 374d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang list->push_back(properties[i]); 3750a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, properties, 0); 3768839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(array); 3770a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3780a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 3790a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 3804b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 3814b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 382f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::getObjectPropertyValue(MtpObjectHandle handle, 383486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectProperty property, 384486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpDataPacket& packet) { 385486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_assert(sizeof(jint) >= sizeof(MtpObjectHandle), 386486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono "Casting MtpObjectHandle to jint loses a value"); 387486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_assert(sizeof(jint) >= sizeof(MtpObjectProperty), 388486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono "Casting MtpObjectProperty to jint loses a value"); 389d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 390486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono jobject list = env->CallObjectMethod( 391486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono mDatabase, 392486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono method_getObjectPropertyList, 393486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_cast<jint>(handle), 394486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono 0, 395486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_cast<jint>(property), 396486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono 0, 397486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono 0); 398f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpResponseCode result = env->CallIntMethod(list, method_getCode); 399f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jint count = env->CallIntMethod(list, method_getCount); 400f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang if (count != 1) 401e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result = MTP_RESPONSE_GENERAL_ERROR; 402e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 403e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (result == MTP_RESPONSE_OK) { 404f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jintArray objectHandlesArray = (jintArray)env->CallObjectMethod(list, method_getObjectHandles); 405f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jintArray propertyCodesArray = (jintArray)env->CallObjectMethod(list, method_getPropertyCodes); 406f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jintArray dataTypesArray = (jintArray)env->CallObjectMethod(list, method_getDataTypes); 407f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jlongArray longValuesArray = (jlongArray)env->CallObjectMethod(list, method_getLongValues); 408f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jobjectArray stringValuesArray = (jobjectArray)env->CallObjectMethod(list, method_getStringValues); 409e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 410e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jint* objectHandles = env->GetIntArrayElements(objectHandlesArray, 0); 411e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jint* propertyCodes = env->GetIntArrayElements(propertyCodesArray, 0); 412e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jint* dataTypes = env->GetIntArrayElements(dataTypesArray, 0); 413f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jlong* longValues = env->GetLongArrayElements(longValuesArray, 0); 414e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 415e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int type = dataTypes[0]; 416e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jlong longValue = (longValues ? longValues[0] : 0); 417e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 418e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood switch (type) { 419e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT8: 420e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt8(longValue); 421e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 422e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT8: 423e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt8(longValue); 424e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 425e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT16: 426e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt16(longValue); 427e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 428e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT16: 429e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt16(longValue); 430e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 431e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT32: 432e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt32(longValue); 433e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 434e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT32: 435e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt32(longValue); 436e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 437e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT64: 438e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt64(longValue); 439e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 440e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT64: 441e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt64(longValue); 442e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 443e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT128: 444e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt128(longValue); 445e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 446e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT128: 4478937f1aa8b7ac50f60bf1f391382d4c4055c449dWanwu Peng packet.putUInt128(longValue); 448e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 449e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_STR: 450e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood { 451e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jstring stringValue = (jstring)env->GetObjectArrayElement(stringValuesArray, 0); 45217a24c58bb2e86719f003c80f682beb66803f24dMartin Blumenstingl const char* str = (stringValue ? env->GetStringUTFChars(stringValue, NULL) : NULL); 453e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (stringValue) { 454e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putString(str); 455e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseStringUTFChars(stringValue, str); 456e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else { 457e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putEmptyString(); 458e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 45917a24c58bb2e86719f003c80f682beb66803f24dMartin Blumenstingl env->DeleteLocalRef(stringValue); 460e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 461e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 462e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood default: 4633762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("unsupported type in getObjectPropertyValue\n"); 464e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood result = MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT; 465e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 466e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseIntArrayElements(objectHandlesArray, objectHandles, 0); 467e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseIntArrayElements(propertyCodesArray, propertyCodes, 0); 468e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseIntArrayElements(dataTypesArray, dataTypes, 0); 469f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->ReleaseLongArrayElements(longValuesArray, longValues, 0); 470e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 471e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(objectHandlesArray); 472e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(propertyCodesArray); 473e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(dataTypesArray); 474f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->DeleteLocalRef(longValuesArray); 475f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->DeleteLocalRef(stringValuesArray); 476d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 4770a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 478e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(list); 4790a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 480e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return result; 481d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 482d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 4839c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwoodstatic bool readLongValue(int type, MtpDataPacket& packet, jlong& longValue) { 4849c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood switch (type) { 4859c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_INT8: { 4869c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood int8_t temp; 4879c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getInt8(temp)) return false; 4889c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 4899c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 4909c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 4919c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_UINT8: { 4929c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood uint8_t temp; 4939c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getUInt8(temp)) return false; 4949c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 4959c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 4969c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 4979c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_INT16: { 4989c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood int16_t temp; 4999c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getInt16(temp)) return false; 5009c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 5019c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 5029c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 5039c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_UINT16: { 5049c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood uint16_t temp; 5059c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getUInt16(temp)) return false; 5069c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 5079c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 5089c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 5099c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_INT32: { 5109c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood int32_t temp; 5119c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getInt32(temp)) return false; 5129c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 5139c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 5149c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 5159c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_UINT32: { 5169c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood uint32_t temp; 5179c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getUInt32(temp)) return false; 5189c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 5199c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 5209c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 5219c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_INT64: { 5229c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood int64_t temp; 5239c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getInt64(temp)) return false; 5249c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 5259c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 5269c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 5279c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood case MTP_TYPE_UINT64: { 5289c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood uint64_t temp; 5299c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getUInt64(temp)) return false; 5309c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood longValue = temp; 5319c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood break; 5329c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 5339c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood default: 5349c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood ALOGE("unsupported type in readLongValue"); 5359c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood return false; 5369c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } 5379c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood return true; 5389c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood} 5399c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood 540f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, 541486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectProperty property, 542486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpDataPacket& packet) { 54359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood int type; 54459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 54559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (!getObjectPropertyInfo(property, type)) 54659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED; 54759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 54859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 54959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood jlong longValue = 0; 55059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood jstring stringValue = NULL; 5519c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood MtpResponseCode result = MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT; 55259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 5539c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (type == MTP_TYPE_STR) { 5549c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood MtpStringBuffer buffer; 5559c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getString(buffer)) goto fail; 5569c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood stringValue = env->NewStringUTF((const char *)buffer); 5579c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } else { 5589c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!readLongValue(type, packet, longValue)) goto fail; 55959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 56059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 5619c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood result = env->CallIntMethod(mDatabase, method_setObjectProperty, 56259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood (jint)handle, (jint)property, longValue, stringValue); 5638839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood if (stringValue) 5648839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(stringValue); 56559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 5669c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwoodfail: 56759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 56859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return result; 569828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 570828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 571f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, 572486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpDataPacket& packet) { 57356c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 574f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang int type; 57559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 576f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang if (!getDevicePropertyInfo(property, type)) 577f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED; 57856c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood 579f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jint result = env->CallIntMethod(mDatabase, method_getDeviceProperty, 580f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang (jint)property, mLongBuffer, mStringBuffer); 581f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang if (result != MTP_RESPONSE_OK) { 582f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang checkAndClearExceptionFromCallback(env, __FUNCTION__); 583f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang return result; 584f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang } 58559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 586f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 587f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jlong longValue = longValues[0]; 588f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 58959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 590f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang switch (type) { 591f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_INT8: 592f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putInt8(longValue); 593f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 594f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_UINT8: 595f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putUInt8(longValue); 596f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 597f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_INT16: 598f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putInt16(longValue); 599f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 600f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_UINT16: 601f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putUInt16(longValue); 602f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 603f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_INT32: 604f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putInt32(longValue); 605f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 606f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_UINT32: 607f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putUInt32(longValue); 608f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 609f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_INT64: 610f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putInt64(longValue); 611f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 612f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_UINT64: 613f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putUInt64(longValue); 614f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 615f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_INT128: 616f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putInt128(longValue); 617f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 618f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_UINT128: 619f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putInt128(longValue); 620f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 621f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_TYPE_STR: 622f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang { 623f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 624f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang packet.putString(str); 625f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->ReleaseCharArrayElements(mStringBuffer, str, 0); 626f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 62756c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood } 628f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang default: 629f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang ALOGE("unsupported type in getDevicePropertyValue\n"); 630f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang return MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT; 63159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 632f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 633f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang checkAndClearExceptionFromCallback(env, __FUNCTION__); 634f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang return MTP_RESPONSE_OK; 635828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 636828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 637f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::setDevicePropertyValue(MtpDeviceProperty property, 638486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpDataPacket& packet) { 63959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood int type; 64059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 64159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (!getDevicePropertyInfo(property, type)) 64259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED; 64359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 64459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 64559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood jlong longValue = 0; 64659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood jstring stringValue = NULL; 6479c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood MtpResponseCode result = MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT; 64859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 6499c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (type == MTP_TYPE_STR) { 6509c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood MtpStringBuffer buffer; 6519c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!packet.getString(buffer)) goto fail; 6529c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood stringValue = env->NewStringUTF((const char *)buffer); 6539c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood } else { 6549c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood if (!readLongValue(type, packet, longValue)) goto fail; 65559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 65659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 6579c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwood result = env->CallIntMethod(mDatabase, method_setDeviceProperty, 65859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood (jint)property, longValue, stringValue); 6598839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood if (stringValue) 6608839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(stringValue); 66159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 6629c803fa52606aeb27d4d098161722fb111dd1b23Mike Lockwoodfail: 66359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 66459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return result; 665828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 666828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 667f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::resetDeviceProperty(MtpDeviceProperty /*property*/) { 668828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return -1; 669828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 670828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 671f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::getObjectPropertyList(MtpObjectHandle handle, 672486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono uint32_t format, uint32_t property, 673486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono int groupCode, int depth, 674486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpDataPacket& packet) { 675486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_assert(sizeof(jint) >= sizeof(MtpObjectHandle), 676486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono "Casting MtpObjectHandle to jint loses a value"); 677e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 678486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono jobject list = env->CallObjectMethod( 679486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono mDatabase, 680486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono method_getObjectPropertyList, 681486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_cast<jint>(handle), 682486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_cast<jint>(format), 683486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_cast<jint>(property), 684486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_cast<jint>(groupCode), 685486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono static_cast<jint>(depth)); 6867d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 6877d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood if (!list) 6887d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood return MTP_RESPONSE_GENERAL_ERROR; 689f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang int count = env->CallIntMethod(list, method_getCount); 690f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpResponseCode result = env->CallIntMethod(list, method_getCode); 691e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 692e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt32(count); 693e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (count > 0) { 694f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jintArray objectHandlesArray = (jintArray)env->CallObjectMethod(list, method_getObjectHandles); 695f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jintArray propertyCodesArray = (jintArray)env->CallObjectMethod(list, method_getPropertyCodes); 696f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jintArray dataTypesArray = (jintArray)env->CallObjectMethod(list, method_getDataTypes); 697f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jlongArray longValuesArray = (jlongArray)env->CallObjectMethod(list, method_getLongValues); 698f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jobjectArray stringValuesArray = (jobjectArray)env->CallObjectMethod(list, method_getStringValues); 699e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 700e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jint* objectHandles = env->GetIntArrayElements(objectHandlesArray, 0); 701e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jint* propertyCodes = env->GetIntArrayElements(propertyCodesArray, 0); 702e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jint* dataTypes = env->GetIntArrayElements(dataTypesArray, 0); 703e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jlong* longValues = (longValuesArray ? env->GetLongArrayElements(longValuesArray, 0) : NULL); 704e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 705e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood for (int i = 0; i < count; i++) { 706e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt32(objectHandles[i]); 707e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt16(propertyCodes[i]); 708e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood int type = dataTypes[i]; 709e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt16(type); 710e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 711e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood switch (type) { 712e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT8: 713e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt8(longValues[i]); 714e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 715e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT8: 716e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt8(longValues[i]); 717e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 718e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT16: 719e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt16(longValues[i]); 720e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 721e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT16: 722e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt16(longValues[i]); 723e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 724e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT32: 725e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt32(longValues[i]); 726e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 727e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT32: 728e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt32(longValues[i]); 729e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 730e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT64: 731e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt64(longValues[i]); 732e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 733e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT64: 734e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt64(longValues[i]); 735e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 736e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_INT128: 737e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putInt128(longValues[i]); 738e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 739e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_UINT128: 740e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putUInt128(longValues[i]); 741e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 742e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood case MTP_TYPE_STR: { 743e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood jstring value = (jstring)env->GetObjectArrayElement(stringValuesArray, i); 7442711e494caf9ec665c46258feb36c9654290f6e0Mike Lockwood const char *valueStr = (value ? env->GetStringUTFChars(value, NULL) : NULL); 745e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (valueStr) { 746e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putString(valueStr); 747e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseStringUTFChars(value, valueStr); 748e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } else { 749e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood packet.putEmptyString(); 750e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 751e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(value); 752e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 753e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 754e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood default: 755f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang ALOGE("bad or unsupported data type in MtpDatabase::getObjectPropertyList"); 756e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood break; 757e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 758e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 759e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 760e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseIntArrayElements(objectHandlesArray, objectHandles, 0); 761e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseIntArrayElements(propertyCodesArray, propertyCodes, 0); 762e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->ReleaseIntArrayElements(dataTypesArray, dataTypes, 0); 763f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->ReleaseLongArrayElements(longValuesArray, longValues, 0); 764e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 765e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(objectHandlesArray); 766e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(propertyCodesArray); 767e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(dataTypesArray); 768f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->DeleteLocalRef(longValuesArray); 769f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->DeleteLocalRef(stringValuesArray); 770e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 771e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 772e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood env->DeleteLocalRef(list); 773e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 774e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return result; 775e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood} 776e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 7775a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampestatic void foreachentry(ExifEntry *entry, void* /* user */) { 7783cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen char buf[1024]; 7793cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen ALOGI("entry %x, format %d, size %d: %s", 7803cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen entry->tag, entry->format, entry->size, exif_entry_get_value(entry, buf, sizeof(buf))); 7813cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen} 7823cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen 7833cd393c5051ce26c8030736f5524962d98abe849Marco Nelissenstatic void foreachcontent(ExifContent *content, void *user) { 7843cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen ALOGI("content %d", exif_content_get_ifd(content)); 7853cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen exif_content_foreach_entry(content, foreachentry, user); 7863cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen} 7873cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen 7883cd393c5051ce26c8030736f5524962d98abe849Marco Nelissenstatic long getLongFromExifEntry(ExifEntry *e) { 7893cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen ExifByteOrder o = exif_data_get_byte_order(e->parent->parent); 7903cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen return exif_get_long(e->data, o); 7913cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen} 7923cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen 79363f819203de3a029f2397510c48101b343441df3Chong Zhangstatic ExifData *getExifFromExtractor(const char *path) { 79463f819203de3a029f2397510c48101b343441df3Chong Zhang std::unique_ptr<uint8_t[]> exifBuf; 79563f819203de3a029f2397510c48101b343441df3Chong Zhang ExifData *exifdata = NULL; 79663f819203de3a029f2397510c48101b343441df3Chong Zhang 79763f819203de3a029f2397510c48101b343441df3Chong Zhang FILE *fp = fopen (path, "rb"); 79863f819203de3a029f2397510c48101b343441df3Chong Zhang if (!fp) { 79963f819203de3a029f2397510c48101b343441df3Chong Zhang ALOGE("failed to open file"); 80063f819203de3a029f2397510c48101b343441df3Chong Zhang return NULL; 80163f819203de3a029f2397510c48101b343441df3Chong Zhang } 80263f819203de3a029f2397510c48101b343441df3Chong Zhang 80363f819203de3a029f2397510c48101b343441df3Chong Zhang sp<NuMediaExtractor> extractor = new NuMediaExtractor(); 80463f819203de3a029f2397510c48101b343441df3Chong Zhang fseek(fp, 0L, SEEK_END); 80563f819203de3a029f2397510c48101b343441df3Chong Zhang if (extractor->setDataSource(fileno(fp), 0, ftell(fp)) != OK) { 80663f819203de3a029f2397510c48101b343441df3Chong Zhang ALOGE("failed to setDataSource"); 80763f819203de3a029f2397510c48101b343441df3Chong Zhang fclose(fp); 80863f819203de3a029f2397510c48101b343441df3Chong Zhang return NULL; 80963f819203de3a029f2397510c48101b343441df3Chong Zhang } 81063f819203de3a029f2397510c48101b343441df3Chong Zhang 81163f819203de3a029f2397510c48101b343441df3Chong Zhang off64_t offset; 81263f819203de3a029f2397510c48101b343441df3Chong Zhang size_t size; 81363f819203de3a029f2397510c48101b343441df3Chong Zhang if (extractor->getExifOffsetSize(&offset, &size) != OK) { 81463f819203de3a029f2397510c48101b343441df3Chong Zhang fclose(fp); 81563f819203de3a029f2397510c48101b343441df3Chong Zhang return NULL; 81663f819203de3a029f2397510c48101b343441df3Chong Zhang } 81763f819203de3a029f2397510c48101b343441df3Chong Zhang 81863f819203de3a029f2397510c48101b343441df3Chong Zhang exifBuf.reset(new uint8_t[size]); 81963f819203de3a029f2397510c48101b343441df3Chong Zhang fseek(fp, offset, SEEK_SET); 82063f819203de3a029f2397510c48101b343441df3Chong Zhang if (fread(exifBuf.get(), 1, size, fp) == size) { 82163f819203de3a029f2397510c48101b343441df3Chong Zhang exifdata = exif_data_new_from_data(exifBuf.get(), size); 82263f819203de3a029f2397510c48101b343441df3Chong Zhang } 82363f819203de3a029f2397510c48101b343441df3Chong Zhang 82463f819203de3a029f2397510c48101b343441df3Chong Zhang fclose(fp); 82563f819203de3a029f2397510c48101b343441df3Chong Zhang return exifdata; 82663f819203de3a029f2397510c48101b343441df3Chong Zhang} 82763f819203de3a029f2397510c48101b343441df3Chong Zhang 828f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::getObjectInfo(MtpObjectHandle handle, 829486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectInfo& info) { 830d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang MtpStringBuffer path; 831f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood int64_t length; 832f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood MtpObjectFormat format; 833f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood 834f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood MtpResponseCode result = getObjectFilePath(handle, path, length, format); 835f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood if (result != MTP_RESPONSE_OK) { 836f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood return result; 837f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood } 838f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood info.mCompressedSize = (length > 0xFFFFFFFFLL ? 0xFFFFFFFF : (uint32_t)length); 839d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 840d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 841f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood if (!env->CallBooleanMethod(mDatabase, method_getObjectInfo, 842f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood (jint)handle, mIntBuffer, mStringBuffer, mLongBuffer)) { 843d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_INVALID_OBJECT_HANDLE; 844f6f16614574767263fcd0073f72c099edaca0607Mike Lockwood } 845d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 846d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint* intValues = env->GetIntArrayElements(mIntBuffer, 0); 8479df53fae3afd1c6b5278216be2fd33a255602aefMike Lockwood info.mStorageID = intValues[0]; 8489df53fae3afd1c6b5278216be2fd33a255602aefMike Lockwood info.mFormat = intValues[1]; 8499df53fae3afd1c6b5278216be2fd33a255602aefMike Lockwood info.mParent = intValues[2]; 850d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseIntArrayElements(mIntBuffer, intValues, 0); 851d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 852d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 8531341f1eee3493fc5e263494acb8adebb6f0180b6Mike Lockwood info.mDateCreated = longValues[0]; 8541341f1eee3493fc5e263494acb8adebb6f0180b6Mike Lockwood info.mDateModified = longValues[1]; 855d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 856d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 8575a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampe if ((false)) { 8585a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampe info.mAssociationType = (format == MTP_FORMAT_ASSOCIATION ? 8595a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampe MTP_ASSOCIATION_TYPE_GENERIC_FOLDER : 8605a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampe MTP_ASSOCIATION_TYPE_UNDEFINED); 8615a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampe } 8629df53fae3afd1c6b5278216be2fd33a255602aefMike Lockwood info.mAssociationType = MTP_ASSOCIATION_TYPE_UNDEFINED; 863d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 864d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 865d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang MtpStringBuffer temp(str); 866d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang info.mName = strdup(temp); 867d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 868d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 869c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood // read EXIF data for thumbnail information 8708409c0691fb128fef6244305977342776bddf919Jaesung Chung switch (info.mFormat) { 8718409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_EXIF_JPEG: 8726e18ccee2afd30a1b0874c5e26b2c8289309b432Chong Zhang case MTP_FORMAT_HEIF: 8738409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_JFIF: { 87463f819203de3a029f2397510c48101b343441df3Chong Zhang ExifData *exifdata; 87563f819203de3a029f2397510c48101b343441df3Chong Zhang if (info.mFormat == MTP_FORMAT_HEIF) { 87663f819203de3a029f2397510c48101b343441df3Chong Zhang exifdata = getExifFromExtractor(path); 87763f819203de3a029f2397510c48101b343441df3Chong Zhang } else { 87863f819203de3a029f2397510c48101b343441df3Chong Zhang exifdata = exif_data_new_from_file(path); 87963f819203de3a029f2397510c48101b343441df3Chong Zhang } 8808409c0691fb128fef6244305977342776bddf919Jaesung Chung if (exifdata) { 8818409c0691fb128fef6244305977342776bddf919Jaesung Chung if ((false)) { 8828409c0691fb128fef6244305977342776bddf919Jaesung Chung exif_data_foreach_content(exifdata, foreachcontent, NULL); 8838409c0691fb128fef6244305977342776bddf919Jaesung Chung } 8843cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen 8858409c0691fb128fef6244305977342776bddf919Jaesung Chung ExifEntry *w = exif_content_get_entry( 8868409c0691fb128fef6244305977342776bddf919Jaesung Chung exifdata->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_X_DIMENSION); 8878409c0691fb128fef6244305977342776bddf919Jaesung Chung ExifEntry *h = exif_content_get_entry( 8888409c0691fb128fef6244305977342776bddf919Jaesung Chung exifdata->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_Y_DIMENSION); 8898409c0691fb128fef6244305977342776bddf919Jaesung Chung info.mThumbCompressedSize = exifdata->data ? exifdata->size : 0; 8908409c0691fb128fef6244305977342776bddf919Jaesung Chung info.mThumbFormat = MTP_FORMAT_EXIF_JPEG; 8918409c0691fb128fef6244305977342776bddf919Jaesung Chung info.mImagePixWidth = w ? getLongFromExifEntry(w) : 0; 8928409c0691fb128fef6244305977342776bddf919Jaesung Chung info.mImagePixHeight = h ? getLongFromExifEntry(h) : 0; 8938409c0691fb128fef6244305977342776bddf919Jaesung Chung exif_data_unref(exifdata); 8948409c0691fb128fef6244305977342776bddf919Jaesung Chung } 8958409c0691fb128fef6244305977342776bddf919Jaesung Chung break; 8968409c0691fb128fef6244305977342776bddf919Jaesung Chung } 8978409c0691fb128fef6244305977342776bddf919Jaesung Chung 8988409c0691fb128fef6244305977342776bddf919Jaesung Chung // Except DNG, all supported RAW image formats are not defined in PTP 1.2 specification. 8998409c0691fb128fef6244305977342776bddf919Jaesung Chung // Most of RAW image formats are based on TIFF or TIFF/EP. To render Fuji's RAF format, 9008409c0691fb128fef6244305977342776bddf919Jaesung Chung // it checks MTP_FORMAT_DEFINED case since it's designed as a custom format. 9018409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_DNG: 9028409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_TIFF: 9038409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_TIFF_EP: 9048409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_DEFINED: { 905d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang String8 temp(path); 906d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang std::unique_ptr<FileStream> stream(new FileStream(temp)); 9078409c0691fb128fef6244305977342776bddf919Jaesung Chung piex::PreviewImageData image_data; 908d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang if (!GetExifFromRawImage(stream.get(), temp, image_data)) { 9098409c0691fb128fef6244305977342776bddf919Jaesung Chung // Couldn't parse EXIF data from a image file via piex. 9108409c0691fb128fef6244305977342776bddf919Jaesung Chung break; 9115a15d0d31b877ef512b3379eac033c6bb041c86aAndreas Gampe } 9123cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen 913fd3446e0aa62ff1af3cfd068ed5910575a5907b8Jaesung Chung info.mThumbCompressedSize = image_data.thumbnail.length; 9143cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen info.mThumbFormat = MTP_FORMAT_EXIF_JPEG; 9158409c0691fb128fef6244305977342776bddf919Jaesung Chung info.mImagePixWidth = image_data.full_width; 9168409c0691fb128fef6244305977342776bddf919Jaesung Chung info.mImagePixHeight = image_data.full_height; 9178409c0691fb128fef6244305977342776bddf919Jaesung Chung 9188409c0691fb128fef6244305977342776bddf919Jaesung Chung break; 919c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood } 920c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood } 921c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood 9220a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 923d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_OK; 924d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 925d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 926f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangvoid* MtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) { 927d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang MtpStringBuffer path; 928c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood int64_t length; 929c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood MtpObjectFormat format; 930c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood void* result = NULL; 931c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood outThumbSize = 0; 932c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood 9338409c0691fb128fef6244305977342776bddf919Jaesung Chung if (getObjectFilePath(handle, path, length, format) == MTP_RESPONSE_OK) { 9348409c0691fb128fef6244305977342776bddf919Jaesung Chung switch (format) { 9358409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_EXIF_JPEG: 9366e18ccee2afd30a1b0874c5e26b2c8289309b432Chong Zhang case MTP_FORMAT_HEIF: 9378409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_JFIF: { 93863f819203de3a029f2397510c48101b343441df3Chong Zhang ExifData *exifdata; 93963f819203de3a029f2397510c48101b343441df3Chong Zhang if (format == MTP_FORMAT_HEIF) { 94063f819203de3a029f2397510c48101b343441df3Chong Zhang exifdata = getExifFromExtractor(path); 94163f819203de3a029f2397510c48101b343441df3Chong Zhang } else { 94263f819203de3a029f2397510c48101b343441df3Chong Zhang exifdata = exif_data_new_from_file(path); 94363f819203de3a029f2397510c48101b343441df3Chong Zhang } 9448409c0691fb128fef6244305977342776bddf919Jaesung Chung if (exifdata) { 9458409c0691fb128fef6244305977342776bddf919Jaesung Chung if (exifdata->data) { 9468409c0691fb128fef6244305977342776bddf919Jaesung Chung result = malloc(exifdata->size); 9478409c0691fb128fef6244305977342776bddf919Jaesung Chung if (result) { 9488409c0691fb128fef6244305977342776bddf919Jaesung Chung memcpy(result, exifdata->data, exifdata->size); 9498409c0691fb128fef6244305977342776bddf919Jaesung Chung outThumbSize = exifdata->size; 9508409c0691fb128fef6244305977342776bddf919Jaesung Chung } 9518409c0691fb128fef6244305977342776bddf919Jaesung Chung } 9528409c0691fb128fef6244305977342776bddf919Jaesung Chung exif_data_unref(exifdata); 9538409c0691fb128fef6244305977342776bddf919Jaesung Chung } 9548409c0691fb128fef6244305977342776bddf919Jaesung Chung break; 9558409c0691fb128fef6244305977342776bddf919Jaesung Chung } 9568409c0691fb128fef6244305977342776bddf919Jaesung Chung 9578409c0691fb128fef6244305977342776bddf919Jaesung Chung // See the above comment on getObjectInfo() method. 9588409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_DNG: 9598409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_TIFF: 9608409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_TIFF_EP: 9618409c0691fb128fef6244305977342776bddf919Jaesung Chung case MTP_FORMAT_DEFINED: { 962d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang String8 temp(path); 963d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang std::unique_ptr<FileStream> stream(new FileStream(temp)); 9648409c0691fb128fef6244305977342776bddf919Jaesung Chung piex::PreviewImageData image_data; 965d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang if (!GetExifFromRawImage(stream.get(), temp, image_data)) { 9668409c0691fb128fef6244305977342776bddf919Jaesung Chung // Couldn't parse EXIF data from a image file via piex. 9678409c0691fb128fef6244305977342776bddf919Jaesung Chung break; 9688409c0691fb128fef6244305977342776bddf919Jaesung Chung } 9698409c0691fb128fef6244305977342776bddf919Jaesung Chung 970742e89f67df160475a157af375c5ab72bba0c308Jaesung Chung if (image_data.thumbnail.length == 0 97182c2ce1d16f9f2775791c13347a8f5c6759de2e2Insun Kang || image_data.thumbnail.format != ::piex::Image::kJpegCompressed) { 972742e89f67df160475a157af375c5ab72bba0c308Jaesung Chung // No thumbnail or non jpeg thumbnail. 9738409c0691fb128fef6244305977342776bddf919Jaesung Chung break; 9748409c0691fb128fef6244305977342776bddf919Jaesung Chung } 9753cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen 976fd3446e0aa62ff1af3cfd068ed5910575a5907b8Jaesung Chung result = malloc(image_data.thumbnail.length); 9773cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen if (result) { 9788409c0691fb128fef6244305977342776bddf919Jaesung Chung piex::Error err = stream.get()->GetData( 979fd3446e0aa62ff1af3cfd068ed5910575a5907b8Jaesung Chung image_data.thumbnail.offset, 980fd3446e0aa62ff1af3cfd068ed5910575a5907b8Jaesung Chung image_data.thumbnail.length, 9818409c0691fb128fef6244305977342776bddf919Jaesung Chung (std::uint8_t *)result); 9828409c0691fb128fef6244305977342776bddf919Jaesung Chung if (err == piex::Error::kOk) { 983fd3446e0aa62ff1af3cfd068ed5910575a5907b8Jaesung Chung outThumbSize = image_data.thumbnail.length; 9848409c0691fb128fef6244305977342776bddf919Jaesung Chung } else { 9858409c0691fb128fef6244305977342776bddf919Jaesung Chung free(result); 986e6b98532ee03d0ac1ca93382699893172454a946Chong Zhang result = NULL; 9878409c0691fb128fef6244305977342776bddf919Jaesung Chung } 9883cd393c5051ce26c8030736f5524962d98abe849Marco Nelissen } 9898409c0691fb128fef6244305977342776bddf919Jaesung Chung break; 990c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood } 991c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood } 992c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood } 993c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood 994c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood return result; 995c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood} 996c89f22242b955ae748765b3465b819b40f70ee5fMike Lockwood 997f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::getObjectFilePath(MtpObjectHandle handle, 998d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang MtpStringBuffer& outFilePath, 999486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono int64_t& outFileLength, 1000486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectFormat& outFormat) { 1001d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 100259c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood jint result = env->CallIntMethod(mDatabase, method_getObjectFilePath, 1003d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)handle, mStringBuffer, mLongBuffer); 100459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (result != MTP_RESPONSE_OK) { 100559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 100659c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood return result; 100759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 1008d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1009d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 1010d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang outFilePath.set(str); 1011d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 1012d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1013d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 1014365e03e4943b2d2f4d1e602409ab0e770ea77d1dMike Lockwood outFileLength = longValues[0]; 1015365e03e4943b2d2f4d1e602409ab0e770ea77d1dMike Lockwood outFormat = longValues[1]; 1016d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 101715dd15fd572df6b6f785dff75f66e9b99f40322aElliott Hughes 10180a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 101959c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood return result; 1020d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1021d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1022f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::beginDeleteObject(MtpObjectHandle handle) { 1023d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 1024f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpResponseCode result = env->CallIntMethod(mDatabase, method_beginDeleteObject, (jint)handle); 10250a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 10260a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 10270a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 1028d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1029d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1030f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangvoid MtpDatabase::endDeleteObject(MtpObjectHandle handle, bool succeeded) { 1031f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang JNIEnv* env = AndroidRuntime::getJNIEnv(); 1032f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->CallVoidMethod(mDatabase, method_endDeleteObject, (jint)handle, (jboolean) succeeded); 1033f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1034f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang checkAndClearExceptionFromCallback(env, __FUNCTION__); 1035f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang} 1036f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1037f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::beginMoveObject(MtpObjectHandle handle, MtpObjectHandle newParent, 1038f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID newStorage) { 1039f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang JNIEnv* env = AndroidRuntime::getJNIEnv(); 1040f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpResponseCode result = env->CallIntMethod(mDatabase, method_beginMoveObject, 1041f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang (jint)handle, (jint)newParent, (jint) newStorage); 1042f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1043f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang checkAndClearExceptionFromCallback(env, __FUNCTION__); 1044f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang return result; 1045f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang} 1046f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1047f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangvoid MtpDatabase::endMoveObject(MtpObjectHandle oldParent, MtpObjectHandle newParent, 1048f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID oldStorage, MtpStorageID newStorage, 1049f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpObjectHandle handle, bool succeeded) { 1050f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang JNIEnv* env = AndroidRuntime::getJNIEnv(); 1051f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->CallVoidMethod(mDatabase, method_endMoveObject, 1052f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang (jint)oldParent, (jint) newParent, (jint) oldStorage, (jint) newStorage, 1053f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang (jint) handle, (jboolean) succeeded); 1054f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1055f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang checkAndClearExceptionFromCallback(env, __FUNCTION__); 1056f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang} 1057f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1058f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::beginCopyObject(MtpObjectHandle handle, MtpObjectHandle newParent, 1059f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpStorageID newStorage) { 1060952558d4e5a51b5f69c7c0bc1e3d7fa8da1cbf3cJerry Zhang JNIEnv* env = AndroidRuntime::getJNIEnv(); 1061f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpResponseCode result = env->CallIntMethod(mDatabase, method_beginCopyObject, 1062f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang (jint)handle, (jint)newParent, (jint) newStorage); 1063952558d4e5a51b5f69c7c0bc1e3d7fa8da1cbf3cJerry Zhang 1064952558d4e5a51b5f69c7c0bc1e3d7fa8da1cbf3cJerry Zhang checkAndClearExceptionFromCallback(env, __FUNCTION__); 1065952558d4e5a51b5f69c7c0bc1e3d7fa8da1cbf3cJerry Zhang return result; 1066952558d4e5a51b5f69c7c0bc1e3d7fa8da1cbf3cJerry Zhang} 1067952558d4e5a51b5f69c7c0bc1e3d7fa8da1cbf3cJerry Zhang 1068f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangvoid MtpDatabase::endCopyObject(MtpObjectHandle handle, bool succeeded) { 1069f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang JNIEnv* env = AndroidRuntime::getJNIEnv(); 1070f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->CallVoidMethod(mDatabase, method_endCopyObject, (jint)handle, (jboolean)succeeded); 1071f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1072f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang checkAndClearExceptionFromCallback(env, __FUNCTION__); 1073f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang} 1074f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1075f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 1076d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstruct PropertyTableEntry { 1077d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property; 1078d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int type; 1079d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 1080d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 108159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwoodstatic const PropertyTableEntry kObjectPropertyTable[] = { 1082d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32 }, 1083d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16 }, 1084d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16 }, 1085d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64 }, 1086d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR }, 1087d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR }, 1088d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32 }, 1089d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_PERSISTENT_UID, MTP_TYPE_UINT128 }, 1090d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood { MTP_PROPERTY_NAME, MTP_TYPE_STR }, 1091ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_DISPLAY_NAME, MTP_TYPE_STR }, 1092ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_DATE_ADDED, MTP_TYPE_STR }, 1093ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_ARTIST, MTP_TYPE_STR }, 1094ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_ALBUM_NAME, MTP_TYPE_STR }, 1095ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_ALBUM_ARTIST, MTP_TYPE_STR }, 1096ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_TRACK, MTP_TYPE_UINT16 }, 1097ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_TYPE_STR }, 1098ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_GENRE, MTP_TYPE_STR }, 1099ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_COMPOSER, MTP_TYPE_STR }, 1100ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_DURATION, MTP_TYPE_UINT32 }, 1101ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood { MTP_PROPERTY_DESCRIPTION, MTP_TYPE_STR }, 110271827748105252791854b87da8e0e0c66ff0d2cbMike Lockwood { MTP_PROPERTY_AUDIO_WAVE_CODEC, MTP_TYPE_UINT32 }, 110371827748105252791854b87da8e0e0c66ff0d2cbMike Lockwood { MTP_PROPERTY_BITRATE_TYPE, MTP_TYPE_UINT16 }, 110471827748105252791854b87da8e0e0c66ff0d2cbMike Lockwood { MTP_PROPERTY_AUDIO_BITRATE, MTP_TYPE_UINT32 }, 110571827748105252791854b87da8e0e0c66ff0d2cbMike Lockwood { MTP_PROPERTY_NUMBER_OF_CHANNELS,MTP_TYPE_UINT16 }, 110671827748105252791854b87da8e0e0c66ff0d2cbMike Lockwood { MTP_PROPERTY_SAMPLE_RATE, MTP_TYPE_UINT32 }, 1107d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 1108d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 110959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwoodstatic const PropertyTableEntry kDevicePropertyTable[] = { 1110ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood { MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, MTP_TYPE_STR }, 1111ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood { MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, MTP_TYPE_STR }, 1112ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood { MTP_DEVICE_PROPERTY_IMAGE_SIZE, MTP_TYPE_STR }, 111356c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood { MTP_DEVICE_PROPERTY_BATTERY_LEVEL, MTP_TYPE_UINT8 }, 111413bb2f4ddadcfee8e82a0eea3cb76a2448bb2ccbJerry Zhang { MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE, MTP_TYPE_UINT32 }, 111559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood}; 111659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 1117f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangbool MtpDatabase::getObjectPropertyInfo(MtpObjectProperty property, int& type) { 111859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood int count = sizeof(kObjectPropertyTable) / sizeof(kObjectPropertyTable[0]); 111959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood const PropertyTableEntry* entry = kObjectPropertyTable; 112059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood for (int i = 0; i < count; i++, entry++) { 112159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood if (entry->property == property) { 112259e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood type = entry->type; 112359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return true; 112459e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 112559e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 112659e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return false; 112759e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood} 112859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 1129f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhangbool MtpDatabase::getDevicePropertyInfo(MtpDeviceProperty property, int& type) { 113059e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood int count = sizeof(kDevicePropertyTable) / sizeof(kDevicePropertyTable[0]); 113159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood const PropertyTableEntry* entry = kDevicePropertyTable; 1132d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood for (int i = 0; i < count; i++, entry++) { 1133d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (entry->property == property) { 1134d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood type = entry->type; 1135d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return true; 1136d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 1137d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 1138d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return false; 1139d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1140d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1141f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpObjectHandleList* MtpDatabase::getObjectReferences(MtpObjectHandle handle) { 11429a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 11439a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectReferences, 11449a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood (jint)handle); 11459a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (!array) 11469a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return NULL; 11479a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood MtpObjectHandleList* list = new MtpObjectHandleList(); 11489a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 11499a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jsize length = env->GetArrayLength(array); 11509a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < length; i++) 1151d9f3005fc3d3e6544e5e94052d9229413b0181d1Jerry Zhang list->push_back(handles[i]); 11520a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 11538839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(array); 11540a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 11550a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 11560a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 11579a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood} 11589a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1159f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpResponseCode MtpDatabase::setObjectReferences(MtpObjectHandle handle, 1160486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectHandleList* references) { 11619a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 11629a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood int count = references->size(); 11639a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jintArray array = env->NewIntArray(count); 11649a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (!array) { 11653762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("out of memory in setObjectReferences"); 11669a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return false; 11679a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 11689a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 11699a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < count; i++) 11709a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood handles[i] = (*references)[i]; 11719a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 11720a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood MtpResponseCode result = env->CallIntMethod(mDatabase, method_setObjectReferences, 11739a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood (jint)handle, array); 11748839471f4d83238f9c017142dcbe3f915f3213fbMike Lockwood env->DeleteLocalRef(array); 11759a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 11760a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 11770a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 1178d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1179d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1180f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpProperty* MtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, 1181486ad2e73c1c24c0585d414b18bd623c54ac1547Daichi Hirono MtpObjectFormat format) { 118292b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood static const int channelEnum[] = { 118392b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 1, // mono 118492b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 2, // stereo 118592b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 3, // 2.1 118692b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 4, // 3 118792b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 5, // 3.1 118892b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 6, // 4 118992b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 7, // 4.1 119092b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 8, // 5 119192b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 9, // 5.1 119292b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood }; 119392b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood static const int bitrateEnum[] = { 119492b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 1, // fixed rate 119592b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 2, // variable rate 119692b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood }; 119792b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood 1198828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpProperty* result = NULL; 1199828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood switch (property) { 1200828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_OBJECT_FORMAT: 12019b5e9c407d35eab4f37c208d81bdf0b8bcdbdf93Mike Lockwood // use format as default value 12029b5e9c407d35eab4f37c208d81bdf0b8bcdbdf93Mike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT16, false, format); 12039b5e9c407d35eab4f37c208d81bdf0b8bcdbdf93Mike Lockwood break; 1204828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_PROTECTION_STATUS: 1205ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_TRACK: 1206828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT16); 1207828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 1208828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_STORAGE_ID: 1209828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_PARENT_OBJECT: 1210ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_DURATION: 121192b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood case MTP_PROPERTY_AUDIO_WAVE_CODEC: 1212828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT32); 1213828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 1214828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_OBJECT_SIZE: 1215828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT64); 1216828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 1217828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_PERSISTENT_UID: 1218828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT128); 1219828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 1220d3bfecb0c9bdf3651a06e86c7c8607768a29a9aeMike Lockwood case MTP_PROPERTY_NAME: 1221ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_DISPLAY_NAME: 1222ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_ARTIST: 1223ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_ALBUM_NAME: 1224ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_ALBUM_ARTIST: 1225ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_GENRE: 1226ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_COMPOSER: 1227ae078f7dacdc719d045c2d19bbce019599fec64eMike Lockwood case MTP_PROPERTY_DESCRIPTION: 1228828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_STR); 1229828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 12305b19af05f2c6ad71171f95bdad2484a38b61121fMike Lockwood case MTP_PROPERTY_DATE_MODIFIED: 12315b19af05f2c6ad71171f95bdad2484a38b61121fMike Lockwood case MTP_PROPERTY_DATE_ADDED: 12325b19af05f2c6ad71171f95bdad2484a38b61121fMike Lockwood case MTP_PROPERTY_ORIGINAL_RELEASE_DATE: 12335b19af05f2c6ad71171f95bdad2484a38b61121fMike Lockwood result = new MtpProperty(property, MTP_TYPE_STR); 12345b19af05f2c6ad71171f95bdad2484a38b61121fMike Lockwood result->setFormDateTime(); 12355b19af05f2c6ad71171f95bdad2484a38b61121fMike Lockwood break; 12365ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood case MTP_PROPERTY_OBJECT_FILE_NAME: 12376a6a3aff17e057eeb1457ac4d04ab4b5e8f53abeMike Lockwood // We allow renaming files and folders 12386a6a3aff17e057eeb1457ac4d04ab4b5e8f53abeMike Lockwood result = new MtpProperty(property, MTP_TYPE_STR, true); 12395ebac83e20dadf10bd4a0cee4ddf69d0ec049f98Mike Lockwood break; 124092b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood case MTP_PROPERTY_BITRATE_TYPE: 124192b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT16); 124292b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result->setFormEnum(bitrateEnum, sizeof(bitrateEnum)/sizeof(bitrateEnum[0])); 124392b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood break; 124492b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood case MTP_PROPERTY_AUDIO_BITRATE: 124592b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT32); 124692b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result->setFormRange(1, 1536000, 1); 124792b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood break; 124892b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood case MTP_PROPERTY_NUMBER_OF_CHANNELS: 124992b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT16); 125092b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result->setFormEnum(channelEnum, sizeof(channelEnum)/sizeof(channelEnum[0])); 125192b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood break; 125292b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood case MTP_PROPERTY_SAMPLE_RATE: 125392b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT32); 125492b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood result->setFormRange(8000, 48000, 1); 125592b53bc2dd42a3c1d2d7708145099da2a5fe541eMike Lockwood break; 1256828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood } 1257828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 1258828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return result; 1259828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 1260828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 1261f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry ZhangMtpProperty* MtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { 1262ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 126359e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood MtpProperty* result = NULL; 1264ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood bool writable = false; 1265ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood 1266f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang // get current value 1267f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jint ret = env->CallIntMethod(mDatabase, method_getDeviceProperty, 1268f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang (jint)property, mLongBuffer, mStringBuffer); 1269f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang if (ret == MTP_RESPONSE_OK) { 1270f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang switch (property) { 1271f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: 1272f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: 1273f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang writable = true; 1274f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang // fall through 1275f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_DEVICE_PROPERTY_IMAGE_SIZE: 1276f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang { 1277f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang result = new MtpProperty(property, MTP_TYPE_STR, writable); 1278a2a2128423309641a6b508a15404f3a7e8f3077bMike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 1279a2a2128423309641a6b508a15404f3a7e8f3077bMike Lockwood result->setCurrentValue(str); 1280ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood // for read-only properties it is safe to assume current value is default value 1281ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood if (!writable) 1282ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood result->setDefaultValue(str); 1283a2a2128423309641a6b508a15404f3a7e8f3077bMike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 1284f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 1285a2a2128423309641a6b508a15404f3a7e8f3077bMike Lockwood } 1286f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_DEVICE_PROPERTY_BATTERY_LEVEL: 1287f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang { 1288f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang result = new MtpProperty(property, MTP_TYPE_UINT8); 1289f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jlong* arr = env->GetLongArrayElements(mLongBuffer, 0); 1290f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang result->setFormRange(0, arr[1], 1); 1291f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang result->mCurrentValue.u.u8 = (uint8_t) arr[0]; 1292f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->ReleaseLongArrayElements(mLongBuffer, arr, 0); 1293f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 1294f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang } 1295f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang case MTP_DEVICE_PROPERTY_PERCEIVED_DEVICE_TYPE: 1296f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang { 1297f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang jlong* arr = env->GetLongArrayElements(mLongBuffer, 0); 1298f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang result = new MtpProperty(property, MTP_TYPE_UINT32); 1299f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang result->mCurrentValue.u.u32 = (uint32_t) arr[0]; 1300f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang env->ReleaseLongArrayElements(mLongBuffer, arr, 0); 1301f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang break; 1302f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang } 1303f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang default: 1304f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang ALOGE("Unrecognized property %x", property); 130556c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood } 1306f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang } else { 1307f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang ALOGE("unable to read device property, response: %04X", ret); 130859e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood } 130959e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood 1310ea93fa16b166ff477e9cf6bd3ac67c8fb259fb57Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 131159e3f0db0855567a95f783f6d1ec36a7cfc4ea83Mike Lockwood return result; 1312828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 1313828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 1314d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 1315d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1316d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic void 13170cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodandroid_mtp_MtpDatabase_setup(JNIEnv *env, jobject thiz) 1318d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 1319f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpDatabase* database = new MtpDatabase(env, thiz); 1320e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat env->SetLongField(thiz, field_context, (jlong)database); 1321d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1322d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1323d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1324d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic void 13250cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodandroid_mtp_MtpDatabase_finalize(JNIEnv *env, jobject thiz) 1326d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 1327f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang MtpDatabase* database = (MtpDatabase *)env->GetLongField(thiz, field_context); 1328d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood database->cleanup(env); 1329d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood delete database; 1330e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat env->SetLongField(thiz, field_context, 0); 1331d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 1332d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1333d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 13343159991e586f9e243f60d65a9554828328b00521Mike Lockwoodstatic jstring 1335aeb75fc5a3dc51bf9d5220647a68c48644c66ea8Mark Salyzynandroid_mtp_MtpPropertyGroup_format_date_time(JNIEnv *env, jobject /*thiz*/, jlong seconds) 13363159991e586f9e243f60d65a9554828328b00521Mike Lockwood{ 13373159991e586f9e243f60d65a9554828328b00521Mike Lockwood char date[20]; 13383159991e586f9e243f60d65a9554828328b00521Mike Lockwood formatDateTime(seconds, date, sizeof(date)); 13393159991e586f9e243f60d65a9554828328b00521Mike Lockwood return env->NewStringUTF(date); 13403159991e586f9e243f60d65a9554828328b00521Mike Lockwood} 13413159991e586f9e243f60d65a9554828328b00521Mike Lockwood 1342d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 1343d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 134476f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMtpDatabaseMethods[] = { 13450cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood {"native_setup", "()V", (void *)android_mtp_MtpDatabase_setup}, 13460cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood {"native_finalize", "()V", (void *)android_mtp_MtpDatabase_finalize}, 13477d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood}; 13487d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood 134976f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMtpPropertyGroupMethods[] = { 13503159991e586f9e243f60d65a9554828328b00521Mike Lockwood {"format_date_time", "(J)Ljava/lang/String;", 13510cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood (void *)android_mtp_MtpPropertyGroup_format_date_time}, 1352d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 1353d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1354f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang#define GET_METHOD_ID(name, jclass, signature) \ 1355f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang method_##name = env->GetMethodID(jclass, #name, signature); \ 1356f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang if (method_##name == NULL) { \ 1357f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang ALOGE("Can't find " #name); \ 1358f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang return -1; \ 1359f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang } \ 1360f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang 13610cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodint register_android_mtp_MtpDatabase(JNIEnv *env) 1362d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 1363d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jclass clazz; 1364d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 13650cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood clazz = env->FindClass("android/mtp/MtpDatabase"); 1366d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (clazz == NULL) { 13673762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/mtp/MtpDatabase"); 1368d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 1369d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 1370f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(beginSendObject, clazz, "(Ljava/lang/String;III)I"); 1371f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(endSendObject, clazz, "(IZ)V"); 1372f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(rescanFile, clazz, "(Ljava/lang/String;II)V"); 1373f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getObjectList, clazz, "(III)[I"); 1374f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getNumObjects, clazz, "(III)I"); 1375f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getSupportedPlaybackFormats, clazz, "()[I"); 1376f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getSupportedCaptureFormats, clazz, "()[I"); 1377f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getSupportedObjectProperties, clazz, "(I)[I"); 1378f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getSupportedDeviceProperties, clazz, "()[I"); 1379f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(setObjectProperty, clazz, "(IIJLjava/lang/String;)I"); 1380f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getDeviceProperty, clazz, "(I[J[C)I"); 1381f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(setDeviceProperty, clazz, "(IJLjava/lang/String;)I"); 1382f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getObjectPropertyList, clazz, "(IIIII)Landroid/mtp/MtpPropertyList;"); 1383f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getObjectInfo, clazz, "(I[I[C[J)Z"); 1384f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getObjectFilePath, clazz, "(I[C[J)I"); 1385f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(beginDeleteObject, clazz, "(I)I"); 1386f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(endDeleteObject, clazz, "(IZ)V"); 1387f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(beginMoveObject, clazz, "(III)I"); 1388f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(endMoveObject, clazz, "(IIIIIZ)V"); 1389f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(beginCopyObject, clazz, "(III)I"); 1390f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(endCopyObject, clazz, "(IZ)V"); 1391f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getObjectReferences, clazz, "(I)[I"); 1392f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(setObjectReferences, clazz, "(I[I)I"); 13932837eefc5459427138c080d445bb491c75630163Mike Lockwood 1394e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat field_context = env->GetFieldID(clazz, "mNativeContext", "J"); 1395d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (field_context == NULL) { 13963762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find MtpDatabase.mNativeContext"); 1397d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 1398d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 1399d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 14000cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood clazz = env->FindClass("android/mtp/MtpPropertyList"); 1401e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood if (clazz == NULL) { 14023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/mtp/MtpPropertyList"); 1403e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood return -1; 1404e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood } 1405f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getCode, clazz, "()I"); 1406f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getCount, clazz, "()I"); 1407f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getObjectHandles, clazz, "()[I"); 1408f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getPropertyCodes, clazz, "()[I"); 1409f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getDataTypes, clazz, "()[I"); 1410f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getLongValues, clazz, "()[J"); 1411f9c5c2574d95b6d233ebae8beae110f4e15c52c5Jerry Zhang GET_METHOD_ID(getStringValues, clazz, "()[Ljava/lang/String;"); 1412e2ad6ec1718ef0c0e8230f8f62e7cfefcf598b6aMike Lockwood 14137d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood if (AndroidRuntime::registerNativeMethods(env, 14140cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood "android/mtp/MtpDatabase", gMtpDatabaseMethods, NELEM(gMtpDatabaseMethods))) 14157d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood return -1; 14167d7fb63071ca370f77ed69055ac30341b8388d15Mike Lockwood 1417d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return AndroidRuntime::registerNativeMethods(env, 14180cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood "android/mtp/MtpPropertyGroup", gMtpPropertyGroupMethods, NELEM(gMtpPropertyGroupMethods)); 1419d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 1420