blob: 87cb82e047938cc62d8d0cdc6557ad8cf798e9ab [file] [log] [blame]
Mike Lockwoodd21eac92010-07-03 00:44:05 -04001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "MtpDatabaseJNI"
18#include "utils/Log.h"
19
20#include <stdio.h>
21#include <assert.h>
22#include <limits.h>
23#include <unistd.h>
24#include <fcntl.h>
25
26#include "jni.h"
27#include "JNIHelp.h"
28#include "android_runtime/AndroidRuntime.h"
29
30#include "MtpDatabase.h"
31#include "MtpDataPacket.h"
Mike Lockwood828d19d2010-08-10 15:20:35 -040032#include "MtpProperty.h"
Mike Lockwood59e3f0d2010-09-02 14:57:30 -040033#include "MtpStringBuffer.h"
Mike Lockwoodd21eac92010-07-03 00:44:05 -040034#include "MtpUtils.h"
35#include "mtp.h"
36
37using namespace android;
38
39// ----------------------------------------------------------------------------
40
Mike Lockwoodd815f792010-07-12 08:49:01 -040041static jmethodID method_beginSendObject;
42static jmethodID method_endSendObject;
Mike Lockwoodd21eac92010-07-03 00:44:05 -040043static jmethodID method_getObjectList;
Mike Lockwood7a047c82010-08-02 10:52:20 -040044static jmethodID method_getNumObjects;
Mike Lockwood4b322ce2010-08-10 07:37:50 -040045static jmethodID method_getSupportedPlaybackFormats;
46static jmethodID method_getSupportedCaptureFormats;
47static jmethodID method_getSupportedObjectProperties;
48static jmethodID method_getSupportedDeviceProperties;
Mike Lockwoodd21eac92010-07-03 00:44:05 -040049static jmethodID method_getObjectProperty;
Mike Lockwood828d19d2010-08-10 15:20:35 -040050static jmethodID method_setObjectProperty;
Mike Lockwood59e3f0d2010-09-02 14:57:30 -040051static jmethodID method_getDeviceProperty;
52static jmethodID method_setDeviceProperty;
Mike Lockwoodd21eac92010-07-03 00:44:05 -040053static jmethodID method_getObjectInfo;
54static jmethodID method_getObjectFilePath;
55static jmethodID method_deleteFile;
Mike Lockwood9a2046f2010-08-03 15:30:09 -040056static jmethodID method_getObjectReferences;
57static jmethodID method_setObjectReferences;
Mike Lockwood2837eef2010-08-31 16:25:12 -040058static jmethodID method_sessionStarted;
59static jmethodID method_sessionEnded;
60
Mike Lockwoodd21eac92010-07-03 00:44:05 -040061static jfieldID field_context;
62
63MtpDatabase* getMtpDatabase(JNIEnv *env, jobject database) {
64 return (MtpDatabase *)env->GetIntField(database, field_context);
65}
66
Mike Lockwoodff164a72010-07-15 15:01:17 -040067#ifdef HAVE_ANDROID_OS
Mike Lockwoodd21eac92010-07-03 00:44:05 -040068// ----------------------------------------------------------------------------
69
70class MyMtpDatabase : public MtpDatabase {
71private:
72 jobject mDatabase;
73 jintArray mIntBuffer;
74 jlongArray mLongBuffer;
75 jcharArray mStringBuffer;
76
77public:
78 MyMtpDatabase(JNIEnv *env, jobject client);
79 virtual ~MyMtpDatabase();
80 void cleanup(JNIEnv *env);
81
Mike Lockwoodd815f792010-07-12 08:49:01 -040082 virtual MtpObjectHandle beginSendObject(const char* path,
Mike Lockwoodd21eac92010-07-03 00:44:05 -040083 MtpObjectFormat format,
84 MtpObjectHandle parent,
85 MtpStorageID storage,
86 uint64_t size,
87 time_t modified);
88
Mike Lockwoodd815f792010-07-12 08:49:01 -040089 virtual void endSendObject(const char* path,
90 MtpObjectHandle handle,
91 MtpObjectFormat format,
92 bool succeeded);
93
Mike Lockwoodd21eac92010-07-03 00:44:05 -040094 virtual MtpObjectHandleList* getObjectList(MtpStorageID storageID,
95 MtpObjectFormat format,
96 MtpObjectHandle parent);
97
Mike Lockwood7a047c82010-08-02 10:52:20 -040098 virtual int getNumObjects(MtpStorageID storageID,
99 MtpObjectFormat format,
100 MtpObjectHandle parent);
101
Mike Lockwood4b322ce2010-08-10 07:37:50 -0400102 // callee should delete[] the results from these
103 // results can be NULL
104 virtual MtpObjectFormatList* getSupportedPlaybackFormats();
105 virtual MtpObjectFormatList* getSupportedCaptureFormats();
106 virtual MtpObjectPropertyList* getSupportedObjectProperties(MtpObjectFormat format);
107 virtual MtpDevicePropertyList* getSupportedDeviceProperties();
108
Mike Lockwood828d19d2010-08-10 15:20:35 -0400109 virtual MtpResponseCode getObjectPropertyValue(MtpObjectHandle handle,
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400110 MtpObjectProperty property,
111 MtpDataPacket& packet);
112
Mike Lockwood828d19d2010-08-10 15:20:35 -0400113 virtual MtpResponseCode setObjectPropertyValue(MtpObjectHandle handle,
114 MtpObjectProperty property,
115 MtpDataPacket& packet);
116
117 virtual MtpResponseCode getDevicePropertyValue(MtpDeviceProperty property,
118 MtpDataPacket& packet);
119
120 virtual MtpResponseCode setDevicePropertyValue(MtpDeviceProperty property,
121 MtpDataPacket& packet);
122
123 virtual MtpResponseCode resetDeviceProperty(MtpDeviceProperty property);
124
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400125 virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle,
126 MtpDataPacket& packet);
127
Mike Lockwood59c777a2010-08-02 10:37:41 -0400128 virtual MtpResponseCode getObjectFilePath(MtpObjectHandle handle,
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400129 MtpString& filePath,
130 int64_t& fileLength);
Mike Lockwood59c777a2010-08-02 10:37:41 -0400131 virtual MtpResponseCode deleteFile(MtpObjectHandle handle);
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400132
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400133 bool getObjectPropertyInfo(MtpObjectProperty property, int& type);
134 bool getDevicePropertyInfo(MtpDeviceProperty property, int& type);
Mike Lockwood9a2046f2010-08-03 15:30:09 -0400135
136 virtual MtpObjectHandleList* getObjectReferences(MtpObjectHandle handle);
137
138 virtual MtpResponseCode setObjectReferences(MtpObjectHandle handle,
139 MtpObjectHandleList* references);
Mike Lockwood828d19d2010-08-10 15:20:35 -0400140
141 virtual MtpProperty* getObjectPropertyDesc(MtpObjectProperty property,
142 MtpObjectFormat format);
143
144 virtual MtpProperty* getDevicePropertyDesc(MtpDeviceProperty property);
Mike Lockwood2837eef2010-08-31 16:25:12 -0400145
146 virtual void sessionStarted();
147
148 virtual void sessionEnded();
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400149};
150
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400151// ----------------------------------------------------------------------------
152
153static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
154 if (env->ExceptionCheck()) {
155 LOGE("An exception was thrown by callback '%s'.", methodName);
156 LOGE_EX(env);
157 env->ExceptionClear();
158 }
159}
160
161// ----------------------------------------------------------------------------
162
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400163MyMtpDatabase::MyMtpDatabase(JNIEnv *env, jobject client)
164 : mDatabase(env->NewGlobalRef(client)),
165 mIntBuffer(NULL),
166 mLongBuffer(NULL),
167 mStringBuffer(NULL)
168{
169 jintArray intArray;
170 jlongArray longArray;
171 jcharArray charArray;
172
173 // create buffers for out arguments
174 // we don't need to be thread-safe so this is OK
175 intArray = env->NewIntArray(3);
176 if (!intArray)
177 goto out_of_memory;
178 mIntBuffer = (jintArray)env->NewGlobalRef(intArray);
179 longArray = env->NewLongArray(2);
180 if (!longArray)
181 goto out_of_memory;
182 mLongBuffer = (jlongArray)env->NewGlobalRef(longArray);
183 charArray = env->NewCharArray(256);
184 if (!charArray)
185 goto out_of_memory;
186 mStringBuffer = (jcharArray)env->NewGlobalRef(charArray);
187 return;
188
189out_of_memory:
190 env->ThrowNew(env->FindClass("java/lang/OutOfMemoryError"), NULL);
191}
192
193void MyMtpDatabase::cleanup(JNIEnv *env) {
194 env->DeleteGlobalRef(mDatabase);
195 env->DeleteGlobalRef(mIntBuffer);
196 env->DeleteGlobalRef(mLongBuffer);
197 env->DeleteGlobalRef(mStringBuffer);
198}
199
200MyMtpDatabase::~MyMtpDatabase() {
201}
202
Mike Lockwoodd815f792010-07-12 08:49:01 -0400203MtpObjectHandle MyMtpDatabase::beginSendObject(const char* path,
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400204 MtpObjectFormat format,
205 MtpObjectHandle parent,
206 MtpStorageID storage,
207 uint64_t size,
208 time_t modified) {
209 JNIEnv* env = AndroidRuntime::getJNIEnv();
Mike Lockwood88394712010-09-27 10:01:00 -0400210 jstring pathStr = env->NewStringUTF(path);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400211 MtpObjectHandle result = env->CallIntMethod(mDatabase, method_beginSendObject,
Mike Lockwood88394712010-09-27 10:01:00 -0400212 pathStr, (jint)format, (jint)parent, (jint)storage,
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400213 (jlong)size, (jlong)modified);
214
Mike Lockwood88394712010-09-27 10:01:00 -0400215 if (pathStr)
216 env->DeleteLocalRef(pathStr);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400217 checkAndClearExceptionFromCallback(env, __FUNCTION__);
218 return result;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400219}
220
Mike Lockwoodd815f792010-07-12 08:49:01 -0400221void MyMtpDatabase::endSendObject(const char* path, MtpObjectHandle handle,
222 MtpObjectFormat format, bool succeeded) {
223 JNIEnv* env = AndroidRuntime::getJNIEnv();
Mike Lockwood88394712010-09-27 10:01:00 -0400224 jstring pathStr = env->NewStringUTF(path);
225 env->CallVoidMethod(mDatabase, method_endSendObject, pathStr,
Mike Lockwoodd815f792010-07-12 08:49:01 -0400226 (jint)handle, (jint)format, (jboolean)succeeded);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400227
Mike Lockwood88394712010-09-27 10:01:00 -0400228 if (pathStr)
229 env->DeleteLocalRef(pathStr);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400230 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwoodd815f792010-07-12 08:49:01 -0400231}
232
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400233MtpObjectHandleList* MyMtpDatabase::getObjectList(MtpStorageID storageID,
234 MtpObjectFormat format,
235 MtpObjectHandle parent) {
236 JNIEnv* env = AndroidRuntime::getJNIEnv();
237 jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectList,
238 (jint)storageID, (jint)format, (jint)parent);
239 if (!array)
240 return NULL;
241 MtpObjectHandleList* list = new MtpObjectHandleList();
242 jint* handles = env->GetIntArrayElements(array, 0);
243 jsize length = env->GetArrayLength(array);
Mike Lockwood7a047c82010-08-02 10:52:20 -0400244 for (int i = 0; i < length; i++)
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400245 list->push(handles[i]);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400246 env->ReleaseIntArrayElements(array, handles, 0);
Mike Lockwood88394712010-09-27 10:01:00 -0400247 env->DeleteLocalRef(array);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400248
249 checkAndClearExceptionFromCallback(env, __FUNCTION__);
250 return list;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400251}
252
Mike Lockwood7a047c82010-08-02 10:52:20 -0400253int MyMtpDatabase::getNumObjects(MtpStorageID storageID,
254 MtpObjectFormat format,
255 MtpObjectHandle parent) {
256 JNIEnv* env = AndroidRuntime::getJNIEnv();
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400257 int result = env->CallIntMethod(mDatabase, method_getNumObjects,
Mike Lockwood7a047c82010-08-02 10:52:20 -0400258 (jint)storageID, (jint)format, (jint)parent);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400259
260 checkAndClearExceptionFromCallback(env, __FUNCTION__);
261 return result;
Mike Lockwood7a047c82010-08-02 10:52:20 -0400262}
263
Mike Lockwood4b322ce2010-08-10 07:37:50 -0400264MtpObjectFormatList* MyMtpDatabase::getSupportedPlaybackFormats() {
265 JNIEnv* env = AndroidRuntime::getJNIEnv();
266 jintArray array = (jintArray)env->CallObjectMethod(mDatabase,
267 method_getSupportedPlaybackFormats);
268 if (!array)
269 return NULL;
270 MtpObjectFormatList* list = new MtpObjectFormatList();
271 jint* formats = env->GetIntArrayElements(array, 0);
272 jsize length = env->GetArrayLength(array);
273 for (int i = 0; i < length; i++)
274 list->push(formats[i]);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400275 env->ReleaseIntArrayElements(array, formats, 0);
Mike Lockwood88394712010-09-27 10:01:00 -0400276 env->DeleteLocalRef(array);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400277
278 checkAndClearExceptionFromCallback(env, __FUNCTION__);
279 return list;
Mike Lockwood4b322ce2010-08-10 07:37:50 -0400280}
281
282MtpObjectFormatList* MyMtpDatabase::getSupportedCaptureFormats() {
283 JNIEnv* env = AndroidRuntime::getJNIEnv();
284 jintArray array = (jintArray)env->CallObjectMethod(mDatabase,
285 method_getSupportedCaptureFormats);
286 if (!array)
287 return NULL;
288 MtpObjectFormatList* list = new MtpObjectFormatList();
289 jint* formats = env->GetIntArrayElements(array, 0);
290 jsize length = env->GetArrayLength(array);
291 for (int i = 0; i < length; i++)
292 list->push(formats[i]);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400293 env->ReleaseIntArrayElements(array, formats, 0);
Mike Lockwood88394712010-09-27 10:01:00 -0400294 env->DeleteLocalRef(array);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400295
296 checkAndClearExceptionFromCallback(env, __FUNCTION__);
297 return list;
Mike Lockwood4b322ce2010-08-10 07:37:50 -0400298}
299
300MtpObjectPropertyList* MyMtpDatabase::getSupportedObjectProperties(MtpObjectFormat format) {
301 JNIEnv* env = AndroidRuntime::getJNIEnv();
302 jintArray array = (jintArray)env->CallObjectMethod(mDatabase,
303 method_getSupportedObjectProperties, (jint)format);
304 if (!array)
305 return NULL;
306 MtpObjectPropertyList* list = new MtpObjectPropertyList();
307 jint* properties = env->GetIntArrayElements(array, 0);
308 jsize length = env->GetArrayLength(array);
309 for (int i = 0; i < length; i++)
310 list->push(properties[i]);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400311 env->ReleaseIntArrayElements(array, properties, 0);
Mike Lockwood88394712010-09-27 10:01:00 -0400312 env->DeleteLocalRef(array);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400313
314 checkAndClearExceptionFromCallback(env, __FUNCTION__);
315 return list;
Mike Lockwood4b322ce2010-08-10 07:37:50 -0400316}
317
318MtpDevicePropertyList* MyMtpDatabase::getSupportedDeviceProperties() {
319 JNIEnv* env = AndroidRuntime::getJNIEnv();
320 jintArray array = (jintArray)env->CallObjectMethod(mDatabase,
321 method_getSupportedDeviceProperties);
322 if (!array)
323 return NULL;
324 MtpDevicePropertyList* list = new MtpDevicePropertyList();
325 jint* properties = env->GetIntArrayElements(array, 0);
326 jsize length = env->GetArrayLength(array);
327 for (int i = 0; i < length; i++)
328 list->push(properties[i]);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400329 env->ReleaseIntArrayElements(array, properties, 0);
Mike Lockwood88394712010-09-27 10:01:00 -0400330 env->DeleteLocalRef(array);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400331
332 checkAndClearExceptionFromCallback(env, __FUNCTION__);
333 return list;
Mike Lockwood4b322ce2010-08-10 07:37:50 -0400334}
335
Mike Lockwood828d19d2010-08-10 15:20:35 -0400336MtpResponseCode MyMtpDatabase::getObjectPropertyValue(MtpObjectHandle handle,
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400337 MtpObjectProperty property,
338 MtpDataPacket& packet) {
339 int type;
340
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400341 if (!getObjectPropertyInfo(property, type))
342 return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400343
344 JNIEnv* env = AndroidRuntime::getJNIEnv();
345 jint result = env->CallIntMethod(mDatabase, method_getObjectProperty,
346 (jint)handle, (jint)property, mLongBuffer, mStringBuffer);
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400347 if (result != MTP_RESPONSE_OK) {
348 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400349 return result;
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400350 }
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400351
352 jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0);
353 jlong longValue = longValues[0];
354 env->ReleaseLongArrayElements(mLongBuffer, longValues, 0);
355
Mike Lockwoodae078f72010-09-26 12:35:51 -0400356 // special case date properties, which are strings to MTP
Mike Lockwood828d19d2010-08-10 15:20:35 -0400357 // but stored internally as a uint64
Mike Lockwoodae078f72010-09-26 12:35:51 -0400358 if (property == MTP_PROPERTY_DATE_MODIFIED || property == MTP_PROPERTY_DATE_ADDED) {
Mike Lockwood828d19d2010-08-10 15:20:35 -0400359 char date[20];
360 formatDateTime(longValue, date, sizeof(date));
361 packet.putString(date);
362 return MTP_RESPONSE_OK;
363 }
Mike Lockwoodae078f72010-09-26 12:35:51 -0400364 // release date is stored internally as just the year
365 if (property == MTP_PROPERTY_ORIGINAL_RELEASE_DATE) {
366 char date[20];
367 snprintf(date, sizeof(date), "%04lld0101T000000", longValue);
368 packet.putString(date);
369 return MTP_RESPONSE_OK;
370 }
Mike Lockwood828d19d2010-08-10 15:20:35 -0400371
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400372 switch (type) {
373 case MTP_TYPE_INT8:
374 packet.putInt8(longValue);
375 break;
376 case MTP_TYPE_UINT8:
377 packet.putUInt8(longValue);
378 break;
379 case MTP_TYPE_INT16:
380 packet.putInt16(longValue);
381 break;
382 case MTP_TYPE_UINT16:
383 packet.putUInt16(longValue);
384 break;
385 case MTP_TYPE_INT32:
386 packet.putInt32(longValue);
387 break;
388 case MTP_TYPE_UINT32:
389 packet.putUInt32(longValue);
390 break;
391 case MTP_TYPE_INT64:
392 packet.putInt64(longValue);
393 break;
394 case MTP_TYPE_UINT64:
395 packet.putUInt64(longValue);
396 break;
Mike Lockwood828d19d2010-08-10 15:20:35 -0400397 case MTP_TYPE_INT128:
398 packet.putInt128(longValue);
399 break;
400 case MTP_TYPE_UINT128:
401 packet.putInt128(longValue);
402 break;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400403 case MTP_TYPE_STR:
404 {
405 jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
406 packet.putString(str);
407 env->ReleaseCharArrayElements(mStringBuffer, str, 0);
408 break;
409 }
410 default:
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400411 LOGE("unsupported type in getObjectPropertyValue\n");
412 return MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400413 }
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400414
415 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400416 return MTP_RESPONSE_OK;
417}
418
Mike Lockwood828d19d2010-08-10 15:20:35 -0400419MtpResponseCode MyMtpDatabase::setObjectPropertyValue(MtpObjectHandle handle,
420 MtpObjectProperty property,
421 MtpDataPacket& packet) {
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400422 int type;
423
424 if (!getObjectPropertyInfo(property, type))
425 return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
426
427 JNIEnv* env = AndroidRuntime::getJNIEnv();
428 jlong longValue = 0;
429 jstring stringValue = NULL;
430
431 switch (type) {
432 case MTP_TYPE_INT8:
433 longValue = packet.getInt8();
434 break;
435 case MTP_TYPE_UINT8:
436 longValue = packet.getUInt8();
437 break;
438 case MTP_TYPE_INT16:
439 longValue = packet.getInt16();
440 break;
441 case MTP_TYPE_UINT16:
442 longValue = packet.getUInt16();
443 break;
444 case MTP_TYPE_INT32:
445 longValue = packet.getInt32();
446 break;
447 case MTP_TYPE_UINT32:
448 longValue = packet.getUInt32();
449 break;
450 case MTP_TYPE_INT64:
451 longValue = packet.getInt64();
452 break;
453 case MTP_TYPE_UINT64:
454 longValue = packet.getUInt64();
455 break;
456 case MTP_TYPE_STR:
457 {
458 MtpStringBuffer buffer;
459 packet.getString(buffer);
460 stringValue = env->NewStringUTF((const char *)buffer);
461 break;
462 }
463 default:
464 LOGE("unsupported type in getObjectPropertyValue\n");
465 return MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
466 }
467
468 jint result = env->CallIntMethod(mDatabase, method_setObjectProperty,
469 (jint)handle, (jint)property, longValue, stringValue);
Mike Lockwood88394712010-09-27 10:01:00 -0400470 if (stringValue)
471 env->DeleteLocalRef(stringValue);
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400472
473 checkAndClearExceptionFromCallback(env, __FUNCTION__);
474 return result;
Mike Lockwood828d19d2010-08-10 15:20:35 -0400475}
476
477MtpResponseCode MyMtpDatabase::getDevicePropertyValue(MtpDeviceProperty property,
478 MtpDataPacket& packet) {
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400479 int type;
480
481 if (!getDevicePropertyInfo(property, type))
482 return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED;
483
484 JNIEnv* env = AndroidRuntime::getJNIEnv();
485 jint result = env->CallIntMethod(mDatabase, method_getDeviceProperty,
486 (jint)property, mLongBuffer, mStringBuffer);
487 if (result != MTP_RESPONSE_OK) {
488 checkAndClearExceptionFromCallback(env, __FUNCTION__);
489 return result;
490 }
491
492 jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0);
493 jlong longValue = longValues[0];
494 env->ReleaseLongArrayElements(mLongBuffer, longValues, 0);
495
496 switch (type) {
497 case MTP_TYPE_INT8:
498 packet.putInt8(longValue);
499 break;
500 case MTP_TYPE_UINT8:
501 packet.putUInt8(longValue);
502 break;
503 case MTP_TYPE_INT16:
504 packet.putInt16(longValue);
505 break;
506 case MTP_TYPE_UINT16:
507 packet.putUInt16(longValue);
508 break;
509 case MTP_TYPE_INT32:
510 packet.putInt32(longValue);
511 break;
512 case MTP_TYPE_UINT32:
513 packet.putUInt32(longValue);
514 break;
515 case MTP_TYPE_INT64:
516 packet.putInt64(longValue);
517 break;
518 case MTP_TYPE_UINT64:
519 packet.putUInt64(longValue);
520 break;
521 case MTP_TYPE_INT128:
522 packet.putInt128(longValue);
523 break;
524 case MTP_TYPE_UINT128:
525 packet.putInt128(longValue);
526 break;
527 case MTP_TYPE_STR:
528 {
529 jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
530 packet.putString(str);
531 env->ReleaseCharArrayElements(mStringBuffer, str, 0);
532 break;
533 }
534 default:
535 LOGE("unsupported type in getDevicePropertyValue\n");
536 return MTP_RESPONSE_INVALID_DEVICE_PROP_FORMAT;
537 }
538
539 checkAndClearExceptionFromCallback(env, __FUNCTION__);
540 return MTP_RESPONSE_OK;
Mike Lockwood828d19d2010-08-10 15:20:35 -0400541}
542
543MtpResponseCode MyMtpDatabase::setDevicePropertyValue(MtpDeviceProperty property,
544 MtpDataPacket& packet) {
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400545 int type;
546
547 if (!getDevicePropertyInfo(property, type))
548 return MTP_RESPONSE_DEVICE_PROP_NOT_SUPPORTED;
549
550 JNIEnv* env = AndroidRuntime::getJNIEnv();
551 jlong longValue = 0;
552 jstring stringValue = NULL;
553
554 switch (type) {
555 case MTP_TYPE_INT8:
556 longValue = packet.getInt8();
557 break;
558 case MTP_TYPE_UINT8:
559 longValue = packet.getUInt8();
560 break;
561 case MTP_TYPE_INT16:
562 longValue = packet.getInt16();
563 break;
564 case MTP_TYPE_UINT16:
565 longValue = packet.getUInt16();
566 break;
567 case MTP_TYPE_INT32:
568 longValue = packet.getInt32();
569 break;
570 case MTP_TYPE_UINT32:
571 longValue = packet.getUInt32();
572 break;
573 case MTP_TYPE_INT64:
574 longValue = packet.getInt64();
575 break;
576 case MTP_TYPE_UINT64:
577 longValue = packet.getUInt64();
578 break;
579 case MTP_TYPE_STR:
580 {
581 MtpStringBuffer buffer;
582 packet.getString(buffer);
583 stringValue = env->NewStringUTF((const char *)buffer);
584 break;
585 }
586 default:
587 LOGE("unsupported type in setDevicePropertyValue\n");
588 return MTP_RESPONSE_INVALID_OBJECT_PROP_FORMAT;
589 }
590
591 jint result = env->CallIntMethod(mDatabase, method_setDeviceProperty,
592 (jint)property, longValue, stringValue);
Mike Lockwood88394712010-09-27 10:01:00 -0400593 if (stringValue)
594 env->DeleteLocalRef(stringValue);
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400595
596 checkAndClearExceptionFromCallback(env, __FUNCTION__);
597 return result;
Mike Lockwood828d19d2010-08-10 15:20:35 -0400598}
599
600MtpResponseCode MyMtpDatabase::resetDeviceProperty(MtpDeviceProperty property) {
601 return -1;
602}
603
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400604MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle,
605 MtpDataPacket& packet) {
606 char date[20];
607
608 JNIEnv* env = AndroidRuntime::getJNIEnv();
609 jboolean result = env->CallBooleanMethod(mDatabase, method_getObjectInfo,
610 (jint)handle, mIntBuffer, mStringBuffer, mLongBuffer);
611 if (!result)
612 return MTP_RESPONSE_INVALID_OBJECT_HANDLE;
613
614 jint* intValues = env->GetIntArrayElements(mIntBuffer, 0);
615 MtpStorageID storageID = intValues[0];
616 MtpObjectFormat format = intValues[1];
617 MtpObjectHandle parent = intValues[2];
618 env->ReleaseIntArrayElements(mIntBuffer, intValues, 0);
619
620 jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0);
621 uint64_t size = longValues[0];
622 uint64_t modified = longValues[1];
623 env->ReleaseLongArrayElements(mLongBuffer, longValues, 0);
624
Mike Lockwood828d19d2010-08-10 15:20:35 -0400625// int associationType = (format == MTP_FORMAT_ASSOCIATION ?
626// MTP_ASSOCIATION_TYPE_GENERIC_FOLDER :
627// MTP_ASSOCIATION_TYPE_UNDEFINED);
628 int associationType = MTP_ASSOCIATION_TYPE_UNDEFINED;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400629
630 packet.putUInt32(storageID);
631 packet.putUInt16(format);
632 packet.putUInt16(0); // protection status
633 packet.putUInt32((size > 0xFFFFFFFFLL ? 0xFFFFFFFF : size));
634 packet.putUInt16(0); // thumb format
635 packet.putUInt32(0); // thumb compressed size
636 packet.putUInt32(0); // thumb pix width
637 packet.putUInt32(0); // thumb pix height
638 packet.putUInt32(0); // image pix width
639 packet.putUInt32(0); // image pix height
640 packet.putUInt32(0); // image bit depth
641 packet.putUInt32(parent);
642 packet.putUInt16(associationType);
643 packet.putUInt32(0); // association desc
644 packet.putUInt32(0); // sequence number
645
646 jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
647 packet.putString(str); // file name
648 env->ReleaseCharArrayElements(mStringBuffer, str, 0);
649
650 packet.putEmptyString();
651 formatDateTime(modified, date, sizeof(date));
652 packet.putString(date); // date modified
653 packet.putEmptyString(); // keywords
654
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400655 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400656 return MTP_RESPONSE_OK;
657}
658
Mike Lockwood59c777a2010-08-02 10:37:41 -0400659MtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle,
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400660 MtpString& filePath,
661 int64_t& fileLength) {
662 JNIEnv* env = AndroidRuntime::getJNIEnv();
Mike Lockwood59c777a2010-08-02 10:37:41 -0400663 jint result = env->CallIntMethod(mDatabase, method_getObjectFilePath,
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400664 (jint)handle, mStringBuffer, mLongBuffer);
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400665 if (result != MTP_RESPONSE_OK) {
666 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwood59c777a2010-08-02 10:37:41 -0400667 return result;
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400668 }
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400669
670 jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
671 filePath.setTo(str, strlen16(str));
672 env->ReleaseCharArrayElements(mStringBuffer, str, 0);
673
674 jlong* longValues = env->GetLongArrayElements(mLongBuffer, 0);
675 fileLength = longValues[0];
676 env->ReleaseLongArrayElements(mLongBuffer, longValues, 0);
677
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400678 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwood59c777a2010-08-02 10:37:41 -0400679 return result;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400680}
681
Mike Lockwood59c777a2010-08-02 10:37:41 -0400682MtpResponseCode MyMtpDatabase::deleteFile(MtpObjectHandle handle) {
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400683 JNIEnv* env = AndroidRuntime::getJNIEnv();
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400684 MtpResponseCode result = env->CallIntMethod(mDatabase, method_deleteFile, (jint)handle);
685
686 checkAndClearExceptionFromCallback(env, __FUNCTION__);
687 return result;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400688}
689
690struct PropertyTableEntry {
691 MtpObjectProperty property;
692 int type;
693};
694
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400695static const PropertyTableEntry kObjectPropertyTable[] = {
Mike Lockwoodd3bfecb2010-09-23 23:04:28 -0400696 { MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT32 },
697 { MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16 },
698 { MTP_PROPERTY_PROTECTION_STATUS, MTP_TYPE_UINT16 },
699 { MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64 },
700 { MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR },
701 { MTP_PROPERTY_DATE_MODIFIED, MTP_TYPE_STR },
702 { MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32 },
703 { MTP_PROPERTY_PERSISTENT_UID, MTP_TYPE_UINT128 },
704 { MTP_PROPERTY_NAME, MTP_TYPE_STR },
Mike Lockwoodae078f72010-09-26 12:35:51 -0400705 { MTP_PROPERTY_DISPLAY_NAME, MTP_TYPE_STR },
706 { MTP_PROPERTY_DATE_ADDED, MTP_TYPE_STR },
707 { MTP_PROPERTY_ARTIST, MTP_TYPE_STR },
708 { MTP_PROPERTY_ALBUM_NAME, MTP_TYPE_STR },
709 { MTP_PROPERTY_ALBUM_ARTIST, MTP_TYPE_STR },
710 { MTP_PROPERTY_TRACK, MTP_TYPE_UINT16 },
711 { MTP_PROPERTY_ORIGINAL_RELEASE_DATE, MTP_TYPE_STR },
712 { MTP_PROPERTY_GENRE, MTP_TYPE_STR },
713 { MTP_PROPERTY_COMPOSER, MTP_TYPE_STR },
714 { MTP_PROPERTY_DURATION, MTP_TYPE_UINT32 },
715 { MTP_PROPERTY_DESCRIPTION, MTP_TYPE_STR },
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400716};
717
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400718static const PropertyTableEntry kDevicePropertyTable[] = {
719 { MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, MTP_TYPE_STR },
720 { MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, MTP_TYPE_STR },
721};
722
723bool MyMtpDatabase::getObjectPropertyInfo(MtpObjectProperty property, int& type) {
724 int count = sizeof(kObjectPropertyTable) / sizeof(kObjectPropertyTable[0]);
725 const PropertyTableEntry* entry = kObjectPropertyTable;
726 for (int i = 0; i < count; i++, entry++) {
727 if (entry->property == property) {
728 type = entry->type;
729 return true;
730 }
731 }
732 return false;
733}
734
735bool MyMtpDatabase::getDevicePropertyInfo(MtpDeviceProperty property, int& type) {
736 int count = sizeof(kDevicePropertyTable) / sizeof(kDevicePropertyTable[0]);
737 const PropertyTableEntry* entry = kDevicePropertyTable;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400738 for (int i = 0; i < count; i++, entry++) {
739 if (entry->property == property) {
740 type = entry->type;
741 return true;
742 }
743 }
744 return false;
745}
746
Mike Lockwood9a2046f2010-08-03 15:30:09 -0400747MtpObjectHandleList* MyMtpDatabase::getObjectReferences(MtpObjectHandle handle) {
748 JNIEnv* env = AndroidRuntime::getJNIEnv();
749 jintArray array = (jintArray)env->CallObjectMethod(mDatabase, method_getObjectReferences,
750 (jint)handle);
751 if (!array)
752 return NULL;
753 MtpObjectHandleList* list = new MtpObjectHandleList();
754 jint* handles = env->GetIntArrayElements(array, 0);
755 jsize length = env->GetArrayLength(array);
756 for (int i = 0; i < length; i++)
757 list->push(handles[i]);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400758 env->ReleaseIntArrayElements(array, handles, 0);
Mike Lockwood88394712010-09-27 10:01:00 -0400759 env->DeleteLocalRef(array);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400760
761 checkAndClearExceptionFromCallback(env, __FUNCTION__);
762 return list;
Mike Lockwood9a2046f2010-08-03 15:30:09 -0400763}
764
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400765MtpResponseCode MyMtpDatabase::setObjectReferences(MtpObjectHandle handle,
766 MtpObjectHandleList* references) {
Mike Lockwood9a2046f2010-08-03 15:30:09 -0400767 JNIEnv* env = AndroidRuntime::getJNIEnv();
768 int count = references->size();
769 jintArray array = env->NewIntArray(count);
770 if (!array) {
771 LOGE("out of memory in setObjectReferences");
772 return false;
773 }
774 jint* handles = env->GetIntArrayElements(array, 0);
775 for (int i = 0; i < count; i++)
776 handles[i] = (*references)[i];
777 env->ReleaseIntArrayElements(array, handles, 0);
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400778 MtpResponseCode result = env->CallIntMethod(mDatabase, method_setObjectReferences,
Mike Lockwood9a2046f2010-08-03 15:30:09 -0400779 (jint)handle, array);
Mike Lockwood88394712010-09-27 10:01:00 -0400780 env->DeleteLocalRef(array);
Mike Lockwood9a2046f2010-08-03 15:30:09 -0400781
Mike Lockwood0a7fa0a2010-08-24 11:25:28 -0400782 checkAndClearExceptionFromCallback(env, __FUNCTION__);
783 return result;
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400784}
785
Mike Lockwood828d19d2010-08-10 15:20:35 -0400786MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property,
787 MtpObjectFormat format) {
788 MtpProperty* result = NULL;
789 switch (property) {
790 case MTP_PROPERTY_OBJECT_FORMAT:
791 case MTP_PROPERTY_PROTECTION_STATUS:
Mike Lockwoodae078f72010-09-26 12:35:51 -0400792 case MTP_PROPERTY_TRACK:
Mike Lockwood828d19d2010-08-10 15:20:35 -0400793 result = new MtpProperty(property, MTP_TYPE_UINT16);
794 break;
795 case MTP_PROPERTY_STORAGE_ID:
796 case MTP_PROPERTY_PARENT_OBJECT:
Mike Lockwoodae078f72010-09-26 12:35:51 -0400797 case MTP_PROPERTY_DURATION:
Mike Lockwood828d19d2010-08-10 15:20:35 -0400798 result = new MtpProperty(property, MTP_TYPE_UINT32);
799 break;
800 case MTP_PROPERTY_OBJECT_SIZE:
801 result = new MtpProperty(property, MTP_TYPE_UINT64);
802 break;
803 case MTP_PROPERTY_PERSISTENT_UID:
804 result = new MtpProperty(property, MTP_TYPE_UINT128);
805 break;
Mike Lockwoodd3bfecb2010-09-23 23:04:28 -0400806 case MTP_PROPERTY_NAME:
Mike Lockwood828d19d2010-08-10 15:20:35 -0400807 case MTP_PROPERTY_DATE_MODIFIED:
Mike Lockwoodae078f72010-09-26 12:35:51 -0400808 case MTP_PROPERTY_DISPLAY_NAME:
809 case MTP_PROPERTY_DATE_ADDED:
810 case MTP_PROPERTY_ARTIST:
811 case MTP_PROPERTY_ALBUM_NAME:
812 case MTP_PROPERTY_ALBUM_ARTIST:
813 case MTP_PROPERTY_ORIGINAL_RELEASE_DATE:
814 case MTP_PROPERTY_GENRE:
815 case MTP_PROPERTY_COMPOSER:
816 case MTP_PROPERTY_DESCRIPTION:
Mike Lockwood828d19d2010-08-10 15:20:35 -0400817 result = new MtpProperty(property, MTP_TYPE_STR);
818 break;
Mike Lockwood5ebac832010-10-12 11:33:47 -0400819 case MTP_PROPERTY_OBJECT_FILE_NAME:
Mike Lockwood6a6a3af2010-10-12 14:19:51 -0400820 // We allow renaming files and folders
821 result = new MtpProperty(property, MTP_TYPE_STR, true);
Mike Lockwood5ebac832010-10-12 11:33:47 -0400822 break;
Mike Lockwood828d19d2010-08-10 15:20:35 -0400823 }
824
825 return result;
826}
827
828MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) {
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400829 MtpProperty* result = NULL;
830 switch (property) {
831 case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER:
832 case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME:
Mike Lockwooda2a21282010-09-25 21:21:05 -0400833 {
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400834 // writeable string properties
835 result = new MtpProperty(property, MTP_TYPE_STR, true);
Mike Lockwooda2a21282010-09-25 21:21:05 -0400836
837 // set current value
838 JNIEnv* env = AndroidRuntime::getJNIEnv();
839 jint ret = env->CallIntMethod(mDatabase, method_getDeviceProperty,
840 (jint)property, mLongBuffer, mStringBuffer);
841 if (ret == MTP_RESPONSE_OK) {
842 jchar* str = env->GetCharArrayElements(mStringBuffer, 0);
843 result->setCurrentValue(str);
844 env->ReleaseCharArrayElements(mStringBuffer, str, 0);
845 } else {
846 LOGE("unable to read device property, response: %04X", ret);
847 }
848
849 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400850 break;
Mike Lockwooda2a21282010-09-25 21:21:05 -0400851 }
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400852 }
853
854 return result;
Mike Lockwood828d19d2010-08-10 15:20:35 -0400855}
856
Mike Lockwood2837eef2010-08-31 16:25:12 -0400857void MyMtpDatabase::sessionStarted() {
858 JNIEnv* env = AndroidRuntime::getJNIEnv();
859 env->CallVoidMethod(mDatabase, method_sessionStarted);
860 checkAndClearExceptionFromCallback(env, __FUNCTION__);
861}
862
863void MyMtpDatabase::sessionEnded() {
864 JNIEnv* env = AndroidRuntime::getJNIEnv();
865 env->CallVoidMethod(mDatabase, method_sessionEnded);
866 checkAndClearExceptionFromCallback(env, __FUNCTION__);
867}
868
Mike Lockwoodff164a72010-07-15 15:01:17 -0400869#endif // HAVE_ANDROID_OS
870
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400871// ----------------------------------------------------------------------------
872
873static void
874android_media_MtpDatabase_setup(JNIEnv *env, jobject thiz)
875{
Mike Lockwoodff164a72010-07-15 15:01:17 -0400876#ifdef HAVE_ANDROID_OS
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400877 LOGD("setup\n");
878 MyMtpDatabase* database = new MyMtpDatabase(env, thiz);
879 env->SetIntField(thiz, field_context, (int)database);
880 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwoodff164a72010-07-15 15:01:17 -0400881#endif
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400882}
883
884static void
885android_media_MtpDatabase_finalize(JNIEnv *env, jobject thiz)
886{
Mike Lockwoodff164a72010-07-15 15:01:17 -0400887#ifdef HAVE_ANDROID_OS
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400888 LOGD("finalize\n");
889 MyMtpDatabase* database = (MyMtpDatabase *)env->GetIntField(thiz, field_context);
890 database->cleanup(env);
891 delete database;
892 env->SetIntField(thiz, field_context, 0);
893 checkAndClearExceptionFromCallback(env, __FUNCTION__);
Mike Lockwoodff164a72010-07-15 15:01:17 -0400894#endif
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400895}
896
897// ----------------------------------------------------------------------------
898
899static JNINativeMethod gMethods[] = {
900 {"native_setup", "()V", (void *)android_media_MtpDatabase_setup},
901 {"native_finalize", "()V", (void *)android_media_MtpDatabase_finalize},
902};
903
904static const char* const kClassPathName = "android/media/MtpDatabase";
905
906int register_android_media_MtpDatabase(JNIEnv *env)
907{
908 jclass clazz;
909
910 LOGD("register_android_media_MtpDatabase\n");
911
912 clazz = env->FindClass("android/media/MtpDatabase");
913 if (clazz == NULL) {
914 LOGE("Can't find android/media/MtpDatabase");
915 return -1;
916 }
Mike Lockwoodd815f792010-07-12 08:49:01 -0400917 method_beginSendObject = env->GetMethodID(clazz, "beginSendObject", "(Ljava/lang/String;IIIJJ)I");
918 if (method_beginSendObject == NULL) {
919 LOGE("Can't find beginSendObject");
920 return -1;
921 }
922 method_endSendObject = env->GetMethodID(clazz, "endSendObject", "(Ljava/lang/String;IIZ)V");
923 if (method_endSendObject == NULL) {
924 LOGE("Can't find endSendObject");
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400925 return -1;
926 }
927 method_getObjectList = env->GetMethodID(clazz, "getObjectList", "(III)[I");
928 if (method_getObjectList == NULL) {
929 LOGE("Can't find getObjectList");
930 return -1;
931 }
Mike Lockwood7a047c82010-08-02 10:52:20 -0400932 method_getNumObjects = env->GetMethodID(clazz, "getNumObjects", "(III)I");
933 if (method_getNumObjects == NULL) {
934 LOGE("Can't find getNumObjects");
935 return -1;
936 }
Mike Lockwood4b322ce2010-08-10 07:37:50 -0400937 method_getSupportedPlaybackFormats = env->GetMethodID(clazz, "getSupportedPlaybackFormats", "()[I");
938 if (method_getSupportedPlaybackFormats == NULL) {
939 LOGE("Can't find getSupportedPlaybackFormats");
940 return -1;
941 }
942 method_getSupportedCaptureFormats = env->GetMethodID(clazz, "getSupportedCaptureFormats", "()[I");
943 if (method_getSupportedCaptureFormats == NULL) {
944 LOGE("Can't find getSupportedCaptureFormats");
945 return -1;
946 }
947 method_getSupportedObjectProperties = env->GetMethodID(clazz, "getSupportedObjectProperties", "(I)[I");
948 if (method_getSupportedObjectProperties == NULL) {
949 LOGE("Can't find getSupportedObjectProperties");
950 return -1;
951 }
952 method_getSupportedDeviceProperties = env->GetMethodID(clazz, "getSupportedDeviceProperties", "()[I");
953 if (method_getSupportedDeviceProperties == NULL) {
954 LOGE("Can't find getSupportedDeviceProperties");
955 return -1;
956 }
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400957 method_getObjectProperty = env->GetMethodID(clazz, "getObjectProperty", "(II[J[C)I");
958 if (method_getObjectProperty == NULL) {
959 LOGE("Can't find getObjectProperty");
960 return -1;
961 }
Mike Lockwood59e3f0d2010-09-02 14:57:30 -0400962 method_setObjectProperty = env->GetMethodID(clazz, "setObjectProperty", "(IIJLjava/lang/String;)I");
963 if (method_setObjectProperty == NULL) {
964 LOGE("Can't find setObjectProperty");
965 return -1;
966 }
967 method_getDeviceProperty = env->GetMethodID(clazz, "getDeviceProperty", "(I[J[C)I");
968 if (method_getDeviceProperty == NULL) {
969 LOGE("Can't find getDeviceProperty");
970 return -1;
971 }
972 method_setDeviceProperty = env->GetMethodID(clazz, "setDeviceProperty", "(IJLjava/lang/String;)I");
973 if (method_setDeviceProperty == NULL) {
974 LOGE("Can't find setDeviceProperty");
975 return -1;
976 }
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400977 method_getObjectInfo = env->GetMethodID(clazz, "getObjectInfo", "(I[I[C[J)Z");
978 if (method_getObjectInfo == NULL) {
979 LOGE("Can't find getObjectInfo");
980 return -1;
981 }
Mike Lockwood59c777a2010-08-02 10:37:41 -0400982 method_getObjectFilePath = env->GetMethodID(clazz, "getObjectFilePath", "(I[C[J)I");
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400983 if (method_getObjectFilePath == NULL) {
984 LOGE("Can't find getObjectFilePath");
985 return -1;
986 }
Mike Lockwood59c777a2010-08-02 10:37:41 -0400987 method_deleteFile = env->GetMethodID(clazz, "deleteFile", "(I)I");
Mike Lockwoodd21eac92010-07-03 00:44:05 -0400988 if (method_deleteFile == NULL) {
989 LOGE("Can't find deleteFile");
990 return -1;
991 }
Mike Lockwood9a2046f2010-08-03 15:30:09 -0400992 method_getObjectReferences = env->GetMethodID(clazz, "getObjectReferences", "(I)[I");
993 if (method_getObjectReferences == NULL) {
994 LOGE("Can't find getObjectReferences");
995 return -1;
996 }
997 method_setObjectReferences = env->GetMethodID(clazz, "setObjectReferences", "(I[I)I");
998 if (method_setObjectReferences == NULL) {
999 LOGE("Can't find setObjectReferences");
1000 return -1;
1001 }
Mike Lockwood2837eef2010-08-31 16:25:12 -04001002 method_sessionStarted = env->GetMethodID(clazz, "sessionStarted", "()V");
1003 if (method_sessionStarted == NULL) {
1004 LOGE("Can't find sessionStarted");
1005 return -1;
1006 }
1007 method_sessionEnded = env->GetMethodID(clazz, "sessionEnded", "()V");
1008 if (method_sessionEnded == NULL) {
1009 LOGE("Can't find sessionEnded");
1010 return -1;
1011 }
1012
Mike Lockwoodd21eac92010-07-03 00:44:05 -04001013 field_context = env->GetFieldID(clazz, "mNativeContext", "I");
1014 if (field_context == NULL) {
1015 LOGE("Can't find MtpDatabase.mNativeContext");
1016 return -1;
1017 }
1018
1019 return AndroidRuntime::registerNativeMethods(env,
1020 "android/media/MtpDatabase", gMethods, NELEM(gMethods));
1021}