1*ca0779ebSJerome Gaillard #include "image_io/utils/file_utils.h"
2*ca0779ebSJerome Gaillard
3*ca0779ebSJerome Gaillard #include <sys/stat.h>
4*ca0779ebSJerome Gaillard #import <fstream>
5*ca0779ebSJerome Gaillard #import <iostream>
6*ca0779ebSJerome Gaillard #import <memory>
7*ca0779ebSJerome Gaillard
8*ca0779ebSJerome Gaillard #include "image_io/base/data_range.h"
9*ca0779ebSJerome Gaillard
10*ca0779ebSJerome Gaillard namespace photos_editing_formats {
11*ca0779ebSJerome Gaillard namespace image_io {
12*ca0779ebSJerome Gaillard
13*ca0779ebSJerome Gaillard using std::fstream;
14*ca0779ebSJerome Gaillard using std::istream;
15*ca0779ebSJerome Gaillard using std::ostream;
16*ca0779ebSJerome Gaillard using std::unique_ptr;
17*ca0779ebSJerome Gaillard
GetFileSize(const std::string & file_name,size_t * size)18*ca0779ebSJerome Gaillard bool GetFileSize(const std::string& file_name, size_t* size) {
19*ca0779ebSJerome Gaillard struct stat stat_buf;
20*ca0779ebSJerome Gaillard if (stat(file_name.c_str(), &stat_buf)) {
21*ca0779ebSJerome Gaillard return false;
22*ca0779ebSJerome Gaillard } else {
23*ca0779ebSJerome Gaillard if (size) {
24*ca0779ebSJerome Gaillard *size = stat_buf.st_size;
25*ca0779ebSJerome Gaillard }
26*ca0779ebSJerome Gaillard return true;
27*ca0779ebSJerome Gaillard }
28*ca0779ebSJerome Gaillard }
29*ca0779ebSJerome Gaillard
OpenOutputFile(const std::string & file_name,MessageHandler * message_handler)30*ca0779ebSJerome Gaillard unique_ptr<ostream> OpenOutputFile(const std::string& file_name,
31*ca0779ebSJerome Gaillard MessageHandler* message_handler) {
32*ca0779ebSJerome Gaillard auto* file_stream = new fstream(file_name, std::ios::out | std::ios::binary);
33*ca0779ebSJerome Gaillard if (file_stream && !file_stream->is_open()) {
34*ca0779ebSJerome Gaillard delete file_stream;
35*ca0779ebSJerome Gaillard file_stream = nullptr;
36*ca0779ebSJerome Gaillard if (message_handler) {
37*ca0779ebSJerome Gaillard message_handler->ReportMessage(Message::kStdLibError, file_name);
38*ca0779ebSJerome Gaillard }
39*ca0779ebSJerome Gaillard }
40*ca0779ebSJerome Gaillard return unique_ptr<ostream>(file_stream);
41*ca0779ebSJerome Gaillard }
42*ca0779ebSJerome Gaillard
OpenInputFile(const std::string & file_name,MessageHandler * message_handler)43*ca0779ebSJerome Gaillard unique_ptr<istream> OpenInputFile(const std::string& file_name,
44*ca0779ebSJerome Gaillard MessageHandler* message_handler) {
45*ca0779ebSJerome Gaillard auto* file_stream = new fstream(file_name, std::ios::in | std::ios::binary);
46*ca0779ebSJerome Gaillard if (file_stream && !file_stream->is_open()) {
47*ca0779ebSJerome Gaillard delete file_stream;
48*ca0779ebSJerome Gaillard file_stream = nullptr;
49*ca0779ebSJerome Gaillard if (message_handler) {
50*ca0779ebSJerome Gaillard message_handler->ReportMessage(Message::kStdLibError, file_name);
51*ca0779ebSJerome Gaillard }
52*ca0779ebSJerome Gaillard }
53*ca0779ebSJerome Gaillard return unique_ptr<istream>(file_stream);
54*ca0779ebSJerome Gaillard }
55*ca0779ebSJerome Gaillard
ReadEntireFile(const std::string & file_name,MessageHandler * message_handler)56*ca0779ebSJerome Gaillard std::shared_ptr<DataSegment> ReadEntireFile(const std::string& file_name,
57*ca0779ebSJerome Gaillard MessageHandler* message_handler) {
58*ca0779ebSJerome Gaillard size_t buffer_size = 0;
59*ca0779ebSJerome Gaillard std::shared_ptr<DataSegment> shared_data_segment;
60*ca0779ebSJerome Gaillard if (GetFileSize(file_name, &buffer_size)) {
61*ca0779ebSJerome Gaillard unique_ptr<istream> shared_istream =
62*ca0779ebSJerome Gaillard OpenInputFile(file_name, message_handler);
63*ca0779ebSJerome Gaillard if (shared_istream) {
64*ca0779ebSJerome Gaillard Byte* buffer = new Byte[buffer_size];
65*ca0779ebSJerome Gaillard if (buffer) {
66*ca0779ebSJerome Gaillard shared_data_segment =
67*ca0779ebSJerome Gaillard DataSegment::Create(DataRange(0, buffer_size), buffer);
68*ca0779ebSJerome Gaillard shared_istream->read(reinterpret_cast<char*>(buffer), buffer_size);
69*ca0779ebSJerome Gaillard size_t bytes_read = shared_istream->tellg();
70*ca0779ebSJerome Gaillard if (bytes_read != buffer_size) {
71*ca0779ebSJerome Gaillard shared_data_segment.reset();
72*ca0779ebSJerome Gaillard }
73*ca0779ebSJerome Gaillard }
74*ca0779ebSJerome Gaillard }
75*ca0779ebSJerome Gaillard }
76*ca0779ebSJerome Gaillard if (!shared_data_segment && message_handler) {
77*ca0779ebSJerome Gaillard message_handler->ReportMessage(Message::kStdLibError, file_name);
78*ca0779ebSJerome Gaillard }
79*ca0779ebSJerome Gaillard return shared_data_segment;
80*ca0779ebSJerome Gaillard }
81*ca0779ebSJerome Gaillard
82*ca0779ebSJerome Gaillard } // namespace image_io
83*ca0779ebSJerome Gaillard } // namespace photos_editing_formats
84