diff options
author | Juergen Beisert <jbe@pengutronix.de> | 2011-06-06 16:57:16 +0200 |
---|---|---|
committer | Juergen Beisert <jbe@pengutronix.de> | 2011-06-06 16:57:16 +0200 |
commit | dd57c62797d2b8d05e224680c7bc6e3d4640dde0 (patch) | |
tree | 30046767e14e220ac2b66e2314530565b2117b40 /common/SourceFile.h | |
parent | 3647e131f8f2779d203d737a3c59baf6c061d528 (diff) | |
download | mxs-utils-dd57c62797d2b8d05e224680c7bc6e3d4640dde0.tar.gz mxs-utils-dd57c62797d2b8d05e224680c7bc6e3d4640dde0.tar.xz |
Import FSL's release 10.11.01
Signed-off-by: Juergen Beisert <jbe@pengutronix.de>
Diffstat (limited to 'common/SourceFile.h')
-rw-r--r-- | common/SourceFile.h | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/common/SourceFile.h b/common/SourceFile.h new file mode 100644 index 0000000..773dd5b --- /dev/null +++ b/common/SourceFile.h @@ -0,0 +1,156 @@ +/* + * File: SourceFile.h + * + * Copyright (c) Freescale Semiconductor, Inc. All rights reserved. + * See included license file for license details. + */ +#if !defined(_SourceFile_h_) +#define _SourceFile_h_ + +#include <string> +#include <iostream> +#include <fstream> +#include "smart_ptr.h" +#include "DataSource.h" +#include "DataTarget.h" +#include "StringMatcher.h" +#include "OptionContext.h" + +namespace elftosb +{ + +/*! + * \brief Abstract base class for a source file containing executable code. + * + * The purpose of this class cluster is to provide a common interface for + * accessing the contents of different file formats. This is accomplished + * through several small sets of methods along with the DataSource and + * DataTarget classes. + * + * The primary interface for creating instances of SourceFile is the static + * SourceFile::openFile() function. It will create the correct subclass of + * SourceFile by inspecting the file to determine its type. + */ +class SourceFile +{ +public: + // \brief Factory function that creates the correct subclass of SourceFile. + static SourceFile * openFile(const std::string & path); + +public: + //! \brief Default constructor. + SourceFile(const std::string & path); + + //! \brief Destructor. + virtual ~SourceFile(); + + //! \brief Set the option context. + //! + //! The source file will take ownership of the @a context and delete it + //! when the source file is itself deleted. + inline void setOptions(OptionContext * context) { m_options = context; } + + //! \brief Return the option context. + inline const OptionContext * getOptions() const { return m_options; } + + //! \brief Returns the path to the file. + inline const std::string & getPath() const { return m_path; } + + //! \brief Get the size in bytes of the file. + unsigned getSize(); + + //! \name Opening and closing + //@{ + //! \brief Opens the file. + virtual void open(); + + //! \brief Closes the file. + virtual void close(); + + //! \brief Returns whether the file is already open. + virtual bool isOpen() const { return (bool)m_stream && const_cast<std::ifstream*>(m_stream.get())->is_open(); } + //@} + + //! \name Format capabilities + //@{ + virtual bool supportsNamedSections() const=0; + virtual bool supportsNamedSymbols() const=0; + //@} + + //! \name Data source creation + //@{ + //! \brief Creates a data source from the entire file. + virtual DataSource * createDataSource()=0; + + //! \brief Creates a data source out of one or more sections of the file. + //! + //! The \a selector object is used to perform the section name comparison. + //! If the file does not support named sections, or if there is not a + //! section with the given name, this method may return NULL. + virtual DataSource * createDataSource(StringMatcher & matcher) { return NULL; } + + //! \brief Creates a data source out of one section of the file. + virtual DataSource * createDataSource(const std::string & section); + //@} + + //! \name Entry point + //@{ + //! \brief Returns true if an entry point was set in the file. + virtual bool hasEntryPoint()=0; + + //! \brief Returns the entry point address. + virtual uint32_t getEntryPointAddress() { return 0; } + //@} + + //! \name Data target creation + //@{ + virtual DataTarget * createDataTargetForSection(const std::string & section) { return NULL; } + virtual DataTarget * createDataTargetForSymbol(const std::string & symbol) { return NULL; } + virtual DataTarget * createDataTargetForEntryPoint(); + //@} + + //! \name Symbols + //@{ + //! \brief Returns whether a symbol exists in the source file. + virtual bool hasSymbol(const std::string & name) { return false; } + + //! \brief Returns the value of a symbol. + virtual uint32_t getSymbolValue(const std::string & name) { return 0; } + + //! \brief Returns the size of a symbol. + virtual unsigned getSymbolSize(const std::string & name) { return 0; } + //@} + +protected: + std::string m_path; //!< Path to the file. + smart_ptr<std::ifstream> m_stream; //!< File stream, or NULL if file is closed. + smart_ptr<OptionContext> m_options; //!< Table of option values. + + //! \brief Internal access to the input stream object. + inline std::ifstream * getStream() { return m_stream; } +}; + +/*! + * \brief Binary data file. + */ +class BinarySourceFile : public SourceFile +{ +public: + //! \brief Default constructor. + BinarySourceFile(const std::string & path) : SourceFile(path) {} + + //! \name Format capabilities + //@{ + virtual bool supportsNamedSections() const { return false; } + virtual bool supportsNamedSymbols() const { return false; } + //@} + + //! \brief Creates an unmapped data source from the entire file. + virtual DataSource * createDataSource(); + + virtual bool hasEntryPoint() { return false; } +}; + +}; // namespace elftosb + +#endif // _SourceFile_h_ |