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