// 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 ppb_console.idl modified Wed Jan 27 17:10:16 2016.

#include <stdint.h>

#include "ppapi/c/pp_errors.h"
#include "ppapi/c/ppb_console.h"
#include "ppapi/shared_impl/tracked_callback.h"
#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppapi_thunk_export.h"

namespace ppapi {
namespace thunk {

namespace {

void Log(PP_Instance instance, PP_LogLevel level, struct PP_Var value) {
  VLOG(4) << "PPB_Console::Log()";
  EnterInstance enter(instance);
  if (enter.failed())
    return;
  enter.functions()->Log(instance, level, value);
}

void LogWithSource(PP_Instance instance,
                   PP_LogLevel level,
                   struct PP_Var source,
                   struct PP_Var value) {
  VLOG(4) << "PPB_Console::LogWithSource()";
  EnterInstance enter(instance);
  if (enter.failed())
    return;
  enter.functions()->LogWithSource(instance, level, source, value);
}

const PPB_Console_1_0 g_ppb_console_thunk_1_0 = {&Log, &LogWithSource};

}  // namespace

PPAPI_THUNK_EXPORT const PPB_Console_1_0* GetPPB_Console_1_0_Thunk() {
  return &g_ppb_console_thunk_1_0;
}

}  // namespace thunk
}  // namespace ppapi
