1*d9f75844SAndroid Build Coastguard Worker/* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2018 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker#import "RTCCallbackLogger.h" 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker#import "helpers/NSString+StdString.h" 14*d9f75844SAndroid Build Coastguard Worker 15*d9f75844SAndroid Build Coastguard Worker#include <memory> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker#include "absl/strings/string_view.h" 18*d9f75844SAndroid Build Coastguard Worker#include "rtc_base/checks.h" 19*d9f75844SAndroid Build Coastguard Worker#include "rtc_base/log_sinks.h" 20*d9f75844SAndroid Build Coastguard Worker#include "rtc_base/logging.h" 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Workernamespace { 23*d9f75844SAndroid Build Coastguard Worker 24*d9f75844SAndroid Build Coastguard Workerclass CallbackLogSink final : public rtc::LogSink { 25*d9f75844SAndroid Build Coastguard Worker public: 26*d9f75844SAndroid Build Coastguard Worker CallbackLogSink(RTCCallbackLoggerMessageHandler callbackHandler) 27*d9f75844SAndroid Build Coastguard Worker : callback_handler_(callbackHandler) {} 28*d9f75844SAndroid Build Coastguard Worker 29*d9f75844SAndroid Build Coastguard Worker void OnLogMessage(const std::string& message) override { 30*d9f75844SAndroid Build Coastguard Worker OnLogMessage(absl::string_view(message)); 31*d9f75844SAndroid Build Coastguard Worker } 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker void OnLogMessage(absl::string_view message) override { 34*d9f75844SAndroid Build Coastguard Worker if (callback_handler_) { 35*d9f75844SAndroid Build Coastguard Worker callback_handler_([NSString stringForAbslStringView:message]); 36*d9f75844SAndroid Build Coastguard Worker } 37*d9f75844SAndroid Build Coastguard Worker } 38*d9f75844SAndroid Build Coastguard Worker 39*d9f75844SAndroid Build Coastguard Worker private: 40*d9f75844SAndroid Build Coastguard Worker RTCCallbackLoggerMessageHandler callback_handler_; 41*d9f75844SAndroid Build Coastguard Worker}; 42*d9f75844SAndroid Build Coastguard Worker 43*d9f75844SAndroid Build Coastguard Workerclass CallbackWithSeverityLogSink final : public rtc::LogSink { 44*d9f75844SAndroid Build Coastguard Worker public: 45*d9f75844SAndroid Build Coastguard Worker CallbackWithSeverityLogSink(RTCCallbackLoggerMessageAndSeverityHandler callbackHandler) 46*d9f75844SAndroid Build Coastguard Worker : callback_handler_(callbackHandler) {} 47*d9f75844SAndroid Build Coastguard Worker 48*d9f75844SAndroid Build Coastguard Worker void OnLogMessage(const std::string& message) override { RTC_DCHECK_NOTREACHED(); } 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker void OnLogMessage(const std::string& message, rtc::LoggingSeverity severity) override { 51*d9f75844SAndroid Build Coastguard Worker OnLogMessage(absl::string_view(message), severity); 52*d9f75844SAndroid Build Coastguard Worker } 53*d9f75844SAndroid Build Coastguard Worker 54*d9f75844SAndroid Build Coastguard Worker void OnLogMessage(absl::string_view message, rtc::LoggingSeverity severity) override { 55*d9f75844SAndroid Build Coastguard Worker if (callback_handler_) { 56*d9f75844SAndroid Build Coastguard Worker RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity); 57*d9f75844SAndroid Build Coastguard Worker callback_handler_([NSString stringForAbslStringView:message], loggingSeverity); 58*d9f75844SAndroid Build Coastguard Worker } 59*d9f75844SAndroid Build Coastguard Worker } 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker private: 62*d9f75844SAndroid Build Coastguard Worker static RTCLoggingSeverity NativeSeverityToObjcSeverity(rtc::LoggingSeverity severity) { 63*d9f75844SAndroid Build Coastguard Worker switch (severity) { 64*d9f75844SAndroid Build Coastguard Worker case rtc::LS_VERBOSE: 65*d9f75844SAndroid Build Coastguard Worker return RTCLoggingSeverityVerbose; 66*d9f75844SAndroid Build Coastguard Worker case rtc::LS_INFO: 67*d9f75844SAndroid Build Coastguard Worker return RTCLoggingSeverityInfo; 68*d9f75844SAndroid Build Coastguard Worker case rtc::LS_WARNING: 69*d9f75844SAndroid Build Coastguard Worker return RTCLoggingSeverityWarning; 70*d9f75844SAndroid Build Coastguard Worker case rtc::LS_ERROR: 71*d9f75844SAndroid Build Coastguard Worker return RTCLoggingSeverityError; 72*d9f75844SAndroid Build Coastguard Worker case rtc::LS_NONE: 73*d9f75844SAndroid Build Coastguard Worker return RTCLoggingSeverityNone; 74*d9f75844SAndroid Build Coastguard Worker } 75*d9f75844SAndroid Build Coastguard Worker } 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker RTCCallbackLoggerMessageAndSeverityHandler callback_handler_; 78*d9f75844SAndroid Build Coastguard Worker}; 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker} 81*d9f75844SAndroid Build Coastguard Worker 82*d9f75844SAndroid Build Coastguard Worker@implementation RTC_OBJC_TYPE (RTCCallbackLogger) { 83*d9f75844SAndroid Build Coastguard Worker BOOL _hasStarted; 84*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<rtc::LogSink> _logSink; 85*d9f75844SAndroid Build Coastguard Worker} 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker@synthesize severity = _severity; 88*d9f75844SAndroid Build Coastguard Worker 89*d9f75844SAndroid Build Coastguard Worker- (instancetype)init { 90*d9f75844SAndroid Build Coastguard Worker self = [super init]; 91*d9f75844SAndroid Build Coastguard Worker if (self != nil) { 92*d9f75844SAndroid Build Coastguard Worker _severity = RTCLoggingSeverityInfo; 93*d9f75844SAndroid Build Coastguard Worker } 94*d9f75844SAndroid Build Coastguard Worker return self; 95*d9f75844SAndroid Build Coastguard Worker} 96*d9f75844SAndroid Build Coastguard Worker 97*d9f75844SAndroid Build Coastguard Worker- (void)dealloc { 98*d9f75844SAndroid Build Coastguard Worker [self stop]; 99*d9f75844SAndroid Build Coastguard Worker} 100*d9f75844SAndroid Build Coastguard Worker 101*d9f75844SAndroid Build Coastguard Worker- (void)start:(nullable RTCCallbackLoggerMessageHandler)handler { 102*d9f75844SAndroid Build Coastguard Worker if (_hasStarted) { 103*d9f75844SAndroid Build Coastguard Worker return; 104*d9f75844SAndroid Build Coastguard Worker } 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker _logSink.reset(new CallbackLogSink(handler)); 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]); 109*d9f75844SAndroid Build Coastguard Worker _hasStarted = YES; 110*d9f75844SAndroid Build Coastguard Worker} 111*d9f75844SAndroid Build Coastguard Worker 112*d9f75844SAndroid Build Coastguard Worker- (void)startWithMessageAndSeverityHandler: 113*d9f75844SAndroid Build Coastguard Worker (nullable RTCCallbackLoggerMessageAndSeverityHandler)handler { 114*d9f75844SAndroid Build Coastguard Worker if (_hasStarted) { 115*d9f75844SAndroid Build Coastguard Worker return; 116*d9f75844SAndroid Build Coastguard Worker } 117*d9f75844SAndroid Build Coastguard Worker 118*d9f75844SAndroid Build Coastguard Worker _logSink.reset(new CallbackWithSeverityLogSink(handler)); 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]); 121*d9f75844SAndroid Build Coastguard Worker _hasStarted = YES; 122*d9f75844SAndroid Build Coastguard Worker} 123*d9f75844SAndroid Build Coastguard Worker 124*d9f75844SAndroid Build Coastguard Worker- (void)stop { 125*d9f75844SAndroid Build Coastguard Worker if (!_hasStarted) { 126*d9f75844SAndroid Build Coastguard Worker return; 127*d9f75844SAndroid Build Coastguard Worker } 128*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(_logSink); 129*d9f75844SAndroid Build Coastguard Worker rtc::LogMessage::RemoveLogToStream(_logSink.get()); 130*d9f75844SAndroid Build Coastguard Worker _hasStarted = NO; 131*d9f75844SAndroid Build Coastguard Worker _logSink.reset(); 132*d9f75844SAndroid Build Coastguard Worker} 133*d9f75844SAndroid Build Coastguard Worker 134*d9f75844SAndroid Build Coastguard Worker#pragma mark - Private 135*d9f75844SAndroid Build Coastguard Worker 136*d9f75844SAndroid Build Coastguard Worker- (rtc::LoggingSeverity)rtcSeverity { 137*d9f75844SAndroid Build Coastguard Worker switch (_severity) { 138*d9f75844SAndroid Build Coastguard Worker case RTCLoggingSeverityVerbose: 139*d9f75844SAndroid Build Coastguard Worker return rtc::LS_VERBOSE; 140*d9f75844SAndroid Build Coastguard Worker case RTCLoggingSeverityInfo: 141*d9f75844SAndroid Build Coastguard Worker return rtc::LS_INFO; 142*d9f75844SAndroid Build Coastguard Worker case RTCLoggingSeverityWarning: 143*d9f75844SAndroid Build Coastguard Worker return rtc::LS_WARNING; 144*d9f75844SAndroid Build Coastguard Worker case RTCLoggingSeverityError: 145*d9f75844SAndroid Build Coastguard Worker return rtc::LS_ERROR; 146*d9f75844SAndroid Build Coastguard Worker case RTCLoggingSeverityNone: 147*d9f75844SAndroid Build Coastguard Worker return rtc::LS_NONE; 148*d9f75844SAndroid Build Coastguard Worker } 149*d9f75844SAndroid Build Coastguard Worker} 150*d9f75844SAndroid Build Coastguard Worker 151*d9f75844SAndroid Build Coastguard Worker@end 152