blob: da60c2b9d212eb55c49e2d54d01a0b70b6deb1d6 [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:
21 CallbackLogSink(void (^callbackHandler)(NSString *message)) {
22 callback_handler_ = callbackHandler;
23 }
24
25 ~CallbackLogSink() override { callback_handler_ = nil; }
26
27 void OnLogMessage(const std::string &message) override {
28 if (callback_handler_) {
29 callback_handler_([NSString stringWithUTF8String:message.c_str()]);
30 }
31 }
32
33 private:
34 void (^callback_handler_)(NSString *message);
35};
36
37@implementation RTCCallbackLogger {
38 BOOL _hasStarted;
39 std::unique_ptr<CallbackLogSink> _logSink;
40}
41
42@synthesize severity = _severity;
43
Jiawei Ou9bb8f802018-07-09 17:21:09 -070044- (instancetype)init {
45 self = [super init];
46 if (self != nil) {
47 _severity = RTCLoggingSeverityInfo;
48 }
49 return self;
50}
51
Anders Carlsson3b3364e2018-01-30 15:46:13 +010052- (void)dealloc {
53 [self stop];
54}
55
56- (void)start:(nullable void (^)(NSString *))callback {
57 if (_hasStarted) {
58 return;
59 }
60
61 _logSink.reset(new CallbackLogSink(callback));
62
63 rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
64 _hasStarted = YES;
65}
66
67- (void)stop {
68 if (!_hasStarted) {
69 return;
70 }
71 RTC_DCHECK(_logSink);
72 rtc::LogMessage::RemoveLogToStream(_logSink.get());
73 _hasStarted = NO;
74 _logSink.reset();
75}
76
77#pragma mark - Private
78
79- (rtc::LoggingSeverity)rtcSeverity {
80 switch (_severity) {
81 case RTCLoggingSeverityVerbose:
82 return rtc::LS_VERBOSE;
83 case RTCLoggingSeverityInfo:
84 return rtc::LS_INFO;
85 case RTCLoggingSeverityWarning:
86 return rtc::LS_WARNING;
87 case RTCLoggingSeverityError:
88 return rtc::LS_ERROR;
Peter Hanspersd419db92018-10-15 22:47:38 +020089 case RTCLoggingSeverityNone:
90 return rtc::LS_NONE;
Anders Carlsson3b3364e2018-01-30 15:46:13 +010091 }
92}
93
94@end