#include "http2/adapter/event_forwarder.h"

namespace http2 {
namespace adapter {

EventForwarder::EventForwarder(ForwardPredicate can_forward,
                               spdy::SpdyFramerVisitorInterface& receiver)
    : can_forward_(std::move(can_forward)), receiver_(receiver) {}

void EventForwarder::OnError(Http2DecoderAdapter::SpdyFramerError error,
                             std::string detailed_error) {
  if (can_forward_()) {
    receiver_.OnError(error, std::move(detailed_error));
  }
}

void EventForwarder::OnCommonHeader(spdy::SpdyStreamId stream_id, size_t length,
                                    uint8_t type, uint8_t flags) {
  if (can_forward_()) {
    receiver_.OnCommonHeader(stream_id, length, type, flags);
  }
}

void EventForwarder::OnDataFrameHeader(spdy::SpdyStreamId stream_id,
                                       size_t length, bool fin) {
  if (can_forward_()) {
    receiver_.OnDataFrameHeader(stream_id, length, fin);
  }
}

void EventForwarder::OnStreamFrameData(spdy::SpdyStreamId stream_id,
                                       const char* data, size_t len) {
  if (can_forward_()) {
    receiver_.OnStreamFrameData(stream_id, data, len);
  }
}

void EventForwarder::OnStreamEnd(spdy::SpdyStreamId stream_id) {
  if (can_forward_()) {
    receiver_.OnStreamEnd(stream_id);
  }
}

void EventForwarder::OnStreamPadLength(spdy::SpdyStreamId stream_id,
                                       size_t value) {
  if (can_forward_()) {
    receiver_.OnStreamPadLength(stream_id, value);
  }
}

void EventForwarder::OnStreamPadding(spdy::SpdyStreamId stream_id, size_t len) {
  if (can_forward_()) {
    receiver_.OnStreamPadding(stream_id, len);
  }
}

spdy::SpdyHeadersHandlerInterface* EventForwarder::OnHeaderFrameStart(
    spdy::SpdyStreamId stream_id) {
  return receiver_.OnHeaderFrameStart(stream_id);
}

void EventForwarder::OnHeaderFrameEnd(spdy::SpdyStreamId stream_id) {
  if (can_forward_()) {
    receiver_.OnHeaderFrameEnd(stream_id);
  }
}

void EventForwarder::OnRstStream(spdy::SpdyStreamId stream_id,
                                 spdy::SpdyErrorCode error_code) {
  if (can_forward_()) {
    receiver_.OnRstStream(stream_id, error_code);
  }
}

void EventForwarder::OnSettings() {
  if (can_forward_()) {
    receiver_.OnSettings();
  }
}

void EventForwarder::OnSetting(spdy::SpdySettingsId id, uint32_t value) {
  if (can_forward_()) {
    receiver_.OnSetting(id, value);
  }
}

void EventForwarder::OnSettingsEnd() {
  if (can_forward_()) {
    receiver_.OnSettingsEnd();
  }
}

void EventForwarder::OnSettingsAck() {
  if (can_forward_()) {
    receiver_.OnSettingsAck();
  }
}

void EventForwarder::OnPing(spdy::SpdyPingId unique_id, bool is_ack) {
  if (can_forward_()) {
    receiver_.OnPing(unique_id, is_ack);
  }
}

void EventForwarder::OnGoAway(spdy::SpdyStreamId last_accepted_stream_id,
                              spdy::SpdyErrorCode error_code) {
  if (can_forward_()) {
    receiver_.OnGoAway(last_accepted_stream_id, error_code);
  }
}

bool EventForwarder::OnGoAwayFrameData(const char* goaway_data, size_t len) {
  if (can_forward_()) {
    return receiver_.OnGoAwayFrameData(goaway_data, len);
  }
  return false;
}

void EventForwarder::OnHeaders(spdy::SpdyStreamId stream_id, bool has_priority,
                               int weight, spdy::SpdyStreamId parent_stream_id,
                               bool exclusive, bool fin, bool end) {
  if (can_forward_()) {
    receiver_.OnHeaders(stream_id, has_priority, weight, parent_stream_id,
                        exclusive, fin, end);
  }
}

void EventForwarder::OnWindowUpdate(spdy::SpdyStreamId stream_id,
                                    int delta_window_size) {
  if (can_forward_()) {
    receiver_.OnWindowUpdate(stream_id, delta_window_size);
  }
}

void EventForwarder::OnPushPromise(spdy::SpdyStreamId stream_id,
                                   spdy::SpdyStreamId promised_stream_id,
                                   bool end) {
  if (can_forward_()) {
    receiver_.OnPushPromise(stream_id, promised_stream_id, end);
  }
}

void EventForwarder::OnContinuation(spdy::SpdyStreamId stream_id, bool end) {
  if (can_forward_()) {
    receiver_.OnContinuation(stream_id, end);
  }
}

void EventForwarder::OnAltSvc(
    spdy::SpdyStreamId stream_id, absl::string_view origin,
    const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& altsvc_vector) {
  if (can_forward_()) {
    receiver_.OnAltSvc(stream_id, origin, altsvc_vector);
  }
}

void EventForwarder::OnPriority(spdy::SpdyStreamId stream_id,
                                spdy::SpdyStreamId parent_stream_id, int weight,
                                bool exclusive) {
  if (can_forward_()) {
    receiver_.OnPriority(stream_id, parent_stream_id, weight, exclusive);
  }
}

void EventForwarder::OnPriorityUpdate(spdy::SpdyStreamId prioritized_stream_id,
                                      absl::string_view priority_field_value) {
  if (can_forward_()) {
    receiver_.OnPriorityUpdate(prioritized_stream_id, priority_field_value);
  }
}

bool EventForwarder::OnUnknownFrame(spdy::SpdyStreamId stream_id,
                                    uint8_t frame_type) {
  if (can_forward_()) {
    return receiver_.OnUnknownFrame(stream_id, frame_type);
  }
  return false;
}

}  // namespace adapter
}  // namespace http2
