1 /* |
1 /* |
2 * Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). |
2 * Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies). |
3 * All rights reserved. |
3 * All rights reserved. |
4 * This component and the accompanying materials are made available |
4 * This component and the accompanying materials are made available |
5 * under the terms of "Eclipse Public License v1.0" |
5 * under the terms of "Eclipse Public License v1.0" |
6 * which accompanies this distribution, and is available |
6 * which accompanies this distribution, and is available |
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
19 #include <NetworkHandlingProxy.h> |
19 #include <NetworkHandlingProxy.h> |
20 #include <CNWSession.h> |
20 #include <CNWSession.h> |
21 #include "ainetworkinfolistener.h" |
21 #include "ainetworkinfolistener.h" |
22 #include "ainetworkinfoobserver.h" |
22 #include "ainetworkinfoobserver.h" |
23 #include "debug.h" |
23 #include "debug.h" |
|
24 #include <exterror.h> // for KErrGsmMMNetworkFailure |
|
25 #include <featmgr.h> // for FeatureManager |
24 |
26 |
25 const TInt KAiMessageCacheGranularity = 4; |
27 const TInt KAiMessageCacheGranularity = 4; |
26 |
28 |
27 // ======== MEMBER FUNCTIONS ======== |
29 // ======== MEMBER FUNCTIONS ======== |
28 |
30 |
37 //Store pointer in TLS |
39 //Store pointer in TLS |
38 User::LeaveIfError( Dll::SetTls( this ) ); |
40 User::LeaveIfError( Dll::SetTls( this ) ); |
39 |
41 |
40 //Create network handling engine session. |
42 //Create network handling engine session. |
41 iSession = CreateL( *this, iInfo ); |
43 iSession = CreateL( *this, iInfo ); |
42 |
|
43 iShowOpInd = EFalse; |
44 iShowOpInd = EFalse; |
44 //Create message cache |
45 //Create message cache |
45 iMessageCache = new( ELeave )CArrayFixFlat |
46 iMessageCache = new( ELeave )CArrayFixFlat |
46 <MNWMessageObserver::TNWMessages>( KAiMessageCacheGranularity ); |
47 <MNWMessageObserver::TNWMessages>( KAiMessageCacheGranularity ); |
47 } |
48 } |
112 else |
113 else |
113 { |
114 { |
114 User::LeaveIfError( iObservers.Insert( &aObserver, freeSlot ) ); |
115 User::LeaveIfError( iObservers.Insert( &aObserver, freeSlot ) ); |
115 } |
116 } |
116 } |
117 } |
117 |
118 |
118 |
|
119 void CAiNetworkInfoListener::RemoveObserver( MAiNetworkInfoObserver& aObserver ) |
119 void CAiNetworkInfoListener::RemoveObserver( MAiNetworkInfoObserver& aObserver ) |
120 { |
120 { |
121 //Remove observer, removing is done by replacing it with NULL pointer. |
121 //Remove observer, removing is done by replacing it with NULL pointer. |
122 const TInt count( iObservers.Count() ); |
122 const TInt count( iObservers.Count() ); |
123 |
123 |
160 TRAPD( err, iMessageCache->InsertIsqL( aMessage, iKeyProperties ) ); |
160 TRAPD( err, iMessageCache->InsertIsqL( aMessage, iKeyProperties ) ); |
161 if( err == KErrAlreadyExists ) |
161 if( err == KErrAlreadyExists ) |
162 { |
162 { |
163 err = KErrNone; |
163 err = KErrNone; |
164 } |
164 } |
165 |
|
166 if( err != KErrNone ) |
165 if( err != KErrNone ) |
167 { |
166 { |
168 return; |
167 return; |
169 } |
168 } |
170 |
169 |
171 iShowOpInd = !NotAllowedToDisplayOperatorIndicator( aMessage ); |
170 iShowOpInd = !NotAllowedToDisplayOperatorIndicator( aMessage ); |
172 |
171 |
173 |
|
174 TBool hasNetInfoChanged = HasNetworkInfoChanged( aMessage ); |
172 TBool hasNetInfoChanged = HasNetworkInfoChanged( aMessage ); |
175 |
|
176 if ( !hasNetInfoChanged ) |
173 if ( !hasNetInfoChanged ) |
177 { |
174 { |
178 return; |
175 return; |
179 } |
176 } |
180 |
|
181 __PRINT(__DBG_FORMAT("XAI: Show operator indicator %d, info changed %d"), iShowOpInd, hasNetInfoChanged ); |
177 __PRINT(__DBG_FORMAT("XAI: Show operator indicator %d, info changed %d"), iShowOpInd, hasNetInfoChanged ); |
182 |
|
183 const TInt count( iObservers.Count() ); |
178 const TInt count( iObservers.Count() ); |
184 |
179 |
185 |
180 |
186 for( TInt i( 0 ); i < count; i++ ) |
181 for( TInt i( 0 ); i < count; i++ ) |
187 { |
182 { |
204 |
199 |
205 |
200 |
206 void CAiNetworkInfoListener::HandleNetworkError( const TNWOperation aOperation, TInt aErrorCode ) |
201 void CAiNetworkInfoListener::HandleNetworkError( const TNWOperation aOperation, TInt aErrorCode ) |
207 { |
202 { |
208 __PRINT(__DBG_FORMAT("XAI: Error code %d"), aErrorCode ); |
203 __PRINT(__DBG_FORMAT("XAI: Error code %d"), aErrorCode ); |
|
204 |
|
205 TNWMessages errorCode = TNWMessages( KErrGeneral ); |
|
206 |
209 switch ( aOperation ) |
207 switch ( aOperation ) |
210 { |
208 { |
211 case MNWMessageObserver::ENWGetNetworkProviderName: |
209 case MNWMessageObserver::ENWGetNetworkProviderName: |
212 iReceivedMessageFlags |= ENetworkProviderNameReceived; |
210 iReceivedMessageFlags |= ENetworkProviderNameReceived; |
213 iReceivedMessageFlags &= ~ENetworkProviderNameOk; |
211 iReceivedMessageFlags &= ~ENetworkProviderNameOk; |
226 iInfo.iServiceProviderNameDisplayReq = RMobilePhone::KDisplaySPNNotRequired; |
224 iInfo.iServiceProviderNameDisplayReq = RMobilePhone::KDisplaySPNNotRequired; |
227 iInfo.iSPName.Zero(); |
225 iInfo.iSPName.Zero(); |
228 iInfo.iPLMNField.Zero(); |
226 iInfo.iPLMNField.Zero(); |
229 __PRINTS("XAI: SPN error received"); |
227 __PRINTS("XAI: SPN error received"); |
230 break; |
228 break; |
|
229 case MNWMessageObserver::ENWNotifyNetworkRegistrationStatusChange: |
|
230 if ( FeatureManager::FeatureSupported( KFeatureIdFfManualSelectionPopulatedPlmnList ) |
|
231 && ( KErrGsmMMNetworkFailure == aErrorCode ) ) |
|
232 { |
|
233 errorCode = static_cast<TNWMessages>( aErrorCode ); |
|
234 } |
|
235 __PRINTS("XAI: ENWNotifyNetworkRegistrationStatusChange error received"); |
|
236 |
|
237 break; |
231 default: |
238 default: |
232 break; |
239 break; |
233 } |
240 } |
234 |
241 |
235 HandleNetworkMessage( TNWMessages( KErrGeneral ) ); |
242 HandleNetworkMessage( errorCode ); |
236 } |
243 } |
237 |
244 |
238 |
|
239 TBool CAiNetworkInfoListener::NotAllowedToDisplayOperatorIndicator( const TNWMessages aMessage ) |
245 TBool CAiNetworkInfoListener::NotAllowedToDisplayOperatorIndicator( const TNWMessages aMessage ) |
240 { |
246 { |
241 // Service provider name must have been fetched. |
247 // Service provider name must have been fetched. |
242 // Network provider name must have been fetched. |
248 // Network provider name must have been fetched. |
243 // Registration status and network information must have been received. |
249 // Registration status and network information must have been received. |
244 // Operator name information must have been received. |
250 // Operator name information must have been received. |
245 // Device must be camped to a network. |
251 // Device must be camped to a network. |
246 |
252 |
|
253 TBool csAlphaFlag( EFalse ); |
247 switch ( aMessage ) |
254 switch ( aMessage ) |
248 { |
255 { |
249 case MNWMessageObserver::ENWMessageNetworkInfoChange: |
256 case MNWMessageObserver::ENWMessageNetworkInfoChange: |
250 iReceivedMessageFlags |= ENetworkInfoChangeReceived; |
257 iReceivedMessageFlags |= ENetworkInfoChangeReceived; |
251 break; |
258 break; |
275 break; |
282 break; |
276 case MNWMessageObserver::ENWMessageProgrammableOperatorInfoUpdating: |
283 case MNWMessageObserver::ENWMessageProgrammableOperatorInfoUpdating: |
277 iReceivedMessageFlags &= |
284 iReceivedMessageFlags &= |
278 ~( EProgrammableOperatorInfoReceived + |
285 ~( EProgrammableOperatorInfoReceived + |
279 EProgrammableOperatorInfoReceivedOk ); |
286 EProgrammableOperatorInfoReceivedOk ); |
280 break; |
287 break; |
|
288 case MNWMessageObserver::ENWMessageDynamicCapsChange: |
|
289 TRAPD(fmerr, FeatureManager::InitializeLibL()); |
|
290 if ( fmerr == KErrNone ) |
|
291 { |
|
292 if( FeatureManager::FeatureSupported( |
|
293 KFeatureIdFfDisplayNetworkNameAfterCsRegistration )) |
|
294 { |
|
295 // CS flag is EFalse, alpha tag should not be shown. |
|
296 if ( !( RPacketService::KCapsRxCSCall & |
|
297 iInfo.iDynamicCapsFlags ) ) |
|
298 { |
|
299 csAlphaFlag = ETrue; |
|
300 } |
|
301 } |
|
302 FeatureManager::UnInitializeLib(); |
|
303 } |
|
304 break; |
281 default: |
305 default: |
282 break; |
306 break; |
283 } |
307 } |
284 |
308 |
285 TBool serviceProviderNameFetched( EServiceProviderNameReceived & iReceivedMessageFlags ); |
309 TBool serviceProviderNameFetched( EServiceProviderNameReceived & iReceivedMessageFlags ); |
296 return |
320 return |
297 !serviceProviderNameFetched || |
321 !serviceProviderNameFetched || |
298 !networkProviderNameFetched || |
322 !networkProviderNameFetched || |
299 !( registrationStatusReceived && networkInformationReceived |
323 !( registrationStatusReceived && networkInformationReceived |
300 && operatorNameInformationReceived ) || |
324 && operatorNameInformationReceived ) || |
301 !currentNetworkOk; |
325 !currentNetworkOk || csAlphaFlag; |
302 } |
326 } |
303 |
327 |
304 |
328 |
305 TBool CAiNetworkInfoListener::HasNetworkInfoChanged( const TNWMessages aMessage ) |
329 TBool CAiNetworkInfoListener::HasNetworkInfoChanged( const TNWMessages aMessage ) |
306 { |
330 { |
307 TBool result = ETrue; |
331 TBool result = ETrue; |
308 |
332 |
309 // pass through |
333 // pass through |
310 if ( aMessage == MNWMessageObserver::ENWMessageCurrentHomeZoneMessage || |
334 if ( aMessage == MNWMessageObserver::ENWMessageCurrentHomeZoneMessage || |
311 aMessage == MNWMessageObserver::ENWMessageNetworkConnectionFailure || |
335 aMessage == MNWMessageObserver::ENWMessageNetworkConnectionFailure || |
312 aMessage == MNWMessageObserver::ENWMessageCurrentCellInfoMessage ) |
336 aMessage == MNWMessageObserver::ENWMessageCurrentCellInfoMessage || |
|
337 aMessage == static_cast<TNWMessages>( KErrGsmMMNetworkFailure ) |
|
338 ) |
313 { |
339 { |
314 return result; |
340 return result; |
315 } |
341 } |
316 |
342 |
317 result = ( iReceivedMessageFlags != iOldReceivedMessageFlags ); |
343 result = ( iReceivedMessageFlags != iOldReceivedMessageFlags ); |
335 iInfo.iSPName != iOldInfo.iSPName || |
361 iInfo.iSPName != iOldInfo.iSPName || |
336 iInfo.iServiceProviderNameDisplayReq != |
362 iInfo.iServiceProviderNameDisplayReq != |
337 iOldInfo.iServiceProviderNameDisplayReq || |
363 iOldInfo.iServiceProviderNameDisplayReq || |
338 iInfo.iNPName != iOldInfo.iNPName || |
364 iInfo.iNPName != iOldInfo.iNPName || |
339 iInfo.iPLMNField != iOldInfo.iPLMNField; |
365 iInfo.iPLMNField != iOldInfo.iPLMNField; |
|
366 TRAPD(fmerr, FeatureManager::InitializeLibL()); |
|
367 if ( fmerr == KErrNone ) |
|
368 { |
|
369 if( FeatureManager::FeatureSupported( |
|
370 KFeatureIdFfDisplayNetworkNameAfterCsRegistration )) |
|
371 { |
|
372 result = result || |
|
373 iInfo.iDynamicCapsFlags != iOldInfo.iDynamicCapsFlags; |
|
374 } |
|
375 FeatureManager::UnInitializeLib(); |
|
376 } |
340 } |
377 } |
341 |
378 |
342 iOldReceivedMessageFlags = iReceivedMessageFlags; |
379 iOldReceivedMessageFlags = iReceivedMessageFlags; |
343 iOldInfo = iInfo; |
380 iOldInfo = iInfo; |
344 |
381 |