// 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_VIZ_PRIVILEGED_INTERFACES_COMPOSITING_EXTERNAL_BEGIN_FRAME_CONTROLLER_MOJOM_BLINK_H_
#define SERVICES_VIZ_PRIVILEGED_INTERFACES_COMPOSITING_EXTERNAL_BEGIN_FRAME_CONTROLLER_MOJOM_BLINK_H_

#include <stdint.h>

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

#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"

#include "mojo/public/cpp/bindings/mojo_buildflags.h"
#if BUILDFLAG(MOJO_TRACE_ENABLED)
#include "base/trace_event/trace_event.h"
#endif
#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 "services/viz/privileged/interfaces/compositing/external_begin_frame_controller.mojom-shared.h"
#include "services/viz/privileged/interfaces/compositing/external_begin_frame_controller.mojom-blink-forward.h"
#include "services/viz/public/interfaces/compositing/begin_frame_args.mojom-blink-forward.h"

#include "mojo/public/cpp/bindings/lib/wtf_clone_equals_util.h"
#include "mojo/public/cpp/bindings/lib/wtf_hash_util.h"
#include "third_party/blink/renderer/platform/wtf/hash_functions.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"

#include "mojo/public/cpp/bindings/associated_interface_ptr.h"
#include "mojo/public/cpp/bindings/associated_interface_ptr_info.h"
#include "mojo/public/cpp/bindings/associated_interface_request.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"
#include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"


#include "mojo/public/cpp/bindings/lib/native_enum_serialization.h"
#include "mojo/public/cpp/bindings/lib/native_struct_serialization.h"

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


namespace viz {
namespace mojom {
namespace blink {

class ExternalBeginFrameControllerProxy;

template <typename ImplRefTraits>
class ExternalBeginFrameControllerStub;

class ExternalBeginFrameControllerRequestValidator;


// @generated_from: viz.mojom.ExternalBeginFrameController
class  ExternalBeginFrameController
    : public ExternalBeginFrameControllerInterfaceBase {
 public:
  static const char Name_[];
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;

  using Base_ = ExternalBeginFrameControllerInterfaceBase;
  using Proxy_ = ExternalBeginFrameControllerProxy;

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

  using RequestValidator_ = ExternalBeginFrameControllerRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kIssueExternalBeginFrameMinVersion = 0,
  };
  virtual ~ExternalBeginFrameController() {}

  
// @generated_from: viz.mojom.ExternalBeginFrameController.IssueExternalBeginFrame
  virtual void IssueExternalBeginFrame(const viz::BeginFrameArgs& args) = 0;
};

class ExternalBeginFrameControllerClientProxy;

template <typename ImplRefTraits>
class ExternalBeginFrameControllerClientStub;

class ExternalBeginFrameControllerClientRequestValidator;


// @generated_from: viz.mojom.ExternalBeginFrameControllerClient
class  ExternalBeginFrameControllerClient
    : public ExternalBeginFrameControllerClientInterfaceBase {
 public:
  static const char Name_[];
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasSyncMethods_ = false;

  using Base_ = ExternalBeginFrameControllerClientInterfaceBase;
  using Proxy_ = ExternalBeginFrameControllerClientProxy;

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

  using RequestValidator_ = ExternalBeginFrameControllerClientRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kOnNeedsBeginFramesMinVersion = 0,
    kOnDisplayDidFinishFrameMinVersion = 0,
  };
  virtual ~ExternalBeginFrameControllerClient() {}

  
// @generated_from: viz.mojom.ExternalBeginFrameControllerClient.OnNeedsBeginFrames
  virtual void OnNeedsBeginFrames(bool needs_begin_frames) = 0;

  
// @generated_from: viz.mojom.ExternalBeginFrameControllerClient.OnDisplayDidFinishFrame
  virtual void OnDisplayDidFinishFrame(const viz::BeginFrameAck& ack) = 0;
};

class  ExternalBeginFrameControllerProxy
    : public ExternalBeginFrameController {
 public:
  using InterfaceType = ExternalBeginFrameController;

  explicit ExternalBeginFrameControllerProxy(mojo::MessageReceiverWithResponder* receiver);
  void IssueExternalBeginFrame(const viz::BeginFrameArgs& args) final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};

class  ExternalBeginFrameControllerClientProxy
    : public ExternalBeginFrameControllerClient {
 public:
  using InterfaceType = ExternalBeginFrameControllerClient;

  explicit ExternalBeginFrameControllerClientProxy(mojo::MessageReceiverWithResponder* receiver);
  void OnNeedsBeginFrames(bool needs_begin_frames) final;
  void OnDisplayDidFinishFrame(const viz::BeginFrameAck& ack) final;

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

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

  ExternalBeginFrameControllerStub() {}
  ~ExternalBeginFrameControllerStub() override {}

  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 ExternalBeginFrameControllerStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

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

 private:
  ImplPointerType sink_;
};
class  ExternalBeginFrameControllerClientStubDispatch {
 public:
  static bool Accept(ExternalBeginFrameControllerClient* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      ExternalBeginFrameControllerClient* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

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

  ExternalBeginFrameControllerClientStub() {}
  ~ExternalBeginFrameControllerClientStub() override {}

  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 ExternalBeginFrameControllerClientStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

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

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





}  // namespace blink
}  // namespace mojom
}  // namespace viz

