gfxconversion/mifconv/inc/mifconv_argumentmanager.h
author Simon Howkins <simonh@symbian.org>
Wed, 10 Nov 2010 00:18:53 +0000
branchRCL_3
changeset 46 476f0ee3c373
parent 0 f453ebb75370
permissions -rw-r--r--
Added useful diagnostics that explain why raptor is redefining commands for a target (when processing things through the mifconv.flm). This should make it much easier to pinpoint how the system model should be adjusted to avoid the warnings in future. Also simplified the existing redefinition guards.

/*
* 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:  Mifconv argument manager class.
*
*/


#ifndef __MIFCONVARGUMENTMANAGER_H__
#define __MIFCONVARGUMENTMANAGER_H__

#include <map>
#include "mifconv.h"
#include "mifconv_sourcefile.h"
#include "mifconv_argument.h"


/**
 * This helper class is used to specify rules that will be used when
 * mifconv is searching source icons from the predefined folders.
 * Currently it supports rules that specify what kind of files can be
 * located in the folders.
 */
class MifConvSourceSearchRule
{
public:
    /**
     * Constructor
     * @param path Path to the folder, which the rule affects on.
     * @param types Allowed file types that can be located in the given 
     * <code>path</code>
     */
    MifConvSourceSearchRule(const MifConvString& path, const MifConvStringList& types);

    /**
     * Destructor
     */
    virtual ~MifConvSourceSearchRule();

    /**
     * Returns the path to the folder
     * @return Path to the folder from which the files are searched.
     */
    const MifConvString& SearchPath() const;
    MifConvString& SearchPath();

    /**
     * Returns a list of allowed file types (extensions). 
     * <code>MIFCONV_WILDCARD</code> can be used as a wildcard, meaning that
     * there are no restrictions for the filetype in the specific folder.
     * @return List of allowed file extensions.
     */
    const MifConvStringList& AllowedFileTypes() const;
private:
    MifConvString iSearchPath;
    MifConvStringList iAllowedFileTypes;
};

class MifConvArgumentManager
{
public:

    /**
     * Returns a pointer to the singleton instance.
     * @return Pointer to the singleton instance.
     */
    static MifConvArgumentManager* Instance();
        
    /** 
     * Destructor
     */
	virtual ~MifConvArgumentManager();

	/** 
	 * Initializes the argument list.
	 * @param argList List of strings from which the arguments are parsed.
	 */
	void Init( const MifConvStringList& argList );

    /**
     * Deallocates the allocated memory.
     */
    static void Reset();

	/**
	 * Set target filename (i.e. mif-filename)
	 * @param arg target filename
	 */
	void SetTargetFile( const MifConvString& arg );

	/**
	 * Returns target filename
	 * @return target filename
	 */
	const MifConvString& TargetFile() const;

	/**
	 * Returns argument value
	 * @param argName Argument name
	 * @return Argument value
	 */
	const MifConvString& StringValue(const MifConvString& argName) const;

    /**
     * Returns argument value list
     * @param argName Argument name
     * @return List of argument values
     */
    const MifConvStringList& StringListValue(const MifConvString& argName) const;

	/**
	 * Returns value of an boolean argument. Returns false, if argument is not 
	 * found from the boolean argument list.
	 * @param argName Argument name
	 * @return Argument value
	 */
	bool BooleanValue( const MifConvString& argName ) const;

	/**
	 * Returns source file list given in command line parameters
	 * @return List of source files
	 */
	const MifConvSourceFileList& SourceFiles() const;

	/**
	 * Adds argument value to the argument map
	 * @param argName Name of the argument
	 * @param argValue Value of the argument
	 */
	void AddArgumentValue( const MifConvString& argName, const MifConvString& argValue );

	/**
	 * Add source file to the source file list
	 * @param sourceFile Source file object to be added to the list
	 */
	void AddSourceFile( const MifConvSourceFile& sourceFile );
    
    /**
     * Returns value of EPOCROOT environment variable. If the EPOCROOT 
     * environment variable is defined (i.e. length > 0), directory separator
     * is added to returned string if it is missing from the EPOCROOT.
     * @return EPOCROOT environment variable value
     */
    const MifConvString& EpocRoot() const;

    /**
     * Converts depth value to display mode value
     * @return IconDisplayMode enumeration value 
     * @param depth IconDepth enumeration value
     */
    IconDisplayMode ConvertToDisplayMode(IconDepth depth) const;

    /**
     * Converts mask depth value to display mode value
     * @return IconDisplayMode enumeration value 
     * @param mask IconMaskDepth enumeration value
     */
    IconDisplayMode ConvertToMaskDisplayMode(IconMaskDepth mask) const;

    /**
     * Converts depth string value to depth enumeration value
     * @return IconDepth enumeration value
     * @param depthStr depth string      
     */
    IconDepth ConvertToDepth( const MifConvString& depthStr ) const;

    /**
     * Converts mask depth string value to mask depth enumeration value
     * @return IconMaskDepth enumeration value 
     * @param depthStr mask depth string
     */
    IconMaskDepth ConvertToMaskDepth( const MifConvString depthStr ) const;

protected:

    /**
     * Tells whether the given string is a valid argument name
     * @return True if the given string is valid argument
     * @param argName String representing the argument name
     */
	bool IsArgument( const MifConvString& argName ) const;

    /**
     * Tells whether the given argument is of string type and returns the 
     * length of the argument name. For example: If given string 
     * "/HMyHeader.mbg" this function returns 1, which is the length of the
     * argument name "H".
     * @return Length of the string if the given argument is string type, zero 
     * otherwise
     * @param argName Argument name
     */
	size_t IsStringArgument( const MifConvString& argName ) const;

