#include "image_io/utils/file_utils.h" #include #import #import #import #include "image_io/base/data_range.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 OpenOutputFile(const std::string& file_name, MessageHandler* message_handler) { 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 (message_handler) { message_handler->ReportMessage(Message::kStdLibError, file_name); } } return unique_ptr(file_stream); } unique_ptr OpenInputFile(const std::string& file_name, MessageHandler* message_handler) { 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 (message_handler) { message_handler->ReportMessage(Message::kStdLibError, file_name); } } return unique_ptr(file_stream); } std::shared_ptr ReadEntireFile(const std::string& file_name, MessageHandler* message_handler) { size_t buffer_size = 0; std::shared_ptr shared_data_segment; if (GetFileSize(file_name, &buffer_size)) { unique_ptr shared_istream = OpenInputFile(file_name, message_handler); 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(buffer), buffer_size); size_t bytes_read = shared_istream->tellg(); if (bytes_read != buffer_size) { shared_data_segment.reset(); } } } } if (!shared_data_segment && message_handler) { message_handler->ReportMessage(Message::kStdLibError, file_name); } return shared_data_segment; } } // namespace image_io } // namespace photos_editing_formats