// services/device/public/mojom/nfc_provider.mojom-shared.cc is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "services/device/public/mojom/nfc_provider.mojom-shared.h"

// Used to support stream output operator for enums.
// TODO(dcheng): Consider omitting this somehow if not needed.
#include <ostream>
#include <utility>

#include "base/strings/stringprintf.h"
#include "mojo/public/cpp/bindings/lib/validate_params.h"
#include "mojo/public/cpp/bindings/lib/validation_errors.h"
#include "mojo/public/cpp/bindings/lib/validation_util.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value.h"

#include "services/device/public/mojom/nfc_provider.mojom-params-data.h"
namespace device {
namespace mojom {

namespace internal {


// static
bool NFCProvider_GetNFCForHost_Params_Data::Validate(
    const void* data,
    mojo::internal::ValidationContext* validation_context) {
  if (!data)
    return true;
  if (!ValidateUnversionedStructHeaderAndSizeAndClaimMemory(
          data, 16, validation_context)) {
    return false;
  }

  // NOTE: The memory backing |object| may be smaller than |sizeof(*object)| if
  // the message comes from an older version.
  [[maybe_unused]] const NFCProvider_GetNFCForHost_Params_Data* object =
      static_cast<const NFCProvider_GetNFCForHost_Params_Data*>(data);

  if (!mojo::internal::ValidateHandleOrInterfaceNonNullable(
          object->receiver, 2, validation_context)) {
    return false;
  }
  if (!mojo::internal::ValidateHandleOrInterface(object->receiver,
                                                 validation_context)) {
    return false;
  }

  return true;
}

NFCProvider_GetNFCForHost_Params_Data::NFCProvider_GetNFCForHost_Params_Data()
    : header_({sizeof(*this), 0}) {}


// static
bool NFCProvider_SuspendNFCOperations_Params_Data::Validate(
    const void* data,
    mojo::internal::ValidationContext* validation_context) {
  if (!data)
    return true;
  if (!ValidateUnversionedStructHeaderAndSizeAndClaimMemory(
          data, 8, validation_context)) {
    return false;
  }

  // NOTE: The memory backing |object| may be smaller than |sizeof(*object)| if
  // the message comes from an older version.
  [[maybe_unused]] const NFCProvider_SuspendNFCOperations_Params_Data* object =
      static_cast<const NFCProvider_SuspendNFCOperations_Params_Data*>(data);

  return true;
}

NFCProvider_SuspendNFCOperations_Params_Data::NFCProvider_SuspendNFCOperations_Params_Data()
    : header_({sizeof(*this), 0}) {}


// static
bool NFCProvider_ResumeNFCOperations_Params_Data::Validate(
    const void* data,
    mojo::internal::ValidationContext* validation_context) {
  if (!data)
    return true;
  if (!ValidateUnversionedStructHeaderAndSizeAndClaimMemory(
          data, 8, validation_context)) {
    return false;
  }

  // NOTE: The memory backing |object| may be smaller than |sizeof(*object)| if
  // the message comes from an older version.
  [[maybe_unused]] const NFCProvider_ResumeNFCOperations_Params_Data* object =
      static_cast<const NFCProvider_ResumeNFCOperations_Params_Data*>(data);

  return true;
}

NFCProvider_ResumeNFCOperations_Params_Data::NFCProvider_ResumeNFCOperations_Params_Data()
    : header_({sizeof(*this), 0}) {}

}  // namespace internal
}  // namespace mojom
}  // namespace device