/*
* 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 the License "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: 
* As specified in SGL.GT0188.251
*
*/


/**
 @file 
 @publishedPartner
 @released
*/

#ifndef __SISIF_H__
#define __SISIF_H__


#include "sisexpression.h"
#include "sisinstallblock.h"
#include "siselseif.h"
#include "sisarray.h"

class CSISIf : public CStructure <CSISFieldRoot::ESISIf>
	{
public:
	/**
	 * Default constructor
	 */
	CSISIf ();
	/**
	 * Copy constructor
	 */
	CSISIf (const CSISIf& aInitialiser);

public:
	/**
	 * Class name
	 */
	virtual std::string Name () const;
	/**
	 * Expression corresponds to this if block.
	 * @return CSISExpression
	 */
	const CSISExpression& Expression () const;
	/**
	 * Expression corresponds to this if block.
	 * @return CSISExpression
	 */
	CSISExpression& Expression ();
	/**
	 * Add else-if block
	 */
	void AddElseIf ();
	/**
	 * Add else block
	 */
	void AddElse ();
	/**
	 * Retrieves the last elseif block
	 */
	const CSISElseIf& ElseIf () const;
	/**
	 * Retrieves the last elseif block
	 */
	CSISElseIf& ElseIf ();
	/**
	 * Retrieves the elseif block pointed by the index.
	 * @param aIndex index
	 */
	const CSISElseIf& ElseIf (const unsigned aIndex) const;
	/**
	 * Retrieves the elseif block pointed by the index.
	 * @param aIndex index
	 */
	CSISElseIf& ElseIf (const unsigned aIndex);
	/**
	 * Count of else-if block.
	 */
	inline TUint32 ElseIfCount() const;
	/**
	 * Expression corresponds to the last else-if block
	 */
	const CSISExpression& ElseIfExpression () const;
	/**
	 * Expression corresponds to the last else-if block
	 */
	CSISExpression& ElseIfExpression ();
	/**
	 * @return Install block of this if block
	 */
	CSISInstallBlock& InstallBlock ();
	/**
	 * @return Install block of this if block
	 */
	const CSISInstallBlock& InstallBlock () const;
	/**
	 * Adds the write the package details into the stream.
	 * @param aStream - Stream in which the package entries need to be written.
	 * @param aVerbose - If this option is set then detail description of pkg
	 * 			will be written into the stream.
	 * @param aCompatible - Flag to notify AddPackageEntry that Dumpsis works in the original,compatible mode
	 * or in the new way.
	 */
	void AddPackageEntry(std::wostream& aStream, bool aVerbose, bool aCompatible) const;
	/**
	 * Retrieves the list of files present in the if block.
	 * @param aFileList this will be filled by this function.
	 */
	void GetFileList(TFileDescList& aFileList) const;
	/**
	 * Retrieves the list of embedded sis files present in the if block.
	 * @param aFileList this will be filled by this function.
	 */
	void GetEmbeddedControllers(TControllerMap& aControllers) const;

private:
	void InsertMembers ();

private:
	CSISExpression										iExpression;
	CSISInstallBlock									iInstallBlock;
	CSISArray <CSISElseIf, CSISFieldRoot::ESISElseIf>	iElseIfs;

	};


inline std::string CSISIf::Name () const
	{
	return "If";
	}

inline void CSISIf::InsertMembers ()
	{
	InsertMember (iExpression);
	InsertMember (iInstallBlock);
	InsertMember (iElseIfs);
	}

inline CSISIf::CSISIf ()
	{ 
	InsertMembers (); 
	}

inline CSISIf::CSISIf (const CSISIf& aInitialiser) :
		iExpression (aInitialiser.iExpression),
		iInstallBlock (aInitialiser.iInstallBlock),
		iElseIfs (aInitialiser.iElseIfs)
	{ 
	InsertMembers (); 
	}

inline const CSISExpression& CSISIf::Expression () const
	{ 
	return iExpression; 
	}

inline CSISExpression& CSISIf::Expression ()
	{ 
	return iExpression; 
	}

inline void CSISIf::AddElseIf ()
	{ 
	iElseIfs.Push (CSISElseIf ()); 
	}

inline void CSISIf::AddElse ()
	{ 
	AddElseIf (); ElseIf ().SetElse (); 
	} 

inline const CSISElseIf& CSISIf::ElseIf () const
	{ 
	return iElseIfs.Last (); 
	}

inline CSISElseIf& CSISIf::ElseIf ()
	{ 
	return iElseIfs.Last (); 
	}

inline const CSISElseIf& CSISIf::ElseIf (const unsigned aIndex) const
	{ 
	return iElseIfs [aIndex]; 
	}

inline CSISElseIf& CSISIf::ElseIf (const unsigned aIndex)
	{ 
	return iElseIfs [aIndex]; 
	}

inline const CSISExpression& CSISIf::ElseIfExpression () const
	{ 
	return iElseIfs.Last ().Expression (); 
	}

inline CSISExpression& CSISIf::ElseIfExpression ()
	{ 
	return iElseIfs.Last ().Expression (); 
	}

inline CSISInstallBlock& CSISIf::InstallBlock ()
	{ 
	return iInstallBlock; 
	}

inline const CSISInstallBlock& CSISIf::InstallBlock () const
	{ 
	return iInstallBlock; 
	}

inline TUint32 CSISIf::ElseIfCount () const
	{ 
	return iElseIfs.size(); 
	}
#endif // __SISIF_H__

