// Copyright 2015 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. #include "mojo/public/cpp/bindings/lib/control_message_proxy.h" #include "mojo/public/cpp/bindings/lib/message_builder.h" #include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/system/macros.h" #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" namespace mojo { namespace internal { namespace { using RunCallback = Callback; class RunResponseForwardToCallback : public MessageReceiver { public: RunResponseForwardToCallback(const RunCallback& callback) : callback_(callback) {} bool Accept(Message* message) override; private: RunCallback callback_; MOJO_DISALLOW_COPY_AND_ASSIGN(RunResponseForwardToCallback); }; bool RunResponseForwardToCallback::Accept(Message* message) { RunResponseMessageParams_Data* params = reinterpret_cast( message->mutable_payload()); params->DecodePointersAndHandles(message->mutable_handles()); RunResponseMessageParamsPtr params_ptr; Deserialize_(params, ¶ms_ptr); callback_.Run(params_ptr->query_version_result.Pass()); return true; } void SendRunMessage(MessageReceiverWithResponder* receiver, QueryVersionPtr query_version, const RunCallback& callback) { RunMessageParamsPtr params_ptr(RunMessageParams::New()); params_ptr->reserved0 = 16u; params_ptr->reserved1 = 0u; params_ptr->query_version = query_version.Pass(); size_t size = GetSerializedSize_(params_ptr); RequestMessageBuilder builder(kRunMessageId, size); RunMessageParams_Data* params = nullptr; Serialize_(params_ptr.Pass(), builder.buffer(), ¶ms); Message message; params->EncodePointersAndHandles(message.mutable_handles()); builder.Finish(&message); MessageReceiver* responder = new RunResponseForwardToCallback(callback); if (!receiver->AcceptWithResponder(&message, responder)) delete responder; } void SendRunOrClosePipeMessage(MessageReceiverWithResponder* receiver, RequireVersionPtr require_version) { RunOrClosePipeMessageParamsPtr params_ptr(RunOrClosePipeMessageParams::New()); params_ptr->reserved0 = 16u; params_ptr->reserved1 = 0u; params_ptr->require_version = require_version.Pass(); size_t size = GetSerializedSize_(params_ptr); MessageBuilder builder(kRunOrClosePipeMessageId, size); RunOrClosePipeMessageParams_Data* params = nullptr; Serialize_(params_ptr.Pass(), builder.buffer(), ¶ms); Message message; params->EncodePointersAndHandles(message.mutable_handles()); builder.Finish(&message); bool ok = receiver->Accept(&message); MOJO_ALLOW_UNUSED_LOCAL(ok); } } // namespace ControlMessageProxy::ControlMessageProxy(MessageReceiverWithResponder* receiver) : receiver_(receiver) { } void ControlMessageProxy::QueryVersion( const Callback& callback) { auto run_callback = [callback](QueryVersionResultPtr query_version_result) { callback.Run(query_version_result->version); }; SendRunMessage(receiver_, QueryVersion::New(), run_callback); } void ControlMessageProxy::RequireVersion(uint32_t version) { RequireVersionPtr require_version(RequireVersion::New()); require_version->version = version; SendRunOrClosePipeMessage(receiver_, require_version.Pass()); } } // namespace internal } // namespace mojo