#ifndef IMAGE_IO_EXTRAS_BASE64_DECODER_DATA_DESTINATION_H_  // NOLINT
#define IMAGE_IO_EXTRAS_BASE64_DECODER_DATA_DESTINATION_H_  // NOLINT
#define IMAGE_IO_noumenon_base64_h

#include <vector>

#include "image_io/base/data_destination.h"

namespace photos_editing_formats {
namespace image_io {

/// Base64DecoderDataDestination is typically used in a chain of DataDestination
/// instances. For example, it can be used to decode base64 encoded JPEG data in
/// APP1/XMP data segments.
class Base64DecoderDataDestination : public DataDestination {
 public:
  /// @param next_destination The next DataDestination in the chain which will
  /// be sent the decoded bytes received by the Transfer() function.
  explicit Base64DecoderDataDestination(DataDestination* next_destination)
      : next_destination_(next_destination),
        next_decoded_location_(0),
        has_error_(false) {}

  /// @return True if there was an error in the decoding process.
  bool HasError() const { return has_error_; }

  void StartTransfer() override;
  TransferStatus Transfer(const DataRange& transfer_range,
                          const DataSegment& data_segment) override;
  void FinishTransfer() override;

  /// @return The number of bytes written not to this decoder destination, but
  /// to the next destination. Returns zero if the next destination is null.
  size_t GetBytesTransferred() const override {
    return next_destination_ ? next_destination_->GetBytesTransferred() : 0;
  }

 private:
  /// The destination that the decoded data is sent to.
  DataDestination* next_destination_;

  /// If the transfer_range parameter of the Transfer function does not have a
  /// length that is a multiple of 4, then the leftover bytes are placed in this
  /// vector and are prepended to the data in the next call to Transfer.
  std::vector<Byte> leftover_bytes_;

  /// The DataRanges supplied to the Transfer function can't be sent down the
  /// chain to the next destination because the number of bytes differ (by 4/3).
  /// This value records the number of bytes decoded so far, and the beginning
  /// of the DataRange sent to the destination's Transfer function.
  size_t next_decoded_location_;

  /// A true value indicates that an error occurred in the decoding process.
  bool has_error_;
};

}  // namespace image_io
}  // namespace photos_editing_formats

#endif // IMAGE_IO_EXTRAS_BASE64_DECODER_DATA_DESTINATION_H_  // NOLINT
