diff -r 0aa8cc770c8a -r 4a793f564d72 connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp Wed Sep 01 12:20:56 2010 +0100 @@ -0,0 +1,452 @@ +/* +* 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: Queue implementation +* +*/ + + +// INCLUDE FILES + +#include "sconqueue.h" +#include "sconpcdconsts.h" +#include "debug.h" +#include // installer errors + +// ============================= MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::~CSConTaskQueue() +// Destructor +// ----------------------------------------------------------------------------- +// +CSConTaskQueue::~CSConTaskQueue() + { + TRACE_FUNC; + iQueue.ResetAndDestroy(); + iQueue.Close(); + iTimer.Close(); + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::GetQueueStatus( TInt aTask, TBool aAllTasks, +// CSConStatusReply*& aStatus ) +// Returns the status of a specified task / all tasks +// ----------------------------------------------------------------------------- +// +void CSConTaskQueue::GetQueueStatusL( TInt aTask, TBool aAllTasks, + CSConStatusReply*& aStatus ) + { + RArray completedTasks; + CleanupClosePushL( completedTasks ); + if ( aAllTasks ) + { + //if there are tasks + if ( iQueue.Count() > 0 ) + { + //set iNoTasks as EFalse + aStatus->iNoTasks = EFalse; + for ( TInt i = 0; i < iQueue.Count(); i++ ) + { + //Fill reply object + CSConTaskReply* taskReply = new (ELeave) CSConTaskReply(); + CleanupStack::PushL( taskReply ); + taskReply->InitializeL( *iQueue[i] ); + User::LeaveIfError( aStatus->iTasks.Append( taskReply ) ); + CleanupStack::Pop( taskReply ); + TBool complete = iQueue[i]->GetComplete(); + + //Collect completed task numbers to array for deleting + if ( complete ) + { + completedTasks.Append( iQueue[i]->iTaskId ); + } + //Otherwise clean all unneccessary data from the reply packet + else + { + taskReply->CleanTaskData(); + } + } + } + else + { + //no task in the queue + aStatus->iNoTasks = ETrue; + } + + //Remove completed tasks from queue + for ( TInt j = 0; j < completedTasks.Count(); j++ ) + { + RemoveTask( completedTasks[j] ); + } + } + else if ( aTask > 0 ) + { + CSConTask* temp = new (ELeave) CSConTask(); + temp->iTaskId = aTask; + TInt index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + TBool complete = EFalse; + CSConTaskReply* taskReply(NULL); + + if ( index != KErrNotFound ) + { + aStatus->iNoTasks = EFalse; + //Fill reply object + taskReply = new (ELeave) CSConTaskReply(); + CleanupStack::PushL( taskReply ); + taskReply->InitializeL( *iQueue[index] ); + User::LeaveIfError( aStatus->iTasks.Append( taskReply ) ); + CleanupStack::Pop( taskReply ); + complete = iQueue[index]->GetComplete(); + } + else + { + //no task in the queue + aStatus->iNoTasks = ETrue; + } + + //Delete completed tasks from queue + if ( complete ) + { + RemoveTask( aTask ); + } + //Otherwise clean all unneccessary data from the reply packet + else if ( taskReply ) + { + taskReply->CleanTaskData(); + } + } + else + { + //no task in the queue + aStatus->iNoTasks = ETrue; + } + CleanupStack::PopAndDestroy( &completedTasks ); // close + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::AddNewTask( CSConTask*& aNewTask, TInt aTaskId ) +// Adds a new task to queue +// ----------------------------------------------------------------------------- +// +TInt CSConTaskQueue::AddNewTask( CSConTask*& aNewTask, TInt aTaskId ) + { + TInt ret( KErrNone ); + + aNewTask->iTaskId = aTaskId; + + //Set progress value "task accepted for execution" + aNewTask->SetProgressValue( KSConCodeTaskCreated ); + aNewTask->SetCompleteValue( EFalse ); + + if ( iQueue.Count() == 0 ) + { + StartQueue(); + } + ret = iQueue.InsertInOrder( aNewTask, CSConTaskQueue::Compare ); + return ret; + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::CompleteTask( TInt aTask, TInt aError ) +// Set the task to completed -mode +// ----------------------------------------------------------------------------- +// +void CSConTaskQueue::CompleteTask( TInt aTask, TInt aError ) + { + LOGGER_WRITE_1( "CSConTaskQueue::CompleteTask aError: %d", aError ); + TInt index( KErrNotFound ); + + CSConTask* temp = new CSConTask(); + temp->iTaskId = aTask; + index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + if ( index != KErrNotFound ) + { + TBool complete( ETrue ); + TBool notComplete( EFalse ); + TInt progress( KSConCodeTaskCompleted ); + + switch( aError ) + { + case KErrNone : + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeTaskCompleted; + break; + case KErrNotFound : + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeNotFound; + break; + case KErrCompletion : + iQueue[index]->SetCompleteValue( notComplete ); + progress = KSConCodeTaskPartiallyCompleted; + break; + + // installer specific errors + case SwiUI::KSWInstErrUserCancel: + LOGGER_WRITE("User cancelled the operation"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrUserCancel; + break; + case SwiUI::KSWInstErrFileCorrupted: + LOGGER_WRITE("File is corrupted"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrFileCorrupted; + break; + case SwiUI::KSWInstErrInsufficientMemory: + LOGGER_WRITE("Insufficient free memory in the drive to perform the operation"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrInsufficientMemory; + break; + case SwiUI::KSWInstErrPackageNotSupported: + LOGGER_WRITE("Installation of the package is not supported"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrPackageNotSupported; + break; + case SwiUI::KSWInstErrSecurityFailure: + LOGGER_WRITE("Package cannot be installed due to security error"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrSecurityFailure; + break; + case SwiUI::KSWInstErrMissingDependency: + LOGGER_WRITE("Package cannot be installed due to missing dependency"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrMissingDependency; + break; + case SwiUI::KSWInstErrFileInUse: + LOGGER_WRITE("Mandatory file is in use and prevents the operation"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrFileInUse; + break; + case SwiUI::KSWInstErrGeneralError: + LOGGER_WRITE("Unknown error"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrGeneralError; + break; + case SwiUI::KSWInstErrNoRights: + LOGGER_WRITE("The package has no rights to perform the operation"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrNoRights; + break; + case SwiUI::KSWInstErrNetworkFailure: + LOGGER_WRITE("Indicates that network failure aborted the operation"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrNetworkFailure; + break; + case SwiUI::KSWInstErrBusy: + LOGGER_WRITE("Installer is busy doing some other operation"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrBusy; + break; + case SwiUI::KSWInstErrAccessDenied: + LOGGER_WRITE("Target location of package is not accessible"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstErrAccessDenied; + break; + case SwiUI::KSWInstUpgradeError: + LOGGER_WRITE("The package is an invalid upgrade"); + iQueue[index]->SetCompleteValue( complete ); + progress = KSConCodeInstUpgradeError; + break; + + default : + iQueue[index]->SetCompleteValue( complete ); + if ( aError < KErrNone && aError >= KErrCorruptSurrogateFound ) + { + // aError is always negative + // -> returned errorcode is from KSConCodeFirstSymbianErr...n + progress = KSConCodeFirstSymbianErr - aError; + } + else + { + progress = KSConCodeConflict; + } + + break; + } + + iQueue[index]->SetProgressValue( progress ); + } + StartQueue(); + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::SetTaskProgress( TInt aTask, TInt aProgressValue ) +// Set the task progress value +// ----------------------------------------------------------------------------- +// +void CSConTaskQueue::SetTaskProgress( TInt aTask, TInt aProgressValue ) + { + TInt index( KErrNotFound ); + + CSConTask* temp = new CSConTask(); + temp->iTaskId = aTask; + index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + if ( index != KErrNotFound ) + { + iQueue[index]->SetProgressValue( aProgressValue ); + } + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::GetTask( TInt aTaskId, CSConTask*& aTask ) +// Receives a specified task +// ----------------------------------------------------------------------------- +// +TInt CSConTaskQueue::GetTask( TInt aTaskId, CSConTask*& aTask ) + { + TInt ret( KErrNone ); + TInt index; + + CSConTask* temp = new CSConTask(); + temp->iTaskId = aTaskId; + index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + if ( index != KErrNotFound ) + { + aTask = iQueue[index]; + } + else + { + ret = KErrNotFound; + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::RemoveTask( TInt aTask ) +// Removes a task from the queue +// ----------------------------------------------------------------------------- +// +void CSConTaskQueue::RemoveTask( TInt aTask ) + { + TInt index( KErrNotFound ); + + CSConTask* temp = new CSConTask(); + temp->iTaskId = aTask; + index = iQueue.Find( temp, CSConTaskQueue::Match ); + delete temp; + + if ( index != KErrNotFound ) + { + delete iQueue[index]; + iQueue.Remove( index ); + iQueue.Compress(); + } + + if ( iQueue.Count() == 0 ) + { + StopQueue(); + iQueue.Reset(); + } + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::CancelTask( TInt aTask, TBool aAllTasks ) +// Cancels a task +// ----------------------------------------------------------------------------- +// +void CSConTaskQueue::CancelTask( TInt aTask, TBool aAllTasks ) + { + TRACE_FUNC_ENTRY; + + //Remove the task from the queue + if ( aTask > 0 && !aAllTasks ) + { + RemoveTask( aTask ); + } + + //Remove all tasks from the queue + if ( aAllTasks ) + { + iQueue.ResetAndDestroy(); + } + + TRACE_FUNC_EXIT; + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::QueueProcessActive() +// The status of the process +// ----------------------------------------------------------------------------- +// +TBool CSConTaskQueue::QueueProcessActive() const + { + return iQueueProcessActive; + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::ChangeQueueProcessStatus() +// Changes the status of the queue process +// ----------------------------------------------------------------------------- +// +void CSConTaskQueue::ChangeQueueProcessStatus() + { + iQueueProcessActive = !iQueueProcessActive; + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::Reset() +// Resets the queue +// ----------------------------------------------------------------------------- +// +void CSConTaskQueue::Reset() + { + TRACE_FUNC_ENTRY; + iTimer.Cancel(); + iQueue.ResetAndDestroy(); + TRACE_FUNC_EXIT; + } + +// --------------------------------------------------------- +// CSConTaskQueue::Compare( const CSConTask& aFirst, +// const CSConTask& aSecond ) +// Compares task numbers +// --------------------------------------------------------- +TInt CSConTaskQueue::Compare( const CSConTask& aFirst, + const CSConTask& aSecond ) + { + if ( aFirst.iTaskId < aSecond.iTaskId ) + { + return -1; + } + else if ( aFirst.iTaskId > aSecond.iTaskId ) + { + return 1; + } + + return 0; + } + +// ----------------------------------------------------------------------------- +// CSConTaskQueue::Match( const CSConTask& aFirst, const CSConTask& aSecond ) +// Matches the task numbers +// ----------------------------------------------------------------------------- +// +TInt CSConTaskQueue::Match( const CSConTask& aFirst, const CSConTask& aSecond ) + { + if ( aFirst.iTaskId == aSecond.iTaskId ) + { + return ETrue; + } + + return EFalse; + } +// End of file