connectivitymodules/SeCon/services/pcd/src/sconqueue.cpp
branchRCL_3
changeset 20 4a793f564d72
--- /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 <SWInstDefs.h> // 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<TInt> 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