1/*
2 * File:	BootImageGenerator.h
3 *
4 * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5 * See included license file for license details.
6 */
7#if !defined(_BootImageGenerator_h_)
8#define _BootImageGenerator_h_
9
10#include "OutputSection.h"
11#include "BootImage.h"
12#include "OptionContext.h"
13
14namespace elftosb
15{
16
17/*!
18 * \brief Abstract base class for generators of specific boot image formats.
19 *
20 * Subclasses implement a concrete generator for a certain boot image format, but
21 * they all have the same interface.
22 *
23 * After creating an instance of a subclass the user adds OutputSection objects
24 * to the generator. These objects describe discrete sections within the resulting
25 * boot image file. If the format does not support multiple sections then only
26 * the first will be used.
27 *
28 * Options that are common to all boot image formats are handled by methods
29 * defined in this class. These are the current common options:
30 *	- productVersion
31 *	- componentVersion
32 *	- driveTag
33 */
34class BootImageGenerator
35{
36public:
37	//! \brief Constructor.
38	BootImageGenerator() {}
39
40	//! \brief Destructor.
41	virtual ~BootImageGenerator() {}
42
43	//! \brief Add another section to the output.
44	void addOutputSection(OutputSection * section) { m_sections.push_back(section); }
45
46	//! \brief Set the global option context.
47	void setOptionContext(OptionContext * context) { m_options = context; }
48
49	//! \brief Pure virtual method to generate the output BootImage from input sections.
50	virtual BootImage * generate()=0;
51
52protected:
53	//! Type for a list of model output sections.
54	typedef std::vector<OutputSection*> section_vector_t;
55
56	section_vector_t m_sections;	//!< Requested output sections.
57	OptionContext * m_options;	//!< Global option context.
58
59    //! \brief Handle common product and component version options.
60    void processVersionOptions(BootImage * image);
61
62	//! \brief Handle the common option which sets the system drive tag.
63	void processDriveTagOption(BootImage * image);
64};
65
66}; // namespace elftosb
67
68#endif // _BootImageGenerator_h_
69
70