summaryrefslogtreecommitdiff
path: root/libopie2
Side-by-side diff
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiebluez/obluetooth.cpp43
-rw-r--r--libopie2/opiebluez/obluetooth.h10
2 files changed, 46 insertions, 7 deletions
diff --git a/libopie2/opiebluez/obluetooth.cpp b/libopie2/opiebluez/obluetooth.cpp
index b5df96e..c99a822 100644
--- a/libopie2/opiebluez/obluetooth.cpp
+++ b/libopie2/opiebluez/obluetooth.cpp
@@ -101,49 +101,59 @@ void OBluetooth::synchronize()
return;
}
dl->dev_num = HCI_MAX_DEV;
dr = dl->dev_req;
- if (ioctl( _fd, HCIGETDEVLIST, (void *) dl) == -1)
+ if (::ioctl( _fd, HCIGETDEVLIST, (void *) dl) == -1)
{
owarn << "OBluetooth::synchronize() - can't complete HCIGETDEVLIST (" << strerror( errno ) << ")" << oendl;
return;
}
for ( int i = 0; i < dl->dev_num; ++i )
{
di.dev_id = ( dr + i )->dev_id;
- if ( ioctl( _fd, HCIGETDEVINFO, (void *) &di) == -1 )
+ if ( ::ioctl( _fd, HCIGETDEVINFO, (void *) &di ) == -1 )
{
owarn << "OBluetooth::synchronize() - can't issue HCIGETDEVINFO on device " << i << " (" << strerror( errno ) << ") - skipping that device. " << oendl;
continue;
}
odebug << "OBluetooth::synchronize() - found device #" << di.dev_id << oendl;
- _interfaces.insert( di.name, new OBluetoothInterface( this, di.name, (void*) &di ) );
+ _interfaces.insert( di.name, new OBluetoothInterface( this, di.name, (void*) &di, _fd ) );
}
}
/*======================================================================================
* OBluetoothInterface
*======================================================================================*/
class OBluetoothInterface::Private
{
public:
- Private( struct hci_dev_info* di )
+ Private( struct hci_dev_info* di, int fd )
{
::memcpy( &devinfo, di, sizeof(struct hci_dev_info) );
+ ctlfd = fd;
+ }
+ void reloadInfo()
+ {
+ int result = ::ioctl( ctlfd, HCIGETDEVINFO, (void *) &devinfo );
+ if ( result == -1 )
+ {
+ owarn << "OBluetoothInterface::Private - can't reload device info (" << strerror( errno ) << ")" << oendl;
+ }
}
struct hci_dev_info devinfo;
+ int ctlfd;
};
-OBluetoothInterface::OBluetoothInterface( QObject* parent, const char* name, void* devinfo )
+OBluetoothInterface::OBluetoothInterface( QObject* parent, const char* name, void* devinfo, int ctlfd )
:QObject( parent, name )
{
- d = new OBluetoothInterface::Private( (struct hci_dev_info*) devinfo );
+ d = new OBluetoothInterface::Private( (struct hci_dev_info*) devinfo, ctlfd );
}
OBluetoothInterface::~OBluetoothInterface()
{
}
@@ -155,9 +165,30 @@ QString OBluetoothInterface::macAddress() const
d->devinfo.bdaddr.b[3],
d->devinfo.bdaddr.b[2],
d->devinfo.bdaddr.b[1],
d->devinfo.bdaddr.b[0] );
}
+bool OBluetoothInterface::setUp( bool b )
+{
+ int cmd = b ? HCIDEVUP : HCIDEVDOWN;
+ int result = ::ioctl( d->ctlfd, cmd, d->devinfo.dev_id );
+ if ( result == -1 && errno != EALREADY )
+ {
+ owarn << "OBluetoothInterface::setUp( " << b << " ) - couldn't change interface state (" << strerror( errno ) << ")" << oendl;
+ return false;
+ }
+ else
+ {
+ d->reloadInfo();
+ return true;
+ }
+}
+
+bool OBluetoothInterface::isUp() const
+{
+ return hci_test_bit( HCI_UP, &d->devinfo.flags );
+}
+
}
}
diff --git a/libopie2/opiebluez/obluetooth.h b/libopie2/opiebluez/obluetooth.h
index 10c8c49..4423a55 100644
--- a/libopie2/opiebluez/obluetooth.h
+++ b/libopie2/opiebluez/obluetooth.h
@@ -115,21 +115,29 @@ class OBluetoothInterface : public QObject
{
public:
/**
* Constructor. Normally you don't create @ref OBluetoothInterface objects yourself,
* but access them via @ref OBluetooth::interface().
*/
- OBluetoothInterface( QObject* parent, const char* name, void* devinfo );
+ OBluetoothInterface( QObject* parent, const char* name, void* devinfo, int ctlfd );
/**
* Destructor.
*/
virtual ~OBluetoothInterface();
/**
* @return the MAC address of the interfaces
*/
QString macAddress() const;
+ /**
+ * Setting an interface to up enables it to receive packets.
+ */
+ bool setUp( bool );
+ /**
+ * @returns true if the interface is up.
+ */
+ bool isUp() const;
private:
class Private;
Private *d;
};