android_mtp_MtpDatabase.cpp revision 2837eefc5459427138c080d445bb491c75630163
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" 19d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 20d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include <stdio.h> 21d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include <assert.h> 22d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include <limits.h> 23d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include <unistd.h> 24d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include <fcntl.h> 25d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 26d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "jni.h" 27d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "JNIHelp.h" 28d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "android_runtime/AndroidRuntime.h" 29d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 30d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "MtpDatabase.h" 31d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "MtpDataPacket.h" 32828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood#include "MtpProperty.h" 33d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "MtpUtils.h" 34d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "mtp.h" 35d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 36d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodusing namespace android; 37d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 38d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 39d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 40d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodstatic jmethodID method_beginSendObject; 41d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodstatic jmethodID method_endSendObject; 42d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectList; 437a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwoodstatic jmethodID method_getNumObjects; 444b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedPlaybackFormats; 454b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedCaptureFormats; 464b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedObjectProperties; 474b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwoodstatic jmethodID method_getSupportedDeviceProperties; 48d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectProperty; 49828d19dd96b05fa99abdc517701e5366543c324fMike Lockwoodstatic jmethodID method_setObjectProperty; 50d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectInfo; 51d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectFilePath; 52d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_deleteFile; 539a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwoodstatic jmethodID method_getObjectReferences; 549a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwoodstatic jmethodID method_setObjectReferences; 552837eefc5459427138c080d445bb491c75630163Mike Lockwoodstatic jmethodID method_sessionStarted; 562837eefc5459427138c080d445bb491c75630163Mike Lockwoodstatic jmethodID method_sessionEnded; 572837eefc5459427138c080d445bb491c75630163Mike Lockwood 58d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jfieldID field_context; 59d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 60d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMtpDatabase* getMtpDatabase(JNIEnv *env, jobject database) { 61d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return (MtpDatabase *)env->GetIntField(database, field_context); 62d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 63d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 64ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#ifdef HAVE_ANDROID_OS 65d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 66d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 67d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodclass MyMtpDatabase : public MtpDatabase { 68d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodprivate: 69d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jobject mDatabase; 70d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray mIntBuffer; 71d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlongArray mLongBuffer; 72d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jcharArray mStringBuffer; 73d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 74d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodpublic: 75d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MyMtpDatabase(JNIEnv *env, jobject client); 76d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual ~MyMtpDatabase(); 77d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood void cleanup(JNIEnv *env); 78d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 79d815f79766984fce499e147ecbacc01914683f74Mike Lockwood virtual MtpObjectHandle beginSendObject(const char* path, 80d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 81d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent, 82d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpStorageID storage, 83d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t size, 84d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood time_t modified); 85d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 86d815f79766984fce499e147ecbacc01914683f74Mike Lockwood virtual void endSendObject(const char* path, 87d815f79766984fce499e147ecbacc01914683f74Mike Lockwood MtpObjectHandle handle, 88d815f79766984fce499e147ecbacc01914683f74Mike Lockwood MtpObjectFormat format, 89d815f79766984fce499e147ecbacc01914683f74Mike Lockwood bool succeeded); 90d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 91d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, 92d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 93d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent); 94d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 957a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood virtual int getNumObjects(MtpStorageID storageID, 967a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectFormat format, 977a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectHandle parent); 987a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood 994b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood // callee should delete[] the results from these 1004b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood // results can be NULL 1014b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpObjectFormatList* getSupportedPlaybackFormats(); 1024b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpObjectFormatList* getSupportedCaptureFormats(); 1034b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpObjectPropertyList* getSupportedObjectProperties(MtpObjectFormat format); 1044b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood virtual MtpDevicePropertyList* getSupportedDeviceProperties(); 1054b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 106828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode getObjectPropertyValue(MtpObjectHandle handle, 107d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property, 108d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet); 109d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 110828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode setObjectPropertyValue(MtpObjectHandle handle, 111828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpObjectProperty property, 112828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet); 113828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 114828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode getDevicePropertyValue(MtpDeviceProperty property, 115828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet); 116828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 117828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode setDevicePropertyValue(MtpDeviceProperty property, 118828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet); 119828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 120828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpResponseCode resetDeviceProperty(MtpDeviceProperty property); 121828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 122d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle, 123d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet); 124d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 12559c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood virtual MtpResponseCode getObjectFilePath(MtpObjectHandle handle, 126d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpString& filePath, 127d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int64_t& fileLength); 12859c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood virtual MtpResponseCode deleteFile(MtpObjectHandle handle); 129d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 130d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood bool getPropertyInfo(MtpObjectProperty property, int& type); 1319a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1329a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood virtual MtpObjectHandleList* getObjectReferences(MtpObjectHandle handle); 1339a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1349a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle, 1359a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood MtpObjectHandleList* references); 136828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 137828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpProperty* getObjectPropertyDesc(MtpObjectProperty property, 138828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpObjectFormat format); 139828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 140828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property); 1412837eefc5459427138c080d445bb491c75630163Mike Lockwood 1422837eefc5459427138c080d445bb491c75630163Mike Lockwood virtual void sessionStarted(); 1432837eefc5459427138c080d445bb491c75630163Mike Lockwood 1442837eefc5459427138c080d445bb491c75630163Mike Lockwood virtual void sessionEnded(); 145d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 146d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1470a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood// ---------------------------------------------------------------------------- 1480a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 1490a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwoodstatic void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 1500a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood if (env->ExceptionCheck()) { 1510a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood LOGE("An exception was thrown by callback '%s'.", methodName); 1520a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood LOGE_EX(env); 1530a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ExceptionClear(); 1540a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood } 1550a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood} 1560a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 1570a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood// ---------------------------------------------------------------------------- 1580a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 159d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMyMtpDatabase::MyMtpDatabase(JNIEnv *env, jobject client) 160d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood : mDatabase(env->NewGlobalRef(client)), 161d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mIntBuffer(NULL), 162d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mLongBuffer(NULL), 163d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mStringBuffer(NULL) 164d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 165d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray intArray; 166d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlongArray longArray; 167d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jcharArray charArray; 168d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 169d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // create buffers for out arguments 170d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // we don't need to be thread-safe so this is OK 171d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood intArray = env->NewIntArray(3); 172d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!intArray) 173d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto out_of_memory; 174d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mIntBuffer = (jintArray)env->NewGlobalRef(intArray); 175d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood longArray = env->NewLongArray(2); 176d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!longArray) 177d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto out_of_memory; 178d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mLongBuffer = (jlongArray)env->NewGlobalRef(longArray); 179d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood charArray = env->NewCharArray(256); 180d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!charArray) 181d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto out_of_memory; 182d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mStringBuffer = (jcharArray)env->NewGlobalRef(charArray); 183d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return; 184d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 185d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodout_of_memory: 186d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), NULL); 187d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 188d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 189d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodvoid MyMtpDatabase::cleanup(JNIEnv *env) { 190d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mDatabase); 191d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mIntBuffer); 192d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mLongBuffer); 193d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mStringBuffer); 194d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 195d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 196d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMyMtpDatabase::~MyMtpDatabase() { 197d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 198d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 199d815f79766984fce499e147ecbacc01914683f74Mike LockwoodMtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, 200d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 201d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent, 202d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpStorageID storage, 203d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t size, 204d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood time_t modified) { 205d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 2060a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject, 2070a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->NewStringUTF(path), (jint)format, (jint)parent, (jint)storage, 2080a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood (jlong)size, (jlong)modified); 2090a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2100a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 2110a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 212d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 213d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 214d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodvoid MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, 215d815f79766984fce499e147ecbacc01914683f74Mike Lockwood MtpObjectFormat format, bool succeeded) { 216d815f79766984fce499e147ecbacc01914683f74Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 217d815f79766984fce499e147ecbacc01914683f74Mike Lockwood env->CallVoidMethod(mDatabase, method_endSendObject, env->NewStringUTF(path), 218d815f79766984fce499e147ecbacc01914683f74Mike Lockwood (jint)handle, (jint)format, (jboolean)succeeded); 2190a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2200a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 221d815f79766984fce499e147ecbacc01914683f74Mike Lockwood} 222d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 223d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, 224d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 225d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent) { 226d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 227d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectList, 228d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)storageID, (jint)format, (jint)parent); 229d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!array) 230d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return NULL; 231d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandleList* list = new MtpObjectHandleList(); 232d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 233d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jsize length = env->GetArrayLength(array); 2347a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood for (int i = 0; i < length; i++) 235d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood list->push(handles[i]); 2360a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 2370a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2380a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 2390a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 240d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 241d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 2427a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwoodint MyMtpDatabase::getNumObjects(MtpStorageID storageID, 2437a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectFormat format, 2447a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectHandle parent) { 2457a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 2460a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood int result = env->CallIntMethod(mDatabase, method_getNumObjects, 2477a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood (jint)storageID, (jint)format, (jint)parent); 2480a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2490a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 2500a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 2517a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood} 2527a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood 2534b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike LockwoodMtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() { 2544b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 2554b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 2564b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedPlaybackFormats); 2574b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 2584b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 2594b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpObjectFormatList* list = new MtpObjectFormatList(); 2604b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* formats = env->GetIntArrayElements(array, 0); 2614b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 2624b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 2634b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood list->push(formats[i]); 2640a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, formats, 0); 2650a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2660a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 2670a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 2684b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 2694b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 2704b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike LockwoodMtpObjectFormatList* MyMtpDatabase::getSupportedCaptureFormats() { 2714b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 2724b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 2734b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedCaptureFormats); 2744b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 2754b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 2764b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpObjectFormatList* list = new MtpObjectFormatList(); 2774b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* formats = env->GetIntArrayElements(array, 0); 2784b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 2794b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 2804b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood list->push(formats[i]); 2810a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, formats, 0); 2820a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 2830a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 2840a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 2854b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 2864b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 2874b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike LockwoodMtpObjectPropertyList* MyMtpDatabase::getSupportedObjectProperties(MtpObjectFormat format) { 2884b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 2894b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 2904b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedObjectProperties, (jint)format); 2914b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 2924b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 2934b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpObjectPropertyList* list = new MtpObjectPropertyList(); 2944b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* properties = env->GetIntArrayElements(array, 0); 2954b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 2964b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 2974b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood list->push(properties[i]); 2980a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, properties, 0); 2990a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3000a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 3010a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 3024b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 3034b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 3044b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike LockwoodMtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() { 3054b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3064b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, 3074b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedDeviceProperties); 3084b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (!array) 3094b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return NULL; 3104b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood MtpDevicePropertyList* list = new MtpDevicePropertyList(); 3114b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jint* properties = env->GetIntArrayElements(array, 0); 3124b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood jsize length = env->GetArrayLength(array); 3134b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood for (int i = 0; i < length; i++) 3144b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood list->push(properties[i]); 3150a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, properties, 0); 3160a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3170a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 3180a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 3194b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood} 3204b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood 321828d19dd96b05fa99abdc517701e5366543c324fMike LockwoodMtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle, 322d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property, 323d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet) { 324d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int type; 325d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 326d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!getPropertyInfo(property, type)) 327d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_INVALID_OBJECT_PROP_CODE; 328d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 329d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 330d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint result = env->CallIntMethod(mDatabase, method_getObjectProperty, 331d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)handle, (jint)property, mLongBuffer, mStringBuffer); 332d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (result != MTP_RESPONSE_OK) 333d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return result; 334d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 335d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 336d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong longValue = longValues[0]; 337d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 338d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 339828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood // special case MTP_PROPERTY_DATE_MODIFIED, which is a string to MTP 340828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood // but stored internally as a uint64 341828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood if (property == MTP_PROPERTY_DATE_MODIFIED) { 342828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood char date[20]; 343828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood formatDateTime(longValue, date, sizeof(date)); 344828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood packet.putString(date); 345828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return MTP_RESPONSE_OK; 346828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood } 347828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 348d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood switch (type) { 349d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT8: 350d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt8(longValue); 351d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 352d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT8: 353d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt8(longValue); 354d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 355d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT16: 356d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt16(longValue); 357d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 358d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT16: 359d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(longValue); 360d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 361d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT32: 362d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt32(longValue); 363d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 364d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT32: 365d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(longValue); 366d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 367d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT64: 368d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt64(longValue); 369d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 370d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT64: 371d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt64(longValue); 372d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 373828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_TYPE_INT128: 374828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood packet.putInt128(longValue); 375828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 376828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_TYPE_UINT128: 377828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood packet.putInt128(longValue); 378828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 379d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_STR: 380d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { 381d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 382d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putString(str); 383d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 384d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 385d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 386d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood default: 387d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("unsupported object type\n"); 388d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_INVALID_OBJECT_HANDLE; 389d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 3900a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 3910a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 392d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_OK; 393d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 394d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 395828d19dd96b05fa99abdc517701e5366543c324fMike LockwoodMtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle, 396828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpObjectProperty property, 397828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet) { 398828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return -1; 399828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 400828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 401828d19dd96b05fa99abdc517701e5366543c324fMike LockwoodMtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property, 402828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet) { 403828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return -1; 404828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 405828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 406828d19dd96b05fa99abdc517701e5366543c324fMike LockwoodMtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property, 407828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpDataPacket& packet) { 408828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return -1; 409828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 410828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 411828d19dd96b05fa99abdc517701e5366543c324fMike LockwoodMtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty property) { 412828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return -1; 413828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 414828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 415d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, 416d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet) { 417d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood char date[20]; 418d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 419d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 420d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jboolean result = env->CallBooleanMethod(mDatabase, method_getObjectInfo, 421d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)handle, mIntBuffer, mStringBuffer, mLongBuffer); 422d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!result) 423d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_INVALID_OBJECT_HANDLE; 424d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 425d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint* intValues = env->GetIntArrayElements(mIntBuffer, 0); 426d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpStorageID storageID = intValues[0]; 427d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format = intValues[1]; 428d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent = intValues[2]; 429d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseIntArrayElements(mIntBuffer, intValues, 0); 430d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 431d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 432d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t size = longValues[0]; 433d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t modified = longValues[1]; 434d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 435d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 436828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood// int associationType = (format == MTP_FORMAT_ASSOCIATION ? 437828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood// MTP_ASSOCIATION_TYPE_GENERIC_FOLDER : 438828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood// MTP_ASSOCIATION_TYPE_UNDEFINED); 439828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood int associationType = MTP_ASSOCIATION_TYPE_UNDEFINED; 440d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 441d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(storageID); 442d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(format); 443d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(0); // protection status 444d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32((size > 0xFFFFFFFFLL ? 0xFFFFFFFF : size)); 445d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(0); // thumb format 446d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // thumb compressed size 447d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // thumb pix width 448d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // thumb pix height 449d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // image pix width 450d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // image pix height 451d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // image bit depth 452d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(parent); 453d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(associationType); 454d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // association desc 455d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // sequence number 456d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 457d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 458d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putString(str); // file name 459d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 460d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 461d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putEmptyString(); 462d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood formatDateTime(modified, date, sizeof(date)); 463d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putString(date); // date modified 464d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putEmptyString(); // keywords 465d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 4660a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 467d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_OK; 468d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 469d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 47059c777a24a2c639dfd84b7bf17e430e6d3424866Mike LockwoodMtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, 471d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpString& filePath, 472d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int64_t& fileLength) { 473d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 47459c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood jint result = env->CallIntMethod(mDatabase, method_getObjectFilePath, 475d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)handle, mStringBuffer, mLongBuffer); 47659c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood if (result != MTP_RESPONSE_OK) 47759c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood return result; 478d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 479d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 480d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood filePath.setTo(str, strlen16(str)); 481d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 482d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 483d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 484d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood fileLength = longValues[0]; 485d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 486d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 4870a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 48859c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood return result; 489d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 490d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 49159c777a24a2c639dfd84b7bf17e430e6d3424866Mike LockwoodMtpResponseCode MyMtpDatabase::deleteFile(MtpObjectHandle handle) { 492d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 4930a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood MtpResponseCode result = env->CallIntMethod(mDatabase, method_deleteFile, (jint)handle); 4940a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 4950a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 4960a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 497d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 498d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 499d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstruct PropertyTableEntry { 500d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property; 501d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int type; 502d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 503d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 504d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic const PropertyTableEntry kPropertyTable[] = { 505d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32 }, 506d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32 }, 507c642e8a44c3dece488f488481fb69eeebd2f3554Mike Lockwood { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16 }, 508d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR }, 509d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64 }, 510d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR }, 511d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 512d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 513d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodbool MyMtpDatabase::getPropertyInfo(MtpObjectProperty property, int& type) { 514d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int count = sizeof(kPropertyTable) / sizeof(kPropertyTable[0]); 515d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood const PropertyTableEntry* entry = kPropertyTable; 516d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood for (int i = 0; i < count; i++, entry++) { 517d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (entry->property == property) { 518d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood type = entry->type; 519d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return true; 520d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 521d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 522d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return false; 523d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 524d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 5259a2046fb5ceeee4d5334274cbff15f1058bb3244Mike LockwoodMtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) { 5269a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 5279a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectReferences, 5289a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood (jint)handle); 5299a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (!array) 5309a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return NULL; 5319a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood MtpObjectHandleList* list = new MtpObjectHandleList(); 5329a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 5339a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jsize length = env->GetArrayLength(array); 5349a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < length; i++) 5359a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood list->push(handles[i]); 5360a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 5370a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood 5380a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 5390a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return list; 5409a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood} 5419a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 5420a7fa0a868ccce920827e141cbbe237594e53364Mike LockwoodMtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, 5430a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood MtpObjectHandleList* references) { 5449a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 5459a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood int count = references->size(); 5469a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jintArray array = env->NewIntArray(count); 5479a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (!array) { 5489a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood LOGE("out of memory in setObjectReferences"); 5499a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return false; 5509a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 5519a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 5529a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < count; i++) 5539a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood handles[i] = (*references)[i]; 5549a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 5550a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood MtpResponseCode result = env->CallIntMethod(mDatabase, method_setObjectReferences, 5569a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood (jint)handle, array); 5579a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 5580a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 5590a7fa0a868ccce920827e141cbbe237594e53364Mike Lockwood return result; 560d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 561d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 562828d19dd96b05fa99abdc517701e5366543c324fMike LockwoodMtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, 563828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpObjectFormat format) { 564828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood MtpProperty* result = NULL; 565828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood switch (property) { 566828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_OBJECT_FORMAT: 567828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_PROTECTION_STATUS: 568828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT16); 569828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 570828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_STORAGE_ID: 571828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_PARENT_OBJECT: 572828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT32); 573828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 574828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_OBJECT_SIZE: 575828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT64); 576828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 577828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_PERSISTENT_UID: 578828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_UINT128); 579828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 580828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_OBJECT_FILE_NAME: 581828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood case MTP_PROPERTY_DATE_MODIFIED: 582828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood result = new MtpProperty(property, MTP_TYPE_STR); 583828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood break; 584828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood } 585828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 586828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return result; 587828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 588828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 589828d19dd96b05fa99abdc517701e5366543c324fMike LockwoodMtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { 590828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood return NULL; 591828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood} 592828d19dd96b05fa99abdc517701e5366543c324fMike Lockwood 5932837eefc5459427138c080d445bb491c75630163Mike Lockwoodvoid MyMtpDatabase::sessionStarted() { 5942837eefc5459427138c080d445bb491c75630163Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 5952837eefc5459427138c080d445bb491c75630163Mike Lockwood env->CallVoidMethod(mDatabase, method_sessionStarted); 5962837eefc5459427138c080d445bb491c75630163Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 5972837eefc5459427138c080d445bb491c75630163Mike Lockwood} 5982837eefc5459427138c080d445bb491c75630163Mike Lockwood 5992837eefc5459427138c080d445bb491c75630163Mike Lockwoodvoid MyMtpDatabase::sessionEnded() { 6002837eefc5459427138c080d445bb491c75630163Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 6012837eefc5459427138c080d445bb491c75630163Mike Lockwood env->CallVoidMethod(mDatabase, method_sessionEnded); 6022837eefc5459427138c080d445bb491c75630163Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 6032837eefc5459427138c080d445bb491c75630163Mike Lockwood} 6042837eefc5459427138c080d445bb491c75630163Mike Lockwood 605ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#endif // HAVE_ANDROID_OS 606ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood 607d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 608d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 609d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic void 610d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodandroid_media_MtpDatabase_setup(JNIEnv *env, jobject thiz) 611d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 612ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#ifdef HAVE_ANDROID_OS 613d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGD("setup\n"); 614d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MyMtpDatabase* database = new MyMtpDatabase(env, thiz); 615d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->SetIntField(thiz, field_context, (int)database); 616d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 617ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#endif 618d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 619d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 620d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic void 621d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodandroid_media_MtpDatabase_finalize(JNIEnv *env, jobject thiz) 622d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 623ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#ifdef HAVE_ANDROID_OS 624d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGD("finalize\n"); 625d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MyMtpDatabase* database = (MyMtpDatabase *)env->GetIntField(thiz, field_context); 626d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood database->cleanup(env); 627d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood delete database; 628d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->SetIntField(thiz, field_context, 0); 629d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 630ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#endif 631d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 632d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 633d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 634d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 635d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic JNINativeMethod gMethods[] = { 636d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood {"native_setup", "()V", (void *)android_media_MtpDatabase_setup}, 637d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood {"native_finalize", "()V", (void *)android_media_MtpDatabase_finalize}, 638d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 639d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 640d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic const char* const kClassPathName = "android/media/MtpDatabase"; 641d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 642d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodint register_android_media_MtpDatabase(JNIEnv *env) 643d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 644d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jclass clazz; 645d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 646d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGD("register_android_media_MtpDatabase\n"); 647d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 648d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood clazz = env->FindClass("android/media/MtpDatabase"); 649d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (clazz == NULL) { 650d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find android/media/MtpDatabase"); 651d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 652d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 653d815f79766984fce499e147ecbacc01914683f74Mike Lockwood method_beginSendObject = env->GetMethodID(clazz, "beginSendObject", "(Ljava/lang/String;IIIJJ)I"); 654d815f79766984fce499e147ecbacc01914683f74Mike Lockwood if (method_beginSendObject == NULL) { 655d815f79766984fce499e147ecbacc01914683f74Mike Lockwood LOGE("Can't find beginSendObject"); 656d815f79766984fce499e147ecbacc01914683f74Mike Lockwood return -1; 657d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } 658d815f79766984fce499e147ecbacc01914683f74Mike Lockwood method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIZ)V"); 659d815f79766984fce499e147ecbacc01914683f74Mike Lockwood if (method_endSendObject == NULL) { 660d815f79766984fce499e147ecbacc01914683f74Mike Lockwood LOGE("Can't find endSendObject"); 661d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 662d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 663d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood method_getObjectList = env->GetMethodID(clazz, "getObjectList", "(III)[I"); 664d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectList == NULL) { 665d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectList"); 666d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 667d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 6687a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood method_getNumObjects = env->GetMethodID(clazz, "getNumObjects", "(III)I"); 6697a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood if (method_getNumObjects == NULL) { 6707a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood LOGE("Can't find getNumObjects"); 6717a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood return -1; 6727a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } 6734b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedPlaybackFormats = env->GetMethodID(clazz, "getSupportedPlaybackFormats", "()[I"); 6744b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (method_getSupportedPlaybackFormats == NULL) { 6754b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood LOGE("Can't find getSupportedPlaybackFormats"); 6764b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return -1; 6774b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 6784b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedCaptureFormats = env->GetMethodID(clazz, "getSupportedCaptureFormats", "()[I"); 6794b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (method_getSupportedCaptureFormats == NULL) { 6804b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood LOGE("Can't find getSupportedCaptureFormats"); 6814b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return -1; 6824b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 6834b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedObjectProperties = env->GetMethodID(clazz, "getSupportedObjectProperties", "(I)[I"); 6844b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (method_getSupportedObjectProperties == NULL) { 6854b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood LOGE("Can't find getSupportedObjectProperties"); 6864b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return -1; 6874b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 6884b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood method_getSupportedDeviceProperties = env->GetMethodID(clazz, "getSupportedDeviceProperties", "()[I"); 6894b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood if (method_getSupportedDeviceProperties == NULL) { 6904b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood LOGE("Can't find getSupportedDeviceProperties"); 6914b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood return -1; 6924b322ce4fb86b5a7a6e50633a3a9f498ca8d4706Mike Lockwood } 693d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood method_getObjectProperty = env->GetMethodID(clazz, "getObjectProperty", "(II[J[C)I"); 694d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectProperty == NULL) { 695d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectProperty"); 696d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 697d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 698d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood method_getObjectInfo = env->GetMethodID(clazz, "getObjectInfo", "(I[I[C[J)Z"); 699d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectInfo == NULL) { 700d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectInfo"); 701d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 702d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 70359c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood method_getObjectFilePath = env->GetMethodID(clazz, "getObjectFilePath", "(I[C[J)I"); 704d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectFilePath == NULL) { 705d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectFilePath"); 706d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 707d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 70859c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood method_deleteFile = env->GetMethodID(clazz, "deleteFile", "(I)I"); 709d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_deleteFile == NULL) { 710d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find deleteFile"); 711d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 712d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 7139a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood method_getObjectReferences = env->GetMethodID(clazz, "getObjectReferences", "(I)[I"); 7149a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (method_getObjectReferences == NULL) { 7159a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood LOGE("Can't find getObjectReferences"); 7169a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return -1; 7179a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 7189a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood method_setObjectReferences = env->GetMethodID(clazz, "setObjectReferences", "(I[I)I"); 7199a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (method_setObjectReferences == NULL) { 7209a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood LOGE("Can't find setObjectReferences"); 7219a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return -1; 7229a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 7232837eefc5459427138c080d445bb491c75630163Mike Lockwood method_sessionStarted = env->GetMethodID(clazz, "sessionStarted", "()V"); 7242837eefc5459427138c080d445bb491c75630163Mike Lockwood if (method_sessionStarted == NULL) { 7252837eefc5459427138c080d445bb491c75630163Mike Lockwood LOGE("Can't find sessionStarted"); 7262837eefc5459427138c080d445bb491c75630163Mike Lockwood return -1; 7272837eefc5459427138c080d445bb491c75630163Mike Lockwood } 7282837eefc5459427138c080d445bb491c75630163Mike Lockwood method_sessionEnded = env->GetMethodID(clazz, "sessionEnded", "()V"); 7292837eefc5459427138c080d445bb491c75630163Mike Lockwood if (method_sessionEnded == NULL) { 7302837eefc5459427138c080d445bb491c75630163Mike Lockwood LOGE("Can't find sessionEnded"); 7312837eefc5459427138c080d445bb491c75630163Mike Lockwood return -1; 7322837eefc5459427138c080d445bb491c75630163Mike Lockwood } 7332837eefc5459427138c080d445bb491c75630163Mike Lockwood 734d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood field_context = env->GetFieldID(clazz, "mNativeContext", "I"); 735d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (field_context == NULL) { 736d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find MtpDatabase.mNativeContext"); 737d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 738d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 739d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 740d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return AndroidRuntime::registerNativeMethods(env, 741d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood "android/media/MtpDatabase", gMethods, NELEM(gMethods)); 742d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 743