/** * @author Edouard DUPIN * * @copyright 2011, Edouard DUPIN, all right reserved * * @license BSD v3 (see license file) */ #ifndef __ETK_ARCHIVE_H__ #define __ETK_ARCHIVE_H__ #include #include #include namespace etk { class Archive { public: class Content { private: int32_t m_link; //!< number of element open on this file public: void IncreaseRef(void) { m_link++; }; void DecreaseRef(void) { m_link--; }; int32_t GetNumberOfRef(void) const { return m_link; }; private: esize_t m_theoricSize; //!< number of element open on this file public: esize_t GetTheoricSize(void) const { return m_theoricSize; }; private: etk::Vector m_data; public: Content(esize_t _basicSize=0) : m_link(-1), m_theoricSize(_basicSize) { }; esize_t Size(void) const { return m_data.Size(); }; void* Data(void) const { return (void*)&m_data[0]; }; etk::Vector& GetDataVector(void) { return m_data; }; }; public: Archive(const etk::UString& _fileName) : m_fileName(_fileName) { }; virtual ~Archive(void) { }; protected: etk::UString m_fileName; //!< File name when it came from an file public: /** * @brief Get the current file name. * @return the requested file name. */ const etk::UString& GetFileName(void) { return m_fileName; }; protected: etk::Hash m_content; public: /** * @brief Get the number of elements * @return nb files in the archive */ esize_t Size(void) const { return m_content.Size(); }; /** * @brief Get the File name of the ID * @param[in] _id id of the element (must be < Size()) * @return FileName of the requested id */ const etk::UString& GetName(esize_t _id) const { return m_content.GetKey(_id); }; /** * @brief Get the File name of the ID * @param[in] _id id of the element (must be < Size()) * @return the archive content */ const Content& GetContent(esize_t _id) const { return m_content.GetValue(_id); }; /** * @brief Get the File name of the ID * @param[in] _key name of the file * @return FileName of the requested id */ const Content& GetContent(const etk::UString& _key) const; /** * @brief Check if a file exist * @param[in] _key Name of the file * @return true if the file is present */ bool Exist(const etk::UString& _key) const { return m_content.Exist(_key); }; /** * @brief Load the specific file in the memory * @param[in] _key Name of the file */ void Open(const etk::UString& _key); /** * @brief Un-Load the specific file from the memory * @param[in] _key Name of the file */ void Close(const etk::UString& _key); /** * @brief Display all Element in the archive */ void Display(void); protected: /** * @brief Request the load in memory of the concerned file. * @param[in] _id Id of the file to load. */ virtual void LoadFile(int32_t _id) { }; public: /** * @brief Load an Achive with a specific name. * @param[in] _fileName File name of the specific archive. * @return A pointer an the specified archive, the user might delete it. */ static Archive* Load(const etk::UString& _fileName); /** * @brief Create an Achive with a specific name. * @param[in] _fileName File name of the specific archive. * @return A pointer an the specified archive. it is empty due to the fact of create a new archive file. */ //Archive* Create(const etk::UString& _fileName); }; }; #endif