|
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 "hsrcbttools.h" |
|
17 #include "hsrcbttoolsobserver.h" |
|
18 #include "debug.h" |
|
19 |
|
20 CHsRCBTManager* CHsRCBTManager::NewL( RSocketServ& aSServ, |
|
21 MHsRCBTManagerObserver* aBTManagerObserver ) |
|
22 { |
|
23 CHsRCBTManager* self = CHsRCBTManager::NewLC( aSServ, aBTManagerObserver ); |
|
24 CleanupStack::Pop( self ); // self; |
|
25 return self; |
|
26 } |
|
27 |
|
28 CHsRCBTManager* CHsRCBTManager::NewLC( RSocketServ& aSServ, |
|
29 MHsRCBTManagerObserver* aBTManagerObserver ) |
|
30 { |
|
31 CHsRCBTManager* self = new ( ELeave ) CHsRCBTManager( aSServ, |
|
32 aBTManagerObserver ); |
|
33 CleanupStack::PushL( self ); |
|
34 self->ConstructL(); |
|
35 return self; |
|
36 } |
|
37 |
|
38 CHsRCBTManager::~CHsRCBTManager() |
|
39 { |
|
40 TRACE_FUNC_ENTRY |
|
41 TRAP_IGNORE(RestoreInitialSettingsL()); |
|
42 |
|
43 if ( iBTSettings ) |
|
44 { |
|
45 delete iBTSettings; |
|
46 } |
|
47 |
|
48 if ( iBTConnection ) |
|
49 { |
|
50 delete iBTConnection; |
|
51 } |
|
52 |
|
53 if ( iDiscoverer ) |
|
54 { |
|
55 delete iDiscoverer; |
|
56 } |
|
57 |
|
58 if ( iBTDiscovery ) |
|
59 { |
|
60 delete iBTDiscovery; |
|
61 } |
|
62 |
|
63 iDesiredMAC.Close(); |
|
64 iDesiredName.Close(); |
|
65 |
|
66 iBTInitialName.Close(); |
|
67 iBTName.Close(); |
|
68 |
|
69 TRACE_FUNC_EXIT |
|
70 } |
|
71 |
|
72 void CHsRCBTManager::ConnectDevAddrL( const TBTDevAddr& aDevAddr ) |
|
73 { |
|
74 TRACE_FUNC_ENTRY |
|
75 iDesiredMAC.Zero(); |
|
76 iDesiredName.Zero(); |
|
77 |
|
78 iSearchType = EDevAddr; |
|
79 aDevAddr.GetReadable( iDesiredMAC ); |
|
80 |
|
81 TBTPowerStateValue powerState; |
|
82 TInt err = iBTSettings->GetPowerState( powerState ); |
|
83 if ( KErrNone == err && powerState == EBTPowerOff ) |
|
84 { |
|
85 TurnOnBTL(); |
|
86 } |
|
87 iDiscoverer->DeviceSearchL(); |
|
88 |
|
89 TRACE_FUNC_EXIT |
|
90 } |
|
91 |
|
92 void CHsRCBTManager::ConnectDevNameL( const TDesC& aDeviceName ) |
|
93 { |
|
94 TRACE_FUNC_ENTRY |
|
95 iDesiredMAC.Zero(); |
|
96 iDesiredName.Zero(); |
|
97 |
|
98 iSearchType = EDevName; |
|
99 iDesiredName.Copy( aDeviceName ); |
|
100 |
|
101 TBTPowerStateValue powerState; |
|
102 iBTSettings->GetPowerState( powerState ); |
|
103 TInt err = iBTSettings->GetPowerState( powerState ); |
|
104 if ( KErrNone == err && powerState == EBTPowerOff ) |
|
105 { |
|
106 TurnOnBTL(); |
|
107 } |
|
108 |
|
109 iDiscoverer->DeviceSearchL(); |
|
110 TRACE_FUNC_EXIT |
|
111 } |
|
112 |
|
113 void CHsRCBTManager::CancelConnecting() |
|
114 { |
|
115 TRACE_FUNC_ENTRY |
|
116 if ( iDiscoverer ) |
|
117 iDiscoverer->Cancel(); |
|
118 TRACE_FUNC_EXIT |
|
119 } |
|
120 |
|
121 void CHsRCBTManager::SetService( const TUUID &aService ) |
|
122 { |
|
123 iServiceSet = ETrue; |
|
124 iService = aService; |
|
125 } |
|
126 |
|
127 CHsRCBTManager::CHsRCBTManager( RSocketServ& aSServ, |
|
128 MHsRCBTManagerObserver* aBTManagerObserver ) : |
|
129 iSServ( aSServ ), iBTManagerObserver( aBTManagerObserver ) |
|
130 { |
|
131 |
|
132 } |
|
133 |
|
134 void CHsRCBTManager::ConstructL() |
|
135 { |
|
136 TRACE_FUNC_ENTRY |
|
137 iBTSettings = CBTEngSettings::NewL( this ); |
|
138 iBTConnection = CBTEngConnMan::NewL( this ); |
|
139 iDiscoverer = CHsRCDeviceDiscoverer::NewL( this, iSServ ); |
|
140 iBTDiscovery = CBTEngDiscovery::NewL( this ); |
|
141 |
|
142 User::LeaveIfError( iDesiredName.Create( KMaxBCBluetoothNameLen ) ); |
|
143 User::LeaveIfError( iDesiredMAC.Create( KMaxBCBluetoothNameLen ) ); |
|
144 User::LeaveIfError( iBTInitialName.Create( KMaxBluetoothNameLen ) ); |
|
145 User::LeaveIfError( iBTName.Create( KMaxBluetoothNameLen ) ); |
|
146 |
|
147 User::LeaveIfError( iBTSettings->GetLocalName( iBTInitialName ) ); |
|
148 iBTName.Copy( iBTInitialName ); |
|
149 |
|
150 User::LeaveIfError( iBTSettings->GetVisibilityMode( |
|
151 iBTInitialVisibilityMode ) ); |
|
152 iServiceSet = EFalse; |
|
153 |
|
154 User::LeaveIfError( iBTSettings->GetPowerState( iBTInitialPowerState ) ); |
|
155 TRACE_FUNC_EXIT |
|
156 } |
|
157 |
|
158 void CHsRCBTManager::PowerStateChanged( TBTPowerStateValue /*aState*/) |
|
159 { |
|
160 } |
|
161 |
|
162 void CHsRCBTManager::VisibilityModeChanged( TBTVisibilityMode /*aState*/) |
|
163 { |
|
164 } |
|
165 |
|
166 void CHsRCBTManager::ConnectComplete( TBTDevAddr& /*aAddr*/, TInt aErr, |
|
167 RBTDevAddrArray* /*aConflicts*/) |
|
168 { |
|
169 TRACE_FUNC_ENTRY |
|
170 TRACE_INFO( ( _L("aErr = %d"), aErr) ); |
|
171 |
|
172 if ( ( aErr != KErrNone ) && iBTManagerObserver ) |
|
173 { |
|
174 iBTManagerObserver->HandleDesiredDevNotFound( aErr ); |
|
175 } |
|
176 |
|
177 TRACE_FUNC_EXIT |
|
178 } |
|
179 |
|
180 void CHsRCBTManager::DisconnectComplete( TBTDevAddr& /*aAddr*/, TInt /*aErr*/) |
|
181 { |
|
182 } |
|
183 |
|
184 void CHsRCBTManager::PairingComplete( TBTDevAddr& /*aAddr*/, TInt /*aErr*/) |
|
185 { |
|
186 } |
|
187 |
|
188 void CHsRCBTManager::ServiceSearchComplete( |
|
189 const RSdpRecHandleArray& /* aResult */, |
|
190 TUint /* aTotalRecordsCount */, TInt /* aErr */) |
|
191 { |
|
192 } |
|
193 |
|
194 void CHsRCBTManager::AttributeSearchComplete( |
|
195 TSdpServRecordHandle /* aHandle */, const RSdpResultArray& /* aAttr */, |
|
196 TInt /* aErr */) |
|
197 { |
|
198 } |
|
199 |
|
200 void CHsRCBTManager::ServiceAttributeSearchComplete( |
|
201 TSdpServRecordHandle /* aHandle */, const RSdpResultArray& aAttr, |
|
202 TInt /* aErr */) |
|
203 { |
|
204 TRACE_FUNC_ENTRY |
|
205 |
|
206 TInt port; |
|
207 |
|
208 TInt err = FindPort( aAttr, port ); |
|
209 iDiscoverer->Cancel(); |
|
210 |
|
211 if ( ( err == KErrNone ) && ( iBTManagerObserver ) ) |
|
212 { |
|
213 iBTManagerObserver->HandleDesiredDevFound( iDesiredName, iDevAddr, |
|
214 port ); |
|
215 } |
|
216 else |
|
217 { |
|
218 |
|
219 if ( iBTManagerObserver ) |
|
220 { |
|
221 iBTManagerObserver->HandleDesiredDevNotFound( err ); |
|
222 } |
|
223 |
|
224 } |
|
225 TRACE_FUNC_EXIT |
|
226 } |
|
227 |
|
228 void CHsRCBTManager::DeviceSearchComplete( CBTDevice* /* aDevice */, |
|
229 TInt /* aErr */) |
|
230 { |
|
231 } |
|
232 |
|
233 void CHsRCBTManager::HandleDeviceFindSuccessL( TDesC8& aDevAddr, |
|
234 TDesC8& aDevName, TUint16 /* aMajServClass */, |
|
235 TUint /* aMajDeviceClass */, TUint8 /* aMinDeviceClass */) |
|
236 { |
|
237 TRACE_FUNC_ENTRY |
|
238 |
|
239 RBuf bufAddr; |
|
240 RBuf bufName; |
|
241 |
|
242 bufAddr.CleanupClosePushL(); |
|
243 bufName.CleanupClosePushL(); |
|
244 |
|
245 bufAddr.CreateL( aDevAddr.Length() ); |
|
246 bufName.CreateL( aDevName.Length() ); |
|
247 |
|
248 bufAddr.Copy( aDevAddr ); |
|
249 bufName.Copy( aDevName ); |
|
250 |
|
251 TRACE_INFO( (_L8("DevNAME: %S :: DevADDR: %S") , &aDevName, &aDevAddr) ) |
|
252 |
|
253 if ( ( iSearchType == EDevAddr ) && ( bufAddr == iDesiredMAC ) ) |
|
254 { |
|
255 iDiscoverer->Cancel(); |
|
256 TBTDevAddr addr; |
|
257 |
|
258 User::LeaveIfError( addr.SetReadable( bufAddr ) ); |
|
259 |
|
260 iDevAddr = addr; |
|
261 iDesiredName.Copy( aDevName ); |
|
262 TRAPD(err,FindServiceL(iDevAddr, iService)); |
|
263 |
|
264 if ( ( err != KErrNone ) && ( iBTManagerObserver ) ) |
|
265 { |
|
266 iBTManagerObserver->HandleDesiredDevNotFound( err ); |
|
267 } |
|
268 iDesiredMAC.Zero(); |
|
269 } |
|
270 |
|
271 else if ( ( iSearchType == EDevName ) && ( bufName == iDesiredName ) ) |
|
272 { |
|
273 |
|
274 iDiscoverer->Cancel(); |
|
275 User::LeaveIfError( iDevAddr.SetReadable( bufAddr ) ); |
|
276 TRAPD(err, FindServiceL(iDevAddr, iService)); |
|
277 |
|
278 if ( ( err != KErrNone ) && ( iBTManagerObserver ) ) |
|
279 { |
|
280 iBTManagerObserver->HandleDesiredDevNotFound( err ); |
|
281 } |
|
282 |
|
283 iDesiredName.Zero(); |
|
284 } |
|
285 |
|
286 CleanupStack::PopAndDestroy( 2 ); |
|
287 |
|
288 TRACE_FUNC_EXIT |
|
289 } |
|
290 |
|
291 void CHsRCBTManager::HandleDeviceFindFailed( TInt aErr ) |
|
292 { |
|
293 |
|
294 TRACE_FUNC_ENTRY |
|
295 TRACE_INFO( ( _L("aErr = %d"), aErr) ); |
|
296 |
|
297 if ( iBTManagerObserver ) |
|
298 { |
|
299 iBTManagerObserver->HandleDesiredDevNotFound( aErr ); |
|
300 } |
|
301 |
|
302 TRACE_FUNC_EXIT |
|
303 } |
|
304 |
|
305 TInt CHsRCBTManager::FindPort( const RSdpResultArray& aAttr, TInt& aPort ) |
|
306 { |
|
307 TRACE_FUNC_ENTRY |
|
308 |
|
309 TInt res = KErrNotFound; |
|
310 |
|
311 for ( TInt i = 0; i < aAttr.Count(); i++ ) |
|
312 { |
|
313 TBTEngSdpAttrValue attr = aAttr[i]; |
|
314 |
|
315 if ( attr.iAttrType == ETypeUint ) |
|
316 { |
|
317 aPort = attr.iAttrValue.iValNumeric; |
|
318 res = KErrNone; |
|
319 TRACE_INFO( (_L("Found port: %d"), aPort) ); |
|
320 |
|
321 } |
|
322 |
|
323 } |
|
324 |
|
325 TRACE_FUNC_EXIT |
|
326 return res; |
|
327 } |
|
328 |
|
329 void CHsRCBTManager::RestoreInitialSettingsL() |
|
330 { |
|
331 TRACE_FUNC_ENTRY |
|
332 User::LeaveIfError( iBTSettings->SetLocalName( iBTInitialName ) ); |
|
333 |
|
334 User::LeaveIfError( iBTSettings->SetPowerState( iBTInitialPowerState ) ); |
|
335 |
|
336 User::LeaveIfError( iBTSettings->SetVisibilityMode( |
|
337 iBTInitialVisibilityMode ) ); |
|
338 |
|
339 TRACE_FUNC_EXIT |
|
340 } |
|
341 |
|
342 void CHsRCBTManager::SetBTNameL( const TDesC& aBTName ) |
|
343 { |
|
344 |
|
345 iBTName.Copy( aBTName ); |
|
346 User::LeaveIfError( iBTSettings->SetLocalName( iBTName ) ); |
|
347 |
|
348 } |
|
349 |
|
350 void CHsRCBTManager::TurnOnBTL( const TDesC& aName ) |
|
351 { |
|
352 User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOn ) ); |
|
353 SetBTNameL( aName ); |
|
354 } |
|
355 |
|
356 void CHsRCBTManager::TurnOffBTL() |
|
357 { |
|
358 User::LeaveIfError( iBTSettings->SetPowerState( EBTPowerOff ) ); |
|
359 } |
|
360 |
|
361 void CHsRCBTManager::FindServiceL( const TBTDevAddr &aDevAddr, |
|
362 const TUUID& aService ) |
|
363 { |
|
364 TRACE_FUNC_ENTRY |
|
365 if ( !iServiceSet ) |
|
366 { |
|
367 User::Leave( KErrNotReady ); |
|
368 } |
|
369 TInt err = iBTDiscovery->RemoteSdpQuery( aDevAddr, aService, |
|
370 KSdpAttrIdProtocolDescriptorList ); |
|
371 if ( err != KErrNone ) |
|
372 { |
|
373 iDiscoverer->DeviceSearchL(); |
|
374 } |
|
375 |
|
376 TRACE_FUNC_EXIT |
|
377 } |
|
378 |