summaryrefslogtreecommitdiff
path: root/libopie2/opiebluez/obluetooth.cpp
Unidiff
Diffstat (limited to 'libopie2/opiebluez/obluetooth.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiebluez/obluetooth.cpp161
1 files changed, 161 insertions, 0 deletions
diff --git a/libopie2/opiebluez/obluetooth.cpp b/libopie2/opiebluez/obluetooth.cpp
new file mode 100644
index 0000000..a161f86
--- a/dev/null
+++ b/libopie2/opiebluez/obluetooth.cpp
@@ -0,0 +1,161 @@
1/*
2 This file is part of the Opie Project
3 Copyright (C) 2005 Michael 'Mickey' Lauer <mickey@Vanille.de>
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l.
6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; version 2 of the license.
12     ._= =}       :
13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details.
21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA.
28*/
29
30#include "obluetooth.h"
31
32/* OPIE */
33#include <opie2/odebug.h>
34using namespace Opie::Core;
35
36/* STD */
37#include <bluetooth/bluetooth.h>
38#include <bluetooth/hci.h>
39#include <bluetooth/hci_lib.h>
40#include <errno.h>
41#include <stdlib.h>
42#include <string.h>
43#include <sys/ioctl.h>
44#include <sys/types.h>
45#include <sys/socket.h>
46
47namespace Opie {
48namespace Shower {
49
50/*======================================================================================
51 * OBluetooth
52 *======================================================================================*/
53
54OBluetooth* OBluetooth::_instance = 0;
55
56OBluetooth::OBluetooth()
57{
58 synchronize();
59}
60
61OBluetooth* OBluetooth::instance()
62{
63 if ( !_instance ) _instance = new OBluetooth();
64 return _instance;
65}
66
67OBluetooth::InterfaceIterator OBluetooth::iterator() const
68{
69 return OBluetooth::InterfaceIterator( _interfaces );
70}
71
72int OBluetooth::count() const
73{
74 return _interfaces.count();
75}
76
77OBluetoothInterface* OBluetooth::interface( const QString& iface ) const
78{
79 return _interfaces[iface];
80}
81
82void OBluetooth::synchronize()
83{
84 odebug << "OBluetooth::synchronize() - gathering available HCI devices" << oendl;
85 _interfaces.clear();
86
87 _fd = ::socket( AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI );
88 if ( _fd == -1 )
89 {
90 owarn << "OBluetooth::synchronize() - can't open HCI control socket (" << strerror( errno ) << ")" << oendl;
91 return;
92 }
93
94 struct hci_dev_list_req *dl;
95 struct hci_dev_req *dr;
96 struct hci_dev_info di;
97
98 if (!(dl = (struct hci_dev_list_req*)malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t))))
99 {
100 ofatal << "OBluetooth::synchronize() - can't allocate memory for HCI request" << oendl;
101 return;
102 }
103
104 dl->dev_num = HCI_MAX_DEV;
105 dr = dl->dev_req;
106
107 if (ioctl( _fd, HCIGETDEVLIST, (void *) dl) == -1)
108 {
109 owarn << "OBluetooth::synchronize() - can't complete HCIGETDEVLIST (" << strerror( errno ) << ")" << oendl;
110 return;
111 }
112
113 for ( int i = 0; i < dl->dev_num; ++i )
114 {
115 di.dev_id = ( dr + i )->dev_id;
116 if ( ioctl( _fd, HCIGETDEVINFO, (void *) &di) < 0 )
117 continue;
118 if ( hci_test_bit(HCI_RAW, &di.flags) && !bacmp(&di.bdaddr, BDADDR_ANY))
119 {
120 int dd = hci_open_dev(di.dev_id);
121 hci_read_bd_addr(dd, &di.bdaddr, 1000);
122 hci_close_dev(dd);
123 }
124 odebug << "OBluetooth::synchronize() - found device #" << di.dev_id << oendl;
125 _interfaces.insert( di.name, new OBluetoothInterface( this, di.name, (void*) &di ) );
126 }
127}
128
129/*======================================================================================
130 * OBluetoothInterface
131 *======================================================================================*/
132
133class OBluetoothInterface::Private
134{
135 public:
136 Private( struct hci_dev_info* di )
137 {
138 ::memcpy( &devinfo, di, sizeof(struct hci_dev_info) );
139 }
140 struct hci_dev_info devinfo;
141};
142
143OBluetoothInterface::OBluetoothInterface( QObject* parent, const char* name, void* devinfo )
144{
145 d = new OBluetoothInterface::Private( (struct hci_dev_info*) devinfo );
146}
147
148OBluetoothInterface::~OBluetoothInterface()
149{
150}
151
152QString OBluetoothInterface::macAddress() const
153{
154 char addr[18];
155 ba2str( &d->devinfo.bdaddr, addr);
156 return addr;
157}
158
159}
160}
161