| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ppapi/host/resource_message_handler.h" |
| |
| #include "base/logging.h" |
| #include "ipc/ipc_message.h" |
| #include "ppapi/c/pp_errors.h" |
| #include "ppapi/host/host_message_context.h" |
| |
| namespace ppapi { |
| namespace host { |
| |
| ResourceMessageHandler::ResourceMessageHandler() { |
| } |
| |
| ResourceMessageHandler::~ResourceMessageHandler() { |
| } |
| |
| void ResourceMessageHandler::RunMessageHandlerAndReply( |
| const IPC::Message& msg, |
| HostMessageContext* context) { |
| ReplyMessageContext reply_context = context->MakeReplyMessageContext(); |
| // CAUTION: Handling the message may cause the destruction of this object. |
| // The message handler should ensure that if there is a chance that the |
| // object will be destroyed, PP_OK_COMPLETIONPENDING is returned as the |
| // result of the message handler. Otherwise the code below will attempt to |
| // send a reply message on a destroyed object. |
| reply_context.params.set_result(OnResourceMessageReceived(msg, context)); |
| |
| // Sanity check the resource handler. Note if the result was |
| // "completion pending" the resource host may have already sent the reply. |
| if (reply_context.params.result() == PP_OK_COMPLETIONPENDING) { |
| // Message handler should have only returned a pending result if a |
| // response will be sent to the plugin. |
| DCHECK(context->params.has_callback()); |
| |
| // Message handler should not have written a message to be returned if |
| // completion is pending. |
| DCHECK(context->reply_msg.type() == 0); |
| } else if (!context->params.has_callback()) { |
| // When no response is required, the message handler should not have |
| // written a message to be returned. |
| DCHECK(context->reply_msg.type() == 0); |
| |
| // If there is no callback and the result of running the message handler |
| // was not PP_OK the client won't find out. |
| DLOG_IF(WARNING, reply_context.params.result() != PP_OK) |
| << "'Post' message handler failed to complete successfully."; |
| } |
| |
| if (context->params.has_callback() && |
| reply_context.params.result() != PP_OK_COMPLETIONPENDING) |
| SendReply(reply_context, context->reply_msg); |
| } |
| |
| int32_t ResourceMessageHandler::OnResourceMessageReceived( |
| const IPC::Message& msg, |
| HostMessageContext* context) { |
| return PP_ERROR_NOTSUPPORTED; |
| } |
| |
| } // namespace host |
| } // namespace ppapi |