diff options
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.cc | 39 | ||||
-rw-r--r-- | src/base/message_writer.cc | 36 | ||||
-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.cc | 12 | ||||
-rw-r--r-- | src/gcontainer/gcontainer.cc | 91 | ||||
-rw-r--r-- | src/jpeg/jpeg_apple_depth_builder.cc | 33 | ||||
-rw-r--r-- | src/jpeg/jpeg_image_extractor.cc | 16 | ||||
-rw-r--r-- | src/jpeg/jpeg_scanner.cc | 10 | ||||
-rw-r--r-- | src/jpeg/jpeg_xmp_data_extractor.cc | 10 | ||||
-rw-r--r-- | src/utils/file_utils.cc | 24 |
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; } |