blob: baa41a4dac5afd40b4dc055fd5e41f30a3c0c560 [file] [log] [blame]
{%- import "interface_macros.tmpl" as interface_macros -%}
{%- import "struct_macros.tmpl" as struct_macros -%}
// NOTE: This file was generated by the Mojo bindings generator.
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-private-field"
#endif
#include "{{module.path}}-sync.h"
#include <math.h>
#include <ostream>
#include <string>
#include <utility>
#include "mojo/public/cpp/bindings/lib/array_serialization.h"
#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
#include "mojo/public/cpp/bindings/lib/bounds_checker.h"
#include "mojo/public/cpp/bindings/lib/map_data_internal.h"
#include "mojo/public/cpp/bindings/lib/map_serialization.h"
#include "mojo/public/cpp/bindings/lib/message_builder.h"
#include "mojo/public/cpp/bindings/lib/message_validation.h"
#include "mojo/public/cpp/bindings/lib/string_serialization.h"
#include "mojo/public/cpp/bindings/lib/synchronous_connector.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 "mojo/public/cpp/bindings/message.h"
#include "mojo/public/cpp/bindings/message_validator.h"
#include "mojo/public/cpp/environment/logging.h"
#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
#include "{{module.path}}-internal.h"
#include "{{module.path}}-common.h"
{%- for namespace in namespaces_as_array %}
namespace {{namespace}} {
{%- endfor %}
// --- Interface definitions ---
{% for interface in interfaces %}
{%- set base_name = "internal::%s_Base"|format(interface.name) -%}
{{interface.name}}_SynchronousProxy::{{interface.name}}_SynchronousProxy(
mojo::internal::SynchronousConnector* connector,
mojo::internal::MessageValidatorList&& validators)
: connector_(connector), validators_(std::move(validators)) {
}
{% for method in interface.methods %}
{%- set message_name =
"%s::MessageOrdinals::%s"|format(base_name, method.name) %}
{%- set params_struct = method.param_struct %}
{%- set params_description =
"%s.%s request"|format(interface.name, method.name) %}
bool {{interface.name}}_SynchronousProxy::{{method.name}}(
{{- interface_macros.declare_sync_request_params(method)}})
{%- if method.response_parameters == None %} const {% endif %} {
{{struct_macros.get_serialized_size(params_struct, "in_%s")}}
auto msg_name = static_cast<uint32_t>({{message_name}});
{%- if method.response_parameters != None %}
mojo::RequestMessageBuilder builder(msg_name, size);
{%- else %}
mojo::MessageBuilder builder(msg_name, size);
{%- endif %}
{{struct_macros.serialize(params_struct,
"{{interface.name}}::{{method.name}}", "in_%s",
"out_params", "builder.buffer()", false)}}
out_params->EncodePointersAndHandles(builder.message()->mutable_handles());
if (!connector_->Write(builder.message()))
return false;
{%- if method.response_parameters != None %}
mojo::Message response_msg;
if (!connector_->BlockingRead(&response_msg))
return false;
// Validate the incoming message.
std::string response_err;
if (mojo::internal::RunValidatorsOnMessage(validators_, &response_msg,
&response_err)
!= mojo::internal::ValidationError::NONE) {
MOJO_LOG(WARNING) << response_err;
return false;
}
{#- TODO(vardhan): Add support for synchronous control messages. #}
if (mojo::internal::ControlMessageHandler::IsControlMessage(&response_msg)) {
MOJO_LOG(ERROR) << "Synchronous interface bindings currently don't support "
"interface control messages.";
return false;
}
if (response_msg.name() != msg_name) {
MOJO_LOG(ERROR) << "Expecting response for message = " << msg_name <<
", but received message = " << response_msg.name();
return false;
}
internal::{{interface.name}}_{{method.name}}_ResponseParams_Data*
response_params = reinterpret_cast<internal::{{interface.name}}_{{method.name}}_ResponseParams_Data*>(
response_msg.mutable_payload());
response_params->DecodePointersAndHandles(response_msg.mutable_handles());
{{struct_macros.deserialize(method.response_param_struct, "response_params",
"(*out_%s)")}}
{%- endif %}
return true;
}
{%- endfor %}
{%- endfor %}
{%- for namespace in namespaces_as_array|reverse %}
} // namespace {{namespace}}
{%- endfor %}
#if defined(__clang__)
#pragma clang diagnostic pop
#endif