httpfilters/httpfilterconnhandler/Src/httpfilterconnhandlerObserverPS.cpp
changeset 0 b16258d2340f
child 8 fa2fd8b2d6cc
equal deleted inserted replaced
-1:000000000000 0:b16258d2340f
       
     1 /*
       
     2 * Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Observer of System Agent events
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <es_sock.h>
       
    22 #include <PSVariables.h>  // Publish & Subscribe
       
    23 #include <MmTsy_names.h>
       
    24 
       
    25 // User Includes
       
    26 #include "httpfilterConnHandlerObserverPS.h"
       
    27 #include "mconnectioncallback.h"
       
    28 // #include <flogger.h>
       
    29 //_LIT(KDir, "connFilter");
       
    30 //_LIT(KFile, "filtererr.txt");
       
    31 
       
    32 // EXTERNAL DATA STRUCTURES
       
    33 
       
    34 // EXTERNAL FUNCTION PROTOTYPES
       
    35 
       
    36 // CONSTANTS
       
    37 const TInt KMaxOutOfCoverageTime   = 60*1000000;  //60 sec - Updated to 60 secs as part of error fix JSIN-7JSE6H
       
    38 
       
    39 // MACROS
       
    40 
       
    41 // LOCAL CONSTANTS AND MACROS
       
    42 
       
    43 // MODULE DATA STRUCTURES
       
    44 
       
    45 // LOCAL FUNCTION PROTOTYPES
       
    46 
       
    47 // FORWARD DECLARATIONS
       
    48 
       
    49 // ============================= LOCAL FUNCTIONS ===============================
       
    50 
       
    51 
       
    52 // ============================ MEMBER FUNCTIONS ===============================
       
    53 
       
    54 // -----------------------------------------------------------------------------
       
    55 // CHttpFilterConnHandlerObserver::CHttpFilterConnHandlerObserver
       
    56 // C++ default constructor can NOT contain any code, that
       
    57 // might leave.
       
    58 // -----------------------------------------------------------------------------
       
    59 
       
    60 CHttpFilterConnHandlerObserver::CHttpFilterConnHandlerObserver(MConnectionCallback* aConnCallback):
       
    61         CActive(CActive::EPriorityHigh),iConnCallback(aConnCallback)
       
    62 {
       
    63     iObserverState = EIdle;
       
    64     // hardcode iUidValue = KPSUidGprsStatusValue for GPRS
       
    65     // The iUidValue and iBearerType will be defined after connection is done
       
    66     iUidValue = 0;  // no default value, as it will be set on Network mode check
       
    67 	iPrevUidValue = 0; // no default value, as it will be set on Network mode check
       
    68 	iBearerType = EApBearerTypeGPRS; // it is hardcoded in Connection manager, and it does not depend on GPRS nor 3G/WCDMA
       
    69 
       
    70 }
       
    71 
       
    72 // -----------------------------------------------------------------------------
       
    73 // CHttpFilterConnHandlerObserver::ConstructL
       
    74 // ------------------------------------------------------------------------------
       
    75 void CHttpFilterConnHandlerObserver::ConstructL()
       
    76 {
       
    77     // Note: the CHttpFilterConnHandlerObserver object s.b. created after connection is set for particular bearer
       
    78     User::LeaveIfError(iGPRSStateProperty.Attach(KUidSystemCategory, KPSUidGprsStatusValue));
       
    79     User::LeaveIfError(iWCDMAStateProperty.Attach(KUidSystemCategory, KPSUidWcdmaStatusValue)); 
       
    80 
       
    81     CActiveScheduler::Add(this);
       
    82     iSuspendTimer = CPeriodic::NewL(CActive::EPriorityLow );
       
    83     if( !iTelServer.Handle() )	
       
    84         {
       
    85         // this initialization needed for identifying 3G networks
       
    86         //
       
    87         User::LeaveIfError( iTelServer.Connect() );
       
    88         User::LeaveIfError( iTelServer.LoadPhoneModule( KMmTsyModuleName ) );
       
    89 
       
    90         TInt numPhones;
       
    91         User::LeaveIfError( iTelServer.EnumeratePhones( numPhones ) );
       
    92         if( numPhones <= 0 )
       
    93             {
       
    94             // Huh???
       
    95             User::Leave( KErrCorrupt );
       
    96             }
       
    97 
       
    98         RTelServer::TPhoneInfo phoneInfo;
       
    99         User::LeaveIfError( iTelServer.GetPhoneInfo( 0, phoneInfo ) );
       
   100         User::LeaveIfError( iMobilePhone.Open( iTelServer, phoneInfo.iName ) );
       
   101         User::LeaveIfError( iMobilePhone.Initialise() );
       
   102 
       
   103 		RMobilePhone::TMobilePhoneNetworkMode networkMode;
       
   104 		User::LeaveIfError( iMobilePhone.GetCurrentMode( networkMode ) );
       
   105 
       
   106 		if( networkMode == RMobilePhone::ENetworkModeWcdma ||
       
   107 			networkMode == RMobilePhone::ENetworkModeTdcdma )
       
   108 			{ // 3G/WCDMA mode
       
   109 			iUidValue = KPSUidWcdmaStatusValue;
       
   110 			}
       
   111 		else if ( networkMode == RMobilePhone::ENetworkModeGsm ||
       
   112 				  networkMode == RMobilePhone::ENetworkModeUnknown ||	
       
   113 				  networkMode == RMobilePhone::ENetworkModeUnregistered )
       
   114 			{
       
   115 			iUidValue = KPSUidGprsStatusValue;
       
   116 			}
       
   117 		}
       
   118 
       
   119     // initial subscription and process current property value
       
   120     RunL();
       
   121 }
       
   122 
       
   123 // -----------------------------------------------------------------------------
       
   124 // CHttpFilterConnHandlerObserver::NewL
       
   125 //
       
   126 // Creats an instance of the CHttpFilterConnHandlerObserver
       
   127 // ------------------------------------------------------------------------------
       
   128 CHttpFilterConnHandlerObserver* CHttpFilterConnHandlerObserver::NewL(MConnectionCallback* aConnCallback)
       
   129 {
       
   130     CHttpFilterConnHandlerObserver* self = new( ELeave ) CHttpFilterConnHandlerObserver(aConnCallback);
       
   131     CleanupStack::PushL( self );
       
   132     self->ConstructL();
       
   133     CleanupStack::Pop();
       
   134     return self;
       
   135 }
       
   136 
       
   137 // -----------------------------------------------------------------------------
       
   138 // CHttpFilterConnHandlerObserver::~CHttpFilterConnHandlerObserver
       
   139 //
       
   140 // Destructor
       
   141 // ------------------------------------------------------------------------------
       
   142 CHttpFilterConnHandlerObserver::~CHttpFilterConnHandlerObserver()
       
   143 {
       
   144     Cancel();
       
   145     iGPRSStateProperty.Close();
       
   146     iWCDMAStateProperty.Close();
       
   147     iMobilePhone.Close();
       
   148     iTelServer.Close();
       
   149     if ( iSuspendTimer )
       
   150         iSuspendTimer->Cancel();
       
   151     delete iSuspendTimer;
       
   152 }
       
   153 
       
   154 // -----------------------------------------------------------------------------
       
   155 // CHttpFilterConnHandlerObserver::DoCancel
       
   156 //
       
   157 // Cancellation of notify.
       
   158 // ------------------------------------------------------------------------------
       
   159 void CHttpFilterConnHandlerObserver::DoCancel()
       
   160 {
       
   161 	if (iPrevUidValue == KPSUidGprsStatusValue)
       
   162 		iGPRSStateProperty.Cancel();
       
   163 	else if (iPrevUidValue == KPSUidWcdmaStatusValue)
       
   164 		iWCDMAStateProperty.Cancel();
       
   165 }
       
   166 
       
   167 // -----------------------------------------------------------------------------
       
   168 // CHttpFilterConnHandlerObserver::RunL
       
   169 //
       
   170 // This method will be called when the iGPRSStateProperty or iWCDMAStateProperty is updated
       
   171 // ------------------------------------------------------------------------------
       
   172 void CHttpFilterConnHandlerObserver::RunL()
       
   173 {
       
   174     TInt state;
       
   175 	TInt err = KErrNone;
       
   176     // resubscribe before processing new value
       
   177 
       
   178 	RMobilePhone::TMobilePhoneNetworkMode networkMode;
       
   179 	User::LeaveIfError( iMobilePhone.GetCurrentMode( networkMode ) );
       
   180 
       
   181 	if( networkMode == RMobilePhone::ENetworkModeWcdma ||
       
   182 		networkMode == RMobilePhone::ENetworkModeTdcdma )
       
   183 		{ 
       
   184 		iUidValue = KPSUidWcdmaStatusValue;
       
   185 		// Subscribing to 3G/WCDMA status events
       
   186 		iWCDMAStateProperty.Subscribe(iStatus);
       
   187 
       
   188 		SetActive();
       
   189 
       
   190 		if (iPrevUidValue == KPSUidGprsStatusValue)
       
   191 			{
       
   192 			err = iGPRSStateProperty.Get(state);
       
   193 			}
       
   194 		else
       
   195 			{
       
   196 			err = iWCDMAStateProperty.Get(state);
       
   197 			}
       
   198 		iPrevUidValue = KPSUidWcdmaStatusValue;
       
   199 		}
       
   200 	else if ( networkMode == RMobilePhone::ENetworkModeGsm ||
       
   201 			  networkMode == RMobilePhone::ENetworkModeUnknown ||	
       
   202 			  networkMode == RMobilePhone::ENetworkModeUnregistered )
       
   203 		{
       
   204 		iUidValue = KPSUidGprsStatusValue;
       
   205 		// Subscribing to 2G/GPRS status events
       
   206 		iGPRSStateProperty.Subscribe(iStatus);
       
   207 
       
   208 		SetActive();
       
   209 
       
   210 		if (iPrevUidValue == KPSUidWcdmaStatusValue)
       
   211 			{
       
   212 			err = iWCDMAStateProperty.Get(state);
       
   213 			}
       
   214 		else
       
   215 			{
       
   216 			err = iGPRSStateProperty.Get(state);
       
   217 			}
       
   218 		iPrevUidValue = KPSUidGprsStatusValue;
       
   219 		}
       
   220 
       
   221 
       
   222     if(err == KErrNone)
       
   223     {
       
   224       HandleStatePropertyL(state);      
       
   225     }
       
   226 }
       
   227 
       
   228 // -----------------------------------------------------------------------------
       
   229 // CHttpFilterConnHandlerObserver::GetStateL
       
   230 //
       
   231 // Get state property
       
   232 // ------------------------------------------------------------------------------
       
   233 void CHttpFilterConnHandlerObserver::GetStateL(TInt iUidValue, TInt& aState)
       
   234 {
       
   235     TInt ret = KErrNone;
       
   236     switch( iUidValue )
       
   237         {
       
   238         case KPSUidGprsStatusValue:
       
   239             {                
       
   240             ret = iGPRSStateProperty.Get(KUidSystemCategory, iUidValue, aState);
       
   241             }         
       
   242             break;
       
   243 
       
   244         case KPSUidWcdmaStatusValue:
       
   245             {                
       
   246             ret = iWCDMAStateProperty.Get(KUidSystemCategory, iUidValue, aState);
       
   247             }    
       
   248             break;
       
   249 
       
   250         default:
       
   251 	        break;
       
   252         }
       
   253     if ( ret != KErrNotFound && ret != KErrNone )
       
   254         {
       
   255         User::Leave( ret );
       
   256         }
       
   257 }
       
   258 
       
   259 // -----------------------------------------------------------------------------
       
   260 // CHttpFilterConnHandlerObserver::SetObserverState
       
   261 //
       
   262 // Set iObserverState data member (observer state)
       
   263 // ------------------------------------------------------------------------------
       
   264 void CHttpFilterConnHandlerObserver::SetObserverState(TInt aState)
       
   265 {
       
   266     iObserverState = aState;
       
   267 }
       
   268 
       
   269 // -----------------------------------------------------------------------------
       
   270 // CHttpFilterConnHandlerObserver::SetBearerTypeAndUid
       
   271 //
       
   272 // Set iBearerType
       
   273 // ------------------------------------------------------------------------------
       
   274 void CHttpFilterConnHandlerObserver::SetBearerTypeAndUid(TApBearerType aBearerType)
       
   275 {
       
   276 	TInt state;
       
   277     iBearerType = aBearerType;
       
   278     // set uid according to iBearerType
       
   279     switch( iBearerType )
       
   280     {
       
   281       case EApBearerTypeGPRS:
       
   282         {
       
   283 		RMobilePhone::TMobilePhoneNetworkMode networkMode;
       
   284 		User::LeaveIfError( iMobilePhone.GetCurrentMode( networkMode ) );
       
   285 
       
   286 		if( networkMode == RMobilePhone::ENetworkModeWcdma ||
       
   287 			networkMode == RMobilePhone::ENetworkModeTdcdma )
       
   288 			{
       
   289 			User::LeaveIfError(iWCDMAStateProperty.Get(KUidSystemCategory, KPSUidWcdmaStatusValue, state));
       
   290 			iUidValue = KPSUidWcdmaStatusValue;
       
   291 			}
       
   292 		else if ( networkMode == RMobilePhone::ENetworkModeGsm ||
       
   293 				  networkMode == RMobilePhone::ENetworkModeUnknown ||	
       
   294 				  networkMode == RMobilePhone::ENetworkModeUnregistered )
       
   295 			{
       
   296 			User::LeaveIfError(iGPRSStateProperty.Get(KUidSystemCategory, KPSUidGprsStatusValue, state));
       
   297 			iUidValue = KPSUidGprsStatusValue;
       
   298 			}
       
   299         }         
       
   300         break;
       
   301 
       
   302       case EApBearerTypeCDMA:
       
   303         {                
       
   304            iUidValue = KPSUidWcdmaStatusValue;
       
   305         }    
       
   306         break;
       
   307 
       
   308 	default:
       
   309 		break;
       
   310     }
       
   311 }
       
   312 
       
   313 
       
   314 // -----------------------------------------------------------------------------
       
   315 // CHttpFilterConnHandlerObserver::GetObserverState
       
   316 //
       
   317 // Set iRequested data member
       
   318 // ------------------------------------------------------------------------------
       
   319 void CHttpFilterConnHandlerObserver::GetObserverState(TInt& aState)
       
   320 {
       
   321     aState = iObserverState;
       
   322 }
       
   323 
       
   324 // -----------------------------------------------------------------------------
       
   325 // CHttpFilterConnHandlerObserver::HandleStatePropertyL
       
   326 //
       
   327 // This method will be called when the StateProperty will be updated
       
   328 // In case of GPRS:
       
   329 //	EPSGprsUnattached,
       
   330 //	EPSGprsAttach,
       
   331 //	EPSGprsContextActive,
       
   332 //	EPSGprsSuspend,
       
   333 //	EPSGprsContextActivating,
       
   334 //	EPSGprsMultibleContextActive
       
   335 // Handle changed stateProperty
       
   336 // ------------------------------------------------------------------------------
       
   337 void CHttpFilterConnHandlerObserver::HandleStatePropertyL(TInt aState )
       
   338 {
       
   339 //    RFileLogger::WriteFormat(KDir, KFile, EFileLoggingModeAppend, _L8("GPRS %d"), aState);
       
   340 //    RFileLogger::WriteFormat(KDir, KFile, EFileLoggingModeAppend, _L8("Obs state %d"), iObserverState);
       
   341     // handle GPRS bearer type
       
   342      if (iUidValue == KPSUidGprsStatusValue || iUidValue == KPSUidWcdmaStatusValue)
       
   343      {
       
   344        switch (aState)
       
   345         {
       
   346         case EPSGprsSuspend: // including case EPSWcdmaSuspend: 
       
   347 
       
   348             if (iObserverState == EActiveReady)
       
   349             {
       
   350                 // start the timer. If the ESAGprsContextActive event will not occure
       
   351                 // before the timer expired the
       
   352                 // current transaction will be canceled and the user will be notified.
       
   353                 iSuspendTimer->Cancel();
       
   354                 iSuspendTimer->Start(
       
   355                     KMaxOutOfCoverageTime,
       
   356                     0,  // No interval
       
   357                     TCallBack( TimerSuspendCallback, this ) );
       
   358 
       
   359                 iObserverState = ESuspended;
       
   360             }
       
   361             break;
       
   362 			
       
   363         case EPSGprsUnattached: // including case EPSWcdmaUnattached:
       
   364             if (iObserverState == ESuspended)
       
   365             {
       
   366                 iSuspendTimer->Cancel();
       
   367                 iConnCallback->CoverageEvent(EErrWaitTimeout);
       
   368                 iObserverState = EIdle;
       
   369             }
       
   370             break;
       
   371 
       
   372         case EPSGprsContextActive: // case EPSWcdmaContextActive:
       
   373         case EPSGprsMultibleContextActive: // case EPSWcdmaMultipleContextActive:
       
   374             if (iObserverState == ESuspended)
       
   375             {
       
   376                 // Signal came back, so just stop a timer
       
   377                 iSuspendTimer->Cancel();
       
   378                 iObserverState = EActiveReady;
       
   379             }
       
   380             break;
       
   381 
       
   382         default:
       
   383             break;
       
   384 
       
   385         } //switch
       
   386 	 }
       
   387 }
       
   388 
       
   389 // -----------------------------------------------------------------------------
       
   390 // CHttpFilterConnHandlerObserver::DoTimerSuspend
       
   391 // callback function for the TimerSuspended
       
   392 // -----------------------------------------------------------------------------
       
   393 //
       
   394 void CHttpFilterConnHandlerObserver::DoTimerSuspend()
       
   395 {
       
   396     iSuspendTimer->Cancel();
       
   397 
       
   398     TInt gprsState = EPSGprsSuspend;
       
   399     TInt wcdmaState = EPSWcdmaSuspend;
       
   400     
       
   401     iGPRSStateProperty.Get(KUidSystemCategory, KPSUidGprsStatusValue, gprsState);
       
   402     iWCDMAStateProperty.Get(KUidSystemCategory, KPSUidWcdmaStatusValue, wcdmaState);
       
   403 
       
   404     if (gprsState == EPSGprsSuspend && wcdmaState == EPSWcdmaSuspend)
       
   405        {
       
   406        // Note that this will be run also if there was an error when getting Gprs/Wcdma status
       
   407        // because they were initialized to 'suspend'
       
   408 		if (iObserverState == ESuspended)
       
   409 			{
       
   410 			iObserverState = EIdle;
       
   411 			iConnCallback->CoverageEvent(EErrWaitTimeout);
       
   412 	//        RFileLogger::WriteFormat(KDir, KFile, EFileLoggingModeAppend, _L8("CTimer:Event"));
       
   413 			}
       
   414 		}
       
   415 	else
       
   416        {
       
   417        iObserverState = EActiveReady;         
       
   418        }
       
   419 }
       
   420 
       
   421 // -----------------------------------------------------------------------------
       
   422 // CHttpFilterConnHandlerObserver::TimerSuspendCallback
       
   423 // callback function for the TimerSuspended
       
   424 // -----------------------------------------------------------------------------
       
   425 //
       
   426 TInt CHttpFilterConnHandlerObserver::TimerSuspendCallback(TAny* aAny )
       
   427 {
       
   428     ((CHttpFilterConnHandlerObserver*)aAny)->DoTimerSuspend();
       
   429     return KErrNone;
       
   430 }
       
   431 
       
   432 //  End of File
       
   433