diff --git a/CMakeLists.txt b/CMakeLists.txt
index a7945e95..2b676ebc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,6 +117,13 @@ set(COMMON_HEADERS
${SRC_DIR}/qtutils.h
${SRC_DIR}/utilsadapter.h)
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(LIBNM libnm)
+
+if(LIBNM_FOUND)
+ add_definitions(-DUSE_LIBNM)
+endif()
+
find_package(Qt5 CONFIG REQUIRED
Core
Quick
@@ -130,7 +137,10 @@ find_package(Qt5 CONFIG REQUIRED
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
${SRC_DIR}
${LRC}/include/libringclient
- ${LRC}/include)
+ ${LRC}/include
+ ${LIBNM_INCLUDE_DIRS})
+
+link_libraries(${LIBNM_LIBRARIES})
add_executable(${PROJECT_NAME}
${SRC_DIR}/main.cpp
@@ -139,13 +149,13 @@ add_executable(${PROJECT_NAME}
${QML_RESOURCES}
${QML_RESOURCES_QML})
-# alternative: link_directories(${LRC}/lib)
find_library(ringclient ringclient ${LRC}/lib NO_DEFAULT_PATH)
find_library(qrencode qrencode)
target_link_libraries(jami-qt
${QML_LIBS}
${ringclient}
- ${qrencode})
+ ${qrencode}
+)
add_subdirectory(tests)
diff --git a/jami-qt.pro b/jami-qt.pro
index 842d0129..15cbafc3 100644
--- a/jami-qt.pro
+++ b/jami-qt.pro
@@ -105,10 +105,17 @@ unix {
LIBS += -lqrencode
LIBS += -lX11
+ CONFIG += link_pkgconfig
+ PKGCONFIG += libnm
+
isEmpty(PREFIX) { PREFIX = /tmp/$${TARGET}/bin }
target.path = $$PREFIX/bin
INSTALLS += target
+ packagesExist(libnm) {
+ DEFINES += USE_LIBNM
+ }
+
# unix specific
HEADERS += \
src/xrectsel.h
diff --git a/src/connectivitymonitor.cpp b/src/connectivitymonitor.cpp
index 014faa4f..0fffff94 100644
--- a/src/connectivitymonitor.cpp
+++ b/src/connectivitymonitor.cpp
@@ -16,10 +16,15 @@
* along with this program. If not, see .
*/
+#ifndef _WIN32
+#include
+#include
+#endif
+
#include "connectivitymonitor.h"
+#include
#ifdef Q_OS_WIN
-#include
#include
#include
@@ -158,4 +163,78 @@ ConnectivityMonitor::~ConnectivityMonitor()
destroy();
CoUninitialize();
}
+
+#else
+
+#ifdef USE_LIBNM
+static void
+logConnectionInfo(NMActiveConnection *connection)
+{
+ if (connection) {
+ qDebug() << "primary network connection:"
+ << nm_active_connection_get_uuid(connection)
+ << "default: "
+ << (nm_active_connection_get_default(connection) ? "yes" : "no");
+ } else {
+ qWarning() << "no primary network connection detected, check network settings";
+ }
+}
+
+static void
+primaryConnectionChanged(NMClient *nm, GParamSpec*, ConnectivityMonitor * cm)
+{
+ auto connection = nm_client_get_primary_connection(nm);
+ logConnectionInfo(connection);
+ cm->connectivityChanged();
+}
+
+static void
+nmClientCallback(G_GNUC_UNUSED GObject *source_object,
+ GAsyncResult *result,
+ ConnectivityMonitor * cm)
+{
+ GError* error = nullptr;
+ if (auto nm_client = nm_client_new_finish(result, &error)) {
+ qDebug() << "NetworkManager client initialized, version: "
+ << nm_client_get_version(nm_client)
+ << ", daemon running:"
+ << (nm_client_get_nm_running(nm_client) ? "yes" : "no")
+ << ", networking enabled:"
+ << (nm_client_networking_get_enabled(nm_client) ? "yes" : "no");
+
+ auto connection = nm_client_get_primary_connection(nm_client);
+ logConnectionInfo(connection);
+ g_signal_connect(nm_client, "notify::active-connections",
+ G_CALLBACK(primaryConnectionChanged), cm);
+
+ } else {
+ qWarning() << "error initializing NetworkManager client: "
+ << error->message;
+ g_clear_error(&error);
+ }
+}
+#endif
+
+ConnectivityMonitor::ConnectivityMonitor(QObject* parent)
+ : QObject(parent)
+{
+
+ GCancellable * cancellable = g_cancellable_new();
+#ifdef USE_LIBNM
+ nm_client_new_async(cancellable, (GAsyncReadyCallback)nmClientCallback, this);
+#endif
+}
+
+ConnectivityMonitor::~ConnectivityMonitor()
+{
+ qDebug() << "Destroying connectivity monitor";
+}
+
+
+bool
+ConnectivityMonitor::isOnline()
+{
+ return false;
+}
+
#endif // Q_OS_WIN
diff --git a/src/connectivitymonitor.h b/src/connectivitymonitor.h
index f746669e..11fd9fe0 100644
--- a/src/connectivitymonitor.h
+++ b/src/connectivitymonitor.h
@@ -44,20 +44,18 @@ private:
};
#else
-// Dummy implementation for non-Windows platforms.
// TODO: platform implementations should be in the daemon.
-// clang-format off
class ConnectivityMonitor final : public QObject
{
Q_OBJECT
public:
- explicit ConnectivityMonitor(QObject* parent = 0) : QObject(parent) {};
- ~ConnectivityMonitor() = default;
+ explicit ConnectivityMonitor(QObject* parent = 0);
+ ~ConnectivityMonitor();
+
+ bool isOnline();
- bool isOnline() { return false; };
signals:
void connectivityChanged();
};
-// clang-format on
#endif // Q_OS_WIN
diff --git a/src/mainapplication.cpp b/src/mainapplication.cpp
index 9739c606..6b7b365a 100644
--- a/src/mainapplication.cpp
+++ b/src/mainapplication.cpp
@@ -148,11 +148,9 @@ MainApplication::init()
initLrc(results[opts::UPDATEURL].toString(), connectivityMonitor_);
-#ifdef Q_OS_WIN
connect(connectivityMonitor_, &ConnectivityMonitor::connectivityChanged, [] {
LRCInstance::connectivityChanged();
});
-#endif // Q_OS_WIN
QObject::connect(
&LRCInstance::instance(),