diff -r 000000000000 -r b497e44ab2fc syncmlfw/ds/syncagent/src/nsmldsnetmon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/ds/syncagent/src/nsmldsnetmon.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,413 @@ +/* +* Copyright (c) 2008 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: The Conmon Active object listening for the Network unavalibility + events and launches the Auto-restart exe +* +*/ + + +// USER INCLUDES +#include "nsmldsnetmon.h" +#include + +//Constants +const TInt KNsmlDsAutoStartTimeoutKey = 4; // 0x0000004 defined in DS cenrep +const TUid KRepositoryId = { 0x2000CF7E }; + +// ----------------------------------------------------------------------------- +// StaticDoStopDSSession() +// Global function to handle the timeout +// ----------------------------------------------------------------------------- +// + +static TInt StaticLaunchAutoRestartL(TAny *aPtr) +{ + CNsmlDSNetmon* srv = (CNsmlDSNetmon*) aPtr; + //Stop the DS Session + return srv->LaunchAutoRestartL(); +} + +// ============================== MEMBER FUNCTIONS ============================ + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::NewL +// Two Phase Construction +// ---------------------------------------------------------------------------- +CNsmlDSNetmon* CNsmlDSNetmon::NewL(CNSmlDSAgent& aDSAgent) +{ + CNsmlDSNetmon* self = new (ELeave) CNsmlDSNetmon; + CleanupStack::PushL(self); + self->ConstructL(aDSAgent); + CleanupStack::Pop(); + return self; +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::CNsmlDSNetmon +// Constructor +// ---------------------------------------------------------------------------- +CNsmlDSNetmon::CNsmlDSNetmon() : CActive(CActive::EPriorityStandard) +{ + CActiveScheduler::Add(this); +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::ConstructL +// Second phase constructor +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::ConstructL(CNSmlDSAgent& aDSAgent) +{ + DBG_FILE(_S8("CNsmlDSNetmon::ConstructL() begins")); + + // Initial state + iState = ERegister; + iDSAgent=&aDSAgent; + IssueRequest(); + + //Auto_Restart + iDSAgent->iPacketDataUnAvailable = EFalse; + + iRoamingStatus = 0; + + iAutoRestartTimer = NULL; + + DBG_FILE(_S8("CNsmlDSNetmon::ConstructL() ends")); +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::~CNsmlDSNetmon +// Destructor +// ---------------------------------------------------------------------------- +CNsmlDSNetmon::~CNsmlDSNetmon() +{ + DBG_FILE(_S8("CNsmlDSNetmon::~CNsmlDSNetmon() begins")); + + Cancel(); + Complete(); + + if ( iAutoRestartTimer ) + { + iAutoRestartTimer->Cancel(); + delete iAutoRestartTimer; + iAutoRestartTimer = NULL; + } + + DBG_FILE(_S8("CNsmlDSNetmon::~CNsmlDSNetmon() ends")); +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::DoCancel +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::DoCancel() +{ +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::RunL +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::RunL() +{ + switch ( iState ) + { + case ERegister: + RegisterL(); + break; + + case EComplete: + Complete(); + break; + + default: + break; + } +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::RunError +// ---------------------------------------------------------------------------- +TInt CNsmlDSNetmon::RunError ( TInt aError ) +{ + return aError; +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::RegisterL +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::RegisterL() +{ + DBG_FILE(_S8("CNsmlDSNetmon::RegisterL() Begins")); + + // Register for events + iConnectionMonitor.ConnectL(); + iConnectionMonitor.NotifyEventL(*this); + + TInt err = iConnectionMonitor.SetUintAttribute( EBearerIdAll, + 0, + KSignalStrengthThreshold, + 1 ); + //Check whether the Users' Network is in Roaming + iRoamingStatus = 0; + TRequestStatus gprsstatus; + + iConnectionMonitor.GetIntAttribute(EBearerIdGPRS, + 0, + KNetworkRegistration, + iRoamingStatus, + gprsstatus); + + User::WaitForRequest(gprsstatus); + + TRequestStatus wcdmastatus; + if(iRoamingStatus == 0) + { + iConnectionMonitor.GetIntAttribute(EBearerIdWCDMA, + 0, + KNetworkRegistration, + iRoamingStatus, + wcdmastatus); + + User::WaitForRequest(wcdmastatus); + } + DBG_FILE_CODE(iRoamingStatus, _S8("CNsmlDSNetmon::RegisterL(), The Roaming Status is:")); + + + DBG_FILE(_S8("CNsmlDSNetmon::RegisterL() ends")); +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::Complete +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::Complete() +{ + DBG_FILE(_S8("CNsmlDSNetmon::Complete() begins")); + + // Un-register for events + iConnectionMonitor.CancelNotifications(); + iConnectionMonitor.Close(); + + + DBG_FILE(_S8("CNsmlDSNetmon::Complete() end")); +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::EventL +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::EventL ( const CConnMonEventBase& aEvent ) +{ + DBG_FILE(_S8("CNsmlDSNetmon::EventL() Begins")); + + DBG_FILE_CODE(aEvent.ConnectionId(), _S8("The Connection ID is:")); + DBG_FILE_CODE(aEvent.EventType(), _S8("The Event Type is:")); + + const CConnMonNetworkStatusChange * eventNetworkStatus; + eventNetworkStatus = ( const CConnMonNetworkStatusChange* ) &aEvent; + + const CConnMonConnectionStatusChange* eventConnectionStatus; + eventConnectionStatus = ( const CConnMonConnectionStatusChange* ) &aEvent; + + DBG_FILE_CODE(eventNetworkStatus->NetworkStatus(), _S8("The Network Status is:")); + DBG_FILE_CODE(eventConnectionStatus->ConnectionStatus(), _S8("The Connection Status is:")); + + //Fix for BPSS-7GBGV7 + if( iDSAgent->IsSyncClientInitiated() && + (iDSAgent->iNetmonAPBearerType == EApBearerTypeGPRS || + iDSAgent->iNetmonAPBearerType == EApBearerTypeCDMA) ) + + { + switch(aEvent.ConnectionId()) + { + case EBearerIdGPRS: + case EBearerIdWCDMA: + { + switch(aEvent.EventType()) + { + case EConnMonNetworkStatusChange: + { + switch(eventNetworkStatus->NetworkStatus()) + { + //Network Down Scenario + case EConnMonStatusNotAvailable: + //General to Offline Scenario + case EConnMonStatusUnattached: + //Incoming Voice Call Scenario + case EConnMonStatusSuspended: + { + //Launch NetMon + StartTimerL(); + } + break; + + //Network Up Scenario + case EConnMonStatusActive: + { + //Kill NetMon + StopTimer(); + } + break; + } + + } + break; + + //Offline to General Scenario + case EConnMonPacketDataAvailable: + { + //Kill Netmon + StopTimer(); + } + break; + } + } + break; + + default: + DBG_FILE(_S8("CNsmlDSNetmon::EventL() In the Default Case")); + if( eventConnectionStatus->ConnectionStatus() == KConnectionClosed ) + { + //Launch NetMon + StartTimerL(); + } + break; + + } + } + + DBG_FILE(_S8("CNsmlDSNetmon::EventL() Ends")); +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::StartTimerL +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::StartTimerL() +{ + if(!iDSAgent->iPacketDataUnAvailable) + { + DBG_FILE(_S8("CNsmlDSNetmon::EventL() Packet Data is not Available")); + + iDSAgent->iPacketDataUnAvailable = ETrue; + + TInt timeout = ReadTimeoutFromCenrepL(); + + if(timeout <= 0) + { + DBG_FILE(_S8("CNsmlDSNetmon::EventL() Timer Value is not Valid Launching the Netmon")); + LaunchAutoRestartL(); + } + + else + { + DBG_FILE(_S8("CNsmlDSNetmon::EventL() Starting the Timer")); + + iPacketDataUnAvailableTime.HomeTime(); + + if ( iAutoRestartTimer ) + { + iAutoRestartTimer->Cancel(); + delete iAutoRestartTimer; + iAutoRestartTimer = NULL; + } + iAutoRestartTimer = CPeriodic::NewL (EPriorityNormal) ; + iAutoRestartTimer->Start ( + TTimeIntervalMicroSeconds32( timeout ) + , TTimeIntervalMicroSeconds32( timeout ) + , TCallBack(StaticLaunchAutoRestartL,this) ) ; + } + + } +} +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::StopTimer +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::StopTimer() +{ + if(iDSAgent->iPacketDataUnAvailable) + { + DBG_FILE(_S8("CNsmlDSNetmon::EventL() Packet Data is Available")); + + iDSAgent->iPacketDataUnAvailable = EFalse; + + iPacketDataAvailableTime.HomeTime(); + TTimeIntervalSeconds duration; + iPacketDataAvailableTime.SecondsFrom(iPacketDataUnAvailableTime,duration); + + if ( iAutoRestartTimer ) + { + iAutoRestartTimer->Cancel(); + delete iAutoRestartTimer; + iAutoRestartTimer = NULL; + } + //if(duration.Int() >= (5 * 60)) + //{ + //Invoke the NETMON exe and Kill the session + // iDSAgent->LaunchAutoRestartL(KErrNone); + //} + } +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::LaunchAutoRestart +// ---------------------------------------------------------------------------- +TBool CNsmlDSNetmon::LaunchAutoRestartL() +{ + iDSAgent->LaunchAutoRestartL(KErrNone); + return ETrue; +} + + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::IssueRequest +// ---------------------------------------------------------------------------- +void CNsmlDSNetmon::IssueRequest() +{ + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::IsRoaming +// ---------------------------------------------------------------------------- +TBool CNsmlDSNetmon::IsRoaming() +{ + if(iRoamingStatus == ENetworkRegistrationRoaming) + return ETrue; + else + return EFalse; +} + +// ---------------------------------------------------------------------------- +// CNsmlDSNetmon::ReadTimeoutFromCenrepL +// ---------------------------------------------------------------------------- +TInt CNsmlDSNetmon::ReadTimeoutFromCenrepL() +{ + DBG_FILE(_S8("CNsmlDSNetmon::ReadTimeoutFromCenrepL() begins")); + + TInt timeoutInMinutes = 0; + + // Read the value from cenrep + CRepository* repository = CRepository::NewLC(KRepositoryId); + TInt err = repository->Get(KNsmlDsAutoStartTimeoutKey, timeoutInMinutes); + User::LeaveIfError(err); + CleanupStack::PopAndDestroy(repository); + + TInt timeout = timeoutInMinutes * 60 * 1000000; + + DBG_FILE(_S8("CNsmlDSNetmon::ReadTimeoutFromCenrepL() ends")); + + return timeout; +} + + +// End of file +