/* * Copyright 2017 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "sdk/android/src/jni/pc/rtc_stats_collector_callback_wrapper.h" #include #include #include "rtc_base/string_encode.h" #include "sdk/android/generated_external_classes_jni/BigInteger_jni.h" #include "sdk/android/generated_peerconnection_jni/RTCStatsCollectorCallback_jni.h" #include "sdk/android/generated_peerconnection_jni/RTCStatsReport_jni.h" #include "sdk/android/generated_peerconnection_jni/RTCStats_jni.h" #include "sdk/android/native_api/jni/java_types.h" namespace webrtc { namespace jni { namespace { ScopedJavaLocalRef NativeToJavaBigInteger(JNIEnv* env, uint64_t u) { return JNI_BigInteger::Java_BigInteger_ConstructorJMBI_JLS( env, NativeToJavaString(env, rtc::ToString(u))); } ScopedJavaLocalRef NativeToJavaBigIntegerArray( JNIEnv* env, const std::vector& container) { return NativeToJavaObjectArray( env, container, java_math_BigInteger_clazz(env), &NativeToJavaBigInteger); } ScopedJavaLocalRef MemberToJava( JNIEnv* env, const RTCStatsMemberInterface& member) { switch (member.type()) { case RTCStatsMemberInterface::kBool: return NativeToJavaBoolean(env, *member.cast_to>()); case RTCStatsMemberInterface::kInt32: return NativeToJavaInteger(env, *member.cast_to>()); case RTCStatsMemberInterface::kUint32: return NativeToJavaLong(env, *member.cast_to>()); case RTCStatsMemberInterface::kInt64: return NativeToJavaLong(env, *member.cast_to>()); case RTCStatsMemberInterface::kUint64: return NativeToJavaBigInteger( env, *member.cast_to>()); case RTCStatsMemberInterface::kDouble: return NativeToJavaDouble(env, *member.cast_to>()); case RTCStatsMemberInterface::kString: return NativeToJavaString(env, *member.cast_to>()); case RTCStatsMemberInterface::kSequenceBool: return NativeToJavaBooleanArray( env, *member.cast_to>>()); case RTCStatsMemberInterface::kSequenceInt32: return NativeToJavaIntegerArray( env, *member.cast_to>>()); case RTCStatsMemberInterface::kSequenceUint32: { const std::vector& v = *member.cast_to>>(); return NativeToJavaLongArray(env, std::vector(v.begin(), v.end())); } case RTCStatsMemberInterface::kSequenceInt64: return NativeToJavaLongArray( env, *member.cast_to>>()); case RTCStatsMemberInterface::kSequenceUint64: return NativeToJavaBigIntegerArray( env, *member.cast_to>>()); case RTCStatsMemberInterface::kSequenceDouble: return NativeToJavaDoubleArray( env, *member.cast_to>>()); case RTCStatsMemberInterface::kSequenceString: return NativeToJavaStringArray( env, *member.cast_to>>()); } RTC_NOTREACHED(); return nullptr; } ScopedJavaLocalRef NativeToJavaRtcStats(JNIEnv* env, const RTCStats& stats) { JavaMapBuilder builder(env); for (auto* const member : stats.Members()) { if (!member->is_defined()) continue; builder.put(NativeToJavaString(env, member->name()), MemberToJava(env, *member)); } return Java_RTCStats_create( env, stats.timestamp_us(), NativeToJavaString(env, stats.type()), NativeToJavaString(env, stats.id()), builder.GetJavaMap()); } ScopedJavaLocalRef NativeToJavaRtcStatsReport( JNIEnv* env, const rtc::scoped_refptr& report) { ScopedJavaLocalRef j_stats_map = NativeToJavaMap(env, *report, [](JNIEnv* env, const RTCStats& stats) { return std::make_pair(NativeToJavaString(env, stats.id()), NativeToJavaRtcStats(env, stats)); }); return Java_RTCStatsReport_create(env, report->timestamp_us(), j_stats_map); } } // namespace RTCStatsCollectorCallbackWrapper::RTCStatsCollectorCallbackWrapper( JNIEnv* jni, const JavaRef& j_callback) : j_callback_global_(jni, j_callback) {} RTCStatsCollectorCallbackWrapper::~RTCStatsCollectorCallbackWrapper() = default; void RTCStatsCollectorCallbackWrapper::OnStatsDelivered( const rtc::scoped_refptr& report) { JNIEnv* jni = AttachCurrentThreadIfNeeded(); Java_RTCStatsCollectorCallback_onStatsDelivered( jni, j_callback_global_, NativeToJavaRtcStatsReport(jni, report)); } } // namespace jni } // namespace webrtc