Home | History | Annotate | Download | only in host
      1 // Copyright (c) 2012 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 "ppapi/host/resource_message_handler.h"
      6 
      7 #include "base/logging.h"
      8 #include "ipc/ipc_message.h"
      9 #include "ppapi/c/pp_errors.h"
     10 #include "ppapi/host/host_message_context.h"
     11 
     12 namespace ppapi {
     13 namespace host {
     14 
     15 ResourceMessageHandler::ResourceMessageHandler() {
     16 }
     17 
     18 ResourceMessageHandler::~ResourceMessageHandler() {
     19 }
     20 
     21 void ResourceMessageHandler::RunMessageHandlerAndReply(
     22     const IPC::Message& msg,
     23     HostMessageContext* context) {
     24   ReplyMessageContext reply_context = context->MakeReplyMessageContext();
     25   // CAUTION: Handling the message may cause the destruction of this object.
     26   // The message handler should ensure that if there is a chance that the
     27   // object will be destroyed, PP_OK_COMPLETIONPENDING is returned as the
     28   // result of the message handler. Otherwise the code below will attempt to
     29   // send a reply message on a destroyed object.
     30   reply_context.params.set_result(OnResourceMessageReceived(msg, context));
     31 
     32   // Sanity check the resource handler. Note if the result was
     33   // "completion pending" the resource host may have already sent the reply.
     34   if (reply_context.params.result() == PP_OK_COMPLETIONPENDING) {
     35     // Message handler should have only returned a pending result if a
     36     // response will be sent to the plugin.
     37     DCHECK(context->params.has_callback());
     38 
     39     // Message handler should not have written a message to be returned if
     40     // completion is pending.
     41     DCHECK(context->reply_msg.type() == 0);
     42   } else if (!context->params.has_callback()) {
     43     // When no response is required, the message handler should not have
     44     // written a message to be returned.
     45     DCHECK(context->reply_msg.type() == 0);
     46 
     47     // If there is no callback and the result of running the message handler
     48     // was not PP_OK the client won't find out.
     49     DLOG_IF(WARNING, reply_context.params.result() != PP_OK)
     50         << "'Post' message handler failed to complete successfully.";
     51   }
     52 
     53   if (context->params.has_callback() &&
     54       reply_context.params.result() != PP_OK_COMPLETIONPENDING)
     55     SendReply(reply_context, context->reply_msg);
     56 }
     57 
     58 int32_t ResourceMessageHandler::OnResourceMessageReceived(
     59     const IPC::Message& msg,
     60     HostMessageContext* context) {
     61   return PP_ERROR_NOTSUPPORTED;
     62 }
     63 
     64 }  // namespace host
     65 }  // namespace ppapi
     66