Upstream version 7.36.151.0
[platform/framework/web/crosswalk.git] / src / ppapi / host / resource_message_handler.cc
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