    /**
     * Tells whether the given argument is of string list type and returns the 
     * length of the argument name. For example: If given string 
     * "/iInputDir;TempDir" this function returns 1, which is the length of the
     * argument name "i".
     * @return Length of the string if the given argument is string list type, zero 
     * otherwise
     * @param argName Argument name
     */
	size_t IsStringListArgument( const MifConvString& argName ) const;

    /**
     * Tells whether the given argument is of boolean type and returns the 
     * length of the argument name. For example: If given string "/E" this 
     * function returns 1, which is the length of the argument name "E".
     * @return Length of the argument name if the given argument is boolean 
     * type, zero otherwise
     * @param argName Argument name
     */
	size_t IsBooleanArgument( const MifConvString& argName ) const;

    /**
     * Tells whether the given argument is a help argument and returns the 
     * length of the argument name. For example: If given string "--help" this
     * function returns 5, which is the length of the argument name "-help".
     * @return Length of the argument name if the given argument is a help 
     * argument, zero otherwise
     * @param argName Argument name
     */
    size_t IsHelpArgument( const MifConvString& argName ) const;

    /**
     * Tells whether the given argument is a valid depth value
     * @return True if the given argument is a valid depth value, false 
     * otherwise
     * @param argName Argument string
     */
	bool IsDepthArgument( const MifConvString& argName ) const;

    /**
     * Tells whether the given argument is an "animated" -flag
     * @return True if the given argument is an "animated" -flag, false 
     * otherwise
     * @param argName Argument string
     */
	bool IsAnimatedFlag( const MifConvString& argName ) const;

    /**
     * Finalizes the command line arguments for internal use.
     */
	void FinalizeArguments();

    /**
     * Processes and fix the directory paths given in command line arguments.
     */
	void ProcessArgumentPaths();

    /**
     * Resolves the actual source file types by searching them in user defined
     * or pre-defined locations.
     */
	void ResolveSourceFileTypes();

    /**
     * Sets usage instructions in the given string
     * @param usageStr Usage instuctions are copied in this string object.
     */
	void SetUsageString( MifConvString& usageStr ) const;

    /**
     * Gets needed environment variables.
     */
    void GetMifEnv();

    /**
     * Completes the given path to full directory path without the drive letter.
     * @param sourcePath Directory path to be completed to full path.
     * @param targetPath Full directory path is copied here.
     */
    void MifFullPath( const MifConvString& sourcePath, MifConvString& targetPath);

    /**
     * Completes the given drive and path to full absolute directory path.
     * @param sourceDrive Drive of the absolute path. If empty, epocroot 
     * environment variable is used.
     * @param sourcePath Directory path to be completed to absolute path.
     * @param targetPath Absolute directory path is copied here.
     */     
    void MifAbsolutePath( const MifConvString& sourceDrive, const MifConvString& sourcePath, MifConvString& targetPath);

    /**
     * Checks wheter the given file-extension is the correct one for the source 
     * file. Sets also the source filename to complete one.
     * @return true if the given source file with given extension is found and 
     * to be used.
     * @param srcFile Source file object
     * @param extension Extension of the source file
     */
    bool FindAndSetPathAndType( MifConvSourceFile& srcFile, const MifConvString& extension );

    /**
     * Fills up the depth and mask depth maps used to map different enumeration 
     * values internally.
     */
    void PopulateDepthAndMaskMaps();

    /**
     * Reads the parameter file containing commandline parameters and source 
     * icon files
     * @param paramFilename Filename for the parameter file.
     * @param paramList Parameters are inserted to this list.
     */
    void ReadParameterFile(const MifConvString& paramFilename, MifConvStringList& paramList);

    /**
     * Adds arguments to internal data structures
     * @param argList List containing arguments
     * @param paramsFromFile Tells if the parameters are read from the 
     * parameter file or not.
     * Applied usage rules depend sligthly on this.
     */
    void AddArguments( const MifConvStringList& argList, bool paramsFromFile = false );

    /**
     * Reads string argument from the list to internal data structure
     */
    MifConvString ReadStringArgument(const MifConvStringList& argList, MifConvStringList::const_iterator& i, unsigned int argNameLen);

    /**
     * Reads string list argument from the list to internal data structure
     */
    void ReadStringListArgument(MifConvStringList::const_iterator& i, unsigned int argNameLen, MifConvStringList& StringValueList);

    // Internal data structure for boolean type arguments
	typedef std::map<MifConvString, MifConvBooleanArgument> BooleanArgMap;
    BooleanArgMap iBooleanArguments;

    // Internal data structure for string type arguments
	typedef std::map<MifConvString, MifConvStringArgument> StringArgMap;
    StringArgMap iStringArguments;

    // Internal data structure for string list type arguments
    typedef std::map<MifConvString, MifConvStringListArgument> StringListArgMap;
    StringListArgMap iStringListArguments;

	inline void THROW_USAGE_EXCEPTION() const;
    inline void THROW_ERROR( const MifConvString& errorMsg, const MifConvString& file = MifConvString(), int line = 0) const;
	
	MifConvSourceFileList iSourceFiles;
	MifConvString iTargetFile;
	MifConvString iDummyString;
    MifConvStringList iDummyStringList;
    //MifConvStringList iSearchPaths;    
    MifConvString iEpocRoot;

    // Internal data structure storing the rules used when finding source icons 
    // from the folders
    typedef vector<MifConvSourceSearchRule> SearchRules;
    SearchRules iSearchRules;

    private:

    /**
     * Default constructor
     */
	MifConvArgumentManager();
    static MifConvArgumentManager* iInstance;

    MifConvIconDepthMap iDepthMap;
    MifConvIconMaskDepthMap iMaskDepthMap;
    MifConvIconDisplayModeMap iDisplayModeMap;
    MifConvMaskIconDisplayModeMap iMaskDisplayModeMap;
};


#endif