12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_message_handler.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_message.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/host_message_context.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace host { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceMessageHandler::ResourceMessageHandler() { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceMessageHandler::~ResourceMessageHandler() { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceMessageHandler::RunMessageHandlerAndReply( 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& msg, 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostMessageContext* context) { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ReplyMessageContext reply_context = context->MakeReplyMessageContext(); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CAUTION: Handling the message may cause the destruction of this object. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The message handler should ensure that if there is a chance that the 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // object will be destroyed, PP_OK_COMPLETIONPENDING is returned as the 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // result of the message handler. Otherwise the code below will attempt to 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // send a reply message on a destroyed object. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reply_context.params.set_result(OnResourceMessageReceived(msg, context)); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sanity check the resource handler. Note if the result was 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // "completion pending" the resource host may have already sent the reply. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (reply_context.params.result() == PP_OK_COMPLETIONPENDING) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Message handler should have only returned a pending result if a 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // response will be sent to the plugin. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(context->params.has_callback()); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Message handler should not have written a message to be returned if 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // completion is pending. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(context->reply_msg.type() == 0); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (!context->params.has_callback()) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When no response is required, the message handler should not have 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // written a message to be returned. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(context->reply_msg.type() == 0); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is no callback and the result of running the message handler 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // was not PP_OK the client won't find out. 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DLOG_IF(WARNING, reply_context.params.result() != PP_OK) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "'Post' message handler failed to complete successfully."; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (context->params.has_callback() && 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reply_context.params.result() != PP_OK_COMPLETIONPENDING) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendReply(reply_context, context->reply_msg); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t ResourceMessageHandler::OnResourceMessageReceived( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& msg, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostMessageContext* context) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_NOTSUPPORTED; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace host 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 66