/*************************************************************************** * * knetworkmanager-devicestore_dbus.cpp - A NetworkManager frontend for KDE * * Copyright (C) 2005, 2006 Novell, Inc. * * Author: Helmut Schaa , * Author: Timothy Pearson * * 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 #include #include #include #include #include #include // kde headers #include #include #include // TQt DBus headers #include #include // NM headers #include // 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 ConnectionSettingsDialogImpl::createWidgetsForWireless(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting) { TQValueList 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 ConnectionSettingsDialogImpl::createWidgetsForWirelessKnownESSID(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting, const TQByteArray& essid) { TQValueList ret; // Set ESSID // _wireless_setting = dynamic_cast (conn->getSetting(NM_SETTING_WIRELESS_SETTING_NAME)); // _info_setting = dynamic_cast (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 ConnectionSettingsDialogImpl::createWidgetsForWired(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting) { TQValueList ret; // widgetlist for wired connection ret.append(new ConnectionSettings::IPv4WidgetImpl(conn)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn)); return ret; } TQValueList ConnectionSettingsDialogImpl::createWidgetsForVPN(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting) { TQValueList ret; // widgetlist for wired connection ret.append(new ConnectionSettings::VPNWidgetImpl(conn, new_conn)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn)); return ret; } TQValueList ConnectionSettingsDialogImpl::createWidgetsForCDMA(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting) { TQValueList 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 ConnectionSettingsDialogImpl::createWidgetsForGSM(ConnectionSettings::Connection* conn, bool new_conn, ConnectionSettings::ConnectionSetting* setting) { TQValueList 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 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::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::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(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::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(wstackSettings->widget(*current)); if (widget) deactivateWidget(widget); // next widget current++; // let the widget know about it being the active one widget = dynamic_cast(wstackSettings->widget(*current)); if (widget) activateWidget(widget); } slotEnableButtons(); } void ConnectionSettingsDialogImpl::slotBack() { TQValueList::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(wstackSettings->widget(*current)); if (widget) deactivateWidget(widget); // one back current--; // let the widget know about it being the active one widget = dynamic_cast(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::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"