diff -r 491b3ed49290 -r 65326cf895ed filemanager/schbkup/src/filemanagerschbackuptask.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/schbkup/src/filemanagerschbackuptask.cpp Wed Sep 01 12:31:07 2010 +0100 @@ -0,0 +1,499 @@ +/* +* Copyright (c) 2006-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: Handles file manager scheduled backup task start +* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "filemanagerschbackuptask.h" +#include "filemanagerschsubscriber.h" +#include "FileManagerUID.h" +#include "FileManagerDebug.h" +#include "FileManagerSchDefinitions.h" +#include "FileManagerPrivateCRKeys.h" + +using namespace conn; + +// CONSTANTS +const TUid KUidFileManager = { KFileManagerUID3 }; +_LIT_SECURE_ID( KFileManagerSID, KFileManagerUID3 ); +const TInt KStartStateChangeTimeoutSecs = 30; +const TInt KPhoneStateChangeTimeoutSecs = 120; +const TInt KNumAttempts = -1; // Try forever + + +// ======== LOCAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// FindStandaloneAppL +// --------------------------------------------------------------------------- +// +static TBool FindStandaloneAppL( + RWsSession& aWs, const TUid& aUid, TInt& aWgId ) + { + FUNC_LOG + + aWgId = 0; // Used window group id is always greater than zero + RArray< RWsSession::TWindowGroupChainInfo > windowChain; + User::LeaveIfError( aWs.WindowGroupList( &windowChain ) ); + CleanupClosePushL( windowChain ); + TInt count( windowChain.Count() ); + for( TInt i( 0 ); i < count; ++i ) + { + const RWsSession::TWindowGroupChainInfo& entry( windowChain[ i ] ); + CApaWindowGroupName* app = CApaWindowGroupName::NewLC( + aWs, entry.iId ); + TUid appUid( app->AppUid() ); + CleanupStack::PopAndDestroy( app ); + // Match the app's UID and the embedded status. + // The app is standalone when there is no parent window group. + if ( appUid == aUid && entry.iParentId <= 0 ) + { + // Standalone application found + aWgId = entry.iId; + break; + } + } + CleanupStack::PopAndDestroy( &windowChain ); + return aWgId > 0; + } + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::CFileManagerSchBackupTask +// --------------------------------------------------------------------------- +// +CFileManagerSchBackupTask::CFileManagerSchBackupTask() : + CActive( EPriorityStandard ), + iDay( KErrNotFound ), + iAttemptsLeft( KNumAttempts ) + { + FUNC_LOG + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::NewL +// --------------------------------------------------------------------------- +// +CFileManagerSchBackupTask* CFileManagerSchBackupTask::NewL( + const CScheduledTask& aTask ) + { + FUNC_LOG + + CFileManagerSchBackupTask* self = + new ( ELeave ) CFileManagerSchBackupTask(); + CleanupStack::PushL( self ); + self->ConstructL( aTask ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::~CFileManagerSchBackupTask +// --------------------------------------------------------------------------- +// +CFileManagerSchBackupTask::~CFileManagerSchBackupTask() + { + FUNC_LOG + + delete iSubscriber; + delete iCenRep; + delete iSystemStateMonitor; + Cancel(); + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::RunL +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::RunL() + { + StartL(); + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::DoCancel +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::DoCancel() + { + delete iSubscriber; + iSubscriber = NULL; + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::RunError() +// --------------------------------------------------------------------------- +// +TInt CFileManagerSchBackupTask::RunError( +#ifdef FILE_MANAGER_ERROR_LOG_ENABLED + TInt aError +#else // FILE_MANAGER_ERROR_LOG_ENABLED + TInt /*aError*/ +#endif // FILE_MANAGER_ERROR_LOG_ENABLED + ) + { + ERROR_LOG1( "CFileManagerSchBackupTask::RunError()-Error=%d", aError ) + + // Try again + Retry(); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::ConstructL +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::ConstructL( const CScheduledTask& aTask ) + { + FUNC_LOG + + INFO_LOG1( "CFileManagerTaskScheduler::ConstructL()-Repeat=%d", + aTask.Info().iRepeat ) + + CActiveScheduler::Add( this ); + + // Check task creator + if( aTask.SecurityInfo().iSecureId.iId != KFileManagerSID ) + { + User::Leave( KErrPermissionDenied ); + } + + // Get pointer to file manager settings + iCenRep = CRepository::NewL( KCRUidFileManagerSettings ); + + // Get backup weekday if given from originator + const HBufC& data( aTask.Data() ); + if ( data.Length() ) + { + TLex parse; + parse.Assign( data ); + User::LeaveIfError( parse.Val( iDay ) ); + } + + // Get pointer to system state monitor + iSystemStateMonitor = CFmSystemStateMonitor::NewL( *this ); + + Retry(); + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::CheckBackupRequired +// --------------------------------------------------------------------------- +// +TBool CFileManagerSchBackupTask::CheckBackupRequired() + { + TBool ret( ETrue ); + + // Check schedule type + TInt scheduling( 0 ); + iCenRep->Get( KFileManagerBackupScheduling, scheduling ); + if ( scheduling == EFileManagerBackupScheduleNone ) + { + // Backup is not required + ret = EFalse; + } + + // Check weekday + if ( ret && iDay != KErrNotFound ) + { + TTime time; + time.HomeTime(); + if ( time.DayNoInWeek() != iDay ) + { + // Backup is not required today + ret = EFalse; + } + } + + if ( !ret ) + { + INFO_LOG( "CFileManagerSchBackupTask::CheckBackupRequired()-No" ) + Exit(); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::CheckPhoneStateL +// --------------------------------------------------------------------------- +// +TBool CFileManagerSchBackupTask::CheckPhoneStateL() + { + + // Check phone is normal state or not + if ( !iSystemStateMonitor->IsSystemStateNormal() ) + { + INFO_LOG( "CFileManagerSchBackupTask::CheckPhoneStateL()-System State is not normal" ) + iSystemStateMonitor->StartMonitor( ESsmNormal ); + return EFalse; + } + + // Check call state + TInt callState( 0 ); + RProperty::Get( + KPSUidCtsyCallInformation, KCTsyCallState, callState ); + if ( callState != EPSCTsyCallStateNone ) + { + INFO_LOG1( "CFileManagerSchBackupTask::CheckPhoneStateL()-callState=%d", + callState ) + + // Set subscriber to wait call to finish + iSubscriber = CFileManagerSchSubscriber::NewL( + *this, + KPSUidCtsyCallInformation, + KCTsyCallState, + CFileManagerSchSubscriber::ESubscribePS, + KPhoneStateChangeTimeoutSecs ); + return EFalse; + } + + // Check usb transfer state + TInt usbState( 0 ); + RProperty::Get( + KPSUidUsbWatcher, KUsbWatcherSelectedPersonality, usbState ); + if ( usbState == KUsbPersonalityIdMS ) + { + INFO_LOG( "CFileManagerSchBackupTask::CheckPhoneStateL()-Usb transfer on" ) + + // Set subscriber to wait usb transfer to finish + iSubscriber = CFileManagerSchSubscriber::NewL( + *this, + KPSUidUsbWatcher, + KUsbWatcherSelectedPersonality, + CFileManagerSchSubscriber::ESubscribePS, + KPhoneStateChangeTimeoutSecs ); + return EFalse; + } + + // Check synchronization state + TInt syncState( 0 ); + RProperty::Get( + KPSUidDataSynchronizationInternalKeys, KDataSyncStatus, syncState ); + if ( syncState > 0 ) + { + INFO_LOG( "CFileManagerSchBackupTask::CheckPhoneStateL()-Synchronization on" ) + + // Set subscriber to wait usb transfer to finish + iSubscriber = CFileManagerSchSubscriber::NewL( + *this, + KPSUidDataSynchronizationInternalKeys, + KDataSyncStatus, + CFileManagerSchSubscriber::ESubscribePS, + KPhoneStateChangeTimeoutSecs ); + return EFalse; + } + + // Check backup/restore (e.g. PC Suite initiated) state + TInt burState( 0 ); + RProperty::Get( + KUidSystemCategory, KUidBackupRestoreKey, burState ); + + const TBURPartType partType = static_cast< TBURPartType > + ( burState & KBURPartTypeMask ); + + if ( partType != EBURUnset && partType != EBURNormal ) + { + INFO_LOG( "CFileManagerSchBackupTask::CheckPhoneStateL()-Backup/restore on" ) + + // Set subscriber to wait backup or restore to finish + iSubscriber = CFileManagerSchSubscriber::NewL( + *this, + KUidSystemCategory, + KUidBackupRestoreKey, + CFileManagerSchSubscriber::ESubscribePS, + KPhoneStateChangeTimeoutSecs ); + return EFalse; + } + + return ETrue; + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::StartL +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::StartL() + { + FUNC_LOG + + delete iSubscriber; + iSubscriber = NULL; + + if ( !CheckBackupRequired() ) + { + return; + } + if ( !CheckPhoneStateL() ) + { + return; + } + + // Set backup starting state + iCenRep->Set( + KFileManagerLastSchBackupStatus, + EFileManagerSchBackupStatusStarting ); + + // Set subscriber to watch backup start success + iSubscriber = CFileManagerSchSubscriber::NewL( + *this, + KCRUidFileManagerSettings, + KFileManagerLastSchBackupStatus, + CFileManagerSchSubscriber::ESubscribeCR, + KStartStateChangeTimeoutSecs ); + + // Start file manager for backup and ensure that it starts properly + StartFileManagerL(); + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::Exit +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::Exit() + { + FUNC_LOG + + Cancel(); + CActiveScheduler::Stop(); + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::Retry +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::Retry() + { + if ( iAttemptsLeft != 0 ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + + if ( iAttemptsLeft > 0 ) + { + --iAttemptsLeft; + } + } + else + { + Exit(); + } + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::StartFileManagerL +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::StartFileManagerL() + { + FUNC_LOG + + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CleanupClosePushL( wsSession ); + // Backup cannot be done from embedded file manager. + // Backup operation closes the app where file manager is started and + // the backup operation stops because file manager gets closed as well. + TInt wgId( 0 ); + if ( FindStandaloneAppL( wsSession, KUidFileManager, wgId ) ) + { + // Notify running standalone file manager to start backup + HBufC8* param8 = HBufC8::NewLC( KSchBackupTaskName().Length() ); + TPtr8 paramPtr( param8->Des() ); + paramPtr.Copy( KSchBackupTaskName ); + wsSession.SendMessageToWindowGroup( + wgId, + TUid::Uid( KUidApaMessageSwitchOpenFileValue ), + *param8 ); + CleanupStack::PopAndDestroy( param8 ); + } + else + { + // Start standalone file manager for backup + TApaAppInfo appInfo; + RApaLsSession apaLsSession; + User::LeaveIfError( apaLsSession.Connect() ); + CleanupClosePushL( apaLsSession ); + User::LeaveIfError( apaLsSession.GetAppInfo( + appInfo, KUidFileManager ) ); + CApaCommandLine* apaCmdLine = CApaCommandLine::NewLC(); + apaCmdLine->SetExecutableNameL( appInfo.iFullName ); + apaCmdLine->SetCommandL( EApaCommandBackground ); + TThreadId fmThreadId; + User::LeaveIfError( apaLsSession.StartApp( + *apaCmdLine, fmThreadId ) ); + CleanupStack::PopAndDestroy( apaCmdLine ); + CleanupStack::PopAndDestroy( &apaLsSession ); + } + CleanupStack::PopAndDestroy( &wsSession ); + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::NotifyKeyChangeOrTimeoutL +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::NotifyKeyChangeOrTimeoutL( + const TUid& aCategory, + const TUint aKey, + const TBool aTimeout ) + { + FUNC_LOG + + if ( aCategory == KCRUidFileManagerSettings && + aKey == KFileManagerLastSchBackupStatus && + !aTimeout ) + { + // Backup was started, the task starter can be finished + Exit(); + } + else + { + // Backup was not started, try starting it again + Retry(); + } + } + +// --------------------------------------------------------------------------- +// CFileManagerSchBackupTask::SystemStateChangedEvent +// --------------------------------------------------------------------------- +// +void CFileManagerSchBackupTask::SystemStateChangedEvent() + { + FUNC_LOG + + // Backup was not started, try starting it again + Retry(); + } + +// End of file