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