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