internetradio2.0/networkcontrollersrc/irnetworkobserver.cpp
changeset 0 09774dfdd46b
child 11 f683e24efca3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/internetradio2.0/networkcontrollersrc/irnetworkobserver.cpp	Mon Apr 19 14:01:53 2010 +0300
@@ -0,0 +1,470 @@
+/*
+* Copyright (c) 2006-2007 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:  ?Description
+*
+*/
+
+
+#include "irdebug.h"
+#include "irnetworkobserver.h"
+#include "irnetworkcontroller.h"
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::NewL
+// Creates an Instance of CIRNetworkObserver
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CIRNetworkObserver *CIRNetworkObserver::NewL(CIRNetworkController *aNetworkController)
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::NewL - Entering" );
+	CIRNetworkObserver *self = NewLC(aNetworkController);
+	CleanupStack::Pop(self);
+	IRLOG_DEBUG( "CIRNetworkObserver::NewL - Exiting." );
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::~CIRNetworkObserver()
+// Default Destructor
+// ---------------------------------------------------------------------------
+//
+CIRNetworkObserver::~CIRNetworkObserver()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::~CIRNetworkObserver - Entering" );
+        Cancel();
+	iIRConnectionMonitor.CancelNotifications();
+	iIRConnectionMonitor.Close();
+	IRLOG_DEBUG( "CIRNetworkObserver::~CIRNetworkObserver - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::InitializeNetworkObserver()
+//  Initializes the Connection monitor
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::InitializeNetworkObserver()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::InitializeNetworkObserver - Entering" );
+	iConnectionId = 0;
+	if(!IsActive())
+		{
+		iObserverState = EInitializing;
+		iIRConnectionMonitor.GetConnectionCount(iConnectionCount,iStatus);
+		SetActive();
+		}
+	IRLOG_DEBUG( "CIRNetworkObserver::InitializeNetworkObserver - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::SetObserver(MIRNetworkController* aObserver)
+// Set the observer used to communicate with the IRNetworkController
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::SetObserver(MIRNetworkController* aObserver)
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::SetObserver - Entering" );
+	iMonitorObserver = aObserver;
+	iMonitoringRequired = ETrue;  
+	IRLOG_DEBUG( "CIRNetworkObserver::SetObserver - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::CIRNetworkObserver()
+// Default Constructor
+// ---------------------------------------------------------------------------
+//
+CIRNetworkObserver::CIRNetworkObserver(CIRNetworkController *aNetworkController):
+    CActive( CActive::EPriorityStandard ), iNetworkController(aNetworkController)
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::CIRNetworkObserver - Entering" );
+	// Add the AO to the ActiveScheduler
+	CActiveScheduler::Add( this );
+	IRLOG_DEBUG( "CIRNetworkObserver::CIRNetworkObserver - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// Creates an Instance of CIRNetworkObserver
+// ---------------------------------------------------------------------------
+//
+CIRNetworkObserver *CIRNetworkObserver::NewLC(CIRNetworkController *aNetworkController )
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::NewLC - Entering " );
+	CIRNetworkObserver *self = new( ELeave )CIRNetworkObserver(aNetworkController);
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	IRLOG_DEBUG( "CIRNetworkObserver::NewLC - Exiting." );
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::ConstructL() 
+// Second Phase construction.
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::ConstructL()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::ConstructL - Entering" );
+	iIRConnectionMonitor.ConnectL();
+	iIRConnectionMonitor.NotifyEventL(*this);
+	iMonitoringRequired = EFalse;  
+	IRLOG_DEBUG( "CIRNetworkObserver::ConstructL - Exiting." );	
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::RunL()
+// The function is called by the active scheduler when a request completion event occurs,
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::RunL()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::RunL - Entering" );
+	IRNetworkObserverRunL();
+	IRLOG_DEBUG( "CIRNetworkObserver::RunL - Exiting" );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::DoCancel()
+// Cancels the pending requests on the CIRNetworkObserver Active object
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::DoCancel()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::DoCancel" );
+	}
+
+// ---------------------------------------------------------------------------    
+// CIRNetworkObserver::RunError()
+// Handles a leave occurring in the request completion event handler RunL()
+// ---------------------------------------------------------------------------
+//    
+TInt CIRNetworkObserver::RunError(TInt /*aError*/)
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::RunError" );
+	iNetworkController->ResetHandingOverConnection();
+	return KErrNone;
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::EventL(const CConnMonEventBase &aConnMonEvent)
+// Derived from MConnectionMonitorObserver
+// Implements the EventL method which is called when there is a network event
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::EventL(const CConnMonEventBase &aConnMonEvent)
+	{
+	IRLOG_INFO4( "CIRNetworkObserver::EventL - Event type %d for connection %d, iConnectionId=%d", 
+	             aConnMonEvent.EventType(), aConnMonEvent.ConnectionId(), iConnectionId );
+	switch(aConnMonEvent.EventType())
+		{
+		case EConnMonCreateConnection:
+			{
+			//Triggered when a new connection has been been created
+			// for future implementation
+			}
+		break;
+
+		case EConnMonDeleteConnection:
+			{
+			//Triggered when a connection has been been deleted.
+			if( aConnMonEvent.ConnectionId() == iConnectionId )
+				{
+				if(iMonitoringRequired)
+					{
+					iMonitorObserver->IRNetworkEventL(ENetworkConnectionDisconnected);
+					}
+				}			
+			}
+		break;
+
+		case EConnMonCreateSubConnection:       
+			{
+			//Triggered when a new subconnection has been been created
+			// for future implementation
+			}
+		break;
+
+		case EConnMonDeleteSubConnection:       
+			{
+			//Triggered when a subconnection has been been deleted
+			// for future implementation
+			}
+		break;
+
+		case EConnMonDownlinkDataThreshold:     
+			{
+			// for future implementation
+			}
+		break;
+
+		case EConnMonUplinkDataThreshold:       
+			{
+			// for future implementation
+			}
+		break;
+
+		case EConnMonNetworkStatusChange:       
+			{
+			// for future implementation
+			}
+		break;
+
+		case EConnMonConnectionStatusChange:    
+			{
+			//Triggered when the status of some connection changes.
+			// for future implementation
+			}
+		break;
+
+		case EConnMonConnectionActivityChange:  
+			{
+			//Triggered when some connection changes from active to idle or vice versa
+			// for future implementation
+			}
+		break;
+
+		case EConnMonNetworkRegistrationChange: 
+			{
+			// for future implementation
+			}
+		break;
+
+		case EConnMonBearerChange:              
+			{
+			//Triggered when bearer type (GPRS / Edge GPRS / WCDMA) changes
+			// for future implementation
+			}
+		break;
+
+		case EConnMonSignalStrengthChange:      
+			{
+			// for future implementation
+			}
+		break;
+
+		case EConnMonBearerAvailabilityChange:  
+			{
+			//Triggered when the availability of some bearer changes
+			// for future implementation
+			}
+		break;
+
+		case EConnMonIapAvailabilityChange:     
+			{
+			// for future implementation
+			}
+		break;
+
+		case EConnMonTransmitPowerChange:    
+			{
+			// for future implementation
+			}
+		break;
+		default:
+			{
+			// no implementation
+			}
+		break;    
+		}
+	IRLOG_DEBUG( "CIRNetworkObserver::EventL - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::IdentifyConnection()
+// Identifies the type of connection we have used to get connected to network
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::IdentifyConnection()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::IdentifyConnection - Entering" );
+	if(!IsActive())
+		{
+		iObserverState = EGettingConnectionInfo;
+		iIRConnectionMonitor.GetConnectionInfo(
+		    iConnectionCount,iConnectionId,iSubConnectionCount);
+		// O Indicates method applies to connection
+		iIRConnectionMonitor.GetIntAttribute(
+		    iConnectionId,0,KBearer,iConnectionType,iStatus);
+		SetActive();
+		}
+	IRLOG_DEBUG( "CIRNetworkObserver::IdentifyConnection - Exiting." );
+}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::GetIAPId()
+// Retrieves the IAP Id of the connection
+// ---------------------------------------------------------------------------
+//
+void CIRNetworkObserver::GetAPId()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::GetIAPId - Entering" );
+	if(!IsActive())
+		{
+		iObserverState = EGettingIAPId;
+		iIRConnectionMonitor.GetConnectionInfo(
+		    iConnectionCount,iConnectionId,iSubConnectionCount);
+		// O in RConnectionMonitor::GetIntAttribute indicates method applies to connection
+		iIRConnectionMonitor.GetUintAttribute(
+		    iConnectionId,0,KIAPId,iIAPId,iStatus);
+		SetActive();
+		}
+	IRLOG_DEBUG( "CIRNetworkObserver::GetIAPId - Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::IRNetworkObserverRunL()
+// Utility function used just to keep RunL() small
+// ---------------------------------------------------------------------------
+// 
+void CIRNetworkObserver::IRNetworkObserverRunL()
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::IRNetworkObserverRunL - Entering" );
+	switch(iObserverState)
+		{
+		case EInitializing:
+			{
+			if( iStatus.Int() == KErrNone )
+				{
+				// Initializing the Connection Monitor sucessful    
+				IdentifyConnection();
+				}
+			else
+				{
+				// Error initializing the connection monitor
+				iNetworkController->ResetHandingOverConnection();
+				}    
+			}
+		break;
+
+		case EGettingConnectionInfo:
+			{
+			if( iStatus.Int() == KErrNone )
+				{
+                iIsIAPIdAvailable = EFalse;
+				GetAPId();	
+				}
+			else
+				{
+				// Error initializing the connection monitor
+				iNetworkController->ResetHandingOverConnection();
+				}    
+			}
+		break;   
+		
+		case EGettingIAPId:
+			{
+			    iIsIAPIdAvailable = ETrue;   
+			    switch(iConnectionType)
+			    {
+			        case EBearerGPRS:
+			            {
+			            iIRConnectionType = EGprs;
+			            if(iMonitoringRequired)
+			             {
+			             // Intimate the connection established event
+			                 iMonitorObserver->IRNetworkEventL(
+			                     ENetworkConnectionEstablished);
+			             }
+			            }
+			        break;
+                    
+			        case EBearerEdgeGPRS:
+			            {
+			            iIRConnectionType = EEdge;
+			            if(iMonitoringRequired)
+			             {
+			             // Intimate the connection established event
+			                 iMonitorObserver->IRNetworkEventL(
+			                     ENetworkConnectionEstablished);
+			             }
+			            }
+			        break;
+                    
+			        case EBearerWLAN:
+			            {
+			            iIRConnectionType = EWiFi;    
+			            if(iMonitoringRequired)
+			                {
+			                // Intimate the connection established event
+			                iMonitorObserver->IRNetworkEventL(
+			                    ENetworkConnectionEstablished);
+			                }
+			            }
+			        break;
+                    
+			        case EBearerWCDMA:
+			            {
+			            iIRConnectionType = EWcdma;
+			            if(iMonitoringRequired)
+			            {
+			            // Intimate the connection established event
+			                iMonitorObserver->IRNetworkEventL(
+			                    ENetworkConnectionEstablished);
+			            }
+			            }
+                    break;
+			            
+			        case EBearerCDMA2000:
+			            {
+			            iIRConnectionType = ECdma2000;
+			            if(iMonitoringRequired)
+			            {
+			            // Intimate the connection established event
+			                iMonitorObserver->IRNetworkEventL(
+			                    ENetworkConnectionEstablished);
+			            }
+			            }
+			        break;
+			        
+			        default:
+			            {
+			            #ifdef __WINS__
+			            iIRConnectionType = EGprs;
+			            if(iMonitoringRequired)
+			             {
+			             // Intimate the connection established event
+			                 iMonitorObserver->IRNetworkEventL(
+			                     ENetworkConnectionEstablished);
+			             }
+			            #endif
+			            }
+			        break;
+			    }
+			    
+			    iNetworkController->ResetHandingOverConnection();
+			}
+			break;
+			
+		default:
+			{
+			// no implementation
+			}
+		break;
+		}
+	IRLOG_DEBUG( "CIRNetworkObserver::IRNetworkObserverRunL	- Exiting." );
+	}
+
+// ---------------------------------------------------------------------------
+// CIRNetworkObserver::SetNetworkMonitoring()
+// Sets network monitoring observer to decide whether network monitoring is required.
+// ---------------------------------------------------------------------------
+// 
+void CIRNetworkObserver::SetNetworkMonitoring(TBool aValue)
+	{
+	IRLOG_DEBUG( "CIRNetworkObserver::SetNetworkMonitoring - Entering" );
+
+	iMonitoringRequired = aValue;	
+	
+	IRLOG_DEBUG( "CIRNetworkObserver::SetNetworkMonitoring - Exiting" );
+
+	}