1// Copyright 2015 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "mojo/public/cpp/bindings/lib/control_message_handler.h" 6 7#include <stddef.h> 8#include <stdint.h> 9#include <utility> 10 11#include "base/logging.h" 12#include "mojo/public/cpp/bindings/lib/message_builder.h" 13#include "mojo/public/cpp/bindings/lib/serialization.h" 14#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" 15 16namespace mojo { 17namespace internal { 18 19// static 20bool ControlMessageHandler::IsControlMessage(const Message* message) { 21 return message->header()->name == kRunMessageId || 22 message->header()->name == kRunOrClosePipeMessageId; 23} 24 25ControlMessageHandler::ControlMessageHandler(uint32_t interface_version) 26 : interface_version_(interface_version) { 27} 28 29ControlMessageHandler::~ControlMessageHandler() { 30} 31 32bool ControlMessageHandler::Accept(Message* message) { 33 if (message->header()->name == kRunOrClosePipeMessageId) 34 return RunOrClosePipe(message); 35 36 NOTREACHED(); 37 return false; 38} 39 40bool ControlMessageHandler::AcceptWithResponder( 41 Message* message, 42 MessageReceiverWithStatus* responder) { 43 if (message->header()->name == kRunMessageId) 44 return Run(message, responder); 45 46 NOTREACHED(); 47 return false; 48} 49 50bool ControlMessageHandler::Run(Message* message, 51 MessageReceiverWithStatus* responder) { 52 RunResponseMessageParamsPtr response_params_ptr( 53 RunResponseMessageParams::New()); 54 response_params_ptr->reserved0 = 16u; 55 response_params_ptr->reserved1 = 0u; 56 response_params_ptr->query_version_result = QueryVersionResult::New(); 57 response_params_ptr->query_version_result->version = interface_version_; 58 59 size_t size = PrepareToSerialize<RunResponseMessageParamsPtr>( 60 response_params_ptr, &context_); 61 ResponseMessageBuilder builder(kRunMessageId, size, message->request_id()); 62 63 RunResponseMessageParams_Data* response_params = nullptr; 64 Serialize<RunResponseMessageParamsPtr>(response_params_ptr, builder.buffer(), 65 &response_params, &context_); 66 bool ok = responder->Accept(builder.message()); 67 ALLOW_UNUSED_LOCAL(ok); 68 delete responder; 69 70 return true; 71} 72 73bool ControlMessageHandler::RunOrClosePipe(Message* message) { 74 RunOrClosePipeMessageParams_Data* params = 75 reinterpret_cast<RunOrClosePipeMessageParams_Data*>( 76 message->mutable_payload()); 77 RunOrClosePipeMessageParamsPtr params_ptr; 78 Deserialize<RunOrClosePipeMessageParamsPtr>(params, ¶ms_ptr, &context_); 79 80 return interface_version_ >= params_ptr->require_version->version; 81} 82 83} // namespace internal 84} // namespace mojo 85