-rw-r--r-- | examples/examples.pro | 2 | ||||
-rw-r--r-- | libopie2/libopie2.pro | 2 | ||||
-rw-r--r-- | libopie2/opiebluez/.cvsignore | 6 | ||||
-rw-r--r-- | libopie2/opiebluez/config.in | 7 | ||||
-rw-r--r-- | libopie2/opiebluez/obluetooth.cpp | 161 | ||||
-rw-r--r-- | libopie2/opiebluez/obluetooth.h | 141 | ||||
-rw-r--r-- | libopie2/opiebluez/opiebluez.pro | 29 |
7 files changed, 346 insertions, 2 deletions
diff --git a/examples/examples.pro b/examples/examples.pro index fd83a9b..864ab67 100644 --- a/examples/examples.pro +++ b/examples/examples.pro | |||
@@ -14,5 +14,5 @@ SUBDIRS = applet \ | |||
14 | opiemm \ | 14 | opiemm \ |
15 | opienet \ | 15 | opienet \ |
16 | opieui \ | 16 | opieui \ |
17 | opieshower | 17 | opiebluez |
18 | 18 | ||
diff --git a/libopie2/libopie2.pro b/libopie2/libopie2.pro index f131a9b..964caca 100644 --- a/libopie2/libopie2.pro +++ b/libopie2/libopie2.pro | |||
@@ -1,5 +1,5 @@ | |||
1 | TEMPLATE = subdirs | 1 | TEMPLATE = subdirs |
2 | unix:SUBDIRS = opiecore opiedb opiepim opieui opienet opiemm opiesecurity opieshower | 2 | unix:SUBDIRS = opiecore opiedb opiepim opieui opienet opiemm opiesecurity opiebluez |
3 | 3 | ||
4 | !contains( platform, x11 ) { | 4 | !contains( platform, x11 ) { |
5 | message( Configuring libopie2 for build on Opie ) | 5 | message( Configuring libopie2 for build on Opie ) |
diff --git a/libopie2/opiebluez/.cvsignore b/libopie2/opiebluez/.cvsignore new file mode 100644 index 0000000..972e959 --- a/dev/null +++ b/libopie2/opiebluez/.cvsignore | |||
@@ -0,0 +1,6 @@ | |||
1 | Makefile* | ||
2 | moc* | ||
3 | *moc | ||
4 | *.o | ||
5 | ~* | ||
6 | obj | ||
diff --git a/libopie2/opiebluez/config.in b/libopie2/opiebluez/config.in new file mode 100644 index 0000000..502181b --- a/dev/null +++ b/libopie2/opiebluez/config.in | |||
@@ -0,0 +1,7 @@ | |||
1 | config LIBOPIE2BLUEZ | ||
2 | boolean "libopie2bluez (Linux Bluetooth subsystem BlueZ related classes)" | ||
3 | default "y" | ||
4 | depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBBLUEZ_DEP | ||
5 | comment "libopie2net needs a libqpe, libopie2core, and libbluez" | ||
6 | depends !(( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBBLUEZ_DEP) | ||
7 | |||
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> | ||
34 | using 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 | |||
47 | namespace Opie { | ||
48 | namespace Shower { | ||
49 | |||
50 | /*====================================================================================== | ||
51 | * OBluetooth | ||
52 | *======================================================================================*/ | ||
53 | |||
54 | OBluetooth* OBluetooth::_instance = 0; | ||
55 | |||
56 | OBluetooth::OBluetooth() | ||
57 | { | ||
58 | synchronize(); | ||
59 | } | ||
60 | |||
61 | OBluetooth* OBluetooth::instance() | ||
62 | { | ||
63 | if ( !_instance ) _instance = new OBluetooth(); | ||
64 | return _instance; | ||
65 | } | ||
66 | |||
67 | OBluetooth::InterfaceIterator OBluetooth::iterator() const | ||
68 | { | ||
69 | return OBluetooth::InterfaceIterator( _interfaces ); | ||
70 | } | ||
71 | |||
72 | int OBluetooth::count() const | ||
73 | { | ||
74 | return _interfaces.count(); | ||
75 | } | ||
76 | |||
77 | OBluetoothInterface* OBluetooth::interface( const QString& iface ) const | ||
78 | { | ||
79 | return _interfaces[iface]; | ||
80 | } | ||
81 | |||
82 | void 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 | |||
133 | class 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 | |||
143 | OBluetoothInterface::OBluetoothInterface( QObject* parent, const char* name, void* devinfo ) | ||
144 | { | ||
145 | d = new OBluetoothInterface::Private( (struct hci_dev_info*) devinfo ); | ||
146 | } | ||
147 | |||
148 | OBluetoothInterface::~OBluetoothInterface() | ||
149 | { | ||
150 | } | ||
151 | |||
152 | QString OBluetoothInterface::macAddress() const | ||
153 | { | ||
154 | char addr[18]; | ||
155 | ba2str( &d->devinfo.bdaddr, addr); | ||
156 | return addr; | ||
157 | } | ||
158 | |||
159 | } | ||
160 | } | ||
161 | |||
diff --git a/libopie2/opiebluez/obluetooth.h b/libopie2/opiebluez/obluetooth.h new file mode 100644 index 0000000..30fdd18 --- a/dev/null +++ b/libopie2/opiebluez/obluetooth.h | |||
@@ -0,0 +1,141 @@ | |||
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 | #ifndef OBLUETOOTH_H | ||
31 | #define OBLUETOOTH_H | ||
32 | |||
33 | #include <qobject.h> | ||
34 | #include <qdict.h> | ||
35 | |||
36 | namespace Opie { | ||
37 | namespace Shower { | ||
38 | |||
39 | class OBluetoothInterface; | ||
40 | |||
41 | /** | ||
42 | * @brief A container class for all bluetooth interfaces | ||
43 | * | ||
44 | * This class provides access to all available bluetooth interfaces of your computer. | ||
45 | * | ||
46 | * @author Michael 'Mickey' Lauer <mickey@vanille.de> | ||
47 | */ | ||
48 | class OBluetooth : public QObject | ||
49 | { | ||
50 | Q_OBJECT | ||
51 | |||
52 | public: | ||
53 | typedef QDict<OBluetoothInterface> InterfaceMap; | ||
54 | typedef QDictIterator<OBluetoothInterface> InterfaceIterator; | ||
55 | |||
56 | public: | ||
57 | /** | ||
58 | * @returns the number of available interfaces | ||
59 | */ | ||
60 | int count() const; | ||
61 | /** | ||
62 | * @returns a pointer to the (one and only) @ref OBluetooth instance. | ||
63 | */ | ||
64 | static OBluetooth* instance(); | ||
65 | /** | ||
66 | * @returns an iterator usable for iterating through all network interfaces. | ||
67 | */ | ||
68 | InterfaceIterator iterator() const; | ||
69 | /** | ||
70 | * @returns true, if the @a interface is present. | ||
71 | */ | ||
72 | bool isPresent( const char* interface ) const; | ||
73 | /** | ||
74 | * @returns true, if the @a interface supports the wireless extension protocol. | ||
75 | */ | ||
76 | bool isWirelessInterface( const char* interface ) const; | ||
77 | /** | ||
78 | * @returns a pointer to the @ref OBluetoothInterface object for the specified @a interface or 0, if not found. | ||
79 | * @see OBluetoothInterface | ||
80 | */ | ||
81 | OBluetoothInterface* interface( const QString& interface ) const; | ||
82 | /** | ||
83 | * @internal Rebuild the internal interface database | ||
84 | * @note Sometimes it might be useful to call this from client code, | ||
85 | * e.g. after issuing a cardctl insert | ||
86 | */ | ||
87 | void synchronize(); | ||
88 | |||
89 | protected: | ||
90 | OBluetooth(); | ||
91 | |||
92 | private: | ||
93 | static OBluetooth* _instance; | ||
94 | InterfaceMap _interfaces; | ||
95 | class OBluetoothPrivate; | ||
96 | OBluetoothPrivate *d; | ||
97 | int _fd; | ||
98 | }; | ||
99 | |||
100 | /*====================================================================================== | ||
101 | * OBluetoothInterface | ||
102 | *======================================================================================*/ | ||
103 | |||
104 | /** | ||
105 | * @brief An bluetooth interface wrapper. | ||
106 | * | ||
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. | ||
109 | * @warning Most of the setting methods contained in this class require the appropriate | ||
110 | * process permissions to work. | ||
111 | * | ||
112 | * @author Michael 'Mickey' Lauer <mickey@vanille.de> | ||
113 | */ | ||
114 | class OBluetoothInterface : public QObject | ||
115 | { | ||
116 | public: | ||
117 | /** | ||
118 | * Constructor. Normally you don't create @ref OBluetoothInterface objects yourself, | ||
119 | * but access them via @ref OBluetooth::interface(). | ||
120 | */ | ||
121 | OBluetoothInterface( QObject* parent, const char* name, void* devinfo ); | ||
122 | /** | ||
123 | * Destructor. | ||
124 | */ | ||
125 | virtual ~OBluetoothInterface(); | ||
126 | /** | ||
127 | * @return the MAC address of the interfaces | ||
128 | */ | ||
129 | QString macAddress() const; | ||
130 | |||
131 | private: | ||
132 | class Private; | ||
133 | Private *d; | ||
134 | }; | ||
135 | |||
136 | |||
137 | |||
138 | } | ||
139 | } | ||
140 | #endif | ||
141 | |||
diff --git a/libopie2/opiebluez/opiebluez.pro b/libopie2/opiebluez/opiebluez.pro new file mode 100644 index 0000000..bcd2df2 --- a/dev/null +++ b/libopie2/opiebluez/opiebluez.pro | |||
@@ -0,0 +1,29 @@ | |||
1 | TEMPLATE = lib | ||
2 | CONFIG += qt warn_on | ||
3 | DESTDIR = $(OPIEDIR)/lib | ||
4 | HEADERS = obluetooth.h \ | ||
5 | oinfrared.h | ||
6 | SOURCES = obluetooth.cpp \ | ||
7 | oinfrared.cpp | ||
8 | INTERFACES = | ||
9 | TARGET = opieshower2 | ||
10 | VERSION = 0.0.0 | ||
11 | INCLUDEPATH += $(OPIEDIR)/include | ||
12 | DEPENDPATH += $(OPIEDIR)/include | ||
13 | LIBS += -lopiecore2 -lbluetooth | ||
14 | |||
15 | !contains( platform, x11 ) { | ||
16 | include( $(OPIEDIR)/include.pro ) | ||
17 | } | ||
18 | |||
19 | contains( platform, x11 ) { | ||
20 | LIBS += -L$(OPIEDIR)/lib -Wl,-rpath,$(OPIEDIR)/lib | ||
21 | } | ||
22 | |||
23 | !isEmpty( LIBBLUEZ_INC_DIR ) { | ||
24 | INCLUDEPATH = $$LIBBLUEZ_INC_DIR $$INCLUDEPATH | ||
25 | } | ||
26 | !isEmpty( LIBBLUEZ_LIB_DIR ) { | ||
27 | LIBS = -L$$LIBBLUEZ_LIB_DIR $$LIBS | ||
28 | } | ||
29 | |||