// 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 CONTENT_RENDERER_PEPPER_PPB_BROKER_IMPL_H_
#define CONTENT_RENDERER_PEPPER_PPB_BROKER_IMPL_H_

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/weak_ptr.h"
#include "base/process/process.h"
#include "ipc/ipc_listener.h"
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/trusted/ppb_broker_trusted.h"
#include "ppapi/shared_impl/resource.h"
#include "ppapi/shared_impl/tracked_callback.h"
#include "ppapi/thunk/ppb_broker_api.h"

class GURL;

namespace IPC {
struct ChannelHandle;
}

namespace content {
class PepperBroker;

class PPB_Broker_Impl : public ppapi::Resource,
                        public ppapi::thunk::PPB_Broker_API,
                        public IPC::Listener,
                        public base::SupportsWeakPtr<PPB_Broker_Impl> {
 public:
  explicit PPB_Broker_Impl(PP_Instance instance);

  // Resource override.
  virtual ppapi::thunk::PPB_Broker_API* AsPPB_Broker_API() OVERRIDE;

  // PPB_BrokerTrusted implementation.
  virtual int32_t Connect(
      scoped_refptr<ppapi::TrackedCallback> connect_callback) OVERRIDE;
  virtual int32_t GetHandle(int32_t* handle) OVERRIDE;

  // Returns the URL of the document this plug-in runs in. This is necessary to
  // decide whether to grant access to the PPAPI broker.
  GURL GetDocumentUrl();

  void BrokerConnected(int32_t handle, int32_t result);

 private:
  virtual ~PPB_Broker_Impl();

  // IPC::Listener implementation.
  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;

  void OnPpapiBrokerChannelCreated(base::ProcessId broker_pid,
                                   const IPC::ChannelHandle& handle);
  void OnPpapiBrokerPermissionResult(bool result);

  // PluginDelegate ppapi broker object.
  // We don't own this pointer but are responsible for calling Disconnect on it.
  PepperBroker* broker_;

  // Callback invoked from BrokerConnected.
  scoped_refptr<ppapi::TrackedCallback> connect_callback_;

  // Pipe handle for the plugin instance to use to communicate with the broker.
  // Never owned by this object.
  int32_t pipe_handle_;

  int routing_id_;

  DISALLOW_COPY_AND_ASSIGN(PPB_Broker_Impl);
};

}  // namespace content

#endif  // CONTENT_RENDERER_PEPPER_PPB_BROKER_IMPL_H_
