diff -r 6369bfd1b60d -r 08b5eae9f9ff homesync/contentmanager/cmserver/cmscheduler/src/cmscheduler.cpp --- a/homesync/contentmanager/cmserver/cmscheduler/src/cmscheduler.cpp Mon Nov 01 13:44:24 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,646 +0,0 @@ -/* -* 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: Content Manager server's scheduler component -* -*/ - - -// INCLUDE FILES -#include - -#include "cmsettings.h" -#include "cmcommonutils.h" -#include "cmscheduler.h" -#include "mediaservantuid.h" -#include "cmcommsdbnotifier.h" -#include "cmcenrepnotifier.h" -#include "msdebug.h" - -// WLAN scanning interval [s] -const TInt - KTimerInterval = 30 * 60 * 1000 * 1000; // 30 minutes in microseconds -const TInt KTimerCount = 2; // KTimerCount*KTimerInterval = 1 hour -const TUid KMediaServantUid = { KMediaServantUID3 }; // application uid -const TInt KOfflineProfile = 5; // offline profile identifier - -// ========================== MEMBER FUNCTIONS =============================== - -// Two-phased constructor. -EXPORT_C CCmScheduler* CCmScheduler::NewL( - MCmServiceObserver& aServer, MCmSettings& aSettings) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::NewL")); - CCmScheduler* self = new ( ELeave ) - CCmScheduler( aServer, aSettings ); - self->ConstructL(); - return self; - } - -// Destructor -CCmScheduler::~CCmScheduler() - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::~CCmScheduler")); - - Cancel(); - delete iNotifier; - delete iRepositoryNotifier; - iConnMon.CancelNotifications(); - iConnMon.Close(); - iTimer.Close(); - } - -// -------------------------------------------------------------------------- -// CCmScheduler::CCmScheduler -// C++ default constructor can NOT contain any code, that -// might leave. -// -------------------------------------------------------------------------- -// -CCmScheduler::CCmScheduler( - MCmServiceObserver& aServer, MCmSettings& aSettings) - : CActive( EPriorityStandard ), - iServer( aServer ), iSettings( aSettings ), - iScheduledServiceRunning( EFalse ), iEnabled( ETrue ), - iState( ECmScStateOffline ), iTimerCount( 0 ), - iServiceToExecute( ECmServicePreProcessingStore ), - iExecuteHarvest( ETrue ), iSchedulerInitiated( EFalse ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::CCmScheduler()")); - } - -// -------------------------------------------------------------------------- -// CCmScheduler::ConstructL() -// -------------------------------------------------------------------------- -// -void CCmScheduler::ConstructL() - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ConstructL")); - - // Ensure that iap is set. Otherwise scheduler cannot be used -#ifdef __DEBUG - TInt iap( 0 ); - User::LeaveIfError( iSettings.GetIapL( iap ) ); - TRACE( Print( _L("[Cm Scheduler]\t IAP to use is %d"), iap)); -#endif - - User::LeaveIfError( iTimer.CreateLocal() ); - CActiveScheduler::Add( this ); - iEnabled = EFalse; - - iRepositoryNotifier = CCmCenrepNotifier::NewL( *this ); - User::LeaveIfError( iRepositoryNotifier->GetCurrentProfile( - iCurrentProfile ) ); - - // create commsdb notifier - TRAPD( error, iNotifier = CCmCommsDbNotifier::NewL( *this ) ); - - if ( !error ) - { - iWlanScanState = iNotifier->WlanScanStateL(); - } - else - { - TRACE( Print( _L("[Cm Scheduler]\t CCmScheduler::ConstructL \ - error = %d"), error)); - } - - // check that mc is not in offline mode - if ( iCurrentProfile != KOfflineProfile ) - { - iState = ECmScStateOnline; - if ( error == KErrNone ) - { - // We assume that scan is off. - // State is checked and if it is on wlan events can be used. - if ( iNotifier->HasScanStateChangedL() ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ConstructL() \ - Scanning state changed on")); - // scanning is on - SetEnabledL( ETrue ); - } - - else - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ConstructL() \ - Scanning state is off - starting timer")); - // scanning is off - use timer - TryToStartRetryTimer(); - } - } - else - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ConstructL() \ - Notifier creation failed")); - // if notifier cannot be created we start the timer - TryToStartRetryTimer(); - } - } - else - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ConstructL() \ - profile = offline")); - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::EventL() -// Called when an event arrives to connection monitor -// -------------------------------------------------------------------------- -// -void CCmScheduler::EventL( const CConnMonEventBase& aConnMonEvent ) - { - TRACE(Print(_L("[Cm Scheduler]\t CCmScheduler::EventL() \ - eventtype = %d, connection id = %d"), - aConnMonEvent.EventType(), aConnMonEvent.ConnectionId())); - - TTime currentTime; - currentTime.HomeTime(); - - TTimeIntervalHours interval; - currentTime.HoursFrom( iLastSyncTime, interval ); - - TRACE(Print(_L("[Cm Scheduler]\t CCmScheduler::EventL() \ - hours from last sync = %d"), interval.Int())); - - if ( interval.Int() >= 1 && !ApplicationRunning() ) - { - HandleConnectionEventL( aConnMonEvent ); - } - - } - -// -------------------------------------------------------------------------- -// CCmScheduler::HandleConnectionEventL() -// Handles connection event -// -------------------------------------------------------------------------- -// -void CCmScheduler::HandleConnectionEventL( - const CConnMonEventBase& aConnMonEvent ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::HandleConnectionEventL() \ - HandleConnectionEventL")); - - if ( aConnMonEvent.EventType() == EConnMonIapAvailabilityChange ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::HandleConnectionEventL() \ - EConnMonIapAvailabilityChange")); - - TCmSchedulerState newState = ECmScStateOffline; - - if ( CheckIapAvailabilityL( aConnMonEvent ) ) - { - newState = ECmScStateOnline; - } - - if ( newState != iState ) - { - iState = newState; - - if ( newState && !iScheduledServiceRunning ) - { - LOG(_L("[Cm Scheduler]\t State changed to online,\ - starting operation..")); - iSchedulerInitiated = ETrue;// do also harvest - TRACE( Print( _L("[Cm Scheduler]\t HandleConnectionEventL \ - iSchedulerInitiated = %d"), iSchedulerInitiated)); - iExecuteHarvest = ETrue; - TRACE( Print( _L("[Cm Scheduler]\t HandleConnectionEventL \ - iExecuteHarvest = %d"), iExecuteHarvest)); - TryToExecuteService( iServiceToExecute ); - } - else - { - LOG(_L("[Cm Scheduler]\t State changed to offline,\ - canceling timer..")); - CancelTimer(); - } - } - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::RunL() -// Called when the timer elapses -// -------------------------------------------------------------------------- -// -void CCmScheduler::RunL() - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::RunL()")); - TRACE( Print( _L("[Cm Scheduler]\t status %d"), iStatus.Int() )); - TRACE( Print( _L("[Cm Scheduler]\t state %d"), iState )); - - if ( KErrNone == iStatus.Int() && - iState == ECmScStateOnline && - !iScheduledServiceRunning ) - { - if ( ++iTimerCount >= KTimerCount && !ApplicationRunning() ) - { - LOG(_L("[Cm Scheduler]\t Online timer passed, \ - starting operation..")); - iSchedulerInitiated = ETrue;// do also harvest - TRACE( Print( _L("[Cm Scheduler]\t RunL \ - iSchedulerInitiated = %d"), iSchedulerInitiated)); - iExecuteHarvest = ETrue; - TRACE( Print( _L("[Cm Scheduler]\t RunL \ - iExecuteHarvest = %d"), iExecuteHarvest)); - TryToExecuteService( iServiceToExecute ); - } - else - { - iTimer.After( iStatus, - TTimeIntervalMicroSeconds32( KTimerInterval ) ); - SetActive(); - } - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::TryToExecuteService() -// Starts process if application is not running -// -------------------------------------------------------------------------- -// -void CCmScheduler::TryToExecuteService( TCmService aService ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::TryToExecuteService()")); - TInt err = KErrNone; - - TRAP( err, iServer.ExecuteServiceL( aService )); - iScheduledServiceRunning = !err; - - if ( !err && aService == ECmServicePreProcessingStore ) - { - iStorePreprocessed = EFalse; - } - - TRACE( Print( _L("[Cm Scheduler]\t ExecuteServiceL err: %d"), err)); - - if ( err ) - { - TryToStartRetryTimer(); - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::TryToStartRetryTimer() -// Starts timer if not already active -// -------------------------------------------------------------------------- -// -void CCmScheduler::TryToStartRetryTimer() - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::TryToStartRetryTimer()")); - - if ( !IsActive() ) - { - LOG(_L("[Cm Scheduler]\t starting one hour resync timer..")); - - CancelTimer(); - - iTimer.After( - iStatus, TTimeIntervalMicroSeconds32( KTimerInterval )); - SetActive(); - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::CancelTimer() -// Cancels timer -// -------------------------------------------------------------------------- -// -void CCmScheduler::CancelTimer() - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::CancelTimer")); - - iTimer.Cancel(); - iTimerCount = 0; - } - -// -------------------------------------------------------------------------- -// CCmScheduler::SetEnabledL() -// Enabled/disabled connection monitor events -// -------------------------------------------------------------------------- -// -EXPORT_C void CCmScheduler::SetEnabledL( TBool aEnable ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::SetEnabled()")); - if ( iEnabled != aEnable ) - { - iEnabled = aEnable; - if ( iEnabled ) - { - LOG(_L("[Cm Scheduler]\t enabling scheduler..")); - LOG(_L("[Cm Scheduler]\t starting to listen wlan events..")); - User::LeaveIfError( iConnMon.ConnectL() ); - iConnMon.NotifyEventL( *this ); - - } - else // iConnMon is connected when entering here... - { - LOG(_L("[Cm Scheduler]\t disabling scheduler..")); - - iConnMon.CancelNotifications(); - iConnMon.Close(); - - } - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::SetServiceToExecute -// Sets service to be executed -// -------------------------------------------------------------------------- -// -EXPORT_C void CCmScheduler::SetServiceToExecute( TCmService aService ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::SetServiceToExecute()")); - iServiceToExecute = aService; - } - -// -------------------------------------------------------------------------- -// CCmScheduler::ServiceExecuted -// Called when service is ready -// -------------------------------------------------------------------------- -// -EXPORT_C void CCmScheduler::ServiceExecuted( TCmService aService, TInt aErr ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ServiceExecuted()")); - TRACE( Print( _L("[Cm Scheduler]\t service %d err %d"), - aService, aErr)); - - if ( !iScheduledServiceRunning ) - { - LOG(_L("[Cm Scheduler]\t No scheduled service running, returning")); - return; - } - - iScheduledServiceRunning = EFalse; - TBool startRetryTimer( EFalse ); - if ( aErr ) - { - startRetryTimer = ETrue; - } - else - { - switch ( aService ) - { - case ECmServicePreProcessingStore: - { - if ( iStorePreprocessed == EFalse ) - { - iStorePreprocessed = ETrue; - TryToExecuteService( ECmServiceStore ); - } - else - { - iLastSyncTime.HomeTime(); - startRetryTimer = ETrue; - iSchedulerInitiated = EFalse; - } - break; - } - case ECmServiceStore: - { - // execute fill - TryToExecuteService( ECmServiceFill ); - break; - } - - case ECmServiceFill: - { - if ( iExecuteHarvest ) - { - TRACE( Print( _L("[Cm Scheduler]\t serviceexecuted \ - harvest %d schedulerinitiated %d"), - iExecuteHarvest, iSchedulerInitiated)); - // execute harvest - TryToExecuteService( ECmServiceHarvest ); - } - else - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ServiceExecuted \ - ExecuteHarvest = EFalse")); - startRetryTimer = ETrue; - iLastSyncTime.HomeTime(); - iSchedulerInitiated = EFalse; - TRACE( Print( _L("[Cm Scheduler]\t ServiceExecuted \ - iSchedulerInitiated = %d"), iSchedulerInitiated)); - } - break; - } - - case ECmServiceHarvest: - // fall through - case ECmServicePreProcessingFill: - { - iSchedulerInitiated = EFalse; - TRACE( Print( _L("[Cm Scheduler]\t ServiceExecuted \ - iSchedulerInitiated = %d"), iSchedulerInitiated)); - startRetryTimer = ETrue; - iLastSyncTime.HomeTime(); - break; - } - - default: - { - LOG(_L("[Cm Scheduler]\t default")); - break; - } - } - - } - if ( startRetryTimer ) - { - TryToStartRetryTimer(); - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::DoCancel -// Called by framework when timer is cancelled -// -------------------------------------------------------------------------- -// -void CCmScheduler::DoCancel() - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::DoCancel()")); - - CancelTimer(); - } - -// -------------------------------------------------------------------------- -// CCmScheduler::WlanScanStateChanged -// starts/disables timer and connection monitor events depending on state -// of wlan scanning interval -// -------------------------------------------------------------------------- -// -void CCmScheduler::WlanScanStateChanged( TInt aState ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::WlanScanStateChanged()")); - - iWlanScanState = aState; - - if ( iCurrentProfile != KOfflineProfile ) - { - if ( aState == KWlanScanNetworkNever ) - { - TRAP_IGNORE( SetEnabledL( EFalse ) ); - // state is set online so we can try start process - iState = ECmScStateOnline; - TryToStartRetryTimer(); - } - else - { - // cancel timer - CancelTimer(); - - TRAP_IGNORE( SetEnabledL( ETrue ) ); - } - } - } - - -// -------------------------------------------------------------------------- -// CCmScheduler::ProfileChangedL -// -------------------------------------------------------------------------- -// -void CCmScheduler::ProfileChangedL( TInt aProfile ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ProfileChangedL()")); - - if ( aProfile == KOfflineProfile ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ProfileChangedL() \ - offline")); - - iCurrentProfile = aProfile; - - // disable wlan scanning - CmCommonUtils::SetWlanScanL( KWlanScanNetworkNever ); - - // stop receiving events - SetEnabledL( EFalse ); - // cancel timer - CancelTimer(); - } - else if ( iCurrentProfile == KOfflineProfile ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ProfileChangedL() \ - online")); - - iCurrentProfile = aProfile; - - // enable wlan scanning - CmCommonUtils::SetWlanScanL( KWlanScanNetworkInterval60 ); - - if ( iWlanScanState ) - { - SetEnabledL( ETrue ); - } - else - { - TryToStartRetryTimer(); - } - } - } - -// -------------------------------------------------------------------------- -// CCmScheduler::SetScheduledServiceState -// -------------------------------------------------------------------------- -// -EXPORT_C void CCmScheduler::SetScheduledServiceState( TBool aState ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::SetScheduledServiceState()")); - - iScheduledServiceRunning = aState; - // we don't want to make second round - iStorePreprocessed = ETrue; - // This function is called when application transfers responsibility - // to scheduler. In this case we don't want to do harvest. - if ( !iSchedulerInitiated ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::SetScheduledServiceState() \ - iSchedulerInitiated = EFalse")); - iExecuteHarvest = EFalse; - TRACE( Print( _L("[Cm Scheduler]\t SetScheduledServiceState \ - iExecuteHarvest = %d"), iExecuteHarvest)); - } - - } - -// -------------------------------------------------------------------------- -// CCmScheduler::RunError -// -------------------------------------------------------------------------- -// -TInt CCmScheduler::RunError( TInt aError ) - { - TRACE( Print( _L("[Cm Scheduler]\t CCmScheduler::RunError \ - error = %d"), aError)); - - return KErrNone; - } - -// -------------------------------------------------------------------------- -// CCmScheduler::ApplicationRunning -// -------------------------------------------------------------------------- -// -TBool CCmScheduler::ApplicationRunning() - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::ApplicationRunning()")); - - TBool mediaServantRunning( EFalse ); - RWsSession wsSession; - TInt err = wsSession.Connect(); - if ( !err ) - { - TApaTaskList taskList( wsSession ); - mediaServantRunning = taskList.FindApp( KMediaServantUid ).Exists(); - wsSession.Close(); - } - return mediaServantRunning; - } - -// -------------------------------------------------------------------------- -// CCmScheduler::CheckIapAvailabilityL() -// -------------------------------------------------------------------------- -// -TBool CCmScheduler::CheckIapAvailabilityL( - const CConnMonEventBase& aConnMonEvent ) - { - LOG(_L("[Cm Scheduler]\t CCmScheduler::CheckIapAvailabilityL()")); - - TBool iapFound( EFalse ); - TInt accessPoint( -1 ); - User::LeaveIfError( iSettings.GetIapL( accessPoint ) ); - TRACE( Print( _L("[Cm Scheduler]\t \ - IAP to use is %d"), accessPoint)); - - CConnMonIapAvailabilityChange* eventIap = - ( CConnMonIapAvailabilityChange* ) &aConnMonEvent; - - TConnMonIapInfo iaps = eventIap->IapAvailability(); - - for ( TInt i = 0; i < iaps.iCount; i++ ) - { - // Compare available IAPs to our IAP - TRACE( Print( _L("[Cm Scheduler]\t CONNMON iap: %d"), - iaps.iIap[i].iIapId)); - if ( accessPoint == iaps.iIap[i].iIapId ) - { - LOG(_L("[Cm Scheduler]\t FOUND CORRECT IAP!")); - iapFound = ETrue; - i = iaps.iCount; - } - } - return iapFound; - } - -// End of File