// Copyright (c) 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "quic/core/qpack/qpack_decoder_stream_receiver.h"

#include "absl/strings/string_view.h"
#include "http2/decoder/decode_buffer.h"
#include "http2/decoder/decode_status.h"
#include "quic/core/qpack/qpack_instructions.h"

namespace quic {

QpackDecoderStreamReceiver::QpackDecoderStreamReceiver(Delegate* delegate)
    : instruction_decoder_(QpackDecoderStreamLanguage(), this),
      delegate_(delegate),
      error_detected_(false) {
  QUICHE_DCHECK(delegate_);
}

void QpackDecoderStreamReceiver::Decode(absl::string_view data) {
  if (data.empty() || error_detected_) {
    return;
  }

  instruction_decoder_.Decode(data);
}

bool QpackDecoderStreamReceiver::OnInstructionDecoded(
    const QpackInstruction* instruction) {
  if (instruction == InsertCountIncrementInstruction()) {
    delegate_->OnInsertCountIncrement(instruction_decoder_.varint());
    return true;
  }

  if (instruction == HeaderAcknowledgementInstruction()) {
    delegate_->OnHeaderAcknowledgement(instruction_decoder_.varint());
    return true;
  }

  QUICHE_DCHECK_EQ(instruction, StreamCancellationInstruction());
  delegate_->OnStreamCancellation(instruction_decoder_.varint());
  return true;
}

void QpackDecoderStreamReceiver::OnInstructionDecodingError(
    QpackInstructionDecoder::ErrorCode error_code,
    absl::string_view error_message) {
  QUICHE_DCHECK(!error_detected_);

  error_detected_ = true;

  // There is no string literals on the decoder stream,
  // the only possible error is INTEGER_TOO_LARGE.
  QuicErrorCode quic_error_code =
      (error_code == QpackInstructionDecoder::ErrorCode::INTEGER_TOO_LARGE)
          ? QUIC_QPACK_DECODER_STREAM_INTEGER_TOO_LARGE
          : QUIC_INTERNAL_ERROR;
  delegate_->OnErrorDetected(quic_error_code, error_message);
}

}  // namespace quic
