[email protected] | 6dac731 | 2012-11-20 04:31:37 | [diff] [blame] | 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(); |
[email protected] | 24f40c1 | 2012-12-19 20:17:42 | [diff] [blame] | 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. |
[email protected] | 6dac731 | 2012-11-20 04:31:37 | [diff] [blame] | 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 |