diff -r 95243422089a -r 491b3ed49290 filemanager/schbkup/src/filemanagerschbackuptask.cpp --- a/filemanager/schbkup/src/filemanagerschbackuptask.cpp Thu Aug 19 09:42:45 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,499 +0,0 @@ -/* -* 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