/*************************************************************************** * * knetworkmanager-devicestore_dbus.cpp - A NetworkManager frontend for KDE * * Copyright (C) 2005, 2006 Novell, Inc. * * Author: Timo Hoenig , * Valentine Sinitsyn * * 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 * **************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "knetworkmanager-connection.h" #include "knetworkmanager-connection_setting_widget_interface.h" #include "knetworkmanager-connection_setting_wireless_widget.h" #include "knetworkmanager-connection_setting_wireless.h" #include "knetworkmanager-connection_setting_wireless_security.h" #include "knetworkmanager-connection_setting_info.h" #include "knetworkmanager-wireless_network.h" #include "knetworkmanager-wireless_manager.h" using namespace ConnectionSettings; class NetworkListViewItem : public KListViewItem { public: NetworkListViewItem(TQListView* parent, WirelessNetwork& net) : KListViewItem(parent, TQString::fromUtf8(net.getDisplaySsid()), TQString("%1\%").arg(net.getStrength())) , _net(net) { TQ_UINT8 strength = net.getStrength(); if (strength > 80) setPixmap(1, TDEGlobal::iconLoader()->loadIcon("nm_signal_100", KIcon::Small)); else if (strength > 55) setPixmap(1, TDEGlobal::iconLoader()->loadIcon("nm_signal_75", KIcon::Small)); else if (strength > 30) setPixmap(1, TDEGlobal::iconLoader()->loadIcon("nm_signal_50", KIcon::Small)); else if (strength > 5) setPixmap(1, TDEGlobal::iconLoader()->loadIcon("nm_signal_25", KIcon::Small)); else setPixmap(1, TDEGlobal::iconLoader()->loadIcon("nm_signal_00", KIcon::Small)); if (net.isEncrypted()) setPixmap(2, TDEGlobal::iconLoader()->loadIcon("lock", KIcon::Small)); } WirelessNetwork _net; }; WirelessWidgetImpl::WirelessWidgetImpl(Connection* conn, bool new_conn, TQWidget* parent, const char* name, WFlags fl) : WidgetInterface(parent, name, fl) { _wireless_setting = dynamic_cast (conn->getSetting(NM_SETTING_WIRELESS_SETTING_NAME)); _info_setting = dynamic_cast (conn->getSetting(NM_SETTING_CONNECTION_SETTING_NAME)); _security_setting = dynamic_cast (conn->getSetting(NM_SETTING_WIRELESS_SECURITY_SETTING_NAME)); _hasName = !_info_setting->getName().isEmpty(); _new_conn = new_conn; TQVBoxLayout* layout = new TQVBoxLayout(this, 1, 1); _mainWid = new ConnectionSettingWirelessWidget(this); layout->addWidget(_mainWid); // FIXME hide this button until it is implemented _mainWid->pbExpert->hide(); Init(); } void WirelessWidgetImpl::Init() { TQVBoxLayout* layout = new TQVBoxLayout(_mainWid->framePlaceholder, 1, 1); _searchLine = new KListViewSearchLineWidget(_mainWid->lvEssids, _mainWid->framePlaceholder); layout->addWidget(_searchLine); connect(_mainWid->txtEssid, TQT_SIGNAL(textChanged(const TQString&)), this, TQT_SLOT(slotEssidChanged(const TQString&))); connect(_mainWid->lvEssids, TQT_SIGNAL(doubleClicked(TQListViewItem*, const TQPoint&, int)), this, TQT_SLOT(slotEssidDoubleClicked(TQListViewItem*, const TQPoint&, int)) ); connect(_mainWid->lvEssids, TQT_SIGNAL(selectionChanged(TQListViewItem*)), this, TQT_SLOT(slotEssidChanged(TQListViewItem*))); if (!_new_conn) { _mainWid->chkAutoRefresh->hide(); _mainWid->lvEssids->hide(); _searchLine->hide(); } } void WirelessWidgetImpl::Activate() { // Fill in all available networks from all devices // get all aps from all devices grouped together using the ssid TQValueList nets = WirelessManager::getWirelessNetworks(0, WirelessNetwork::MATCH_SSID); _mainWid->lvEssids->clear(); for (TQValueList::Iterator it = nets.begin(); it != nets.end(); ++it) { KListViewItem* item = new NetworkListViewItem(_mainWid->lvEssids, (*it)); _mainWid->lvEssids->insertItem(item); } // FIXME, if essid contains unprintable characters show the essid in hex _mainWid->txtEssid->setText(_wireless_setting->getEssid()); } void WirelessWidgetImpl::slotEssidChanged(TQListViewItem* item) { NetworkListViewItem* net_item = dynamic_cast(item); if (net_item) { // update the settingsobject updateEssid(net_item->_net.getSsid()); // update the textbox to match the selected essid _mainWid->txtEssid->setText(net_item->_net.getDisplaySsid()); } } void WirelessWidgetImpl::slotEssidDoubleClicked(TQListViewItem* item, const TQPoint& /*p*/, int /*i*/) { NetworkListViewItem* net_item = dynamic_cast(item); if (net_item) { updateEssid(net_item->_net.getSsid()); // essid selected with double click -> goto the next setting emit next(); } } void WirelessWidgetImpl::slotEssidChanged(const TQString& new_essid) { /* set the newly entered essid */ /* FIXME perhaps local8Bit is better? */ /* FIXME allow entering essid in hex */ /* FIXME select the appropriate essid in the list too */ TQByteArray essid(new_essid.utf8()); // remove trailing \0 essid.resize(essid.size() - 1); updateEssid(essid); } void WirelessWidgetImpl::updateEssid(const TQByteArray& essid) { _wireless_setting->setEssid(essid); if (!_hasName) { // the connection has no name yet -> just take the essid for it _info_setting->setName(essid); } } TQByteArray WirelessWidgetImpl::byteArrayFromHexString(const TQCString& str) { char c[2]; TQByteArray arr(str.length() - 1); TQTextStream stream(str, IO_ReadOnly); stream.setf(TQTextStream::hex); stream.setf(TQTextStream::left); stream.width(2); stream.fill('0'); // 0x stream.readRawBytes(c, 2); for (uint i = 0; i < (str.length()-1)/2; ++i) { stream.readRawBytes(c, 2); TQString hex; hex += "0x"; hex += c[0]; hex += c[1]; arr[i] = (unsigned char)hex.toShort(); } return arr; } TQString WirelessWidgetImpl::hexStringFromByteArray(const TQByteArray& bytes) { TQString tmp; TQTextStream stream(&tmp, IO_ReadWrite); stream.setf(TQTextStream::hex); stream.setf(TQTextStream::left); stream.width(2); stream.fill('0'); stream << "0x" ; for (uint i = 0; i < bytes.size(); ++i) { stream << static_cast(bytes[i]); } return tmp; } #include "knetworkmanager-connection_setting_wireless_widget.moc"