diff options
Diffstat (limited to 'src/utils/file_utils.cc')
-rw-r--r-- | src/utils/file_utils.cc | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/utils/file_utils.cc b/src/utils/file_utils.cc new file mode 100644 index 0000000..d61a2cd --- /dev/null +++ b/src/utils/file_utils.cc @@ -0,0 +1,85 @@ +#include "image_io/utils/file_utils.h" + +#include <sys/stat.h> +#import <fstream> +#import <iostream> +#import <memory> + +#include "image_io/base/data_range.h" +#include "image_io/base/message_handler.h" + +namespace photos_editing_formats { +namespace image_io { + +using std::fstream; +using std::istream; +using std::ostream; +using std::unique_ptr; + +bool GetFileSize(const std::string& file_name, size_t* size) { + struct stat stat_buf; + if (stat(file_name.c_str(), &stat_buf)) { + return false; + } else { + if (size) { + *size = stat_buf.st_size; + } + return true; + } +} + +unique_ptr<ostream> OpenOutputFile(const std::string& file_name, + ReportErrorPolicy report_error_policy) { + auto* file_stream = new fstream(file_name, std::ios::out | std::ios::binary); + if (file_stream && !file_stream->is_open()) { + delete file_stream; + file_stream = nullptr; + if (report_error_policy == ReportErrorPolicy::kReportError) { + MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name); + } + } + return unique_ptr<ostream>(file_stream); +} + +unique_ptr<istream> OpenInputFile(const std::string& file_name, + ReportErrorPolicy report_error_policy) { + auto* file_stream = new fstream(file_name, std::ios::in | std::ios::binary); + if (file_stream && !file_stream->is_open()) { + delete file_stream; + file_stream = nullptr; + if (report_error_policy == ReportErrorPolicy::kReportError) { + MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name); + } + } + return unique_ptr<istream>(file_stream); +} + +std::shared_ptr<DataSegment> ReadEntireFile( + const std::string& file_name, ReportErrorPolicy report_error_policy) { + size_t buffer_size = 0; + std::shared_ptr<DataSegment> shared_data_segment; + if (GetFileSize(file_name, &buffer_size)) { + unique_ptr<istream> shared_istream = + OpenInputFile(file_name, ReportErrorPolicy::kDontReportError); + if (shared_istream) { + Byte* buffer = new Byte[buffer_size]; + if (buffer) { + shared_data_segment = + DataSegment::Create(DataRange(0, buffer_size), buffer); + shared_istream->read(reinterpret_cast<char*>(buffer), buffer_size); + size_t bytes_read = shared_istream->tellg(); + if (bytes_read != buffer_size) { + shared_data_segment.reset(); + } + } + } + } + if (!shared_data_segment && + report_error_policy == ReportErrorPolicy::kReportError) { + MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name); + } + return shared_data_segment; +} + +} // namespace image_io +} // namespace photos_editing_formats |