profilesservices/ProfileEngine/EngSrc/CProfileTiming.cpp
author hgs
Thu, 04 Nov 2010 13:38:47 +0800
changeset 68 13e71d907dc3
parent 32 20bd089f4aaa
permissions -rw-r--r--
201044

/*
* 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