summaryrefslogtreecommitdiff
path: root/libopie2/opiebluez
Side-by-side diff
Diffstat (limited to 'libopie2/opiebluez') (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
@@ -106,3 +106,3 @@ void OBluetooth::synchronize()
- if (ioctl( _fd, HCIGETDEVLIST, (void *) dl) == -1)
+ if (::ioctl( _fd, HCIGETDEVLIST, (void *) dl) == -1)
{
@@ -115,3 +115,3 @@ void OBluetooth::synchronize()
di.dev_id = ( dr + i )->dev_id;
- if ( ioctl( _fd, HCIGETDEVINFO, (void *) &di) == -1 )
+ if ( ::ioctl( _fd, HCIGETDEVINFO, (void *) &di ) == -1 )
{
@@ -121,3 +121,3 @@ void OBluetooth::synchronize()
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 ) );
}
@@ -132,13 +132,23 @@ 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 );
}
@@ -160,2 +170,23 @@ QString OBluetoothInterface::macAddress() const
+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
@@ -120,3 +120,3 @@ class OBluetoothInterface : public QObject
*/
- OBluetoothInterface( QObject* parent, const char* name, void* devinfo );
+ OBluetoothInterface( QObject* parent, const char* name, void* devinfo, int ctlfd );
/**
@@ -129,2 +129,10 @@ class OBluetoothInterface : public QObject
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;