Index: components/devtools_bridge/android/session_dependency_factory_android.cc |
diff --git a/components/devtools_bridge/android/session_dependency_factory_android.cc b/components/devtools_bridge/android/session_dependency_factory_android.cc |
index df6173de16f52de6836a085140c74641d7a696d8..7b72ac90a00d0267bd2624e1a3206f7bbe1d65c2 100644 |
--- a/components/devtools_bridge/android/session_dependency_factory_android.cc |
+++ b/components/devtools_bridge/android/session_dependency_factory_android.cc |
@@ -21,6 +21,15 @@ namespace android { |
namespace { |
+/** |
+ * Wraps Java observer and adapts it to native delegate. Chromium code normally |
+ * leaves local java references for automatic disposing. It doesn't happen here |
+ * (because calls originated from native thread). For instance, instead of |
+ * |
+ * ConvertUTF8ToJavaString(env, ...).Release() |
+ * |
+ * please use ConvertUTF8ToJavaString(env, ...).obj() or ScopedJavaLocalFrame. |
+ */ |
class PeerConnectionDelegateImpl |
: public AbstractPeerConnection::Delegate { |
public: |
@@ -41,15 +50,15 @@ class PeerConnectionDelegateImpl |
JNIEnv* env = AttachCurrentThread(); |
Java_SessionDependencyFactoryNative_notifyIceCandidate( |
env, java_object_.obj(), |
- ConvertUTF8ToJavaString(env, sdp_mid).Release(), |
- sdp_mline_index, ConvertUTF8ToJavaString(env, sdp).Release()); |
+ ConvertUTF8ToJavaString(env, sdp_mid).obj(), |
+ sdp_mline_index, ConvertUTF8ToJavaString(env, sdp).obj()); |
} |
void NotifyLocalOfferCreatedAndSetSet(const std::string& description) { |
JNIEnv* env = AttachCurrentThread(); |
Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( |
env, java_object_.obj(), |
- ConvertUTF8ToJavaString(env, description).Release()); |
+ ConvertUTF8ToJavaString(env, description).obj()); |
} |
virtual void OnLocalOfferCreatedAndSetSet(const std::string& description) |
@@ -57,7 +66,7 @@ class PeerConnectionDelegateImpl |
JNIEnv* env = AttachCurrentThread(); |
Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( |
env, java_object_.obj(), |
- ConvertUTF8ToJavaString(env, description).Release()); |
+ ConvertUTF8ToJavaString(env, description).obj()); |
} |
virtual void OnLocalAnswerCreatedAndSetSet(const std::string& description) |
@@ -65,7 +74,7 @@ class PeerConnectionDelegateImpl |
JNIEnv* env = AttachCurrentThread(); |
Java_SessionDependencyFactoryNative_notifyLocalAnswerCreatedAndSetSet( |
env, java_object_.obj(), |
- ConvertUTF8ToJavaString(env, description).Release()); |
+ ConvertUTF8ToJavaString(env, description).obj()); |
} |
virtual void OnRemoteDescriptionSet() override { |
@@ -78,7 +87,7 @@ class PeerConnectionDelegateImpl |
JNIEnv* env = AttachCurrentThread(); |
Java_SessionDependencyFactoryNative_notifyConnectionFailure( |
env, java_object_.obj(), |
- ConvertUTF8ToJavaString(env, description).Release()); |
+ ConvertUTF8ToJavaString(env, description).obj()); |
} |
private: |
@@ -86,6 +95,38 @@ class PeerConnectionDelegateImpl |
bool connected_; |
}; |
+class DataChannelObserverImpl : public AbstractDataChannel::Observer { |
+ public: |
+ DataChannelObserverImpl(JNIEnv* env, jobject java_object) { |
+ java_object_.Reset(env, java_object); |
+ } |
+ |
+ virtual void OnOpen() override { |
+ JNIEnv* env = AttachCurrentThread(); |
+ Java_SessionDependencyFactoryNative_notifyChannelOpen( |
+ env, java_object_.obj()); |
+ } |
+ |
+ virtual void OnClose() override { |
+ JNIEnv* env = AttachCurrentThread(); |
+ Java_SessionDependencyFactoryNative_notifyChannelClose( |
+ env, java_object_.obj()); |
+ } |
+ |
+ virtual void OnMessage(const void* data, size_t length) override { |
+ JNIEnv* env = AttachCurrentThread(); |
+ |
+ ScopedJavaLocalRef<jobject> byte_buffer( |
+ env, env->NewDirectByteBuffer(const_cast<void*>(data), length)); |
+ |
+ Java_SessionDependencyFactoryNative_notifyMessage( |
+ env, java_object_.obj(), byte_buffer.obj()); |
+ } |
+ |
+ private: |
+ base::android::ScopedJavaGlobalRef<jobject> java_object_; |
+}; |
+ |
static void CleanupOnSignalingThread() { |
// Called on signaling thread when SessionDependencyFactory is destroying. |
base::android::DetachFromVM(); |
@@ -121,8 +162,8 @@ static jlong CreateFactory(JNIEnv* env, jclass jcaller) { |
return reinterpret_cast<jlong>(new SessionDependencyFactoryAndroid()); |
} |
-static void DestroyFactory(JNIEnv* env, jclass jcaller, jlong factoryPtr) { |
- delete reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); |
+static void DestroyFactory(JNIEnv* env, jclass jcaller, jlong factory_ptr) { |
+ delete reinterpret_cast<SessionDependencyFactoryAndroid*>(factory_ptr); |
} |
static jlong CreateConfig(JNIEnv* env, jclass jcaller) { |
@@ -131,9 +172,9 @@ static jlong CreateConfig(JNIEnv* env, jclass jcaller) { |
} |
static void AddIceServer( |
- JNIEnv* env, jclass jcaller, jlong configPtr, |
+ JNIEnv* env, jclass jcaller, jlong config_ptr, |
jstring uri, jstring username, jstring credential) { |
- reinterpret_cast<RTCConfiguration*>(configPtr)->AddIceServer( |
+ reinterpret_cast<RTCConfiguration*>(config_ptr)->AddIceServer( |
ConvertJavaStringToUTF8(env, uri), |
ConvertJavaStringToUTF8(env, username), |
ConvertJavaStringToUTF8(env, credential)); |
@@ -141,10 +182,10 @@ static void AddIceServer( |
static jlong CreatePeerConnection( |
JNIEnv* env, jclass jcaller, |
- jlong factoryPtr, jlong configPtr, jobject observer) { |
+ jlong factory_ptr, jlong config_ptr, jobject observer) { |
auto factory = |
- reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); |
- auto config = reinterpret_cast<RTCConfiguration*>(configPtr); |
+ reinterpret_cast<SessionDependencyFactoryAndroid*>(factory_ptr); |
+ auto config = reinterpret_cast<RTCConfiguration*>(config_ptr); |
auto delegate = new PeerConnectionDelegateImpl(env, observer); |
@@ -153,53 +194,84 @@ static jlong CreatePeerConnection( |
} |
static void DestroyPeerConnection( |
- JNIEnv* env, jclass jcaller, jlong connectionPtr) { |
- delete reinterpret_cast<AbstractPeerConnection*>(connectionPtr); |
+ JNIEnv* env, jclass jcaller, jlong connection_ptr) { |
+ delete reinterpret_cast<AbstractPeerConnection*>(connection_ptr); |
} |
static void CreateAndSetLocalOffer( |
- JNIEnv* env, jclass jcaller, jlong connectionPtr) { |
+ JNIEnv* env, jclass jcaller, jlong connection_ptr) { |
reinterpret_cast<AbstractPeerConnection*>( |
- connectionPtr)->CreateAndSetLocalOffer(); |
+ connection_ptr)->CreateAndSetLocalOffer(); |
} |
static void CreateAndSetLocalAnswer( |
- JNIEnv* env, jclass jcaller, jlong connectionPtr) { |
+ JNIEnv* env, jclass jcaller, jlong connection_ptr) { |
reinterpret_cast<AbstractPeerConnection*>( |
- connectionPtr)->CreateAndSetLocalAnswer(); |
+ connection_ptr)->CreateAndSetLocalAnswer(); |
} |
static void SetRemoteOffer( |
- JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { |
- reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteOffer( |
+ JNIEnv* env, jclass jcaller, jlong connection_ptr, jstring description) { |
+ reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->SetRemoteOffer( |
ConvertJavaStringToUTF8(env, description)); |
} |
static void SetRemoteAnswer( |
- JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { |
- reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteAnswer( |
+ JNIEnv* env, jclass jcaller, jlong connection_ptr, jstring description) { |
+ reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->SetRemoteAnswer( |
ConvertJavaStringToUTF8(env, description)); |
} |
static void AddIceCandidate( |
JNIEnv* env, jclass jcaller, |
- jlong connectionPtr, jstring sdpMid, jint sdpMLineIndex, jstring sdp) { |
- reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->AddIceCandidate( |
- ConvertJavaStringToUTF8(env, sdpMid), |
- sdpMLineIndex, |
+ jlong connection_ptr, jstring sdp_mid, jint sdp_mline_index, jstring sdp) { |
+ reinterpret_cast<AbstractPeerConnection*>(connection_ptr)->AddIceCandidate( |
+ ConvertJavaStringToUTF8(env, sdp_mid), |
+ sdp_mline_index, |
ConvertJavaStringToUTF8(env, sdp)); |
} |
static jlong CreateDataChannel( |
- JNIEnv* env, jclass jcaller, jlong connectionPtr, jint channelId) { |
+ JNIEnv* env, jclass jcaller, jlong connection_ptr, jint channel_id) { |
return reinterpret_cast<jlong>( |
reinterpret_cast<AbstractPeerConnection*>( |
- connectionPtr)->CreateDataChannel(channelId).release()); |
+ connection_ptr)->CreateDataChannel(channel_id).release()); |
} |
static void DestroyDataChannel( |
- JNIEnv* env, jclass jcaller, jlong channelPtr) { |
- delete reinterpret_cast<AbstractDataChannel*>(channelPtr); |
+ JNIEnv* env, jclass jcaller, jlong channel_ptr) { |
+ delete reinterpret_cast<AbstractDataChannel*>(channel_ptr); |
+} |
+ |
+static void RegisterDataChannelObserver( |
+ JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject observer) { |
+ reinterpret_cast<AbstractDataChannel*>(channel_ptr)->RegisterObserver( |
+ make_scoped_ptr(new DataChannelObserverImpl(env, observer))); |
+} |
+ |
+static void UnregisterDataChannelObserver( |
+ JNIEnv* env, jclass jcaller, jlong channel_ptr) { |
+ reinterpret_cast<AbstractDataChannel*>(channel_ptr)->UnregisterObserver(); |
+} |
+ |
+static void SendBinaryMessage( |
+ JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject message, |
+ jint size) { |
+ DCHECK(size > 0); |
+ reinterpret_cast<AbstractDataChannel*>(channel_ptr)->SendBinaryMessage( |
+ env->GetDirectBufferAddress(message), size); |
+} |
+ |
+static void SendTextMessage( |
+ JNIEnv* env, jclass jcaller, jlong channel_ptr, jobject message, |
+ jint size) { |
+ DCHECK(size > 0); |
+ reinterpret_cast<AbstractDataChannel*>(channel_ptr)->SendTextMessage( |
+ env->GetDirectBufferAddress(message), size); |
+} |
+ |
+static void CloseDataChannel(JNIEnv* env, jclass jcaller, jlong channel_ptr) { |
+ reinterpret_cast<AbstractDataChannel*>(channel_ptr)->Close(); |
} |
} // namespace android |