idlefw/src/framework/ainetworklistener.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/src/framework/ainetworklistener.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,165 @@
+/*
+* Copyright (c) 2009 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"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Network info listener
+*
+*/
+
+#include <NetworkHandlingProxy.h>
+#include <CNWSession.h>
+#include "ainetworklistener.h"
+#include "ainetworkobserver.h"
+
+/// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor. Can leave.
+// -----------------------------------------------------------------------------
+// 
+CAiNetworkListener* CAiNetworkListener::NewL(MAiNetworkObserver& aNetworkObserver)
+    {
+    CAiNetworkListener* self = new (ELeave) CAiNetworkListener(aNetworkObserver);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+CAiNetworkListener::CAiNetworkListener(MAiNetworkObserver& aNetworkObserver)
+:iObserver(aNetworkObserver)
+    {
+    }
+
+void CAiNetworkListener::ConstructL()
+    {
+    //Create network handling engine session.
+    iSession = CreateL( *this, iInfo );
+    iCurrentNwState = MAiNetworkObserver::ENone;
+    }
+
+CAiNetworkListener::~CAiNetworkListener()
+    {
+    delete iSession;
+    }
+
+void CAiNetworkListener::HandleNetworkMessage( const TNWMessages aMessage )
+    {
+    TBool hasNetInfoChanged = HasNetworkInfoChanged( aMessage );
+    if ( !hasNetInfoChanged )
+        {
+        return;
+        }
+        
+    // Interpret new nw state
+    MAiNetworkObserver::TNetworkState newState;
+    newState= InterpretNWMessage(aMessage,iInfo);
+
+    // Inform observer of only new nw states (TNetworkState)
+    if (newState != iCurrentNwState)
+        {
+        iObserver.HandleNetworkStateChange(newState);
+        }    
+    
+    // Store new nw state
+    iCurrentNwState= newState;
+  
+    }
+
+MAiNetworkObserver::TNetworkState CAiNetworkListener::InterpretNWMessage(const TNWMessages aMessage, const TNWInfo aNWInfo)
+    {
+    MAiNetworkObserver::TNetworkState nwstate = MAiNetworkObserver::ENone;
+    
+    switch (aMessage)
+        {
+        case MNWMessageObserver::ENWMessageNetworkRegistrationStatusChange:
+        case MNWMessageObserver::ENWMessageCurrentHomeZoneMessage:
+            {
+            switch (aNWInfo.iRegistrationStatus)
+                {
+                case ENWRegisteredRoaming:
+                    nwstate = MAiNetworkObserver::ERoaming;
+                    break;
+                case ENWRegisteredOnHomeNetwork:
+                    nwstate = MAiNetworkObserver::EHomeNetwork;
+                    break;  
+                    
+                default:
+                    // unknown state
+                    break;
+                }
+            }
+       }
+    
+    return nwstate;
+    }
+
+void CAiNetworkListener::HandleNetworkError( const TNWOperation aOperation, TInt /*aErrorCode*/ )
+    {
+     switch ( aOperation )
+        {
+        case MNWMessageObserver::ENWGetNetworkProviderName:
+            iReceivedMessageFlags |= ENetworkProviderNameReceived;
+            iReceivedMessageFlags &= ~ENetworkProviderNameOk;
+            iInfo.iNPName.Zero();
+            break;
+        case MNWMessageObserver::ENWGetProgrammableOperatorName:
+            iReceivedMessageFlags |= EProgrammableOperatorInfoReceived;
+            iReceivedMessageFlags &= ~EProgrammableOperatorInfoReceivedOk;
+            iInfo.iOperatorNameInfo.iName.Zero();
+            break;
+        case MNWMessageObserver::ENWGetServiceProviderName:
+            iReceivedMessageFlags |= EServiceProviderNameReceived;
+            iReceivedMessageFlags &= ~EServiceProviderNameOk;
+            iInfo.iServiceProviderNameDisplayReq = RMobilePhone::KDisplaySPNNotRequired;
+            iInfo.iSPName.Zero();
+            iInfo.iPLMNField.Zero();
+            break;
+        default:
+            break;
+        }
+    
+    HandleNetworkMessage( TNWMessages( KErrGeneral ) );
+    }
+
+TBool CAiNetworkListener::HasNetworkInfoChanged( const TNWMessages aMessage )
+    {
+    TBool result = ETrue;
+    
+    // pass through
+    if ( aMessage == MNWMessageObserver::ENWMessageCurrentHomeZoneMessage   ||
+         aMessage == MNWMessageObserver::ENWMessageNetworkConnectionFailure ||
+         aMessage == MNWMessageObserver::ENWMessageCurrentCellInfoMessage   ||
+         aMessage == MNWMessageObserver::ENWMessageNetworkRegistrationStatusChange )
+        {
+        return result;
+        }
+    
+    result = ( iReceivedMessageFlags != iOldReceivedMessageFlags );
+    
+    if ( !result )
+        {
+         result = 
+            iInfo.iRegistrationStatus != iOldInfo.iRegistrationStatus;
+        }
+
+    iOldReceivedMessageFlags = iReceivedMessageFlags;
+    iOldInfo = iInfo;
+
+    return result;
+    }
+
+MAiNetworkObserver::TNetworkState CAiNetworkListener::NetworkState()
+    {
+    return iCurrentNwState;
+    }
+