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