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

// From private/ppb_flash_font_file.idl modified Thu Oct 22 22:02:40 2015.

#include <stdint.h>

#include "ppapi/c/pp_errors.h"
#include "ppapi/c/private/ppb_flash_font_file.h"
#include "ppapi/shared_impl/tracked_callback.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppapi_thunk_export.h"
#include "ppapi/thunk/ppb_flash_font_file_api.h"

namespace ppapi {
namespace thunk {

namespace {

PP_Resource Create(PP_Instance instance,
                   const struct PP_BrowserFont_Trusted_Description* description,
                   PP_PrivateFontCharset charset) {
  VLOG(4) << "PPB_Flash_FontFile::Create()";
  EnterResourceCreation enter(instance);
  if (enter.failed())
    return 0;
  return enter.functions()->CreateFlashFontFile(instance, description, charset);
}

PP_Bool IsFlashFontFile(PP_Resource resource) {
  VLOG(4) << "PPB_Flash_FontFile::IsFlashFontFile()";
  EnterResource<PPB_Flash_FontFile_API> enter(resource, false);
  return PP_FromBool(enter.succeeded());
}

PP_Bool GetFontTable(PP_Resource font_file,
                     uint32_t table,
                     void* output,
                     uint32_t* output_length) {
  VLOG(4) << "PPB_Flash_FontFile::GetFontTable()";
  EnterResource<PPB_Flash_FontFile_API> enter(font_file, true);
  if (enter.failed())
    return PP_FALSE;
  return enter.object()->GetFontTable(table, output, output_length);
}

PP_Bool IsSupportedForWindows(void) {
  VLOG(4) << "PPB_Flash_FontFile::IsSupportedForWindows()";
  return PP_TRUE;
}

const PPB_Flash_FontFile_0_1 g_ppb_flash_fontfile_thunk_0_1 = {
    &Create, &IsFlashFontFile, &GetFontTable};

const PPB_Flash_FontFile_0_2 g_ppb_flash_fontfile_thunk_0_2 = {
    &Create, &IsFlashFontFile, &GetFontTable, &IsSupportedForWindows};

}  // namespace

PPAPI_THUNK_EXPORT const PPB_Flash_FontFile_0_1*
GetPPB_Flash_FontFile_0_1_Thunk() {
  return &g_ppb_flash_fontfile_thunk_0_1;
}

PPAPI_THUNK_EXPORT const PPB_Flash_FontFile_0_2*
GetPPB_Flash_FontFile_0_2_Thunk() {
  return &g_ppb_flash_fontfile_thunk_0_2;
}

}  // namespace thunk
}  // namespace ppapi
