/*
* Copyright (c) 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: CUIEnginePrinter handles prints from test cases.
*
*/

// INCLUDE FILES
#include <e32base.h>
#include <e32svr.h>
#include <stifinternal/UIEngineContainer.h>
#include "UIEnginePrinter.h"
#include "Logging.h"


// EXTERNAL DATA STRUCTURES
// None

// EXTERNAL FUNCTION PROTOTYPES  
// None

// CONSTANTS
// None

// MACROS
#ifdef LOGGER
#undef LOGGER
#endif
#define LOGGER iUIEngineContainer->iUIEngine->iLogger


// LOCAL CONSTANTS AND MACROS
// None

// MODULE DATA STRUCTURES
// None

// LOCAL FUNCTION PROTOTYPES
// None

// FORWARD DECLARATIONS
// None


// ==================== LOCAL FUNCTIONS ======================================= 
// None

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

/*
-------------------------------------------------------------------------------

    Class: CUIEnginePrinter

    Method: NewL

    Description: Two-phased constructor.

    Parameters: CUIEngineContainer* CUIEngineContainer: in: Pointer to CUIEngineContainer Interface
                TTestInfo& aTestInfo: in: Test info

    Return Values: CUIEnginePrinter* : Pointer to created runner object

    Errors/Exceptions: Leaves if memory allocation for CUIEnginePrinter fails
                       Leaves if ConstructL leaves

    Status: Approved

-------------------------------------------------------------------------------
*/
CUIEnginePrinter* CUIEnginePrinter::NewL( 
    CUIEngineContainer* aUIEngineContainer )
    {
    CUIEnginePrinter* self =
        new ( ELeave ) CUIEnginePrinter( aUIEngineContainer );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

/*
-------------------------------------------------------------------------------

    Class: CUIEnginePrinter

    Method: ConstructL

    Description: Symbian OS second phase constructor

    Symbian OS default constructor can leave.

    Parameters: None

    Return Values: None

    Errors/Exceptions: Leaves if called Open method returns error

    Status: Draft

-------------------------------------------------------------------------------
*/
void CUIEnginePrinter::ConstructL()
    {

    }

/*
-------------------------------------------------------------------------------

    Class: CUIEnginePrinter

    Method: CUIEnginePrinter

    Description: Default constructor

    C++ default constructor can NOT contain any code, that
    might leave.

    Parameters: None
    
    Return Values: None

    Errors/Exceptions: None

    Status: Draft

-------------------------------------------------------------------------------
*/
CUIEnginePrinter::CUIEnginePrinter( 
    CUIEngineContainer* aUIEngineContainer ) :
        CActive( CActive::EPriorityStandard ),
        iUIEngineContainer( aUIEngineContainer ),
        iProgressPckg( iProgress ),
        iRunning( EFalse )
    {
    __TRACE( KPrint, ( _L( "CUIEnginePrinter::CUIEnginePrinter") ) );
    __ASSERT_ALWAYS( aUIEngineContainer, User::Panic( _L("Null pointer"), KErrGeneral ) );

    CActiveScheduler::Add( this );

    }

/*
-------------------------------------------------------------------------------

    Class: CUIEnginePrinter

    Method: ~CUIEnginePrinter

    Description: Destructor

    Parameters: None

    Return Values: None

    Errors/Exceptions: None

    Status: Draft

-------------------------------------------------------------------------------
*/
CUIEnginePrinter::~CUIEnginePrinter()
    {
    __TRACE( KPrint, ( _L( "CUIEnginePrinter::~CUIEnginePrinter") ) );

    Cancel();
    
    }

/*
-------------------------------------------------------------------------------

    Class: CUIEnginePrinter

    Method: StartProgressL

    Description: Starts testing

    Parameters: RTestCase& aTestCase: in: Handle to test case
                TTestProgressPckg& aProgressPckg: in: Handle to TTestProgressPckg

    Return Values: None

    Errors/Exceptions: None

    Status: Draft

-------------------------------------------------------------------------------
*/
void CUIEnginePrinter::StartL( RTestCase& aTestCase )
    {
    __TRACE( KPrint, ( _L( "CUIEnginePrinter::StartProgressL.") ) );

    iTestCase = aTestCase;

    if ( IsActive() )
        User::Leave( KErrInUse );

    iRunning = ETrue;

    SetActive();
    iTestCase.NotifyProgress( iProgressPckg, iStatus );
    }


/*
-------------------------------------------------------------------------------

    Class: CUIEnginePrinter

    Method: RunL

    Description: RunL handles completed requests

    Parameters: None

    Return Values: None

    Errors/Exceptions: Leaves if iStatus is not KErrNone, error is handled in
                       RunError called by CActiveObject

    Status: Draft

-------------------------------------------------------------------------------
*/
void CUIEnginePrinter::RunL()
    {
    
    if( iStatus != KErrNone )
        {
        // KErrEof and other errors
        iRunning = EFalse;
        // Signal to container
        iUIEngineContainer->PrintsDone();
        return;
        }
        
    iUIEngineContainer->PrintProgress( iProgress );
    
    // Start a new request
    SetActive();
    iTestCase.NotifyProgress( iProgressPckg, iStatus );    
    
    }

/*
-------------------------------------------------------------------------------

    Class: CUIEnginePrinter

    Method: DoCancel

    Description: Cancel active request.

    Parameters: None

    Return Values: None

    Errors/Exceptions: None

    Status: Draft

-------------------------------------------------------------------------------
*/
void CUIEnginePrinter::DoCancel()
    {
    __TRACE( KPrint, ( _L( "CUIEnginePrinter::DoCancel") ) );
    
    iRunning = EFalse;

    iTestCase.CancelAsyncRequest( ETestCaseNotifyProgress );
    
    }


// ================= OTHER EXPORTED FUNCTIONS ================================= 
// None

//  End of File
