-rw-r--r-- | noncore/net/opietooth/lib/manager.cc | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/noncore/net/opietooth/lib/manager.cc b/noncore/net/opietooth/lib/manager.cc index 2234333..e07f9da 100644 --- a/noncore/net/opietooth/lib/manager.cc +++ b/noncore/net/opietooth/lib/manager.cc | |||
@@ -1,291 +1,299 @@ | |||
1 | 1 | ||
2 | 2 | ||
3 | #include <opie/oprocess.h> | 3 | #include <opie/oprocess.h> |
4 | 4 | ||
5 | #include "parser.h" | 5 | #include "parser.h" |
6 | #include "manager.h" | 6 | #include "manager.h" |
7 | 7 | ||
8 | 8 | ||
9 | using namespace OpieTooth; | 9 | using namespace OpieTooth; |
10 | 10 | ||
11 | Manager::Manager( const QString& dev ) | 11 | Manager::Manager( const QString& dev ) |
12 | : QObject() | 12 | : QObject() |
13 | { | 13 | { |
14 | qWarning("created"); | 14 | qWarning("created"); |
15 | m_device = dev; | 15 | m_device = dev; |
16 | m_hcitool = 0; | 16 | m_hcitool = 0; |
17 | m_sdp = 0; | 17 | m_sdp = 0; |
18 | } | 18 | } |
19 | Manager::Manager( Device* /*dev*/ ) | 19 | Manager::Manager( Device* /*dev*/ ) |
20 | : QObject() | 20 | : QObject() |
21 | { | 21 | { |
22 | m_hcitool = 0; | 22 | m_hcitool = 0; |
23 | m_sdp = 0; | 23 | m_sdp = 0; |
24 | } | 24 | } |
25 | Manager::Manager() | 25 | Manager::Manager() |
26 | : QObject() | 26 | : QObject() |
27 | { | 27 | { |
28 | m_hcitool = 0; | 28 | m_hcitool = 0; |
29 | m_sdp = 0; | 29 | m_sdp = 0; |
30 | } | 30 | } |
31 | Manager::~Manager(){ | 31 | Manager::~Manager(){ |
32 | delete m_hcitool; | 32 | delete m_hcitool; |
33 | delete m_sdp; | 33 | delete m_sdp; |
34 | } | 34 | } |
35 | void Manager::setDevice( const QString& dev ){ | 35 | void Manager::setDevice( const QString& dev ){ |
36 | m_device = dev; | 36 | m_device = dev; |
37 | } | 37 | } |
38 | void Manager::setDevice( Device* /*dev*/ ){ | 38 | void Manager::setDevice( Device* /*dev*/ ){ |
39 | 39 | ||
40 | } | 40 | } |
41 | void Manager::isAvailable( const QString& device ){ | 41 | void Manager::isAvailable( const QString& device ){ |
42 | OProcess* l2ping = new OProcess(); | 42 | OProcess* l2ping = new OProcess(); |
43 | l2ping->setName( device.latin1() ); | 43 | l2ping->setName( device.latin1() ); |
44 | *l2ping << "l2ping" << "-c1" << device; | 44 | *l2ping << "l2ping" << "-c1" << device; |
45 | connect(l2ping, SIGNAL(processExited(OProcess* ) ), | 45 | connect(l2ping, SIGNAL(processExited(OProcess* ) ), |
46 | this, SLOT(slotProcessExited(OProcess*) ) ); | 46 | this, SLOT(slotProcessExited(OProcess*) ) ); |
47 | if (!l2ping->start() ) { | 47 | if (!l2ping->start() ) { |
48 | emit available( device, false ); | 48 | emit available( device, false ); |
49 | delete l2ping; | 49 | delete l2ping; |
50 | } | 50 | } |
51 | 51 | ||
52 | } | 52 | } |
53 | 53 | ||
54 | void Manager::isAvailable( Device* /*dev*/ ){ | 54 | void Manager::isAvailable( Device* /*dev*/ ){ |
55 | 55 | ||
56 | 56 | ||
57 | } | 57 | } |
58 | void Manager::searchDevices( const QString& device ){ | 58 | void Manager::searchDevices( const QString& device ){ |
59 | qWarning("search devices"); | 59 | qWarning("search devices"); |
60 | OProcess* hcitool = new OProcess(); | 60 | OProcess* hcitool = new OProcess(); |
61 | hcitool->setName( device.isEmpty() ? "hci0" : device.latin1() ); | 61 | hcitool->setName( device.isEmpty() ? "hci0" : device.latin1() ); |
62 | *hcitool << "hcitool" << "scan"; | 62 | *hcitool << "hcitool" << "scan"; |
63 | connect( hcitool, SIGNAL(processExited(OProcess*) ) , | 63 | connect( hcitool, SIGNAL(processExited(OProcess*) ) , |
64 | this, SLOT(slotHCIExited(OProcess* ) ) ); | 64 | this, SLOT(slotHCIExited(OProcess* ) ) ); |
65 | connect( hcitool, SIGNAL(receivedStdout(OProcess*, char*, int ) ), | 65 | connect( hcitool, SIGNAL(receivedStdout(OProcess*, char*, int ) ), |
66 | this, SLOT(slotHCIOut(OProcess*, char*, int ) ) ); | 66 | this, SLOT(slotHCIOut(OProcess*, char*, int ) ) ); |
67 | if (!hcitool->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { | 67 | if (!hcitool->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { |
68 | qWarning("could not start"); | 68 | qWarning("could not start"); |
69 | RemoteDevice::ValueList list; | 69 | RemoteDevice::ValueList list; |
70 | emit foundDevices( device, list ); | 70 | emit foundDevices( device, list ); |
71 | delete hcitool; | 71 | delete hcitool; |
72 | } | 72 | } |
73 | } | 73 | } |
74 | 74 | ||
75 | void Manager::searchDevices(Device* /*d*/ ){ | 75 | void Manager::searchDevices(Device* /*d*/ ){ |
76 | 76 | ||
77 | 77 | ||
78 | } | 78 | } |
79 | void Manager::addService(const QString& name ){ | 79 | void Manager::addService(const QString& name ){ |
80 | OProcess proc; | 80 | OProcess proc; |
81 | proc << "sdptool" << "add" << name; | 81 | proc << "sdptool" << "add" << name; |
82 | bool bo = true; | 82 | bool bo = true; |
83 | if (!proc.start(OProcess::DontCare ) ) | 83 | if (!proc.start(OProcess::DontCare ) ) |
84 | bo = false; | 84 | bo = false; |
85 | emit addedService( name, bo ); | 85 | emit addedService( name, bo ); |
86 | } | 86 | } |
87 | void Manager::addServices(const QStringList& list){ | 87 | void Manager::addServices(const QStringList& list){ |
88 | QStringList::ConstIterator it; | 88 | QStringList::ConstIterator it; |
89 | for (it = list.begin(); it != list.end(); ++it ) | 89 | for (it = list.begin(); it != list.end(); ++it ) |
90 | addService( (*it) ); | 90 | addService( (*it) ); |
91 | } | 91 | } |
92 | void Manager::removeService( const QString& name ){ | 92 | void Manager::removeService( const QString& name ){ |
93 | OProcess prc; | 93 | OProcess prc; |
94 | prc << "sdptool" << "del" << name; | 94 | prc << "sdptool" << "del" << name; |
95 | bool bo = true; | 95 | bool bo = true; |
96 | if (!prc.start(OProcess::DontCare ) ) | 96 | if (!prc.start(OProcess::DontCare ) ) |
97 | bo = false; | 97 | bo = false; |
98 | emit removedService( name, bo ); | 98 | emit removedService( name, bo ); |
99 | } | 99 | } |
100 | void Manager::removeServices( const QStringList& list){ | 100 | void Manager::removeServices( const QStringList& list){ |
101 | QStringList::ConstIterator it; | 101 | QStringList::ConstIterator it; |
102 | for (it = list.begin(); it != list.end(); ++it ) | 102 | for (it = list.begin(); it != list.end(); ++it ) |
103 | removeService( (*it) ); | 103 | removeService( (*it) ); |
104 | } | 104 | } |
105 | void Manager::searchServices( const QString& remDevice ){ | 105 | void Manager::searchServices( const QString& remDevice ){ |
106 | OProcess *m_sdp =new OProcess(); | 106 | OProcess *m_sdp =new OProcess(); |
107 | *m_sdp << "sdptool" << "browse" << remDevice; | 107 | *m_sdp << "sdptool" << "browse" << remDevice; |
108 | m_sdp->setName( remDevice.latin1() ); | 108 | m_sdp->setName( remDevice.latin1() ); |
109 | qWarning("search Services for %s", remDevice.latin1() ); | 109 | qWarning("search Services for %s", remDevice.latin1() ); |
110 | connect(m_sdp, SIGNAL(processExited(OProcess*) ), | 110 | connect(m_sdp, SIGNAL(processExited(OProcess*) ), |
111 | this, SLOT(slotSDPExited(OProcess* ) ) ); | 111 | this, SLOT(slotSDPExited(OProcess* ) ) ); |
112 | connect(m_sdp, SIGNAL(receivedStdout(OProcess*, char*, int ) ), | 112 | connect(m_sdp, SIGNAL(receivedStdout(OProcess*, char*, int ) ), |
113 | this, SLOT(slotSDPOut(OProcess*, char*, int) ) ); | 113 | this, SLOT(slotSDPOut(OProcess*, char*, int) ) ); |
114 | if (!m_sdp->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { | 114 | if (!m_sdp->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { |
115 | qWarning("could not start sdptool" ); | 115 | qWarning("could not start sdptool" ); |
116 | delete m_sdp; | 116 | delete m_sdp; |
117 | Services::ValueList list; | 117 | Services::ValueList list; |
118 | emit foundServices( remDevice, list ); | 118 | emit foundServices( remDevice, list ); |
119 | } | 119 | } |
120 | } | 120 | } |
121 | void Manager::searchServices( const RemoteDevice& dev){ | 121 | void Manager::searchServices( const RemoteDevice& dev){ |
122 | searchServices( dev.mac() ); | 122 | searchServices( dev.mac() ); |
123 | } | 123 | } |
124 | QString Manager::toDevice( const QString& /*mac*/ ){ | 124 | QString Manager::toDevice( const QString& /*mac*/ ){ |
125 | return QString::null; | 125 | return QString::null; |
126 | } | 126 | } |
127 | QString Manager::toMac( const QString &/*device*/ ){ | 127 | QString Manager::toMac( const QString &/*device*/ ){ |
128 | return QString::null; | 128 | return QString::null; |
129 | } | 129 | } |
130 | void Manager::slotProcessExited(OProcess* proc ) { | 130 | void Manager::slotProcessExited(OProcess* proc ) { |
131 | bool conn= false; | 131 | bool conn= false; |
132 | if (proc->normalExit() && proc->exitStatus() == 0 ) | 132 | if (proc->normalExit() && proc->exitStatus() == 0 ) |
133 | conn = true; | 133 | conn = true; |
134 | 134 | ||
135 | QString name = QString::fromLatin1(proc->name() ); | 135 | QString name = QString::fromLatin1(proc->name() ); |
136 | emit available( name, conn ); | 136 | emit available( name, conn ); |
137 | delete proc; | 137 | delete proc; |
138 | } | 138 | } |
139 | void Manager::slotSDPOut(OProcess* proc, char* ch, int len) | 139 | void Manager::slotSDPOut(OProcess* proc, char* ch, int len) |
140 | { | 140 | { |
141 | QCString str(ch, len+1 ); | 141 | QCString str(ch, len+1 ); |
142 | qWarning("SDP:%s", str.data() ); | 142 | qWarning("SDP:%s", str.data() ); |
143 | QMap<QString, QString>::Iterator it; | 143 | QMap<QString, QString>::Iterator it; |
144 | it = m_out.find(proc->name() ); | 144 | it = m_out.find(proc->name() ); |
145 | QString string; | 145 | QString string; |
146 | if ( it != m_out.end() ) { | 146 | if ( it != m_out.end() ) { |
147 | string = it.data(); | 147 | string = it.data(); |
148 | } | 148 | } |
149 | string.append( str ); | 149 | string.append( str ); |
150 | m_out.replace( proc->name(), string ); | 150 | m_out.replace( proc->name(), string ); |
151 | 151 | ||
152 | } | 152 | } |
153 | void Manager::slotSDPExited( OProcess* proc) | 153 | void Manager::slotSDPExited( OProcess* proc) |
154 | { | 154 | { |
155 | qWarning("proc name %s", proc->name() ); | 155 | qWarning("proc name %s", proc->name() ); |
156 | Services::ValueList list; | 156 | Services::ValueList list; |
157 | if (proc->normalExit() ) { | 157 | if (proc->normalExit() ) { |
158 | QMap<QString, QString>::Iterator it = m_out.find( proc->name() ); | 158 | QMap<QString, QString>::Iterator it = m_out.find( proc->name() ); |
159 | if ( it != m_out.end() ) { | 159 | if ( it != m_out.end() ) { |
160 | qWarning("found process" ); | 160 | qWarning("found process" ); |
161 | list = parseSDPOutput( it.data() ); | 161 | list = parseSDPOutput( it.data() ); |
162 | m_out.remove( it ); | 162 | m_out.remove( it ); |
163 | } | 163 | } |
164 | } | 164 | } |
165 | emit foundServices( proc->name(), list ); | 165 | emit foundServices( proc->name(), list ); |
166 | delete proc; | 166 | delete proc; |
167 | } | 167 | } |
168 | Services::ValueList Manager::parseSDPOutput( const QString& out ) { | 168 | Services::ValueList Manager::parseSDPOutput( const QString& out ) { |
169 | Services::ValueList list; | 169 | Services::ValueList list; |
170 | qWarning("parsing output" ); | 170 | qWarning("parsing output" ); |
171 | Parser parser( out ); | 171 | Parser parser( out ); |
172 | list = parser.services(); | 172 | list = parser.services(); |
173 | return list; | 173 | return list; |
174 | } | 174 | } |
175 | 175 | ||
176 | void Manager::slotHCIExited(OProcess* proc ) { | 176 | void Manager::slotHCIExited(OProcess* proc ) { |
177 | qWarning("process exited"); | 177 | qWarning("process exited"); |
178 | RemoteDevice::ValueList list; | 178 | RemoteDevice::ValueList list; |
179 | if (proc->normalExit() ) { | 179 | if (proc->normalExit() ) { |
180 | qWarning("normalExit %s", proc->name() ); | 180 | qWarning("normalExit %s", proc->name() ); |
181 | QMap<QString, QString>::Iterator it = m_devices.find(proc->name() ); | 181 | QMap<QString, QString>::Iterator it = m_devices.find(proc->name() ); |
182 | if (it != m_devices.end() ) { | 182 | if (it != m_devices.end() ) { |
183 | qWarning("!= end ;)"); | 183 | qWarning("!= end ;)"); |
184 | list = parseHCIOutput( it.data() ); | 184 | list = parseHCIOutput( it.data() ); |
185 | m_devices.remove( it ); | 185 | m_devices.remove( it ); |
186 | } | 186 | } |
187 | } | 187 | } |
188 | emit foundDevices( proc->name(), list ); | 188 | emit foundDevices( proc->name(), list ); |
189 | delete proc; | 189 | delete proc; |
190 | } | 190 | } |
191 | void Manager::slotHCIOut(OProcess* proc, char* ch, int len) { | 191 | void Manager::slotHCIOut(OProcess* proc, char* ch, int len) { |
192 | QCString str( ch, len+1 ); | 192 | QCString str( ch, len+1 ); |
193 | qWarning("hci: %s", str.data() ); | 193 | qWarning("hci: %s", str.data() ); |
194 | QMap<QString, QString>::Iterator it; | 194 | QMap<QString, QString>::Iterator it; |
195 | it = m_devices.find( proc->name() ); | 195 | it = m_devices.find( proc->name() ); |
196 | qWarning("proc->name %s", proc->name() ); | 196 | qWarning("proc->name %s", proc->name() ); |
197 | QString string; | 197 | QString string; |
198 | if (it != m_devices.end() ) { | 198 | if (it != m_devices.end() ) { |
199 | qWarning("slotHCIOut "); | 199 | qWarning("slotHCIOut "); |
200 | string = it.data(); | 200 | string = it.data(); |
201 | } | 201 | } |
202 | string.append( str ); | 202 | string.append( str ); |
203 | 203 | ||
204 | m_devices.replace( proc->name(), string ); | 204 | m_devices.replace( proc->name(), string ); |
205 | } | 205 | } |
206 | RemoteDevice::ValueList Manager::parseHCIOutput(const QString& output ) { | 206 | RemoteDevice::ValueList Manager::parseHCIOutput(const QString& output ) { |
207 | qWarning("parseHCI %s", output.latin1() ); | 207 | qWarning("parseHCI %s", output.latin1() ); |
208 | RemoteDevice::ValueList list; | 208 | RemoteDevice::ValueList list; |
209 | QStringList strList = QStringList::split('\n', output ); | 209 | QStringList strList = QStringList::split('\n', output ); |
210 | QStringList::Iterator it; | 210 | QStringList::Iterator it; |
211 | QString str; | 211 | QString str; |
212 | for ( it = strList.begin(); it != strList.end(); ++it ) { | 212 | for ( it = strList.begin(); it != strList.end(); ++it ) { |
213 | str = (*it).stripWhiteSpace(); | 213 | str = (*it).stripWhiteSpace(); |
214 | qWarning("OpieTooth %s", str.latin1() ); | 214 | qWarning("OpieTooth %s", str.latin1() ); |
215 | int pos = str.findRev(':' ); | 215 | int pos = str.findRev(':' ); |
216 | if ( pos > 0 ) { | 216 | if ( pos > 0 ) { |
217 | QString mac = str.left(17 ); | 217 | QString mac = str.left(17 ); |
218 | str.remove( 0, 17 ); | 218 | str.remove( 0, 17 ); |
219 | qWarning("mac %s", mac.latin1() ); | 219 | qWarning("mac %s", mac.latin1() ); |
220 | qWarning("rest:%s", str.latin1() ); | 220 | qWarning("rest:%s", str.latin1() ); |
221 | RemoteDevice rem( mac , str.stripWhiteSpace() ); | 221 | RemoteDevice rem( mac , str.stripWhiteSpace() ); |
222 | list.append( rem ); | 222 | list.append( rem ); |
223 | } | 223 | } |
224 | } | 224 | } |
225 | return list; | 225 | return list; |
226 | } | 226 | } |
227 | 227 | ||
228 | ////// hcitool cc and hcitool con | 228 | ////// hcitool cc and hcitool con |
229 | 229 | ||
230 | /** | 230 | /** |
231 | * Create it on the stack as don't care | 231 | * Create it on the stack as don't care |
232 | * so we don't need to care for it | 232 | * so we don't need to care for it |
233 | * cause hcitool gets reparented | 233 | * cause hcitool gets reparented |
234 | */ | 234 | */ |
235 | void Manager::connectTo( const QString& mac) { | 235 | void Manager::connectTo( const QString& mac) { |
236 | OProcess proc; | 236 | OProcess proc; |
237 | proc << "hcitool"; | 237 | proc << "hcitool"; |
238 | proc << "cc"; | 238 | proc << "cc"; |
239 | proc << "mac"; | 239 | proc << mac; |
240 | proc.start(OProcess::DontCare); // the lib does not care at this point | 240 | proc.start(OProcess::DontCare); // the lib does not care at this point |
241 | } | 241 | } |
242 | 242 | ||
243 | 243 | ||
244 | void Manager::searchConnections() { | 244 | void Manager::searchConnections() { |
245 | qWarning("searching connections?"); | 245 | qWarning("searching connections?"); |
246 | OProcess* proc = new OProcess(); | 246 | OProcess* proc = new OProcess(); |
247 | m_hcitoolCon = QString::null; | 247 | m_hcitoolCon = QString::null; |
248 | 248 | ||
249 | connect(proc, SIGNAL(processExited(OProcess*) ), | 249 | connect(proc, SIGNAL(processExited(OProcess*) ), |
250 | this, SLOT(slotConnectionExited( OProcess*) ) ); | 250 | this, SLOT(slotConnectionExited( OProcess*) ) ); |
251 | connect(proc, SIGNAL(receivedStdout(OProcess*, char*, int) ), | 251 | connect(proc, SIGNAL(receivedStdout(OProcess*, char*, int) ), |
252 | this, SLOT(slotConnectionOutput(OProcess*, char*, int) ) ); | 252 | this, SLOT(slotConnectionOutput(OProcess*, char*, int) ) ); |
253 | *proc << "hcitool"; | 253 | *proc << "hcitool"; |
254 | *proc << "con"; | 254 | *proc << "con"; |
255 | 255 | ||
256 | if (!proc->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { | 256 | if (!proc->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { |
257 | Connection::ValueList list; | 257 | Connection::ValueList list; |
258 | emit connections( list ); | 258 | emit connections( list ); |
259 | delete proc; | 259 | delete proc; |
260 | } | 260 | } |
261 | } | 261 | } |
262 | void Manager::slotConnectionExited( OProcess* proc ) { | 262 | void Manager::slotConnectionExited( OProcess* /*proc*/ ) { |
263 | qWarning("exited"); | 263 | qWarning("exited"); |
264 | Connection::ValueList list; | 264 | Connection::ValueList list; |
265 | list = parseConnections( m_hcitoolCon ); | 265 | list = parseConnections( m_hcitoolCon ); |
266 | emit connections(list ); | 266 | emit connections(list ); |
267 | } | 267 | } |
268 | void Manager::slotConnectionOutput(OProcess* proc, char* cha, int len) { | 268 | void Manager::slotConnectionOutput(OProcess* proc, char* cha, int len) { |
269 | QCString str(cha, len ); | 269 | QCString str(cha, len ); |
270 | m_hcitoolCon.append( str ); | 270 | m_hcitoolCon.append( str ); |
271 | delete proc; | 271 | delete proc; |
272 | } | 272 | } |
273 | Connection::ValueList Manager::parseConnections( const QString& out ) { | 273 | Connection::ValueList Manager::parseConnections( const QString& out ) { |
274 | Connection::ValueList list2; | 274 | Connection::ValueList list2; |
275 | QStringList list = QStringList::split('\n', out ); | 275 | QStringList list = QStringList::split('\n', out ); |
276 | QStringList::Iterator it; | 276 | QStringList::Iterator it; |
277 | for (it = list.begin(); it != list.end(); ++it ) { | 277 | for (it = list.begin(); it != list.end(); ++it ) { |
278 | QString row = (*it).stripWhiteSpace(); | 278 | QString row = (*it).stripWhiteSpace(); |
279 | QStringList value = QStringList::split(' ', row ); | 279 | QStringList value = QStringList::split(' ', row ); |
280 | qWarning("0: %s", value[0].latin1() ); | 280 | qWarning("0: %s", value[0].latin1() ); |
281 | qWarning("1: %s", value[1].latin1() ); | 281 | qWarning("1: %s", value[1].latin1() ); |
282 | qWarning("2: %s", value[2].latin1() ); | 282 | qWarning("2: %s", value[2].latin1() ); |
283 | qWarning("3: %s", value[3].latin1() ); | 283 | qWarning("3: %s", value[3].latin1() ); |
284 | qWarning("4: %s", value[4].latin1() ); | 284 | qWarning("4: %s", value[4].latin1() ); |
285 | qWarning("5: %s", value[5].latin1() ); | 285 | qWarning("5: %s", value[5].latin1() ); |
286 | qWarning("6: %s", value[6].latin1() ); | 286 | qWarning("6: %s", value[6].latin1() ); |
287 | qWarning("7: %s", value[7].latin1() ); | 287 | qWarning("7: %s", value[7].latin1() ); |
288 | qWarning("8: %s", value[8].latin1() ); | 288 | qWarning("8: %s", value[8].latin1() ); |
289 | Connection con; | ||
290 | con.setDirection( value[0] == QString::fromLatin1("<") ? Outgoing : Incoming ); | ||
291 | con.setConnectionMode( value[1] ); | ||
292 | con.setMac( value[2] ); | ||
293 | con.setHandle( value[4].toInt() ); | ||
294 | con.setState( value[6].toInt() ); | ||
295 | con.setLinkMode( value[8] == QString::fromLatin1("MASTER") ? Master : Client ); | ||
296 | list2.append( con ); | ||
289 | } | 297 | } |
290 | return list2; | 298 | return list2; |
291 | } | 299 | } |