summaryrefslogtreecommitdiffstats
path: root/src/base/ostream_ref_data_destination.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/ostream_ref_data_destination.cc')
-rw-r--r--src/base/ostream_ref_data_destination.cc44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/base/ostream_ref_data_destination.cc b/src/base/ostream_ref_data_destination.cc
new file mode 100644
index 0000000..3658022
--- /dev/null
+++ b/src/base/ostream_ref_data_destination.cc
@@ -0,0 +1,44 @@
+#include "image_io/base/ostream_ref_data_destination.h"
+
+#include "image_io/base/data_range.h"
+#include "image_io/base/data_segment.h"
+
+namespace photos_editing_formats {
+namespace image_io {
+
+using std::ostream;
+
+void OStreamRefDataDestination::StartTransfer() {}
+
+DataDestination::TransferStatus OStreamRefDataDestination::Transfer(
+ const DataRange& transfer_range, const DataSegment& data_segment) {
+ 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_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_ref_.tellp() - prewrite_pos;
+ bytes_transferred_ += bytes_written;
+ }
+ }
+ if (bytes_written != bytes_to_write) {
+ if (message_handler_) {
+ message_handler_->ReportMessage(Message::kStdLibError, name_);
+ }
+ has_error_ = true;
+ return kTransferError;
+ }
+ }
+ return kTransferOk;
+}
+
+void OStreamRefDataDestination::FinishTransfer() {
+ ostream_ref_.flush();
+}
+
+} // namespace image_io
+} // namespace photos_editing_formats