#include "dng_jpeg_memory_source.h"

#if qDNGUseLibJPEG

#include "dng_safe_arithmetic.h"

namespace {

void InitSource(j_decompress_ptr cinfo) {
  // No initialization necessary.
}

boolean FillInputBuffer(j_decompress_ptr cinfo) {
  // We already filled the buffer with all of the data when the source was
  // initialized, so we can't get any more data.
  ERREXIT(cinfo, JERR_INPUT_EOF);
  return FALSE;
}

void SkipInputData(j_decompress_ptr cinfo, long num_bytes) {
  if (num_bytes > 0) {
    // Convert num_bytes to a size_t.
    // We've established that num_bytes is positive, to it's safe to cast it
    // to an unsigned long.
    size_t num_bytes_as_size_t = 0;
    try {
      ConvertUnsigned(static_cast<unsigned long>(num_bytes),
                      &num_bytes_as_size_t);
    } catch (const dng_exception &e) {
      ERREXIT(cinfo, JERR_INPUT_EOF);
      return;
    }

    jpeg_source_mgr *source_manager =
        reinterpret_cast<jpeg_source_mgr *>(cinfo->src);

    // Advance the current position by the given number of bytes.
    if (num_bytes_as_size_t <= source_manager->bytes_in_buffer) {
      source_manager->bytes_in_buffer -= num_bytes_as_size_t;
      source_manager->next_input_byte += num_bytes_as_size_t;
    } else {
      // Tried to read beyond the end of the buffer.
      ERREXIT(cinfo, JERR_INPUT_EOF);
      return;
    }
  }
}

boolean ResyncToRestart(j_decompress_ptr cinfo, int desired) {
  // Can't resync.
  return FALSE;
}

void TermSource(j_decompress_ptr cinfo) {
  // No termination necessary.
}

}  // namespace

jpeg_source_mgr CreateJpegMemorySource(const uint8 *buffer, size_t size) {
  jpeg_source_mgr source;

  source.next_input_byte = reinterpret_cast<const JOCTET *>(buffer);
  source.bytes_in_buffer = size;

  // Initialize function pointers.
  source.init_source = InitSource;
  source.fill_input_buffer = FillInputBuffer;
  source.skip_input_data = SkipInputData;
  source.resync_to_restart = ResyncToRestart;
  source.term_source = TermSource;

  return source;
}

#endif  // qDNGUseLibJPEG
