// Copyright 2016 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.

#ifndef QUICHE_HTTP2_HPACK_DECODER_HPACK_ENTRY_DECODER_LISTENER_H_
#define QUICHE_HTTP2_HPACK_DECODER_HPACK_ENTRY_DECODER_LISTENER_H_

// Defines HpackEntryDecoderListener, the base class of listeners that
// HpackEntryDecoder calls. Also defines HpackEntryDecoderVLoggingListener
// which logs before calling another HpackEntryDecoderListener implementation.

#include <stddef.h>

#include "http2/hpack/http2_hpack_constants.h"
#include "common/platform/api/quiche_export.h"

namespace http2 {

class QUICHE_EXPORT_PRIVATE HpackEntryDecoderListener {
 public:
  virtual ~HpackEntryDecoderListener() {}

  // Called when an indexed header (i.e. one in the static or dynamic table) has
  // been decoded from an HPACK block. index is supposed to be non-zero, but
  // that has not been checked by the caller.
  virtual void OnIndexedHeader(size_t index) = 0;

  // Called when the start of a header with a literal value, and maybe a literal
  // name, has been decoded. maybe_name_index is zero if the header has a
  // literal name, else it is a reference into the static or dynamic table, from
  // which the name should be determined. When the name is literal, the next
  // call will be to OnNameStart; else it will be to OnValueStart. entry_type
  // indicates whether the peer has added the entry to its dynamic table, and
  // whether a proxy is permitted to do so when forwarding the entry.
  virtual void OnStartLiteralHeader(HpackEntryType entry_type,
                                    size_t maybe_name_index) = 0;

  // Called when the encoding (Huffman compressed or plain text) and the encoded
  // length of a literal name has been decoded. OnNameData will be called next,
  // and repeatedly until the sum of lengths passed to OnNameData is len.
  virtual void OnNameStart(bool huffman_encoded, size_t len) = 0;

  // Called when len bytes of an encoded header name have been decoded.
  virtual void OnNameData(const char* data, size_t len) = 0;

  // Called after the entire name has been passed to OnNameData.
  // OnValueStart will be called next.
  virtual void OnNameEnd() = 0;

  // Called when the encoding (Huffman compressed or plain text) and the encoded
  // length of a literal value has been decoded. OnValueData will be called
  // next, and repeatedly until the sum of lengths passed to OnValueData is len.
  virtual void OnValueStart(bool huffman_encoded, size_t len) = 0;

  // Called when len bytes of an encoded header value have been decoded.
  virtual void OnValueData(const char* data, size_t len) = 0;

  // Called after the entire value has been passed to OnValueData, marking the
  // end of a header entry with a literal value, and maybe a literal name.
  virtual void OnValueEnd() = 0;

  // Called when an update to the size of the peer's dynamic table has been
  // decoded.
  virtual void OnDynamicTableSizeUpdate(size_t size) = 0;
};

class QUICHE_EXPORT_PRIVATE HpackEntryDecoderVLoggingListener
    : public HpackEntryDecoderListener {
 public:
  HpackEntryDecoderVLoggingListener() : wrapped_(nullptr) {}
  explicit HpackEntryDecoderVLoggingListener(HpackEntryDecoderListener* wrapped)
      : wrapped_(wrapped) {}
  ~HpackEntryDecoderVLoggingListener() override {}

  void OnIndexedHeader(size_t index) override;
  void OnStartLiteralHeader(HpackEntryType entry_type,
                            size_t maybe_name_index) override;
  void OnNameStart(bool huffman_encoded, size_t len) override;
  void OnNameData(const char* data, size_t len) override;
  void OnNameEnd() override;
  void OnValueStart(bool huffman_encoded, size_t len) override;
  void OnValueData(const char* data, size_t len) override;
  void OnValueEnd() override;
  void OnDynamicTableSizeUpdate(size_t size) override;

 private:
  HpackEntryDecoderListener* const wrapped_;
};

// A no-op implementation of HpackEntryDecoderListener.
class QUICHE_EXPORT_PRIVATE HpackEntryDecoderNoOpListener
    : public HpackEntryDecoderListener {
 public:
  ~HpackEntryDecoderNoOpListener() override {}

  void OnIndexedHeader(size_t /*index*/) override {}
  void OnStartLiteralHeader(HpackEntryType /*entry_type*/,
                            size_t /*maybe_name_index*/) override {}
  void OnNameStart(bool /*huffman_encoded*/, size_t /*len*/) override {}
  void OnNameData(const char* /*data*/, size_t /*len*/) override {}
  void OnNameEnd() override {}
  void OnValueStart(bool /*huffman_encoded*/, size_t /*len*/) override {}
  void OnValueData(const char* /*data*/, size_t /*len*/) override {}
  void OnValueEnd() override {}
  void OnDynamicTableSizeUpdate(size_t /*size*/) override {}
};

}  // namespace http2

#endif  // QUICHE_HTTP2_HPACK_DECODER_HPACK_ENTRY_DECODER_LISTENER_H_
