httpfilters/httpfilterconnhandler/Src/httpfilterconnhandlerObserverPS.cpp
changeset 0 b16258d2340f
child 8 fa2fd8b2d6cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/httpfilters/httpfilterconnhandler/Src/httpfilterconnhandlerObserverPS.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,433 @@
+/*
+* Copyright (c) 2003 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:  Observer of System Agent events
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <es_sock.h>
+#include <PSVariables.h>  // Publish & Subscribe
+#include <MmTsy_names.h>
+
+// User Includes
+#include "httpfilterConnHandlerObserverPS.h"
+#include "mconnectioncallback.h"
+// #include <flogger.h>
+//_LIT(KDir, "connFilter");
+//_LIT(KFile, "filtererr.txt");
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KMaxOutOfCoverageTime   = 60*1000000;  //60 sec - Updated to 60 secs as part of error fix JSIN-7JSE6H
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::CHttpFilterConnHandlerObserver
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+
+CHttpFilterConnHandlerObserver::CHttpFilterConnHandlerObserver(MConnectionCallback* aConnCallback):
+        CActive(CActive::EPriorityHigh),iConnCallback(aConnCallback)
+{
+    iObserverState = EIdle;
+    // hardcode iUidValue = KPSUidGprsStatusValue for GPRS
+    // The iUidValue and iBearerType will be defined after connection is done
+    iUidValue = 0;  // no default value, as it will be set on Network mode check
+	iPrevUidValue = 0; // no default value, as it will be set on Network mode check
+	iBearerType = EApBearerTypeGPRS; // it is hardcoded in Connection manager, and it does not depend on GPRS nor 3G/WCDMA
+
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::ConstructL
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::ConstructL()
+{
+    // Note: the CHttpFilterConnHandlerObserver object s.b. created after connection is set for particular bearer
+    User::LeaveIfError(iGPRSStateProperty.Attach(KUidSystemCategory, KPSUidGprsStatusValue));
+    User::LeaveIfError(iWCDMAStateProperty.Attach(KUidSystemCategory, KPSUidWcdmaStatusValue)); 
+
+    CActiveScheduler::Add(this);
+    iSuspendTimer = CPeriodic::NewL(CActive::EPriorityLow );
+    if( !iTelServer.Handle() )	
+        {
+        // this initialization needed for identifying 3G networks
+        //
+        User::LeaveIfError( iTelServer.Connect() );
+        User::LeaveIfError( iTelServer.LoadPhoneModule( KMmTsyModuleName ) );
+
+        TInt numPhones;
+        User::LeaveIfError( iTelServer.EnumeratePhones( numPhones ) );
+        if( numPhones <= 0 )
+            {
+            // Huh???
+            User::Leave( KErrCorrupt );
+            }
+
+        RTelServer::TPhoneInfo phoneInfo;
+        User::LeaveIfError( iTelServer.GetPhoneInfo( 0, phoneInfo ) );
+        User::LeaveIfError( iMobilePhone.Open( iTelServer, phoneInfo.iName ) );
+        User::LeaveIfError( iMobilePhone.Initialise() );
+
+		RMobilePhone::TMobilePhoneNetworkMode networkMode;
+		User::LeaveIfError( iMobilePhone.GetCurrentMode( networkMode ) );
+
+		if( networkMode == RMobilePhone::ENetworkModeWcdma ||
+			networkMode == RMobilePhone::ENetworkModeTdcdma )
+			{ // 3G/WCDMA mode
+			iUidValue = KPSUidWcdmaStatusValue;
+			}
+		else if ( networkMode == RMobilePhone::ENetworkModeGsm ||
+				  networkMode == RMobilePhone::ENetworkModeUnknown ||	
+				  networkMode == RMobilePhone::ENetworkModeUnregistered )
+			{
+			iUidValue = KPSUidGprsStatusValue;
+			}
+		}
+
+    // initial subscription and process current property value
+    RunL();
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::NewL
+//
+// Creats an instance of the CHttpFilterConnHandlerObserver
+// ------------------------------------------------------------------------------
+CHttpFilterConnHandlerObserver* CHttpFilterConnHandlerObserver::NewL(MConnectionCallback* aConnCallback)
+{
+    CHttpFilterConnHandlerObserver* self = new( ELeave ) CHttpFilterConnHandlerObserver(aConnCallback);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::~CHttpFilterConnHandlerObserver
+//
+// Destructor
+// ------------------------------------------------------------------------------
+CHttpFilterConnHandlerObserver::~CHttpFilterConnHandlerObserver()
+{
+    Cancel();
+    iGPRSStateProperty.Close();
+    iWCDMAStateProperty.Close();
+    iMobilePhone.Close();
+    iTelServer.Close();
+    if ( iSuspendTimer )
+        iSuspendTimer->Cancel();
+    delete iSuspendTimer;
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::DoCancel
+//
+// Cancellation of notify.
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::DoCancel()
+{
+	if (iPrevUidValue == KPSUidGprsStatusValue)
+		iGPRSStateProperty.Cancel();
+	else if (iPrevUidValue == KPSUidWcdmaStatusValue)
+		iWCDMAStateProperty.Cancel();
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::RunL
+//
+// This method will be called when the iGPRSStateProperty or iWCDMAStateProperty is updated
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::RunL()
+{
+    TInt state;
+	TInt err = KErrNone;
+    // resubscribe before processing new value
+
+	RMobilePhone::TMobilePhoneNetworkMode networkMode;
+	User::LeaveIfError( iMobilePhone.GetCurrentMode( networkMode ) );
+
+	if( networkMode == RMobilePhone::ENetworkModeWcdma ||
+		networkMode == RMobilePhone::ENetworkModeTdcdma )
+		{ 
+		iUidValue = KPSUidWcdmaStatusValue;
+		// Subscribing to 3G/WCDMA status events
+		iWCDMAStateProperty.Subscribe(iStatus);
+
+		SetActive();
+
+		if (iPrevUidValue == KPSUidGprsStatusValue)
+			{
+			err = iGPRSStateProperty.Get(state);
+			}
+		else
+			{
+			err = iWCDMAStateProperty.Get(state);
+			}
+		iPrevUidValue = KPSUidWcdmaStatusValue;
+		}
+	else if ( networkMode == RMobilePhone::ENetworkModeGsm ||
+			  networkMode == RMobilePhone::ENetworkModeUnknown ||	
+			  networkMode == RMobilePhone::ENetworkModeUnregistered )
+		{
+		iUidValue = KPSUidGprsStatusValue;
+		// Subscribing to 2G/GPRS status events
+		iGPRSStateProperty.Subscribe(iStatus);
+
+		SetActive();
+
+		if (iPrevUidValue == KPSUidWcdmaStatusValue)
+			{
+			err = iWCDMAStateProperty.Get(state);
+			}
+		else
+			{
+			err = iGPRSStateProperty.Get(state);
+			}
+		iPrevUidValue = KPSUidGprsStatusValue;
+		}
+
+
+    if(err == KErrNone)
+    {
+      HandleStatePropertyL(state);      
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::GetStateL
+//
+// Get state property
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::GetStateL(TInt iUidValue, TInt& aState)
+{
+    TInt ret = KErrNone;
+    switch( iUidValue )
+        {
+        case KPSUidGprsStatusValue:
+            {                
+            ret = iGPRSStateProperty.Get(KUidSystemCategory, iUidValue, aState);
+            }         
+            break;
+
+        case KPSUidWcdmaStatusValue:
+            {                
+            ret = iWCDMAStateProperty.Get(KUidSystemCategory, iUidValue, aState);
+            }    
+            break;
+
+        default:
+	        break;
+        }
+    if ( ret != KErrNotFound && ret != KErrNone )
+        {
+        User::Leave( ret );
+        }
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::SetObserverState
+//
+// Set iObserverState data member (observer state)
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::SetObserverState(TInt aState)
+{
+    iObserverState = aState;
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::SetBearerTypeAndUid
+//
+// Set iBearerType
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::SetBearerTypeAndUid(TApBearerType aBearerType)
+{
+	TInt state;
+    iBearerType = aBearerType;
+    // set uid according to iBearerType
+    switch( iBearerType )
+    {
+      case EApBearerTypeGPRS:
+        {
+		RMobilePhone::TMobilePhoneNetworkMode networkMode;
+		User::LeaveIfError( iMobilePhone.GetCurrentMode( networkMode ) );
+
+		if( networkMode == RMobilePhone::ENetworkModeWcdma ||
+			networkMode == RMobilePhone::ENetworkModeTdcdma )
+			{
+			User::LeaveIfError(iWCDMAStateProperty.Get(KUidSystemCategory, KPSUidWcdmaStatusValue, state));
+			iUidValue = KPSUidWcdmaStatusValue;
+			}
+		else if ( networkMode == RMobilePhone::ENetworkModeGsm ||
+				  networkMode == RMobilePhone::ENetworkModeUnknown ||	
+				  networkMode == RMobilePhone::ENetworkModeUnregistered )
+			{
+			User::LeaveIfError(iGPRSStateProperty.Get(KUidSystemCategory, KPSUidGprsStatusValue, state));
+			iUidValue = KPSUidGprsStatusValue;
+			}
+        }         
+        break;
+
+      case EApBearerTypeCDMA:
+        {                
+           iUidValue = KPSUidWcdmaStatusValue;
+        }    
+        break;
+
+	default:
+		break;
+    }
+}
+
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::GetObserverState
+//
+// Set iRequested data member
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::GetObserverState(TInt& aState)
+{
+    aState = iObserverState;
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::HandleStatePropertyL
+//
+// This method will be called when the StateProperty will be updated
+// In case of GPRS:
+//	EPSGprsUnattached,
+//	EPSGprsAttach,
+//	EPSGprsContextActive,
+//	EPSGprsSuspend,
+//	EPSGprsContextActivating,
+//	EPSGprsMultibleContextActive
+// Handle changed stateProperty
+// ------------------------------------------------------------------------------
+void CHttpFilterConnHandlerObserver::HandleStatePropertyL(TInt aState )
+{
+//    RFileLogger::WriteFormat(KDir, KFile, EFileLoggingModeAppend, _L8("GPRS %d"), aState);
+//    RFileLogger::WriteFormat(KDir, KFile, EFileLoggingModeAppend, _L8("Obs state %d"), iObserverState);
+    // handle GPRS bearer type
+     if (iUidValue == KPSUidGprsStatusValue || iUidValue == KPSUidWcdmaStatusValue)
+     {
+       switch (aState)
+        {
+        case EPSGprsSuspend: // including case EPSWcdmaSuspend: 
+
+            if (iObserverState == EActiveReady)
+            {
+                // start the timer. If the ESAGprsContextActive event will not occure
+                // before the timer expired the
+                // current transaction will be canceled and the user will be notified.
+                iSuspendTimer->Cancel();
+                iSuspendTimer->Start(
+                    KMaxOutOfCoverageTime,
+                    0,  // No interval
+                    TCallBack( TimerSuspendCallback, this ) );
+
+                iObserverState = ESuspended;
+            }
+            break;
+			
+        case EPSGprsUnattached: // including case EPSWcdmaUnattached:
+            if (iObserverState == ESuspended)
+            {
+                iSuspendTimer->Cancel();
+                iConnCallback->CoverageEvent(EErrWaitTimeout);
+                iObserverState = EIdle;
+            }
+            break;
+
+        case EPSGprsContextActive: // case EPSWcdmaContextActive:
+        case EPSGprsMultibleContextActive: // case EPSWcdmaMultipleContextActive:
+            if (iObserverState == ESuspended)
+            {
+                // Signal came back, so just stop a timer
+                iSuspendTimer->Cancel();
+                iObserverState = EActiveReady;
+            }
+            break;
+
+        default:
+            break;
+
+        } //switch
+	 }
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::DoTimerSuspend
+// callback function for the TimerSuspended
+// -----------------------------------------------------------------------------
+//
+void CHttpFilterConnHandlerObserver::DoTimerSuspend()
+{
+    iSuspendTimer->Cancel();
+
+    TInt gprsState = EPSGprsSuspend;
+    TInt wcdmaState = EPSWcdmaSuspend;
+    
+    iGPRSStateProperty.Get(KUidSystemCategory, KPSUidGprsStatusValue, gprsState);
+    iWCDMAStateProperty.Get(KUidSystemCategory, KPSUidWcdmaStatusValue, wcdmaState);
+
+    if (gprsState == EPSGprsSuspend && wcdmaState == EPSWcdmaSuspend)
+       {
+       // Note that this will be run also if there was an error when getting Gprs/Wcdma status
+       // because they were initialized to 'suspend'
+		if (iObserverState == ESuspended)
+			{
+			iObserverState = EIdle;
+			iConnCallback->CoverageEvent(EErrWaitTimeout);
+	//        RFileLogger::WriteFormat(KDir, KFile, EFileLoggingModeAppend, _L8("CTimer:Event"));
+			}
+		}
+	else
+       {
+       iObserverState = EActiveReady;         
+       }
+}
+
+// -----------------------------------------------------------------------------
+// CHttpFilterConnHandlerObserver::TimerSuspendCallback
+// callback function for the TimerSuspended
+// -----------------------------------------------------------------------------
+//
+TInt CHttpFilterConnHandlerObserver::TimerSuspendCallback(TAny* aAny )
+{
+    ((CHttpFilterConnHandlerObserver*)aAny)->DoTimerSuspend();
+    return KErrNone;
+}
+
+//  End of File
+