-rw-r--r-- | noncore/net/opietooth/lib/manager.cc | 64 | ||||
-rw-r--r-- | noncore/net/opietooth/lib/manager.h | 7 |
2 files changed, 69 insertions, 2 deletions
diff --git a/noncore/net/opietooth/lib/manager.cc b/noncore/net/opietooth/lib/manager.cc index eeeab19..d65dbd4 100644 --- a/noncore/net/opietooth/lib/manager.cc +++ b/noncore/net/opietooth/lib/manager.cc @@ -1,134 +1,196 @@ #include <opie/oprocess.h> #include "manager.h" using namespace OpieTooth; Manager::Manager( const QString& dev ) : QObject() { m_device = dev; m_hcitool = 0; m_sdp = 0; } Manager::Manager( Device* dev ) : QObject() { m_hcitool = 0; m_sdp = 0; } Manager::Manager() : QObject() { m_hcitool = 0; m_sdp = 0; } Manager::~Manager(){ delete m_hcitool; delete m_sdp; } void Manager::setDevice( const QString& dev ){ m_device = dev; } void Manager::setDevice( Device* dev ){ } void Manager::isConnected( const QString& device ){ OProcess* l2ping = new OProcess(); l2ping->setName( device.latin1() ); *l2ping << "l2ping" << "-c1" << device; connect(l2ping, SIGNAL(processExited(OProcess* ) ), this, SLOT(slotProcessExited(OProcess*) ) ); if (!l2ping->start() ) { emit connected( device, false ); delete l2ping; } } void Manager::isConnected( Device* dev ){ } void Manager::searchDevices( const QString& device ){ - + OProcess* hcitool = new OProcess(); + hcitool->setName( device.latin1() ); + *hcitool << "hcitool" << "scan"; + connect( hcitool, SIGNAL(processExited(OProcess*) ) , + this, SLOT(slotHCIExited(OProcess* ) ) ); + connect( hcitool, SIGNAL(receivedStdout(OProcess*, char*, int ) ), + this, SLOT(slotHCIOut(OProcess*, char*, int ) ) ); + if (!hcitool->start() ) { + RemoteDevices::ValueList list; + emit foundDevices( device, list ); + delete hcitool; + } } void Manager::searchDevices(Device* d ){ } void Manager::addService(const QString& name ){ OProcess proc; proc << "sdptool" << "add" << name; bool bo = true; if (!proc.start(OProcess::DontCare ) ) bo = false; emit addedService( name, bo ); } void Manager::addServices(const QStringList& list){ QStringList::ConstIterator it; for (it = list.begin(); it != list.end(); ++it ) addService( (*it) ); } void Manager::removeService( const QString& name ){ OProcess prc; prc << "sdptool" << "del" << name; bool bo = true; if (!prc.start(OProcess::DontCare ) ) bo = false; emit removedService( name, bo ); } void Manager::removeServices( const QStringList& list){ QStringList::ConstIterator it; for (it = list.begin(); it != list.end(); ++it ) removeService( (*it) ); } void Manager::searchServices( const QString& remDevice ){ OProcess *m_sdp =new OProcess(); *m_sdp << "sdptool" << "browse" << remDevice; m_sdp->setName( remDevice.latin1() ); connect(m_sdp, SIGNAL(processExited(OProcess*) ), this, SLOT(slotSDPExited(OProcess* ) ) ); connect(m_sdp, SIGNAL(receivedStdout(OProcess*, char*, int ) ), this, SLOT(slotSDPOut(OProcess*, char*, int) ) ); if (!m_sdp->start() ) { delete m_sdp; Services::ValueList list; emit foundServices( remDevice, list ); } } void Manager::searchServices( const RemoteDevices& dev){ searchServices( dev.mac() ); } QString Manager::toDevice( const QString& mac ){ } QString Manager::toMac( const QString &device ){ } void Manager::slotProcessExited(OProcess* proc ) { bool conn= false; if (proc->normalExit() && proc->exitStatus() == 0 ) conn = true; QString name = QString::fromLatin1(proc->name() ); emit connected( name, conn ); delete proc; } void Manager::slotSDPOut(OProcess* proc, char* ch, int len) { QCString str(ch, len+1 ); QMap<QString, QString>::Iterator it; it = m_out.find(proc->name() ); if ( it != m_out.end() ) { QString string = it.data(); string.append( str ); m_out.replace( proc->name(), string ); } } void Manager::slotSDPExited( OProcess* proc) { + Services::ValueList list; + if (proc->normalExit() ) { + QMap<QString, QString>::Iterator it = m_out.find( proc->name() ); + if ( it != m_out.end() ) { + list = parseSDPOutput( it.data() ); + m_out.remove( it ); + } + } + emit foundServices( proc->name(), list ); + delete proc; +} +Services::ValueList Manager::parseSDPOutput( const QString& out ) { + Services::ValueList list; + return list; +} + +void Manager::slotHCIExited(OProcess* proc ) { + RemoteDevices::ValueList list; + if (proc->normalExit() ) { + QMap<QString, QString>::Iterator it = m_devices.find(proc->name() ); + if (it != m_devices.end() ) { + list = parseHCIOutput( it.data() ); + m_devices.remove( it ); + } + } + emit foundDevices( proc->name(), list ); delete proc; } +void Manager::slotHCIOut(OProcess* proc, char* ch, int len) { + QCString str( ch, len+1 ); + QMap<QString, QString>::Iterator it; + it = m_devices.find( proc->name() ); + if (it != m_devices.end() ) { + QString string = it.data(); + string.append( str ); + m_devices.replace( proc->name(), string ); + } +} +RemoteDevices::ValueList Manager::parseHCIOutput(const QString& output ) { + RemoteDevices::ValueList list; + QStringList strList = QStringList::split('\n', output ); + QStringList::Iterator it; + QString str; + for ( it = strList.begin(); it != strList.end(); ++it ) { + str = (*it).stripWhiteSpace(); + qWarning("OpieTooth %s", str.latin1() ); + QStringList split = QStringList::split(" ", str ); + qWarning("Left:%s Right:%s", split[0].latin1() , split[1].latin1() ); + RemoteDevices rem( split[0].latin1() , split[1].latin1() ); + list.append( rem ); + } + return list; +} diff --git a/noncore/net/opietooth/lib/manager.h b/noncore/net/opietooth/lib/manager.h index 03375c5..95e4306 100644 --- a/noncore/net/opietooth/lib/manager.h +++ b/noncore/net/opietooth/lib/manager.h @@ -17,110 +17,115 @@ namespace OpieTooth { * with Manager you can control the things you * could do from command line in a OO and asynchronus * way. */ class Manager : public QObject { Q_OBJECT public: /** c'tor whichs create a new Manager * @param device is the device to use. Either a mac or blueZ device name * */ Manager( const QString &device ); /** c'tor * @param dev The Device to be managed * We don't care of Device so you need to delete it */ Manager( Device* dev ); /** * c'tor */ Manager(); ~Manager(); /** Set the manager to control a new device * @param device the new device to control (hci0 ) */ void setDevice( const QString& device ); /** * Convience functions for setting a new device */ void setDevice( Device *dev ); /** * Wether or not a device is connected. The function * is asynchron * If device is empty it will take the currently managed * device and see if it's up * for Remote devices it will ping and see. * @param either mac or hciX */ void isConnected(const QString& device= QString::null ); /** * same as above */ void isConnected(Device *dev ); /** this searchs for devices reachable from the * currently managed device * or from device if @param device is not empty */ void searchDevices(const QString& device= QString::null ); /** same as above * */ void searchDevices(Device *d ); /** * This will add the service @param name * to the sdpd daemon * It will start the daemon if necessary */ void addService(const QString &name ); /** * This will add the services @param names * to the sdpd daemon * It will start the daemon if necessary */ void addServices( const QStringList& names ); /** * This removes a service from the sdps */ void removeService(const QString &name ); /** * Removes a list from the sdpd */ void removeServices(const QStringList& ); /** * search for services on a remote device * */ void searchServices( const QString& remDevice ); /** * search for services on a remote device */ void searchServices( const RemoteDevices& ); /*static*/ QString toDevice( const QString& mac ); /*static*/ QString toMac( const QString &device ); signals: // device either mac or dev name // the first device is the device which you access void connected( 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, RemoteDevices::ValueList ); - void foundNothing( const QString& device ); + private slots: void slotProcessExited(OProcess* ); void slotSDPExited(OProcess*); void slotSDPOut(OProcess*, char*, int); + void slotHCIExited(OProcess* ); + void slotHCIOut(OProcess*, char*, int ); private: + Services::ValueList parseSDPOutput( const QString& ); + RemoteDevices::ValueList parseHCIOutput( const QString& ); OProcess *m_hcitool; OProcess *m_sdp; // not only one QString m_device; QMap<QString, QString> m_out; + QMap<QString, QString> m_devices; }; }; #endif |