| // 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 |