summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/base/istream_ref_data_source.cc (renamed from src/base/istream_data_source.cc)26
-rw-r--r--src/base/message_handler.cc39
-rw-r--r--src/base/message_writer.cc36
-rw-r--r--src/base/ostream_ref_data_destination.cc (renamed from src/base/ostream_data_destination.cc)27
-rw-r--r--src/extras/base64_decoder_data_destination.cc12
-rw-r--r--src/gcontainer/gcontainer.cc91
-rw-r--r--src/jpeg/jpeg_apple_depth_builder.cc33
-rw-r--r--src/jpeg/jpeg_image_extractor.cc16
-rw-r--r--src/jpeg/jpeg_scanner.cc10
-rw-r--r--src/jpeg/jpeg_xmp_data_extractor.cc10
-rw-r--r--src/utils/file_utils.cc24
11 files changed, 184 insertions, 140 deletions
diff --git a/src/base/istream_data_source.cc b/src/base/istream_ref_data_source.cc
index d1d66f0..5e3d126 100644
--- a/src/base/istream_data_source.cc
+++ b/src/base/istream_ref_data_source.cc
@@ -1,4 +1,4 @@
-#include "image_io/base/istream_data_source.h"
+#include "image_io/base/istream_ref_data_source.h"
#include "image_io/base/data_destination.h"
#include "image_io/base/data_segment.h"
@@ -6,13 +6,13 @@
namespace photos_editing_formats {
namespace image_io {
-void IStreamDataSource::Reset() {
- istream_->clear();
- istream_->seekg(0);
+void IStreamRefDataSource::Reset() {
+ istream_ref_.clear();
+ istream_ref_.seekg(0);
current_data_segment_.reset();
}
-std::shared_ptr<DataSegment> IStreamDataSource::GetDataSegment(
+std::shared_ptr<DataSegment> IStreamRefDataSource::GetDataSegment(
size_t begin, size_t min_size) {
if (current_data_segment_ && current_data_segment_->Contains(begin)) {
return current_data_segment_;
@@ -21,7 +21,7 @@ std::shared_ptr<DataSegment> IStreamDataSource::GetDataSegment(
return current_data_segment_;
}
-DataSource::TransferDataResult IStreamDataSource::TransferData(
+DataSource::TransferDataResult IStreamRefDataSource::TransferData(
const DataRange &data_range, size_t best_size,
DataDestination *data_destination) {
bool data_transferred = false;
@@ -34,7 +34,7 @@ DataSource::TransferDataResult IStreamDataSource::TransferData(
status = data_destination->Transfer(data_range, *current_data_segment_);
data_transferred = true;
} else {
- istream_->clear();
+ istream_ref_.clear();
size_t chunk_size = min_size;
for (size_t begin = data_range.GetBegin(); begin < data_range.GetEnd();
begin += chunk_size) {
@@ -63,14 +63,14 @@ DataSource::TransferDataResult IStreamDataSource::TransferData(
}
}
-std::shared_ptr<DataSegment> IStreamDataSource::Read(size_t begin,
- size_t count) {
+std::shared_ptr<DataSegment> IStreamRefDataSource::Read(size_t begin,
+ size_t count) {
std::shared_ptr<DataSegment> shared_data_segment;
- istream_->seekg(begin);
- if (istream_->rdstate() == std::ios_base::goodbit) {
+ istream_ref_.seekg(begin);
+ if (istream_ref_.rdstate() == std::ios_base::goodbit) {
Byte *buffer = new Byte[count];
- istream_->read(reinterpret_cast<char *>(buffer), count);
- size_t bytes_read = istream_->gcount();
+ istream_ref_.read(reinterpret_cast<char *>(buffer), count);
+ size_t bytes_read = istream_ref_.gcount();
shared_data_segment =
DataSegment::Create(DataRange(begin, begin + bytes_read), buffer);
}
diff --git a/src/base/message_handler.cc b/src/base/message_handler.cc
index 70959c0..fdacc66 100644
--- a/src/base/message_handler.cc
+++ b/src/base/message_handler.cc
@@ -12,34 +12,10 @@ namespace image_io {
using std::string;
using std::unique_ptr;
-/// The message handler. No effort made to delete it at program's end.
-static MessageHandler* gMessageHandler = nullptr;
-
-void MessageHandler::Init(std::unique_ptr<MessageWriter> message_writer,
- std::unique_ptr<MessageStore> message_store) {
- auto* old_handler = gMessageHandler;
- gMessageHandler = new MessageHandler;
- gMessageHandler->SetMessageWriter(std::move(message_writer));
- gMessageHandler->SetMessageStore(std::move(message_store));
- delete old_handler;
-}
-
-MessageHandler* MessageHandler::Get() {
- if (!gMessageHandler) {
- gMessageHandler = new MessageHandler;
- gMessageHandler->SetMessageWriter(
- unique_ptr<MessageWriter>(new CoutMessageWriter));
- gMessageHandler->SetMessageStore(
- unique_ptr<MessageStore>(new VectorMessageStore));
- }
- return gMessageHandler;
-}
-
-MessageHandler::~MessageHandler() {
- if (gMessageHandler == this) {
- gMessageHandler = nullptr;
- }
-}
+MessageHandler::MessageHandler()
+ : message_writer_(new CoutMessageWriter),
+ message_store_(new VectorMessageStore),
+ message_stats_(new MessageStats) {}
void MessageHandler::SetMessageWriter(
std::unique_ptr<MessageWriter> message_writer) {
@@ -57,6 +33,13 @@ void MessageHandler::ReportMessage(Message::Type type, const string& text) {
}
void MessageHandler::ReportMessage(const Message& message) {
+ if (message.IsError()) {
+ message_stats_->error_count++;
+ } else if (message.IsWarning()) {
+ message_stats_->warning_count++;
+ } else {
+ message_stats_->status_count++;
+ }
if (message_store_) {
message_store_->AddMessage(message);
}
diff --git a/src/base/message_writer.cc b/src/base/message_writer.cc
index d13dc41..2f9e0f0 100644
--- a/src/base/message_writer.cc
+++ b/src/base/message_writer.cc
@@ -12,19 +12,37 @@ using std::stringstream;
string MessageWriter::GetFormattedMessage(const Message& message) const {
stringstream message_stream;
- message_stream << GetTypeCategory(message.GetType()) << ":"
- << GetTypeDescription(message.GetType(),
- message.GetSystemErrno())
- << ":" << message.GetText();
+ auto type = message.GetType();
+ if (type != Message::kStatus) {
+ message_stream << GetTypeCategory(type) << ":";
+ }
+ if (type == Message::kInternalError || type == Message::kStdLibError) {
+ message_stream << GetTypeDescription(type, message.GetSystemErrno()) << ":";
+ }
+ message_stream << message.GetText();
return message_stream.str();
}
string MessageWriter::GetTypeCategory(Message::Type type) const {
- if (type == Message::kStatus) {
- return "STATUS";
- } else {
- return "ERROR";
+ string category;
+ switch (type) {
+ case Message::kStatus:
+ category = "STATUS";
+ break;
+ case Message::kWarning:
+ category = "WARNING";
+ break;
+ case Message::kStdLibError:
+ case Message::kPrematureEndOfDataError:
+ case Message::kStringNotFoundError:
+ case Message::kDecodingError:
+ case Message::kSyntaxError:
+ case Message::kValueError:
+ case Message::kInternalError:
+ category = "ERROR";
+ break;
}
+ return category;
}
string MessageWriter::GetTypeDescription(Message::Type type,
@@ -33,6 +51,8 @@ string MessageWriter::GetTypeDescription(Message::Type type,
switch (type) {
case Message::kStatus:
break;
+ case Message::kWarning:
+ break;
case Message::kStdLibError:
description = system_errno > 0 ? std::strerror(system_errno) : "Unknown";
break;
diff --git a/src/base/ostream_data_destination.cc b/src/base/ostream_ref_data_destination.cc
index 97915c9..3658022 100644
--- a/src/base/ostream_data_destination.cc
+++ b/src/base/ostream_ref_data_destination.cc
@@ -1,33 +1,34 @@
-#include "image_io/base/ostream_data_destination.h"
+#include "image_io/base/ostream_ref_data_destination.h"
#include "image_io/base/data_range.h"
#include "image_io/base/data_segment.h"
-#include "image_io/base/message_handler.h"
namespace photos_editing_formats {
namespace image_io {
using std::ostream;
-void OStreamDataDestination::StartTransfer() {}
+void OStreamRefDataDestination::StartTransfer() {}
-DataDestination::TransferStatus OStreamDataDestination::Transfer(
+DataDestination::TransferStatus OStreamRefDataDestination::Transfer(
const DataRange& transfer_range, const DataSegment& data_segment) {
- if (ostream_ && transfer_range.IsValid() && !HasError()) {
+ if (transfer_range.IsValid() && !HasError()) {
size_t bytes_written = 0;
size_t bytes_to_write = transfer_range.GetLength();
const Byte* buffer = data_segment.GetBuffer(transfer_range.GetBegin());
if (buffer) {
- ostream::pos_type prewrite_pos = ostream_->tellp();
- ostream_->write(reinterpret_cast<const char*>(buffer), bytes_to_write);
- ostream::pos_type postwrite_pos = ostream_->tellp();
+ ostream::pos_type prewrite_pos = ostream_ref_.tellp();
+ ostream_ref_.write(reinterpret_cast<const char*>(buffer), bytes_to_write);
+ ostream::pos_type postwrite_pos = ostream_ref_.tellp();
if (postwrite_pos != EOF) {
- bytes_written = ostream_->tellp() - prewrite_pos;
+ bytes_written = ostream_ref_.tellp() - prewrite_pos;
bytes_transferred_ += bytes_written;
}
}
if (bytes_written != bytes_to_write) {
- MessageHandler::Get()->ReportMessage(Message::kStdLibError, name_);
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kStdLibError, name_);
+ }
has_error_ = true;
return kTransferError;
}
@@ -35,10 +36,8 @@ DataDestination::TransferStatus OStreamDataDestination::Transfer(
return kTransferOk;
}
-void OStreamDataDestination::FinishTransfer() {
- if (ostream_) {
- ostream_->flush();
- }
+void OStreamRefDataDestination::FinishTransfer() {
+ ostream_ref_.flush();
}
} // namespace image_io
diff --git a/src/extras/base64_decoder_data_destination.cc b/src/extras/base64_decoder_data_destination.cc
index a15b997..8ba8bb2 100644
--- a/src/extras/base64_decoder_data_destination.cc
+++ b/src/extras/base64_decoder_data_destination.cc
@@ -127,7 +127,9 @@ DataDestination::TransferStatus Base64DecoderDataDestination::Transfer(
decoded_buffer.get(), &pad_count1);
if (total_bytes_decoded + pad_count1 !=
number_leftover_and_stolen_decoded_bytes) {
- MessageHandler::Get()->ReportMessage(Message::kDecodingError, "");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kDecodingError, "");
+ }
has_error_ = true;
return kTransferError;
}
@@ -142,7 +144,9 @@ DataDestination::TransferStatus Base64DecoderDataDestination::Transfer(
total_bytes_decoded += number_bytes_decoded;
if (total_bytes_decoded + pad_count1 + pad_count2 !=
decoded_buffer_length) {
- MessageHandler::Get()->ReportMessage(Message::kDecodingError, "");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kDecodingError, "");
+ }
has_error_ = true;
return kTransferError;
}
@@ -177,7 +181,9 @@ DataDestination::TransferStatus Base64DecoderDataDestination::Transfer(
void Base64DecoderDataDestination::FinishTransfer() {
if (leftover_bytes_.size() % 4) {
- MessageHandler::Get()->ReportMessage(Message::kDecodingError, "");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kDecodingError, "");
+ }
has_error_ = true;
}
next_destination_->FinishTransfer();
diff --git a/src/gcontainer/gcontainer.cc b/src/gcontainer/gcontainer.cc
index 1179778..b97fdd7 100644
--- a/src/gcontainer/gcontainer.cc
+++ b/src/gcontainer/gcontainer.cc
@@ -4,6 +4,7 @@
#include "image_io/base/data_segment.h"
#include "image_io/base/data_segment_data_source.h"
+#include "image_io/base/istream_data_source.h"
#include "image_io/base/message_handler.h"
#include "image_io/base/ostream_data_destination.h"
#include "image_io/jpeg/jpeg_info.h"
@@ -19,44 +20,44 @@ namespace {
using photos_editing_formats::image_io::DataRange;
using photos_editing_formats::image_io::DataSegment;
using photos_editing_formats::image_io::DataSegmentDataSource;
+using photos_editing_formats::image_io::IStreamRefDataSource;
using photos_editing_formats::image_io::JpegInfoBuilder;
using photos_editing_formats::image_io::JpegScanner;
using photos_editing_formats::image_io::Message;
using photos_editing_formats::image_io::MessageHandler;
using photos_editing_formats::image_io::OStreamDataDestination;
-using photos_editing_formats::image_io::ReportErrorPolicy;
using std::string;
// Populates first_image_range with the first image (from the header metadata
// to the EOI marker) present in the JPEG file input_file_name. Returns true if
// such a first image is found, false otherwise.
//
-// input_file_name must be a JPEG file.
+// input_jpeg_stream must be a JPEG stream.
// image_data_segment is populated with the DataSegment for
// input_file_name, and is populated only in the successful case.
// first_image_range is populated with the first image found in the input file,
// only if such an image is found.
-bool ExtractFirstImageInJpeg(const string& input_file_name,
- std::shared_ptr<DataSegment>* image_data_segment,
+
+bool ExtractFirstImageInJpeg(std::istream& input_jpeg_stream,
+ MessageHandler* message_handler,
DataRange* first_image_range) {
if (first_image_range == nullptr) {
return false;
}
// Get the input and output setup.
- MessageHandler::Get()->ClearMessages();
- auto data_segment =
- ReadEntireFile(input_file_name, ReportErrorPolicy::kReportError);
- if (!data_segment) {
- return false;
+ if (message_handler) {
+ message_handler->ClearMessages();
}
// Get the jpeg info and first image range from the input.
- DataSegmentDataSource data_source(data_segment);
+ IStreamRefDataSource data_source(input_jpeg_stream);
JpegInfoBuilder jpeg_info_builder;
jpeg_info_builder.SetImageLimit(1);
- JpegScanner jpeg_scanner;
+ JpegScanner jpeg_scanner(message_handler);
jpeg_scanner.Run(&data_source, &jpeg_info_builder);
+ data_source.Reset();
+
if (jpeg_scanner.HasError()) {
return false;
}
@@ -64,12 +65,13 @@ bool ExtractFirstImageInJpeg(const string& input_file_name,
const auto& jpeg_info = jpeg_info_builder.GetInfo();
const auto& image_ranges = jpeg_info.GetImageRanges();
if (image_ranges.empty()) {
- MessageHandler::Get()->ReportMessage(Message::kPrematureEndOfDataError,
- "No Images Found");
+ if (message_handler) {
+ message_handler->ReportMessage(Message::kPrematureEndOfDataError,
+ "No Images Found");
+ }
return false;
}
- *image_data_segment = data_segment;
*first_image_range = image_ranges[0];
return true;
}
@@ -79,23 +81,27 @@ bool ExtractFirstImageInJpeg(const string& input_file_name,
bool WriteImageAndFiles(const string& input_file_name,
const std::vector<string>& other_files,
const string& output_file_name) {
- auto output_stream =
- OpenOutputFile(output_file_name, ReportErrorPolicy::kReportError);
+ MessageHandler message_handler;
+ auto output_stream = OpenOutputFile(output_file_name, &message_handler);
if (!output_stream) {
return false;
}
- OStreamDataDestination output_destination(std::move(output_stream));
+ OStreamDataDestination output_destination(std::move(output_stream),
+ &message_handler);
output_destination.SetName(output_file_name);
DataRange image_range;
- std::shared_ptr<DataSegment> data_segment;
- if (!ExtractFirstImageInJpeg(input_file_name, &data_segment, &image_range)) {
+ std::unique_ptr<std::istream> input_stream =
+ OpenInputFile(input_file_name, &message_handler);
+
+ if (!ExtractFirstImageInJpeg(*input_stream, &message_handler, &image_range)) {
return false;
}
output_destination.StartTransfer();
- DataSegmentDataSource data_source(data_segment);
+ IStreamDataSource data_source(
+ OpenInputFile(input_file_name, &message_handler));
data_source.TransferData(image_range, image_range.GetLength(),
&output_destination);
@@ -104,8 +110,7 @@ bool WriteImageAndFiles(const string& input_file_name,
if (tack_on_file.empty()) {
continue;
}
- auto tack_on_data_segment =
- ReadEntireFile(tack_on_file, ReportErrorPolicy::kReportError);
+ auto tack_on_data_segment = ReadEntireFile(tack_on_file, &message_handler);
if (!tack_on_data_segment) {
continue;
}
@@ -122,25 +127,40 @@ bool WriteImageAndFiles(const string& input_file_name,
!output_destination.HasError();
}
-bool ParseFileAfterImage(const string& input_file_name,
+bool ParseFileAfterImage(const std::string& input_file_name,
size_t file_start_offset, size_t file_length,
- string* out_file_contents) {
- if (out_file_contents == nullptr || file_start_offset < 0 ||
- file_length == 0) {
+ std::string* out_file_contents) {
+ std::ifstream input_stream(input_file_name);
+ if (!input_stream.is_open()) {
return false;
}
+ return ParseFileAfterImageFromStream(file_start_offset, file_length,
+ input_stream, out_file_contents);
+}
+
+bool ParseFileAfterImageFromStream(size_t start_offset, size_t length,
+ std::istream& input_jpeg_stream,
+ std::string* out_contents) {
+ if (out_contents == nullptr || start_offset < 0 || length == 0) {
+ return false;
+ }
+
+ size_t curr_posn = input_jpeg_stream.tellg();
+ input_jpeg_stream.seekg(0, input_jpeg_stream.end);
+ size_t stream_size = input_jpeg_stream.tellg();
+ input_jpeg_stream.seekg(curr_posn, input_jpeg_stream.beg);
DataRange image_range;
- std::shared_ptr<DataSegment> data_segment;
- if (!ExtractFirstImageInJpeg(input_file_name, &data_segment, &image_range)) {
+ MessageHandler message_handler;
+ if (!ExtractFirstImageInJpeg(input_jpeg_stream, &message_handler,
+ &image_range)) {
return false;
}
size_t image_bytes_end_offset = image_range.GetEnd();
- size_t image_file_end = data_segment->GetEnd();
- size_t file_start_in_image = image_bytes_end_offset + file_start_offset;
- size_t file_end_in_image = file_start_in_image + file_length;
- if (image_file_end < file_end_in_image) {
+ size_t file_start_in_image = image_bytes_end_offset + start_offset;
+ size_t file_end_in_image = file_start_in_image + length;
+ if (stream_size < file_end_in_image) {
// Requested file is past the end of the image file.
return false;
}
@@ -151,10 +171,9 @@ bool ParseFileAfterImage(const string& input_file_name,
// TODO(miraleung): Consider subclassing image_io/data_destination.h and
// transferring bytes directly into the string. TBD pending additional mime
// type getters.
- std::ifstream input_file_stream(input_file_name);
- input_file_stream.seekg(file_range.GetBegin());
- out_file_contents->resize(file_range_size);
- input_file_stream.read(&(*out_file_contents)[0], file_range_size);
+ input_jpeg_stream.seekg(file_range.GetBegin(), input_jpeg_stream.beg);
+ out_contents->resize(file_range_size);
+ input_jpeg_stream.read(&(*out_contents)[0], file_range_size);
return true;
}
diff --git a/src/jpeg/jpeg_apple_depth_builder.cc b/src/jpeg/jpeg_apple_depth_builder.cc
index ce83f9f..a45837e 100644
--- a/src/jpeg/jpeg_apple_depth_builder.cc
+++ b/src/jpeg/jpeg_apple_depth_builder.cc
@@ -45,12 +45,14 @@ constexpr size_t kBestDataSize = 0x10000;
/// @param image_limit The limit on the number of images to get info of.
/// @param data_source The data source from which to get info.
/// @param info A pointer to the jpeg_info object to receive the info.
+/// @param message_handler For use when reporting messages.
/// @return Whether the info was obtained successfully or not.
-bool GetJpegInfo(int image_limit, DataSource* data_source, JpegInfo* info) {
+bool GetJpegInfo(int image_limit, DataSource* data_source, JpegInfo* info,
+ MessageHandler* message_handler) {
JpegInfoBuilder info_builder;
info_builder.SetImageLimit(image_limit);
info_builder.SetCaptureSegmentBytes(kJfif);
- JpegScanner scanner;
+ JpegScanner scanner(message_handler);
scanner.Run(data_source, &info_builder);
if (scanner.HasError()) {
return false;
@@ -68,13 +70,17 @@ bool JpegAppleDepthBuilder::Run(DataSource* primary_image_data_source,
depth_image_data_source_ = depth_image_data_source;
data_destination_ = data_destination;
if (!GetPrimaryImageData()) {
- MessageHandler::Get()->ReportMessage(Message::kDecodingError,
- "Primary image data");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kDecodingError,
+ "Primary image data");
+ }
return false;
}
if (!GetDepthImageData()) {
- MessageHandler::Get()->ReportMessage(Message::kDecodingError,
- "Depth image data");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kDecodingError,
+ "Depth image data");
+ }
return false;
}
data_destination->StartTransfer();
@@ -88,7 +94,7 @@ bool JpegAppleDepthBuilder::Run(DataSource* primary_image_data_source,
bool JpegAppleDepthBuilder::GetPrimaryImageData() {
JpegInfo info;
- if (!GetJpegInfo(1, primary_image_data_source_, &info)) {
+ if (!GetJpegInfo(1, primary_image_data_source_, &info, message_handler_)) {
return false;
}
if (info.GetImageRanges().empty()) {
@@ -119,7 +125,7 @@ bool JpegAppleDepthBuilder::GetPrimaryImageData() {
bool JpegAppleDepthBuilder::GetDepthImageData() {
JpegInfo info;
- if (!GetJpegInfo(2, depth_image_data_source_, &info)) {
+ if (!GetJpegInfo(2, depth_image_data_source_, &info, message_handler_)) {
return false;
}
if (!info.HasAppleDepth()) {
@@ -239,10 +245,13 @@ bool JpegAppleDepthBuilder::TransferData(DataSource* data_source,
data_destination_->GetBytesTransferred() - old_byte_count;
if (bytes_transferred != data_range.GetLength()) {
result = DataSource::kTransferDataError;
- std::stringstream ss;
- ss << "JpegAppleDepthBuilder:data source transferred "
- << bytes_transferred << " bytes instead of " << data_range.GetLength();
- MessageHandler::Get()->ReportMessage(Message::kInternalError, ss.str());
+ if (message_handler_) {
+ std::stringstream ss;
+ ss << "JpegAppleDepthBuilder:data source transferred "
+ << bytes_transferred << " bytes instead of "
+ << data_range.GetLength();
+ message_handler_->ReportMessage(Message::kInternalError, ss.str());
+ }
}
}
return result == DataSource::kTransferDataSuccess;
diff --git a/src/jpeg/jpeg_image_extractor.cc b/src/jpeg/jpeg_image_extractor.cc
index 82f8fce..b915839 100644
--- a/src/jpeg/jpeg_image_extractor.cc
+++ b/src/jpeg/jpeg_image_extractor.cc
@@ -51,8 +51,9 @@ bool JpegImageExtractor::ExtractImage(const DataRange& image_range,
data_range_destination.HasDisjointTransferRanges() ||
data_range_destination.GetTrackedDataRange() != image_range) {
has_errors = true;
- MessageHandler::Get()->ReportMessage(Message::kPrematureEndOfDataError,
- "");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kPrematureEndOfDataError, "");
+ }
}
}
data_range_destination.FinishTransfer();
@@ -73,12 +74,13 @@ bool JpegImageExtractor::ExtractImage(JpegXmpInfo::Type xmp_info_type,
DataDestination* image_destination) {
bool has_errors = false;
const bool has_image = jpeg_info_.HasImage(xmp_info_type);
- Base64DecoderDataDestination base64_decoder(image_destination);
+ Base64DecoderDataDestination base64_decoder(image_destination,
+ message_handler_);
const vector<DataRange>& data_ranges =
jpeg_info_.GetSegmentDataRanges(xmp_info_type);
size_t data_ranges_count = data_ranges.size();
JpegXmpDataExtractor xmp_data_extractor(xmp_info_type, data_ranges_count,
- &base64_decoder);
+ &base64_decoder, message_handler_);
xmp_data_extractor.StartTransfer();
if (has_image) {
for (size_t index = 0; index < data_ranges_count; ++index) {
@@ -97,8 +99,10 @@ bool JpegImageExtractor::ExtractImage(JpegXmpInfo::Type xmp_info_type,
break;
} else if (result == DataSource::kTransferDataNone) {
has_errors = true;
- MessageHandler::Get()->ReportMessage(Message::kPrematureEndOfDataError,
- "");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kPrematureEndOfDataError,
+ "");
+ }
}
}
}
diff --git a/src/jpeg/jpeg_scanner.cc b/src/jpeg/jpeg_scanner.cc
index 85426b2..c039f70 100644
--- a/src/jpeg/jpeg_scanner.cc
+++ b/src/jpeg/jpeg_scanner.cc
@@ -93,10 +93,12 @@ ValidatedByte JpegScanner::GetValidatedByte(size_t location) {
if (next_segment_ && next_segment_->Contains(location)) {
return next_segment_->GetValidatedByte(location);
}
- stringstream sstream;
- sstream << location;
- MessageHandler::Get()->ReportMessage(Message::kPrematureEndOfDataError,
- sstream.str());
+ if (message_handler_) {
+ stringstream sstream;
+ sstream << location;
+ message_handler_->ReportMessage(Message::kPrematureEndOfDataError,
+ sstream.str());
+ }
return InvalidByte();
}
diff --git a/src/jpeg/jpeg_xmp_data_extractor.cc b/src/jpeg/jpeg_xmp_data_extractor.cc
index f59dea5..68475f0 100644
--- a/src/jpeg/jpeg_xmp_data_extractor.cc
+++ b/src/jpeg/jpeg_xmp_data_extractor.cc
@@ -50,8 +50,10 @@ DataDestination::TransferStatus JpegXmpDataExtractor::Transfer(
}
}
if (xmp_data_begin == encoded_data_begin) {
- MessageHandler::Get()->ReportMessage(Message::kStringNotFoundError,
- property_name + "=\"");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kStringNotFoundError,
+ property_name + "=\"");
+ }
has_error_ = true;
return kTransferError;
}
@@ -59,7 +61,9 @@ DataDestination::TransferStatus JpegXmpDataExtractor::Transfer(
if (segment_index_ == last_segment_index_) {
xmp_data_end = data_segment.Find(xmp_data_begin, '"');
if (xmp_data_end == transfer_range.GetEnd()) {
- MessageHandler::Get()->ReportMessage(Message::kStringNotFoundError, "\"");
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kStringNotFoundError, "\"");
+ }
has_error_ = true;
return kTransferError;
}
diff --git a/src/utils/file_utils.cc b/src/utils/file_utils.cc
index d61a2cd..626d537 100644
--- a/src/utils/file_utils.cc
+++ b/src/utils/file_utils.cc
@@ -6,7 +6,6 @@
#import <memory>
#include "image_io/base/data_range.h"
-#include "image_io/base/message_handler.h"
namespace photos_editing_formats {
namespace image_io {
@@ -29,38 +28,38 @@ bool GetFileSize(const std::string& file_name, size_t* size) {
}
unique_ptr<ostream> OpenOutputFile(const std::string& file_name,
- ReportErrorPolicy report_error_policy) {
+ 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 (report_error_policy == ReportErrorPolicy::kReportError) {
- MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name);
+ if (message_handler) {
+ message_handler->ReportMessage(Message::kStdLibError, file_name);
}
}
return unique_ptr<ostream>(file_stream);
}
unique_ptr<istream> OpenInputFile(const std::string& file_name,
- ReportErrorPolicy report_error_policy) {
+ 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 (report_error_policy == ReportErrorPolicy::kReportError) {
- MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name);
+ if (message_handler) {
+ message_handler->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) {
+std::shared_ptr<DataSegment> ReadEntireFile(const std::string& file_name,
+ MessageHandler* message_handler) {
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);
+ OpenInputFile(file_name, message_handler);
if (shared_istream) {
Byte* buffer = new Byte[buffer_size];
if (buffer) {
@@ -74,9 +73,8 @@ std::shared_ptr<DataSegment> ReadEntireFile(
}
}
}
- if (!shared_data_segment &&
- report_error_policy == ReportErrorPolicy::kReportError) {
- MessageHandler::Get()->ReportMessage(Message::kStdLibError, file_name);
+ if (!shared_data_segment && message_handler) {
+ message_handler->ReportMessage(Message::kStdLibError, file_name);
}
return shared_data_segment;
}