// Copyright (c) 2011 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 "content/renderer/pepper/ppb_proxy_impl.h"

#include "ppapi/c/private/ppb_proxy_private.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppb_image_data_api.h"
#include "content/renderer/pepper/host_globals.h"
#include "content/renderer/pepper/plugin_module.h"

using ppapi::PpapiGlobals;
using ppapi::thunk::EnterResource;
using ppapi::thunk::PPB_URLLoader_API;

namespace content {

namespace {

void PluginCrashed(PP_Module module) {
  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
  if (plugin_module)
    plugin_module->PluginCrashed();
}

PP_Instance GetInstanceForResource(PP_Resource resource) {
  ppapi::Resource* obj =
      PpapiGlobals::Get()->GetResourceTracker()->GetResource(resource);
  if (!obj)
    return 0;
  return obj->pp_instance();
}

void SetReserveInstanceIDCallback(PP_Module module,
                                  PP_Bool (*reserve)(PP_Module, PP_Instance)) {
  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
  if (plugin_module)
    plugin_module->SetReserveInstanceIDCallback(reserve);
}

void AddRefModule(PP_Module module) {
  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
  if (plugin_module)
    plugin_module->AddRef();
}

void ReleaseModule(PP_Module module) {
  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
  if (plugin_module)
    plugin_module->Release();
}

PP_Bool IsInModuleDestructor(PP_Module module) {
  PluginModule* plugin_module = HostGlobals::Get()->GetModule(module);
  if (plugin_module)
    return PP_FromBool(plugin_module->is_in_destructor());
  return PP_FALSE;
}

const PPB_Proxy_Private ppb_proxy = {
    &PluginCrashed, &GetInstanceForResource, &SetReserveInstanceIDCallback,
    &AddRefModule,  &ReleaseModule,          &IsInModuleDestructor};

}  // namespace

// static
const PPB_Proxy_Private* PPB_Proxy_Impl::GetInterface() { return &ppb_proxy; }

}  // namespace content
