summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/net/opietooth/lib/device.cc54
-rw-r--r--noncore/net/opietooth/lib/device.h1
-rw-r--r--noncore/net/opietooth/lib/lib.pro4
-rw-r--r--noncore/net/opietooth/lib/manager.h3
-rw-r--r--noncore/net/opietooth/lib/remotedevice.cc48
-rw-r--r--noncore/net/opietooth/lib/remotedevice.h6
-rw-r--r--noncore/net/opietooth/lib/services.cc168
-rw-r--r--noncore/net/opietooth/lib/services.h18
8 files changed, 286 insertions, 16 deletions
diff --git a/noncore/net/opietooth/lib/device.cc b/noncore/net/opietooth/lib/device.cc
index 468f191..e3d7f3b 100644
--- a/noncore/net/opietooth/lib/device.cc
+++ b/noncore/net/opietooth/lib/device.cc
@@ -1,104 +1,142 @@
#include <signal.h>
#include "kprocess.h"
#include "device.h"
using namespace OpieTooth;
+namespace {
+ int parsePid( const QCString& par ){
+ int id=0;
+ QString string( par );
+ QStringList list = QStringList::split( '\n', string );
+ for( QStringList::Iterator it = list.begin(); it != list.end(); ++it ){
+ if( !(*it).startsWith("CSR") ){
+ id = (*it).toInt();
+ break;
+ }
+ }
+ return id;
+ }
+}
+
Device::Device(const QString &device, const QString &mode )
: QObject(0, "device" ) {
+ qWarning("OpieTooth::Device create" );
m_hci = 0;
m_process = 0;
m_attached = false;
m_device = device;
m_mode = mode;
attach();
}
Device::~Device(){
detach();
}
void Device::attach(){
- if(m_process != 0 ){
+ qWarning("attaching %s %s", m_device.latin1(), m_mode.latin1() );
+ if(m_process == 0 ){
+ m_output.resize(0);
+ qWarning("new process to create" );
m_process = new KProcess();
*m_process << "hciattach";
*m_process << "-p";
*m_process << m_device << m_mode;
connect(m_process, SIGNAL( processExited(KProcess*) ),
this, SLOT( slotExited(KProcess* ) ) );
connect(m_process, SIGNAL( receivedStdout(KProcess*, char*, int) ),
this, SLOT(slotStdOut(KProcess*,char*,int ) ) );
connect(m_process, SIGNAL(receivedStderr(KProcess*, char*, int ) ),
this, SLOT(slotStdErr(KProcess*,char*,int) ) );
if(!m_process->start(KProcess::NotifyOnExit, KProcess::AllOutput ) ){
+ qWarning("Could not start" );
delete m_process;
m_process = 0;
}
};
}
void Device::detach(){
delete m_hci;
delete m_process;
// kill the pid we got
- if(m_attached )
+ if(m_attached ){
//kill the pid
+ qWarning( "killing" );
kill(pid, 9);
}
+ qWarning("detached" );
+}
bool Device::isLoaded()const{
return m_attached;
}
QString Device::devName()const {
return QString::fromLatin1("hci0");
};
void Device::slotExited( KProcess* proc)
{
+ qWarning("prcess exited" );
if(proc== m_process ){
if( m_process->normalExit() ){ // normal exit
int ret = m_process->exitStatus();
if( ret == 0 ){ // attached
+ qWarning("attached" );
+ qWarning("Output: %s", m_output.data() );
+ pid = parsePid( m_output );
+ qWarning("Pid = %d", pid );
// now hciconfig hci0 up ( determine hciX FIXME)
// and call hciconfig hci0 up
// FIXME hardcoded to hci0 now :(
m_hci = new KProcess( );
*m_hci << "hciconfig";
*m_hci << "hci0 up";
connect(m_hci, SIGNAL( processExited(KProcess*) ),
this, SLOT( slotExited(KProcess* ) ) );
+ if(!m_hci->start() ){
+ qWarning("could not start" );
+ m_attached = false;
+ emit device("hci0", false );
+ }
}else{
m_attached = false;
emit device("hci0", false );
}
}
delete m_process;
m_process = 0;
}else if(proc== m_hci ){
+ qWarning("M HCI exited" );
if( m_hci->normalExit() ){
- int ret = m_hci->normalExit();
+ qWarning("normal exit" );
+ int ret = m_hci->exitStatus();
if( ret == 0 ){
+ qWarning("attached really really attached" );
+ m_attached = true;
emit device("hci0", true );
}else{
+ qWarning( "failed" );
emit device("hci0", false );
m_attached = false;
}
}// normal exit
delete m_hci;
m_hci = 0;
}
}
void Device::slotStdOut(KProcess* proc, char* chars, int len)
{
+ qWarning("std out" );
if( len <1 )
return;
if(proc == m_process ){
- QCString string( chars, len+1 );
- if(string.left(3) != "CSR" ){ // it's the pid
- pid = string.toInt();
- };
+ QCString string( chars, len+1 ); // \0 == +1
+ qWarning("output: %s", string.data() );
+ m_output.append( string.data() );
}
}
void Device::slotStdErr(KProcess*, char*, int )
{
-
+ qWarning("std err" );
}
diff --git a/noncore/net/opietooth/lib/device.h b/noncore/net/opietooth/lib/device.h
index 010db40..8498b14 100644
--- a/noncore/net/opietooth/lib/device.h
+++ b/noncore/net/opietooth/lib/device.h
@@ -1,84 +1,85 @@
#ifndef OpieToothDevice_H
#define OpieToothDevice_H
#include <qobject.h>
#include <qstring.h>
#include <qvaluelist.h>
#include <sys/types.h>
class KProcess;
namespace OpieTooth {
/**
* Device takes care of attaching serial
* devices to the blueZ stack.
* After attaching it hciconfig ups it
*/
class Device : public QObject {
Q_OBJECT
public:
/**
* Brings up an device.
* Usage example: new Device(/dev/ttySB0, csr)
*
* @param &device QString the device name
* @param &mode QString the mode
*/
Device(const QString &device, const QString& mode);
/**
* unloads the device
*/
~Device();
/**
* attach the device
*/
void attach();
/**
* detach the device
*/
void detach();
/**
* Is the device loaded?
* @return bool, if the device is loaded
*/
bool isLoaded()const;
/**
* Returns the device name
* @return QString, the device name
*/
QString devName()const ; // hci0
signals:
/**
* Signals devicename and up status
* @return &device QString, Devicename
* @return up bool, if the device is up or not.
*/
void device(const QString& device, bool up );
private slots:
virtual void slotExited( KProcess* );
virtual void slotStdOut(KProcess*, char*, int );
virtual void slotStdErr(KProcess*, char*, int );
private:
class Private;
Private *d;
QString m_device;
bool m_attached:1;
KProcess* m_hci;
KProcess* m_process;
QString m_devId;
QString m_mode;
pid_t pid;
+ QCString m_output;
};
};
#endif
diff --git a/noncore/net/opietooth/lib/lib.pro b/noncore/net/opietooth/lib/lib.pro
index 7cededf..a70c7ab 100644
--- a/noncore/net/opietooth/lib/lib.pro
+++ b/noncore/net/opietooth/lib/lib.pro
@@ -1,8 +1,8 @@
TEMPLATE = lib
CONFIG += qte warn_on release
-HEADERS = kprocctrl.h kprocess.h device.h
-SOURCES = kprocctrl.cpp kprocess.cpp device.cc
+HEADERS = kprocctrl.h kprocess.h device.h manager.h remotedevice.h services.h
+SOURCES = kprocctrl.cpp kprocess.cpp device.cc manager.cc remotedevice.cc services.cc
TARGET = opietooth
INCLUDEPATH += $(OPIEDIR)/include
DESTDIR = $(QTDIR)/lib$(PROJMAK)
#VERSION = 0.0.0
diff --git a/noncore/net/opietooth/lib/manager.h b/noncore/net/opietooth/lib/manager.h
index 5586680..6c5e27f 100644
--- a/noncore/net/opietooth/lib/manager.h
+++ b/noncore/net/opietooth/lib/manager.h
@@ -1,104 +1,107 @@
#ifndef OpieToothManager_H
#define OpieToothManager_H
#include <qobject.h>
#include <qstring.h>
#include <qvaluelist.h>
+#include "remotedevice.h"
+#include "services.h"
+
namespace OpieTooth {
class Device;
/** Manager manages a blueZ device (hci0 for example)
* 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
*/
void isConnected(const QString& device= QString::null );
/**
* same as above
*/
void isConnected(Device *dev );
/** this search 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& device, const QString& service, bool added );
void removedService( const QString& device, const QString& service, bool removed );
diff --git a/noncore/net/opietooth/lib/remotedevice.cc b/noncore/net/opietooth/lib/remotedevice.cc
new file mode 100644
index 0000000..0045904
--- a/dev/null
+++ b/noncore/net/opietooth/lib/remotedevice.cc
@@ -0,0 +1,48 @@
+
+#include "remotedevice.h"
+
+using namespace OpieTooth;
+
+bool operator==(const RemoteDevices& rem1, const RemoteDevices& rem2){
+ if( ( rem1.mac() == rem2.mac() ) && (rem1.name() == rem2.name() ) )
+ return true;
+
+ return false;
+}
+
+RemoteDevices::RemoteDevices(){
+
+}
+RemoteDevices::RemoteDevices(const RemoteDevices& ole ){
+ (*this) = ole;
+}
+RemoteDevices::RemoteDevices(const QString &mac, const QString& name ){
+ m_mac = mac;
+ m_name = name;
+}
+RemoteDevices::~RemoteDevices(){
+
+}
+bool RemoteDevices::isEmpty() const {
+ if( m_name.isEmpty() && m_mac.isEmpty() )
+ return true;
+ return false;
+};
+RemoteDevices& RemoteDevices::operator=( const RemoteDevices& rem1){
+ m_name = rem1.m_name;
+ m_mac = rem1.m_mac;
+ return *this;
+
+}
+QString RemoteDevices::mac() const {
+ return m_mac;
+}
+void RemoteDevices::setMac( const QString& mac ){
+ m_mac = mac;
+}
+QString RemoteDevices::name() const{
+ return m_name;
+}
+void RemoteDevices::setName( const QString& name ){
+ m_name = name;
+}
diff --git a/noncore/net/opietooth/lib/remotedevice.h b/noncore/net/opietooth/lib/remotedevice.h
index 8e5baa5..96a27de 100644
--- a/noncore/net/opietooth/lib/remotedevice.h
+++ b/noncore/net/opietooth/lib/remotedevice.h
@@ -1,24 +1,28 @@
#ifndef OpieToothRemoteDevice
#define OpieToothRemoteDevice
#include <qvaluelist.h>
namespace OpieTooth{
class RemoteDevices {
public:
typedef QValueList<RemoteDevices> ValueList;
RemoteDevices();
RemoteDevices(const RemoteDevices& );
RemoteDevices(const QString &mac, const QString &name );
~RemoteDevices();
friend bool operator==(const RemoteDevices&, const RemoteDevices&);
- RemoteDevies &operator=(const RemoteDevices& );
+ RemoteDevices &operator=(const RemoteDevices& );
+ bool isEmpty()const;
QString mac()const;
void setMac(const QString& mac );
QString name()const;
void setName( const QString& name );
+ private:
+ QString m_name;
+ QString m_mac;
};
};
#endif
diff --git a/noncore/net/opietooth/lib/services.cc b/noncore/net/opietooth/lib/services.cc
new file mode 100644
index 0000000..75c1bd6
--- a/dev/null
+++ b/noncore/net/opietooth/lib/services.cc
@@ -0,0 +1,168 @@
+
+#include "services.h"
+
+using namespace OpieTooth;
+
+
+Services::ProfileDescriptor::ProfileDescriptor(){
+
+}
+Services::ProfileDescriptor::ProfileDescriptor(const QString &id, uint idInt, uint version ){
+ m_id = id;
+ m_idInt = idInt;
+ m_version = version;
+}
+Services::ProfileDescriptor::ProfileDescriptor( const ProfileDescriptor& rem){
+ (*this) = rem;
+}
+QString Services::ProfileDescriptor::id() const {
+ return m_id;
+}
+void Services::ProfileDescriptor::setId( const QString& id ){
+ m_id = id;
+}
+void Services::ProfileDescriptor::setId(uint id ){
+ m_idInt = id;
+}
+uint Services::ProfileDescriptor::idInt()const{
+ return m_idInt;
+}
+uint Services::ProfileDescriptor::version() const{
+ return m_version;
+}
+void Services::ProfileDescriptor::setVersion(uint version){
+ m_version = version;
+}
+Services::ProfileDescriptor& Services::ProfileDescriptor::operator=( const Services::ProfileDescriptor& prof){
+ m_id = prof.m_id;
+ m_idInt = prof.m_idInt;
+ m_version = prof.m_version;
+ return *this;
+}
+bool operator==(const Services::ProfileDescriptor& first,
+ const Services::ProfileDescriptor& second ){
+
+ if( (first.id() == second.id() ) &&
+ (first.version() == second.version() ) &&
+ (first.idInt() == second.idInt() ) )
+ return true;
+ return false;
+}
+
+Services::ProtocolDescriptor::ProtocolDescriptor(){
+ m_number = 0;
+ m_channel = 0;
+}
+Services::ProtocolDescriptor::ProtocolDescriptor(const QString& name,
+ uint number,
+ uint channel){
+ m_name = name;
+ m_number = number;
+ m_channel = channel;
+}
+Services::ProtocolDescriptor::ProtocolDescriptor( const ProtocolDescriptor& ole ){
+ (*this) = ole;
+}
+Services::ProtocolDescriptor::~ProtocolDescriptor(){
+
+}
+QString Services::ProtocolDescriptor::name() const{
+ return m_name;
+}
+void Services::ProtocolDescriptor::setName(const QString& name ){
+ m_name = name;
+}
+uint Services::ProtocolDescriptor::id()const {
+ return m_number;
+}
+void Services::ProtocolDescriptor::setId( uint id ){
+ m_number = id;
+}
+uint Services::ProtocolDescriptor::port()const {
+ return m_channel;
+}
+void Services::ProtocolDescriptor::setPort( uint port ){
+ m_channel = port;
+}
+Services::ProtocolDescriptor &Services::ProtocolDescriptor::operator=( const Services::ProtocolDescriptor& desc ){
+ m_name = desc.m_name;
+ m_channel = desc.m_channel;
+ m_number = desc.m_number;
+ return *this;
+}
+bool operator==( const Services::ProtocolDescriptor &first,
+ const Services::ProtocolDescriptor &second ){
+ if( ( first.name() == second.name() ) &&
+ ( first.id() == second.id() ) &&
+ ( first.port() == second.port() ) )
+ return true;
+
+ return false;
+
+}
+
+Services::Services(){
+
+}
+Services::Services(const Services& service ){
+
+}
+Services::~Services(){
+
+}
+Services &Services::operator=( const Services& ){
+ return *this;
+}
+bool operator==( const Services&,
+ const Services& ){
+ return false;
+}
+QString Services::serviceName() const{
+
+}
+void Services::setServiceName( const QString& service ){
+
+}
+int Services::recHandle() const{
+
+}
+void Services::setRecHandle( int ){
+
+}
+QString Services::classIdList() const{
+
+}
+void Services::setClassIdList( const QString& ){
+
+}
+int Services::classIdListInt() const{
+
+}
+void Services::setClassIdList(int ){
+
+}
+void Services::insertProtocolDescriptor( const ProtocolDescriptor& ){
+
+}
+void Services::clearProtocolDescriptorList(){
+
+}
+void Services::removeProtocolDescriptor( const ProtocolDescriptor& ){
+
+}
+Services::ProtocolDescriptor::ValueList Services::protocolDescriptorList()const{
+
+}
+
+void Services::insertProfileDescriptor( const ProfileDescriptor& ){
+
+}
+void Services::clearProfileDescriptorList(){
+
+}
+void Services::removeProfileDescriptor( const ProfileDescriptor& ){
+
+}
+Services::ProfileDescriptor::ValueList Services::profileDescriptor() const{
+
+}
diff --git a/noncore/net/opietooth/lib/services.h b/noncore/net/opietooth/lib/services.h
index 4a4dea8..8e9378a 100644
--- a/noncore/net/opietooth/lib/services.h
+++ b/noncore/net/opietooth/lib/services.h
@@ -1,130 +1,138 @@
#ifndef OpieToothServices_H
#define OpieToothServices_H
#include <qvaluelist.h>
namespace OpieTooth {
/**
* Services lets shows you all available services
* on a remote device
*/
class Services {
/** The profile descriptor
*
*/
- class ProfileDesriptor{
+ class ProfileDescriptor{
public:
/** typedef */
typedef QValueList<ProfileDescriptor> ValueList;
/** c'tor for QValueList */
ProfileDescriptor();
/**
* c'tor
* @param id The id or name ("Lan Access Using PPP")
* @param idInt The id as uint ( 0x1102 )
* @param version Version of the Profile ( 1 )
*/
ProfileDescriptor(const QString &id, uint idInt, uint version );
/**
* copy c'tor
*/
ProfileDescriptor(const ProfileDescriptor& );
/**
* returns the id
*/
QString id()const;
/**
* sets the id
*/
void setId(const QString& id);
/**
* sets the uint id
*/
void setId(uint );
/**
* reutns the id as int
*/
uint idInt()const;
/**
* returns the version
*/
uint version()const;
/**
* sets the Version
*/
void setVersion(uint version );
/**
* copy operator
*/
- ProfileDescriptor &operator=( const ProfileDescriptor );
+ ProfileDescriptor &operator=( const ProfileDescriptor& );
/**
* operator==
*/
friend bool operator==(const ProfileDescriptor&, const ProfileDescriptor& );
+ private:
+ QString m_id;
+ uint m_idInt;
+ uint m_version;
};
/**
* Protocol Descriptor
*/
class ProtocolDescriptor {
public:
typedef QValueList<ProtocolDescriptor> ValueList;
/**
* c'tor
*/
ProtocolDescriptor();
/**
* name
* number
* channel/port
*/
ProtocolDescriptor(const QString&, uint, uint channel ); // Q_UINT8 ?
- ProtocolDescriptot(const ProtocolDescriptor& );
+ ProtocolDescriptor(const ProtocolDescriptor& );
~ProtocolDescriptor();
QString name()const;
void setName(const QString& );
uint id()const;
void setId(uint );
uint port()const;
void setPort(uint );
ProtocolDescriptor &operator=( const ProtocolDescriptor& );
- friend bool operator==( const ProtocolDescription&,
- const ProtocolDescription& );
+ friend bool operator==( const ProtocolDescriptor&,
+ const ProtocolDescriptor& );
+ private:
+ QString m_name;
+ uint m_number;
+ uint m_channel;
};
public:
typedef QValueList<Services> ValueList;
Services();
Services(const Services& service );
~Services();
Services &operator=( const Services& );
friend bool operator==(const Services&, const Services& );
QString serviceName()const;
void setServiceName( const QString& service );
int recHandle()const;
void setRecHandle( int );
QString classIdList()const;
void setClassIdList( const QString& );
int classIdListInt()const;
void setClassIdList(int );
void insertProtocolDescriptor(const ProtocolDescriptor& );
void clearProtocolDescriptorList();
void removeProtocolDescriptor( const ProtocolDescriptor& );
ProtocolDescriptor::ValueList protocolDescriptorList()const;
void insertProfileDescriptor( const ProfileDescriptor& );
void clearProfileDescriptorList();
void removeProfileDescriptor(const ProfileDescriptor& );
ProfileDescriptor::ValueList profileDescriptor()const;
};
};
#endif