|
1 /* |
|
2 * Component Name: Headset Simulator |
|
3 * Author: Comarch S.A. |
|
4 * Version: 1.0 |
|
5 * Copyright (c) 2010 Comarch S.A. |
|
6 * |
|
7 * This Software is submitted by Comarch S.A. to Symbian Foundation Limited on |
|
8 * the basis of the Member Contribution Agreement entered between Comarch S.A. |
|
9 * and Symbian Foundation Limited on 5th June 2009 (“Agreement”) and may be |
|
10 * used only in accordance with the terms and conditions of the Agreement. |
|
11 * Any other usage, duplication or redistribution of this Software is not |
|
12 * allowed without written permission of Comarch S.A. |
|
13 * |
|
14 */ |
|
15 |
|
16 #include "debug.h" |
|
17 #include "hstools.h" |
|
18 |
|
19 CHsBTManager* CHsBTManager::NewL( RSocketServ& aSocketServ, |
|
20 MHsBTManagerObserver* aBTManagerObserver ) |
|
21 { |
|
22 CHsBTManager* self = CHsBTManager::NewLC( aSocketServ, aBTManagerObserver ); |
|
23 CleanupStack::Pop( self ); // self; |
|
24 return self; |
|
25 } |
|
26 |
|
27 CHsBTManager* CHsBTManager::NewLC( RSocketServ& aSocketServ, |
|
28 MHsBTManagerObserver* aBTManagerObserver ) |
|
29 { |
|
30 CHsBTManager* self = new ( ELeave ) CHsBTManager( aSocketServ, |
|
31 aBTManagerObserver ); |
|
32 CleanupStack::PushL( self ); |
|
33 self->ConstructL(); |
|
34 return self; |
|
35 } |
|
36 |
|
37 CHsBTManager::CHsBTManager( RSocketServ& aSocketServ, |
|
38 MHsBTManagerObserver* aBTManagerObserver ) : |
|
39 iSocketServ( aSocketServ ), iBTManagerObserver( aBTManagerObserver ) |
|
40 { |
|
41 |
|
42 } |
|
43 |
|
44 CHsBTManager::~CHsBTManager() |
|
45 { |
|
46 TRACE_FUNC_ENTRY |
|
47 RestoreInitialSettings(); |
|
48 |
|
49 if ( iBTSettings ) |
|
50 { |
|
51 delete iBTSettings; |
|
52 } |
|
53 if ( iBTConnection ) |
|
54 { |
|
55 delete iBTConnection; |
|
56 } |
|
57 |
|
58 if ( iDiscoverer ) |
|
59 { |
|
60 delete iDiscoverer; |
|
61 } |
|
62 if ( iBTDiscovery ) |
|
63 { |
|
64 delete iBTDiscovery; |
|
65 } |
|
66 |
|
67 iDesiredDevAdrress.Close(); |
|
68 iDesiredName.Close(); |
|
69 |
|
70 iBTInitialName.Close(); |
|
71 iBTName.Close(); |
|
72 |
|
73 TRACE_FUNC_EXIT |
|
74 } |
|
75 |
|
76 void CHsBTManager::ConstructL() |
|
77 { |
|
78 TRACE_FUNC_ENTRY |
|
79 iBTSettings = CBTEngSettings::NewL( this ); |
|
80 iBTConnection = CBTEngConnMan::NewL( this ); |
|
81 iDiscoverer = CHsDeviceDiscoverer::NewL( this, iSocketServ ); |
|
82 iBTDiscovery = CBTEngDiscovery::NewL( this ); |
|
83 |
|
84 iDesiredName.CreateL( KMaxBluetoothNameLen ); |
|
85 iDesiredDevAdrress.CreateL( KMaxBluetoothNameLen ); |
|
86 iBTInitialName.CreateL( KMaxBluetoothNameLen ); |
|
87 iBTName.CreateL( KMaxBluetoothNameLen ); |
|
88 |
|
89 User::LeaveIfError( iBTSettings->GetLocalName( iBTInitialName ) ); |
|
90 iBTName.Copy( iBTInitialName ); |
|
91 |
|
92 User::LeaveIfError( iBTSettings->GetVisibilityMode( |
|
93 iBTInitialVisibilityMode ) ); |
|
94 iServiceSet = EFalse; |
|
95 |
|
96 User::LeaveIfError( iBTSettings->GetPowerState( iBTInitialPowerState ) ); |
|
97 TRACE_FUNC_EXIT |
|
98 } |
|
99 |
|
100 void CHsBTManager::SetBTNameL( const TDesC& aBTName ) |
|
101 { |
|
102 TRACE_FUNC_ENTRY |
|
103 iBTName.Copy( aBTName ); |
|
104 User::LeaveIfError( iBTSettings->SetLocalName( iBTName ) ); |
|
105 TRACE_FUNC_EXIT |
|
106 } |
|
107 |
|
108 void CHsBTManager::TurnBtOnL( const TDesC& aName ) |
|
109 { |
|
110 TRACE_FUNC_ENTRY |
|
111 User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOn ) ); |
|
112 SetBTNameL( aName ); |
|
113 TRACE_FUNC_EXIT |
|
114 } |
|
115 |
|
116 void CHsBTManager::TurnBtOffL() |
|
117 { |
|
118 TRACE_FUNC_ENTRY |
|
119 User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOff ) ); |
|
120 TRACE_FUNC_EXIT |
|
121 } |
|
122 |
|
123 void CHsBTManager::FindDevL( const TDesC& aDevAddress ) |
|
124 { |
|
125 TRACE_FUNC_ENTRY |
|
126 iDesiredDevAdrress.Zero(); |
|
127 iDesiredName.Zero(); |
|
128 |
|
129 iLookingFor = EDevAddress; |
|
130 iDesiredDevAdrress.Copy( aDevAddress ); |
|
131 |
|
132 TBTPowerStateValue powerState; |
|
133 User::LeaveIfError( iBTSettings->GetPowerState( powerState ) ); |
|
134 if ( powerState == EBTPowerOff ) |
|
135 { |
|
136 TurnBtOnL(); |
|
137 } |
|
138 iDiscoverer->DeviceSearchL(); |
|
139 |
|
140 TRACE_FUNC_EXIT |
|
141 } |
|
142 |
|
143 void CHsBTManager::FindNameL( const TDesC& aDeviceName ) |
|
144 { |
|
145 TRACE_FUNC_ENTRY |
|
146 iDesiredDevAdrress.Zero(); |
|
147 iDesiredName.Zero(); |
|
148 |
|
149 iLookingFor = EName; |
|
150 iDesiredName.Copy( aDeviceName ); |
|
151 |
|
152 TBTPowerStateValue powerState; |
|
153 User::LeaveIfError( iBTSettings->GetPowerState( powerState ) ); |
|
154 if ( powerState == EBTPowerOff ) |
|
155 { |
|
156 TurnBtOnL(); |
|
157 } |
|
158 iDiscoverer->DeviceSearchL(); |
|
159 |
|
160 TRACE_FUNC_EXIT |
|
161 } |
|
162 |
|
163 void CHsBTManager::SetService( const TUUID& aService ) |
|
164 { |
|
165 TRACE_FUNC_ENTRY |
|
166 iServiceSet = ETrue; |
|
167 iService = aService; |
|
168 TRACE_FUNC_EXIT |
|
169 } |
|
170 |
|
171 void CHsBTManager::CancelConnecting() |
|
172 { |
|
173 TRACE_FUNC_ENTRY |
|
174 if ( iDiscoverer ) |
|
175 iDiscoverer->Cancel(); |
|
176 TRACE_FUNC_EXIT |
|
177 } |
|
178 |
|
179 TInt CHsBTManager::SetVisible( TBTVisibilityMode aVisibilityMode ) |
|
180 { |
|
181 TRACE_FUNC |
|
182 return iBTSettings->SetVisibilityMode( aVisibilityMode ); |
|
183 } |
|
184 |
|
185 void CHsBTManager::HandleDeviceFindSuccessL( TDesC8& aDevAddress, |
|
186 TDesC8& aDevName, TUint16 /*aMajServClass*/, TUint /*aMajDeviceClass*/, |
|
187 TUint8 /*aMinDeviceClass*/) |
|
188 { |
|
189 |
|
190 TRACE_FUNC_ENTRY |
|
191 |
|
192 RBuf bufDevAddr; |
|
193 RBuf bufDevName; |
|
194 |
|
195 bufDevAddr.CleanupClosePushL(); |
|
196 bufDevName.CleanupClosePushL(); |
|
197 |
|
198 bufDevAddr.CreateL( aDevAddress.Length() ); |
|
199 bufDevName.CreateL( aDevName.Length() ); |
|
200 |
|
201 bufDevAddr.Copy( aDevAddress ); |
|
202 bufDevName.Copy( aDevName ); |
|
203 |
|
204 TRACE_INFO( (_L("DevName: %S :: DevAddr: %S") , &bufDevName, &bufDevAddr) ) |
|
205 |
|
206 if ( ( iLookingFor == EDevAddress ) |
|
207 && ( aDevAddress == iDesiredDevAdrress ) ) |
|
208 { |
|
209 TRACE_INFO( (_L("Desired DevAddr [%S] found"), &bufDevAddr) ) |
|
210 iDiscoverer->Cancel(); |
|
211 |
|
212 if ( KDevAddrLength != iDevAddr.SetReadable( bufDevAddr ) ) |
|
213 { |
|
214 iBTManagerObserver->HandleDesiredDeviceNotFound( KErrNotFound ); |
|
215 } |
|
216 iDesiredName.Copy( bufDevName ); |
|
217 TRAPD(err,FindServiceL(iDevAddr, iService)); |
|
218 |
|
219 if ( err != KErrNone ) |
|
220 { |
|
221 TRACE_INFO( (_L("FindService error: %d"), err) ) |
|
222 iBTManagerObserver->HandleServiceNotFound( err ); |
|
223 } |
|
224 } |
|
225 else if ( ( iLookingFor == EName ) && ( bufDevName == iDesiredName ) ) |
|
226 { |
|
227 TRACE_INFO( (_L("Desired DevName [%S] found"), &bufDevName) ) |
|
228 iDiscoverer->Cancel(); |
|
229 |
|
230 if ( KDevAddrLength != iDevAddr.SetReadable( bufDevAddr ) ) |
|
231 { |
|
232 iBTManagerObserver->HandleDesiredDeviceNotFound( KErrNotFound ); |
|
233 } |
|
234 TRAPD(err,FindServiceL(iDevAddr, iService)); |
|
235 |
|
236 if ( err != KErrNone ) |
|
237 { |
|
238 TRACE_INFO( (_L("FindService error: %d"), err) ) |
|
239 iBTManagerObserver->HandleServiceNotFound( err ); |
|
240 } |
|
241 } |
|
242 |
|
243 CleanupStack::PopAndDestroy( 2 ); |
|
244 |
|
245 TRACE_FUNC_EXIT |
|
246 } |
|
247 |
|
248 void CHsBTManager::HandleDeviceFindFailed( TInt aErr ) |
|
249 { |
|
250 |
|
251 TRACE_FUNC_ENTRY |
|
252 TRACE_INFO( ( _L("aErr = %d"), aErr) ); |
|
253 iDiscoverer->Cancel(); |
|
254 |
|
255 iBTManagerObserver->HandleDesiredDeviceNotFound( aErr ); |
|
256 TRACE_FUNC_EXIT |
|
257 } |
|
258 |
|
259 void CHsBTManager::PowerStateChanged( TBTPowerStateValue /*aState*/) |
|
260 { |
|
261 TRACE_FUNC_ENTRY |
|
262 |
|
263 TRACE_FUNC_EXIT |
|
264 } |
|
265 |
|
266 void CHsBTManager::VisibilityModeChanged( TBTVisibilityMode /*aState*/) |
|
267 { |
|
268 TRACE_FUNC_ENTRY |
|
269 |
|
270 TRACE_FUNC_EXIT |
|
271 } |
|
272 |
|
273 void CHsBTManager::ConnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr, |
|
274 RBTDevAddrArray* /*aConflicts*/) |
|
275 { |
|
276 TRACE_FUNC_ENTRY |
|
277 TRACE_INFO( ( _L("aErr = %d"), aErr) ); |
|
278 |
|
279 TRACE_FUNC_EXIT |
|
280 } |
|
281 |
|
282 void CHsBTManager::DisconnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr ) |
|
283 { |
|
284 TRACE_FUNC_ENTRY |
|
285 TRACE_INFO( ( _L("aErr = %d"), aErr) ); |
|
286 |
|
287 TRACE_FUNC_EXIT |
|
288 } |
|
289 |
|
290 void CHsBTManager::PairingComplete( TBTDevAddr& /*aAddr*/, TInt aErr ) |
|
291 { |
|
292 TRACE_FUNC_ENTRY |
|
293 TRACE_INFO( ( _L("aErr = %d"), aErr) ); |
|
294 |
|
295 TRACE_FUNC_EXIT |
|
296 } |
|
297 |
|
298 void CHsBTManager::ServiceSearchComplete( |
|
299 const RSdpRecHandleArray& /*aResult*/, TUint /*aTotalRecordsCount*/, |
|
300 TInt /*aErr*/) |
|
301 { |
|
302 TRACE_FUNC_ENTRY |
|
303 |
|
304 TRACE_FUNC_EXIT |
|
305 } |
|
306 |
|
307 void CHsBTManager::AttributeSearchComplete( TSdpServRecordHandle /*aHandle*/, |
|
308 const RSdpResultArray& /*aAttr*/, TInt /*aErr*/) |
|
309 { |
|
310 TRACE_FUNC_ENTRY |
|
311 |
|
312 TRACE_FUNC_EXIT |
|
313 } |
|
314 |
|
315 void CHsBTManager::ServiceAttributeSearchComplete( |
|
316 TSdpServRecordHandle /*aHandle*/, const RSdpResultArray& aAttr, |
|
317 TInt aErr ) |
|
318 { |
|
319 TRACE_FUNC_ENTRY |
|
320 TRACE_INFO( ( _L("aErr = %d"), aErr) ); |
|
321 |
|
322 TInt port; |
|
323 |
|
324 TInt err = FindPort( aAttr, port ); |
|
325 iDiscoverer->Cancel(); |
|
326 |
|
327 if ( err == KErrNone ) |
|
328 { |
|
329 iBTManagerObserver->HandleDesiredDeviceFound( iDesiredName, iDevAddr, |
|
330 port ); |
|
331 } |
|
332 else |
|
333 { |
|
334 iBTManagerObserver->HandlePortNotFound( err ); |
|
335 } |
|
336 |
|
337 TRACE_FUNC_EXIT |
|
338 } |
|
339 |
|
340 void CHsBTManager::DeviceSearchComplete( CBTDevice* /*aDevice*/, TInt /*aErr*/) |
|
341 { |
|
342 TRACE_FUNC_ENTRY |
|
343 |
|
344 TRACE_FUNC_EXIT |
|
345 } |
|
346 |
|
347 void CHsBTManager::RestoreInitialSettings() |
|
348 { |
|
349 TRACE_FUNC_ENTRY |
|
350 // Return values may be ignored, no influence on Headset functionality |
|
351 iBTSettings->SetLocalName( iBTInitialName ); |
|
352 iBTSettings->SetPowerState( iBTInitialPowerState ); |
|
353 iBTSettings->SetVisibilityMode( iBTInitialVisibilityMode ); |
|
354 TRACE_FUNC_EXIT |
|
355 } |
|
356 |
|
357 void CHsBTManager::FindServiceL( const TBTDevAddr& aDevAddr, |
|
358 const TUUID& aService ) |
|
359 { |
|
360 TRACE_FUNC_ENTRY |
|
361 |
|
362 if ( !iServiceSet ) |
|
363 { |
|
364 User::Leave( KErrNotReady ); |
|
365 } |
|
366 TInt err = iBTDiscovery->RemoteSdpQuery( aDevAddr, aService, |
|
367 KSdpAttrIdProtocolDescriptorList ); |
|
368 |
|
369 if ( err != KErrNone ) |
|
370 { |
|
371 iBTManagerObserver->HandleSdpQueryError( err ); |
|
372 } |
|
373 TRACE_FUNC_EXIT |
|
374 } |
|
375 |
|
376 TInt CHsBTManager::FindPort( const RSdpResultArray& aAttr, TInt& aPort ) |
|
377 { |
|
378 TRACE_FUNC_ENTRY |
|
379 |
|
380 TInt err = KErrNotFound; |
|
381 |
|
382 for ( TInt i = 0; i < aAttr.Count(); i++ ) |
|
383 { |
|
384 TBTEngSdpAttrValue attr = aAttr[i]; |
|
385 |
|
386 if ( attr.iAttrType == ETypeUint ) |
|
387 { |
|
388 aPort = attr.iAttrValue.iValNumeric; |
|
389 err = KErrNone; |
|
390 TRACE_INFO( (_L("Found port: %d"), aPort) ) |
|
391 break; |
|
392 } |
|
393 } |
|
394 |
|
395 TRACE_INFO( ( _L("Returned value = %d"), err) ); |
|
396 TRACE_FUNC_EXIT |
|
397 return err; |
|
398 } |