connectivitymodules/SeCon/services/pcd/src/sconinstqueue.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:56 +0100
branchRCL_3
changeset 20 4a793f564d72
parent 0 d0791faffa3f
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201032 Kit: 201035

/*
* Copyright (c) 2005-2008 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:  Installer Queue implementation
*
*/


// INCLUDE FILES
#include "sconinstqueue.h"
#include "sconbrqueue.h"
#include "sconinstaller.h"
#include "sconpcdconsts.h"
#include "debug.h"

// ============================= MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CCSConInstallerQueue* CSConInstallerQueue::NewL()
// Two-phase constructor
// -----------------------------------------------------------------------------
//
CSConInstallerQueue* CSConInstallerQueue::NewL( RFs& aFs )
	{
	TRACE_FUNC_ENTRY;
	CSConInstallerQueue* self = new (ELeave) CSConInstallerQueue( aFs );
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop( self );
	TRACE_FUNC_EXIT;
    return self;
	}
	
// -----------------------------------------------------------------------------
// CSConInstallerQueue::CSConInstallerQueue()
// Constructor
// -----------------------------------------------------------------------------
//
CSConInstallerQueue::CSConInstallerQueue( RFs& aFs ) : CActive( EPriorityStandard ), iFs( aFs )
	{
	}
	
// -----------------------------------------------------------------------------
// CSConInstallerQueue::ConstructL()
// Initializes member data
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::ConstructL()
	{
	TRACE_FUNC_ENTRY;
	iInstaller = new (ELeave) CSConAppInstaller( this, iFs );
	CActiveScheduler::Add( iInstaller );
	User::LeaveIfError( iTimer.CreateLocal() );
	TRACE_FUNC_EXIT;
	}
	
// -----------------------------------------------------------------------------
// CSConInstallerQueue::~CSConInstallerQueue()
// Destructor
// -----------------------------------------------------------------------------
//
CSConInstallerQueue::~CSConInstallerQueue()
	{
	TRACE_FUNC_ENTRY;
	Cancel();
	if( iInstaller )
		{
		iInstaller->Cancel();
		delete iInstaller;
		iInstaller = NULL;
		}
	TRACE_FUNC_EXIT;
	}
	
// -----------------------------------------------------------------------------
// CSConInstallerQueue::StartQueue()
// Starts queue polling
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::StartQueue()
	{
	TRACE_FUNC;
	if( IsActive() )
		{
		Cancel();
		}
		
	iTimer.After( iStatus, KSConTimerValue );
	SetActive();
	}
	
// -----------------------------------------------------------------------------
// CSConInstallerQueue::StartQueue()
// Stops queue polling
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::StopQueue()	
	{
	TRACE_FUNC_ENTRY;
	iTimer.Cancel();
	TRACE_FUNC_EXIT;
	}

// -----------------------------------------------------------------------------
// CSConInstallerQueue::CancelTask( TInt aTask, TBool aAllTasks )
// Cancels a task
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::CancelTask( TInt aTask, TBool aAllTasks )
	{
	TRACE_FUNC_ENTRY;
	//Stop the installer
	if( aTask && !aAllTasks )
		{
		iInstaller->StopInstaller( aTask );
		}
	
	if( aAllTasks )
		{
		iInstaller->Cancel();
		}
	CSConTaskQueue::CancelTask( aTask, aAllTasks );
	TRACE_FUNC_EXIT;
	}

// -----------------------------------------------------------------------------
// CSConInstallerQueue::QueueAddress( CSConBackupRestoreQueue*& aTaskQueue )
// An address pointer to another queue
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::QueueAddress( CSConBackupRestoreQueue*& aTaskQueue )
	{
	TRACE_FUNC;
	iBRQueueAddress = aTaskQueue;
	}

// -----------------------------------------------------------------------------
// CSConInstallerQueue::PollQueue()
// Polls queue
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::PollQueue()
	{
	TRACE_FUNC_ENTRY;
	// find and start next task if installer and BR is inactive
	if( !iInstaller->InstallerActive()
		&& !iBRQueueAddress->QueueProcessActive() )
		{
		//find next task
		for( TInt i = 0; i < iQueue.Count(); i++ )
			{
			TBool complete = iQueue[i]->GetCompleteValue();
			
			if( complete == EFalse )
				{
				iInstaller->StartInstaller( iQueue[i]->iTaskId );
				i = iQueue.Count() + 1; // jump out from loop
				}
			}
		}
	TRACE_FUNC_EXIT;
	}

// -----------------------------------------------------------------------------
// CSConInstallerQueue::DoCancel()
// Implementation of CActive::DoCancel()
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::DoCancel()
	{
	TRACE_FUNC;
	iTimer.Cancel();
	}

// -----------------------------------------------------------------------------
// CSConInstallerQueue::RunL()
// Implementation of CActive::RunL()
// -----------------------------------------------------------------------------
//
void CSConInstallerQueue::RunL()
	{
	TRACE_FUNC_ENTRY;
	LOGGER_WRITE_1( "There are still %d tasks in this queue", iQueue.Count() );
	if( iQueue.Count() > 0 )
		{
		PollQueue();
		StartQueue();
		}
	TRACE_FUNC_EXIT;
	}

// End of file