Browse Source

Added optional callback to C API rtcInitLogger()

Paul-Louis Ageneau 5 years ago
parent
commit
878d15b746
5 changed files with 68 additions and 34 deletions
  1. 8 8
      examples/copy-paste-capi/answerer.c
  2. 8 8
      examples/copy-paste-capi/offerer.c
  3. 13 13
      include/rtc/rtc.h
  4. 38 4
      src/rtc.cpp
  5. 1 1
      test/capi.cpp

+ 8 - 8
examples/copy-paste-capi/answerer.c

@@ -64,16 +64,16 @@ char* state_print(rtcState state);
 char* rtcGatheringState_print(rtcState state);
 
 int main(int argc, char **argv) {
-        rtcInitLogger(RTC_LOG_DEBUG);
+	rtcInitLogger(RTC_LOG_DEBUG, NULL);
 
-        // Create peer
-        rtcConfiguration config;
-        memset(&config, 0, sizeof(config));
+	// Create peer
+	rtcConfiguration config;
+	memset(&config, 0, sizeof(config));
 
-        Peer *peer = (Peer *)malloc(sizeof(Peer));
-        if (!peer) {
-		    fprintf(stderr, "Error allocating memory for peer\n");
-		    return -1;
+	Peer *peer = (Peer *)malloc(sizeof(Peer));
+	if (!peer) {
+		fprintf(stderr, "Error allocating memory for peer\n");
+		return -1;
 	    }
         memset(peer, 0, sizeof(Peer));
 

+ 8 - 8
examples/copy-paste-capi/offerer.c

@@ -65,16 +65,16 @@ static void deletePeer(Peer *peer);
 int all_space(const char *str);
 
 int main(int argc, char **argv){
-        rtcInitLogger(RTC_LOG_DEBUG);
+	rtcInitLogger(RTC_LOG_DEBUG, NULL);
 
-        // Create peer
-        rtcConfiguration config;
-        memset(&config, 0, sizeof(config));
+	// Create peer
+	rtcConfiguration config;
+	memset(&config, 0, sizeof(config));
 
-        Peer *peer = (Peer *)malloc(sizeof(Peer));
-	    if (!peer) {
-		    fprintf(stderr, "Error allocating memory for peer\n");
-		    return -1;
+	Peer *peer = (Peer *)malloc(sizeof(Peer));
+	if (!peer) {
+		fprintf(stderr, "Error allocating memory for peer\n");
+		return -1;
 	    }
 	    memset(peer, 0, sizeof(Peer));
 

+ 13 - 13
include/rtc/rtc.h

@@ -71,21 +71,21 @@ typedef struct {
 	uint16_t portRangeEnd;
 } rtcConfiguration;
 
-typedef void(rtcLogCallbackFunc)(rtcLogLevel level, const char *message);
-typedef void(rtcDataChannelCallbackFunc)(int dc, void *ptr);
-typedef void(rtcDescriptionCallbackFunc)(const char *sdp, const char *type, void *ptr);
-typedef void(rtcCandidateCallbackFunc)(const char *cand, const char *mid, void *ptr);
-typedef void(rtcStateChangeCallbackFunc)(rtcState state, void *ptr);
-typedef void(rtcGatheringStateCallbackFunc)(rtcGatheringState state, void *ptr);
-typedef void(rtcOpenCallbackFunc)(void *ptr);
-typedef void(rtcClosedCallbackFunc)(void *ptr);
-typedef void(rtcErrorCallbackFunc)(const char *error, void *ptr);
-typedef void(rtcMessageCallbackFunc)(const char *message, int size, void *ptr);
-typedef void(rtcBufferedAmountLowCallbackFunc)(void *ptr);
-typedef void(rtcAvailableCallbackFunc)(void *ptr);
+typedef void (*rtcLogCallbackFunc)(rtcLogLevel level, const char *message);
+typedef void (*rtcDataChannelCallbackFunc)(int dc, void *ptr);
+typedef void (*rtcDescriptionCallbackFunc)(const char *sdp, const char *type, void *ptr);
+typedef void (*rtcCandidateCallbackFunc)(const char *cand, const char *mid, void *ptr);
+typedef void (*rtcStateChangeCallbackFunc)(rtcState state, void *ptr);
+typedef void (*rtcGatheringStateCallbackFunc)(rtcGatheringState state, void *ptr);
+typedef void (*rtcOpenCallbackFunc)(void *ptr);
+typedef void (*rtcClosedCallbackFunc)(void *ptr);
+typedef void (*rtcErrorCallbackFunc)(const char *error, void *ptr);
+typedef void (*rtcMessageCallbackFunc)(const char *message, int size, void *ptr);
+typedef void (*rtcBufferedAmountLowCallbackFunc)(void *ptr);
+typedef void (*rtcAvailableCallbackFunc)(void *ptr);
 
 // Log
-void rtcInitLogger(rtcLogLevel level);
+void rtcInitLogger(rtcLogLevel level, rtcLogCallbackFunc cb); // NULL cb to log to stdout
 
 // User pointer
 void rtcSetUserPointer(int id, void *ptr);

+ 38 - 4
src/rtc.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2019 Paul-Louis Ageneau
+ * Copyright (c) 2019-2020 Paul-Louis Ageneau
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -18,15 +18,16 @@
 
 #include "include.hpp"
 
+#include "rtc.h"
+
 #include "datachannel.hpp"
 #include "log.hpp"
 #include "peerconnection.hpp"
-
 #if RTC_ENABLE_WEBSOCKET
 #include "websocket.hpp"
 #endif
 
-#include <rtc.h>
+#include "plog/Formatters/FuncMessageFormatter.h"
 
 #include <exception>
 #include <mutex>
@@ -161,9 +162,42 @@ template <typename F> int wrap(F func) {
 		return RTC_ERR_SUCCESS;                                                                    \
 	})
 
+class plog_appender : public plog::IAppender {
+public:
+	plog_appender(rtcLogCallbackFunc cb = nullptr) { set_callback(cb); }
+
+	void set_callback(rtcLogCallbackFunc cb) {
+		std::lock_guard lock(mutex);
+		callback = cb;
+	}
+
+	void write(const plog::Record &record) override {
+		plog::Severity severity = record.getSeverity();
+		std::string formatted = plog::FuncMessageFormatter::format(record);
+		formatted.pop_back(); // remove newline
+
+		std::lock_guard lock(mutex);
+		if (callback)
+			callback(static_cast<rtcLogLevel>(record.getSeverity()), formatted.c_str());
+		else
+			std::cout << plog::severityToString(severity) << " " << formatted << std::endl;
+	}
+
+private:
+	rtcLogCallbackFunc callback;
+};
+
 } // namespace
 
-void rtcInitLogger(rtcLogLevel level) { InitLogger(static_cast<LogLevel>(level)); }
+void rtcInitLogger(rtcLogLevel level, rtcLogCallbackFunc cb) {
+	static std::optional<plog_appender> appender;
+	if (appender)
+		appender->set_callback(cb);
+	else if (cb)
+		appender.emplace(plog_appender(cb));
+
+	InitLogger(static_cast<plog::Severity>(level), appender ? &appender.value() : nullptr);
+}
 
 void rtcSetUserPointer(int i, void *ptr) { setUserPointer(i, ptr); }
 

+ 1 - 1
test/capi.cpp

@@ -136,7 +136,7 @@ static void deletePeer(Peer *peer) {
 int test_capi_main() {
 	int attempts;
 
-	rtcInitLogger(RTC_LOG_DEBUG);
+	rtcInitLogger(RTC_LOG_DEBUG, nullptr);
 
 	// Create peer 1
 	rtcConfiguration config1;