OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |