summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--examples/opiebluez/oblueztest/main.cpp3
-rw-r--r--libopie2/opiebluez/obluetooth.cpp43
-rw-r--r--libopie2/opiebluez/obluetooth.h10
3 files changed, 49 insertions, 7 deletions
diff --git a/examples/opiebluez/oblueztest/main.cpp b/examples/opiebluez/oblueztest/main.cpp
index 2e66d9a..361dbd8 100644
--- a/examples/opiebluez/oblueztest/main.cpp
+++ b/examples/opiebluez/oblueztest/main.cpp
@@ -1,20 +1,23 @@
1#include <opie2/odebug.h> 1#include <opie2/odebug.h>
2#include <opie2/obluetooth.h> 2#include <opie2/obluetooth.h>
3 3
4using namespace Opie::Core; 4using namespace Opie::Core;
5using namespace Opie::Bluez; 5using namespace Opie::Bluez;
6 6
7int main( int argc, char** argv ) 7int main( int argc, char** argv )
8{ 8{
9 OBluetooth* sys = OBluetooth::instance(); 9 OBluetooth* sys = OBluetooth::instance();
10 10
11 OBluetooth::InterfaceIterator it = sys->iterator(); 11 OBluetooth::InterfaceIterator it = sys->iterator();
12 12
13 while( it.current() ) 13 while( it.current() )
14 { 14 {
15 odebug << "APP: Bluetooth host controller interface '" << it.current()->name() << "' has MAC '" << it.current()->macAddress() << "'" << oendl; 15 odebug << "APP: Bluetooth host controller interface '" << it.current()->name() << "' has MAC '" << it.current()->macAddress() << "'" << oendl;
16 odebug << "APP: Interface is " << ( it.current()->isUp() ? "UP" : "DOWN" ) << ". Trying to toggle state..." << oendl;
17 it.current()->setUp( !it.current()->isUp() );
18 odebug << "APP: Interface is " << ( it.current()->isUp() ? "UP" : "DOWN" ) << "." << oendl;
16 ++it; 19 ++it;
17 } 20 }
18 return 0; 21 return 0;
19} 22}
20 23
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
@@ -43,121 +43,152 @@ using namespace Opie::Core;
43#include <sys/ioctl.h> 43#include <sys/ioctl.h>
44#include <sys/types.h> 44#include <sys/types.h>
45#include <sys/socket.h> 45#include <sys/socket.h>
46 46
47namespace Opie { 47namespace Opie {
48namespace Bluez { 48namespace Bluez {
49 49
50/*====================================================================================== 50/*======================================================================================
51 * OBluetooth 51 * OBluetooth
52 *======================================================================================*/ 52 *======================================================================================*/
53 53
54OBluetooth* OBluetooth::_instance = 0; 54OBluetooth* OBluetooth::_instance = 0;
55 55
56OBluetooth::OBluetooth() 56OBluetooth::OBluetooth()
57{ 57{
58 synchronize(); 58 synchronize();
59} 59}
60 60
61OBluetooth* OBluetooth::instance() 61OBluetooth* OBluetooth::instance()
62{ 62{
63 if ( !_instance ) _instance = new OBluetooth(); 63 if ( !_instance ) _instance = new OBluetooth();
64 return _instance; 64 return _instance;
65} 65}
66 66
67OBluetooth::InterfaceIterator OBluetooth::iterator() const 67OBluetooth::InterfaceIterator OBluetooth::iterator() const
68{ 68{
69 return OBluetooth::InterfaceIterator( _interfaces ); 69 return OBluetooth::InterfaceIterator( _interfaces );
70} 70}
71 71
72int OBluetooth::count() const 72int OBluetooth::count() const
73{ 73{
74 return _interfaces.count(); 74 return _interfaces.count();
75} 75}
76 76
77OBluetoothInterface* OBluetooth::interface( const QString& iface ) const 77OBluetoothInterface* OBluetooth::interface( const QString& iface ) const
78{ 78{
79 return _interfaces[iface]; 79 return _interfaces[iface];
80} 80}
81 81
82void OBluetooth::synchronize() 82void OBluetooth::synchronize()
83{ 83{
84 odebug << "OBluetooth::synchronize() - gathering available HCI devices" << oendl; 84 odebug << "OBluetooth::synchronize() - gathering available HCI devices" << oendl;
85 _interfaces.clear(); 85 _interfaces.clear();
86 86
87 _fd = ::socket( AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI ); 87 _fd = ::socket( AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI );
88 if ( _fd == -1 ) 88 if ( _fd == -1 )
89 { 89 {
90 owarn << "OBluetooth::synchronize() - can't open HCI control socket (" << strerror( errno ) << ")" << oendl; 90 owarn << "OBluetooth::synchronize() - can't open HCI control socket (" << strerror( errno ) << ")" << oendl;
91 return; 91 return;
92 } 92 }
93 93
94 struct hci_dev_list_req *dl; 94 struct hci_dev_list_req *dl;
95 struct hci_dev_req *dr; 95 struct hci_dev_req *dr;
96 struct hci_dev_info di; 96 struct hci_dev_info di;
97 97
98 if (!(dl = (struct hci_dev_list_req*)malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)))) 98 if (!(dl = (struct hci_dev_list_req*)malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t))))
99 { 99 {
100 ofatal << "OBluetooth::synchronize() - can't allocate memory for HCI request" << oendl; 100 ofatal << "OBluetooth::synchronize() - can't allocate memory for HCI request" << oendl;
101 return; 101 return;
102 } 102 }
103 103
104 dl->dev_num = HCI_MAX_DEV; 104 dl->dev_num = HCI_MAX_DEV;
105 dr = dl->dev_req; 105 dr = dl->dev_req;
106 106
107 if (ioctl( _fd, HCIGETDEVLIST, (void *) dl) == -1) 107 if (::ioctl( _fd, HCIGETDEVLIST, (void *) dl) == -1)
108 { 108 {
109 owarn << "OBluetooth::synchronize() - can't complete HCIGETDEVLIST (" << strerror( errno ) << ")" << oendl; 109 owarn << "OBluetooth::synchronize() - can't complete HCIGETDEVLIST (" << strerror( errno ) << ")" << oendl;
110 return; 110 return;
111 } 111 }
112 112
113 for ( int i = 0; i < dl->dev_num; ++i ) 113 for ( int i = 0; i < dl->dev_num; ++i )
114 { 114 {
115 di.dev_id = ( dr + i )->dev_id; 115 di.dev_id = ( dr + i )->dev_id;
116 if ( ioctl( _fd, HCIGETDEVINFO, (void *) &di) == -1 ) 116 if ( ::ioctl( _fd, HCIGETDEVINFO, (void *) &di ) == -1 )
117 { 117 {
118 owarn << "OBluetooth::synchronize() - can't issue HCIGETDEVINFO on device " << i << " (" << strerror( errno ) << ") - skipping that device. " << oendl; 118 owarn << "OBluetooth::synchronize() - can't issue HCIGETDEVINFO on device " << i << " (" << strerror( errno ) << ") - skipping that device. " << oendl;
119 continue; 119 continue;
120 } 120 }
121 odebug << "OBluetooth::synchronize() - found device #" << di.dev_id << oendl; 121 odebug << "OBluetooth::synchronize() - found device #" << di.dev_id << oendl;
122 _interfaces.insert( di.name, new OBluetoothInterface( this, di.name, (void*) &di ) ); 122 _interfaces.insert( di.name, new OBluetoothInterface( this, di.name, (void*) &di, _fd ) );
123 } 123 }
124} 124}
125 125
126/*====================================================================================== 126/*======================================================================================
127 * OBluetoothInterface 127 * OBluetoothInterface
128 *======================================================================================*/ 128 *======================================================================================*/
129 129
130class OBluetoothInterface::Private 130class OBluetoothInterface::Private
131{ 131{
132 public: 132 public:
133 Private( struct hci_dev_info* di ) 133 Private( struct hci_dev_info* di, int fd )
134 { 134 {
135 ::memcpy( &devinfo, di, sizeof(struct hci_dev_info) ); 135 ::memcpy( &devinfo, di, sizeof(struct hci_dev_info) );
136 ctlfd = fd;
137 }
138 void reloadInfo()
139 {
140 int result = ::ioctl( ctlfd, HCIGETDEVINFO, (void *) &devinfo );
141 if ( result == -1 )
142 {
143 owarn << "OBluetoothInterface::Private - can't reload device info (" << strerror( errno ) << ")" << oendl;
144 }
136 } 145 }
137 struct hci_dev_info devinfo; 146 struct hci_dev_info devinfo;
147 int ctlfd;
138}; 148};
139 149
140OBluetoothInterface::OBluetoothInterface( QObject* parent, const char* name, void* devinfo ) 150OBluetoothInterface::OBluetoothInterface( QObject* parent, const char* name, void* devinfo, int ctlfd )
141 :QObject( parent, name ) 151 :QObject( parent, name )
142{ 152{
143 d = new OBluetoothInterface::Private( (struct hci_dev_info*) devinfo ); 153 d = new OBluetoothInterface::Private( (struct hci_dev_info*) devinfo, ctlfd );
144} 154}
145 155
146OBluetoothInterface::~OBluetoothInterface() 156OBluetoothInterface::~OBluetoothInterface()
147{ 157{
148} 158}
149 159
150QString OBluetoothInterface::macAddress() const 160QString OBluetoothInterface::macAddress() const
151{ 161{
152 return QString().sprintf( "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X", 162 return QString().sprintf( "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
153 d->devinfo.bdaddr.b[5], 163 d->devinfo.bdaddr.b[5],
154 d->devinfo.bdaddr.b[4], 164 d->devinfo.bdaddr.b[4],
155 d->devinfo.bdaddr.b[3], 165 d->devinfo.bdaddr.b[3],
156 d->devinfo.bdaddr.b[2], 166 d->devinfo.bdaddr.b[2],
157 d->devinfo.bdaddr.b[1], 167 d->devinfo.bdaddr.b[1],
158 d->devinfo.bdaddr.b[0] ); 168 d->devinfo.bdaddr.b[0] );
159} 169}
160 170
171bool OBluetoothInterface::setUp( bool b )
172{
173 int cmd = b ? HCIDEVUP : HCIDEVDOWN;
174 int result = ::ioctl( d->ctlfd, cmd, d->devinfo.dev_id );
175 if ( result == -1 && errno != EALREADY )
176 {
177 owarn << "OBluetoothInterface::setUp( " << b << " ) - couldn't change interface state (" << strerror( errno ) << ")" << oendl;
178 return false;
179 }
180 else
181 {
182 d->reloadInfo();
183 return true;
184 }
185}
186
187bool OBluetoothInterface::isUp() const
188{
189 return hci_test_bit( HCI_UP, &d->devinfo.flags );
190}
191
161} 192}
162} 193}
163 194
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
@@ -57,85 +57,93 @@ class OBluetooth : public QObject
57 /** 57 /**
58 * @returns the number of available interfaces 58 * @returns the number of available interfaces
59 */ 59 */
60 int count() const; 60 int count() const;
61 /** 61 /**
62 * @returns a pointer to the (one and only) @ref OBluetooth instance. 62 * @returns a pointer to the (one and only) @ref OBluetooth instance.
63 */ 63 */
64 static OBluetooth* instance(); 64 static OBluetooth* instance();
65 /** 65 /**
66 * @returns an iterator usable for iterating through all network interfaces. 66 * @returns an iterator usable for iterating through all network interfaces.
67 */ 67 */
68 InterfaceIterator iterator() const; 68 InterfaceIterator iterator() const;
69 /** 69 /**
70 * @returns true, if the @a interface is present. 70 * @returns true, if the @a interface is present.
71 */ 71 */
72 bool isPresent( const char* interface ) const; 72 bool isPresent( const char* interface ) const;
73 /** 73 /**
74 * @returns true, if the @a interface supports the wireless extension protocol. 74 * @returns true, if the @a interface supports the wireless extension protocol.
75 */ 75 */
76 bool isWirelessInterface( const char* interface ) const; 76 bool isWirelessInterface( const char* interface ) const;
77 /** 77 /**
78 * @returns a pointer to the @ref OBluetoothInterface object for the specified @a interface or 0, if not found. 78 * @returns a pointer to the @ref OBluetoothInterface object for the specified @a interface or 0, if not found.
79 * @see OBluetoothInterface 79 * @see OBluetoothInterface
80 */ 80 */
81 OBluetoothInterface* interface( const QString& interface ) const; 81 OBluetoothInterface* interface( const QString& interface ) const;
82 /** 82 /**
83 * @internal Rebuild the internal interface database 83 * @internal Rebuild the internal interface database
84 * @note Sometimes it might be useful to call this from client code, 84 * @note Sometimes it might be useful to call this from client code,
85 * e.g. after issuing a cardctl insert 85 * e.g. after issuing a cardctl insert
86 */ 86 */
87 void synchronize(); 87 void synchronize();
88 88
89 protected: 89 protected:
90 OBluetooth(); 90 OBluetooth();
91 91
92 private: 92 private:
93 static OBluetooth* _instance; 93 static OBluetooth* _instance;
94 InterfaceMap _interfaces; 94 InterfaceMap _interfaces;
95 class OBluetoothPrivate; 95 class OBluetoothPrivate;
96 OBluetoothPrivate *d; 96 OBluetoothPrivate *d;
97 int _fd; 97 int _fd;
98}; 98};
99 99
100/*====================================================================================== 100/*======================================================================================
101 * OBluetoothInterface 101 * OBluetoothInterface
102 *======================================================================================*/ 102 *======================================================================================*/
103 103
104/** 104/**
105 * @brief An bluetooth interface wrapper. 105 * @brief An bluetooth interface wrapper.
106 * 106 *
107 * This class provides a wrapper for an infrared interface. All the cumbersome details of 107 * This class provides a wrapper for an infrared interface. All the cumbersome details of
108 * Linux ioctls are hidden under a convenient high-level interface. 108 * Linux ioctls are hidden under a convenient high-level interface.
109 * @warning Most of the setting methods contained in this class require the appropriate 109 * @warning Most of the setting methods contained in this class require the appropriate
110 * process permissions to work. 110 * process permissions to work.
111 * 111 *
112 * @author Michael 'Mickey' Lauer <mickey@vanille.de> 112 * @author Michael 'Mickey' Lauer <mickey@vanille.de>
113 */ 113 */
114class OBluetoothInterface : public QObject 114class OBluetoothInterface : public QObject
115{ 115{
116 public: 116 public:
117 /** 117 /**
118 * Constructor. Normally you don't create @ref OBluetoothInterface objects yourself, 118 * Constructor. Normally you don't create @ref OBluetoothInterface objects yourself,
119 * but access them via @ref OBluetooth::interface(). 119 * but access them via @ref OBluetooth::interface().
120 */ 120 */
121 OBluetoothInterface( QObject* parent, const char* name, void* devinfo ); 121 OBluetoothInterface( QObject* parent, const char* name, void* devinfo, int ctlfd );
122 /** 122 /**
123 * Destructor. 123 * Destructor.
124 */ 124 */
125 virtual ~OBluetoothInterface(); 125 virtual ~OBluetoothInterface();
126 /** 126 /**
127 * @return the MAC address of the interfaces 127 * @return the MAC address of the interfaces
128 */ 128 */
129 QString macAddress() const; 129 QString macAddress() const;
130 /**
131 * Setting an interface to up enables it to receive packets.
132 */
133 bool setUp( bool );
134 /**
135 * @returns true if the interface is up.
136 */
137 bool isUp() const;
130 138
131 private: 139 private:
132 class Private; 140 class Private;
133 Private *d; 141 Private *d;
134}; 142};
135 143
136 144
137 145
138} 146}
139} 147}
140#endif 148#endif
141 149