namespace mojo {

}  // namespace mojo

#endif  // SERVICES_VIZ_PRIVILEGED_INTERFACES_COMPOSITING_EXTERNAL_BEGIN_FRAME_CONTROLLER_MOJOM_BLINK_H_
/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMjU4OSwgImJlZ2luIjogMjU2MSwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogInZpei5tb2pvbS5FeHRlcm5hbEJlZ2luRnJhbWVDb250
cm9sbGVyIn19LCB7ImVuZCI6IDM0MzIsICJiZWdpbiI6IDM0MDksICJlZGdlIjogIiUva3l0aGUv
ZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFtZSI6IHsiY29y
cHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwgImxhbmd1YWdl
IjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJ2aXoubW9qb20uRXh0ZXJuYWxCZWdpbkZyYW1lQ29u
dHJvbGxlci5Jc3N1ZUV4dGVybmFsQmVnaW5GcmFtZSJ9fSwgeyJlbmQiOiAzNzcwLCAiYmVnaW4i
OiAzNzM2LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9y
X2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29t
L2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAidml6Lm1v
am9tLkV4dGVybmFsQmVnaW5GcmFtZUNvbnRyb2xsZXJDbGllbnQifX0sIHsiZW5kIjogNDY4NCwg
ImJlZ2luIjogNDY2NiwgImVkZ2UiOiAiJS9reXRoZS9lZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjog
ImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3JwdXMiOiAiY2hyb21pdW0uZ29vZ2xlc291
cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2UiOiAibW9qb20iLCAic2lnbmF0dXJlIjog
InZpei5tb2pvbS5FeHRlcm5hbEJlZ2luRnJhbWVDb250cm9sbGVyQ2xpZW50Lk9uTmVlZHNCZWdp
bkZyYW1lcyJ9fSwgeyJlbmQiOiA0ODQ2LCAiYmVnaW4iOiA0ODIzLCAiZWRnZSI6ICIlL2t5dGhl
L2VkZ2UvZ2VuZXJhdGVzIiwgInR5cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNv
cnB1cyI6ICJjaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFn
ZSI6ICJtb2pvbSIsICJzaWduYXR1cmUiOiAidml6Lm1vam9tLkV4dGVybmFsQmVnaW5GcmFtZUNv
bnRyb2xsZXJDbGllbnQuT25EaXNwbGF5RGlkRmluaXNoRnJhbWUifX1dLCAidHlwZSI6ICJreXRo
ZTAifQ==
*/