diff --git a/call/BUILD.gn b/call/BUILD.gn index 1bba3d7410..cb85febcaf 100644 --- a/call/BUILD.gn +++ b/call/BUILD.gn @@ -506,6 +506,7 @@ if (rtc_include_tests) { absl_deps = [ "//third_party/abseil-cpp/absl/container:inlined_vector", "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/types:optional", "//third_party/abseil-cpp/absl/types:variant", ] diff --git a/call/bitrate_estimator_tests.cc b/call/bitrate_estimator_tests.cc index 4634f6e147..424cf0b038 100644 --- a/call/bitrate_estimator_tests.cc +++ b/call/bitrate_estimator_tests.cc @@ -12,6 +12,7 @@ #include #include +#include "absl/strings/string_view.h" #include "api/test/create_frame_generator.h" #include "call/call.h" #include "call/fake_network_pipe.h" @@ -50,13 +51,17 @@ class LogObserver { class Callback : public rtc::LogSink { public: void OnLogMessage(const std::string& message) override { + OnLogMessage(absl::string_view(message)); + } + + void OnLogMessage(absl::string_view message) override { MutexLock lock(&mutex_); // Ignore log lines that are due to missing AST extensions, these are // logged when we switch back from AST to TOF until the wrapping bitrate // estimator gives up on using AST. - if (message.find("BitrateEstimator") != std::string::npos && - message.find("packet is missing") == std::string::npos) { - received_log_lines_.push_back(message); + if (message.find("BitrateEstimator") != absl::string_view::npos && + message.find("packet is missing") == absl::string_view::npos) { + received_log_lines_.push_back(std::string(message)); } int num_popped = 0; @@ -66,7 +71,7 @@ class LogObserver { received_log_lines_.pop_front(); expected_log_lines_.pop_front(); num_popped++; - EXPECT_TRUE(a.find(b) != std::string::npos) << a << " != " << b; + EXPECT_TRUE(a.find(b) != absl::string_view::npos) << a << " != " << b; } if (expected_log_lines_.empty()) { if (num_popped > 0) { diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 0cac2a4f2b..1db186c0fc 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -1422,6 +1422,7 @@ if (rtc_include_tests) { "//third_party/abseil-cpp/absl/base:core_headers", "//third_party/abseil-cpp/absl/memory", "//third_party/abseil-cpp/absl/numeric:bits", + "//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/types:optional", ] } diff --git a/rtc_base/log_sinks.cc b/rtc_base/log_sinks.cc index 4365142517..b237e873ee 100644 --- a/rtc_base/log_sinks.cc +++ b/rtc_base/log_sinks.cc @@ -15,6 +15,7 @@ #include #include +#include "absl/strings/string_view.h" #include "rtc_base/checks.h" namespace rtc { @@ -36,14 +37,18 @@ FileRotatingLogSink::FileRotatingLogSink(FileRotatingStream* stream) FileRotatingLogSink::~FileRotatingLogSink() {} void FileRotatingLogSink::OnLogMessage(const std::string& message) { + OnLogMessage(absl::string_view(message)); +} + +void FileRotatingLogSink::OnLogMessage(absl::string_view message) { if (!stream_->IsOpen()) { std::fprintf(stderr, "Init() must be called before adding this sink.\n"); return; } - stream_->Write(message.c_str(), message.size()); + stream_->Write(message.data(), message.size()); } -void FileRotatingLogSink::OnLogMessage(const std::string& message, +void FileRotatingLogSink::OnLogMessage(absl::string_view message, LoggingSeverity sev, const char* tag) { if (!stream_->IsOpen()) { @@ -52,7 +57,7 @@ void FileRotatingLogSink::OnLogMessage(const std::string& message, } stream_->Write(tag, strlen(tag)); stream_->Write(": ", 2); - stream_->Write(message.c_str(), message.size()); + stream_->Write(message.data(), message.size()); } bool FileRotatingLogSink::Init() { diff --git a/rtc_base/log_sinks.h b/rtc_base/log_sinks.h index d2c286a86a..da339a54f1 100644 --- a/rtc_base/log_sinks.h +++ b/rtc_base/log_sinks.h @@ -16,6 +16,7 @@ #include #include +#include "absl/strings/string_view.h" #include "rtc_base/file_rotating_stream.h" #include "rtc_base/logging.h" @@ -39,7 +40,8 @@ class FileRotatingLogSink : public LogSink { // Writes the message to the current file. It will spill over to the next // file if needed. void OnLogMessage(const std::string& message) override; - void OnLogMessage(const std::string& message, + void OnLogMessage(absl::string_view message) override; + void OnLogMessage(absl::string_view message, LoggingSeverity sev, const char* tag) override; diff --git a/rtc_base/logging.cc b/rtc_base/logging.cc index 2b5c80b33c..102c1d1c70 100644 --- a/rtc_base/logging.cc +++ b/rtc_base/logging.cc @@ -42,6 +42,7 @@ static const int kMaxLogLineSize = 1024 - 60; #include #include "absl/base/attributes.h" +#include "absl/strings/string_view.h" #include "rtc_base/checks.h" #include "rtc_base/platform_thread_types.h" #include "rtc_base/string_encode.h" @@ -563,4 +564,20 @@ void LogSink::OnLogMessage(const std::string& msg, LoggingSeverity /* severity */) { OnLogMessage(msg); } + +// Inefficient default implementation, override is recommended. +void LogSink::OnLogMessage(absl::string_view msg, + LoggingSeverity severity, + const char* tag) { + OnLogMessage(tag + (": " + std::string(msg)), severity); +} + +void LogSink::OnLogMessage(absl::string_view msg, + LoggingSeverity /* severity */) { + OnLogMessage(msg); +} + +void LogSink::OnLogMessage(absl::string_view msg) { + OnLogMessage(std::string(msg)); +} } // namespace rtc diff --git a/rtc_base/logging.h b/rtc_base/logging.h index 8991f6f2b4..ee4d410bf4 100644 --- a/rtc_base/logging.h +++ b/rtc_base/logging.h @@ -112,6 +112,13 @@ class LogSink { LoggingSeverity severity); virtual void OnLogMessage(const std::string& message) = 0; + virtual void OnLogMessage(absl::string_view msg, + LoggingSeverity severity, + const char* tag); + virtual void OnLogMessage(absl::string_view message, + LoggingSeverity severity); + virtual void OnLogMessage(absl::string_view message); + private: friend class ::rtc::LogMessage; #if RTC_LOG_ENABLED() diff --git a/rtc_base/logging_unittest.cc b/rtc_base/logging_unittest.cc index dc1208f3f6..cd8d753fb3 100644 --- a/rtc_base/logging_unittest.cc +++ b/rtc_base/logging_unittest.cc @@ -16,6 +16,7 @@ #include +#include "absl/strings/string_view.h" #include "rtc_base/arraysize.h" #include "rtc_base/checks.h" #include "rtc_base/event.h" @@ -34,7 +35,10 @@ class LogSinkImpl : public LogSink { private: void OnLogMessage(const std::string& message) override { - log_data_->append(message); + OnLogMessage(absl::string_view(message)); + } + void OnLogMessage(absl::string_view message) override { + log_data_->append(message.begin(), message.end()); } std::string* const log_data_; }; diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index 718d9274a1..a5c7d47579 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -149,6 +149,8 @@ if (is_ios || is_mac) { "../rtc_base:checks", ] + absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] + frameworks = [ "AVFoundation.framework", "CoreMedia.framework", @@ -180,6 +182,7 @@ if (is_ios || is_mac) { deps = [ ":base_objc", + ":helpers_objc", "../rtc_base", "../rtc_base:checks", "../rtc_base:logging", @@ -189,6 +192,8 @@ if (is_ios || is_mac) { "..:common_objc", ":used_from_extension", ] + + absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] } rtc_library("file_logger_objc") { diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 7bc30509c4..f81d3d5806 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -1137,6 +1137,8 @@ if (current_os == "linux" || is_android) { ":native_api_jni", "../../rtc_base", ] + + absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] } rtc_library("audio_device_module_base") { @@ -1620,7 +1622,10 @@ if (is_android) { "../../test:test_support", "../../testing/gtest", ] - absl_deps = [ "//third_party/abseil-cpp/absl/memory" ] + absl_deps = [ + "//third_party/abseil-cpp/absl/memory", + "//third_party/abseil-cpp/absl/strings", + ] } rtc_android_library("native_unittests_java") { diff --git a/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc b/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc index b77d86719f..5cbd4aafe1 100644 --- a/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc +++ b/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc @@ -16,6 +16,7 @@ #include #include +#include "absl/strings/string_view.h" #include "rtc_base/event.h" #include "rtc_base/logging.h" #include "rtc_base/platform_thread.h" @@ -201,6 +202,9 @@ class LookoutLogSink final : public rtc::LogSink { explicit LookoutLogSink(std::string look_for) : look_for_(std::move(look_for)) {} void OnLogMessage(const std::string& message) override { + OnLogMessage(absl::string_view(message)); + } + void OnLogMessage(absl::string_view message) override { if (message.find(look_for_) != std::string::npos) { when_found_.Set(); } diff --git a/sdk/android/src/jni/logging/log_sink.cc b/sdk/android/src/jni/logging/log_sink.cc index cebc8669be..84394d8ee5 100644 --- a/sdk/android/src/jni/logging/log_sink.cc +++ b/sdk/android/src/jni/logging/log_sink.cc @@ -9,6 +9,7 @@ */ #include "sdk/android/src/jni/logging/log_sink.h" +#include "absl/strings/string_view.h" #include "sdk/android/generated_logging_jni/JNILogging_jni.h" namespace webrtc { @@ -18,18 +19,24 @@ JNILogSink::JNILogSink(JNIEnv* env, const JavaRef& j_logging) : j_logging_(env, j_logging) {} JNILogSink::~JNILogSink() = default; -void JNILogSink::OnLogMessage(const std::string& msg, - rtc::LoggingSeverity severity, - const char* tag) { - JNIEnv* env = AttachCurrentThreadIfNeeded(); - Java_JNILogging_logToInjectable(env, j_logging_, NativeToJavaString(env, msg), - NativeToJavaInteger(env, severity), - NativeToJavaString(env, tag)); -} - void JNILogSink::OnLogMessage(const std::string& msg) { RTC_DCHECK_NOTREACHED(); } +void JNILogSink::OnLogMessage(const std::string& msg, + rtc::LoggingSeverity severity, + const char* tag) { + OnLogMessage(absl::string_view{msg}, severity, tag); +} + +void JNILogSink::OnLogMessage(absl::string_view msg, + rtc::LoggingSeverity severity, + const char* tag) { + JNIEnv* env = AttachCurrentThreadIfNeeded(); + Java_JNILogging_logToInjectable( + env, j_logging_, NativeToJavaString(env, std::string(msg)), + NativeToJavaInteger(env, severity), NativeToJavaString(env, tag)); +} + } // namespace jni } // namespace webrtc diff --git a/sdk/android/src/jni/logging/log_sink.h b/sdk/android/src/jni/logging/log_sink.h index e48b88dcb7..8e681ac3ea 100644 --- a/sdk/android/src/jni/logging/log_sink.h +++ b/sdk/android/src/jni/logging/log_sink.h @@ -12,6 +12,7 @@ #include +#include "absl/strings/string_view.h" #include "rtc_base/logging.h" #include "sdk/android/native_api/jni/java_types.h" #include "sdk/android/src/jni/jni_helpers.h" @@ -24,10 +25,13 @@ class JNILogSink : public rtc::LogSink { JNILogSink(JNIEnv* env, const JavaRef& j_logging); ~JNILogSink() override; + void OnLogMessage(const std::string& msg) override; void OnLogMessage(const std::string& msg, rtc::LoggingSeverity severity, const char* tag) override; - void OnLogMessage(const std::string& msg) override; + void OnLogMessage(absl::string_view msg, + rtc::LoggingSeverity severity, + const char* tag) override; private: const ScopedJavaGlobalRef j_logging_; diff --git a/sdk/objc/api/logging/RTCCallbackLogger.mm b/sdk/objc/api/logging/RTCCallbackLogger.mm index 12cedd6c50..90bb8b0238 100644 --- a/sdk/objc/api/logging/RTCCallbackLogger.mm +++ b/sdk/objc/api/logging/RTCCallbackLogger.mm @@ -10,8 +10,11 @@ #import "RTCCallbackLogger.h" +#import "helpers/NSString+StdString.h" + #include +#include "absl/strings/string_view.h" #include "rtc_base/checks.h" #include "rtc_base/log_sinks.h" #include "rtc_base/logging.h" @@ -21,9 +24,13 @@ class CallbackLogSink : public rtc::LogSink { CallbackLogSink(RTCCallbackLoggerMessageHandler callbackHandler) : callback_handler_(callbackHandler) {} - void OnLogMessage(const std::string &message) override { + void OnLogMessage(const std::string& message) override { + OnLogMessage(absl::string_view(message)); + } + + void OnLogMessage(absl::string_view message) override { if (callback_handler_) { - callback_handler_([NSString stringWithUTF8String:message.c_str()]); + callback_handler_([NSString stringForAbslStringView:message]); } } @@ -38,10 +45,10 @@ class CallbackWithSeverityLogSink : public rtc::LogSink { void OnLogMessage(const std::string& message) override { RTC_DCHECK_NOTREACHED(); } - void OnLogMessage(const std::string& message, rtc::LoggingSeverity severity) override { + void OnLogMessage(absl::string_view message, rtc::LoggingSeverity severity) override { if (callback_handler_) { RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity); - callback_handler_([NSString stringWithUTF8String:message.c_str()], loggingSeverity); + callback_handler_([NSString stringForAbslStringView:message], loggingSeverity); } } diff --git a/sdk/objc/helpers/NSString+StdString.h b/sdk/objc/helpers/NSString+StdString.h index 7f51a9f3c6..b0324e8a19 100644 --- a/sdk/objc/helpers/NSString+StdString.h +++ b/sdk/objc/helpers/NSString+StdString.h @@ -12,6 +12,8 @@ #include +#include "absl/strings/string_view.h" + NS_ASSUME_NONNULL_BEGIN @interface NSString (StdString) @@ -23,4 +25,10 @@ NS_ASSUME_NONNULL_BEGIN @end +@interface NSString (AbslStringView) + ++ (NSString *)stringForAbslStringView:(const absl::string_view)abslStringView; + +@end + NS_ASSUME_NONNULL_END diff --git a/sdk/objc/helpers/NSString+StdString.mm b/sdk/objc/helpers/NSString+StdString.mm index 3210ff0b65..c98432c445 100644 --- a/sdk/objc/helpers/NSString+StdString.mm +++ b/sdk/objc/helpers/NSString+StdString.mm @@ -10,6 +10,8 @@ #import "NSString+StdString.h" +#include "absl/strings/string_view.h" + @implementation NSString (StdString) - (std::string)stdString { @@ -31,3 +33,13 @@ } @end + +@implementation NSString (AbslStringView) + ++ (NSString *)stringForAbslStringView:(const absl::string_view)abslStringView { + return [[NSString alloc] initWithBytes:abslStringView.data() + length:abslStringView.length() + encoding:NSUTF8StringEncoding]; +} + +@end