Chromium Code Reviews| 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..ae5a66191534e3c6416a92bf58eadacadf69c338 100644 |
| --- a/components/devtools_bridge/android/session_dependency_factory_android.cc |
| +++ b/components/devtools_bridge/android/session_dependency_factory_android.cc |
| @@ -21,6 +21,19 @@ 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: |
| + * |
| + * 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.
|
| + * |
| + * should be used instead of |
| + * |
| + * ConvertUTF8ToJavaString(env, ...).Release() |
| + * |
| + * or ScopedJavaLocalFrame needed. |
| + */ |
| class PeerConnectionDelegateImpl |
| : public AbstractPeerConnection::Delegate { |
| public: |
| @@ -41,15 +54,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 +70,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 +78,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 +91,7 @@ class PeerConnectionDelegateImpl |
| JNIEnv* env = AttachCurrentThread(); |
| Java_SessionDependencyFactoryNative_notifyConnectionFailure( |
| env, java_object_.obj(), |
| - ConvertUTF8ToJavaString(env, description).Release()); |
| + ConvertUTF8ToJavaString(env, description).obj()); |
| } |
| private: |
| @@ -86,6 +99,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 +166,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 +176,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 +186,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 +198,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 |