1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2015 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/pipe_control_message_handler.h" 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/logging.h" 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/message_builder.h" 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/serialization.h" 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/validation_context.h" 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/validation_util.h" 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/pipe_control_message_handler_delegate.h" 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h" 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo { 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezPipeControlMessageHandler::PipeControlMessageHandler( 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PipeControlMessageHandlerDelegate* delegate) 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez : delegate_(delegate) {} 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezPipeControlMessageHandler::~PipeControlMessageHandler() {} 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid PipeControlMessageHandler::SetDescription(const std::string& description) { 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez description_ = description; 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// static 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool PipeControlMessageHandler::IsPipeControlMessage(const Message* message) { 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return !IsValidInterfaceId(message->interface_id()); 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool PipeControlMessageHandler::Accept(Message* message) { 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!Validate(message)) 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (message->name() == pipe_control::kRunOrClosePipeMessageId) 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return RunOrClosePipe(message); 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NOTREACHED(); 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool PipeControlMessageHandler::Validate(Message* message) { 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez internal::ValidationContext validation_context( 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message->data(), message->data_num_bytes(), 0, message, description_); 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (message->name() == pipe_control::kRunOrClosePipeMessageId) { 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!internal::ValidateMessageIsRequestWithoutResponse( 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message, &validation_context)) { 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return internal::ValidateMessagePayload< 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez pipe_control::internal::RunOrClosePipeMessageParams_Data>( 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message, &validation_context); 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool PipeControlMessageHandler::RunOrClosePipe(Message* message) { 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez pipe_control::internal::RunOrClosePipeMessageParams_Data* params = 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez reinterpret_cast< 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez pipe_control::internal::RunOrClosePipeMessageParams_Data*>( 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message->mutable_payload()); 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez pipe_control::RunOrClosePipeMessageParamsPtr params_ptr; 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez internal::Deserialize<pipe_control::RunOrClosePipeMessageParamsPtr>( 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez params, ¶ms_ptr, &context_); 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (params_ptr->input->is_peer_associated_endpoint_closed_event()) { 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return delegate_->OnPeerAssociatedEndpointClosed( 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez params_ptr->input->get_peer_associated_endpoint_closed_event()->id); 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (params_ptr->input->is_associated_endpoint_closed_before_sent_event()) { 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return delegate_->OnAssociatedEndpointClosedBeforeSent( 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez params_ptr->input->get_associated_endpoint_closed_before_sent_event() 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ->id); 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DVLOG(1) << "Unsupported command in a RunOrClosePipe message pipe control " 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez << "message. Closing the pipe."; 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace mojo 85