Kumu::Result_t Kumu::ReadFileIntoObject(const std::string& Filename, Kumu::IArchive& Object, ui32_t max_size) { ByteString Buffer; ui32_t file_size = static_cast<ui32_t>(FileSize(Filename)); Result_t result = Buffer.Capacity(file_size); if ( KM_SUCCESS(result) ) { ui32_t read_count = 0; FileWriter Reader; result = Reader.OpenRead(Filename); if ( KM_SUCCESS(result) ) result = Reader.Read(Buffer.Data(), file_size, &read_count); if ( KM_SUCCESS(result) ) { assert(file_size == read_count); Buffer.Length(read_count); MemIOReader MemReader(&Buffer); result = Object.Unarchive(&MemReader) ? RESULT_OK : RESULT_READFAIL; } } return result; }
Kumu::Result_t Kumu::WriteObjectIntoFile(const Kumu::IArchive& Object, const std::string& Filename) { ByteString Buffer; Result_t result = Buffer.Capacity(Object.ArchiveLength()); if ( KM_SUCCESS(result) ) { ui32_t write_count = 0; FileWriter Writer; MemIOWriter MemWriter(&Buffer); result = Object.Archive(&MemWriter) ? RESULT_OK : RESULT_WRITEFAIL; if ( KM_SUCCESS(result) ) { Buffer.Length(MemWriter.Length()); result = Writer.OpenWrite(Filename); } if ( KM_SUCCESS(result) ) result = Writer.Write(Buffer.RoData(), Buffer.Length(), &write_count); } return result; }
Kumu::Result_t Kumu::ReadFileIntoString(const std::string& filename, std::string& outString, ui32_t max_size) { fsize_t fsize = 0; ui32_t read_size = 0; FileReader File; ByteString ReadBuf; Result_t result = File.OpenRead(filename); if ( KM_SUCCESS(result) ) { fsize = File.Size(); if ( fsize > (Kumu::fpos_t)max_size ) { DefaultLogSink().Error("%s: exceeds available buffer size (%u)\n", filename.c_str(), max_size); return RESULT_ALLOC; } if ( fsize == 0 ) { DefaultLogSink().Error("%s: zero file size\n", filename.c_str()); return RESULT_READFAIL; } result = ReadBuf.Capacity((ui32_t)fsize); } if ( KM_SUCCESS(result) ) result = File.Read(ReadBuf.Data(), ReadBuf.Capacity(), &read_size); if ( KM_SUCCESS(result) ) outString.assign((const char*)ReadBuf.RoData(), read_size); return result; }