// services/network/public/mojom/accept_ch_frame_observer.mojom.h is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2013 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 SERVICES_NETWORK_PUBLIC_MOJOM_ACCEPT_CH_FRAME_OBSERVER_MOJOM_H_
#define SERVICES_NETWORK_PUBLIC_MOJOM_ACCEPT_CH_FRAME_OBSERVER_MOJOM_H_

#include <stdint.h>

#include <limits>
#include <type_traits>
#include <utility>

#include "third_party/abseil-cpp/absl/types/optional.h"
#include "mojo/public/cpp/bindings/clone_traits.h"
#include "mojo/public/cpp/bindings/equals_traits.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "mojo/public/cpp/bindings/union_traits.h"

#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"

#include "services/network/public/mojom/accept_ch_frame_observer.mojom-shared.h"
#include "services/network/public/mojom/accept_ch_frame_observer.mojom-forward.h"
#include "services/network/public/mojom/http_request_headers.mojom-forward.h"
#include "services/network/public/mojom/web_client_hints_types.mojom-forward.h"
#include "url/mojom/origin.mojom.h"
#include <string>
#include <vector>

#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"



#ifdef KYTHE_IS_RUNNING
#pragma kythe_inline_metadata "Metadata comment"
#endif


namespace network {
namespace mojom {

class AcceptCHFrameObserverProxy;

template <typename ImplRefTraits>
class AcceptCHFrameObserverStub;

class AcceptCHFrameObserverRequestValidator;
class AcceptCHFrameObserverResponseValidator;


// @generated_from: network.mojom.AcceptCHFrameObserver
class  AcceptCHFrameObserver
    : public AcceptCHFrameObserverInterfaceBase {
 public:
  static const char Name_[];
  static uint32_t MessageToStableIPCHash_(mojo::Message& message);
  static const char* MessageToMethodName_(mojo::Message& message);
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;
  static constexpr bool HasUninterruptableMethods_ = false;

  using Base_ = AcceptCHFrameObserverInterfaceBase;
  using Proxy_ = AcceptCHFrameObserverProxy;

  template <typename ImplRefTraits>
  using Stub_ = AcceptCHFrameObserverStub<ImplRefTraits>;

  using RequestValidator_ = AcceptCHFrameObserverRequestValidator;
  using ResponseValidator_ = AcceptCHFrameObserverResponseValidator;
  enum MethodMinVersions : uint32_t {
    kOnAcceptCHFrameReceivedMinVersion = 0,
    kCloneMinVersion = 0,
  };
  virtual ~AcceptCHFrameObserver() = default;


  using OnAcceptCHFrameReceivedCallback = base::OnceCallback<void(int32_t)>;
  
// @generated_from: network.mojom.AcceptCHFrameObserver.OnAcceptCHFrameReceived
  virtual void OnAcceptCHFrameReceived(const ::url::Origin& origin, const std::vector<::network::mojom::WebClientHintsType>& accept_ch_frame, OnAcceptCHFrameReceivedCallback callback) = 0;

  
// @generated_from: network.mojom.AcceptCHFrameObserver.Clone
  virtual void Clone(::mojo::PendingReceiver<AcceptCHFrameObserver> listener) = 0;
};



// @generated_from: network.mojom.AcceptCHFrameObserver
class  AcceptCHFrameObserverProxy
    : public AcceptCHFrameObserver {
 public:
  using InterfaceType = AcceptCHFrameObserver;

  explicit AcceptCHFrameObserverProxy(mojo::MessageReceiverWithResponder* receiver);
  
// @generated_from: network.mojom.AcceptCHFrameObserver.OnAcceptCHFrameReceived
  void OnAcceptCHFrameReceived(const ::url::Origin& origin, const std::vector<::network::mojom::WebClientHintsType>& accept_ch_frame, OnAcceptCHFrameReceivedCallback callback) final;
  
// @generated_from: network.mojom.AcceptCHFrameObserver.Clone
  void Clone(::mojo::PendingReceiver<AcceptCHFrameObserver> listener) final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};
class  AcceptCHFrameObserverStubDispatch {
 public:
  static bool Accept(AcceptCHFrameObserver* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      AcceptCHFrameObserver* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<AcceptCHFrameObserver>>
class AcceptCHFrameObserverStub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  AcceptCHFrameObserverStub() = default;
  ~AcceptCHFrameObserverStub() override = default;

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return AcceptCHFrameObserverStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return AcceptCHFrameObserverStubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};
class  AcceptCHFrameObserverRequestValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};
class  AcceptCHFrameObserverResponseValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};





}  // namespace mojom
}  // namespace network

namespace mojo {

}  // namespace mojo

#endif  // SERVICES_NETWORK_PUBLIC_MOJOM_ACCEPT_CH_FRAME_OBSERVER_MOJOM_H_

/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMTg5NywgImJlZ2luIjogMTg3NiwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsubW9qb20uQWNjZXB0Q0hGcmFtZU9ic2Vy
dmVyIn19LCB7ImVuZCI6IDMwMTYsICJiZWdpbiI6IDI5OTMsICJlZGdlIjogIiUva3l0aGUvZWRn
ZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVz
IjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjog
Im1vam9tIiwgInNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLkFjY2VwdENIRnJhbWVPYnNlcnZl
ci5PbkFjY2VwdENIRnJhbWVSZWNlaXZlZCJ9fSwgeyJlbmQiOiAzMjUzLCAiYmVnaW4iOiAzMjQ4
LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmlu
ZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9t
aXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAibmV0d29yay5tb2pv
bS5BY2NlcHRDSEZyYW1lT2JzZXJ2ZXIuQ2xvbmUifX0sIHsiZW5kIjogMzcwNCwgImJlZ2luIjog
MzY4MSwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9k
ZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9j
aHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjogIm5ldHdvcmsu
bW9qb20uQWNjZXB0Q0hGcmFtZU9ic2VydmVyLk9uQWNjZXB0Q0hGcmFtZVJlY2VpdmVkIn19LCB7
ImVuZCI6IDM5MzQsICJiZWdpbiI6IDM5MjksICJlZGdlIjogIiUva3l0aGUvZWRnZS9nZW5lcmF0
ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29ycHVzIjogImNocm9t
aXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdlIjogIm1vam9tIiwg
InNpZ25hdHVyZSI6ICJuZXR3b3JrLm1vam9tLkFjY2VwdENIRnJhbWVPYnNlcnZlci5DbG9uZSJ9
fV0sICJ0eXBlIjogImt5dGhlMCJ9
*/