summaryrefslogtreecommitdiffstats
path: root/knetworkmanager-0.8/src/knetworkmanager-connection_settings_dialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'knetworkmanager-0.8/src/knetworkmanager-connection_settings_dialog.cpp')
-rw-r--r--knetworkmanager-0.8/src/knetworkmanager-connection_settings_dialog.cpp530
1 files changed, 530 insertions, 0 deletions
diff --git a/knetworkmanager-0.8/src/knetworkmanager-connection_settings_dialog.cpp b/knetworkmanager-0.8/src/knetworkmanager-connection_settings_dialog.cpp
new file mode 100644
index 0000000..97f8350
--- /dev/null
+++ b/knetworkmanager-0.8/src/knetworkmanager-connection_settings_dialog.cpp
@@ -0,0 +1,530 @@
+/***************************************************************************
+ *
+ * knetworkmanager-devicestore_dbus.cpp - A NetworkManager frontend for KDE
+ *
+ * Copyright (C) 2005, 2006 Novell, Inc.
+ *
+ * Author: Helmut Schaa <[email protected]>, <[email protected]>
+ * Author: Timothy Pearson <[email protected]>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ **************************************************************************/
+
+// qt headers
+#include <tqwidget.h>
+#include <tqcombobox.h>
+#include <tqtabwidget.h>
+#include <tqpushbutton.h>
+#include <tqwidgetstack.h>
+#include <tqapplication.h>
+#include <tqlabel.h>
+
+// kde headers
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kpushbutton.h>
+
+// TQt DBus headers
+#include <tqdbuserror.h>
+#include <tqdbusobjectpath.h>
+
+// NM headers
+#include <NetworkManager.h>
+
+// knm headers
+#include "knetworkmanager-connection_setting_widget_interface.h"
+#include "knetworkmanager-connection_setting.h"
+#include "knetworkmanager-connection_setting_info.h"
+#include "knetworkmanager-connection_setting_ipv4.h"
+#include "knetworkmanager-connection_setting_wired.h"
+#include "knetworkmanager-connection_setting_cdma.h"
+#include "knetworkmanager-connection_setting_gsm.h"
+#include "knetworkmanager-connection_setting_wireless.h"
+#include "knetworkmanager-connection_setting_wireless_security.h"
+#include "knetworkmanager-devicestore.h"
+#include "knetworkmanager-connection.h"
+#include "knetworkmanager-wired_connection.h"
+#include "knetworkmanager-wireless_connection.h"
+#include "knetworkmanager-vpn_connection.h"
+#include "knetworkmanager-connection_store.h"
+#include "knetworkmanager-connection_settings_dialog.h"
+#include "knetworkmanager-connection_setting_cdma_widget.h"
+#include "knetworkmanager-connection_setting_gsm_widget.h"
+#include "knetworkmanager-connection_setting_ppp_widget.h"
+#include "knetworkmanager-connection_setting_serial_widget.h"
+#include "knetworkmanager-connection_setting_wireless_widget.h"
+#include "knetworkmanager-connection_setting_wireless_security_widget.h"
+#include "knetworkmanager-connection_setting_ipv4_widget.h"
+#include "knetworkmanager-connection_setting_info_widget.h"
+#include "knetworkmanager-connection_setting_vpn_widget.h"
+#include "knetworkmanager-device.h"
+#include "knetworkmanager-nm_proxy.h"
+#include "knetworkmanager-storage.h"
+#include "knetworkmanager-wireless_network.h"
+#include "knetworkmanager-wireless_manager.h"
+
+#if !defined(NM_CHECK_VERSION)
+#define NM_CHECK_VERSION(x,y,z) 0
+#endif
+
+char use_new_wireless_essid = 0;
+TQByteArray new_wireless_essid;
+
+ConnectionSettingsDialogImpl::ConnectionSettingsDialogImpl(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting, TQWidget* parent, const char* name, bool modal, WFlags fl)
+ : ConnectionSettingsDialog(parent, name, modal, fl)
+ , _conn(conn)
+ , _setting(setting)
+ , _new_conn(new_conn)
+{
+ updateDialogForDeviceType();
+
+ // get notified if device combo changes
+ connect(btnConnect, TQT_SIGNAL(clicked()), this, TQT_SLOT( slotConnect()) );
+ connect(pbNext, TQT_SIGNAL(clicked()), this, TQT_SLOT( slotNext()) );
+ connect(pbBack, TQT_SIGNAL(clicked()), this, TQT_SLOT( slotBack()) );
+ connect(pbCancel, TQT_SIGNAL(clicked()), this, TQT_SLOT( slotCancel()) );
+ connect(pbSave, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotSave()) );
+
+ // nice images for the buttons
+ btnConnect->setIconSet(SmallIcon ("connect_creating", TQIconSet::Automatic));
+ pbNext->setIconSet(SmallIcon ("1rightarrow", TQIconSet::Automatic));
+ pbBack->setIconSet(SmallIcon ("1leftarrow", TQIconSet::Automatic));
+ pbCancel->setIconSet(SmallIcon("cancel", TQIconSet::Automatic));
+ pbSave->setIconSet(SmallIcon("ok", TQIconSet::Automatic));
+
+ // enable or disable buttons accroding to the current state
+ slotEnableButtons();
+}
+
+ConnectionSettingsDialogImpl::~ConnectionSettingsDialogImpl()
+{
+ kdDebug() << "ConnectionSettingsDialogImpl::~ConnectionSettingsDialogImpl" << endl;
+}
+
+TQValueList<WidgetInterface*>
+ConnectionSettingsDialogImpl::createWidgetsForWireless(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting)
+{
+ TQValueList<WidgetInterface*> ret;
+
+ // widgetlist for wireless connection
+ ret.append(new ConnectionSettings::WirelessWidgetImpl(conn, new_conn));
+ ret.append(new ConnectionSettings::WirelessSecurityWidgetImpl(conn, new_conn));
+ ret.append(new ConnectionSettings::IPv4WidgetImpl(conn));
+ ret.append(new ConnectionSettings::InfoWidgetImpl(conn));
+
+ if (ret.isEmpty())
+ {
+ // we have a problem here, NetworkManager asked for a setting we do not have
+ kdError() << k_funcinfo << "Unexpected setting requested" << endl;
+ }
+
+ return ret;
+}
+
+TQValueList<WidgetInterface*>
+ConnectionSettingsDialogImpl::createWidgetsForWirelessKnownESSID(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting, const TQByteArray& essid)
+{
+ TQValueList<WidgetInterface*> ret;
+
+ // Set ESSID
+// _wireless_setting = dynamic_cast<Wireless*> (conn->getSetting(NM_SETTING_WIRELESS_SETTING_NAME));
+// _info_setting = dynamic_cast<Info*> (conn->getSetting(NM_SETTING_CONNECTION_SETTING_NAME));
+// _wireless_setting->setEssid(essid);
+// if (!_hasName)
+// {
+// // the connection has no name yet -> just take the essid for it
+// _info_setting->setName(essid);
+// }
+
+ // widgetlist for wireless connection
+ ret.append(new ConnectionSettings::WirelessSecurityWidgetImpl(conn, new_conn));
+ ret.append(new ConnectionSettings::IPv4WidgetImpl(conn));
+ ret.append(new ConnectionSettings::InfoWidgetImpl(conn));
+
+ if (ret.isEmpty())
+ {
+ // we have a problem here, NetworkManager asked for a setting we do not have
+ kdError() << k_funcinfo << "Unexpected setting requested" << endl;
+ }
+
+ return ret;
+}
+
+TQValueList<WidgetInterface*>
+ConnectionSettingsDialogImpl::createWidgetsForWired(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting)
+{
+ TQValueList<WidgetInterface*> ret;
+
+ // widgetlist for wired connection
+ ret.append(new ConnectionSettings::IPv4WidgetImpl(conn));
+ ret.append(new ConnectionSettings::InfoWidgetImpl(conn));
+
+ return ret;
+}
+
+TQValueList<WidgetInterface*>
+ConnectionSettingsDialogImpl::createWidgetsForVPN(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting)
+{
+ TQValueList<WidgetInterface*> ret;
+
+ // widgetlist for wired connection
+ ret.append(new ConnectionSettings::VPNWidgetImpl(conn, new_conn));
+ ret.append(new ConnectionSettings::InfoWidgetImpl(conn));
+
+ return ret;
+}
+
+TQValueList<WidgetInterface*>
+ConnectionSettingsDialogImpl::createWidgetsForCDMA(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting)
+{
+ TQValueList<WidgetInterface*> ret;
+
+ // widgetlist for wired connection
+ ret.append(new ConnectionSettings::CDMAWidgetImpl(conn));
+ ret.append(new ConnectionSettings::SerialWidgetImpl(conn));
+ ret.append(new ConnectionSettings::PPPWidgetImpl(conn));
+ ret.append(new ConnectionSettings::IPv4WidgetImpl(conn));
+ ret.append(new ConnectionSettings::InfoWidgetImpl(conn));
+
+ return ret;
+}
+
+TQValueList<WidgetInterface*>
+ConnectionSettingsDialogImpl::createWidgetsForGSM(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting)
+{
+ TQValueList<WidgetInterface*> ret;
+
+ // widgetlist for wired connection
+ ret.append(new ConnectionSettings::GSMWidgetImpl(conn));
+ ret.append(new ConnectionSettings::PPPWidgetImpl(conn));
+ ret.append(new ConnectionSettings::SerialWidgetImpl(conn));
+ ret.append(new ConnectionSettings::IPv4WidgetImpl(conn));
+ ret.append(new ConnectionSettings::InfoWidgetImpl(conn));
+
+ return ret;
+}
+
+void
+ConnectionSettingsDialogImpl::createWidgetsForConnection(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting)
+{
+ /*
+ Currently two modes:
+ * dev == NULL -> Connection should be edited without the wish to start a connection
+ * dev != NULL -> A connection should be edited for connection on this device
+ */
+
+ if (!conn)
+ {
+ // TODO: create an empty widget and show an error
+ kdWarning() << k_funcinfo << "Not handled yet" << endl;
+ }
+ else
+ {
+ TQValueList<WidgetInterface*> widgets;
+ // TODO: move to a factory class
+ if (conn->getType() == NM_SETTING_WIRELESS_SETTING_NAME) {
+ if (use_new_wireless_essid == 0) {
+ widgets = createWidgetsForWireless(conn, new_conn, setting);
+ }
+ else {
+ createWidgetsForWirelessKnownESSID(conn, new_conn, setting, new_wireless_essid);
+ new_wireless_essid = NULL;
+ }
+ }
+ else if (conn->getType() == NM_SETTING_WIRED_SETTING_NAME)
+ widgets = createWidgetsForWired(conn, new_conn, setting);
+ else if (conn->getType() == NM_SETTING_CDMA_SETTING_NAME)
+ widgets = createWidgetsForCDMA(conn, new_conn, setting);
+ else if (conn->getType() == NM_SETTING_GSM_SETTING_NAME)
+ widgets = createWidgetsForGSM(conn, new_conn, setting);
+ else if (conn->getType() == NM_SETTING_VPN_SETTING_NAME)
+ widgets = createWidgetsForVPN(conn, new_conn, setting);
+ else
+ {
+ kdWarning() << k_funcinfo << "Not handled yet" << endl;
+ }
+
+ int id;
+ for (TQValueList<WidgetInterface*>::Iterator it = widgets.begin(); it != widgets.end(); ++it)
+ {
+ id = wstackSettings->addWidget(*it);
+ _widgetIds.append(id);
+ }
+
+ if (widgets.begin() != widgets.end())
+ activateWidget(*widgets.begin());
+ }
+}
+
+void
+ConnectionSettingsDialogImpl::updateDialogForDeviceType()
+{
+ // clear our tabview first
+ TQWidget *page = NULL;
+ while ( (page = wstackSettings->visibleWidget()) != NULL)
+ {
+ wstackSettings->removeWidget(page);
+ delete page;
+ }
+
+ if (_conn)
+ {
+ connect(_conn, TQT_SIGNAL(validityChanged()), this, TQT_SLOT(slotEnableButtons()));
+ createWidgetsForConnection(_conn, _new_conn, _setting);
+ }
+ else
+ {
+ // this should never happen
+ TQLabel* lbl = new TQLabel(wstackSettings, "Unknown Device Type");
+ wstackSettings->addWidget(lbl);
+
+ wstackSettings->raiseWidget(lbl);
+ }
+}
+
+int
+ConnectionSettingsDialogImpl::getDeviceTypeFromConnection(Connection* conn)
+{
+ if (conn->getType() == NM_SETTING_WIRELESS_SETTING_NAME)
+#if NM_CHECK_VERSION(0,8,992)
+ return NM_DEVICE_TYPE_WIFI;
+#else
+ return DEVICE_TYPE_802_11_WIRELESS;
+#endif
+ else if (conn->getType() == NM_SETTING_WIRED_SETTING_NAME)
+#if NM_CHECK_VERSION(0,8,992)
+ return NM_DEVICE_TYPE_ETHERNET;
+#else
+ return DEVICE_TYPE_802_3_ETHERNET;
+#endif
+ else if (conn->getType() == NM_SETTING_GSM_SETTING_NAME)
+#if NM_CHECK_VERSION(0,8,992)
+ return NM_DEVICE_TYPE_MODEM;
+#else
+ return DEVICE_TYPE_GSM;
+#endif
+ else if (conn->getType() == NM_SETTING_CDMA_SETTING_NAME)
+#if NM_CHECK_VERSION(0,8,992)
+ return NM_DEVICE_TYPE_MODEM;
+#else
+ return DEVICE_TYPE_CDMA;
+#endif
+
+#if NM_CHECK_VERSION(0,8,992)
+ return NM_DEVICE_TYPE_UNKNOWN;
+#else
+ return DEVICE_TYPE_UNKNOWN;
+#endif
+}
+
+void
+ConnectionSettingsDialogImpl::slotConnect()
+{
+ DeviceStore* dstore = DeviceStore::getInstance();
+ Device* dev = dstore->getDevices(getDeviceTypeFromConnection(_conn)).first();
+ ConnectionStore* cstore = ConnectionStore::getInstance();
+ NMProxy* nm = NMProxy::getInstance();
+ TQT_DBusError err;
+
+ // add the connection to the store
+ cstore->addConnection(_conn);
+
+ // activate device
+ if (dev && _conn && nm)
+ {
+ int id;
+ if (_conn->awaitingSecrets())
+ {
+ _conn->Connection::slotSecretsProvided(NULL);
+ }
+ else
+ {
+
+ // VPN connection needs a special specific object
+ if (_conn->getType() == NM_SETTING_VPN_SETTING_NAME)
+ {
+ TQT_DBusObjectPath act_conn = nm->getDefaultActiveConnection();
+ TQT_DBusObjectPath device = nm->getDeviceForActiveConnection(act_conn);
+#if NM_CHECK_VERSION(0,8,992)
+ nm->ActivateConnectionAsync(id, "org.freedesktop.NetworkManagerUserSettings", _conn->getObjectPath(), device, act_conn, err);
+#else
+ nm->ActivateConnectionAsync(id,NM_DBUS_SERVICE_USER_SETTINGS, _conn->getObjectPath(), device, act_conn, err);
+#endif
+ }
+ else
+ {
+ // we need to call ActivateDevice async
+#if NM_CHECK_VERSION(0,8,992)
+ nm->ActivateConnectionAsync(id, "org.freedesktop.NetworkManagerUserSettings", _conn->getObjectPath(), TQT_DBusObjectPath(QCString(dev->getObjectPath())), _conn->getObjectPath(), err);
+#else
+ nm->ActivateConnectionAsync(id, NM_DBUS_SERVICE_USER_SETTINGS, _conn->getObjectPath(), TQT_DBusObjectPath(TQCString(dev->getObjectPath())), _conn->getObjectPath(), err);
+#endif
+ }
+ }
+ }
+
+ emit connectionSaved();
+ this->close(true);
+}
+
+void
+ConnectionSettingsDialogImpl::slotSave()
+{
+ // Make sure settings are committed
+ TQValueList<int>::Iterator current = _widgetIds.find(wstackSettings->id(wstackSettings->visibleWidget()));
+ if (current != _widgetIds.fromLast())
+ {
+ WidgetInterface* widget = NULL;
+
+ // let the widget know about it being the active one
+ widget = dynamic_cast<WidgetInterface*>(wstackSettings->widget(*current));
+ if (widget)
+ deactivateWidget(widget);
+ }
+
+ // Now save
+ ConnectionStore* cstore = ConnectionStore::getInstance();
+ NMProxy* nm = NMProxy::getInstance();
+ TQT_DBusError err;
+
+ // add the connection to the store
+ cstore->addConnection(_conn);
+
+ // if the connection waits for new secrets
+ // signal an error to NM, the user only wants to save
+ // the connection
+ if (_conn->awaitingSecrets())
+ _conn->slotSecretsError();
+
+ emit connectionSaved();
+ this->close(true);
+}
+
+void
+ConnectionSettingsDialogImpl::slotCancel()
+{
+ _conn->slotSecretsError();
+ close();
+}
+
+void
+ConnectionSettingsDialogImpl::slotNext()
+{
+ TQValueList<int>::Iterator current = _widgetIds.find(wstackSettings->id(wstackSettings->visibleWidget()));
+ if (current != _widgetIds.fromLast())
+ {
+ WidgetInterface* widget = NULL;
+
+ // let the widget know about it being the active one
+ widget = dynamic_cast<WidgetInterface*>(wstackSettings->widget(*current));
+ if (widget)
+ deactivateWidget(widget);
+
+ // next widget
+ current++;
+
+ // let the widget know about it being the active one
+ widget = dynamic_cast<WidgetInterface*>(wstackSettings->widget(*current));
+ if (widget)
+ activateWidget(widget);
+ }
+ slotEnableButtons();
+}
+
+void
+ConnectionSettingsDialogImpl::slotBack()
+{
+ TQValueList<int>::Iterator current = _widgetIds.find(wstackSettings->id(wstackSettings->visibleWidget()));
+ if (current != _widgetIds.begin())
+ {
+ WidgetInterface* widget = NULL;
+
+ // let the widget know about it being the active one
+ widget = dynamic_cast<WidgetInterface*>(wstackSettings->widget(*current));
+ if (widget)
+ deactivateWidget(widget);
+
+ // one back
+ current--;
+
+ // let the widget know about it being the active one
+ widget = dynamic_cast<WidgetInterface*>(wstackSettings->widget(*current));
+ if (widget)
+ activateWidget(widget);
+ }
+ slotEnableButtons();
+}
+
+void
+ConnectionSettingsDialogImpl::activateWidget(WidgetInterface* widget)
+{
+ // allow the widget to press next
+ connect(widget, TQT_SIGNAL(next()), this, TQT_SLOT(slotNext()));
+
+ // allow the widget to do some initialization
+ widget->Activate();
+
+ // show the widget
+ wstackSettings->raiseWidget(widget);
+
+}
+
+void
+ConnectionSettingsDialogImpl::deactivateWidget(WidgetInterface* widget)
+{
+ // allow the widget to press next
+ disconnect(widget, TQT_SIGNAL(next()), this, TQT_SLOT(slotNext()));
+
+ // allow the widget to do some initialization
+ widget->Deactivate();
+}
+
+void
+ConnectionSettingsDialogImpl::slotEnableButtons()
+{
+ // enable the buttons according to the current state
+
+ TQValueList<int>::Iterator current = _widgetIds.find(wstackSettings->id(wstackSettings->visibleWidget()));
+ bool enabled;
+
+ /*
+ Next: enabled if another widget is available
+ */
+ enabled = true;
+ if (current == _widgetIds.fromLast())
+ enabled = false;
+ pbNext->setEnabled(enabled);
+
+ /*
+ Back: enabled if the current widget has a predecessor
+ */
+ enabled = true;
+ if (current == _widgetIds.begin())
+ enabled = false;
+ pbBack->setEnabled(enabled);
+
+ /*
+ Connect: only show connect if the connection is valid
+ */
+ if (_conn)
+ {
+ btnConnect->setEnabled(_conn->isValid());
+ pbSave->setEnabled(_conn->isValid());
+
+ }
+}
+
+#include "knetworkmanager-connection_settings_dialog.moc"