-rw-r--r-- | noncore/net/opietooth/manager/bluebase.cpp | 654 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/bluebase.h | 1 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/bticonloader.cpp | 2 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/devicehandler.cpp | 87 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/devicehandler.h | 41 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/hciconfwrapper.cpp | 74 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/hciconfwrapper.h | 4 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/manager.pro | 17 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/popuphelper.cpp | 4 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/scandialog.cpp | 37 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/scandialog.h | 8 |
11 files changed, 568 insertions, 361 deletions
diff --git a/noncore/net/opietooth/manager/bluebase.cpp b/noncore/net/opietooth/manager/bluebase.cpp index 3f2f138..598ce16 100644 --- a/noncore/net/opietooth/manager/bluebase.cpp +++ b/noncore/net/opietooth/manager/bluebase.cpp @@ -6,297 +6,293 @@ * email : max.reiss@gmx.de * */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "bluebase.h" #include "scandialog.h" #include "hciconfwrapper.h" +#include <stdlib.h> + #include <qframe.h> #include <qlabel.h> #include <qpushbutton.h> #include <qlayout.h> #include <qvariant.h> #include <qwhatsthis.h> #include <qimage.h> #include <qpixmap.h> #include <qtabwidget.h> #include <qscrollview.h> #include <qvbox.h> #include <qmessagebox.h> #include <qcheckbox.h> #include <qlineedit.h> #include <qlistview.h> #include <qdir.h> #include <qpopupmenu.h> #include <qtimer.h> #include <qpe/resource.h> #include <qpe/config.h> #include <remotedevice.h> #include <services.h> +#include "devicehandler.h" #include "btconnectionitem.h" using namespace OpieTooth; - BlueBase::BlueBase( QWidget* parent, const char* name, WFlags fl ) - : BluetoothBase( parent, name, fl ) { - - m_localDevice = new Manager( "hci0" ); - - connect( PushButton2, SIGNAL( clicked() ), this, SLOT(startScan() ) ); - connect( configApplyButton, SIGNAL(clicked() ), this, SLOT(applyConfigChanges() ) ); - // not good since lib is async - // connect( ListView2, SIGNAL( expanded ( QListViewItem* ) ), - // this, SLOT( addServicesToDevice( QListViewItem * ) ) ); - connect( ListView2, SIGNAL( clicked( QListViewItem* )), - this, SLOT( startServiceActionClicked( QListViewItem* ) ) ); - connect( ListView2, SIGNAL( rightButtonClicked( QListViewItem *, const QPoint &, int ) ), - this, SLOT(startServiceActionHold( QListViewItem *, const QPoint &, int) ) ); - connect( m_localDevice , SIGNAL( foundServices( const QString& , Services::ValueList ) ), - this, SLOT( addServicesToDevice( const QString& , Services::ValueList ) ) ); - connect( m_localDevice, SIGNAL( available( const QString&, bool ) ), - this, SLOT( deviceActive( const QString& , bool ) ) ); - connect( m_localDevice, SIGNAL( connections( Connection::ValueList ) ), - this, SLOT( addConnectedDevices( Connection::ValueList ) ) ); - - //Load all icons needed - m_offPix = Resource::loadPixmap( "editdelete" ); - m_onPix = Resource::loadPixmap( "installed" ); - - QPalette pal = this->palette(); - QColor col = pal.color( QPalette::Active, QColorGroup::Background ); - pal.setColor( QPalette::Active, QColorGroup::Button, col ); - pal.setColor( QPalette::Inactive, QColorGroup::Button, col ); - pal.setColor( QPalette::Normal, QColorGroup::Button, col ); - pal.setColor( QPalette::Disabled, QColorGroup::Button, col ); - this->setPalette( pal ); - - setCaption( tr( "Bluetooth Manager" ) ); - - readConfig(); - initGui(); - - //TESTING - ListView2->setRootIsDecorated(true); - - BTDeviceItem *topLV2 = new BTDeviceItem( ListView2, RemoteDevice("xx:", "Siemens S45" ) ); - topLV2->setPixmap( 1, m_onPix ); - Services s1; - s1.setServiceName( "Serial" ); - s1.insertClassId(1, "BlueNic"); - (void) new BTServiceItem( topLV2, s1 ); - s1.setServiceName( "BlueNic" ); - s1.insertClassId(2, "Obex"); - (void) new BTServiceItem( topLV2, s1 ); - - writeToHciConfig(); - // search conncetions - addConnectedDevices(); - m_iconLoader = new BTIconLoader(); - } - - /** - * Reads all options from the config file - */ - void BlueBase::readConfig() { - - Config cfg( "bluetoothmanager" ); - cfg.setGroup( "bluezsettings" ); - - m_deviceName = cfg.readEntry( "name" , "No name" ); // name the device should identify with - m_defaultPasskey = cfg.readEntryCrypt( "passkey" , "" ); // <- hmm, look up how good the trolls did that, maybe too weak - m_useEncryption = cfg.readBoolEntry( "useEncryption" , TRUE ); - m_enableAuthentification = cfg.readBoolEntry( "enableAuthentification" , TRUE ); - m_enablePagescan = cfg.readBoolEntry( "enablePagescan" , TRUE ); - m_enableInquiryscan = cfg.readBoolEntry( "enableInquiryscan" , TRUE ); - } +BlueBase::BlueBase( QWidget* parent, const char* name, WFlags fl ) + : BluetoothBase( parent, name, fl ) { + + m_localDevice = new Manager( "hci0" ); + + connect( PushButton2, SIGNAL( clicked() ), this, SLOT(startScan() ) ); + connect( configApplyButton, SIGNAL(clicked() ), this, SLOT(applyConfigChanges() ) ); + // not good since lib is async + // connect( ListView2, SIGNAL( expanded ( QListViewItem* ) ), + // this, SLOT( addServicesToDevice( QListViewItem * ) ) ); + connect( ListView2, SIGNAL( clicked( QListViewItem* )), + this, SLOT( startServiceActionClicked( QListViewItem* ) ) ); + connect( ListView2, SIGNAL( rightButtonClicked( QListViewItem *, const QPoint &, int ) ), + this, SLOT(startServiceActionHold( QListViewItem *, const QPoint &, int) ) ); + connect( m_localDevice , SIGNAL( foundServices( const QString& , Services::ValueList ) ), + this, SLOT( addServicesToDevice( const QString& , Services::ValueList ) ) ); + connect( m_localDevice, SIGNAL( available( const QString&, bool ) ), + this, SLOT( deviceActive( const QString& , bool ) ) ); + connect( m_localDevice, SIGNAL( connections( ConnectionState::ValueList ) ), + this, SLOT( addConnectedDevices( ConnectionState::ValueList ) ) ); + + //Load all icons needed + m_offPix = Resource::loadPixmap( "editdelete" ); + m_onPix = Resource::loadPixmap( "installed" ); + + QPalette pal = this->palette(); + QColor col = pal.color( QPalette::Active, QColorGroup::Background ); + pal.setColor( QPalette::Active, QColorGroup::Button, col ); + pal.setColor( QPalette::Inactive, QColorGroup::Button, col ); + pal.setColor( QPalette::Normal, QColorGroup::Button, col ); + pal.setColor( QPalette::Disabled, QColorGroup::Button, col ); + this->setPalette( pal ); + + setCaption( tr( "Bluetooth Manager" ) ); + + readConfig(); + initGui(); + + //TESTING + ListView2->setRootIsDecorated(true); + + BTDeviceItem *topLV2 = new BTDeviceItem( ListView2, RemoteDevice("xx:", "Siemens S45" ) ); + topLV2->setPixmap( 1, m_onPix ); + Services s1; + s1.setServiceName( "Serial" ); + s1.insertClassId(1, "BlueNic"); + (void) new BTServiceItem( topLV2, s1 ); + s1.setServiceName( "BlueNic" ); + s1.insertClassId(2, "Obex"); + (void) new BTServiceItem( topLV2, s1 ); + + writeToHciConfig(); + // search conncetions + addConnectedDevices(); + m_iconLoader = new BTIconLoader(); + readSavedDevices(); +} - /** - * Writes all options to the config file - */ - void BlueBase::writeConfig() { +/** + * Reads all options from the config file + */ +void BlueBase::readConfig() { - Config cfg( "bluetoothmanager" ); - cfg.setGroup( "bluezsettings" ); + Config cfg( "bluetoothmanager" ); + cfg.setGroup( "bluezsettings" ); - cfg.writeEntry( "name" , m_deviceName ); - cfg.writeEntryCrypt( "passkey" , m_defaultPasskey ); - cfg.writeEntry( "useEncryption" , m_useEncryption ); - cfg.writeEntry( "enableAuthentification" , m_enableAuthentification ); - cfg.writeEntry( "enablePagescan" , m_enablePagescan ); - cfg.writeEntry( "enableInquiryscan" , m_enableInquiryscan ); + m_deviceName = cfg.readEntry( "name" , "No name" ); // name the device should identify with + m_defaultPasskey = cfg.readEntryCrypt( "passkey" , "" ); // <- hmm, look up how good the trolls did that, maybe too weak + m_useEncryption = cfg.readBoolEntry( "useEncryption" , TRUE ); + m_enableAuthentification = cfg.readBoolEntry( "enableAuthentification" , TRUE ); + m_enablePagescan = cfg.readBoolEntry( "enablePagescan" , TRUE ); + m_enableInquiryscan = cfg.readBoolEntry( "enableInquiryscan" , TRUE ); +} - writeToHciConfig(); - } +/** + * Writes all options to the config file + */ +void BlueBase::writeConfig() { - void BlueBase::writeToHciConfig() { + Config cfg( "bluetoothmanager" ); + cfg.setGroup( "bluezsettings" ); - HciConfWrapper hciconf ( "/tmp/hcid.conf" ); - hciconf.setPinHelper( "/bin/QtPalmtop/bin/blue-pin" ); + cfg.writeEntry( "name" , m_deviceName ); + cfg.writeEntryCrypt( "passkey" , m_defaultPasskey ); + cfg.writeEntry( "useEncryption" , m_useEncryption ); + cfg.writeEntry( "enableAuthentification" , m_enableAuthentification ); + cfg.writeEntry( "enablePagescan" , m_enablePagescan ); + cfg.writeEntry( "enableInquiryscan" , m_enableInquiryscan ); + writeToHciConfig(); +} - // hciconf->setPinHelper( "/bin/QtPalmtop/bin/blue-pin" ); +void BlueBase::writeToHciConfig() { + qWarning("writeToHciConfig"); + HciConfWrapper hciconf ( "/etc/bluetooth/hcid.conf" ); + hciconf.load(); + hciconf.setPinHelper( "/bin/QtPalmtop/bin/blue-pin" ); - hciconf.setName( m_deviceName ); - hciconf.setEncrypt( m_useEncryption ); - hciconf.setAuth( m_enableAuthentification ); - hciconf.setPscan( m_enablePagescan ); - hciconf.setIscan( m_enableInquiryscan ); - } + // hciconf->setPinHelper( "/bin/QtPalmtop/bin/blue-pin" ); - /** - * Read the list of allready known devices - * - */ - void BlueBase::readSavedDevices() { + hciconf.setName( m_deviceName ); + hciconf.setEncrypt( m_useEncryption ); + hciconf.setAuth( m_enableAuthentification ); + hciconf.setPscan( m_enablePagescan ); + hciconf.setIscan( m_enableInquiryscan ); + hciconf.save(); +} - QValueList<RemoteDevice> loadedDevices; - QDir deviceListSave( QDir::homeDirPath() + "/Settings/bluetooth/"); - // list of .conf files - QStringList devicesFileList = deviceListSave.entryList(); +/** + * Read the list of allready known devices + * + */ +void BlueBase::readSavedDevices() { - // cut .conf of to get the mac and also read the name entry in it. + QValueList<RemoteDevice> loadedDevices; + DeviceHandler handler; + loadedDevices = handler.load(); - for ( QStringList::Iterator it = devicesFileList.begin(); it != devicesFileList.end(); ++it ) { + addSearchedDevices( loadedDevices ); +} - QString name; - QString mac; - qDebug((*it).latin1() ); - Config conf((*it)); - conf.setGroup("Info"); - name = conf.readEntry("name", "Error"); - qDebug("MAC: " + mac); - qDebug("NAME: " + name); - RemoteDevice currentDevice( mac , name ); - loadedDevices.append( currentDevice ); - } - addSearchedDevices( loadedDevices ); +/** + * Write the list of allready known devices + * + */ +void BlueBase::writeSavedDevices() { + QListViewItemIterator it( ListView2 ); + BTListItem* item; + BTDeviceItem* device; + RemoteDevice::ValueList list; + for ( ; it.current(); ++it ) { + item = (BTListItem*)it.current(); + if(item->typeId() != BTListItem::Device ) + continue; + device = (BTDeviceItem*)item; + + list.append( device->remoteDevice() ); } - - /** - * Write the list of allready known devices - * + /* + * if not empty save the List through DeviceHandler */ - void BlueBase::writeSavedDevices() { - QListViewItemIterator it( ListView2 ); - BTListItem* item; - BTDeviceItem* device; - - for ( ; it.current(); ++it ) { - item = (BTListItem*)it.current(); - if(item->typeId() != BTListItem::Device ) - continue; - device = (BTDeviceItem*)item; - // seperate config file for each device, to store more information in future. - qDebug( "/Settings/bluetooth/" + device->mac() + ".conf"); - Config conf( QDir::homeDirPath() + "/Settings/bluetooth/" + device->mac() + ".conf", Config::File ); - conf.setGroup( "Info" ); - conf.writeEntry( "name", device->name() ); - } - } + if ( list.isEmpty() ) + return; + DeviceHandler handler; + handler.save( list ); +} - /** - * Set up the gui - */ - void BlueBase::initGui() { - StatusLabel->setText( status() ); // maybe move it to getStatus() - cryptCheckBox->setChecked( m_useEncryption ); - authCheckBox->setChecked( m_enableAuthentification ); - pagescanCheckBox->setChecked( m_enablePagescan ); - inquiryscanCheckBox->setChecked( m_enableInquiryscan ); - deviceNameLine->setText( m_deviceName ); - passkeyLine->setText( m_defaultPasskey ); - // set info tab - setInfo(); - } +/** + * Set up the gui + */ +void BlueBase::initGui() { + StatusLabel->setText( status() ); // maybe move it to getStatus() + cryptCheckBox->setChecked( m_useEncryption ); + authCheckBox->setChecked( m_enableAuthentification ); + pagescanCheckBox->setChecked( m_enablePagescan ); + inquiryscanCheckBox->setChecked( m_enableInquiryscan ); + deviceNameLine->setText( m_deviceName ); + passkeyLine->setText( m_defaultPasskey ); + // set info tab + setInfo(); +} - /** - * Get the status informations and returns it - * @return QString the status informations gathered - */ - QString BlueBase::status()const{ - QString infoString = tr( "<b>Device name : </b> Ipaq" ); - infoString += QString( "<br><b>" + tr( "MAC adress: " ) +"</b> No idea" ); - infoString += QString( "<br><b>" + tr( "Class" ) + "</b> PDA" ); +/** + * Get the status informations and returns it + * @return QString the status informations gathered + */ +QString BlueBase::status()const{ + QString infoString = tr( "<b>Device name : </b> Ipaq" ); + infoString += QString( "<br><b>" + tr( "MAC adress: " ) +"</b> No idea" ); + infoString += QString( "<br><b>" + tr( "Class" ) + "</b> PDA" ); - return (infoString); - } + return (infoString); +} - /** - * Read the current values from the gui and invoke writeConfig() - */ - void BlueBase::applyConfigChanges() { - m_deviceName = deviceNameLine->text(); - m_defaultPasskey = passkeyLine->text(); - m_useEncryption = cryptCheckBox->isChecked(); - m_enableAuthentification = authCheckBox->isChecked(); - m_enablePagescan = pagescanCheckBox->isChecked(); - m_enableInquiryscan = inquiryscanCheckBox->isChecked(); +/** + * Read the current values from the gui and invoke writeConfig() + */ +void BlueBase::applyConfigChanges() { + m_deviceName = deviceNameLine->text(); + m_defaultPasskey = passkeyLine->text(); + m_useEncryption = cryptCheckBox->isChecked(); + m_enableAuthentification = authCheckBox->isChecked(); + m_enablePagescan = pagescanCheckBox->isChecked(); + m_enableInquiryscan = inquiryscanCheckBox->isChecked(); - writeConfig(); + writeConfig(); - QMessageBox::information( this, tr("Test") , tr("Changes were applied.") ); - } + QMessageBox::information( this, tr("Test") , tr("Changes were applied.") ); +} - /** - * Add fresh found devices from scan dialog to the listing - * - */ - void BlueBase::addSearchedDevices( const QValueList<RemoteDevice> &newDevices ) { - BTDeviceItem * deviceItem; - QValueList<RemoteDevice>::ConstIterator it; +/** + * Add fresh found devices from scan dialog to the listing + * + */ +void BlueBase::addSearchedDevices( const QValueList<RemoteDevice> &newDevices ) { + BTDeviceItem * deviceItem; + QValueList<RemoteDevice>::ConstIterator it; - for( it = newDevices.begin(); it != newDevices.end() ; ++it ) { + for( it = newDevices.begin(); it != newDevices.end() ; ++it ) { - deviceItem = new BTDeviceItem( ListView2 , (*it) ); - deviceItem->setExpandable ( true ); + if (find( (*it) )) // is already inserted + continue; - // look if device is avail. atm, async - deviceActive( (*it) ); + deviceItem = new BTDeviceItem( ListView2 , (*it) ); + deviceItem->setExpandable ( true ); - // ggf auch hier? - addServicesToDevice( deviceItem ); - } + // look if device is avail. atm, async + deviceActive( (*it) ); + + // ggf auch hier? + addServicesToDevice( deviceItem ); } +} - /** - * Action that is toggled on entrys on click - */ +/** + * Action that is toggled on entrys on click + */ void BlueBase::startServiceActionClicked( QListViewItem */*item*/ ) { } - /** - * Action that are toggled on hold (mostly QPopups i guess) - */ +/** + * Action that are toggled on hold (mostly QPopups i guess) + */ void BlueBase::startServiceActionHold( QListViewItem * item, const QPoint & point, int /*column*/ ) { QPopupMenu *menu = new QPopupMenu(); int ret=0; if ( ((BTListItem*)item)->type() == "device") { QPopupMenu *groups = new QPopupMenu(); menu->insertItem( tr("rescan sevices:"), 0); menu->insertItem( tr("to group"), groups , 1); menu->insertItem( tr("bound device"), 2); menu->insertItem( tr("delete"), 3); ret = menu->exec( point , 0); @@ -320,193 +316,219 @@ void BlueBase::startServiceActionHold( QListViewItem * item, const QPoint & poin /** * We got service sensitive PopupMenus in our factory * We will create one through the factory and will insert * our Separator + ShowInfo into the menu or create a new * one if the factory returns 0 * PopupMenu deletion is kind of weird. * If escaped( -1 ) or any of our items were chosen we'll * delete the PopupMenu otherwise it's the responsibility of * the PopupMenu to delete itself * */ else if ( ((BTListItem*)item)->type() == "service") { BTServiceItem* service = (BTServiceItem*)item; QMap<int, QString> list = service->services().classIdList(); QMap<int, QString>::Iterator it = list.begin(); QPopupMenu *popup =0l; - if ( it != list.end() ) + if ( it != list.end() ) { + qWarning("Searching id %d %s", it.key(), it.data().latin1() ); popup = m_popHelper.find( it.key(), service->services(), service->parent() ); + }else { + qWarning("Empty"); + } if ( popup == 0l ) { qWarning("factory returned 0l"); popup = new QPopupMenu(); } int test1 = popup->insertItem( tr("Test1:"), 0); int con = popup->insertItem( tr("connect"), 1); int del = popup->insertItem( tr("delete"), 2); ret = popup->exec( point ); if ( ret == -1 ) delete popup; else if ( ret == test1 ) delete popup; else if ( ret == con ) delete popup; else if ( ret == del ) { // take item first? -zecke delete item; } } delete menu; } /** * Search and display avail. services for a device (on expand from device listing) * */ - void BlueBase::addServicesToDevice( BTDeviceItem * item ) { - qDebug("addServicesToDevice"); - // row of mac adress text(3) - RemoteDevice device = item->remoteDevice(); - m_deviceList.insert( item->mac() , item ); - // and some time later I get a signal foundServices( const QString& device, Services::ValueList ); back - m_localDevice->searchServices( device ); - } +void BlueBase::addServicesToDevice( BTDeviceItem * item ) { + qDebug("addServicesToDevice"); + // row of mac adress text(3) + RemoteDevice device = item->remoteDevice(); + m_deviceList.insert( item->mac() , item ); + // and some time later I get a signal foundServices( const QString& device, Services::ValueList ); back + m_localDevice->searchServices( device ); +} - /** - * Overloaded. This one it the one that is connected to the foundServices signal - * @param device the mac address of the remote device - * @param servicesList the list with the service the device has. - */ - void BlueBase::addServicesToDevice( const QString& device, Services::ValueList servicesList ) { - qDebug("fill services list"); - - QMap<QString,BTDeviceItem*>::Iterator it; - BTDeviceItem* deviceItem = 0; - - // get the right devices which requested the search - it = m_deviceList.find( device ); - if( it == m_deviceList.end() ) - return; - deviceItem = it.data(); - - QValueList<OpieTooth::Services>::Iterator it2; - BTServiceItem * serviceItem; - - if (!servicesList.isEmpty() ) { - // add services - QMap<int, QString> list; - QMap<int, QString>::Iterator classIt; - for( it2 = servicesList.begin(); it2 != servicesList.end(); ++it2 ) { - serviceItem = new BTServiceItem( deviceItem , (*it2) ); - list = (*it2).classIdList(); - classIt = list.begin(); - int classId; - if ( classIt != list.end() ) - classId = classIt.key(); - serviceItem->setPixmap( 0, m_iconLoader->serviceIcon( classId ) ); - } - } else { - Services s1; - s1.setServiceName( tr("no serives found") ); - serviceItem = new BTServiceItem( deviceItem, s1 ); +/** + * Overloaded. This one it the one that is connected to the foundServices signal + * @param device the mac address of the remote device + * @param servicesList the list with the service the device has. + */ +void BlueBase::addServicesToDevice( const QString& device, Services::ValueList servicesList ) { + qDebug("fill services list"); + + QMap<QString,BTDeviceItem*>::Iterator it; + BTDeviceItem* deviceItem = 0; + + // get the right devices which requested the search + it = m_deviceList.find( device ); + if( it == m_deviceList.end() ) + return; + deviceItem = it.data(); + + QValueList<OpieTooth::Services>::Iterator it2; + BTServiceItem * serviceItem; + + if (!servicesList.isEmpty() ) { + // add services + QMap<int, QString> list; + QMap<int, QString>::Iterator classIt; + for( it2 = servicesList.begin(); it2 != servicesList.end(); ++it2 ) { + serviceItem = new BTServiceItem( deviceItem , (*it2) ); + list = (*it2).classIdList(); + classIt = list.begin(); + int classId=0; + if ( classIt != list.end() ) + classId = classIt.key(); + + serviceItem->setPixmap( 0, m_iconLoader->serviceIcon( classId ) ); } - // now remove them from the list - m_deviceList.remove( it ); + } else { + Services s1; + s1.setServiceName( tr("no serives found") ); + serviceItem = new BTServiceItem( deviceItem, s1 ); } + // now remove them from the list + m_deviceList.remove( it ); +} - /** - * Add the existing connections (pairs) to the connections tab. - * This one triggers the search - */ - void BlueBase::addConnectedDevices() { - m_localDevice->searchConnections(); - } +/** + * Add the existing connections (pairs) to the connections tab. + * This one triggers the search + */ +void BlueBase::addConnectedDevices() { + m_localDevice->searchConnections(); +} - void BlueBase::addConnectedDevices( ConnectionState::ValueList connectionList ) { - QValueList<OpieTooth::ConnectionState>::Iterator it; - BTConnectionItem * connectionItem; +void BlueBase::addConnectedDevices( ConnectionState::ValueList connectionList ) { + QValueList<OpieTooth::ConnectionState>::Iterator it; + BTConnectionItem * connectionItem; - if ( !connectionList.isEmpty() ) { + if ( !connectionList.isEmpty() ) { - for (it = connectionList.begin(); it != connectionList.end(); ++it) { - connectionItem = new BTConnectionItem( ListView4 , (*it) ); - } - } else { - ConnectionState con; - con.setMac( tr("No connections found") ); - connectionItem = new BTConnectionItem( ListView4 , con ); + for (it = connectionList.begin(); it != connectionList.end(); ++it) { + connectionItem = new BTConnectionItem( ListView4 , (*it) ); } - - // recall connection search after some time - QTimer::singleShot( 20000, this, SLOT( addConnectedDevices() ) ); + } else { + ConnectionState con; + con.setMac( tr("No connections found") ); + connectionItem = new BTConnectionItem( ListView4 , con ); } - /** - * Find out if a device can currently be reached - */ - void BlueBase::deviceActive( const RemoteDevice &device ) { - // search by mac, async, gets a signal back - // We should have a BTDeviceItem there or where does it get added to the map -zecke - m_localDevice->isAvailable( device.mac() ); - } + // recall connection search after some time + QTimer::singleShot( 20000, this, SLOT( addConnectedDevices() ) ); +} - /** - * The signal catcher. Set the avail. status on device. - * @param device - the mac address - * @param connected - if it is avail. or not - */ - void BlueBase::deviceActive( const QString& device, bool connected ) { - qDebug("deviceActive slot"); +/** + * Find out if a device can currently be reached + */ +void BlueBase::deviceActive( const RemoteDevice &device ) { + // search by mac, async, gets a signal back + // We should have a BTDeviceItem there or where does it get added to the map -zecke + m_localDevice->isAvailable( device.mac() ); +} - QMap<QString,BTDeviceItem*>::Iterator it; +/** + * The signal catcher. Set the avail. status on device. + * @param device - the mac address + * @param connected - if it is avail. or not + */ +void BlueBase::deviceActive( const QString& device, bool connected ) { + qDebug("deviceActive slot"); - it = m_deviceList.find( device ); - if( it == m_deviceList.end() ) - return; + QMap<QString,BTDeviceItem*>::Iterator it; - BTDeviceItem* deviceItem = it.data(); + it = m_deviceList.find( device ); + if( it == m_deviceList.end() ) + return; + BTDeviceItem* deviceItem = it.data(); - if ( connected ) { - deviceItem->setPixmap( 1, m_onPix ); - } else { - deviceItem->setPixmap( 1, m_offPix ); - } - m_deviceList.remove( it ); + + if ( connected ) { + deviceItem->setPixmap( 1, m_onPix ); + } else { + deviceItem->setPixmap( 1, m_offPix ); } + m_deviceList.remove( it ); +} - /** - * Open the "scan for devices" dialog - */ - void BlueBase::startScan() { - ScanDialog *scan = new ScanDialog( this, "ScanDialog", - true, WDestructiveClose ); - QObject::connect( scan, SIGNAL( selectedDevices( const QValueList<RemoteDevice>& ) ), - this, SLOT( addSearchedDevices( const QValueList<RemoteDevice>& ) ) ); +/** + * Open the "scan for devices" dialog + */ +void BlueBase::startScan() { + ScanDialog *scan = new ScanDialog( this, "ScanDialog", + true, WDestructiveClose ); + QObject::connect( scan, SIGNAL( selectedDevices( const QValueList<RemoteDevice>& ) ), + this, SLOT( addSearchedDevices( const QValueList<RemoteDevice>& ) ) ); - scan->showMaximized(); - } + scan->showMaximized(); +} - /** - * Set the informations about the local device in information Tab - */ - void BlueBase::setInfo() { - StatusLabel->setText( status() ); - } +/** + * Set the informations about the local device in information Tab + */ +void BlueBase::setInfo() { + StatusLabel->setText( status() ); +} - /** - * Decontructor - */ - BlueBase::~BlueBase() { - writeSavedDevices(); - delete m_iconLoader; - } +/** + * Decontructor + */ +BlueBase::~BlueBase() { + writeSavedDevices(); + delete m_iconLoader; +} +/** + * find searches the ListView for a BTDeviceItem containig + * the same Device if found return true else false + * @param dev RemoteDevice to find + * @return returns true if found + */ +bool BlueBase::find( const RemoteDevice& rem ) { + QListViewItemIterator it( ListView2 ); + BTListItem* item; + BTDeviceItem* device; + for (; it.current(); ++it ) { + item = (BTListItem*) it.current(); + if ( item->typeId() != BTListItem::Device ) + continue; + + device = (BTDeviceItem*)item; + if ( rem.equals( device->remoteDevice() ) ) + return true; + } + return false; // not found +} diff --git a/noncore/net/opietooth/manager/bluebase.h b/noncore/net/opietooth/manager/bluebase.h index bbc519c..a68a04b 100644 --- a/noncore/net/opietooth/manager/bluebase.h +++ b/noncore/net/opietooth/manager/bluebase.h @@ -33,32 +33,33 @@ class QCheckBox; namespace OpieTooth { class BlueBase : public BluetoothBase { Q_OBJECT public: BlueBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~BlueBase(); protected: private slots: void startScan(); private: + bool find( const RemoteDevice& device ); void readConfig(); void writeConfig(); void readSavedDevices(); void writeSavedDevices(); void writeToHciConfig(); QString status()const; void initGui(); void setInfo(); PopupHelper m_popHelper; Manager *m_localDevice; QMap<QString,BTDeviceItem*> m_deviceList; void deviceActive( const RemoteDevice &device ); QString m_deviceName; QString m_defaultPasskey; diff --git a/noncore/net/opietooth/manager/bticonloader.cpp b/noncore/net/opietooth/manager/bticonloader.cpp index f299117..a26af54 100644 --- a/noncore/net/opietooth/manager/bticonloader.cpp +++ b/noncore/net/opietooth/manager/bticonloader.cpp @@ -53,26 +53,26 @@ namespace OpieTooth { it = deviceIcons.find( deviceClass ); iconName = it.data(); if ( iconName.isEmpty() ) { iconName = "unknown_16"; } return( Resource::loadPixmap( "opietooth/icons/" + iconName ) ); } QPixmap BTIconLoader::serviceIcon( int serviceClass ) { QString iconName; QMap<int, QString>::Iterator it; - it = deviceIcons.find( serviceClass ); + it = serviceIcons.find( serviceClass ); iconName = it.data(); if ( iconName.isEmpty() ) { iconName = "unknown_16"; } return( Resource::loadPixmap( "opietooth/icons/" + iconName ) ); } } diff --git a/noncore/net/opietooth/manager/devicehandler.cpp b/noncore/net/opietooth/manager/devicehandler.cpp new file mode 100644 index 0000000..9c5b817 --- a/dev/null +++ b/noncore/net/opietooth/manager/devicehandler.cpp @@ -0,0 +1,87 @@ + +#include <stdlib.h> + +#include <qdir.h> +#include <qpe/config.h> + +#include "devicehandler.h" + +using namespace OpieTooth; + +DeviceHandler::DeviceHandler() { + +}; +DeviceHandler::~DeviceHandler() { + +} + +RemoteDevice::ValueList DeviceHandler::load() { + RemoteDevice::ValueList list; +QString path = QDir::homeDirPath() + "/Settings/bluetooth"; + QDir deviceListSave( path); + + // list of .conf files + QStringList devicesFileList = deviceListSave.entryList(); + + + // cut .conf of to get the mac and also read the name entry in it. + if (!devicesFileList.isEmpty() ) { + QString name; + QString mac; + QStringList::Iterator it; + for (it = devicesFileList.begin(); it != devicesFileList.end(); ++it ) { + if ( (*it) == "." || (*it) == ".." ) + continue; + + qDebug((*it).latin1() ); + Config conf(path + "/"+(*it), Config::File); + conf.setGroup("Info"); + name = conf.readEntry("name", "Error"); + mac = conf.readEntry("mac", QString::null); + qDebug("MAC: " + mac); + qDebug("NAME: " + name); + if (mac.isEmpty() ) + continue; + RemoteDevice currentDevice( mac , name ); + list.append( currentDevice ); + } + } + return list; +}; +/* + * This is some how rude but make sure all old devices + * are getting deleted + */ +void DeviceHandler::save( const RemoteDevice::ValueList& list) { + QCString rm; + rm += "rm -rf "; + rm += QDir::homeDirPath() + "/Settings/bluetooth"; + system ( rm.data() ); + + if (list.isEmpty() ) // no need to create the dir + return; + + /** + * Create a new dir + */ + rm = "mkdir "; + rm += QDir::homeDirPath() + "/Settings/bluetooth"; + qWarning("out %s", rm.data() ); + system( rm.data() ); + + RemoteDevice::ValueList::ConstIterator it; + // write the config + + for ( it = list.begin(); it != list.end(); ++it ) { + qDebug( "/Settings/bluetooth/" + (*it).mac() + ".conf"); + + Config conf( QDir::homeDirPath() + + "/Settings/bluetooth/" + + (*it).mac() + ".conf", Config::File ); + + conf.setGroup( "Info" ); + conf.writeEntry( "name", (*it).name() ); + conf.writeEntry( "mac", (*it).mac() ); + } + +} diff --git a/noncore/net/opietooth/manager/devicehandler.h b/noncore/net/opietooth/manager/devicehandler.h new file mode 100644 index 0000000..5cfe048 --- a/dev/null +++ b/noncore/net/opietooth/manager/devicehandler.h @@ -0,0 +1,41 @@ + +#ifndef OPIE_TOOTH_DEVICE_HANDLER_H +#define OPIE_TOOTH_DEVICE_HANDLER_H + +#include <qvaluelist.h> + +#include <remotedevice.h> + +namespace OpieTooth { + /** + * DeviceHandler is responsible for loading + * and saving devices from a config File + */ + class DeviceHandler { + public: + /** + * c'tor + */ + DeviceHandler(); + + /** + * d'tor + */ + ~DeviceHandler(); + + /** + * loads from $HOME/Settings/bluetooth/ * + */ + RemoteDevice::ValueList load(); + + /** + * Saves to $HOME/Settings/bluetooth + */ + void save( const RemoteDevice::ValueList & ); + + }; + + +}; + +#endif diff --git a/noncore/net/opietooth/manager/hciconfwrapper.cpp b/noncore/net/opietooth/manager/hciconfwrapper.cpp index 5f74fee..46eed42 100644 --- a/noncore/net/opietooth/manager/hciconfwrapper.cpp +++ b/noncore/net/opietooth/manager/hciconfwrapper.cpp @@ -53,60 +53,88 @@ namespace OpieTooth { } } void HciConfWrapper::setEncrypt( bool enable) { if ( enable ) { setValue( "encrypt" , "enable" ); } else { setValue( "encrypt" , "disable" ); } } void HciConfWrapper::setValue(const QString &key, const QString &value ) { - QFile f( m_fileName ); - QFile f2( m_fileName ); - - if ( !f.open( IO_ReadOnly) ) { - qDebug("Could not open readonly"); + if (m_file.isEmpty() ) // load first return; - } - - if ( !f2.open( IO_ReadWrite ) ) { - qDebug("Just readonly - not enough"); - return; - } - QStringList list; - qDebug(m_fileName); - QTextStream stream ( &f); - QTextStream outstream (&f2); + QStringList::Iterator it; QString str; - while ( !(str=stream.readLine()).isNull() ) { - - - //qDebug(str); + for (it = m_file.begin(); it != m_file.end(); ++it ) { + str = (*it); if( (str.contains(key)) > 0 ) { qDebug("Found"); // still need to look if its commented out!!! str.simplifyWhiteSpace(); qDebug( key ); if (str.startsWith("#")) { str = (key + " " + value + ";"); } else { str = str.replace( QRegExp( "\\s*"+key+"\\s+[^\\s][^;]*;" ), key + " " + value + ";"); } qDebug( str ); + it = m_file.remove( it ); + it = m_file.insert( it, str ); + //return; the regexp is too wide -zecke // all set } - outstream << str << endl; } - f.close(); - f2.flush(); - f2.close(); } + + /** + * This loads the config file and stores it inside + * the m_file + */ + void HciConfWrapper::load() { + qWarning("loaded"); + m_file.clear(); + QFile file( m_fileName ); + if (!file.open( IO_ReadOnly ) ) { + qDebug("Could not open"); + return; + } + + /** + * readAll() into a QByteArray + * QStringList::split('\n', array ) + * would this be faster? -zecke + */ + QTextStream stream(&file ); + QString tmp; + while ( !stream.atEnd() ) { + tmp = stream.readLine(); + m_file.append( tmp ); + } + } + void HciConfWrapper::save() { + qWarning("save"); + if (m_file.isEmpty() ) // load first + return; + + QFile file( m_fileName ); + if ( !file.open(IO_WriteOnly ) ) { + qWarning("could not open %s", m_fileName.latin1() ); + return; + } + + QTextStream stream(&file ); + QStringList::Iterator it; + for ( it = m_file.begin(); it != m_file.end(); ++it ) { + stream << (*it) << endl; + } + qWarning("saved"); + }; } diff --git a/noncore/net/opietooth/manager/hciconfwrapper.h b/noncore/net/opietooth/manager/hciconfwrapper.h index de8c9a8..0c4b290 100644 --- a/noncore/net/opietooth/manager/hciconfwrapper.h +++ b/noncore/net/opietooth/manager/hciconfwrapper.h @@ -1,30 +1,34 @@ #ifndef HCICONFWRAPPER_H #define HCICONFWRAPPER_H #include <qstring.h> +#include <qstringlist.h> namespace OpieTooth { class HciConfWrapper { public: HciConfWrapper( const QString &fileName ); ~HciConfWrapper(); + void load(); + void save(); void setPinHelper( const QString& app ); void setName( const QString& name ); void setIscan( bool enable ); void setPscan( bool enable ); void setAuth( bool enable); void setEncrypt( bool enable); private: void setValue(const QString &entry, const QString &value ); QString m_fileName; + QStringList m_file; }; } #endif diff --git a/noncore/net/opietooth/manager/manager.pro b/noncore/net/opietooth/manager/manager.pro index 0bdd6b9..762b028 100644 --- a/noncore/net/opietooth/manager/manager.pro +++ b/noncore/net/opietooth/manager/manager.pro @@ -1,21 +1,34 @@ TEMPLATE = app CONFIG = qt warn_on debug #CONFIG = qt warn_on release -HEADERS = btconnectionitem.h btdeviceitem.h btserviceitem.h stdpopups.h popuphelper.h bluebase.h scandialog.h btlistitem.h hciconfwrapper.h bticonloader.h pppdialog.h obexdialog.h -SOURCES = btconnectionitem.cpp btdeviceitem.cpp btserviceitem.h stdpopups.cpp popuphelper.cpp main.cpp bluebase.cpp scandialog.cpp btlistitem.cpp hciconfwrapper.cpp bticonloader.cpp pppdialog.cpp obexdialog.cpp +HEADERS = btconnectionitem.h btdeviceitem.h \ + btserviceitem.h stdpopups.h \ + popuphelper.h bluebase.h \ + scandialog.h btlistitem.h \ + hciconfwrapper.h bticonloader.h \ + pppdialog.h obexdialog.h \ + devicehandler.h + +SOURCES = btconnectionitem.cpp btdeviceitem.cpp \ + btserviceitem.cpp stdpopups.cpp \ + popuphelper.cpp main.cpp \ + bluebase.cpp scandialog.cpp \ + btlistitem.cpp hciconfwrapper.cpp \ + bticonloader.cpp pppdialog.cpp \ + obexdialog.cpp devicehandler.cpp INCLUDEPATH += $(OPIEDIR)/include INCLUDEPATH += $(OPIEDIR)/noncore/net/opietooth/lib DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopietooth -lopie INTERFACES = bluetoothbase.ui devicedialog.ui DESTDIR = $(OPIEDIR)/bin TARGET = bluetooth-manager TRANSLATIONS = ../../../../i18n/de/bluetooth-manager.ts \ ../../../../i18n/en/bluetooth-manager.ts \ ../../../../i18n/es/bluetooth-manager.ts \ ../../../../i18n/fr/bluetooth-manager.ts \ ../../../../i18n/hu/bluetooth-manager.ts \ ../../../../i18n/ja/bluetooth-manager.ts \ ../../../../i18n/ko/bluetooth-manager.ts \ ../../../../i18n/no/bluetooth-manager.ts \ diff --git a/noncore/net/opietooth/manager/popuphelper.cpp b/noncore/net/opietooth/manager/popuphelper.cpp index 26c4b02..4ef1ed5 100644 --- a/noncore/net/opietooth/manager/popuphelper.cpp +++ b/noncore/net/opietooth/manager/popuphelper.cpp @@ -2,29 +2,29 @@ #include "stdpopups.h" #include "popuphelper.h" using namespace OpieTooth; PopupHelper::PopupHelper() { init(); } PopupHelper::~PopupHelper() { } void PopupHelper::insert( int id, popupFactory fact ) { m_map.insert(id, fact ); } QPopupMenu* PopupHelper::find( int id, const Services& ser, QListViewItem* item ) { - qWarning("find"); + //qWarning("find"); FactoryMap::Iterator it = m_map.find(id ); if ( it != m_map.end() ) { - qWarning("found"); + //qWarning("found"); popupFactory fact = it.data(); return (*fact)(ser, item); } return 0l; } void PopupHelper::init() { insert( 1, newRfcComPopup ); insert(2, newObexPushPopup ); } diff --git a/noncore/net/opietooth/manager/scandialog.cpp b/noncore/net/opietooth/manager/scandialog.cpp index 3d6c928..9ce1b6a 100644 --- a/noncore/net/opietooth/manager/scandialog.cpp +++ b/noncore/net/opietooth/manager/scandialog.cpp @@ -52,130 +52,139 @@ namespace OpieTooth { Frame7 = new QFrame( this, "Frame7" ); Frame7->setGeometry( QRect( 0, 0, 240, 331 ) ); Frame7->setFrameShape( QFrame::StyledPanel ); Frame7->setFrameShadow( QFrame::Raised ); QWidget* privateLayoutWidget = new QWidget( Frame7, "Layout11" ); privateLayoutWidget->setGeometry( QRect( 10, 9, 221, 280 ) ); Layout11 = new QVBoxLayout( privateLayoutWidget ); Layout11->setSpacing( 6 ); Layout11->setMargin( 0 ); progress = new QProgressBar(privateLayoutWidget, "progbar"); progress->setTotalSteps(20); QFrame *buttonFrame = new QFrame(Frame7, ""); - StartButton = new QPushButton( buttonFrame, "StartButton" ); - StartButton->setText( tr( "Start scan" ) ); + StartStopButton = new QPushButton( buttonFrame, "StartButton" ); + StartStopButton->setText( tr( "Start scan" ) ); - StopButton = new QPushButton( buttonFrame, "StopButton" ); - StopButton->setText( tr( "Cancel scan" ) ); QHBoxLayout *buttonLayout = new QHBoxLayout(buttonFrame); - buttonLayout->addWidget(StartButton); - buttonLayout->addWidget(StopButton); + buttonLayout->addWidget(StartStopButton); +// buttonLayout->addWidget(StopButton); ListView1 = new QListView( privateLayoutWidget, "ListView1" ); //ListView1->addColumn( tr( "Add" ) ); ListView1->addColumn( tr( "Add Device" ) ); //ListView1->addColumn( tr( "Type" ) ); Layout11->addWidget( ListView1); Layout11->addWidget(progress); Layout11->addWidget( buttonFrame); localDevice = new Manager( "hci0" ); - connect( StartButton, SIGNAL( clicked() ), this, SLOT( startSearch() ) ); - connect( StopButton, SIGNAL( clicked() ), this, SLOT( stopSearch() ) ); + connect( StartStopButton, SIGNAL( clicked() ), this, SLOT( startSearch() ) ); connect( localDevice, SIGNAL( foundDevices( const QString& , RemoteDevice::ValueList ) ), this, SLOT(fillList(const QString& , RemoteDevice::ValueList ) ) ) ; // connect( this, SIGNAL( accept() ), this, SLOT( emitToManager() )); progressStat = 0; + m_search = false; } // hack, make cleaner later void ScanDialog::progressTimer() { progressStat++; - if (progressStat++ < 20) { - QTimer::singleShot( 2000, this, SLOT(progressTimer() ) ); - } + if (progressStat++ < 20 && m_search ) { + QTimer::singleShot( 2000, this, SLOT(progressTimer() ) ); progress->setProgress(progressStat++); + } } void ScanDialog::accept() { emitToManager(); QDialog::accept(); } void ScanDialog::startSearch() { + if ( m_search ) { + stopSearch(); + return; + } + m_search = true; progress->setProgress(0); progressStat = 0; // empty list before a new scan ListView1->clear(); QCheckListItem *deviceItem2 = new QCheckListItem( ListView1, "Test1", QCheckListItem::CheckBox ); deviceItem2->setText(1, "BLAH" ); progressTimer(); // when finished, it emmite foundDevices() // checken ob initialisiert , qcop ans applet. + StartStopButton->setText( tr("Stop scan")); + localDevice->searchDevices(); } void ScanDialog::stopSearch() { - + m_search = true; } - void ScanDialog::fillList(const QString& device, RemoteDevice::ValueList deviceList) { - + void ScanDialog::fillList(const QString&, RemoteDevice::ValueList deviceList) { + progress->setProgress(0); + progressStat = 0; qDebug("fill List"); QCheckListItem * deviceItem; RemoteDevice::ValueList::Iterator it; for( it = deviceList.begin(); it != deviceList.end(); ++it ) { deviceItem = new QCheckListItem( ListView1, (*it).name(), QCheckListItem::CheckBox ); deviceItem->setText(1, (*it).mac() ); } + m_search = false; + StartStopButton->setText(tr ("Start scan") ); } /* * Iterates trough the items, and collects the checked items. * Then it emits it, so the manager can connect to the signal to fill the listing. */ void ScanDialog::emitToManager() { qDebug("vor liste durchsuchen"); if (!ListView1) { return; } QValueList<RemoteDevice> deviceList; QListViewItemIterator it( ListView1 ); for ( ; it.current(); ++it ) { if ( ((QCheckListItem*)it.current())->isOn() ) { RemoteDevice device( it.current()->text(1), it.current()->text(0)); deviceList.append( device ); } } qDebug("vor emit"); emit selectedDevices( deviceList ); } /* * Cleanup */ ScanDialog::~ScanDialog() { + qWarning("delete scan dialog"); delete localDevice; } } diff --git a/noncore/net/opietooth/manager/scandialog.h b/noncore/net/opietooth/manager/scandialog.h index f18784d..8f8d39a 100644 --- a/noncore/net/opietooth/manager/scandialog.h +++ b/noncore/net/opietooth/manager/scandialog.h @@ -33,47 +33,49 @@ class QPushButton; class QProgressBar; namespace OpieTooth { class Manager; class Device; class ScanDialog : public QDialog { Q_OBJECT public: ScanDialog( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); ~ScanDialog(); + private: // make them private -zecke QFrame* Frame7; QProgressBar* progress; - QPushButton* StartButton; - QPushButton* StopButton; + QPushButton* StartStopButton; +// QPushButton* StopButton; QListView* ListView1; -public slots: + public slots: void accept(); protected: QVBoxLayout* Layout11; private slots: void stopSearch(); void startSearch(); void progressTimer(); void fillList(const QString& device, RemoteDevice::ValueList list); private: + bool m_search:1; void emitToManager(); Manager *localDevice; int progressStat; signals: void selectedDevices(const QValueList<RemoteDevice>&); }; } #endif // SCANDIALOG_H |