From be0d3a6d232b9d7cb824f44fb3e8eacb3853b7d7 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Mon, 9 Oct 2017 23:50:10 +0200 Subject: [PATCH] [DEV] add factore to file to permit to have virtual file --- zeus/zeus-File.impl.cpp | 63 ++++++++++++++++++++++++++----------- zeus/zeus-File.impl.hpp | 3 ++ zeus/zeus-File.obj.zeus.idl | 5 +++ 3 files changed, 53 insertions(+), 18 deletions(-) diff --git a/zeus/zeus-File.impl.cpp b/zeus/zeus-File.impl.cpp index ef3db50..4ab5d63 100644 --- a/zeus/zeus-File.impl.cpp +++ b/zeus/zeus-File.impl.cpp @@ -28,6 +28,20 @@ ememory::SharedPtr zeus::File::create(etk::String _fileNameReal, etk return ememory::makeShared(_fileNameReal, _fileNameShow, _mineType, _sha512); } +ememory::SharedPtr zeus::File::create(etk::Vector _fileNameReal, etk::String _virtualName, etk::String _mineType) { + return ememory::makeShared(_fileNameReal, _virtualName, _mineType); +} + + +zeus::FileImpl::FileImpl(const etk::Vector& _value, etk::String _virtualName, etk::String _mineType) : + m_filename(_virtualName), + m_gettedData(0), + m_mineType(_mineType), + m_sha512("") { + m_dataRaw = true; + m_data = _value; + m_size = m_data.size(); +} zeus::FileImpl::FileImpl(etk::String _fileNameReal, etk::String _sha512) : m_filename(_fileNameReal), m_node(_fileNameReal), @@ -80,7 +94,11 @@ etk::String zeus::FileImpl::getName() { etk::String zeus::FileImpl::getSha512() { if (m_sha512 == "") { ZEUS_INFO("calculation of sha 512 (start)"); - m_sha512 = algue::stringConvert(algue::sha512::encodeFromFile(m_node.getFileSystemName())); + if (m_dataRaw == false) { + m_sha512 = algue::stringConvert(algue::sha512::encodeFromFile(m_node.getFileSystemName())); + } else { + m_sha512 = algue::stringConvert(algue::sha512::encode(m_data)); + } ZEUS_INFO("calculation of sha 512 (stop)"); } return m_sha512; @@ -99,24 +117,33 @@ zeus::Raw zeus::FileImpl::getPart(uint64_t _start, uint64_t _stop) { if (_start >= m_size) { throw etk::exception::InvalidArgument("REQUEST start position out of file size" + etk::toString(_start) + " > " + etk::toString(m_size)); } - if (m_node.fileIsOpen() == false) { - m_node.fileOpenRead(); + if (m_dataRaw == false) { + if (m_node.fileIsOpen() == false) { + m_node.fileOpenRead(); + } + m_gettedData += (_stop - _start); + //ZEUS_PRINT("Reading file : " << m_gettedData << "/" << m_size << " ==> " << float(m_gettedData)/float(m_size)*100.0f << "%"); + printf("Reading file : %d/%d ==> %f \r", int(m_gettedData), int(m_size), float(m_gettedData)/float(m_size)*100.0f); + zeus::Raw tmp(_stop - _start); + if (m_node.fileSeek(_start, etk::seekNode_start) == false) { + ZEUS_ERROR("REQUEST seek error ..."); + throw etk::exception::RuntimeError("Seek in the file error"); + return zeus::Raw(); + } + int64_t sizeCopy = m_node.fileRead(tmp.writeData(), 1, _stop-_start); + if (m_size <= _stop) { + m_node.fileClose(); + } + // TODO : Check if copy is correct ... + return etk::move(tmp); + } else { + m_gettedData += (_stop - _start); + //ZEUS_PRINT("Reading file : " << m_gettedData << "/" << m_size << " ==> " << float(m_gettedData)/float(m_size)*100.0f << "%"); + printf("Reading file : %d/%d ==> %f \r", int(m_gettedData), int(m_size), float(m_gettedData)/float(m_size)*100.0f); + zeus::Raw tmp(_stop - _start); + memcpy(tmp.writeData(), &m_data[_start], _stop-_start); + return etk::move(tmp); } - m_gettedData += (_stop - _start); - //ZEUS_PRINT("Reading file : " << m_gettedData << "/" << m_size << " ==> " << float(m_gettedData)/float(m_size)*100.0f << "%"); - printf("Reading file : %d/%d ==> %f \r", int(m_gettedData), int(m_size), float(m_gettedData)/float(m_size)*100.0f); - zeus::Raw tmp(_stop - _start); - if (m_node.fileSeek(_start, etk::seekNode_start) == false) { - ZEUS_ERROR("REQUEST seek error ..."); - throw etk::exception::RuntimeError("Seek in the file error"); - return zeus::Raw(); - } - int64_t sizeCopy = m_node.fileRead(tmp.writeData(), 1, _stop-_start); - if (m_size <= _stop) { - m_node.fileClose(); - } - // TODO : Check if copy is correct ... - return etk::move(tmp); } etk::String zeus::storeInFile(zeus::ProxyFile _file, etk::String _filename) { diff --git a/zeus/zeus-File.impl.hpp b/zeus/zeus-File.impl.hpp index f618902..ef08fdb 100644 --- a/zeus/zeus-File.impl.hpp +++ b/zeus/zeus-File.impl.hpp @@ -13,6 +13,8 @@ namespace zeus { private: etk::String m_filename; //!< Name of the file etk::FSNode m_node; //!< File node access + etk::Vector m_data; //!< data of the file to transfer; + bool m_dataRaw = false; size_t m_size; //!< Size of the file size_t m_gettedData; //!< Number of byte loaded by the remote client etk::String m_mineType; //!< Mine Type of the file @@ -20,6 +22,7 @@ namespace zeus { public: FileImpl(etk::String _fileNameReal, etk::String _fileNameShow, etk::String _mineType, etk::String _sha512=""); FileImpl(etk::String _fileNameReal, etk::String _sha512=""); + FileImpl(const etk::Vector& _value, etk::String _virtualName, etk::String _mineType); ~FileImpl(); uint64_t getSize() override; etk::String getName() override; diff --git a/zeus/zeus-File.obj.zeus.idl b/zeus/zeus-File.obj.zeus.idl index bbdd7a8..3d1927c 100644 --- a/zeus/zeus-File.obj.zeus.idl +++ b/zeus/zeus-File.obj.zeus.idl @@ -25,6 +25,11 @@ #param:mineType:Mine-type of the file. #param:sha512: Sha-512 string if the file [factory] create(string, string, string, string) +#brief:Factory to create a local object with a buffer with data like a file. +#param:buffer:Data bueffer of the data. +#param:virtualName:Virtual name of the file. +#param:mineType:Mine-type of the file. +[factory] create(vector:uint8, string, string) // -------------------------- // -- Members --