|
1 /* |
|
2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: call status handling. |
|
15 * |
|
16 */ |
|
17 |
|
18 |
|
19 // INCLUDE FILES |
|
20 |
|
21 #include "btmcphonestatus.h" |
|
22 #include <nssvascoreconstant.h> |
|
23 #include <etelmm.h> |
|
24 #include "atcodec.h" |
|
25 #include "btmcprotocol.h" |
|
26 #include "btmcprotocolstatus.h" |
|
27 #include "btmc_defs.h" |
|
28 #include "btmcvolume.h" |
|
29 #include "btmcsignal.h" |
|
30 #include "btmcbattery.h" |
|
31 |
|
32 #include "debug.h" |
|
33 |
|
34 const TInt KNetworkRegistrationSubscribe = 20; |
|
35 const TInt KVoiceDialSubscribe = 21; |
|
36 |
|
37 |
|
38 // ----------------------------------------------------------------------------- |
|
39 // CBtmcPhoneStatus::NewL |
|
40 // ----------------------------------------------------------------------------- |
|
41 CBtmcPhoneStatus* CBtmcPhoneStatus::NewL( |
|
42 CBtmcProtocol& aProtocol, RMobilePhone& aPhone, TBtmcProfileId aProfile) |
|
43 { |
|
44 CBtmcPhoneStatus* self = CBtmcPhoneStatus::NewLC(aProtocol, aPhone, aProfile); |
|
45 CleanupStack::Pop(self); |
|
46 return self; |
|
47 } |
|
48 |
|
49 // ----------------------------------------------------------------------------- |
|
50 // CBtmcPhoneStatus::NewLC |
|
51 // ----------------------------------------------------------------------------- |
|
52 CBtmcPhoneStatus* CBtmcPhoneStatus::NewLC( |
|
53 CBtmcProtocol& aProtocol, RMobilePhone& aPhone, TBtmcProfileId aProfile) |
|
54 { |
|
55 CBtmcPhoneStatus* self = new(ELeave) CBtmcPhoneStatus(aProtocol, aPhone); |
|
56 CleanupStack::PushL(self); |
|
57 self->ConstructL(aProfile); |
|
58 return self; |
|
59 } |
|
60 |
|
61 // ----------------------------------------------------------------------------- |
|
62 // CBtmcPhoneStatus::~CBtmcPhoneStatus |
|
63 // ----------------------------------------------------------------------------- |
|
64 CBtmcPhoneStatus::~CBtmcPhoneStatus() |
|
65 { |
|
66 TRACE_FUNC_ENTRY |
|
67 iActives.ResetAndDestroy(); |
|
68 iActives.Close(); |
|
69 iVoiceDialProperty.Close(); |
|
70 delete iVol; |
|
71 delete iSignal; |
|
72 delete iBattery; |
|
73 |
|
74 TRACE_FUNC_EXIT |
|
75 } |
|
76 |
|
77 RMobilePhone::TMobilePhoneRegistrationStatus CBtmcPhoneStatus::NetworkStatus() const |
|
78 { |
|
79 return iNetworkStatus; |
|
80 } |
|
81 |
|
82 void CBtmcPhoneStatus::SetVolumeControlFeatureL(TBool aSupported) |
|
83 { |
|
84 TRACE_FUNC_ENTRY |
|
85 if (aSupported && !iVol) |
|
86 { |
|
87 iVol = CBtmcVolume::NewL(*this); |
|
88 } |
|
89 else if (!aSupported) |
|
90 { |
|
91 delete iVol; |
|
92 iVol = NULL; |
|
93 } |
|
94 TRACE_FUNC_EXIT |
|
95 } |
|
96 |
|
97 void CBtmcPhoneStatus::SetVoiceRecognitionControlL(TBool aEnabled) |
|
98 { |
|
99 TRACE_FUNC_ENTRY |
|
100 if (aEnabled && !iVoiceRecognitionEnabled) |
|
101 { |
|
102 // AO for Voice Dial |
|
103 LEAVE_IF_ERROR(iVoiceDialProperty.Attach(KSINDUID, ERecognitionState)) |
|
104 CBtmcActive* ao = CBtmcActive::NewLC(*this, CActive::EPriorityStandard, KVoiceDialSubscribe); |
|
105 iActives.AppendL(ao); |
|
106 iVoiceDialProperty.Subscribe(ao->iStatus); |
|
107 ao->GoActive(); |
|
108 CleanupStack::Pop(ao); |
|
109 iVoiceRecognitionEnabled = ETrue; |
|
110 } |
|
111 |
|
112 TRACE_FUNC_EXIT |
|
113 } |
|
114 |
|
115 void CBtmcPhoneStatus::SetSpeakerVolumeL(TInt aHfVol) |
|
116 { |
|
117 if (this && iVol) |
|
118 { |
|
119 TRACE_FUNC_ENTRY |
|
120 iVol->SetSpeakerVolumeL(aHfVol); |
|
121 TRACE_FUNC_EXIT |
|
122 } |
|
123 } |
|
124 |
|
125 void CBtmcPhoneStatus::ActivateRemoteVolumeControl() |
|
126 { |
|
127 TRACE_FUNC |
|
128 if (iVol) |
|
129 iVol->ActivateRemoteVolumeControl(); |
|
130 } |
|
131 |
|
132 void CBtmcPhoneStatus::DeActivateRemoteVolumeControl() |
|
133 { |
|
134 TRACE_FUNC |
|
135 if (iVol) |
|
136 iVol->DeActivateRemoteVolumeControl(); |
|
137 } |
|
138 |
|
139 TInt CBtmcPhoneStatus::GetSignalStrength() |
|
140 { |
|
141 return iSignal->GetSignalStrength(); |
|
142 } |
|
143 |
|
144 TInt CBtmcPhoneStatus::GetBatteryCharge() |
|
145 { |
|
146 return iBattery->GetBatteryCharge(); |
|
147 } |
|
148 |
|
149 void CBtmcPhoneStatus::SetRecognitionInitiator(TBTMonoVoiceRecognitionInitiator aInitiator) |
|
150 { |
|
151 iVoiceRecogInitiator = aInitiator; |
|
152 } |
|
153 |
|
154 // Send unsolicited network status responses: |
|
155 // +CIEV: 1,0 is generated when Home/Roam network becomes unavailable |
|
156 // +CIEV: 1,1 generated when Home/Roam network becomes available |
|
157 // For HFP1.5 +CIEV: 6, 1 when roaming is active, +CIEV: 6,0 when roaming is not active |
|
158 |
|
159 void CBtmcPhoneStatus::HandleNetworkRegistrationEventL( |
|
160 RMobilePhone::TMobilePhoneRegistrationStatus aOldStatus, |
|
161 RMobilePhone::TMobilePhoneRegistrationStatus aNewStatus) |
|
162 { |
|
163 if ( iProtocol.ProtocolStatus().iIndicatorNotif & KIndServiceBit ) |
|
164 { |
|
165 if ((aOldStatus == RMobilePhone::ERegisteredOnHomeNetwork || |
|
166 aOldStatus == RMobilePhone::ERegisteredRoaming) && |
|
167 (aNewStatus != RMobilePhone::ERegisteredOnHomeNetwork && |
|
168 aNewStatus != RMobilePhone::ERegisteredRoaming)) |
|
169 { |
|
170 ReportIndicatorL(EBTMonoATNetworkIndicator, EBTMonoATNetworkUnavailable); |
|
171 } |
|
172 else if ((aOldStatus != RMobilePhone::ERegisteredOnHomeNetwork && |
|
173 aOldStatus != RMobilePhone::ERegisteredRoaming) && |
|
174 (aNewStatus == RMobilePhone::ERegisteredOnHomeNetwork || |
|
175 aNewStatus == RMobilePhone::ERegisteredRoaming)) |
|
176 { |
|
177 ReportIndicatorL(EBTMonoATNetworkIndicator, EBTMonoATNetworkAvailable); |
|
178 } |
|
179 } |
|
180 |
|
181 // Roaming status |
|
182 if( iProtocol.ProtocolStatus().iIndicatorNotif & KIndRoamBit ) |
|
183 { |
|
184 if(aOldStatus != RMobilePhone::ERegisteredRoaming && aNewStatus == RMobilePhone::ERegisteredRoaming) |
|
185 { |
|
186 ReportIndicatorL(EBTMonoATRoamingIndicator, EBTMonoATRoamingActive); |
|
187 } |
|
188 else if(aOldStatus == RMobilePhone::ERegisteredRoaming && aNewStatus != RMobilePhone::ERegisteredRoaming) |
|
189 { |
|
190 ReportIndicatorL(EBTMonoATRoamingIndicator, EBTMonoATRoamingInactive); |
|
191 } |
|
192 } |
|
193 } |
|
194 |
|
195 void CBtmcPhoneStatus::HandleSpeakerVolumeEventL(TInt aVol) |
|
196 { |
|
197 TRACE_FUNC_ENTRY |
|
198 CATResult* event = CATResult::NewLC(EATVGS, EATUnsolicitedResult, TATParam(aVol)); |
|
199 iProtocol.SendUnsoltResultL(*event); |
|
200 CleanupStack::PopAndDestroy(event); |
|
201 TRACE_FUNC_EXIT |
|
202 } |
|
203 |
|
204 void CBtmcPhoneStatus::HandleVoiceDialEventL(TInt aEnabled) |
|
205 { |
|
206 TRACE_FUNC_ENTRY |
|
207 TRACE_INFO((_L("Voice dial Initiator %d, Voice dial event %d"), iVoiceRecogInitiator, aEnabled)) |
|
208 TBTMonoATVoiceRecognition value = EBTMonoATVoiceRecognitionOff; |
|
209 |
|
210 if (iVoiceRecogInitiator != EBTMonoVoiceRecognitionActivatedByRemote && aEnabled == ERecognitionStarted) |
|
211 {// phone activated or headset deactivated voice recognition, informs headset status change |
|
212 value = EBTMonoATVoiceRecognitionOn; |
|
213 } |
|
214 else if(aEnabled == KErrNotFound) |
|
215 {// headset or phone ui deactivated voice recognition, inform headset status change |
|
216 value = EBTMonoATVoiceRecognitionOff; |
|
217 } |
|
218 else |
|
219 { |
|
220 return; |
|
221 } |
|
222 iVoiceRecogInitiator = EBTMonoVoiceRecognitionDefaultInitiator; |
|
223 CATResult* event = CATResult::NewLC(EATBVRA, EATUnsolicitedResult, TATParam(value)); |
|
224 iProtocol.SendUnsoltResultL(*event); |
|
225 CleanupStack::PopAndDestroy(event); |
|
226 TRACE_FUNC_EXIT |
|
227 } |
|
228 |
|
229 void CBtmcPhoneStatus::HandleNetworkStrengthChangeL(TInt8 aStrength) |
|
230 { |
|
231 if(iProtocol.ProtocolStatus().iIndicatorNotif && |
|
232 (iProtocol.ProtocolStatus().iIndicatorNotif & KIndSignalBit)) |
|
233 ReportIndicatorL(EBTMonoATSignalStrengthIndicator, TInt(aStrength)); |
|
234 } |
|
235 |
|
236 void CBtmcPhoneStatus::HandleBatteryChangeL(TInt aLevel) |
|
237 { |
|
238 TRACE_FUNC_ENTRY |
|
239 if(iProtocol.ProtocolStatus().iIndicatorNotif && |
|
240 (iProtocol.ProtocolStatus().iIndicatorNotif & KIndChargeBit)) |
|
241 ReportIndicatorL(EBTMonoATBatteryChargeIndicator, aLevel); |
|
242 TRACE_FUNC_EXIT |
|
243 } |
|
244 |
|
245 |
|
246 void CBtmcPhoneStatus::RequestCompletedL(CBtmcActive& aActive, TInt aErr) |
|
247 { |
|
248 switch (aActive.ServiceId()) |
|
249 { |
|
250 case KNetworkRegistrationSubscribe: |
|
251 { |
|
252 if (!aErr) |
|
253 { |
|
254 HandleNetworkRegistrationEventL(iNetworkStatus, iNewNetworkStatus); |
|
255 iNetworkStatus = iNewNetworkStatus; |
|
256 iPhone.NotifyNetworkRegistrationStatusChange(aActive.iStatus, iNewNetworkStatus); |
|
257 aActive.GoActive(); |
|
258 } |
|
259 break; |
|
260 } |
|
261 case KVoiceDialSubscribe: |
|
262 { |
|
263 if (!aErr || aErr == KErrNotFound) |
|
264 { |
|
265 iVoiceDialProperty.Subscribe(aActive.iStatus); |
|
266 aActive.GoActive(); |
|
267 |
|
268 TInt value = aErr; |
|
269 if (!aErr) |
|
270 { |
|
271 TInt err = iVoiceDialProperty.Get(value); |
|
272 if (err != KErrNone) |
|
273 { |
|
274 value = err; |
|
275 } |
|
276 } |
|
277 HandleVoiceDialEventL(value); |
|
278 } |
|
279 break; |
|
280 } |
|
281 default: |
|
282 break; |
|
283 } |
|
284 } |
|
285 |
|
286 void CBtmcPhoneStatus::CancelRequest(TInt aServiceId) |
|
287 { |
|
288 switch (aServiceId) |
|
289 { |
|
290 case KNetworkRegistrationSubscribe: |
|
291 { |
|
292 iPhone.CancelAsyncRequest(EMobilePhoneNotifyNetworkRegistrationStatusChange); |
|
293 break; |
|
294 } |
|
295 case KVoiceDialSubscribe: |
|
296 { |
|
297 iVoiceDialProperty.Cancel(); |
|
298 break; |
|
299 } |
|
300 default: |
|
301 break; |
|
302 } |
|
303 } |
|
304 |
|
305 TInt CBtmcPhoneStatus::GetVolumeStatus() |
|
306 { |
|
307 if(iVol) |
|
308 return iVol->GetVolume(); |
|
309 else |
|
310 return 0; |
|
311 } |
|
312 |
|
313 // ----------------------------------------------------------------------------- |
|
314 // CBtmcPhoneStatus::CBtmcPhoneStatus |
|
315 // ----------------------------------------------------------------------------- |
|
316 CBtmcPhoneStatus::CBtmcPhoneStatus( |
|
317 CBtmcProtocol& aProtocol, RMobilePhone& aPhone) |
|
318 : iProtocol(aProtocol), |
|
319 iPhone(aPhone), |
|
320 iNetworkStatus(RMobilePhone::ERegistrationUnknown) |
|
321 { |
|
322 } |
|
323 |
|
324 // ----------------------------------------------------------------------------- |
|
325 // CBtmcPhoneStatus::ConstructL |
|
326 // ----------------------------------------------------------------------------- |
|
327 void CBtmcPhoneStatus::ConstructL(TBtmcProfileId aProfile) |
|
328 { |
|
329 TRACE_FUNC |
|
330 // HSP profile doesn't need these functions: |
|
331 if ( aProfile == EBtmcHFP0105 ) |
|
332 { |
|
333 iBattery = CBtmcBattery::NewL(*this); |
|
334 iBattery->GoActive(); |
|
335 iSignal = CBtmcSignal::NewL(*this); |
|
336 iSignal->GoActive(); |
|
337 TRequestStatus sta = KRequestPending; |
|
338 iPhone.GetNetworkRegistrationStatus(sta, iNetworkStatus); |
|
339 User::WaitForRequest(sta); |
|
340 TRACE_INFO((_L(" Network status %d"), iNetworkStatus)) |
|
341 // AO for Network status |
|
342 CBtmcActive* ao = |
|
343 CBtmcActive::NewLC(*this, CActive::EPriorityStandard, KNetworkRegistrationSubscribe); |
|
344 iActives.AppendL(ao); |
|
345 iPhone.NotifyNetworkRegistrationStatusChange(ao->iStatus, iNewNetworkStatus); |
|
346 ao->GoActive(); |
|
347 CleanupStack::Pop(ao); |
|
348 } |
|
349 TRACE_FUNC_EXIT |
|
350 } |
|
351 |
|
352 void CBtmcPhoneStatus::ReportIndicatorL(TBTMonoATPhoneIndicatorId aIndicator, TInt aValue) |
|
353 { |
|
354 TRACE_FUNC_ENTRY |
|
355 TRACE_INFO((_L("indicator %d, value %d"), aIndicator, aValue)) |
|
356 RArray<TATParam> params; |
|
357 CleanupClosePushL(params); |
|
358 params.AppendL(TATParam(aIndicator)); |
|
359 params.AppendL(TATParam(aValue)); |
|
360 CATResult* ciev = CATResult::NewLC(EATCIEV, EATUnsolicitedResult, ¶ms); |
|
361 iProtocol.SendUnsoltResultL(*ciev); |
|
362 CleanupStack::PopAndDestroy(ciev); |
|
363 CleanupStack::PopAndDestroy(¶ms); |
|
364 TRACE_FUNC_EXIT |
|
365 } |
|
366 |
|
367 TInt CBtmcPhoneStatus::GetRssiStrength() |
|
368 { |
|
369 return iSignal->GetRssiStrength(); |
|
370 } |
|
371 |
|
372 // End of file |