Skip to content

Instantly share code, notes, and snippets.

@alinradut
Created May 2, 2017 09:08
Show Gist options
  • Save alinradut/789b71c4cd3e63dbca74ba6768345100 to your computer and use it in GitHub Desktop.
Save alinradut/789b71c4cd3e63dbca74ba6768345100 to your computer and use it in GitHub Desktop.
WebRTC patch for a callback logger for iOS
diff --git a/BUILD.gn b/BUILD.gn
index 4e6816fd8..d54fef764 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -12,7 +12,7 @@ group("default") {
testonly = true
deps = [
"//webrtc",
- "//webrtc/examples",
+# "//webrtc/examples",
"//webrtc/tools",
]
if (rtc_include_tests) {
diff --git a/webrtc/base/logsinks.cc b/webrtc/base/logsinks.cc
index 5a6db45ca..9d7098ac2 100644
--- a/webrtc/base/logsinks.cc
+++ b/webrtc/base/logsinks.cc
@@ -62,3 +62,20 @@ CallSessionFileRotatingLogSink::~CallSessionFileRotatingLogSink() {
}
} // namespace rtc
+
+namespace rtc {
+
+ CallbackLogSink::CallbackLogSink(CallbackLogSinkCallback callback) {
+ _callback = callback;
+ }
+
+ CallbackLogSink::~CallbackLogSink() {
+
+ }
+
+ void CallbackLogSink::OnLogMessage(const std::string& message) {
+ if (_callback) {
+ _callback(message);
+ }
+ }
+}
\ No newline at end of file
diff --git a/webrtc/base/logsinks.h b/webrtc/base/logsinks.h
index e75120e3f..cfb77b6b0 100644
--- a/webrtc/base/logsinks.h
+++ b/webrtc/base/logsinks.h
@@ -65,4 +65,18 @@ class CallSessionFileRotatingLogSink : public FileRotatingLogSink {
} // namespace rtc
+namespace rtc {
+ typedef void (*CallbackLogSinkCallback)(const std::string& message);
+
+ class CallbackLogSink: public LogSink {
+ public:
+ CallbackLogSink(CallbackLogSinkCallback callback);
+ ~CallbackLogSink() override;
+ void OnLogMessage(const std::string& message) override;
+ private:
+ CallbackLogSinkCallback _callback;
+ RTC_DISALLOW_COPY_AND_ASSIGN(CallbackLogSink);
+ };
+}
+
#endif // WEBRTC_BASE_FILE_ROTATING_LOG_SINK_H_
diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn
index d8e745c83..479eecfd5 100644
--- a/webrtc/sdk/BUILD.gn
+++ b/webrtc/sdk/BUILD.gn
@@ -88,6 +88,8 @@ if (is_ios || is_mac) {
sources += [
"objc/Framework/Classes/RTCFileLogger.mm",
"objc/Framework/Headers/WebRTC/RTCFileLogger.h",
+ "objc/Framework/Classes/RTCCallbackLogger.mm",
+ "objc/Framework/Headers/WebRTC/RTCCallbackLogger.h",
]
}
}
@@ -350,8 +352,8 @@ if (is_ios || is_mac) {
public_headers = common_objc_headers
if (!build_with_chromium) {
- sources += [ "objc/Framework/Headers/WebRTC/RTCFileLogger.h" ]
- public_headers += [ "objc/Framework/Headers/WebRTC/RTCFileLogger.h" ]
+ sources += [ "objc/Framework/Headers/WebRTC/RTCFileLogger.h", "objc/Framework/Headers/WebRTC/RTCCallbackLogger.h" ]
+ public_headers += [ "objc/Framework/Headers/WebRTC/RTCFileLogger.h", "objc/Framework/Headers/WebRTC/RTCCallbackLogger.h" ]
}
ldflags = [
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCCallbackLogger.mm b/webrtc/sdk/objc/Framework/Classes/RTCCallbackLogger.mm
new file mode 100644
index 000000000..26c7e2f9b
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Classes/RTCCallbackLogger.mm
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2015 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import "WebRTC/RTCCallbackLogger.h"
+
+#include <memory>
+
+#include "webrtc/base/checks.h"
+#include "webrtc/base/logging.h"
+#include "webrtc/base/logsinks.h"
+
+void RTCCallbackLoggerCallback(const std::string& message) {
+ NSString *string = [NSString stringWithUTF8String:message.c_str()];
+ [[RTCCallbackLogger sharedInstance] onStringReceived: string];
+}
+
+@implementation RTCCallbackLogger {
+ BOOL _hasStarted;
+ std::unique_ptr<rtc::CallbackLogSink> _logSink;
+}
+
+@synthesize delegate = _delegate;
+@synthesize severity = _severity;
+
++ (instancetype)sharedInstance {
+ static dispatch_once_t onceToken;
+ static RTCCallbackLogger *instance;
+ dispatch_once(&onceToken, ^{
+ instance = [[RTCCallbackLogger alloc] init];
+ });
+ return instance;
+}
+
+- (id)init {
+ self = [super init];
+ if (self) {
+ _severity = RTCFileLoggerSeverityInfo;
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [self stop];
+}
+
+- (void)start {
+ if (_hasStarted) {
+ return;
+ }
+
+ rtc::CallbackLogSinkCallback callback = &RTCCallbackLoggerCallback;
+ _logSink.reset(
+ new rtc::CallbackLogSink(callback));
+
+ rtc::LogMessage::LogThreads(true);
+ rtc::LogMessage::LogTimestamps(false);
+ rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
+ _hasStarted = YES;
+}
+
+- (void)stop {
+ if (!_hasStarted) {
+ return;
+ }
+ RTC_DCHECK(_logSink);
+ rtc::LogMessage::RemoveLogToStream(_logSink.get());
+ _hasStarted = NO;
+ _logSink.reset();
+}
+
+- (void)onStringReceived:(NSString *)string {
+ [_delegate callbackLogger:self didReceiveMessage:string];
+}
+
+#pragma mark - Private
+
+- (rtc::LoggingSeverity)rtcSeverity {
+ switch (_severity) {
+ case RTCFileLoggerSeverityVerbose:
+ return rtc::LS_VERBOSE;
+ case RTCFileLoggerSeverityInfo:
+ return rtc::LS_INFO;
+ case RTCFileLoggerSeverityWarning:
+ return rtc::LS_WARNING;
+ case RTCFileLoggerSeverityError:
+ return rtc::LS_ERROR;
+ }
+}
+
+@end
diff --git a/webrtc/sdk/objc/Framework/Classes/RTCFileLogger.mm b/webrtc/sdk/objc/Framework/Classes/RTCFileLogger.mm
index c1fbd747c..5fed10ec6 100644
--- a/webrtc/sdk/objc/Framework/Classes/RTCFileLogger.mm
+++ b/webrtc/sdk/objc/Framework/Classes/RTCFileLogger.mm
@@ -173,4 +173,4 @@ const char *kRTCFileLoggerRotatingLogPrefix = "rotating_log";
}
}
-@end
+@end
\ No newline at end of file
diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCCallbackLogger.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCCallbackLogger.h
new file mode 100644
index 000000000..988342145
--- /dev/null
+++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCCallbackLogger.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2015 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#import <Foundation/Foundation.h>
+
+#import <WebRTC/RTCMacros.h>
+#import <WebRTC/RTCFileLogger.h>
+
+NS_ASSUME_NONNULL_BEGIN
+@class RTCCallbackLogger;
+
+// This delegate will be called whenever there is a new log statement.
+RTC_EXPORT
+@protocol RTCCallbackLoggerDelegate
+- (void)callbackLogger:(RTCCallbackLogger *)callbackLogger didReceiveMessage:(NSString *)message;
+@end
+
+// This class intercepts WebRTC logs and sends them to a delegate.
+// This class is not threadsafe.
+RTC_EXPORT
+@interface RTCCallbackLogger : NSObject
+
++ (instancetype)sharedInstance;
+
+- (void)onStringReceived:(NSString *)string;
+
+// The severity level to capture. The default is kRTCFileLoggerSeverityInfo.
+@property(nonatomic, assign) RTCFileLoggerSeverity severity;
+@property(nonatomic, weak, nullable) id<RTCCallbackLoggerDelegate> delegate;
+
+// Starts processing WebRTC logs and forwards them to the delegate.
+- (void)start;
+
+// Stops processing WebRTC logs. This method is also called on dealloc.
+- (void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment