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

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, instead of
28 *
29 * ConvertUTF8ToJavaString(env, ...).Release()
30 *
31 * please use ConvertUTF8ToJavaString(env, ...).obj() or ScopedJavaLocalFrame.
32 */
24 class PeerConnectionDelegateImpl 33 class PeerConnectionDelegateImpl
25 : public AbstractPeerConnection::Delegate { 34 : public AbstractPeerConnection::Delegate {
26 public: 35 public:
27 PeerConnectionDelegateImpl(JNIEnv* env, jobject java_object) { 36 PeerConnectionDelegateImpl(JNIEnv* env, jobject java_object) {
28 java_object_.Reset(env, java_object); 37 java_object_.Reset(env, java_object);
29 connected_ = false; 38 connected_ = false;
30 } 39 }
31 40
32 virtual void OnIceConnectionChange(bool connected) override { 41 virtual void OnIceConnectionChange(bool connected) override {
33 JNIEnv* env = AttachCurrentThread(); 42 JNIEnv* env = AttachCurrentThread();
34 Java_SessionDependencyFactoryNative_notifyIceConnectionChange( 43 Java_SessionDependencyFactoryNative_notifyIceConnectionChange(
35 env, java_object_.obj(), connected); 44 env, java_object_.obj(), connected);
36 } 45 }
37 46
38 virtual void OnIceCandidate( 47 virtual void OnIceCandidate(
39 const std::string& sdp_mid, int sdp_mline_index, const std::string& sdp) 48 const std::string& sdp_mid, int sdp_mline_index, const std::string& sdp)
40 override { 49 override {
41 JNIEnv* env = AttachCurrentThread(); 50 JNIEnv* env = AttachCurrentThread();
42 Java_SessionDependencyFactoryNative_notifyIceCandidate( 51 Java_SessionDependencyFactoryNative_notifyIceCandidate(
43 env, java_object_.obj(), 52 env, java_object_.obj(),
44 ConvertUTF8ToJavaString(env, sdp_mid).Release(), 53 ConvertUTF8ToJavaString(env, sdp_mid).obj(),
45 sdp_mline_index, ConvertUTF8ToJavaString(env, sdp).Release()); 54 sdp_mline_index, ConvertUTF8ToJavaString(env, sdp).obj());
46 } 55 }
47 56
48 void NotifyLocalOfferCreatedAndSetSet(const std::string& description) { 57 void NotifyLocalOfferCreatedAndSetSet(const std::string& description) {
49 JNIEnv* env = AttachCurrentThread(); 58 JNIEnv* env = AttachCurrentThread();
50 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( 59 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet(
51 env, java_object_.obj(), 60 env, java_object_.obj(),
52 ConvertUTF8ToJavaString(env, description).Release()); 61 ConvertUTF8ToJavaString(env, description).obj());
53 } 62 }
54 63
55 virtual void OnLocalOfferCreatedAndSetSet(const std::string& description) 64 virtual void OnLocalOfferCreatedAndSetSet(const std::string& description)
56 override { 65 override {
57 JNIEnv* env = AttachCurrentThread(); 66 JNIEnv* env = AttachCurrentThread();
58 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( 67 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet(
59 env, java_object_.obj(), 68 env, java_object_.obj(),
60 ConvertUTF8ToJavaString(env, description).Release()); 69 ConvertUTF8ToJavaString(env, description).obj());
61 } 70 }
62 71
63 virtual void OnLocalAnswerCreatedAndSetSet(const std::string& description) 72 virtual void OnLocalAnswerCreatedAndSetSet(const std::string& description)
64 override { 73 override {
65 JNIEnv* env = AttachCurrentThread(); 74 JNIEnv* env = AttachCurrentThread();
66 Java_SessionDependencyFactoryNative_notifyLocalAnswerCreatedAndSetSet( 75 Java_SessionDependencyFactoryNative_notifyLocalAnswerCreatedAndSetSet(
67 env, java_object_.obj(), 76 env, java_object_.obj(),
68 ConvertUTF8ToJavaString(env, description).Release()); 77 ConvertUTF8ToJavaString(env, description).obj());
69 } 78 }
70 79
71 virtual void OnRemoteDescriptionSet() override { 80 virtual void OnRemoteDescriptionSet() override {
72 JNIEnv* env = AttachCurrentThread(); 81 JNIEnv* env = AttachCurrentThread();
73 Java_SessionDependencyFactoryNative_notifyRemoteDescriptionSet( 82 Java_SessionDependencyFactoryNative_notifyRemoteDescriptionSet(
74 env, java_object_.obj()); 83 env, java_object_.obj());
75 } 84 }
76 85
77 virtual void OnFailure(const std::string& description) override { 86 virtual void OnFailure(const std::string& description) override {
78 JNIEnv* env = AttachCurrentThread(); 87 JNIEnv* env = AttachCurrentThread();
79 Java_SessionDependencyFactoryNative_notifyConnectionFailure( 88 Java_SessionDependencyFactoryNative_notifyConnectionFailure(
80 env, java_object_.obj(), 89 env, java_object_.obj(),
81 ConvertUTF8ToJavaString(env, description).Release()); 90 ConvertUTF8ToJavaString(env, description).obj());
82 } 91 }
83 92
84 private: 93 private:
85 base::android::ScopedJavaGlobalRef<jobject> java_object_; 94 base::android::ScopedJavaGlobalRef<jobject> java_object_;
86 bool connected_; 95 bool connected_;
87 }; 96 };
88 97
98 class DataChannelObserverImpl : public AbstractDataChannel::Observer {
99 public:
100 DataChannelObserverImpl(JNIEnv* env, jobject java_object) {
101 java_object_.Reset(env, java_object);
102 }
103
104 virtual void OnOpen() override {
105 JNIEnv* env = AttachCurrentThread();
106 Java_SessionDependencyFactoryNative_notifyChannelOpen(
107 env, java_object_.obj());
108 }
109
110 virtual void OnClose() override {
111 JNIEnv* env = AttachCurrentThread();
112 Java_SessionDependencyFactoryNative_notifyChannelClose(
113 env, java_object_.obj());
114 }
115
116 virtual void OnMessage(const void* data, size_t length) override {
117 JNIEnv* env = AttachCurrentThread();
118
119 ScopedJavaLocalRef<jobject> byte_buffer(
120 env, env->NewDirectByteBuffer(const_cast<void*>(data), length));
121
122 Java_SessionDependencyFactoryNative_notifyMessage(
123 env, java_object_.obj(), byte_buffer.obj());
124 }
125
126 private:
127 base::android::ScopedJavaGlobalRef<jobject> java_object_;
128 };
129
89 static void CleanupOnSignalingThread() { 130 static void CleanupOnSignalingThread() {
90 // Called on signaling thread when SessionDependencyFactory is destroying. 131 // Called on signaling thread when SessionDependencyFactory is destroying.
91 base::android::DetachFromVM(); 132 base::android::DetachFromVM();
92 } 133 }
93 134
94 } // namespace 135 } // namespace
95 136
96 // SessionDependencyFactoryNative 137 // SessionDependencyFactoryNative
97 138
98 SessionDependencyFactoryAndroid::SessionDependencyFactoryAndroid() 139 SessionDependencyFactoryAndroid::SessionDependencyFactoryAndroid()
(...skipping 15 matching lines...) Expand all
114 scoped_ptr<AbstractPeerConnection::Delegate> delegate) { 155 scoped_ptr<AbstractPeerConnection::Delegate> delegate) {
115 return impl_->CreatePeerConnection(config.Pass(), delegate.Pass()); 156 return impl_->CreatePeerConnection(config.Pass(), delegate.Pass());
116 } 157 }
117 158
118 // JNI generated methods 159 // JNI generated methods
119 160
120 static jlong CreateFactory(JNIEnv* env, jclass jcaller) { 161 static jlong CreateFactory(JNIEnv* env, jclass jcaller) {
121 return reinterpret_cast<jlong>(new SessionDependencyFactoryAndroid()); 162 return reinterpret_cast<jlong>(new SessionDependencyFactoryAndroid());
122 } 163 }
123 164
124 static void DestroyFactory(JNIEnv* env, jclass jcaller, jlong factoryPtr) { 165 static void DestroyFactory(JNIEnv* env, jclass jcaller, jlong factory_ptr) {
125 delete reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); 166 delete reinterpret_cast<SessionDependencyFactoryAndroid*>(factory_ptr);
126 } 167 }
127 168
128 static jlong CreateConfig(JNIEnv* env, jclass jcaller) { 169 static jlong CreateConfig(JNIEnv* env, jclass jcaller) {
129 return reinterpret_cast<jlong>( 170 return reinterpret_cast<jlong>(
130 RTCConfiguration::CreateInstance().release()); 171 RTCConfiguration::CreateInstance().release());
131 } 172 }
132 173
133 static void AddIceServer( 174 static void AddIceServer(
134 JNIEnv* env, jclass jcaller, jlong configPtr, 175 JNIEnv* env, jclass jcaller, jlong config_ptr,
135 jstring uri, jstring username, jstring credential) { 176 jstring uri, jstring username, jstring credential) {
136 reinterpret_cast<RTCConfiguration*>(configPtr)->AddIceServer( 177 reinterpret_cast<RTCConfiguration*>(config_ptr)->AddIceServer(
137 ConvertJavaStringToUTF8(env, uri), 178 ConvertJavaStringToUTF8(env, uri),
138 ConvertJavaStringToUTF8(env, username), 179 ConvertJavaStringToUTF8(env, username),
139 ConvertJavaStringToUTF8(env, credential)); 180 ConvertJavaStringToUTF8(env, credential));
140 } 181 }
141 182
142 static jlong CreatePeerConnection( 183 static jlong CreatePeerConnection(
143 JNIEnv* env, jclass jcaller, 184 JNIEnv* env, jclass jcaller,
144 jlong factoryPtr, jlong configPtr, jobject observer) { 185 jlong factory_ptr, jlong config_ptr, jobject observer) {
145 auto factory = 186 auto factory =
146 reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); 187 reinterpret_cast<SessionDependencyFactoryAndroid*>(factory_ptr);
147 auto config = reinterpret_cast<RTCConfiguration*>(configPtr); 188 auto config = reinterpret_cast<RTCConfiguration*>(config_ptr);
148 189
149 auto delegate = new PeerConnectionDelegateImpl(env, observer); 190 auto delegate = new PeerConnectionDelegateImpl(env, observer);
150 191
151 return reinterpret_cast<jlong>(factory->CreatePeerConnection( 192 return reinterpret_cast<jlong>(factory->CreatePeerConnection(
152 make_scoped_ptr(config), make_scoped_ptr(delegate)).release()); 193 make_scoped_ptr(config), make_scoped_ptr(delegate)).release());
153 } 194 }
154 195
155 static void DestroyPeerConnection( 196 static void DestroyPeerConnection(
156 JNIEnv* env, jclass jcaller, jlong connectionPtr) { 197 JNIEnv* env, jclass jcaller, jlong connection_ptr) {
157 delete reinterpret_cast<AbstractPeerConnection*>(connectionPtr); 198 delete reinterpret_cast<AbstractPeerConnection*>(connection_ptr);
158 } 199 }
159 200
160 static void CreateAndSetLocalOffer( 201 static void CreateAndSetLocalOffer(
161 JNIEnv* env, jclass jcaller, jlong connectionPtr) { 202 JNIEnv* env, jclass jcaller, jlong connection_ptr) {
162 reinterpret_cast<AbstractPeerConnection*>( 203 reinterpret_cast<AbstractPeerConnection*>(
163 connectionPtr)->CreateAndSetLocalOffer(); 204 connection_ptr)->CreateAndSetLocalOffer();
164 } 205 }
165 206
166 static void CreateAndSetLocalAnswer( 207 static void CreateAndSetLocalAnswer(
167 JNIEnv* env, jclass jcaller, jlong connectionPtr) { 208 JNIEnv* env, jclass jcaller, jlong connection_ptr) {
168 reinterpret_cast<AbstractPeerConnection*>( 209 reinterpret_cast<AbstractPeerConnection*>(
169 connectionPtr)->CreateAndSetLocalAnswer(); 210 connection_ptr)->CreateAndSetLocalAnswer();
170 } 211 }
171 212
172 static void SetRemoteOffer( 213 static void SetRemoteOffer(
173 JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { 214 JNIEnv* env, jclass jcaller, jlong connection_ptr, jstring description) {
174 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteOffer( 215 reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->SetRemoteOffer(
175 ConvertJavaStringToUTF8(env, description)); 216 ConvertJavaStringToUTF8(env, description));
176 } 217 }
177 218
178 static void SetRemoteAnswer( 219 static void SetRemoteAnswer(
179 JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { 220 JNIEnv* env, jclass jcaller, jlong connection_ptr, jstring description) {
180 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteAnswer( 221 reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->SetRemoteAnswer(
181 ConvertJavaStringToUTF8(env, description)); 222 ConvertJavaStringToUTF8(env, description));
182 } 223 }
183 224
184 static void AddIceCandidate( 225 static void AddIceCandidate(
185 JNIEnv* env, jclass jcaller, 226 JNIEnv* env, jclass jcaller,
186 jlong connectionPtr, jstring sdpMid, jint sdpMLineIndex, jstring sdp) { 227 jlong connection_ptr, jstring sdp_mid, jint sdp_mline_index, jstring sdp) {
187 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->AddIceCandidate( 228 reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->AddIceCandidate(
188 ConvertJavaStringToUTF8(env, sdpMid), 229 ConvertJavaStringToUTF8(env, sdp_mid),
189 sdpMLineIndex, 230 sdp_mline_index,
190 ConvertJavaStringToUTF8(env, sdp)); 231 ConvertJavaStringToUTF8(env, sdp));
191 } 232 }
192 233
193 static jlong CreateDataChannel( 234 static jlong CreateDataChannel(
194 JNIEnv* env, jclass jcaller, jlong connectionPtr, jint channelId) { 235 JNIEnv* env, jclass jcaller, jlong connection_ptr, jint channel_id) {
195 return reinterpret_cast<jlong>( 236 return reinterpret_cast<jlong>(
196 reinterpret_cast<AbstractPeerConnection*>( 237 reinterpret_cast<AbstractPeerConnection*>(
197 connectionPtr)->CreateDataChannel(channelId).release()); 238 connection_ptr)->CreateDataChannel(channel_id).release());
198 } 239 }
199 240
200 static void DestroyDataChannel( 241 static void DestroyDataChannel(
201 JNIEnv* env, jclass jcaller, jlong channelPtr) { 242 JNIEnv* env, jclass jcaller, jlong channel_ptr) {
202 delete reinterpret_cast<AbstractDataChannel*>(channelPtr); 243 delete reinterpret_cast<AbstractDataChannel*>(channel_ptr);
244 }
245
246 static void RegisterDataChannelObserver(
247 JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject observer) {
248 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->RegisterObserver(
249 make_scoped_ptr(new DataChannelObserverImpl(env, observer)));
250 }
251
252 static void UnregisterDataChannelObserver(
253 JNIEnv* env, jclass jcaller, jlong channel_ptr) {
254 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->UnregisterObserver();
255 }
256
257 static void SendBinaryMessage(
258 JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject message,
259 jint size) {
260 DCHECK(size > 0);
261 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->SendBinaryMessage(
262 env->GetDirectBufferAddress(message), size);
263 }
264
265 static void SendTextMessage(
266 JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject message,
267 jint size) {
268 DCHECK(size > 0);
269 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->SendTextMessage(
270 env->GetDirectBufferAddress(message), size);
271 }
272
273 static void CloseDataChannel(JNIEnv* env, jclass jcaller, jlong channel_ptr) {
274 reinterpret_cast<AbstractDataChannel*>(channel_ptr)->Close();
203 } 275 }
204 276
205 } // namespace android 277 } // namespace android
206 } // namespace devtools_bridge 278 } // namespace devtools_bridge
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698