blob: 9bbb53043409a27c56a64c5a17cb84a9dc0fb884 [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
13#include <memory>
14
15#include "rtc_base/checks.h"
16#include "rtc_base/logging.h"
17#include "rtc_base/logsinks.h"
18
19class CallbackLogSink : public rtc::LogSink {
20 public:
Jiawei Ou3ea18782018-10-31 23:14:24 -070021 CallbackLogSink(RTCCallbackLoggerMessageHandler callbackHandler)
22 : callback_handler_(callbackHandler) {}
Anders Carlsson3b3364e2018-01-30 15:46:13 +010023
24 void OnLogMessage(const std::string &message) override {
25 if (callback_handler_) {
26 callback_handler_([NSString stringWithUTF8String:message.c_str()]);
27 }
28 }
29
30 private:
Jiawei Ou3ea18782018-10-31 23:14:24 -070031 RTCCallbackLoggerMessageHandler callback_handler_;
32};
33
34class CallbackWithSeverityLogSink : public rtc::LogSink {
35 public:
36 CallbackWithSeverityLogSink(RTCCallbackLoggerMessageAndSeverityHandler callbackHandler)
37 : callback_handler_(callbackHandler) {}
38
39 void OnLogMessage(const std::string& message) override { RTC_NOTREACHED(); }
40
41 void OnLogMessage(const std::string& message, rtc::LoggingSeverity severity) override {
42 if (callback_handler_) {
43 RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity);
44 callback_handler_([NSString stringWithUTF8String:message.c_str()], loggingSeverity);
45 }
46 }
47
48 private:
49 static RTCLoggingSeverity NativeSeverityToObjcSeverity(rtc::LoggingSeverity severity) {
50 switch (severity) {
51 case rtc::LS_SENSITIVE:
52 return RTCLoggingSeveritySensitive;
53 case rtc::LS_VERBOSE:
54 return RTCLoggingSeverityVerbose;
55 case rtc::LS_INFO:
56 return RTCLoggingSeverityInfo;
57 case rtc::LS_WARNING:
58 return RTCLoggingSeverityWarning;
59 case rtc::LS_ERROR:
60 return RTCLoggingSeverityError;
61 case rtc::LS_NONE:
62 return RTCLoggingSeverityNone;
63 }
64 }
65
66 RTCCallbackLoggerMessageAndSeverityHandler callback_handler_;
Anders Carlsson3b3364e2018-01-30 15:46:13 +010067};
68
69@implementation RTCCallbackLogger {
70 BOOL _hasStarted;
Jiawei Ou3ea18782018-10-31 23:14:24 -070071 std::unique_ptr<rtc::LogSink> _logSink;
Anders Carlsson3b3364e2018-01-30 15:46:13 +010072}
73
74@synthesize severity = _severity;
75
Jiawei Ou9bb8f802018-07-09 17:21:09 -070076- (instancetype)init {
77 self = [super init];
78 if (self != nil) {
79 _severity = RTCLoggingSeverityInfo;
80 }
81 return self;
82}
83
Anders Carlsson3b3364e2018-01-30 15:46:13 +010084- (void)dealloc {
85 [self stop];
86}
87
Jiawei Ou3ea18782018-10-31 23:14:24 -070088- (void)start:(nullable RTCCallbackLoggerMessageHandler)handler {
Anders Carlsson3b3364e2018-01-30 15:46:13 +010089 if (_hasStarted) {
90 return;
91 }
92
Jiawei Ou3ea18782018-10-31 23:14:24 -070093 _logSink.reset(new CallbackLogSink(handler));
94
95 rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
96 _hasStarted = YES;
97}
98
99- (void)startWithMessageAndSeverityHandler:
100 (nullable RTCCallbackLoggerMessageAndSeverityHandler)handler {
101 if (_hasStarted) {
102 return;
103 }
104
105 _logSink.reset(new CallbackWithSeverityLogSink(handler));
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100106
107 rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
108 _hasStarted = YES;
109}
110
111- (void)stop {
112 if (!_hasStarted) {
113 return;
114 }
115 RTC_DCHECK(_logSink);
116 rtc::LogMessage::RemoveLogToStream(_logSink.get());
117 _hasStarted = NO;
118 _logSink.reset();
119}
120
121#pragma mark - Private
122
123- (rtc::LoggingSeverity)rtcSeverity {
124 switch (_severity) {
Jiawei Ou3ea18782018-10-31 23:14:24 -0700125 case RTCLoggingSeveritySensitive:
126 return rtc::LS_SENSITIVE;
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100127 case RTCLoggingSeverityVerbose:
128 return rtc::LS_VERBOSE;
129 case RTCLoggingSeverityInfo:
130 return rtc::LS_INFO;
131 case RTCLoggingSeverityWarning:
132 return rtc::LS_WARNING;
133 case RTCLoggingSeverityError:
134 return rtc::LS_ERROR;
Peter Hanspersd419db92018-10-15 22:47:38 +0200135 case RTCLoggingSeverityNone:
136 return rtc::LS_NONE;
Anders Carlsson3b3364e2018-01-30 15:46:13 +0100137 }
138}
139
140@end