// 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_PROXY_PLUGIN_RESOURCE_CALLBACK_H_
#define PPAPI_PROXY_PLUGIN_RESOURCE_CALLBACK_H_

#include "base/memory/ref_counted.h"
#include "ipc/ipc_message.h"
#include "ppapi/proxy/dispatch_reply_message.h"
#include "ppapi/proxy/resource_message_params.h"

namespace ppapi {
namespace proxy {

// |PluginResourceCallback| wraps a |base::Callback| on the plugin side which
// will be triggered in response to a particular message type being received.
// |MsgClass| is the reply message type that the callback will be called with
// and |CallbackType| is the type of the |base::Callback| that will be called.
class PluginResourceCallbackBase
    : public base::RefCounted<PluginResourceCallbackBase> {
 public:
  virtual void Run(const ResourceMessageReplyParams& params,
                   const IPC::Message& msg) = 0;
 protected:
  friend class base::RefCounted<PluginResourceCallbackBase>;
  virtual ~PluginResourceCallbackBase() {}
};

template<typename MsgClass, typename CallbackType>
class PluginResourceCallback : public PluginResourceCallbackBase {
 public:
  explicit PluginResourceCallback(const CallbackType& callback)
      : callback_(callback) {}

  virtual void Run(
      const ResourceMessageReplyParams& reply_params,
      const IPC::Message& msg) OVERRIDE {
    DispatchResourceReplyOrDefaultParams<MsgClass>(
        &callback_, &CallbackType::Run, reply_params, msg);
  }

 private:
  virtual ~PluginResourceCallback() {}

  CallbackType callback_;
};

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_PLUGIN_RESOURCE_CALLBACK_H_
