/*
* File:        BootImageGenerator.h
*
* Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
* See included license file for license details.
*/
#if !defined(_BootImageGenerator_h_)
#define _BootImageGenerator_h_

#include "OutputSection.h"
#include "BootImage.h"
#include "OptionContext.h"

namespace elftosb
{

/*!
* \brief Abstract base class for generators of specific boot image formats.
*
* Subclasses implement a concrete generator for a certain boot image format, but
* they all have the same interface.
*
* After creating an instance of a subclass the user adds OutputSection objects
* to the generator. These objects describe discrete sections within the resulting
* boot image file. If the format does not support multiple sections then only
* the first will be used.
*
* Options that are common to all boot image formats are handled by methods
* defined in this class. These are the current common options:
*      - productVersion
*      - componentVersion
*      - driveTag
*/
class BootImageGenerator
{
public:
       //! \brief Constructor.
       BootImageGenerator() {}

       //! \brief Destructor.
       virtual ~BootImageGenerator() {}

       //! \brief Add another section to the output.
       void addOutputSection(OutputSection * section) { m_sections.push_back(section); }

       //! \brief Set the global option context.
       void setOptionContext(OptionContext * context) { m_options = context; }

       //! \brief Pure virtual method to generate the output BootImage from input sections.
       virtual BootImage * generate()=0;

protected:
       //! Type for a list of model output sections.
       typedef std::vector<OutputSection*> section_vector_t;

       section_vector_t m_sections;    //!< Requested output sections.
       OptionContext * m_options;      //!< Global option context.

   //! \brief Handle common product and component version options.
   void processVersionOptions(BootImage * image);

       //! \brief Handle the common option which sets the system drive tag.
       void processDriveTagOption(BootImage * image);
};

}; // namespace elftosb

#endif // _BootImageGenerator_h_