/*************************************************************************** * * tdenetman-devicestore_dbus.cpp - A NetworkManager frontend for TDE * * 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 // tde headers #include #include #include #include #include // tdenm headers #include "tdenetman-connection_setting_widget_interface.h" #include "tdenetman-connection_settings_dialog.h" #include "tdenetman-connection_setting_cdma_widget.h" #include "tdenetman-connection_setting_gsm_widget.h" #include "tdenetman-connection_setting_ppp_widget.h" #include "tdenetman-connection_setting_serial_widget.h" #include "tdenetman-connection_setting_wireless_widget.h" #include "tdenetman-connection_setting_wireless_security_widget.h" #include "tdenetman-connection_setting_ipv4_widget.h" #include "tdenetman-connection_setting_info_widget.h" #include "tdenetman-connection_setting_vpn_widget.h" #include "tdenetman-wireless_network.h" #include "tdenetman-wireless_manager.h" using namespace ConnectionSettings; ConnectionSettingsDialogImpl::ConnectionSettingsDialogImpl(TDENetworkConnection* conn, bool new_conn, TQByteArray networkextid, TQWidget* parent, const char* name, bool modal, WFlags fl) : ConnectionSettingsDialog(parent, name, modal, fl) , _disable_next_button(false) , _conn(conn) , _new_conn(new_conn) , _networkextid(networkextid) { 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 according to the current state slotEnableButtons(); } ConnectionSettingsDialogImpl::~ConnectionSettingsDialogImpl() { kdDebug() << "ConnectionSettingsDialogImpl::~ConnectionSettingsDialogImpl" << endl; } TQValueList ConnectionSettingsDialogImpl::createWidgetsForWireless(TDENetworkConnection* conn, bool new_conn) { TQValueList ret; // widgetlist for wireless connection ret.append(new ConnectionSettings::WirelessWidgetImpl(conn, new_conn, TQByteArray(), this)); ret.append(new ConnectionSettings::WirelessSecurityWidgetImpl(conn, new_conn, this)); ret.append(new ConnectionSettings::IPv4WidgetImpl(conn, this)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn, this)); 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(TDENetworkConnection* conn, bool new_conn, const TQByteArray& essid) { TQValueList ret; // widgetlist for wireless connection ret.append(new ConnectionSettings::WirelessWidgetImpl(conn, new_conn, essid, this)); ret.append(new ConnectionSettings::WirelessSecurityWidgetImpl(conn, new_conn, this)); ret.append(new ConnectionSettings::IPv4WidgetImpl(conn, this)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn, this)); 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(TDENetworkConnection* conn, bool new_conn) { TQValueList ret; // widgetlist for wired connection ret.append(new ConnectionSettings::IPv4WidgetImpl(conn, this)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn, this)); return ret; } TQValueList ConnectionSettingsDialogImpl::createWidgetsForVPN(TDENetworkConnection* conn, bool new_conn) { TQValueList ret; // widgetlist for virtual private connection ret.append(new ConnectionSettings::VPNWidgetImpl(conn, new_conn, this)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn, this)); return ret; } TQValueList ConnectionSettingsDialogImpl::createWidgetsForCDMA(TDENetworkConnection* conn, bool new_conn) { TQValueList ret; // widgetlist for wired connection ret.append(new ConnectionSettings::CDMAWidgetImpl(conn, this)); ret.append(new ConnectionSettings::SerialWidgetImpl(conn, this)); ret.append(new ConnectionSettings::PPPWidgetImpl(conn, this)); ret.append(new ConnectionSettings::IPv4WidgetImpl(conn, this)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn, this)); return ret; } TQValueList ConnectionSettingsDialogImpl::createWidgetsForGSM(TDENetworkConnection* conn, bool new_conn) { TQValueList ret; // widgetlist for wired connection ret.append(new ConnectionSettings::GSMWidgetImpl(conn, this)); ret.append(new ConnectionSettings::PPPWidgetImpl(conn, this)); ret.append(new ConnectionSettings::SerialWidgetImpl(conn, this)); ret.append(new ConnectionSettings::IPv4WidgetImpl(conn, this)); ret.append(new ConnectionSettings::InfoWidgetImpl(conn, this)); return ret; } void ConnectionSettingsDialogImpl::createWidgetsForConnection(TDENetworkConnection* conn, bool new_conn) { /* 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->type() == TDENetworkConnectionType::WiFi) { if (_networkextid.isNull()) { widgets = createWidgetsForWireless(conn, new_conn); } else { widgets = createWidgetsForWirelessKnownESSID(conn, new_conn, _networkextid); } } else if (conn->type() == TDENetworkConnectionType::WiredEthernet) { widgets = createWidgetsForWired(conn, new_conn); } else if (conn->type() == TDENetworkConnectionType::Modem) { TDEModemConnection* modemconn = dynamic_cast(conn); if (modemconn) { if (modemconn->type == TDEModemConnectionType::CDMA) { widgets = createWidgetsForCDMA(conn, new_conn); } else if (modemconn->type == TDEModemConnectionType::GSM) { widgets = createWidgetsForGSM(conn, new_conn); } else { kdWarning() << k_funcinfo << "Specific modem type not handled yet" << endl; } } } else if (conn->type() == TDENetworkConnectionType::VPN) { widgets = createWidgetsForVPN(conn, new_conn); } 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) { createWidgetsForConnection(_conn, _new_conn); } else { // this should never happen TQLabel* lbl = new TQLabel(wstackSettings, "Unknown Device Type"); wstackSettings->addWidget(lbl); wstackSettings->raiseWidget(lbl); } } int ConnectionSettingsDialogImpl::getDeviceTypeFromConnection(TDENetworkConnection* conn) { if (conn->type() == TDENetworkConnectionType::WiFi) { return TDENetworkDeviceType::WiFi; } else if (conn->type() == TDENetworkConnectionType::WiredEthernet) { return TDENetworkDeviceType::WiredEthernet; } else if (conn->type() == TDENetworkConnectionType::Modem) { return TDENetworkDeviceType::Modem; } return TDENetworkDeviceType::Other; } void ConnectionSettingsDialogImpl::slotConnect() { TDEGlobalNetworkManager* nm = TDEGlobal::networkManager(); // add/save the connection if (nm && nm->saveConnection(_conn)) { // activate device if (_conn) { // // 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); // nm->ActivateConnectionAsync(id, "org.freedesktop.NetworkManagerUserSettings", _conn->getObjectPath(), device, act_conn, err); // } // else { // we need to call ActivateDevice async nm->initiateConnection(_conn->UUID); // } } } else { KMessageBox::error(this, i18n("Unable to save network connection!

Potential causes:
* Insufficient permissions
* NetworkManager not running
* DBUS failure"), i18n("Unable to perform requested operation")); } 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); } } TDEGlobalNetworkManager* nm = TDEGlobal::networkManager(); // save the connection if (!nm || !nm->saveConnection(_conn)) { KMessageBox::error(this, i18n("Unable to save network connection!

Potential causes:
* Insufficient permissions
* NetworkManager not running
* DBUS failure"), i18n("Unable to perform requested operation")); } emit connectionSaved(); this->close(true); } void ConnectionSettingsDialogImpl::slotCancel() { 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() || _disable_next_button) { 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) { TDEGlobalNetworkManager* nm = TDEGlobal::networkManager(); TDENetworkErrorStringMap errorStringMap; TDENetworkConnectionErrorFlags::TDENetworkConnectionErrorFlags errorFlags; bool ret; ret = (nm ? nm->verifyConnectionSettings(_conn, &errorFlags, &errorStringMap) : 0); btnConnect->setEnabled(ret); if (!ret) { // FIXME // Check the error flags and the current dialog type to determine if an error message is warranted // KMessageBox::error(this, errorString, i18n("Invalid Settings Detected")); } pbSave->setEnabled(nm ? nm->verifyConnectionSettings(_conn) : 0); } } #include "tdenetman-connection_settings_dialog.moc"