xref: /aosp_15_r20/external/image_io/src/utils/file_utils.cc (revision ca0779eb572efbbfda2e47f806647c3c7eeea8c3)
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