diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2018-11-15 16:07:46 -0800 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2018-11-15 16:07:46 -0800 |
commit | 2d6d3250dcb304c8ad081dedc8eef6ea48fd669d (patch) | |
tree | 68cc8d5a9bf5a558f46025d740c47cb292eea9f0 /src/utils/file_utils.cc | |
parent | 840fc3b66a9e6593d542ada6fe14d91107fab98d (diff) | |
download | image_io-2d6d3250dcb304c8ad081dedc8eef6ea48fd669d.tar.gz |
Initial commit of libimage_io
Image_io is a library for manipulating image files, especially XMP
metadata within them.
Test: m libimage_io
Bug: 109735087
Bug: 119211681
Change-Id: I657f307be0459fe40154806c7cd388b97bcb0ea5
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 |