/*
* 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: This module contains implementation of COutput 
* class member functions.
*
*/

// INCLUDE FILES
#include <e32std.h>
#include "Output.h"
#include "FileOutput.h"
#include "NullOutput.h"
#include "LoggerOverFlow.h"

// EXTERNAL DATA STRUCTURES
// None

// EXTERNAL FUNCTION PROTOTYPES  
// None

// CONSTANTS
// None

// MACROS
// None

// LOCAL CONSTANTS AND MACROS
// None

// MODULE DATA STRUCTURES
// None

// LOCAL FUNCTION PROTOTYPES
// None

// FORWARD DECLARATIONS
// None

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

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

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

    Class: COutput

    Method: COutput

    Description: Default constructor

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

    Parameters: None

    Return Values: None

    Errors/Exceptions: None

    Status: Approved

-------------------------------------------------------------------------------
*/
COutput::COutput()
    {

    }

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

    Class: COutput

    Method: NewL

    Description: Two-phased constructor.

    NOTE: At the moment there is only one output module implemented

    Parameters: const TDesC& aTestPath: in: Path to logged information
                const TDesC& aTestFile: in: Log name for information
                TLoggerType aLoggerType: in: Log file type
                TOutput aOutput: in: Output source
                TBool aOverWrite: in: Indicator to file overwrite
                TBool aWithTimeStamp: in: Indicator to time stamp
                TBool aWithLineBreak: in: Indicator to line break
                TBool aWithEventRanking: in: Indicator to event ranking
                TBool aThreadIdToLogFile: in: Indicator to thread id adding to
                                              end of the log file
                TBool aCreateLogDir: in: Indicator to directory creation
                TInt  aStaticBufferSize
                TBool aUnicode: in: Indicator if file has to be in unicode format

    Return Values: COutput*: pointer to COutput object

    Errors/Exceptions:  Leaves if called CFileOutput::NewL method fails

    Status: Proposal

-------------------------------------------------------------------------------
*/
COutput* COutput::NewL( const TDesC& aTestPath,
                        const TDesC& aTestFile,
                        CStifLogger::TLoggerType aLoggerType,
                        CStifLogger::TOutput aOutput,
                        TBool aOverWrite,
                        TBool aWithTimeStamp,
                        TBool aWithLineBreak,
                        TBool aWithEventRanking,
                        TBool aThreadIdToLogFile,
                        TBool aCreateLogDir,
                        TInt aStaticBufferSize,
                        TBool aUnicode )
    {

    if ( aOutput == CStifLogger::EFile )
        {
        CFileOutput* fileOutput = NULL;
        // Create CFileOutput object fileOutput
        TRAPD( err, fileOutput = CFileOutput::NewL( aTestPath,
                                                    aTestFile,
                                                    aLoggerType,
                                                    aOverWrite,
                                                    aWithTimeStamp,
                                                    aWithLineBreak,
                                                    aWithEventRanking,
                                                    aThreadIdToLogFile,
                                                    aCreateLogDir,
                                                    aStaticBufferSize,
                                                    aUnicode ) );

        // Probably path or file name is over allowed size
        if ( err == KErrArgument )
            {
            User::Leave( KErrArgument );
            return NULL; // Never return because leave above
            }
        // Not enough memory, @js
        else if ( err == KErrNoMemory )
            {
            User::Leave( KErrNoMemory );
            return NULL;
            }                      
        // If e.g. path not found so we create CNullOutput to avoiding leave
        // operation. CNullOutput looks logging although it won't.
        else if ( err != KErrNone )
            {
            CNullOutput* nullOutput = CNullOutput::NewL();
            nullOutput->SetOutputCreationResult( err, aOutput );
            return nullOutput;
            }
        // CFileOutput creation made succesfully
        else
            {
            fileOutput->SetOutputCreationResult( err, aOutput );
            return fileOutput;
            }
        }
    else if ( aOutput == CStifLogger::ERDebug )
        {
        CRDebugOutput* rdebugOutput = NULL;
        // Create CRDebugOutput object rdebugOutput
        TRAPD( err, rdebugOutput = CRDebugOutput::NewL( aTestPath, 
                                                        aTestFile,
                                                        aLoggerType,
                                                        aOverWrite,
                                                        aWithTimeStamp,
                                                        aWithLineBreak,
                                                        aWithEventRanking,
                                                        aThreadIdToLogFile,
                                                        aCreateLogDir,
                                                        aStaticBufferSize ) );

        // Probably path or file name is over allowed size
        if ( err == KErrArgument )
            {
            User::Leave( KErrArgument );
            return NULL; // Never return because leave above
            }
        // If e.g. no memory so we create CNullOutput to avoiding leave
        // operation. CNullOutput looks logging although it won't.
        else if ( err != KErrNone )
            {
            CNullOutput* nullOutput = CNullOutput::NewL();
            nullOutput->SetOutputCreationResult( err, aOutput );
            return nullOutput;
            }
        // CRDebugOutput creation made succesfully
        else
            {
            rdebugOutput->SetOutputCreationResult( err, aOutput );
            return rdebugOutput;
            }
        }
    else
        {
        User::Leave( KErrArgument );
        return NULL; // Never return because leave above
        }

    }

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

    Class: COutput

    Method: ~COutput

    Description: Destructor

    Parameters: None

    Return Values: None

    Errors/Exceptions: None

    Status: Approved

-------------------------------------------------------------------------------
*/
COutput::~COutput()
    {

    }

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

//  End of File
