From f157602a52278519370c45cde4c9a0b12ede8d7e Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
Date: Fri, 14 Aug 2020 01:03:27 +0200
Subject: [PATCH] Disable call support, when GStreamer is unavailable

Integrating that in our CI is currently a bit hard, so disable it for
now, if GStreamer isn't found. Just make sure to build against GStreamer
for call support!
---
 CMakeLists.txt          | 10 +++---
 src/CallManager.cpp     |  4 +++
 src/TextInputWidget.cpp |  6 ++++
 src/WebRTCSession.cpp   | 68 ++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 83 insertions(+), 5 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e17f70f6b..1be11fa34 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -427,8 +427,7 @@ else()
 endif()
 
 include(FindPkgConfig)
-pkg_check_modules(GST_SDP REQUIRED IMPORTED_TARGET gstreamer-sdp-1.0>=1.14) 
-pkg_check_modules(GST_WEBRTC REQUIRED IMPORTED_TARGET gstreamer-webrtc-1.0>=1.14) 
+pkg_check_modules(GSTREAMER IMPORTED_TARGET gstreamer-sdp-1.0>=1.14 gstreamer-webrtc-1.0>=1.14) 
 
 # single instance functionality
 set(QAPPLICATION_CLASS QApplication CACHE STRING "Inheritance class for SingleApplication")
@@ -595,8 +594,6 @@ target_link_libraries(nheko PRIVATE
 	lmdbxx::lmdbxx
 	liblmdb::lmdb
 	tweeny
-	PkgConfig::GST_SDP
-	PkgConfig::GST_WEBRTC
 	SingleApplication::SingleApplication)
 
 if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.16.0")
@@ -606,6 +603,11 @@ target_precompile_headers(nheko
 	)
 endif()
 
+if (TARGET PkgConfig::GSTREAMER)
+	target_link_libraries(nheko PRIVATE PkgConfig::GSTREAMER)
+	target_compile_definitions(nheko PRIVATE GSTREAMER_AVAILABLE)
+endif()
+
 if(MSVC)
 	target_link_libraries(nheko PRIVATE ntdll)
 endif()
diff --git a/src/CallManager.cpp b/src/CallManager.cpp
index 7ecabde03..32b82fdff 100644
--- a/src/CallManager.cpp
+++ b/src/CallManager.cpp
@@ -201,9 +201,13 @@ CallManager::onActiveCall()
 void
 CallManager::syncEvent(const mtx::events::collections::TimelineEvents &event)
 {
+#ifdef GSTREAMER_AVAILABLE
         if (handleEvent_<CallInvite>(event) || handleEvent_<CallCandidates>(event) ||
             handleEvent_<CallAnswer>(event) || handleEvent_<CallHangUp>(event))
                 return;
+#else
+        (void)event;
+#endif
 }
 
 template<typename T>
diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp
index 9aadc1010..a33921701 100644
--- a/src/TextInputWidget.cpp
+++ b/src/TextInputWidget.cpp
@@ -453,12 +453,14 @@ TextInputWidget::TextInputWidget(QWidget *parent)
         topLayout_->setSpacing(0);
         topLayout_->setContentsMargins(13, 1, 13, 0);
 
+#ifdef GSTREAMER_AVAILABLE
         callBtn_ = new FlatButton(this);
         changeCallButtonState(WebRTCSession::State::DISCONNECTED);
         connect(&WebRTCSession::instance(),
                 &WebRTCSession::stateChanged,
                 this,
                 &TextInputWidget::changeCallButtonState);
+#endif
 
         QIcon send_file_icon;
         send_file_icon.addFile(":/icons/icons/ui/paper-clip-outline.png");
@@ -528,7 +530,9 @@ TextInputWidget::TextInputWidget(QWidget *parent)
         emojiBtn_->setIcon(emoji_icon);
         emojiBtn_->setIconSize(QSize(ButtonHeight, ButtonHeight));
 
+#ifdef GSTREAMER_AVAILABLE
         topLayout_->addWidget(callBtn_);
+#endif
         topLayout_->addWidget(sendFileBtn_);
         topLayout_->addWidget(input_);
         topLayout_->addWidget(emojiBtn_);
@@ -536,7 +540,9 @@ TextInputWidget::TextInputWidget(QWidget *parent)
 
         setLayout(topLayout_);
 
+#ifdef GSTREAMER_AVAILABLE
         connect(callBtn_, &FlatButton::clicked, this, &TextInputWidget::callButtonPress);
+#endif
         connect(sendMessageBtn_, &FlatButton::clicked, input_, &FilteredTextEdit::submit);
         connect(sendFileBtn_, SIGNAL(clicked()), this, SLOT(openFileSelection()));
         connect(input_, &FilteredTextEdit::message, this, &TextInputWidget::sendTextMessage);
diff --git a/src/WebRTCSession.cpp b/src/WebRTCSession.cpp
index 5638c6076..dd1dd61fa 100644
--- a/src/WebRTCSession.cpp
+++ b/src/WebRTCSession.cpp
@@ -3,6 +3,7 @@
 #include "Logging.h"
 #include "WebRTCSession.h"
 
+#ifdef GSTREAMER_AVAILABLE
 extern "C"
 {
 #include "gst/gst.h"
@@ -11,6 +12,7 @@ extern "C"
 #define GST_USE_UNSTABLE_API
 #include "gst/webrtc/webrtc.h"
 }
+#endif
 
 Q_DECLARE_METATYPE(WebRTCSession::State)
 
@@ -24,6 +26,7 @@ WebRTCSession::WebRTCSession()
 bool
 WebRTCSession::init(std::string *errorMessage)
 {
+#ifdef GSTREAMER_AVAILABLE
         if (initialised_)
                 return true;
 
@@ -81,10 +84,14 @@ WebRTCSession::init(std::string *errorMessage)
                         *errorMessage = strError;
         }
         return initialised_;
+#else
+        (void)errorMessage;
+        return false;
+#endif
 }
 
+#ifdef GSTREAMER_AVAILABLE
 namespace {
-
 bool isoffering_;
 std::string localsdp_;
 std::vector<mtx::events::msg::CallCandidates::Candidate> localcandidates_;
@@ -631,3 +638,62 @@ WebRTCSession::getAudioSourceNames(const std::string &defaultDevice)
         }
         return ret;
 }
+#else
+
+bool
+WebRTCSession::createOffer()
+{
+        return false;
+}
+
+bool
+WebRTCSession::acceptOffer(const std::string &)
+{
+        return false;
+}
+
+bool
+WebRTCSession::acceptAnswer(const std::string &)
+{
+        return false;
+}
+
+void
+WebRTCSession::acceptICECandidates(const std::vector<mtx::events::msg::CallCandidates::Candidate> &)
+{}
+
+bool
+WebRTCSession::startPipeline(int)
+{
+        return false;
+}
+
+bool
+WebRTCSession::createPipeline(int)
+{
+        return false;
+}
+
+bool
+WebRTCSession::toggleMuteAudioSrc(bool &)
+{
+        return false;
+}
+
+void
+WebRTCSession::end()
+{
+}
+
+void
+WebRTCSession::refreshDevices()
+{
+}
+
+std::vector<std::string>
+WebRTCSession::getAudioSourceNames(const std::string &)
+{
+        return {};
+}
+
+#endif
-- 
GitLab