idlefw/plugins/devicestatus/src/ainetworkinfolistener.cpp
branchRCL_3
changeset 18 bd874ee5e5e2
parent 0 79c6a41cd166
child 82 ace62b58f4b2
equal deleted inserted replaced
9:d0529222e3f0 18:bd874ee5e5e2
     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