diff -r 0aa8cc770c8a -r 4a793f564d72 connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconbrqueue.cpp Wed Sep 01 12:20:56 2010 +0100 @@ -0,0 +1,253 @@ +/* +* Copyright (c) 2005-2009 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: Backup-Restore Queue implementation +* +*/ + + +// INCLUDE FILES +#include "sconbrqueue.h" +#include "sconbackuprestore.h" +#include "sconpcdconsts.h" +#include "sconinstqueue.h" +#include "debug.h" + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::NewL( const TInt aMaxObjectSize ) +// Two-phase constructor +// ----------------------------------------------------------------------------- +// +CSConBackupRestoreQueue* CSConBackupRestoreQueue::NewL( const TInt aMaxObjectSize, RFs& aFs ) + { + CSConBackupRestoreQueue* self = new (ELeave) CSConBackupRestoreQueue(); + CleanupStack::PushL( self ); + self->ConstructL( aMaxObjectSize, aFs ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::CSConBackupRestoreQueue() +// Destructor +// ----------------------------------------------------------------------------- +// +CSConBackupRestoreQueue::CSConBackupRestoreQueue() : + CActive( EPriorityStandard ) + { + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::ConstructL( const TInt aMaxObjectSize ) +// Initializes member data +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::ConstructL( const TInt aMaxObjectSize, RFs& aFs ) + { + iBackupRestore = CSConBackupRestore::NewL( this, aMaxObjectSize, aFs ); + CActiveScheduler::Add( iBackupRestore ); + User::LeaveIfError( iTimer.CreateLocal() ); + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::~CSConBackupRestoreQueue() +// Destructor +// ----------------------------------------------------------------------------- +// +CSConBackupRestoreQueue::~CSConBackupRestoreQueue() + { + TRACE_FUNC_ENTRY; + Cancel(); + if( iBackupRestore ) + { + delete iBackupRestore; + iBackupRestore = NULL; + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::StartQueue() +// Starts queue polling +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::StartQueue() + { + if( IsActive() ) + { + Cancel(); + } + + iTimer.After( iStatus, KSConTimerValue ); + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::StopQueue() +// Stops queue polling +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::StopQueue() + { + iTimer.Cancel(); + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::AddNewTask( CSConTask*& aNewTask, TInt aTaskId ) +// Adds a new task to queue +// ----------------------------------------------------------------------------- +// +TInt CSConBackupRestoreQueue::AddNewTask( CSConTask*& aNewTask, TInt aTaskId ) + { + LOGGER_WRITE_1( "CSConBackupRestoreQueue::AddNewTask aTaskId: %d", aTaskId ); + TInt ret( KErrNone ); + + aNewTask->iTaskId = aTaskId; + + //Set progress value "task accepted for execution" + aNewTask->SetProgressValue( KSConCodeTaskCreated ); + aNewTask->SetCompleteValue( EFalse ); + + //For RequestData and SupplyData + if( iQueue.Find( aNewTask, CSConTaskQueue::Match ) != KErrNotFound ) + { + RemoveTask( aTaskId ); + } + + if( iQueue.Count() == 0 ) + { + StartQueue(); + } + + ret = iQueue.InsertInOrder( aNewTask, CSConTaskQueue::Compare ); + return ret; + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::CancelTask( TInt aTask, TBool aAllTasks ) +// Cancels a task +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::CancelTask( TInt aTask, TBool aAllTasks ) + { + TRACE_FUNC_ENTRY; + //Stop backup/restore + if( aTask && !aAllTasks ) + { + LOGGER_WRITE_1("CSConBackupRestoreQueue::CancelTask - Cancel task: %d", aTask); + iBackupRestore->StopBackupRestore( aTask ); + } + + if( aAllTasks ) + { + LOGGER_WRITE("CSConBackupRestoreQueue::CancelTask - Cancel All"); + iBackupRestore->Cancel(); + iBackupRestore->Reset(); + } + + CSConTaskQueue::CancelTask( aTask, aAllTasks ); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::Reset() +// Resets the queue +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::Reset() + { + TRACE_FUNC_ENTRY; + CSConTaskQueue::Reset(); + iBackupRestore->Reset(); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::QueueAddress( CSConInstallerQueue*& aTaskQueue ) +// An address pointer to another queue +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::QueueAddress( CSConInstallerQueue*& aTaskQueue ) + { + iInstQueueAddress = aTaskQueue; + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::GetTaskMethod( TInt& aTaskId ) +// Returns the task type +// ----------------------------------------------------------------------------- +// +TSConMethodName CSConBackupRestoreQueue::GetTaskMethodL( TInt aTaskId ) + { + TRACE_FUNC_ENTRY; + CSConTask* task = NULL; + CSConTaskQueue::GetTask( aTaskId, task ); + LOGGER_WRITE_1( "CSConBackupRestoreQueue::GetTaskMethodL( TInt aTaskId ) : returned %d", + task->GetServiceId() ); + return task->GetServiceId(); + } + +// ----------------------------------------------------------------------------- +// CSConBackupRestoreQueue::PollQueue() +// Polls queue +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::PollQueue() + { + // find and start next task if BR and installer is inactive + if( !iBackupRestore->BackupRestoreActive() + && !iInstQueueAddress->QueueProcessActive() ) + { + //find next task + for( TInt i = 0; i < iQueue.Count(); i++ ) + { + TBool complete = iQueue[i]->GetCompleteValue(); + + if( complete == EFalse ) + { + iBackupRestore->StartBackupRestore( + iQueue[i]->iTaskId ); + i = iQueue.Count() + 1; // jump out from loop + } + } + } + } + +// ----------------------------------------------------------------------------- +// Implementation of CActive::DoCancel() +// Entry to CSConPCD +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::DoCancel() + { + TRACE_FUNC_ENTRY; + iTimer.Cancel(); + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// Implementation of CActive::RunL() +// Entry to CSConPCD +// ----------------------------------------------------------------------------- +// +void CSConBackupRestoreQueue::RunL() + { + if( iQueue.Count() > 0 ) + { + PollQueue(); + StartQueue(); + } + } + +// End of file