summaryrefslogtreecommitdiff
path: root/src/utils/file_utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/file_utils.cc')
-rw-r--r--src/utils/file_utils.cc85
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