// services/device/public/mojom/public_ip_address_geolocation_provider.mojom-blink.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_DEVICE_PUBLIC_MOJOM_PUBLIC_IP_ADDRESS_GEOLOCATION_PROVIDER_MOJOM_BLINK_H_
#define SERVICES_DEVICE_PUBLIC_MOJOM_PUBLIC_IP_ADDRESS_GEOLOCATION_PROVIDER_MOJOM_BLINK_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/device/public/mojom/public_ip_address_geolocation_provider.mojom-shared.h"
#include "services/device/public/mojom/public_ip_address_geolocation_provider.mojom-blink-forward.h"
#include "services/network/public/mojom/mutable_partial_network_traffic_annotation_tag.mojom-blink-forward.h"
#include "services/device/public/mojom/geolocation.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/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"


#include "third_party/blink/public/platform/web_common.h"

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


namespace device {
namespace mojom {
namespace blink {

class PublicIpAddressGeolocationProviderProxy;

template <typename ImplRefTraits>
class PublicIpAddressGeolocationProviderStub;

class PublicIpAddressGeolocationProviderRequestValidator;


// @generated_from: device.mojom.PublicIpAddressGeolocationProvider
class BLINK_PLATFORM_EXPORT PublicIpAddressGeolocationProvider
    : public PublicIpAddressGeolocationProviderInterfaceBase {
 public:
  static const char Name_[];
  static std::pair<uint32_t, const void*> MessageToMethodInfo_(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_ = PublicIpAddressGeolocationProviderInterfaceBase;
  using Proxy_ = PublicIpAddressGeolocationProviderProxy;

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

  using RequestValidator_ = PublicIpAddressGeolocationProviderRequestValidator;
  using ResponseValidator_ = mojo::PassThroughFilter;
  enum MethodMinVersions : uint32_t {
    kCreateGeolocationMinVersion = 0,
  };

// crbug.com/1340245 - this causes binary size bloat on Fuchsia, and we're OK
// with not having this data in traces there.
#if !BUILDFLAG(IS_FUCHSIA)
  struct CreateGeolocation_Sym {
    NOINLINE static void IPCSymbol();
  };
#endif // !BUILDFLAG(IS_FUCHSIA)
  virtual ~PublicIpAddressGeolocationProvider() = default;

  
// @generated_from: device.mojom.PublicIpAddressGeolocationProvider.CreateGeolocation
  virtual void CreateGeolocation(::network::mojom::blink::MutablePartialNetworkTrafficAnnotationTagPtr tag, ::mojo::PendingReceiver<::device::mojom::blink::Geolocation> receiver) = 0;
};



// @generated_from: device.mojom.PublicIpAddressGeolocationProvider
class BLINK_PLATFORM_EXPORT PublicIpAddressGeolocationProviderProxy
    : public PublicIpAddressGeolocationProvider {
 public:
  using InterfaceType = PublicIpAddressGeolocationProvider;

  explicit PublicIpAddressGeolocationProviderProxy(mojo::MessageReceiverWithResponder* receiver);
  
// @generated_from: device.mojom.PublicIpAddressGeolocationProvider.CreateGeolocation
  void CreateGeolocation(::network::mojom::blink::MutablePartialNetworkTrafficAnnotationTagPtr tag, ::mojo::PendingReceiver<::device::mojom::blink::Geolocation> receiver) final;

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

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

  PublicIpAddressGeolocationProviderStub() = default;
  ~PublicIpAddressGeolocationProviderStub() 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 PublicIpAddressGeolocationProviderStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

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

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





}  // namespace blink
}  // namespace mojom
}  // namespace device

namespace mojo {

}  // namespace mojo

#endif  // SERVICES_DEVICE_PUBLIC_MOJOM_PUBLIC_IP_ADDRESS_GEOLOCATION_PROVIDER_MOJOM_BLINK_H_

/* Metadata comment
eyJtZXRhIjogW3siZW5kIjogMjMxMiwgImJlZ2luIjogMjI3OCwgImVkZ2UiOiAiJS9reXRoZS9l
ZGdlL2dlbmVyYXRlcyIsICJ0eXBlIjogImFuY2hvcl9kZWZpbmVzIiwgInZuYW1lIjogeyJjb3Jw
dXMiOiAiY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiLCAibGFuZ3VhZ2Ui
OiAibW9qb20iLCAic2lnbmF0dXJlIjogImRldmljZS5tb2pvbS5QdWJsaWNJcEFkZHJlc3NHZW9s
b2NhdGlvblByb3ZpZGVyIn19LCB7ImVuZCI6IDM2NjYsICJiZWdpbiI6IDM2NDksICJlZGdlIjog
IiUva3l0aGUvZWRnZS9nZW5lcmF0ZXMiLCAidHlwZSI6ICJhbmNob3JfZGVmaW5lcyIsICJ2bmFt
ZSI6IHsiY29ycHVzIjogImNocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwg
Imxhbmd1YWdlIjogIm1vam9tIiwgInNpZ25hdHVyZSI6ICJkZXZpY2UubW9qb20uUHVibGljSXBB
ZGRyZXNzR2VvbG9jYXRpb25Qcm92aWRlci5DcmVhdGVHZW9sb2NhdGlvbiJ9fSwgeyJlbmQiOiA0
MjkxLCAiYmVnaW4iOiA0Mjc0LCAiZWRnZSI6ICIlL2t5dGhlL2VkZ2UvZ2VuZXJhdGVzIiwgInR5
cGUiOiAiYW5jaG9yX2RlZmluZXMiLCAidm5hbWUiOiB7ImNvcnB1cyI6ICJjaHJvbWl1bS5nb29n
bGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsICJsYW5ndWFnZSI6ICJtb2pvbSIsICJzaWduYXR1
cmUiOiAiZGV2aWNlLm1vam9tLlB1YmxpY0lwQWRkcmVzc0dlb2xvY2F0aW9uUHJvdmlkZXIuQ3Jl
YXRlR2VvbG9jYXRpb24ifX1dLCAidHlwZSI6ICJreXRoZTAifQ==
*/