diff -r 000000000000 -r 8c5d936e5675 profilesservices/ProfileEngine/EngSrc/CProfileTiming.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/profilesservices/ProfileEngine/EngSrc/CProfileTiming.cpp Thu Dec 17 08:52:52 2009 +0200 @@ -0,0 +1,304 @@ +/* +* Copyright (c) 2002 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: Implementation of CProfileTiming. +* +*/ + + + +// INCLUDE FILES +#include "CProfileTiming.h" +#include +#include // TParse +#include +#include "MProfilesLocalFeatures.h" +#include "ProfileEngineConstants.h" +#include "ProfileEnginePrivateCRKeys.h" +#include "ProfilesDebug.h" + +// LOCAL CONSTANTS AND MACROS +namespace + { + _LIT( KProfileScheduledTask, "z:PROFILESCHEDULEEVENT.exe" ); + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CProfileTiming::CProfileTiming +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CProfileTiming::CProfileTiming( CRepository& aProfileRepository, + MProfilesLocalFeatures& aFeatures ) + : iRepository( aProfileRepository ), iFeatures( aFeatures ) + { + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CProfileTiming::ConstructL() + { + if( iFeatures.IsFeatureSupported( KProEngFeatureIdTimedProfiles ) ) + { + iEntryList = new ( ELeave ) CArrayFixFlat( 1 ); + + iTaskData = KNullDesC().AllocL(); + + TParse* tp = new ( ELeave ) TParse(); + tp->Set( KProfileScheduledTask, &KDC_SHARED_LIB_DIR, NULL ); + iTaskDllPath.Copy( tp->FullName() ); + delete tp; + } + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CProfileTiming* CProfileTiming::NewL( CRepository& aProfileRepository, + MProfilesLocalFeatures& aFeatures ) + { + CProfileTiming* self = + new( ELeave ) CProfileTiming( aProfileRepository, aFeatures ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// Destructor +CProfileTiming::~CProfileTiming() + { + if( iFeatures.IsFeatureSupported( KProEngFeatureIdTimedProfiles ) ) + { + iScheduler.Close(); + + if( iEntryList ) + { + iEntryList->Reset(); + } + delete iEntryList; + delete iTaskData; + } + } + + +// ----------------------------------------------------------------------------- +// CProfileTiming::SetTimedProfileL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CProfileTiming::SetTimedProfileL( TInt aPreviousId, TTime aTime ) + { + PRODEBUG1( "CProfileTiming:SetTimedProfile( %d )", aPreviousId ); + if( !iFeatures.IsFeatureSupported( KProEngFeatureIdTimedProfiles ) ) + { + return; + } + + ConnectToSchedulerL(); + + const TTimeIntervalMinutes KProfileMaxTiming( 1440 ); + const TInt KProfileOnce( 1 ); + const TInt KProfileDontCare( 0 ); + _LIT( KProfileTaskName, "TimedProfileTask" ); + _LIT( KProfileSchedulerItemRefName, "ProfileItemRef" ); + iEntryList->Reset(); + + // iStartTime contains the time when the timed profile deactivates and the + // validity period makes sure that the timing will go off in the nearest + // 24 hours. + TTsTime ttsTime; + ttsTime.SetLocalTime( aTime ); + TScheduleEntryInfo2 entryInfo( ttsTime, EHourly, KProfileOnce, KProfileMaxTiming ); + iEntryList->AppendL( entryInfo ); + + TName name( KProfileTaskName() ); + TTaskInfo taskInfo( KProfileDontCare, name, CActive::EPriorityStandard, + KProfileOnce ) ; + + TName name2( KProfileSchedulerItemRefName() ); + iSchedulerItemRef.iName = name2; + + PRODEBUG( "CProfileTiming:SetTimedProfile before CreatePers" ); + TInt error( iScheduler.CreatePersistentSchedule( iSchedulerItemRef, + *iEntryList ) ); + PRODEBUG1( "CProfileTiming:SetTimedProfile after CreatePers, err=%d )", error ); + if( !error ) + { + error = iScheduler.ScheduleTask( taskInfo, *iTaskData, + iSchedulerItemRef.iHandle ); + PRODEBUG1( "CProfileTiming:SetTimedProfile after ScheduleTask, err=%d )", error ); + if( error ) + { + iScheduler.DeleteSchedule( iSchedulerItemRef.iHandle ); + } + else + { + iTaskId = taskInfo.iTaskId; + PRODEBUG( "CProfileTiming:SetTimedProfile before SaveSchedulingData" ); + SaveSchedulingData( aPreviousId, iSchedulerItemRef.iHandle, + iTaskId ); + PRODEBUG( "CProfileTiming:SetTimedProfile after SaveSchedulingData" ); + } + } + + PRODEBUG1( "CProfileTiming:SetTimedProfile before return:%d", error ); + User::LeaveIfError( error ); + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::RollbackTimedProfile +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CProfileTiming::RollbackTimedProfile() + { + PRODEBUG( "CProfileTiming:RollbackTimedProfile" ); + if( !iFeatures.IsFeatureSupported( KProEngFeatureIdTimedProfiles ) ) + { + return; + } + + // Ignore errors here, there's already an error occurred because this + // method is called + iScheduler.DeleteTask( iTaskId ); + iScheduler.DeleteSchedule( iSchedulerItemRef.iHandle ); + PRODEBUG( "CProfileTiming:RollbackTimedProfile end" ); + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::CancelTimedProfile +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CProfileTiming::CancelTimedProfileL() + { + PRODEBUG( "CProfileTiming:CancelTimedProfileL" ); + if( !iFeatures.IsFeatureSupported( KProEngFeatureIdTimedProfiles ) ) + { + return KErrNone; + } + + TInt previousId( KErrNotFound ); + TInt taskId( KErrNotFound ); + GetSchedulingDataL( previousId, iSchedulerItemRef.iHandle, taskId ); + PRODEBUG1( "CProfileTiming:CancelTimedProfileL previousid=%d", previousId ); + if( previousId != KErrNotFound ) + { + ConnectToSchedulerL(); + TInt error( iScheduler.DeleteTask( taskId ) ); + PRODEBUG1( "CProfileTiming:CancelTimedProfileL after deletetask err=%d", error ); + if( ( error != KErrNone ) && ( error != KErrNotFound ) ) + { + User::Leave( error ); + } + + error = iScheduler.DeleteSchedule( iSchedulerItemRef.iHandle ); + PRODEBUG1( "CProfileTiming:CancelTimedProfileL after deletesched err=%d", error ); + if( ( error != KErrNone ) && ( error != KErrNotFound ) ) + { + User::Leave( error ); + } + + SaveSchedulingData(); // resets timing data in cenrep + PRODEBUG( "CProfileTiming:CancelTimedProfileL after SaveSchedulingData" ); + } + PRODEBUG( "CProfileTiming:CancelTimedProfileL end" ); + return previousId; + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::IsTimingActiveL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CProfileTiming::IsTimingActiveL() + { + PRODEBUG( "CProfileTiming:IsTimingActiveL" ); + TBool result( EFalse ); + + if( iFeatures.IsFeatureSupported( KProEngFeatureIdTimedProfiles ) ) + { + User::LeaveIfError( iRepository.Get( KProEngSchedulerHandleId, + iSchedulerItemRef.iHandle ) ); + result = ( iSchedulerItemRef.iHandle != KErrNotFound ); + } + + PRODEBUG1( "CProfileTiming:IsTimingActiveL returning:%d", result ); + return result; + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::SaveSchedulingData +// The errors are ignored inside this method, because this class is used only +// inside CentralRepository transactions. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CProfileTiming::SaveSchedulingData( TInt aPreviousId, TInt aHandleId, + TInt aTaskId ) + { + iRepository.Set( KProEngSchedulerHandleId, aHandleId ); + iRepository.Set( KProEngPreviousActiveId, aPreviousId ); + iRepository.Set( KProEngSchedulerTaskId, aTaskId ); + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::GetSchedulingData +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CProfileTiming::GetSchedulingDataL( TInt& aPreviousId, TInt& aHandleId, + TInt& aTaskId ) + { + PRODEBUG( "CProfileTiming:GetSchedulingDataL" ); + User::LeaveIfError( + iRepository.Get( KProEngPreviousActiveId, aPreviousId ) ); + User::LeaveIfError( + iRepository.Get( KProEngSchedulerHandleId, aHandleId ) ); + User::LeaveIfError( iRepository.Get( KProEngSchedulerTaskId, aTaskId ) ); + PRODEBUG( "CProfileTiming:GetSchedulingDataL end" ); + } + +// ----------------------------------------------------------------------------- +// CProfileTiming::ConnectToSchedulerL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CProfileTiming::ConnectToSchedulerL() + { + // Feature support is not tested here because it must have been done already + // in the calling method. + if( !iConnected ) + { + User::LeaveIfError( iScheduler.Connect() ); + + User::LeaveIfError( iScheduler.Register( iTaskDllPath, + CActive::EPriorityStandard ) ); + iConnected = ETrue; + } + } + +// End of File +