summaryrefslogtreecommitdiffstats
path: root/common/SourceFile.h
diff options
context:
space:
mode:
authorJuergen Beisert <jbe@pengutronix.de>2011-06-06 16:57:16 +0200
committerJuergen Beisert <jbe@pengutronix.de>2011-06-06 16:57:16 +0200
commitdd57c62797d2b8d05e224680c7bc6e3d4640dde0 (patch)
tree30046767e14e220ac2b66e2314530565b2117b40 /common/SourceFile.h
parent3647e131f8f2779d203d737a3c59baf6c061d528 (diff)
downloadmxs-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.h156
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_