blob: ba6fe1b1cc28257feeccc901ad236e2ecaf1ca15 [file] [log] [blame]
Anders Carlsson3b3364e2018-01-30 15:46:13 +01001/*
2 * Copyright 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020011#import "RTCCallbackLogger.h"
Anders Carlsson3b3364e2018-01-30 15:46:13 +010012
Ali Tofigh6364d082022-03-14 13:32:04 +010013#import "helpers/NSString+StdString.h"
14
Anders Carlsson3b3364e2018-01-30 15:46:13 +010015#include <memory>
16
Ali Tofigh6364d082022-03-14 13:32:04 +010017#include "absl/strings/string_view.h"
Anders Carlsson3b3364e2018-01-30 15:46:13 +010018#include "rtc_base/checks.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/log_sinks.h"
Anders Carlsson3b3364e2018-01-30 15:46:13 +010020#include "rtc_base/logging.h"
Anders Carlsson3b3364e2018-01-30 15:46:13 +010021
Yura Yaroshevichcf9094a2022-03-28 14:20:05 +020022namespace {
23
24class CallbackLogSink final : public rtc::LogSink {
Anders Carlsson3b3364e2018-01-30 15:46:13 +010025 public:
Jiawei Ou3ea18782018-10-31 23:14:24 -070026 CallbackLogSink(RTCCallbackLoggerMessageHandler callbackHandler)
27 : callback_handler_(callbackHandler) {}
Anders Carlsson3b3364e2018-01-30 15:46:13 +010028
Ali Tofigh6364d082022-03-14 13:32:04 +010029 void OnLogMessage(const std::string& message) override {
30 OnLogMessage(absl::string_view(message));
31 }
32
33 void OnLogMessage(absl::string_view message) override {
Anders Carlsson3b3364e2018-01-30 15:46:13 +010034 if (callback_handler_) {
Ali Tofigh6364d082022-03-14 13:32:04 +010035 callback_handler_([NSString stringForAbslStringView:message]);
Anders Carlsson3b3364e2018-01-30 15:46:13 +010036 }
37 }
38
39 private:
Jiawei Ou3ea18782018-10-31 23:14:24 -070040 RTCCallbackLoggerMessageHandler callback_handler_;
41};
42
Yura Yaroshevichcf9094a2022-03-28 14:20:05 +020043class CallbackWithSeverityLogSink final : public rtc::LogSink {
Jiawei Ou3ea18782018-10-31 23:14:24 -070044 public:
45 CallbackWithSeverityLogSink(RTCCallbackLoggerMessageAndSeverityHandler callbackHandler)
46 : callback_handler_(callbackHandler) {}
47
Artem Titovd3251962021-11-15 16:57:07 +010048 void OnLogMessage(const std::string& message) override { RTC_DCHECK_NOTREACHED(); }
Jiawei Ou3ea18782018-10-31 23:14:24 -070049
Yura Yaroshevichcf9094a2022-03-28 14:20:05 +020050 void OnLogMessage(const std::string& message, rtc::LoggingSeverity severity) override {
51 OnLogMessage(absl::string_view(message), severity);
52 }
53
Ali Tofigh6364d082022-03-14 13:32:04 +010054 void OnLogMessage(absl::string_view message, rtc::LoggingSeverity severity) override {
Jiawei Ou3ea18782018-10-31 23:14:24 -070055 if (callback_handler_) {
56 RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity);
Ali Tofigh6364d082022-03-14 13:32:04 +010057 callback_handler_([NSString stringForAbslStringView:message], loggingSeverity);
Jiawei Ou3ea18782018-10-31 23:14:24 -070058 }
59 }
60
61 private:
62 static RTCLoggingSeverity NativeSeverityToObjcSeverity(rtc::LoggingSeverity severity) {
63 switch (severity) {
Jiawei Ou3ea18782018-10-31 23:14:24 -070064 case rtc::LS_VERBOSE:
65 return RTCLoggingSeverityVerbose;
66 case rtc::LS_INFO:
67 return RTCLoggingSeverityInfo;
68 case rtc::LS_WARNING:
69 return RTCLoggingSeverityWarning;
70 case rtc::LS_ERROR:
71 return RTCLoggingSeverityError;
72 case rtc::LS_NONE:
73 return RTCLoggingSeverityNone;
74 }
75 }
76
77 RTCCallbackLoggerMessageAndSeverityHandler callback_handler_;
Anders Carlsson3b3364e2018-01-30 15:46:13 +010078};
79
Yura Yaroshevichcf9094a2022-03-28 14:20:05 +020080}
81
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020082@implementation RTC_OBJC_TYPE (RTCCallbackLogger) {
Anders Carlsson3b3364e2018-01-30 15:46:13 +010083 BOOL _hasStarted;
Jiawei Ou3ea18782018-10-31 23:14:24 -070084 std::unique_ptr<rtc::LogSink> _logSink;
Anders Carlsson3b3364e2018-01-30 15:46:13 +010085}
86
87@synthesize severity = _severity;
88
Jiawei Ou9bb8f802018-07-09 17:21:09 -070089- (instancetype)init {
90 self = [super init];
91 if (self != nil) {
92 _severity = RTCLoggingSeverityInfo;
93 }
94 return self;
95}
96
Anders Carlsson3b3364e2018-01-30 15:46:13 +010097- (void)dealloc {
98 [self stop];
99}
100
Jiawei Ou3ea18782018-10-31 23:14:24 -0700101- (void)start:(nullable RTCCallbackLoggerMessageHandler)handler {
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100102 if (_hasStarted) {
103 return;
104 }
105
Jiawei Ou3ea18782018-10-31 23:14:24 -0700106 _logSink.reset(new CallbackLogSink(handler));
107
108 rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
109 _hasStarted = YES;
110}
111
112- (void)startWithMessageAndSeverityHandler:
113 (nullable RTCCallbackLoggerMessageAndSeverityHandler)handler {
114 if (_hasStarted) {
115 return;
116 }
117
118 _logSink.reset(new CallbackWithSeverityLogSink(handler));
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100119
120 rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
121 _hasStarted = YES;
122}
123
124- (void)stop {
125 if (!_hasStarted) {
126 return;
127 }
128 RTC_DCHECK(_logSink);
129 rtc::LogMessage::RemoveLogToStream(_logSink.get());
130 _hasStarted = NO;
131 _logSink.reset();
132}
133
134#pragma mark - Private
135
136- (rtc::LoggingSeverity)rtcSeverity {
137 switch (_severity) {
138 case RTCLoggingSeverityVerbose:
139 return rtc::LS_VERBOSE;
140 case RTCLoggingSeverityInfo:
141 return rtc::LS_INFO;
142 case RTCLoggingSeverityWarning:
143 return rtc::LS_WARNING;
144 case RTCLoggingSeverityError:
145 return rtc::LS_ERROR;
Peter Hanspersd419db92018-10-15 22:47:38 +0200146 case RTCLoggingSeverityNone:
147 return rtc::LS_NONE;
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100148 }
149}
150
151@end