OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "components/devtools_bridge/android/session_dependency_factory_android.
h" |
| 6 |
| 7 #include "base/android/jni_string.h" |
| 8 #include "base/android/scoped_java_ref.h" |
| 9 #include "base/bind.h" |
| 10 #include "components/devtools_bridge/abstract_data_channel.h" |
| 11 #include "components/devtools_bridge/abstract_peer_connection.h" |
| 12 #include "components/devtools_bridge/rtc_configuration.h" |
| 13 #include "jni/SessionDependencyFactoryNative_jni.h" |
| 14 |
| 15 using base::android::AttachCurrentThread; |
| 16 using base::android::ConvertJavaStringToUTF8; |
| 17 using base::android::ConvertUTF8ToJavaString; |
| 18 |
| 19 namespace devtools_bridge { |
| 20 namespace android { |
| 21 |
| 22 namespace { |
| 23 |
| 24 class PeerConnectionDelegateImpl |
| 25 : public AbstractPeerConnection::Delegate { |
| 26 public: |
| 27 PeerConnectionDelegateImpl(JNIEnv* env, jobject java_object) { |
| 28 java_object_.Reset(env, java_object); |
| 29 connected_ = false; |
| 30 } |
| 31 |
| 32 virtual void OnIceConnectionChange(bool connected) override { |
| 33 JNIEnv* env = AttachCurrentThread(); |
| 34 Java_SessionDependencyFactoryNative_notifyIceConnectionChange( |
| 35 env, java_object_.obj(), connected); |
| 36 } |
| 37 |
| 38 virtual void OnIceCandidate( |
| 39 const std::string& sdp_mid, int sdp_mline_index, const std::string& sdp) |
| 40 override { |
| 41 JNIEnv* env = AttachCurrentThread(); |
| 42 Java_SessionDependencyFactoryNative_notifyIceCandidate( |
| 43 env, java_object_.obj(), |
| 44 ConvertUTF8ToJavaString(env, sdp_mid).Release(), |
| 45 sdp_mline_index, ConvertUTF8ToJavaString(env, sdp).Release()); |
| 46 } |
| 47 |
| 48 void NotifyLocalOfferCreatedAndSetSet(const std::string& description) { |
| 49 JNIEnv* env = AttachCurrentThread(); |
| 50 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( |
| 51 env, java_object_.obj(), |
| 52 ConvertUTF8ToJavaString(env, description).Release()); |
| 53 } |
| 54 |
| 55 virtual void OnLocalOfferCreatedAndSetSet(const std::string& description) |
| 56 override { |
| 57 JNIEnv* env = AttachCurrentThread(); |
| 58 Java_SessionDependencyFactoryNative_notifyLocalOfferCreatedAndSetSet( |
| 59 env, java_object_.obj(), |
| 60 ConvertUTF8ToJavaString(env, description).Release()); |
| 61 } |
| 62 |
| 63 virtual void OnLocalAnswerCreatedAndSetSet(const std::string& description) |
| 64 override { |
| 65 JNIEnv* env = AttachCurrentThread(); |
| 66 Java_SessionDependencyFactoryNative_notifyLocalAnswerCreatedAndSetSet( |
| 67 env, java_object_.obj(), |
| 68 ConvertUTF8ToJavaString(env, description).Release()); |
| 69 } |
| 70 |
| 71 virtual void OnRemoteDescriptionSet() override { |
| 72 JNIEnv* env = AttachCurrentThread(); |
| 73 Java_SessionDependencyFactoryNative_notifyRemoteDescriptionSet( |
| 74 env, java_object_.obj()); |
| 75 } |
| 76 |
| 77 virtual void OnFailure(const std::string& description) override { |
| 78 JNIEnv* env = AttachCurrentThread(); |
| 79 Java_SessionDependencyFactoryNative_notifyConnectionFailure( |
| 80 env, java_object_.obj(), |
| 81 ConvertUTF8ToJavaString(env, description).Release()); |
| 82 } |
| 83 |
| 84 private: |
| 85 base::android::ScopedJavaGlobalRef<jobject> java_object_; |
| 86 bool connected_; |
| 87 }; |
| 88 |
| 89 static void CleanupOnSignalingThread() { |
| 90 // Called on signaling thread when SessionDependencyFactory is destroying. |
| 91 base::android::DetachFromVM(); |
| 92 } |
| 93 |
| 94 } // namespace |
| 95 |
| 96 // SessionDependencyFactoryNative |
| 97 |
| 98 SessionDependencyFactoryAndroid::SessionDependencyFactoryAndroid() |
| 99 : impl_(SessionDependencyFactory::CreateInstance( |
| 100 base::Bind(&CleanupOnSignalingThread))) { |
| 101 } |
| 102 |
| 103 SessionDependencyFactoryAndroid::~SessionDependencyFactoryAndroid() { |
| 104 } |
| 105 |
| 106 // static |
| 107 void SessionDependencyFactoryAndroid::RegisterNatives(JNIEnv* env) { |
| 108 RegisterNativesImpl(env); |
| 109 } |
| 110 |
| 111 scoped_ptr<AbstractPeerConnection> |
| 112 SessionDependencyFactoryAndroid::CreatePeerConnection( |
| 113 scoped_ptr<RTCConfiguration> config, |
| 114 scoped_ptr<AbstractPeerConnection::Delegate> delegate) { |
| 115 return impl_->CreatePeerConnection(config.Pass(), delegate.Pass()); |
| 116 } |
| 117 |
| 118 // JNI generated methods |
| 119 |
| 120 static jlong CreateFactory(JNIEnv* env, jclass jcaller) { |
| 121 return reinterpret_cast<jlong>(new SessionDependencyFactoryAndroid()); |
| 122 } |
| 123 |
| 124 static void DestroyFactory(JNIEnv* env, jclass jcaller, jlong factoryPtr) { |
| 125 delete reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); |
| 126 } |
| 127 |
| 128 static jlong CreateConfig(JNIEnv* env, jclass jcaller) { |
| 129 return reinterpret_cast<jlong>( |
| 130 RTCConfiguration::CreateInstance().release()); |
| 131 } |
| 132 |
| 133 static void AddIceServer( |
| 134 JNIEnv* env, jclass jcaller, jlong configPtr, |
| 135 jstring uri, jstring username, jstring credential) { |
| 136 reinterpret_cast<RTCConfiguration*>(configPtr)->AddIceServer( |
| 137 ConvertJavaStringToUTF8(env, uri), |
| 138 ConvertJavaStringToUTF8(env, username), |
| 139 ConvertJavaStringToUTF8(env, credential)); |
| 140 } |
| 141 |
| 142 static jlong CreatePeerConnection( |
| 143 JNIEnv* env, jclass jcaller, |
| 144 jlong factoryPtr, jlong configPtr, jobject observer) { |
| 145 auto factory = |
| 146 reinterpret_cast<SessionDependencyFactoryAndroid*>(factoryPtr); |
| 147 auto config = reinterpret_cast<RTCConfiguration*>(configPtr); |
| 148 |
| 149 auto delegate = new PeerConnectionDelegateImpl(env, observer); |
| 150 |
| 151 return reinterpret_cast<jlong>(factory->CreatePeerConnection( |
| 152 make_scoped_ptr(config), make_scoped_ptr(delegate)).release()); |
| 153 } |
| 154 |
| 155 static void DestroyPeerConnection( |
| 156 JNIEnv* env, jclass jcaller, jlong connectionPtr) { |
| 157 delete reinterpret_cast<AbstractPeerConnection*>(connectionPtr); |
| 158 } |
| 159 |
| 160 static void CreateAndSetLocalOffer( |
| 161 JNIEnv* env, jclass jcaller, jlong connectionPtr) { |
| 162 reinterpret_cast<AbstractPeerConnection*>( |
| 163 connectionPtr)->CreateAndSetLocalOffer(); |
| 164 } |
| 165 |
| 166 static void CreateAndSetLocalAnswer( |
| 167 JNIEnv* env, jclass jcaller, jlong connectionPtr) { |
| 168 reinterpret_cast<AbstractPeerConnection*>( |
| 169 connectionPtr)->CreateAndSetLocalAnswer(); |
| 170 } |
| 171 |
| 172 static void SetRemoteOffer( |
| 173 JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { |
| 174 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteOffer( |
| 175 ConvertJavaStringToUTF8(env, description)); |
| 176 } |
| 177 |
| 178 static void SetRemoteAnswer( |
| 179 JNIEnv* env, jclass jcaller, jlong connectionPtr, jstring description) { |
| 180 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->SetRemoteAnswer( |
| 181 ConvertJavaStringToUTF8(env, description)); |
| 182 } |
| 183 |
| 184 static void AddIceCandidate( |
| 185 JNIEnv* env, jclass jcaller, |
| 186 jlong connectionPtr, jstring sdpMid, jint sdpMLineIndex, jstring sdp) { |
| 187 reinterpret_cast<AbstractPeerConnection*>(connectionPtr)->AddIceCandidate( |
| 188 ConvertJavaStringToUTF8(env, sdpMid), |
| 189 sdpMLineIndex, |
| 190 ConvertJavaStringToUTF8(env, sdp)); |
| 191 } |
| 192 |
| 193 static jlong CreateDataChannel( |
| 194 JNIEnv* env, jclass jcaller, jlong connectionPtr, jint channelId) { |
| 195 return reinterpret_cast<jlong>( |
| 196 reinterpret_cast<AbstractPeerConnection*>( |
| 197 connectionPtr)->CreateDataChannel(channelId).release()); |
| 198 } |
| 199 |
| 200 static void DestroyDataChannel( |
| 201 JNIEnv* env, jclass jcaller, jlong channelPtr) { |
| 202 delete reinterpret_cast<AbstractDataChannel*>(channelPtr); |
| 203 } |
| 204 |
| 205 } // namespace android |
| 206 } // namespace devtools_bridge |
OLD | NEW |