diff -r 453dfc402455 -r 0aa8cc770c8a connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp --- a/connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp Thu Aug 19 10:44:03 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,452 +0,0 @@ -/* -* 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