198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood/*
298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * Copyright (C) 2010 The Android Open Source Project
398ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood *
498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License");
598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * you may not use this file except in compliance with the License.
698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * You may obtain a copy of the License at
798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood *
898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood *      http://www.apache.org/licenses/LICENSE-2.0
998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood *
1098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * Unless required by applicable law or agreed to in writing, software
1198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS,
1298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * See the License for the specific language governing permissions and
1498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood * limitations under the License.
1598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood */
1698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
1798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#define LOG_TAG "MtpServerJNI"
1898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "utils/Log.h"
1998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
2098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <stdio.h>
2198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <assert.h>
2298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <limits.h>
2398ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <unistd.h>
2498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <fcntl.h>
2598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include <utils/threads.h>
2698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
2798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "jni.h"
2898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "JNIHelp.h"
2998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "android_runtime/AndroidRuntime.h"
30dad69277b7fdcc2759bec5a35ac45dae8f61ec9bMike Lockwood#include "private/android_filesystem_config.h"
3198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
3298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood#include "MtpServer.h"
33467ca0de6d7fd55787a37de9dfd7e5325e1c3c6fMike Lockwood#include "MtpStorage.h"
3498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
3581ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwoodusing namespace android;
3698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
37dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood// MtpServer fields
38dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodstatic jfieldID field_MtpServer_nativeContext;
39b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood
40b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood// MtpStorage fields
41b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_storageId;
42b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_path;
43b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_description;
44b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic jfieldID field_MtpStorage_reserveSpace;
4551690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwoodstatic jfieldID field_MtpStorage_removable;
467a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwoodstatic jfieldID field_MtpStorage_maxFileSize;
47b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood
48b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic Mutex sMutex;
49b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood
5098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood// ----------------------------------------------------------------------------
5198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
520cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood// in android_mtp_MtpDatabase.cpp
53d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwoodextern MtpDatabase* getMtpDatabase(JNIEnv *env, jobject database);
5498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
55dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodstatic inline MtpServer* getMtpServer(JNIEnv *env, jobject thiz) {
56e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat    return (MtpServer*)env->GetLongField(thiz, field_MtpServer_nativeContext);
5798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood}
5898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
5998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwoodstatic void
607d40d42a364f520da853b41956b0a18ed172491bMike Lockwoodandroid_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jboolean usePtp)
6198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{
62dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    int fd = open("/dev/mtp_usb", O_RDWR);
63dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (fd >= 0) {
64dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        MtpServer* server = new MtpServer(fd, getMtpDatabase(env, javaDatabase),
65dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood                usePtp, AID_MEDIA_RW, 0664, 0775);
66e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat        env->SetLongField(thiz, field_MtpServer_nativeContext, (jlong)server);
67dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    } else {
683762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("could not open MTP driver, errno: %d", errno);
69dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    }
7098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood}
7198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
7298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwoodstatic void
73dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodandroid_mtp_MtpServer_run(JNIEnv *env, jobject thiz)
7498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{
75dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    MtpServer* server = getMtpServer(env, thiz);
76dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (server)
77dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        server->run();
78dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    else
793762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("server is null in run");
8098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood}
8198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
8298ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwoodstatic void
83dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwoodandroid_mtp_MtpServer_cleanup(JNIEnv *env, jobject thiz)
8498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{
85dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    Mutex::Autolock autoLock(sMutex);
86dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood
87dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    MtpServer* server = getMtpServer(env, thiz);
88dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (server) {
89dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        delete server;
90e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat        env->SetLongField(thiz, field_MtpServer_nativeContext, 0);
91dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    } else {
923762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("server is null in cleanup");
93071b2b6739c83d3de806cda5d7be2aba33fde1afMike Lockwood    }
9498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood}
9598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
96be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwoodstatic void
970cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodandroid_mtp_MtpServer_send_object_added(JNIEnv *env, jobject thiz, jint handle)
98be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood{
99dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    Mutex::Autolock autoLock(sMutex);
100dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood
101dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    MtpServer* server = getMtpServer(env, thiz);
102dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (server)
103dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        server->sendObjectAdded(handle);
104dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    else
1053762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("server is null in send_object_added");
106be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood}
107be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood
108be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwoodstatic void
1090cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodandroid_mtp_MtpServer_send_object_removed(JNIEnv *env, jobject thiz, jint handle)
110be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood{
111dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    Mutex::Autolock autoLock(sMutex);
112dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood
113dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    MtpServer* server = getMtpServer(env, thiz);
114dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (server)
115dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        server->sendObjectRemoved(handle);
116dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    else
1173762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("server is null in send_object_removed");
118be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood}
119be125a50b41f15810145671e0fcbdaf13b363e03Mike Lockwood
120eabe8bfaf8c45289a4cfd880f4107d1a9b17e38bMike Lockwoodstatic void
12156c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwoodandroid_mtp_MtpServer_send_device_property_changed(JNIEnv *env, jobject thiz, jint property)
12256c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood{
12356c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood    Mutex::Autolock autoLock(sMutex);
12456c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood
12556c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood    MtpServer* server = getMtpServer(env, thiz);
12656c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood    if (server)
12756c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood        server->sendDevicePropertyChanged(property);
12856c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood    else
12956c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood        ALOGE("server is null in send_object_removed");
13056c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood}
13156c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood
13256c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwoodstatic void
133b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodandroid_mtp_MtpServer_add_storage(JNIEnv *env, jobject thiz, jobject jstorage)
13466e57f6aa9d206552e9b154bf00a17d6efae7fb0Mike Lockwood{
135dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    Mutex::Autolock autoLock(sMutex);
136dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood
137dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    MtpServer* server = getMtpServer(env, thiz);
138dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (server) {
139b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        jint storageID = env->GetIntField(jstorage, field_MtpStorage_storageId);
140b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        jstring path = (jstring)env->GetObjectField(jstorage, field_MtpStorage_path);
141b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        jstring description = (jstring)env->GetObjectField(jstorage, field_MtpStorage_description);
142b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        jlong reserveSpace = env->GetLongField(jstorage, field_MtpStorage_reserveSpace);
14351690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood        jboolean removable = env->GetBooleanField(jstorage, field_MtpStorage_removable);
1447a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        jlong maxFileSize = env->GetLongField(jstorage, field_MtpStorage_maxFileSize);
145b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood
146b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        const char *pathStr = env->GetStringUTFChars(path, NULL);
1473977472d9f3380a8323156dbc7d0090cf2f2d310James Dong        if (pathStr != NULL) {
1483977472d9f3380a8323156dbc7d0090cf2f2d310James Dong            const char *descriptionStr = env->GetStringUTFChars(description, NULL);
1493977472d9f3380a8323156dbc7d0090cf2f2d310James Dong            if (descriptionStr != NULL) {
1507a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood                MtpStorage* storage = new MtpStorage(storageID, pathStr, descriptionStr,
1517a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood                        reserveSpace, removable, maxFileSize);
152dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood                server->addStorage(storage);
1533977472d9f3380a8323156dbc7d0090cf2f2d310James Dong                env->ReleaseStringUTFChars(path, pathStr);
1543977472d9f3380a8323156dbc7d0090cf2f2d310James Dong                env->ReleaseStringUTFChars(description, descriptionStr);
1553977472d9f3380a8323156dbc7d0090cf2f2d310James Dong            } else {
1563977472d9f3380a8323156dbc7d0090cf2f2d310James Dong                env->ReleaseStringUTFChars(path, pathStr);
1573977472d9f3380a8323156dbc7d0090cf2f2d310James Dong            }
1583977472d9f3380a8323156dbc7d0090cf2f2d310James Dong        }
159b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    } else {
1603762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("server is null in add_storage");
161b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    }
162b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood}
163b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood
164b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodstatic void
165b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwoodandroid_mtp_MtpServer_remove_storage(JNIEnv *env, jobject thiz, jint storageId)
166b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood{
167dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    Mutex::Autolock autoLock(sMutex);
168dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood
169dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    MtpServer* server = getMtpServer(env, thiz);
170dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (server) {
171dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        MtpStorage* storage = server->getStorage(storageId);
172dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        if (storage) {
173dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood            server->removeStorage(storage);
174dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood            delete storage;
175dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        }
176dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    } else
1773762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("server is null in remove_storage");
17866e57f6aa9d206552e9b154bf00a17d6efae7fb0Mike Lockwood}
17966e57f6aa9d206552e9b154bf00a17d6efae7fb0Mike Lockwood
18098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood// ----------------------------------------------------------------------------
18198ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
18276f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
1837d40d42a364f520da853b41956b0a18ed172491bMike Lockwood    {"native_setup",                "(Landroid/mtp/MtpDatabase;Z)V",
1840cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood                                            (void *)android_mtp_MtpServer_setup},
185dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    {"native_run",                  "()V",  (void *)android_mtp_MtpServer_run},
186dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    {"native_cleanup",              "()V",  (void *)android_mtp_MtpServer_cleanup},
1870cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood    {"native_send_object_added",    "(I)V", (void *)android_mtp_MtpServer_send_object_added},
1880cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood    {"native_send_object_removed",  "(I)V", (void *)android_mtp_MtpServer_send_object_removed},
18956c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood    {"native_send_device_property_changed",  "(I)V",
19056c85244b9be0fc6f6c2baf5f9a53f2364d5ec5eMike Lockwood                                    (void *)android_mtp_MtpServer_send_device_property_changed},
191b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    {"native_add_storage",          "(Landroid/mtp/MtpStorage;)V",
192b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood                                            (void *)android_mtp_MtpServer_add_storage},
193b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    {"native_remove_storage",       "(I)V", (void *)android_mtp_MtpServer_remove_storage},
19498ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood};
19598ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
1960cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodint register_android_mtp_MtpServer(JNIEnv *env)
19798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood{
19898ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood    jclass clazz;
19998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
200b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    clazz = env->FindClass("android/mtp/MtpStorage");
201b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    if (clazz == NULL) {
2023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find android/mtp/MtpStorage");
203b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        return -1;
204b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    }
205b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    field_MtpStorage_storageId = env->GetFieldID(clazz, "mStorageId", "I");
206b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    if (field_MtpStorage_storageId == NULL) {
2073762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find MtpStorage.mStorageId");
208b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        return -1;
209b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    }
210b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    field_MtpStorage_path = env->GetFieldID(clazz, "mPath", "Ljava/lang/String;");
211b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    if (field_MtpStorage_path == NULL) {
2123762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find MtpStorage.mPath");
213b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        return -1;
214b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    }
215b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    field_MtpStorage_description = env->GetFieldID(clazz, "mDescription", "Ljava/lang/String;");
216b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    if (field_MtpStorage_description == NULL) {
2173762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find MtpStorage.mDescription");
218b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        return -1;
219b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    }
220b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    field_MtpStorage_reserveSpace = env->GetFieldID(clazz, "mReserveSpace", "J");
221b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    if (field_MtpStorage_reserveSpace == NULL) {
2223762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find MtpStorage.mReserveSpace");
22351690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood        return -1;
22451690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood    }
22551690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood    field_MtpStorage_removable = env->GetFieldID(clazz, "mRemovable", "Z");
22651690544aaeee82b1c50232cd57d50038b77f0c4Mike Lockwood    if (field_MtpStorage_removable == NULL) {
2273762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find MtpStorage.mRemovable");
228b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood        return -1;
229b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood    }
2307a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    field_MtpStorage_maxFileSize = env->GetFieldID(clazz, "mMaxFileSize", "J");
2317a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    if (field_MtpStorage_maxFileSize == NULL) {
2323762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find MtpStorage.mMaxFileSize");
2337a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood        return -1;
2347a59dd2ce33b46cbc73eef964ddb4272ea1da8d1Mike Lockwood    }
235b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood
2360cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood    clazz = env->FindClass("android/mtp/MtpServer");
23798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood    if (clazz == NULL) {
2383762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find android/mtp/MtpServer");
23998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood        return -1;
24098ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood    }
241e2e59326f13cf291bf5b37989390fd2a55a94f0cAshok Bhat    field_MtpServer_nativeContext = env->GetFieldID(clazz, "mNativeContext", "J");
242dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    if (field_MtpServer_nativeContext == NULL) {
2433762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find MtpServer.mNativeContext");
244dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood        return -1;
245dcc31946f2b78be4bf95b1cace2e2c211f027e72Mike Lockwood    }
24698ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood
24798ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood    return AndroidRuntime::registerNativeMethods(env,
2480cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood                "android/mtp/MtpServer", gMethods, NELEM(gMethods));
24998ef64e4a89ced79094d4ff3dc0123c1989f9e10Mike Lockwood}
250