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

#ifndef PPAPI_HOST_RESOURCE_MESSAGE_HANDLER_H_
#define PPAPI_HOST_RESOURCE_MESSAGE_HANDLER_H_

#include "base/macros.h"
#include "ppapi/c/pp_stdint.h"
#include "ppapi/host/ppapi_host_export.h"

namespace IPC {
class Message;
}

namespace ppapi {
namespace host {

struct HostMessageContext;
struct ReplyMessageContext;

// This is the base class of classes that can handle resource messages. It
// mainly exists at present to share code for checking replies to resource
// messages are valid.
class PPAPI_HOST_EXPORT ResourceMessageHandler {
 public:
  ResourceMessageHandler();
  virtual ~ResourceMessageHandler();

  // Called when this handler should handle a particular message. This should
  // call into the the message handler implemented by subclasses (i.e.
  // |OnResourceMessageReceived|) and perform any additional work necessary to
  // handle the message (e.g. checking resource replies are valid). True is
  // returned if the message is handled and false otherwise.
  virtual bool HandleMessage(const IPC::Message& msg,
                             HostMessageContext* context) = 0;

  // Send a resource reply message.
  virtual void SendReply(const ReplyMessageContext& context,
                         const IPC::Message& msg) = 0;

 protected:
  // Runs the message handler and checks that a reply was sent if necessary.
  void RunMessageHandlerAndReply(const IPC::Message& msg,
                                 HostMessageContext* context);

  // Handles messages associated with a given resource object. If the flags
  // indicate that a response is required, the return value of this function
  // will be sent as a resource message "response" along with the message
  // specified in the reply of the context.
  //
  // You can do a response asynchronously by returning PP_OK_COMPLETIONPENDING.
  // This will cause the reply to be skipped, and the class implementing this
  // function will take responsibility for issuing the callback. The callback
  // can be issued inside OnResourceMessageReceived before it returns, or at
  // a future time.
  //
  // If you don't have a particular reply message, you can just ignore
  // the reply in the message context. However, if you have a reply more than
  // just the int32_t result code, set the reply to be the message of your
  // choosing.
  //
  // The default implementation just returns PP_ERROR_NOTSUPPORTED.
  virtual int32_t OnResourceMessageReceived(const IPC::Message& msg,
                                            HostMessageContext* context);

 private:
  DISALLOW_COPY_AND_ASSIGN(ResourceMessageHandler);
};

}  // namespace host
}  // namespace ppapi

#endif  // PPAPI_HOST_RESOURCE_MESSAGE_HANDLER_H_
