summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiří Klimeš <jklimes@redhat.com>2011-06-08 19:16:13 +0200
committerJiří Klimeš <jklimes@redhat.com>2011-06-08 19:18:53 +0200
commit096a1fcdc95172215767fdf1d3ee94c09b7f72ea (patch)
treee4f49845c03d318baf4be4d1a76e73b091be8d47
parent9cba854fa0a32022a44e922dd4e70aaaf3c00dd2 (diff)
downloadNetworkManager-096a1fcdc95172215767fdf1d3ee94c09b7f72ea.tar.gz
examples: add a Qt example for setting manual IPv4 addresses into a connection
-rw-r--r--configure.ac2
-rw-r--r--examples/C/qt/Makefile.am11
-rw-r--r--examples/C/qt/change-ipv4-addresses.cpp146
3 files changed, 156 insertions, 3 deletions
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 <QtDBus/QDBusConnection>
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusMetaType>
+#include <QtDBus/QDBusReply>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QDebug>
+#include <QtNetwork/QHostAddress>
+
+#include "arpa/inet.h"
+
+#include "NetworkManager.h"
+
+typedef QMap<QString, QMap<QString, QVariant> > Connection;
+Q_DECLARE_METATYPE(Connection)
+Q_DECLARE_METATYPE(QList<uint>);
+Q_DECLARE_METATYPE(QList<QList<uint> >);
+
+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<QList<QDBusObjectPath> > 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<Connection> 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<Connection>();
+ qDBusRegisterMetaType<QList<uint> >();
+ qDBusRegisterMetaType<QList<QList<uint> > >();
+
+ Connection connection;
+ QString conPath;
+
+ // Find connection by provided UUID
+ conPath = getConnection(uuid, &connection);
+
+ if (!conPath.isEmpty()) {
+ QList<QList<uint> > addresses;
+ QList<uint> 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<void> 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 <UUID>").arg(argv[0]);
+ return -1;
+ }
+
+ changeConnection(argv[1]);
+}