Upstream version 11.40.271.0
[platform/framework/web/crosswalk.git] / src / content / browser / mojo / service_registry_android.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/mojo/service_registry_android.h"
6
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/callback.h"
10 #include "content/common/mojo/service_registry_impl.h"
11 #include "jni/ServiceRegistry_jni.h"
12
13 using base::android::AttachCurrentThread;
14 using base::android::ConvertJavaStringToUTF8;
15 using base::android::ScopedJavaGlobalRef;
16
17 namespace content {
18
19 namespace {
20
21 // Callback passed to the wrapped ServiceRegistry upon AddService(). The
22 // ServiceRegistry will call it to create a registered Java service
23 void CreateImplAndAttach(
24     const ScopedJavaGlobalRef<jobject>& j_scoped_service_registry,
25     const ScopedJavaGlobalRef<jobject>& j_scoped_manager,
26     const ScopedJavaGlobalRef<jobject>& j_scoped_factory,
27     mojo::ScopedMessagePipeHandle handle) {
28   JNIEnv* env = AttachCurrentThread();
29   Java_ServiceRegistry_createImplAndAttach(env,
30                                            j_scoped_service_registry.obj(),
31                                            handle.release().value(),
32                                            j_scoped_manager.obj(),
33                                            j_scoped_factory.obj());
34 }
35
36 }  // namespace
37
38 // static
39 bool ServiceRegistryAndroid::Register(JNIEnv* env) {
40   return RegisterNativesImpl(env);
41 }
42
43 // Constructor and destructor call into Java.
44 ServiceRegistryAndroid::ServiceRegistryAndroid(
45     ServiceRegistryImpl* service_registry)
46     : service_registry_(service_registry) {
47   JNIEnv* env = AttachCurrentThread();
48   obj_.Reset(
49       env,
50       Java_ServiceRegistry_create(env, reinterpret_cast<intptr_t>(this)).obj());
51 }
52
53 ServiceRegistryAndroid::~ServiceRegistryAndroid() {
54   Java_ServiceRegistry_destroy(AttachCurrentThread(), obj_.obj());
55 }
56
57 // Methods called from Java.
58 void ServiceRegistryAndroid::AddService(JNIEnv* env,
59                                         jobject j_service_registry,
60                                         jobject j_manager,
61                                         jobject j_factory,
62                                         jstring j_name) {
63   std::string name(ConvertJavaStringToUTF8(env, j_name));
64
65   ScopedJavaGlobalRef<jobject> j_scoped_service_registry;
66   j_scoped_service_registry.Reset(env, j_service_registry);
67
68   ScopedJavaGlobalRef<jobject> j_scoped_manager;
69   j_scoped_manager.Reset(env, j_manager);
70
71   ScopedJavaGlobalRef<jobject> j_scoped_factory;
72   j_scoped_factory.Reset(env, j_factory);
73
74   service_registry_->AddService(name,
75                                 base::Bind(&CreateImplAndAttach,
76                                            j_scoped_service_registry,
77                                            j_scoped_manager,
78                                            j_scoped_factory));
79 }
80
81 void ServiceRegistryAndroid::RemoveService(JNIEnv* env,
82                                            jobject j_service_registry,
83                                            jstring j_name) {
84   std::string name(ConvertJavaStringToUTF8(env, j_name));
85   service_registry_->RemoveService(name);
86 }
87
88 void ServiceRegistryAndroid::ConnectToRemoteService(JNIEnv* env,
89                                                     jobject j_service_registry,
90                                                     jstring j_name,
91                                                     jint j_handle) {
92   std::string name(ConvertJavaStringToUTF8(env, j_name));
93   mojo::ScopedMessagePipeHandle handle((mojo::MessagePipeHandle(j_handle)));
94   service_registry_->ConnectToRemoteService(name, handle.Pass());
95 }
96
97 }  // namespace content