android_mtp_MtpDatabase.cpp revision 9a2046fb5ceeee4d5334274cbff15f1058bb3244
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" 32d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "MtpUtils.h" 33d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood#include "mtp.h" 34d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 35d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodusing namespace android; 36d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 37d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 38d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 39d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodstatic jmethodID method_beginSendObject; 40d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodstatic jmethodID method_endSendObject; 41d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectList; 427a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwoodstatic jmethodID method_getNumObjects; 43d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectProperty; 44d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectInfo; 45d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_getObjectFilePath; 46d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jmethodID method_deleteFile; 479a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwoodstatic jmethodID method_getObjectReferences; 489a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwoodstatic jmethodID method_setObjectReferences; 49d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic jfieldID field_context; 50d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 51d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMtpDatabase* getMtpDatabase(JNIEnv *env, jobject database) { 52d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return (MtpDatabase *)env->GetIntField(database, field_context); 53d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 54d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 55ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#ifdef HAVE_ANDROID_OS 56d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 57d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 58d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodclass MyMtpDatabase : public MtpDatabase { 59d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodprivate: 60d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jobject mDatabase; 61d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray mIntBuffer; 62d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlongArray mLongBuffer; 63d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jcharArray mStringBuffer; 64d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 65d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodpublic: 66d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MyMtpDatabase(JNIEnv *env, jobject client); 67d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual ~MyMtpDatabase(); 68d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood void cleanup(JNIEnv *env); 69d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 70d815f79766984fce499e147ecbacc01914683f74Mike Lockwood virtual MtpObjectHandle beginSendObject(const char* path, 71d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 72d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent, 73d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpStorageID storage, 74d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t size, 75d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood time_t modified); 76d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 77d815f79766984fce499e147ecbacc01914683f74Mike Lockwood virtual void endSendObject(const char* path, 78d815f79766984fce499e147ecbacc01914683f74Mike Lockwood MtpObjectHandle handle, 79d815f79766984fce499e147ecbacc01914683f74Mike Lockwood MtpObjectFormat format, 80d815f79766984fce499e147ecbacc01914683f74Mike Lockwood bool succeeded); 81d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 82d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID, 83d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 84d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent); 85d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 867a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood virtual int getNumObjects(MtpStorageID storageID, 877a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectFormat format, 887a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectHandle parent); 897a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood 90d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual MtpResponseCode getObjectProperty(MtpObjectHandle handle, 91d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property, 92d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet); 93d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 94d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle, 95d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet); 96d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 9759c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood virtual MtpResponseCode getObjectFilePath(MtpObjectHandle handle, 98d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpString& filePath, 99d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int64_t& fileLength); 10059c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood virtual MtpResponseCode deleteFile(MtpObjectHandle handle); 101d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 102d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood bool getPropertyInfo(MtpObjectProperty property, int& type); 1039a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1049a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood virtual MtpObjectHandleList* getObjectReferences(MtpObjectHandle handle); 1059a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 1069a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle, 1079a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood MtpObjectHandleList* references); 108d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 109d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 110d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMyMtpDatabase::MyMtpDatabase(JNIEnv *env, jobject client) 111d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood : mDatabase(env->NewGlobalRef(client)), 112d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mIntBuffer(NULL), 113d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mLongBuffer(NULL), 114d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mStringBuffer(NULL) 115d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 116d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray intArray; 117d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlongArray longArray; 118d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jcharArray charArray; 119d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 120d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // create buffers for out arguments 121d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood // we don't need to be thread-safe so this is OK 122d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood intArray = env->NewIntArray(3); 123d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!intArray) 124d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto out_of_memory; 125d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mIntBuffer = (jintArray)env->NewGlobalRef(intArray); 126d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood longArray = env->NewLongArray(2); 127d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!longArray) 128d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto out_of_memory; 129d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mLongBuffer = (jlongArray)env->NewGlobalRef(longArray); 130d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood charArray = env->NewCharArray(256); 131d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!charArray) 132d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto out_of_memory; 133d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood mStringBuffer = (jcharArray)env->NewGlobalRef(charArray); 134d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return; 135d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 136d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodout_of_memory: 137d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), NULL); 138d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 139d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 140d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodvoid MyMtpDatabase::cleanup(JNIEnv *env) { 141d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mDatabase); 142d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mIntBuffer); 143d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mLongBuffer); 144d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->DeleteGlobalRef(mStringBuffer); 145d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 146d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 147d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMyMtpDatabase::~MyMtpDatabase() { 148d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 149d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 150d815f79766984fce499e147ecbacc01914683f74Mike LockwoodMtpObjectHandle MyMtpDatabase::beginSendObject(const char* path, 151d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 152d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent, 153d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpStorageID storage, 154d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t size, 155d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood time_t modified) { 156d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 157d815f79766984fce499e147ecbacc01914683f74Mike Lockwood return env->CallIntMethod(mDatabase, method_beginSendObject, env->NewStringUTF(path), 158d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)format, (jint)parent, (jint)storage, (jlong)size, (jlong)modified); 159d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 160d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 161d815f79766984fce499e147ecbacc01914683f74Mike Lockwoodvoid MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle, 162d815f79766984fce499e147ecbacc01914683f74Mike Lockwood MtpObjectFormat format, bool succeeded) { 163d815f79766984fce499e147ecbacc01914683f74Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 164d815f79766984fce499e147ecbacc01914683f74Mike Lockwood env->CallVoidMethod(mDatabase, method_endSendObject, env->NewStringUTF(path), 165d815f79766984fce499e147ecbacc01914683f74Mike Lockwood (jint)handle, (jint)format, (jboolean)succeeded); 166d815f79766984fce499e147ecbacc01914683f74Mike Lockwood} 167d815f79766984fce499e147ecbacc01914683f74Mike Lockwood 168d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID, 169d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format, 170d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent) { 171d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 172d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectList, 173d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)storageID, (jint)format, (jint)parent); 174d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!array) 175d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return NULL; 176d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandleList* list = new MtpObjectHandleList(); 177d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 178d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jsize length = env->GetArrayLength(array); 1797a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood for (int i = 0; i < length; i++) 180d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood list->push(handles[i]); 181d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 182d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return list; 183d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 184d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 1857a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwoodint MyMtpDatabase::getNumObjects(MtpStorageID storageID, 1867a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectFormat format, 1877a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood MtpObjectHandle parent) { 1887a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 1897a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood return env->CallIntMethod(mDatabase, method_getNumObjects, 1907a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood (jint)storageID, (jint)format, (jint)parent); 1917a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood} 1927a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood 193d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMtpResponseCode MyMtpDatabase::getObjectProperty(MtpObjectHandle handle, 194d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property, 195d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet) { 196d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int type; 197d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 198d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!getPropertyInfo(property, type)) 199d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_INVALID_OBJECT_PROP_CODE; 200d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 201d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 202d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint result = env->CallIntMethod(mDatabase, method_getObjectProperty, 203d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)handle, (jint)property, mLongBuffer, mStringBuffer); 204d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (result != MTP_RESPONSE_OK) 205d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return result; 206d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 207d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 208d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong longValue = longValues[0]; 209d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 210d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 211d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood switch (type) { 212d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT8: 213d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt8(longValue); 214d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 215d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT8: 216d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt8(longValue); 217d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 218d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT16: 219d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt16(longValue); 220d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 221d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT16: 222d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(longValue); 223d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 224d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT32: 225d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt32(longValue); 226d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 227d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT32: 228d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(longValue); 229d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 230d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_INT64: 231d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putInt64(longValue); 232d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 233d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_UINT64: 234d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt64(longValue); 235d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 236d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood case MTP_TYPE_STR: 237d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { 238d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 239d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putString(str); 240d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 241d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood break; 242d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 243d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood default: 244d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("unsupported object type\n"); 245d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_INVALID_OBJECT_HANDLE; 246d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 247d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_OK; 248d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 249d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 250d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike LockwoodMtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, 251d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpDataPacket& packet) { 252d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood char date[20]; 253d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 254d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 255d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jboolean result = env->CallBooleanMethod(mDatabase, method_getObjectInfo, 256d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)handle, mIntBuffer, mStringBuffer, mLongBuffer); 257d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (!result) 258d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_INVALID_OBJECT_HANDLE; 259d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 260d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jint* intValues = env->GetIntArrayElements(mIntBuffer, 0); 261d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpStorageID storageID = intValues[0]; 262d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectFormat format = intValues[1]; 263d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectHandle parent = intValues[2]; 264d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseIntArrayElements(mIntBuffer, intValues, 0); 265d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 266d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 267d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t size = longValues[0]; 268d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood uint64_t modified = longValues[1]; 269d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 270d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 271d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int associationType = (format == MTP_FORMAT_ASSOCIATION ? 272d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MTP_ASSOCIATION_TYPE_GENERIC_FOLDER : 273d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MTP_ASSOCIATION_TYPE_UNDEFINED); 274d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 275d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(storageID); 276d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(format); 277d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(0); // protection status 278d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32((size > 0xFFFFFFFFLL ? 0xFFFFFFFF : size)); 279d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(0); // thumb format 280d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // thumb compressed size 281d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // thumb pix width 282d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // thumb pix height 283d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // image pix width 284d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // image pix height 285d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // image bit depth 286d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(parent); 287d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt16(associationType); 288d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // association desc 289d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putUInt32(0); // sequence number 290d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 291d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 292d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putString(str); // file name 293d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 294d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 295d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putEmptyString(); 296d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood formatDateTime(modified, date, sizeof(date)); 297d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putString(date); // date modified 298d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood packet.putEmptyString(); // keywords 299d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 300d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return MTP_RESPONSE_OK; 301d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 302d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 30359c777a24a2c639dfd84b7bf17e430e6d3424866Mike LockwoodMtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, 304d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpString& filePath, 305d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int64_t& fileLength) { 306d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 30759c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood jint result = env->CallIntMethod(mDatabase, method_getObjectFilePath, 308d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood (jint)handle, mStringBuffer, mLongBuffer); 30959c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood if (result != MTP_RESPONSE_OK) 31059c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood return result; 311d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 312d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jchar* str = env->GetCharArrayElements(mStringBuffer, 0); 313d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood filePath.setTo(str, strlen16(str)); 314d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseCharArrayElements(mStringBuffer, str, 0); 315d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 316d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0); 317d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood fileLength = longValues[0]; 318d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ReleaseLongArrayElements(mLongBuffer, longValues, 0); 319d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 32059c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood return result; 321d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 322d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 32359c777a24a2c639dfd84b7bf17e430e6d3424866Mike LockwoodMtpResponseCode MyMtpDatabase::deleteFile(MtpObjectHandle handle) { 324d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 32559c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood return env->CallIntMethod(mDatabase, method_deleteFile, (jint)handle); 326d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 327d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 328d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstruct PropertyTableEntry { 329d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MtpObjectProperty property; 330d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int type; 331d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 332d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 333d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic const PropertyTableEntry kPropertyTable[] = { 334d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32 }, 335d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32 }, 336d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT32 }, 337d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR }, 338d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64 }, 339d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR }, 340d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 341d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 342d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodbool MyMtpDatabase::getPropertyInfo(MtpObjectProperty property, int& type) { 343d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood int count = sizeof(kPropertyTable) / sizeof(kPropertyTable[0]); 344d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood const PropertyTableEntry* entry = kPropertyTable; 345d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood for (int i = 0; i < count; i++, entry++) { 346d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (entry->property == property) { 347d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood type = entry->type; 348d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return true; 349d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 350d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 351d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return false; 352d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 353d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 3549a2046fb5ceeee4d5334274cbff15f1058bb3244Mike LockwoodMtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) { 3559a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3569a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectReferences, 3579a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood (jint)handle); 3589a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (!array) 3599a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return NULL; 3609a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood MtpObjectHandleList* list = new MtpObjectHandleList(); 3619a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 3629a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jsize length = env->GetArrayLength(array); 3639a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < length; i++) 3649a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood list->push(handles[i]); 3659a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 3669a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return list; 3679a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood} 3689a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 3699a2046fb5ceeee4d5334274cbff15f1058bb3244Mike LockwoodMtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle, MtpObjectHandleList* references) { 3709a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood JNIEnv* env = AndroidRuntime::getJNIEnv(); 3719a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood int count = references->size(); 3729a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jintArray array = env->NewIntArray(count); 3739a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (!array) { 3749a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood LOGE("out of memory in setObjectReferences"); 3759a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return false; 3769a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 3779a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood jint* handles = env->GetIntArrayElements(array, 0); 3789a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood for (int i = 0; i < count; i++) 3799a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood handles[i] = (*references)[i]; 3809a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood env->ReleaseIntArrayElements(array, handles, 0); 3819a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return env->CallIntMethod(mDatabase, method_setObjectReferences, 3829a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood (jint)handle, array); 3839a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood} 3849a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood 385d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 386d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 387d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) { 388d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (env->ExceptionCheck()) { 389d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("An exception was thrown by callback '%s'.", methodName); 390d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE_EX(env); 391d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->ExceptionClear(); 392d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 393d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 394d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 395ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#endif // HAVE_ANDROID_OS 396ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood 397d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 398d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 399d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic void 400d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodandroid_media_MtpDatabase_setup(JNIEnv *env, jobject thiz) 401d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 402ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#ifdef HAVE_ANDROID_OS 403d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGD("setup\n"); 404d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MyMtpDatabase* database = new MyMtpDatabase(env, thiz); 405d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->SetIntField(thiz, field_context, (int)database); 406d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 407ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#endif 408d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 409d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 410d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic void 411d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodandroid_media_MtpDatabase_finalize(JNIEnv *env, jobject thiz) 412d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 413ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#ifdef HAVE_ANDROID_OS 414d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGD("finalize\n"); 415d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood MyMtpDatabase* database = (MyMtpDatabase *)env->GetIntField(thiz, field_context); 416d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood database->cleanup(env); 417d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood delete database; 418d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood env->SetIntField(thiz, field_context, 0); 419d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood checkAndClearExceptionFromCallback(env, __FUNCTION__); 420ff164a7d6f839c194a52572136cfa320609598e0Mike Lockwood#endif 421d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 422d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 423d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood// ---------------------------------------------------------------------------- 424d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 425d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic JNINativeMethod gMethods[] = { 426d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood {"native_setup", "()V", (void *)android_media_MtpDatabase_setup}, 427d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood {"native_finalize", "()V", (void *)android_media_MtpDatabase_finalize}, 428d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood}; 429d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 430d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodstatic const char* const kClassPathName = "android/media/MtpDatabase"; 431d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 432d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodint register_android_media_MtpDatabase(JNIEnv *env) 433d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood{ 434d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood jclass clazz; 435d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 436d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGD("register_android_media_MtpDatabase\n"); 437d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 438d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood clazz = env->FindClass("android/media/MtpDatabase"); 439d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (clazz == NULL) { 440d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find android/media/MtpDatabase"); 441d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 442d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 443d815f79766984fce499e147ecbacc01914683f74Mike Lockwood method_beginSendObject = env->GetMethodID(clazz, "beginSendObject", "(Ljava/lang/String;IIIJJ)I"); 444d815f79766984fce499e147ecbacc01914683f74Mike Lockwood if (method_beginSendObject == NULL) { 445d815f79766984fce499e147ecbacc01914683f74Mike Lockwood LOGE("Can't find beginSendObject"); 446d815f79766984fce499e147ecbacc01914683f74Mike Lockwood return -1; 447d815f79766984fce499e147ecbacc01914683f74Mike Lockwood } 448d815f79766984fce499e147ecbacc01914683f74Mike Lockwood method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIZ)V"); 449d815f79766984fce499e147ecbacc01914683f74Mike Lockwood if (method_endSendObject == NULL) { 450d815f79766984fce499e147ecbacc01914683f74Mike Lockwood LOGE("Can't find endSendObject"); 451d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 452d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 453d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood method_getObjectList = env->GetMethodID(clazz, "getObjectList", "(III)[I"); 454d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectList == NULL) { 455d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectList"); 456d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 457d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 4587a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood method_getNumObjects = env->GetMethodID(clazz, "getNumObjects", "(III)I"); 4597a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood if (method_getNumObjects == NULL) { 4607a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood LOGE("Can't find getNumObjects"); 4617a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood return -1; 4627a047c89862febf63ce1bb5873179c7a2ff8d9d3Mike Lockwood } 463d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood method_getObjectProperty = env->GetMethodID(clazz, "getObjectProperty", "(II[J[C)I"); 464d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectProperty == NULL) { 465d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectProperty"); 466d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 467d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 468d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood method_getObjectInfo = env->GetMethodID(clazz, "getObjectInfo", "(I[I[C[J)Z"); 469d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectInfo == NULL) { 470d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectInfo"); 471d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 472d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 47359c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood method_getObjectFilePath = env->GetMethodID(clazz, "getObjectFilePath", "(I[C[J)I"); 474d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_getObjectFilePath == NULL) { 475d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find getObjectFilePath"); 476d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 477d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 47859c777a24a2c639dfd84b7bf17e430e6d3424866Mike Lockwood method_deleteFile = env->GetMethodID(clazz, "deleteFile", "(I)I"); 479d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (method_deleteFile == NULL) { 480d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find deleteFile"); 481d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 482d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 4839a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood method_getObjectReferences = env->GetMethodID(clazz, "getObjectReferences", "(I)[I"); 4849a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (method_getObjectReferences == NULL) { 4859a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood LOGE("Can't find getObjectReferences"); 4869a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return -1; 4879a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 4889a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood method_setObjectReferences = env->GetMethodID(clazz, "setObjectReferences", "(I[I)I"); 4899a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood if (method_setObjectReferences == NULL) { 4909a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood LOGE("Can't find setObjectReferences"); 4919a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood return -1; 4929a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood } 493d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood field_context = env->GetFieldID(clazz, "mNativeContext", "I"); 494d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood if (field_context == NULL) { 495d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood LOGE("Can't find MtpDatabase.mNativeContext"); 496d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return -1; 497d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 498d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 499d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood return AndroidRuntime::registerNativeMethods(env, 500d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood "android/media/MtpDatabase", gMethods, NELEM(gMethods)); 501d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood} 502