diff --git a/CMakeLists.txt b/CMakeLists.txt index a7945e95a85ed3aac9df1cbc69d3e796eecc01a5..2b676ebcefaf09b418753fff9f9e41f57c89fda0 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 842d012980abdd3184c2da2137039f9b44603279..15cbafc36c5da6939e80ae3baee8401fc9974949 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 014faa4fc3dcd967c942c6523f4a28eef4493664..0fffff947dfa3abdaf8d17bb31d19baa04efb878 100644 --- a/src/connectivitymonitor.cpp +++ b/src/connectivitymonitor.cpp @@ -16,10 +16,15 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#ifndef _WIN32 +#include <glib.h> +#include <NetworkManager.h> +#endif + #include "connectivitymonitor.h" +#include <QDebug> #ifdef Q_OS_WIN -#include <QDebug> #include <atlbase.h> #include <netlistmgr.h> @@ -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 f746669e8750d59aa9f755911aa7053c3ead88a9..11fd9fe0b56920e20ccb3c59a964b6e9b0877168 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 9739c606d02e4cca8cecfa597a19f4bae9111c22..6b7b365a2283328116b9ad4893b1d544e46668e5 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(),