[DEV] add factore to file to permit to have virtual file

This commit is contained in:
Edouard DUPIN 2017-10-09 23:50:10 +02:00
parent a02d121421
commit be0d3a6d23
3 changed files with 53 additions and 18 deletions

View File

@ -28,6 +28,20 @@ ememory::SharedPtr<zeus::File> zeus::File::create(etk::String _fileNameReal, etk
return ememory::makeShared<zeus::FileImpl>(_fileNameReal, _fileNameShow, _mineType, _sha512); return ememory::makeShared<zeus::FileImpl>(_fileNameReal, _fileNameShow, _mineType, _sha512);
} }
ememory::SharedPtr<zeus::File> zeus::File::create(etk::Vector<uint8_t> _fileNameReal, etk::String _virtualName, etk::String _mineType) {
return ememory::makeShared<zeus::FileImpl>(_fileNameReal, _virtualName, _mineType);
}
zeus::FileImpl::FileImpl(const etk::Vector<uint8_t>& _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) : zeus::FileImpl::FileImpl(etk::String _fileNameReal, etk::String _sha512) :
m_filename(_fileNameReal), m_filename(_fileNameReal),
m_node(_fileNameReal), m_node(_fileNameReal),
@ -80,7 +94,11 @@ etk::String zeus::FileImpl::getName() {
etk::String zeus::FileImpl::getSha512() { etk::String zeus::FileImpl::getSha512() {
if (m_sha512 == "") { if (m_sha512 == "") {
ZEUS_INFO("calculation of sha 512 (start)"); 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)"); ZEUS_INFO("calculation of sha 512 (stop)");
} }
return m_sha512; return m_sha512;
@ -99,24 +117,33 @@ zeus::Raw zeus::FileImpl::getPart(uint64_t _start, uint64_t _stop) {
if (_start >= m_size) { if (_start >= m_size) {
throw etk::exception::InvalidArgument("REQUEST start position out of file size" + etk::toString(_start) + " > " + etk::toString(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) { if (m_dataRaw == false) {
m_node.fileOpenRead(); 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) { etk::String zeus::storeInFile(zeus::ProxyFile _file, etk::String _filename) {

View File

@ -13,6 +13,8 @@ namespace zeus {
private: private:
etk::String m_filename; //!< Name of the file etk::String m_filename; //!< Name of the file
etk::FSNode m_node; //!< File node access etk::FSNode m_node; //!< File node access
etk::Vector<uint8_t> m_data; //!< data of the file to transfer;
bool m_dataRaw = false;
size_t m_size; //!< Size of the file size_t m_size; //!< Size of the file
size_t m_gettedData; //!< Number of byte loaded by the remote client size_t m_gettedData; //!< Number of byte loaded by the remote client
etk::String m_mineType; //!< Mine Type of the file etk::String m_mineType; //!< Mine Type of the file
@ -20,6 +22,7 @@ namespace zeus {
public: public:
FileImpl(etk::String _fileNameReal, etk::String _fileNameShow, etk::String _mineType, etk::String _sha512=""); FileImpl(etk::String _fileNameReal, etk::String _fileNameShow, etk::String _mineType, etk::String _sha512="");
FileImpl(etk::String _fileNameReal, etk::String _sha512=""); FileImpl(etk::String _fileNameReal, etk::String _sha512="");
FileImpl(const etk::Vector<uint8_t>& _value, etk::String _virtualName, etk::String _mineType);
~FileImpl(); ~FileImpl();
uint64_t getSize() override; uint64_t getSize() override;
etk::String getName() override; etk::String getName() override;

View File

@ -25,6 +25,11 @@
#param:mineType:Mine-type of the file. #param:mineType:Mine-type of the file.
#param:sha512: Sha-512 string if the file #param:sha512: Sha-512 string if the file
[factory] create(string, string, string, string) [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 -- // -- Members --