blob: 90bb8b0238c2135b4a90209b5f4eea06bedb71bd [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
22class CallbackLogSink : public rtc::LogSink {
23 public:
Jiawei Ou3ea18782018-10-31 23:14:24 -070024 CallbackLogSink(RTCCallbackLoggerMessageHandler callbackHandler)
25 : callback_handler_(callbackHandler) {}
Anders Carlsson3b3364e2018-01-30 15:46:13 +010026
Ali Tofigh6364d082022-03-14 13:32:04 +010027 void OnLogMessage(const std::string& message) override {
28 OnLogMessage(absl::string_view(message));
29 }
30
31 void OnLogMessage(absl::string_view message) override {
Anders Carlsson3b3364e2018-01-30 15:46:13 +010032 if (callback_handler_) {
Ali Tofigh6364d082022-03-14 13:32:04 +010033 callback_handler_([NSString stringForAbslStringView:message]);
Anders Carlsson3b3364e2018-01-30 15:46:13 +010034 }
35 }
36
37 private:
Jiawei Ou3ea18782018-10-31 23:14:24 -070038 RTCCallbackLoggerMessageHandler callback_handler_;
39};
40
41class CallbackWithSeverityLogSink : public rtc::LogSink {
42 public:
43 CallbackWithSeverityLogSink(RTCCallbackLoggerMessageAndSeverityHandler callbackHandler)
44 : callback_handler_(callbackHandler) {}
45
Artem Titovd3251962021-11-15 16:57:07 +010046 void OnLogMessage(const std::string& message) override { RTC_DCHECK_NOTREACHED(); }
Jiawei Ou3ea18782018-10-31 23:14:24 -070047
Ali Tofigh6364d082022-03-14 13:32:04 +010048 void OnLogMessage(absl::string_view message, rtc::LoggingSeverity severity) override {
Jiawei Ou3ea18782018-10-31 23:14:24 -070049 if (callback_handler_) {
50 RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity);
Ali Tofigh6364d082022-03-14 13:32:04 +010051 callback_handler_([NSString stringForAbslStringView:message], loggingSeverity);
Jiawei Ou3ea18782018-10-31 23:14:24 -070052 }
53 }
54
55 private:
56 static RTCLoggingSeverity NativeSeverityToObjcSeverity(rtc::LoggingSeverity severity) {
57 switch (severity) {
Jiawei Ou3ea18782018-10-31 23:14:24 -070058 case rtc::LS_VERBOSE:
59 return RTCLoggingSeverityVerbose;
60 case rtc::LS_INFO:
61 return RTCLoggingSeverityInfo;
62 case rtc::LS_WARNING:
63 return RTCLoggingSeverityWarning;
64 case rtc::LS_ERROR:
65 return RTCLoggingSeverityError;
66 case rtc::LS_NONE:
67 return RTCLoggingSeverityNone;
68 }
69 }
70
71 RTCCallbackLoggerMessageAndSeverityHandler callback_handler_;
Anders Carlsson3b3364e2018-01-30 15:46:13 +010072};
73
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020074@implementation RTC_OBJC_TYPE (RTCCallbackLogger) {
Anders Carlsson3b3364e2018-01-30 15:46:13 +010075 BOOL _hasStarted;
Jiawei Ou3ea18782018-10-31 23:14:24 -070076 std::unique_ptr<rtc::LogSink> _logSink;
Anders Carlsson3b3364e2018-01-30 15:46:13 +010077}
78
79@synthesize severity = _severity;
80
Jiawei Ou9bb8f802018-07-09 17:21:09 -070081- (instancetype)init {
82 self = [super init];
83 if (self != nil) {
84 _severity = RTCLoggingSeverityInfo;
85 }
86 return self;
87}
88
Anders Carlsson3b3364e2018-01-30 15:46:13 +010089- (void)dealloc {
90 [self stop];
91}
92
Jiawei Ou3ea18782018-10-31 23:14:24 -070093- (void)start:(nullable RTCCallbackLoggerMessageHandler)handler {
Anders Carlsson3b3364e2018-01-30 15:46:13 +010094 if (_hasStarted) {
95 return;
96 }
97
Jiawei Ou3ea18782018-10-31 23:14:24 -070098 _logSink.reset(new CallbackLogSink(handler));
99
100 rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
101 _hasStarted = YES;
102}
103
104- (void)startWithMessageAndSeverityHandler:
105 (nullable RTCCallbackLoggerMessageAndSeverityHandler)handler {
106 if (_hasStarted) {
107 return;
108 }
109
110 _logSink.reset(new CallbackWithSeverityLogSink(handler));
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100111
112 rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
113 _hasStarted = YES;
114}
115
116- (void)stop {
117 if (!_hasStarted) {
118 return;
119 }
120 RTC_DCHECK(_logSink);
121 rtc::LogMessage::RemoveLogToStream(_logSink.get());
122 _hasStarted = NO;
123 _logSink.reset();
124}
125
126#pragma mark - Private
127
128- (rtc::LoggingSeverity)rtcSeverity {
129 switch (_severity) {
130 case RTCLoggingSeverityVerbose:
131 return rtc::LS_VERBOSE;
132 case RTCLoggingSeverityInfo:
133 return rtc::LS_INFO;
134 case RTCLoggingSeverityWarning:
135 return rtc::LS_WARNING;
136 case RTCLoggingSeverityError:
137 return rtc::LS_ERROR;
Peter Hanspersd419db92018-10-15 22:47:38 +0200138 case RTCLoggingSeverityNone:
139 return rtc::LS_NONE;
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100140 }
141}
142
143@end