-rw-r--r-- | noncore/net/opietooth/lib/manager.cc | 33 | ||||
-rw-r--r-- | noncore/net/opietooth/lib/manager.h | 7 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/bluebase.cpp | 36 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/bluebase.h | 5 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/bluetoothbase.ui | 14 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/btconnectionitem.cpp | 18 | ||||
-rw-r--r-- | noncore/net/opietooth/manager/btconnectionitem.h | 8 |
7 files changed, 117 insertions, 4 deletions
diff --git a/noncore/net/opietooth/lib/manager.cc b/noncore/net/opietooth/lib/manager.cc index 8ddcfe8..c89d325 100644 --- a/noncore/net/opietooth/lib/manager.cc +++ b/noncore/net/opietooth/lib/manager.cc @@ -247,33 +247,32 @@ void Manager::searchConnections() { m_hcitoolCon = QString::null; connect(proc, SIGNAL(processExited(OProcess*) ), this, SLOT(slotConnectionExited( OProcess*) ) ); connect(proc, SIGNAL(receivedStdout(OProcess*, char*, int) ), this, SLOT(slotConnectionOutput(OProcess*, char*, int) ) ); *proc << "hcitool"; *proc << "con"; if (!proc->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { ConnectionState::ValueList list; emit connections( list ); delete proc; } } void Manager::slotConnectionExited( OProcess* proc ) { - qWarning("<<<<<<<<<<<<<<<<<exited"); ConnectionState::ValueList list; list = parseConnections( m_hcitoolCon ); emit connections(list ); delete proc; } void Manager::slotConnectionOutput(OProcess* /*proc*/, char* cha, int len) { QCString str(cha, len ); m_hcitoolCon.append( str ); //delete proc; } ConnectionState::ValueList Manager::parseConnections( const QString& out ) { ConnectionState::ValueList list2; QStringList list = QStringList::split('\n', out ); QStringList::Iterator it; // remove the first line ( "Connections:") it = list.begin(); @@ -288,16 +287,48 @@ ConnectionState::ValueList Manager::parseConnections( const QString& out ) { qWarning("4: %s", value[4].latin1() ); qWarning("5: %s", value[5].latin1() ); qWarning("6: %s", value[6].latin1() ); qWarning("7: %s", value[7].latin1() ); qWarning("8: %s", value[8].latin1() ); ConnectionState con; con.setDirection( value[0] == QString::fromLatin1("<") ? Outgoing : Incoming ); con.setConnectionMode( value[1] ); con.setMac( value[2] ); con.setHandle( value[4].toInt() ); con.setState( value[6].toInt() ); con.setLinkMode( value[8] == QString::fromLatin1("MASTER") ? Master : Client ); list2.append( con ); } return list2; } + +void Manager::signalStrength( const QString &mac ) { + + OProcess* sig_proc = new OProcess(); + + connect(sig_proc, SIGNAL(processExited(OProcess*) ), + this, SLOT(slotSignalStrengthExited( OProcess*) ) ); + connect(sig_proc, SIGNAL(receivedStdout(OProcess*, char*, int) ), + this, SLOT(slotSignalStrengthOutput(OProcess*, char*, int) ) ); + *sig_proc << "hcitool"; + *sig_proc << "lq"; + *sig_proc << mac; + + sig_proc->setName( mac.latin1() ); + + if (!sig_proc->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { + emit signalStrength( mac, "-1" ); + delete sig_proc; + } +} + +void Manager::slotSignalStrengthOutput(OProcess* proc, char* cha, int len) { + QCString str(cha, len ); + QString temp = QString(str).stripWhiteSpace(); + QStringList value = QStringList::split(' ', temp ); + emit signalStrength( proc->name(), value[2].latin1() ); +} + + +void Manager::slotSignalStrengthExited( OProcess* proc ) { + delete proc; +} diff --git a/noncore/net/opietooth/lib/manager.h b/noncore/net/opietooth/lib/manager.h index 0ebe1b3..abc8ba1 100644 --- a/noncore/net/opietooth/lib/manager.h +++ b/noncore/net/opietooth/lib/manager.h @@ -111,56 +111,63 @@ namespace OpieTooth { */ void searchServices( const RemoteDevice& ); /** * Starts to connect to the device * in @param */ void connectTo(const QString& ); /** * Searches for active connections * the result is emitted with the * connections signal */ void searchConnections(); + void signalStrength( const QString &mac ); //// not implemented yet /*static*/ QString toDevice( const QString& mac ); /*static*/ QString toMac( const QString &device ); //// not implemented yet over signals: // device either mac or dev name // the first device is the device which you access void available( const QString& device, bool connected ); void addedService( const QString& service, bool added ); void removedService( const QString& service, bool removed ); void foundServices( const QString& device, Services::ValueList ); void foundDevices( const QString& device, RemoteDevice::ValueList ); void connections( ConnectionState::ValueList ); + void signalStrength( const QString& mac, const QString& strengh ); private slots: void slotProcessExited(OProcess* ); void slotSDPExited(OProcess*); void slotSDPOut(OProcess*, char*, int); void slotHCIExited(OProcess* ); void slotHCIOut(OProcess*, char*, int ); void slotConnectionExited(OProcess* ); void slotConnectionOutput(OProcess*, char*, int ); + + void slotSignalStrengthOutput( OProcess*, char*, int ); + void slotSignalStrengthExited( OProcess* ); private: Services::ValueList parseSDPOutput( const QString& ); RemoteDevice::ValueList parseHCIOutput( const QString& ); ConnectionState::ValueList parseConnections( const QString& ); OProcess *m_hcitool; OProcess *m_sdp; // not only one QString m_device; + QMap<QString, int> m_signalStrength; QMap<QString, QString> m_out; QMap<QString, QString> m_devices; + QMap<OProcess*, QString> m_signalMac; QString m_hcitoolCon; }; }; #endif diff --git a/noncore/net/opietooth/manager/bluebase.cpp b/noncore/net/opietooth/manager/bluebase.cpp index 8b15c4f..9663b52 100644 --- a/noncore/net/opietooth/manager/bluebase.cpp +++ b/noncore/net/opietooth/manager/bluebase.cpp @@ -59,61 +59,65 @@ BlueBase::BlueBase( QWidget* parent, const char* name, WFlags fl ) 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 ) ) ); + connect( m_localDevice, SIGNAL( signalStrength( const QString&, const QString& ) ), + this, SLOT( addSignalStrength( const QString&, const QString& ) ) ); // let hold be rightButtonClicked() QPEApplication::setStylusOperation( ListView2->viewport(), QPEApplication::RightOnHold); QPEApplication::setStylusOperation( ListView4->viewport(), QPEApplication::RightOnHold); //Load all icons needed m_offPix = Resource::loadPixmap( "opietooth/notconnected" ); m_onPix = Resource::loadPixmap( "opietooth/connected" ); m_findPix = Resource::loadPixmap( "opietooth/find" ); 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(); ListView2->setRootIsDecorated(true); + writeToHciConfig(); // search conncetions addConnectedDevices(); + addSignalStrength(); m_iconLoader = new BTIconLoader(); readSavedDevices(); } /** * 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 ); @@ -357,33 +361,34 @@ void BlueBase::startServiceActionHold( QListViewItem * item, const QPoint & poin /** * Search and display avail. services for a device (on expand from device listing) * @param item the service item returned */ 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 + * Overloaded. This one it the one that is + ted 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(); // remove previous entries @@ -412,57 +417,84 @@ void BlueBase::addServicesToDevice( const QString& device, Services::ValueList s if ( classIt != list.end() ) { classId = classIt.key(); } serviceItem->setPixmap( 0, m_iconLoader->serviceIcon( classId ) ); } } else { Services s1; s1.setServiceName( tr("no services found") ); serviceItem = new BTServiceItem( deviceItem, s1 ); } // now remove them from the list m_deviceList.remove( it ); } + + + +void BlueBase::addSignalStrength() { + + QListViewItemIterator it( ListView4 ); + for ( ; it.current(); ++it ) { + m_localDevice->signalStrength( ((BTConnectionItem*)it.current() )->connection().mac() ); + } + + QTimer::singleShot( 5000, this, SLOT( addSignalStrength() ) ); +} + +void BlueBase::addSignalStrength( const QString& mac, const QString& strength ) { + + QListViewItemIterator it( ListView4 ); + for ( ; it.current(); ++it ) { + if( ((BTConnectionItem*)it.current())->connection().mac() == mac ) { + ((BTConnectionItem*)it.current() )->setSignalStrength( strength ); + } + } +} + /** * Add the existing connections (pairs) to the connections tab. * This one triggers the search */ void BlueBase::addConnectedDevices() { m_localDevice->searchConnections(); } - /** * This adds the found connections to the connection tab. * @param connectionList the ValueList with all current connections */ void BlueBase::addConnectedDevices( ConnectionState::ValueList connectionList ) { // clear the ListView first ListView4->clear(); QValueList<OpieTooth::ConnectionState>::Iterator it; BTConnectionItem * connectionItem; if ( !connectionList.isEmpty() ) { for (it = connectionList.begin(); it != connectionList.end(); ++it) { connectionItem = new BTConnectionItem( ListView4 , (*it) ); + + if( m_deviceList.find((*it).mac()).data() ) { + + connectionItem->setName( m_deviceList.find( (*it).mac()).data()->name() ); + } } } else { ConnectionState con; con.setMac( tr("No connections found") ); connectionItem = new BTConnectionItem( ListView4 , con ); } // recall connection search after some time QTimer::singleShot( 15000, this, SLOT( addConnectedDevices() ) ); } /** * Find out if a device can currently be reached * @param device */ diff --git a/noncore/net/opietooth/manager/bluebase.h b/noncore/net/opietooth/manager/bluebase.h index 0326daf..743062c 100644 --- a/noncore/net/opietooth/manager/bluebase.h +++ b/noncore/net/opietooth/manager/bluebase.h @@ -1,92 +1,97 @@ #ifndef BLUEBASE_H #define BLUEBASE_H #include <qvariant.h> #include <qwidget.h> #include <qscrollview.h> #include <qsplitter.h> #include <qlist.h> #include <qpixmap.h> #include "bluetoothbase.h" #include "btserviceitem.h" #include "btdeviceitem.h" + #include "popuphelper.h" #include "bticonloader.h" #include <remotedevice.h> #include <manager.h> class QVBox; class QHBoxLayout; class QGridLayout; class QFrame; class QLabel; class QPushButton; class QTabWidget; class QCheckBox; +class BTConnectionItem; 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; bool m_useEncryption; bool m_enableAuthentification; bool m_enablePagescan; bool m_enableInquiryscan; QPixmap m_offPix; QPixmap m_onPix; QPixmap m_findPix; BTIconLoader *m_iconLoader; private slots: void addSearchedDevices( const QValueList<RemoteDevice> &newDevices ); void addServicesToDevice( BTDeviceItem *item ); void addServicesToDevice( const QString& device, Services::ValueList ); void addConnectedDevices(); void addConnectedDevices( ConnectionState::ValueList ); void startServiceActionClicked( QListViewItem *item ); void startServiceActionHold( QListViewItem *, const QPoint &, int ); void deviceActive( const QString& mac, bool connected ); void applyConfigChanges(); + void addSignalStrength(); + void addSignalStrength( const QString& mac, const QString& strengh ); }; } #endif diff --git a/noncore/net/opietooth/manager/bluetoothbase.ui b/noncore/net/opietooth/manager/bluetoothbase.ui index 869a9cb..b51c8c6 100644 --- a/noncore/net/opietooth/manager/bluetoothbase.ui +++ b/noncore/net/opietooth/manager/bluetoothbase.ui @@ -185,32 +185,46 @@ </property> </column> <column> <property> <name>text</name> <string>Connection type</string> </property> <property> <name>clickable</name> <bool>true</bool> </property> <property> <name>resizeable</name> <bool>true</bool> </property> </column> + <column> + <property> + <name>text</name> + <string>Signal</string> + </property> + <property> + <name>clickable</name> + <bool>true</bool> + </property> + <property> + <name>resizeable</name> + <bool>true</bool> + </property> + </column> <property stdset="1"> <name>name</name> <cstring>ListView4</cstring> </property> <property stdset="1"> <name>geometry</name> <rect> <x>0</x> <y>0</y> <width>240</width> <height>240</height> </rect> </property> </widget> </widget> <widget> diff --git a/noncore/net/opietooth/manager/btconnectionitem.cpp b/noncore/net/opietooth/manager/btconnectionitem.cpp index b57d1b3..c565c47 100644 --- a/noncore/net/opietooth/manager/btconnectionitem.cpp +++ b/noncore/net/opietooth/manager/btconnectionitem.cpp @@ -9,16 +9,34 @@ BTConnectionItem::BTConnectionItem( QListView* parent, const ConnectionState& co setText(0, m_con.mac() ); setText(1, m_con.connectionMode() ); } BTConnectionItem::~BTConnectionItem() { } QString BTConnectionItem::type() const { return QString::fromLatin1("connection"); } int BTConnectionItem::typeId() const { return Connection; } ConnectionState BTConnectionItem::connection() const { return m_con; } +void BTConnectionItem::setName( QString name ) { + m_name = name; + setText( 0, m_name ); +} + +QString BTConnectionItem::name() { + return m_name; +} + + +void BTConnectionItem::setSignalStrength( QString strength ) { + m_signalStrength = strength; + setText( 2, m_signalStrength ); +} + +QString BTConnectionItem::signalStrength() { + return m_signalStrength; +} diff --git a/noncore/net/opietooth/manager/btconnectionitem.h b/noncore/net/opietooth/manager/btconnectionitem.h index 3c0cd79..9ab745e 100644 --- a/noncore/net/opietooth/manager/btconnectionitem.h +++ b/noncore/net/opietooth/manager/btconnectionitem.h @@ -1,26 +1,32 @@ #ifndef OPIE_TOOTH_BT_CONNECTION_ITEM_H #define OPIE_TOOTH_BT_CONNECTION_ITEM_H #include "btlistitem.h" namespace OpieTooth { class ConnectionState; class BTConnectionItem : public BTListItem { public: BTConnectionItem( QListView* parent, const ConnectionState& state ); ~BTConnectionItem(); QString type()const; + QString name(); + QString signalStrength(); int typeId() const; ConnectionState connection()const; + void setSignalStrength( QString ); + void setName( QString ); + private: ConnectionState m_con; - + QString m_name; + QString m_signalStrength; }; }; #endif |