summaryrefslogtreecommitdiffstats
path: root/media/jni
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2010-07-12 18:54:16 -0400
committerMike Lockwood <lockwood@android.com>2010-07-13 20:04:22 -0400
commitbe125a50b41f15810145671e0fcbdaf13b363e03 (patch)
treea0af388e0524314a55da06d48d16928bfc90c1a0 /media/jni
parent77ad5e64116ba692efea060d528681c069aa439b (diff)
downloadframeworks_base-be125a50b41f15810145671e0fcbdaf13b363e03.zip
frameworks_base-be125a50b41f15810145671e0fcbdaf13b363e03.tar.gz
frameworks_base-be125a50b41f15810145671e0fcbdaf13b363e03.tar.bz2
MTP: Add support for sending events to the host when objects are added and removed
Change-Id: Ia1d5232b919c644c670ff9ca651eca92b3f9ad42 Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/jni')
-rw-r--r--media/jni/android_media_MtpServer.cpp71
1 files changed, 60 insertions, 11 deletions
diff --git a/media/jni/android_media_MtpServer.cpp b/media/jni/android_media_MtpServer.cpp
index 17e85f8..0883527 100644
--- a/media/jni/android_media_MtpServer.cpp
+++ b/media/jni/android_media_MtpServer.cpp
@@ -50,12 +50,14 @@ static bool ExceptionCheck(void* env)
class MtpThread : public Thread {
private:
MtpDatabase* mDatabase;
+ MtpServer* mServer;
String8 mStoragePath;
bool mDone;
+ Mutex mMutex;
public:
MtpThread(MtpDatabase* database, const char* storagePath)
- : mDatabase(database), mStoragePath(storagePath), mDone(false)
+ : mDatabase(database), mServer(NULL), mStoragePath(storagePath), mDone(false)
{
}
@@ -67,14 +69,19 @@ public:
return false;
}
- MtpServer* server = new MtpServer(fd, mDatabase, AID_SDCARD_RW, 0664, 0775);
- server->addStorage(mStoragePath);
+ mMutex.lock();
+ mServer = new MtpServer(fd, mDatabase, AID_SDCARD_RW, 0664, 0775);
+ mServer->addStorage(mStoragePath);
+ mMutex.unlock();
- // temporary
- LOGD("MtpThread server->run");
- server->run();
+ LOGD("MtpThread mServer->run");
+ mServer->run();
close(fd);
- delete server;
+
+ mMutex.lock();
+ delete mServer;
+ mServer = NULL;
+ mMutex.unlock();
bool done = mDone;
if (done)
@@ -84,6 +91,24 @@ public:
}
void setDone() { mDone = true; }
+
+ void sendObjectAdded(MtpObjectHandle handle) {
+ mMutex.lock();
+ if (mServer)
+ mServer->sendObjectAdded(handle);
+ else
+ LOGE("sendObjectAdded called while disconnected\n");
+ mMutex.unlock();
+ }
+
+ void sendObjectRemoved(MtpObjectHandle handle) {
+ mMutex.lock();
+ if (mServer)
+ mServer->sendObjectRemoved(handle);
+ else
+ LOGE("sendObjectRemoved called while disconnected\n");
+ mMutex.unlock();
+ }
};
static void
@@ -126,14 +151,38 @@ android_media_MtpServer_stop(JNIEnv *env, jobject thiz)
}
}
+static void
+android_media_MtpServer_send_object_added(JNIEnv *env, jobject thiz, jint handle)
+{
+ LOGD("send_object_added %d\n", handle);
+ MtpThread *thread = (MtpThread *)env->GetIntField(thiz, field_context);
+ if (thread)
+ thread->sendObjectAdded(handle);
+ else
+ LOGE("sendObjectAdded called while disconnected\n");
+}
+
+static void
+android_media_MtpServer_send_object_removed(JNIEnv *env, jobject thiz, jint handle)
+{
+ LOGD("send_object_removed %d\n", handle);
+ MtpThread *thread = (MtpThread *)env->GetIntField(thiz, field_context);
+ if (thread)
+ thread->sendObjectRemoved(handle);
+ else
+ LOGE("sendObjectRemoved called while disconnected\n");
+}
+
// ----------------------------------------------------------------------------
static JNINativeMethod gMethods[] = {
- {"native_setup", "(Landroid/media/MtpDatabase;Ljava/lang/String;)V",
+ {"native_setup", "(Landroid/media/MtpDatabase;Ljava/lang/String;)V",
(void *)android_media_MtpServer_setup},
- {"native_finalize", "()V", (void *)android_media_MtpServer_finalize},
- {"native_start", "()V", (void *)android_media_MtpServer_start},
- {"native_stop", "()V", (void *)android_media_MtpServer_stop},
+ {"native_finalize", "()V", (void *)android_media_MtpServer_finalize},
+ {"native_start", "()V", (void *)android_media_MtpServer_start},
+ {"native_stop", "()V", (void *)android_media_MtpServer_stop},
+ {"native_send_object_added", "(I)V", (void *)android_media_MtpServer_send_object_added},
+ {"native_send_object_removed", "(I)V", (void *)android_media_MtpServer_send_object_removed},
};
static const char* const kClassPathName = "android/media/MtpServer";