// Copyright (c) 2004-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:
// Mike Kinghan, mikek@symbian.org, for Symbian Foundation, 2010
//
// Description:
// Implementation of the Header file for the ParameterListInterface of the elf2e32 tool
// @internalComponent
// @released
// 
//

#ifndef PARAMETERLISTINTERFACE_H
#define PARAMETERLISTINTERFACE_H

#ifdef _MSC_VER 
#pragma warning(disable: 4786) // identifier was truncated to '255' characters in the debug information
#pragma warning(disable: 4702) // unreachable code
#endif

#include <string>
#include <vector>
#include "e32imagedefs.h"

enum ETargetType
{
	ETargetTypeNotSet = - 2,
	EInvalidTargetType = - 1,	
	/** Target type is Library */
	ELib,
	/** Target type is DLL */
	EDll,
	EExe,
	EPolyDll,
	EExexp,
	EStdExe
};

enum EAsmDialect // Which dialect of arm assembly to write for the --dump option
{
	EArmas, // RVCT armas
	EGas	// GNU as
};

typedef unsigned int UINT;

using std::vector;
/**
This class is the abstract base class from which ParameterManager is derived.

@internalComponent
@released
*/
class ParameterListInterface
{

public:
	typedef vector<char *> LibSearchPaths;

	struct SysDefs
	{
		unsigned int iSysDefOrdinalNum;
		char * iSysDefSymbolName;
	};

	typedef struct SysDefs Sys;

	typedef std::string string;

	virtual ~ParameterListInterface();
/**
This function extracts the DEF file name that is passed as input through the --definput option.

@internalComponent
@released

@return the name of the input DEF file if provided as input through --definput or 0.
*/
	virtual char * DefInput()=0;
/**
This function extracts the Elf file name that is passed as input through the --dsoin option.

@internalComponent
@released

@return the name of the input Elf file if provided as input through --dsoin or 0.
*/
	virtual char * ElfInput()=0;
/**
This function extracts the E32 image name that is passed as input through the --e32dump option.

@internalComponent
@released

@return the name of the input E32 image if provided as input through --e32dump or 0.
*/
	virtual char * E32Input()=0;
	virtual bool E32ImageInOption()=0;
	virtual bool FileDumpOption()=0;
	virtual int DumpOptions()=0;

/**
This function extracts the output DEF file name that is passed as input through the --defoutput option.

@internalComponent
@released

@return the name of the output DEF file if provided as input through --defoutput or 0.
*/
	virtual char * DefOutput()=0;
/**
This function extracts the DSO file name that is passed as input through the --dso option.

@internalComponent
@released

@return the name of the output DSO file if provided as input through --dso or 0.
*/
	virtual char * DSOOutput()=0;
/**
This function extracts the E32 image output that is passed as input through the --output option.

@internalComponent
@released

@return the name of the output E32 image output if provided as input through --output or 0.
*/
	virtual char * E32ImageOutput()=0;
/**
This function extracts the target type that is passed as input through the --targettype option.

@internalComponent
@released

@return the name of the input target type if provided as input through --targettype or 0.
*/
	virtual ETargetType TargetTypeName()=0;
/**
This function extracts the name of the DLL (that the DSO is to be linked with) 
that is passed as input through the --linkas option.

@internalComponent
@released

@return the name of the DLL name to be linked with if provided as input through --linkas or 0.
*/
	virtual char * LinkAsDLLName()=0;
/**
This function extracts the path (where the intermediate libraries should be put)
that is passed as input through the --libpath option.

@internalComponent
@released

@return the path if provided as input through --libpath or 0.
*/
	virtual LibSearchPaths& LibPath()=0;
/**
This function extracts the filename from the absolute path that is given as input.

@internalComponent
@released

@param aFileName
The filename alongwith the absolute path.

@return the filename (without the absolute path) for valid input else the filename itself.

*/
	virtual char * FileName(char * aArg)=0;
/**
This function finds out the directory separator '\' in the path

@internalComponent
@released

@return the directory spearator '\'
*/
	virtual char DirectorySeparator()=0;
/**
This function finds out if the --definput option is passed to the program.

@internalComponent
@released

@return True if --definput option is passed in or False.
*/
	virtual bool DefFileInOption()=0;
/**
This function finds out if the --elfinput option is passed to the program.

@internalComponent
@released

@return True if --elfinput option is passed in or False.
*/
	virtual bool ElfFileInOption()=0;
/**
This function finds out if the --dso option is passed to the program.

@internalComponent
@released

@return True if --dso option is passed in or False.
*/
	virtual bool DSOFileOutOption()=0;
/**
This function finds out if the --linkas option is passed to the program.

@internalComponent
@released

@return True if --linkas option is passed in or False.
*/
	virtual bool LinkAsOption()=0;
/**
This function parses the command line options and sets the appropriate values based on the
input options.

@internalComponent
@released

*/
	virtual void ParameterAnalyser()=0;

	virtual bool LogFileOption()=0;
	virtual char* LogFile()=0;

	virtual bool E32OutOption()=0;
	virtual bool DefFileOutOption()=0;

	virtual bool Uid1Option()=0;
	virtual bool SecureIdOption()=0;
	virtual bool VendorIdOption()=0;

	virtual bool MessageFileOption()=0;
	virtual char* MessageFile()=0;

	virtual bool DumpMessageFileOption()=0;
	virtual char* DumpMessageFile()=0;

	virtual Sys SysDefSymbols(int count)=0;


	virtual UINT Uid1() = 0;
	virtual UINT Uid2() = 0;
	virtual UINT Uid3() = 0;
	virtual UINT SecureId() = 0;
	virtual UINT VendorId() = 0;
	virtual bool FixedAddress() = 0;
	virtual bool Compress() = 0;
	virtual UINT CompressionMethod() = 0;
	virtual size_t HeapCommittedSize() = 0;
	virtual size_t HeapReservedSize() = 0;
	virtual size_t StackCommittedSize() = 0;
	virtual bool Unfrozen() = 0;
	virtual bool IgnoreNonCallable() = 0;
	virtual SCapabilitySet Capability() = 0;
	virtual int SysDefCount() = 0;
	virtual char * FileDumpSubOptions() = 0;
	virtual TProcessPriority Priority() = 0;
	virtual bool DllDataP() = 0;
	virtual unsigned int Version() = 0;
	virtual bool CallEntryPoint() = 0; //{ return true;}
	virtual UINT FPU() = 0;

	virtual bool IsCodePaged() = 0;
	virtual bool IsCodeUnpaged() = 0;
	virtual bool IsCodeDefaultPaged() = 0;

	virtual bool IsDataPaged() = 0;
	virtual bool IsDataUnpaged() = 0;
	virtual bool IsDataDefaultPaged() = 0;
	
	virtual bool ExcludeUnwantedExports() = 0;
	virtual bool IsCustomDllTarget() = 0;
	virtual bool SymNamedLookup() = 0;
	virtual bool IsDebuggable() = 0;
	virtual bool IsSmpSafe() = 0;
	virtual EAsmDialect AsmDialect() = 0;
};


#endif // PARAMETERLISTINTERFACE_H

