idlefw/plugins/devicestatus/src/ainetworkinfolistener.cpp
branchRCL_3
changeset 18 bd874ee5e5e2
parent 0 79c6a41cd166
child 82 ace62b58f4b2
--- a/idlefw/plugins/devicestatus/src/ainetworkinfolistener.cpp	Fri Feb 19 23:07:29 2010 +0200
+++ b/idlefw/plugins/devicestatus/src/ainetworkinfolistener.cpp	Fri Mar 12 15:43:54 2010 +0200
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
@@ -21,6 +21,8 @@
 #include "ainetworkinfolistener.h"
 #include "ainetworkinfoobserver.h"
 #include "debug.h"
+#include <exterror.h>      // for KErrGsmMMNetworkFailure
+#include <featmgr.h>       // for FeatureManager
 
 const TInt KAiMessageCacheGranularity = 4;
 
@@ -39,7 +41,6 @@
 
     //Create network handling engine session.
     iSession = CreateL( *this, iInfo );
-    
     iShowOpInd = EFalse;
     //Create message cache
     iMessageCache = new( ELeave )CArrayFixFlat
@@ -114,8 +115,7 @@
         User::LeaveIfError( iObservers.Insert( &aObserver, freeSlot ) );
         }
     }
-    
-    
+
 void CAiNetworkInfoListener::RemoveObserver( MAiNetworkInfoObserver& aObserver )
     {
 	//Remove observer, removing is done by replacing it with NULL pointer.
@@ -162,24 +162,19 @@
         {
         err = KErrNone;
         }
-        
     if( err != KErrNone )
         {
-        return;        
+        return;
         }
 
 	iShowOpInd 		= !NotAllowedToDisplayOperatorIndicator( aMessage );
-	
-	
+
 	TBool hasNetInfoChanged = HasNetworkInfoChanged( aMessage );
-	
 	if ( !hasNetInfoChanged )
 		{
 		return;
 		}
-	
 	__PRINT(__DBG_FORMAT("XAI: Show operator indicator %d, info changed %d"), iShowOpInd, hasNetInfoChanged );
-	
     const TInt count( iObservers.Count() );
 
 
@@ -206,6 +201,9 @@
 void CAiNetworkInfoListener::HandleNetworkError( const TNWOperation aOperation, TInt aErrorCode )
     {
     __PRINT(__DBG_FORMAT("XAI: Error code %d"), aErrorCode );
+
+    TNWMessages errorCode = TNWMessages( KErrGeneral );
+
     switch ( aOperation )
         {
         case MNWMessageObserver::ENWGetNetworkProviderName:
@@ -228,14 +226,22 @@
             iInfo.iPLMNField.Zero();
             __PRINTS("XAI: SPN error received");
             break;
+        case MNWMessageObserver::ENWNotifyNetworkRegistrationStatusChange:
+            if ( FeatureManager::FeatureSupported( KFeatureIdFfManualSelectionPopulatedPlmnList )
+                 && ( KErrGsmMMNetworkFailure == aErrorCode ) )
+                {
+                errorCode = static_cast<TNWMessages>( aErrorCode );
+                }
+            __PRINTS("XAI: ENWNotifyNetworkRegistrationStatusChange error received");
+
+        break;
         default:
             break;
         }
-    
-    HandleNetworkMessage( TNWMessages( KErrGeneral ) );
+
+    HandleNetworkMessage( errorCode );
     }
-    
-    
+
 TBool CAiNetworkInfoListener::NotAllowedToDisplayOperatorIndicator( const TNWMessages aMessage )
 	{
 	// Service provider name must have been fetched.
@@ -243,7 +249,8 @@
     // Registration status and network information must have been received.
     // Operator name information must have been received.
     // Device must be camped to a network.
-	
+
+    TBool csAlphaFlag( EFalse );
 	switch ( aMessage )
     	{
         case MNWMessageObserver::ENWMessageNetworkInfoChange:
@@ -277,7 +284,24 @@
             iReceivedMessageFlags &= 
                 ~( EProgrammableOperatorInfoReceived + 
                    EProgrammableOperatorInfoReceivedOk );
-            break;       
+            break;
+        case MNWMessageObserver::ENWMessageDynamicCapsChange:
+            TRAPD(fmerr, FeatureManager::InitializeLibL());
+            if ( fmerr == KErrNone )
+                {
+                if( FeatureManager::FeatureSupported( 
+                    KFeatureIdFfDisplayNetworkNameAfterCsRegistration ))
+                    {
+                    // CS flag is EFalse, alpha tag should not be shown.
+                    if ( !( RPacketService::KCapsRxCSCall & 
+                            iInfo.iDynamicCapsFlags ) )
+                        {
+                        csAlphaFlag = ETrue;
+                        }
+                    }
+                FeatureManager::UnInitializeLib();
+                }
+            break;
         default:
             break;
         }
@@ -298,7 +322,7 @@
         !networkProviderNameFetched ||
         !( registrationStatusReceived && networkInformationReceived 
         	&& operatorNameInformationReceived ) ||
-        !currentNetworkOk;              
+        !currentNetworkOk || csAlphaFlag;
 	}
 
 
@@ -309,7 +333,9 @@
     // pass through
    	if ( aMessage == MNWMessageObserver::ENWMessageCurrentHomeZoneMessage 	||
    	 	 aMessage == MNWMessageObserver::ENWMessageNetworkConnectionFailure	||
-   	 	 aMessage == MNWMessageObserver::ENWMessageCurrentCellInfoMessage )
+   	 	 aMessage == MNWMessageObserver::ENWMessageCurrentCellInfoMessage ||
+   	 	 aMessage == static_cast<TNWMessages>( KErrGsmMMNetworkFailure )
+       )
    		{
    		return result;
    		}
@@ -337,6 +363,17 @@
                 iOldInfo.iServiceProviderNameDisplayReq ||
             iInfo.iNPName != iOldInfo.iNPName ||
             iInfo.iPLMNField != iOldInfo.iPLMNField;
+        TRAPD(fmerr, FeatureManager::InitializeLibL());
+        if ( fmerr == KErrNone )
+            {
+            if( FeatureManager::FeatureSupported( 
+                KFeatureIdFfDisplayNetworkNameAfterCsRegistration ))
+                {
+                    result = result || 
+                        iInfo.iDynamicCapsFlags != iOldInfo.iDynamicCapsFlags;
+                }
+            FeatureManager::UnInitializeLib();
+            }
         }
 
     iOldReceivedMessageFlags = iReceivedMessageFlags;