From 096a1fcdc95172215767fdf1d3ee94c09b7f72ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= Date: Wed, 8 Jun 2011 19:16:13 +0200 Subject: examples: add a Qt example for setting manual IPv4 addresses into a connection --- configure.ac | 2 +- examples/C/qt/Makefile.am | 11 ++- examples/C/qt/change-ipv4-addresses.cpp | 146 ++++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+), 3 deletions(-) create mode 100644 examples/C/qt/change-ipv4-addresses.cpp diff --git a/configure.ac b/configure.ac index 74765de354..3767206192 100644 --- a/configure.ac +++ b/configure.ac @@ -268,7 +268,7 @@ AC_SUBST(GIO_LIBS) GOBJECT_INTROSPECTION_CHECK([0.9.6]) # Qt4 -PKG_CHECK_MODULES(QT, [Qt >= 4 QtCore QtDBus], [have_qt=yes],[have_qt=no]) +PKG_CHECK_MODULES(QT, [Qt >= 4 QtCore QtDBus QtNetwork], [have_qt=yes],[have_qt=no]) AC_ARG_ENABLE(qt, AS_HELP_STRING([--enable-qt], [enable Qt examples]), [enable_qt=${enableval}], [enable_qt=${have_qt}]) if (test "${enable_qt}" = "yes"); then diff --git a/examples/C/qt/Makefile.am b/examples/C/qt/Makefile.am index e1e17b3814..5f0c6a1e35 100644 --- a/examples/C/qt/Makefile.am +++ b/examples/C/qt/Makefile.am @@ -6,7 +6,8 @@ AM_CPPFLAGS = \ noinst_PROGRAMS = \ add-connection-wired \ - list-connections + list-connections \ + change-ipv4-addresses add_connection_wired_SOURCES = add-connection-wired.cpp add_connection_wired_LDADD = \ @@ -18,7 +19,13 @@ list_connections_LDADD = \ $(DBUS_LIBS) \ $(QT_LIBS) +change_ipv4_addresses_SOURCES = change-ipv4-addresses.cpp +change_ipv4_addresses_LDADD = \ + $(DBUS_LIBS) \ + $(QT_LIBS) + EXTRA_DIST = \ add-connection-wired.cpp \ - list-connections.cpp + list-connections.cpp \ + change-ipv4-addresses.cpp diff --git a/examples/C/qt/change-ipv4-addresses.cpp b/examples/C/qt/change-ipv4-addresses.cpp new file mode 100644 index 0000000000..ca340f7f71 --- /dev/null +++ b/examples/C/qt/change-ipv4-addresses.cpp @@ -0,0 +1,146 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * (C) Copyright 2011 Red Hat, Inc. + */ + +/* + * This example shows how to set manual IPv4 addresses to a connection. + * It uses Qt and D-Bus libraries to do that. + * + * Standalone compilation: + * g++ -Wall `pkg-config --libs --cflags NetworkManager QtCore QtDBus QtNetwork` change-ipv4-addresses.cpp -o change-ipv4-addresses + * + * You don't need to have NetworkManager devel package installed; you can just + * grab NetworkManager.h and put it in the path + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "arpa/inet.h" + +#include "NetworkManager.h" + +typedef QMap > Connection; +Q_DECLARE_METATYPE(Connection) +Q_DECLARE_METATYPE(QList); +Q_DECLARE_METATYPE(QList >); + +const QString NM_SETTING_CONNECTION_SETTING_NAME = "connection"; +const QString NM_SETTING_CONNECTION_ID = "id"; +const QString NM_SETTING_CONNECTION_UUID = "uuid"; + + +const QString getConnection(const QString& connectionUuid, Connection *found_connection) +{ + Connection settings; + QDBusInterface *ifaceForSettings; + + // Create a D-Bus proxy; NM_DBUS_* defined in NetworkManager.h + QDBusInterface interface( + NM_DBUS_SERVICE, + NM_DBUS_PATH_SETTINGS, + NM_DBUS_IFACE_SETTINGS, + QDBusConnection::systemBus()); + + // Get connection list and find the connection with 'connectionUuid' + QDBusReply > result1 = interface.call("ListConnections"); + + foreach (const QDBusObjectPath& connection, result1.value()) { + ifaceForSettings = new QDBusInterface( + NM_DBUS_SERVICE, + connection.path(), + NM_DBUS_IFACE_SETTINGS_CONNECTION, + QDBusConnection::systemBus()); + QDBusReply result2 = ifaceForSettings->call("GetSettings"); + delete ifaceForSettings; + + settings = result2.value(); + QVariantMap connectionSettings = settings.value(NM_SETTING_CONNECTION_SETTING_NAME); + QString uuid = connectionSettings.value(NM_SETTING_CONNECTION_UUID).toString(); + + if (uuid == connectionUuid) { + // Connection found; set the settings to found_connection + // connection object path + *found_connection = settings; + return connection.path(); + } + } + + return QString(); +} + +void changeConnection(const QString& uuid) +{ + // Register types with D-Bus + qDBusRegisterMetaType(); + qDBusRegisterMetaType >(); + qDBusRegisterMetaType > >(); + + Connection connection; + QString conPath; + + // Find connection by provided UUID + conPath = getConnection(uuid, &connection); + + if (!conPath.isEmpty()) { + QList > addresses; + QList addr1, addr2; + + // Add some addresses + addr1 << htonl(QHostAddress("192.168.100.4").toIPv4Address()) << 24 << htonl(QHostAddress("192.168.100.1").toIPv4Address()); + addr2 << htonl(QHostAddress("10.0.1.222").toIPv4Address()) << 8 << htonl(QHostAddress("10.0.1.254").toIPv4Address()); + addresses << addr1 << addr2; + + // Set method to "Manual" and put addresses to the connection map + connection["ipv4"]["method"] = "manual"; + connection["ipv4"]["addresses"] = QVariant::fromValue(addresses); + + QDBusInterface interface( + NM_DBUS_SERVICE, + conPath, + NM_DBUS_IFACE_SETTINGS_CONNECTION, + QDBusConnection::systemBus()); + + // Call Update() D-Bus method to update connection + QDBusReply result = interface.call("Update", QVariant::fromValue(connection)); + if (result.isValid()) { + qDebug() << QString("Connection successfully updated (path %1)").arg(conPath); + } else { + qDebug() << QString("Error: could not update connection: %1 %2").arg(result.error().name()).arg(result.error().message()); + } + } else { + qDebug() << QString("Error: connection with UUID '%1' not found").arg(uuid); + } +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) { + qDebug() << QString("Usage: %1 ").arg(argv[0]); + return -1; + } + + changeConnection(argv[1]); +} -- cgit v1.2.1