profilesservices/ProfileEngine/EngSrc/CProfileTiming.cpp
changeset 0 8c5d936e5675
child 8 f62c3a3d66b8
child 18 e3554c9069b6
--- /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 <ProfilesVariant.hrh>
+#include <f32file.h> // TParse
+#include <data_caging_path_literals.hrh>
+#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<TScheduleEntryInfo2>( 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
+