#ifndef QUICHE_HTTP2_ADAPTER_NGHTTP2_CALLBACKS_H_
#define QUICHE_HTTP2_ADAPTER_NGHTTP2_CALLBACKS_H_

#include <cstdint>

#include "http2/adapter/http2_protocol.h"
#include "http2/adapter/nghttp2.h"
#include "http2/adapter/nghttp2_util.h"

namespace http2 {
namespace adapter {
namespace callbacks {

// The following functions are nghttp2 callbacks that Nghttp2Adapter sets at the
// beginning of its lifetime. It is expected that |user_data| holds an
// Http2VisitorInterface.

// Callback once the library is ready to send serialized frames.
ssize_t OnReadyToSend(nghttp2_session* session,
                      const uint8_t* data,
                      size_t length,
                      int flags,
                      void* user_data);

// Callback once a frame header has been received.
int OnBeginFrame(nghttp2_session* session, const nghttp2_frame_hd* header,
                 void* user_data);

// Callback once a complete frame has been received.
int OnFrameReceived(nghttp2_session* session, const nghttp2_frame* frame,
                    void* user_data);

// Callback at the start of a frame carrying headers.
int OnBeginHeaders(nghttp2_session* session,
                   const nghttp2_frame* frame,
                   void* user_data);

// Callback once a name-value header has been received.
int OnHeader(nghttp2_session* session, const nghttp2_frame* frame,
             nghttp2_rcbuf* name, nghttp2_rcbuf* value, uint8_t flags,
             void* user_data);

// Invoked immediately before sending a frame.
int OnBeforeFrameSent(nghttp2_session* session, const nghttp2_frame* frame,
                      void* user_data);

// Invoked immediately after a frame is sent.
int OnFrameSent(nghttp2_session* session, const nghttp2_frame* frame,
                void* user_data);

// Invoked when a non-DATA frame is not sent because of an error.
int OnFrameNotSent(nghttp2_session* session, const nghttp2_frame* frame,
                   int lib_error_code, void* user_data);

// Invoked when an invalid frame is received.
int OnInvalidFrameReceived(nghttp2_session* session, const nghttp2_frame* frame,
                           int lib_error_code, void* user_data);

// Invoked when a chunk of data (from a DATA frame payload) has been received.
int OnDataChunk(nghttp2_session* session, uint8_t flags,
                Http2StreamId stream_id, const uint8_t* data, size_t len,
                void* user_data);

// Callback once a stream has been closed.
int OnStreamClosed(nghttp2_session* session, Http2StreamId stream_id,
                   uint32_t error_code, void* user_data);

// Invoked when nghttp2 has a chunk of extension frame data to pass to the
// application.
int OnExtensionChunkReceived(nghttp2_session* session,
                             const nghttp2_frame_hd* hd, const uint8_t* data,
                             size_t len, void* user_data);

// Invoked when nghttp2 wants the application to unpack an extension payload.
int OnUnpackExtensionCallback(nghttp2_session* session, void** payload,
                              const nghttp2_frame_hd* hd, void* user_data);

// Invoked when nghttp2 is ready to pack an extension payload. Returns the
// number of bytes serialized to |buf|.
ssize_t OnPackExtensionCallback(nghttp2_session* session, uint8_t* buf,
                                size_t len, const nghttp2_frame* frame,
                                void* user_data);

// Invoked when the library has an error message to deliver.
int OnError(nghttp2_session* session, int lib_error_code, const char* msg,
            size_t len, void* user_data);

nghttp2_session_callbacks_unique_ptr Create();

}  // namespace callbacks
}  // namespace adapter
}  // namespace http2

#endif  // QUICHE_HTTP2_ADAPTER_NGHTTP2_CALLBACKS_H_
