Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(467)

Side by Side Diff: components/devtools_bridge/android/session_dependency_factory_android.cc

Issue 719043002: Data channel implementation for SessionDependencyFactory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@native-factory-2
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/devtools_bridge/android/session_dependency_factory_android. h" 5 #include "components/devtools_bridge/android/session_dependency_factory_android. h"
6 6
7 #include "base/android/jni_string.h" 7 #include "base/android/jni_string.h"
8 #include "base/android/scoped_java_ref.h" 8 #include "base/android/scoped_java_ref.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "components/devtools_bridge/abstract_data_channel.h" 10 #include "components/devtools_bridge/abstract_data_channel.h"
11 #include "components/devtools_bridge/abstract_peer_connection.h" 11 #include "components/devtools_bridge/abstract_peer_connection.h"
12 #include "components/devtools_bridge/rtc_configuration.h" 12 #include "components/devtools_bridge/rtc_configuration.h"
13 #include "jni/SessionDependencyFactoryNative_jni.h" 13 #include "jni/SessionDependencyFactoryNative_jni.h"
14 14
15 using base::android::AttachCurrentThread; 15 using base::android::AttachCurrentThread;
16 using base::android::ConvertJavaStringToUTF8; 16 using base::android::ConvertJavaStringToUTF8;
17 using base::android::ConvertUTF8ToJavaString; 17 using base::android::ConvertUTF8ToJavaString;
18 18
19 namespace devtools_bridge { 19 namespace devtools_bridge {
20 namespace android { 20 namespace android {
21 21
22 namespace { 22 namespace {
23 23
24 /**
25 * Wraps Java observer and adapts it to native delegate. Chromium code normally
26 * leaves local java references for automatic disposing. It doesn't happen here
27 * (because calls originated from native thread). For instance:
28 *
29 * ConvertUTF8ToJavaString(env, ...).obj()
mnaganov (inactive) 2014/11/18 16:41:17 Looks good, but I'd re-arrange this as: "For inst
SeRya 2014/11/18 16:58:08 Done.
30 *
31 * should be used instead of
32 *
33 * ConvertUTF8ToJavaString(env, ...).Release()
34 *
35 * or ScopedJavaLocalFrame needed.
36 */
24 class PeerConnectionDelegateImpl 37 class PeerConnectionDelegateImpl
25 : public AbstractPeerConnection::Delegate { 38 : public AbstractPeerConnection::Delegate {
26 public: 39 public:
27 PeerConnectionDelegateImpl(JNIEnv* env, jobject java_object) { 40 PeerConnectionDelegateImpl(JNIEnv* env, jobject java_object) {
28 java_object_.Reset(env, java_object); 41 java_object_.Reset(env, java_object);
29 connected_ = false; 42 connected_ = false;
30 } 43 }
31 44
32 virtual void OnIceConnectionChange(bool connected) override { 45 virtual void OnIceConnectionChange(bool connected) override {
33 JNIEnv* env = AttachCurrentThread(); 46 JNIEnv* env = AttachCurrentThread();
34 Java_SessionDependencyFactoryNative_notifyIceConnectionChange( 47 Java_SessionDependencyFactoryNative_notifyIceConnectionChange(
35 env, java_object_.obj(), connected); 48 env, java_object_.obj(), connected);
36 } 49 }
37 50
38 virtual void OnIceCandidate( 51 virtual void OnIceCandidate(
39 const std::string& sdp_mid, int sdp_mline_index, const std::string& sdp) 52 const std::string& sdp_mid, int sdp_mline_index, const std::string& sdp)
40 override { 53 override {
41 JNIEnv* env = AttachCurrentThread(); 54 JNIEnv* env = AttachCurrentThread();
42 Java_SessionDependencyFactoryNative_notifyIceCandidate( 55 Java_SessionDependencyFactoryNative_notifyIceCandidate(
43 env, java_object_.obj(), 56 env, java_object_.obj(),
44 ConvertUTF8ToJavaString(env, sdp_mid).Release(), 57 ConvertUTF8ToJavaString(env, sdp_mid).obj(),
45 sdp_mline_index, ConvertUTF8ToJavaString(env, sdp).Release()); 58 sdp_mline_index, ConvertUTF8ToJavaString(env, sdp).obj());
46 } 59 }
47 60
48 void NotifyLocalOfferCreatedAndSetSet(const std::string& description) { 61 void NotifyLocalOfferCreatedAndSetSet(const std::string& description) {
49 JNIEnv* env = AttachCurrentThread(); 62 JNIEnv* env = AttachCurrentThread();
50 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( 63 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet(
51 env, java_object_.obj(), 64 env, java_object_.obj(),
52 ConvertUTF8ToJavaString(env, description).Release()); 65 ConvertUTF8ToJavaString(env, description).obj());
53 } 66 }
54 67
55 virtual void OnLocalOfferCreatedAndSetSet(const std::string& description) 68 virtual void OnLocalOfferCreatedAndSetSet(const std::string& description)
56 override { 69 override {
57 JNIEnv* env = AttachCurrentThread(); 70 JNIEnv* env = AttachCurrentThread();
58 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( 71 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet(
59 env, java_object_.obj(), 72 env, java_object_.obj(),
60 ConvertUTF8ToJavaString(env, description).Release()); 73 ConvertUTF8ToJavaString(env, description).obj());
61 } 74 }
62 75
63 virtual void OnLocalAnswerCreatedAndSetSet(const std::string& description) 76 virtual void OnLocalAnswerCreatedAndSetSet(const std::string& description)
64 override { 77 override {
65 JNIEnv* env = AttachCurrentThread(); 78 JNIEnv* env = AttachCurrentThread();
66 Java_SessionDependencyFactoryNative_notifyLocalAnswerCreatedAndSetSet( 79 Java_SessionDependencyFactoryNative_notifyLocalAnswerCreatedAndSetSet(
67 env, java_object_.obj(), 80 env, java_object_.obj(),
68 ConvertUTF8ToJavaString(env, description).Release()); 81 ConvertUTF8ToJavaString(env, description).obj());
69 } 82 }
70 83
71 virtual void OnRemoteDescriptionSet() override { 84 virtual void OnRemoteDescriptionSet() override {
72 JNIEnv* env = AttachCurrentThread(); 85 JNIEnv* env = AttachCurrentThread();
73 Java_SessionDependencyFactoryNative_notifyRemoteDescriptionSet( 86 Java_SessionDependencyFactoryNative_notifyRemoteDescriptionSet(
74 env, java_object_.obj()); 87 env, java_object_.obj());
75 } 88 }
76 89
77 virtual void OnFailure(const std::string& description) override { 90 virtual void OnFailure(const std::string& description) override {
78 JNIEnv* env = AttachCurrentThread(); 91 JNIEnv* env = AttachCurrentThread();
79 Java_SessionDependencyFactoryNative_notifyConnectionFailure( 92 Java_SessionDependencyFactoryNative_notifyConnectionFailure(
80 env, java_object_.obj(), 93 env, java_object_.obj(),
81 ConvertUTF8ToJavaString(env, description).Release()); 94 ConvertUTF8ToJavaString(env, description).obj());
82 } 95 }
83 96
84 private: 97 private:
85 base::android::ScopedJavaGlobalRef<jobject> java_object_; 98 base::android::ScopedJavaGlobalRef<jobject> java_object_;
86 bool connected_; 99 bool connected_;
87 }; 100 };
88 101
102 class DataChannelObserverImpl : public AbstractDataChannel::Observer {
103 public:
104 DataChannelObserverImpl(JNIEnv* env, jobject java_object) {
105 java_object_.Reset(env, java_object);
106 }
107
108 virtual void OnOpen() override {
109 JNIEnv* env = AttachCurrentThread();
110 Java_SessionDependencyFactoryNative_notifyChannelOpen(
111 env, java_object_.obj());
112 }
113
114 virtual void OnClose() override {
115 JNIEnv* env = AttachCurrentThread();
116 Java_SessionDependencyFactoryNative_notifyChannelClose(
117 env, java_object_.obj());
118 }
119
120 virtual void OnMessage(const void* data, size_t length) override {
121 JNIEnv* env = AttachCurrentThread();
122
123 ScopedJavaLocalRef<jobject> byte_buffer(
124 env, env->NewDirectByteBuffer(const_cast<void*>(data), length));
125
126 Java_SessionDependencyFactoryNative_notifyMessage(
127 env, java_object_.obj(), byte_buffer.obj());
128 }
129
130 private:
131 base::android::ScopedJavaGlobalRef<jobject> java_object_;
132 };
133
89 static void CleanupOnSignalingThread() { 134 static void CleanupOnSignalingThread() {
90 // Called on signaling thread when SessionDependencyFactory is destroying. 135 // Called on signaling thread when SessionDependencyFactory is destroying.
91 base::android::DetachFromVM(); 136 base::android::DetachFromVM();
92 } 137 }
93 138
94 } // namespace 139 } // namespace
95 140
96 // SessionDependencyFactoryNative 141 // SessionDependencyFactoryNative
97 142
98 SessionDependencyFactoryAndroid::SessionDependencyFactoryAndroid() 143 SessionDependencyFactoryAndroid::SessionDependencyFactoryAndroid()
(...skipping 15 matching lines...) Expand all
114 scoped_ptr<AbstractPeerConnection::Delegate> delegate) { 159 scoped_ptr<AbstractPeerConnection::Delegate> delegate) {
115 return impl_->CreatePeerConnection(config.Pass(), delegate.Pass()); 160 return impl_->CreatePeerConnection(config.Pass(), delegate.Pass());
116 } 161 }
117 162
118 // JNI generated methods 163 // JNI generated methods
119 164
120 static jlong CreateFactory(JNIEnv* env, jclass jcaller) { 165 static jlong CreateFactory(JNIEnv* env, jclass jcaller) {
121 return reinterpret_cast<jlong>(new SessionDependencyFactoryAndroid()); 166 return reinterpret_cast<jlong>(new SessionDependencyFactoryAndroid());
122 } 167 }
123 168
124 static void DestroyFactory(JNIEnv* env, jclass jcaller, jlong factoryPtr) { 169 static void DestroyFactory(JNIEnv* env, jclass jcaller, jlong factory_ptr) {
125 delete reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); 170 delete reinterpret_cast<SessionDependencyFactoryAndroid*>(factory_ptr);
126 } 171 }
127 172
128 static jlong CreateConfig(JNIEnv* env, jclass jcaller) { 173 static jlong CreateConfig(JNIEnv* env, jclass jcaller) {
129 return reinterpret_cast<jlong>( 174 return reinterpret_cast<jlong>(
130 RTCConfiguration::CreateInstance().release()); 175 RTCConfiguration::CreateInstance().release());
131 } 176 }
132 177
133 static void AddIceServer( 178 static void AddIceServer(
134 JNIEnv* env, jclass jcaller, jlong configPtr, 179 JNIEnv* env, jclass jcaller, jlong config_ptr,
135 jstring uri, jstring username, jstring credential) { 180 jstring uri, jstring username, jstring credential) {
136 reinterpret_cast<RTCConfiguration*>(configPtr)->AddIceServer( 181 reinterpret_cast<RTCConfiguration*>(config_ptr)->AddIceServer(
137 ConvertJavaStringToUTF8(env, uri), 182 ConvertJavaStringToUTF8(env, uri),
138 ConvertJavaStringToUTF8(env, username), 183 ConvertJavaStringToUTF8(env, username),
139 ConvertJavaStringToUTF8(env, credential)); 184 ConvertJavaStringToUTF8(env, credential));
140 } 185 }
141 186
142 static jlong CreatePeerConnection( 187 static jlong CreatePeerConnection(
143 JNIEnv* env, jclass jcaller, 188 JNIEnv* env, jclass jcaller,
144 jlong factoryPtr, jlong configPtr, jobject observer) { 189 jlong factory_ptr, jlong config_ptr, jobject observer) {
145 auto factory = 190 auto factory =
146 reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); 191 reinterpret_cast<SessionDependencyFactoryAndroid*>(factory_ptr);
147 auto config = reinterpret_cast<RTCConfiguration*>(configPtr); 192 auto config = reinterpret_cast<RTCConfiguration*>(config_ptr);
148 193
149 auto delegate = new PeerConnectionDelegateImpl(env, observer); 194 auto delegate = new PeerConnectionDelegateImpl(env, observer);
150 195
151 return reinterpret_cast<jlong>(factory->CreatePeerConnection( 196 return reinterpret_cast<jlong>(factory->CreatePeerConnection(
152 make_scoped_ptr(config), make_scoped_ptr(delegate)).release()); 197 make_scoped_ptr(config), make_scoped_ptr(delegate)).release());
153 } 198 }
154 199
155 static void DestroyPeerConnection( 200 static void DestroyPeerConnection(
156 JNIEnv* env, jclass jcaller, jlong connectionPtr) { 201 JNIEnv* env, jclass jcaller, jlong connection_ptr) {
157 delete reinterpret_cast<AbstractPeerConnection*>(connectionPtr); 202 delete reinterpret_cast<AbstractPeerConnection*>(connection_ptr);
158 } 203 }
159 204
160 static void CreateAndSetLocalOffer( 205 static void CreateAndSetLocalOffer(
161 JNIEnv* env, jclass jcaller, jlong connectionPtr) { 206 JNIEnv* env, jclass jcaller, jlong connection_ptr) {
162 reinterpret_cast<AbstractPeerConnection*>( 207 reinterpret_cast<AbstractPeerConnection*>(
163 connectionPtr)->CreateAndSetLocalOffer(); 208 connection_ptr)->CreateAndSetLocalOffer();
164 } 209 }
165 210
166 static void CreateAndSetLocalAnswer( 211 static void CreateAndSetLocalAnswer(
167 JNIEnv* env, jclass jcaller, jlong connectionPtr) { 212 JNIEnv* env, jclass jcaller, jlong connection_ptr) {
168 reinterpret_cast<AbstractPeerConnection*>( 213 reinterpret_cast<AbstractPeerConnection*>(
169 connectionPtr)->CreateAndSetLocalAnswer(); 214 connection_ptr)->CreateAndSetLocalAnswer();
170 } 215 }
171 216
172 static void SetRemoteOffer( 217 static void SetRemoteOffer(
173 JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { 218 JNIEnv* env, jclass jcaller, jlong connection_ptr, jstring description) {
174 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteOffer( 219 reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->SetRemoteOffer(
175 ConvertJavaStringToUTF8(env, description)); 220 ConvertJavaStringToUTF8(env, description));
176 } 221 }
177 222
178 static void SetRemoteAnswer( 223 static void SetRemoteAnswer(
179 JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { 224 JNIEnv* env, jclass jcaller, jlong connection_ptr, jstring description) {
180 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteAnswer( 225 reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->SetRemoteAnswer(
181 ConvertJavaStringToUTF8(env, description)); 226 ConvertJavaStringToUTF8(env, description));
182 } 227 }
183 228
184 static void AddIceCandidate( 229 static void AddIceCandidate(
185 JNIEnv* env, jclass jcaller, 230 JNIEnv* env, jclass jcaller,
186 jlong connectionPtr, jstring sdpMid, jint sdpMLineIndex, jstring sdp) { 231 jlong connection_ptr, jstring sdp_mid, jint sdp_mline_index, jstring sdp) {
187 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->AddIceCandidate( 232 reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->AddIceCandidate(
188 ConvertJavaStringToUTF8(env, sdpMid), 233 ConvertJavaStringToUTF8(env, sdp_mid),
189 sdpMLineIndex, 234 sdp_mline_index,
190 ConvertJavaStringToUTF8(env, sdp)); 235 ConvertJavaStringToUTF8(env, sdp));
191 } 236 }
192 237
193 static jlong CreateDataChannel( 238 static jlong CreateDataChannel(
194 JNIEnv* env, jclass jcaller, jlong connectionPtr, jint channelId) { 239 JNIEnv* env, jclass jcaller, jlong connection_ptr, jint channel_id) {
195 return reinterpret_cast<jlong>( 240 return reinterpret_cast<jlong>(
196 reinterpret_cast<AbstractPeerConnection*>( 241 reinterpret_cast<AbstractPeerConnection*>(
197 connectionPtr)->CreateDataChannel(channelId).release()); 242 connection_ptr)->CreateDataChannel(channel_id).release());
198 } 243 }
199 244
200 static void DestroyDataChannel( 245 static void DestroyDataChannel(
201 JNIEnv* env, jclass jcaller, jlong channelPtr) { 246 JNIEnv* env, jclass jcaller, jlong channel_ptr) {
202 delete reinterpret_cast<AbstractDataChannel*>(channelPtr); 247 delete reinterpret_cast<AbstractDataChannel*>(channel_ptr);
248 }
249
250 static void RegisterDataChannelObserver(
251 JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject observer) {
252 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->RegisterObserver(
253 make_scoped_ptr(new DataChannelObserverImpl(env, observer)));
254 }
255
256 static void UnregisterDataChannelObserver(
257 JNIEnv* env, jclass jcaller, jlong channel_ptr) {
258 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->UnregisterObserver();
259 }
260
261 static void SendBinaryMessage(
262 JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject message,
263 jint size) {
264 DCHECK(size > 0);
265 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->SendBinaryMessage(
266 env->GetDirectBufferAddress(message), size);
267 }
268
269 static void SendTextMessage(
270 JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject message,
271 jint size) {
272 DCHECK(size > 0);
273 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->SendTextMessage(
274 env->GetDirectBufferAddress(message), size);
275 }
276
277 static void CloseDataChannel(JNIEnv* env, jclass jcaller, jlong channel_ptr) {
278 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->Close();
203 } 279 }
204 280
205 } // namespace android 281 } // namespace android
206 } // namespace devtools_bridge 282 } // namespace devtools_bridge
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698