| Index: webrtc/sdk/android/src/jni/pc/datachannel_jni.cc
|
| diff --git a/webrtc/sdk/android/src/jni/ownedfactoryandthreads.cc b/webrtc/sdk/android/src/jni/pc/datachannel_jni.cc
|
| similarity index 17%
|
| copy from webrtc/sdk/android/src/jni/ownedfactoryandthreads.cc
|
| copy to webrtc/sdk/android/src/jni/pc/datachannel_jni.cc
|
| index a3aa45c4bead267acec36c6862cae84a9790d792..71621f5f02873dbd861cb2bda556c771bf81dda6 100644
|
| --- a/webrtc/sdk/android/src/jni/ownedfactoryandthreads.cc
|
| +++ b/webrtc/sdk/android/src/jni/pc/datachannel_jni.cc
|
| @@ -8,57 +8,74 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -#include "webrtc/sdk/android/src/jni/ownedfactoryandthreads.h"
|
| +#include <memory>
|
|
|
| -#include "webrtc/rtc_base/logging.h"
|
| -#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
| +#include "webrtc/api/datachannelinterface.h"
|
| #include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
| +#include "webrtc/sdk/android/src/jni/pc/datachannelobserver_jni.h"
|
|
|
| namespace webrtc_jni {
|
|
|
| -PeerConnectionFactoryInterface* factoryFromJava(jlong j_p) {
|
| - return reinterpret_cast<OwnedFactoryAndThreads*>(j_p)->factory();
|
| +static webrtc::DataChannelInterface* ExtractNativeDC(JNIEnv* jni,
|
| + jobject j_dc) {
|
| + jfieldID native_dc_id =
|
| + GetFieldID(jni, GetObjectClass(jni, j_dc), "nativeDataChannel", "J");
|
| + jlong j_d = GetLongField(jni, j_dc, native_dc_id);
|
| + return reinterpret_cast<webrtc::DataChannelInterface*>(j_d);
|
| }
|
|
|
| -OwnedFactoryAndThreads::~OwnedFactoryAndThreads() {
|
| - CHECK_RELEASE(factory_);
|
| - if (network_monitor_factory_ != nullptr) {
|
| - rtc::NetworkMonitorFactory::ReleaseFactory(network_monitor_factory_);
|
| - }
|
| +JOW(jlong, DataChannel_registerObserverNative)
|
| +(JNIEnv* jni, jobject j_dc, jobject j_observer) {
|
| + std::unique_ptr<DataChannelObserverJni> observer(
|
| + new DataChannelObserverJni(jni, j_observer));
|
| + ExtractNativeDC(jni, j_dc)->RegisterObserver(observer.get());
|
| + return jlongFromPointer(observer.release());
|
| }
|
|
|
| -void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() {
|
| - JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
| - ScopedLocalRefFrame local_ref_frame(jni);
|
| - jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory");
|
| - jmethodID m = nullptr;
|
| - if (network_thread_->IsCurrent()) {
|
| - LOG(LS_INFO) << "Network thread JavaCallback";
|
| - m = GetStaticMethodID(jni, j_factory_class, "onNetworkThreadReady", "()V");
|
| - }
|
| - if (worker_thread_->IsCurrent()) {
|
| - LOG(LS_INFO) << "Worker thread JavaCallback";
|
| - m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V");
|
| - }
|
| - if (signaling_thread_->IsCurrent()) {
|
| - LOG(LS_INFO) << "Signaling thread JavaCallback";
|
| - m = GetStaticMethodID(jni, j_factory_class, "onSignalingThreadReady",
|
| - "()V");
|
| - }
|
| - if (m != nullptr) {
|
| - jni->CallStaticVoidMethod(j_factory_class, m);
|
| - CHECK_EXCEPTION(jni) << "error during JavaCallback::CallStaticVoidMethod";
|
| - }
|
| +JOW(void, DataChannel_unregisterObserverNative)
|
| +(JNIEnv* jni, jobject j_dc, jlong native_observer) {
|
| + ExtractNativeDC(jni, j_dc)->UnregisterObserver();
|
| + delete reinterpret_cast<DataChannelObserverJni*>(native_observer);
|
| }
|
|
|
| -void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() {
|
| - LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads.";
|
| - network_thread_->Invoke<void>(RTC_FROM_HERE,
|
| - [this] { JavaCallbackOnFactoryThreads(); });
|
| - worker_thread_->Invoke<void>(RTC_FROM_HERE,
|
| - [this] { JavaCallbackOnFactoryThreads(); });
|
| - signaling_thread_->Invoke<void>(RTC_FROM_HERE,
|
| - [this] { JavaCallbackOnFactoryThreads(); });
|
| +JOW(jstring, DataChannel_label)(JNIEnv* jni, jobject j_dc) {
|
| + return JavaStringFromStdString(jni, ExtractNativeDC(jni, j_dc)->label());
|
| +}
|
| +
|
| +JOW(jint, DataChannel_id)(JNIEnv* jni, jobject j_dc) {
|
| + int id = ExtractNativeDC(jni, j_dc)->id();
|
| + RTC_CHECK_LE(id, std::numeric_limits<int32_t>::max())
|
| + << "id overflowed jint!";
|
| + return static_cast<jint>(id);
|
| +}
|
| +
|
| +JOW(jobject, DataChannel_state)(JNIEnv* jni, jobject j_dc) {
|
| + return JavaEnumFromIndexAndClassName(jni, "DataChannel$State",
|
| + ExtractNativeDC(jni, j_dc)->state());
|
| +}
|
| +
|
| +JOW(jlong, DataChannel_bufferedAmount)(JNIEnv* jni, jobject j_dc) {
|
| + uint64_t buffered_amount = ExtractNativeDC(jni, j_dc)->buffered_amount();
|
| + RTC_CHECK_LE(buffered_amount, std::numeric_limits<int64_t>::max())
|
| + << "buffered_amount overflowed jlong!";
|
| + return static_cast<jlong>(buffered_amount);
|
| +}
|
| +
|
| +JOW(void, DataChannel_close)(JNIEnv* jni, jobject j_dc) {
|
| + ExtractNativeDC(jni, j_dc)->Close();
|
| +}
|
| +
|
| +JOW(jboolean, DataChannel_sendNative)
|
| +(JNIEnv* jni, jobject j_dc, jbyteArray data, jboolean binary) {
|
| + jbyte* bytes = jni->GetByteArrayElements(data, NULL);
|
| + bool ret = ExtractNativeDC(jni, j_dc)->Send(webrtc::DataBuffer(
|
| + rtc::CopyOnWriteBuffer(bytes, jni->GetArrayLength(data)), binary));
|
| + jni->ReleaseByteArrayElements(data, bytes, JNI_ABORT);
|
| + return ret;
|
| +}
|
| +
|
| +JOW(void, DataChannel_dispose)(JNIEnv* jni, jobject j_dc) {
|
| + CHECK_RELEASE(ExtractNativeDC(jni, j_dc));
|
| }
|
|
|
| } // namespace webrtc_jni
|
|
|