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