// Copyright 2014 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 "shell/native_application_support.h"

#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "mojo/public/platform/native/gles2_impl_chromium_bind_uniform_location_thunks.h"
#include "mojo/public/platform/native/gles2_impl_chromium_map_sub_thunks.h"
#include "mojo/public/platform/native/gles2_impl_chromium_miscellaneous_thunks.h"
#include "mojo/public/platform/native/gles2_impl_chromium_resize_thunks.h"
#include "mojo/public/platform/native/gles2_impl_chromium_sync_point_thunks.h"
#include "mojo/public/platform/native/gles2_impl_chromium_texture_mailbox_thunks.h"
#include "mojo/public/platform/native/gles2_impl_ext_debug_marker_thunks.h"
#include "mojo/public/platform/native/gles2_impl_ext_discard_framebuffer_thunks.h"
#include "mojo/public/platform/native/gles2_impl_ext_multisampled_render_to_texture_thunks.h"
#include "mojo/public/platform/native/gles2_impl_ext_occlusion_query_thunks.h"
#include "mojo/public/platform/native/gles2_impl_ext_texture_storage_thunks.h"
#include "mojo/public/platform/native/gles2_impl_khr_blend_equation_advanced_thunks.h"
#include "mojo/public/platform/native/gles2_impl_oes_vertex_array_object_thunks.h"
#include "mojo/public/platform/native/gles2_impl_thunks.h"
#include "mojo/public/platform/native/mgl_onscreen_thunks.h"
#include "mojo/public/platform/native/mgl_signal_sync_point_thunks.h"
#include "mojo/public/platform/native/mgl_thunks.h"
#include "mojo/public/platform/native/platform_handle_private_thunks.h"
#include "mojo/public/platform/native/system_impl_private_thunks.h"
#include "mojo/public/platform/native/system_thunks.h"

namespace shell {

namespace {

template <typename Thunks>
bool SetThunks(Thunks (*make_thunks)(),
               const char* function_name,
               base::NativeLibrary library) {
  typedef size_t (*SetThunksFn)(const Thunks* thunks);
  SetThunksFn set_thunks = reinterpret_cast<SetThunksFn>(
      base::GetFunctionPointerFromNativeLibrary(library, function_name));
  if (!set_thunks)
    return false;
  Thunks thunks = make_thunks();
  size_t expected_size = set_thunks(&thunks);
  if (expected_size > sizeof(Thunks)) {
    LOG(ERROR) << "Invalid app library: expected " << function_name
               << " to return thunks of size: " << expected_size;
    return false;
  }
  return true;
}

}  // namespace

base::NativeLibrary LoadNativeApplication(const base::FilePath& app_path) {
  DVLOG(2) << "Loading Mojo app in process from library: " << app_path.value();

  base::NativeLibraryLoadError error;
  base::NativeLibrary app_library = base::LoadNativeLibrary(app_path, &error);
  LOG_IF(ERROR, !app_library)
      << "Failed to load app library (error: " << error.ToString() << ")";
  return app_library;
}

bool RunNativeApplication(
    base::NativeLibrary app_library,
    mojo::InterfaceRequest<mojo::Application> application_request) {
  // Tolerate |app_library| being null, to make life easier for callers.
  if (!app_library)
    return false;

  if (!SetThunks(&MojoMakeSystemThunks, "MojoSetSystemThunks", app_library)) {
    LOG(ERROR) << "MojoSetSystemThunks not found";
    return false;
  }

  // TODO(freiling): enforce the private nature of this API, somehow?
  SetThunks(&MojoMakePlatformHandlePrivateThunks,
            "MojoSetPlatformHandlePrivateThunks", app_library);

  // TODO(ncbray): enforce the private nature of this API, somehow?
  SetThunks(&MojoMakeSystemImplControlThunksPrivate,
            "MojoSetSystemImplControlThunksPrivate", app_library);
  SetThunks(&MojoMakeSystemImplThunksPrivate, "MojoSetSystemImplThunksPrivate",
            app_library);

  SetThunks(&MojoMakeGLES2ImplThunks, "MojoSetGLES2ImplThunks",
            app_library);
  SetThunks(MojoMakeGLES2ImplEXTDebugMarkerThunks,
            "MojoSetGLES2ImplEXTDebugMarkerThunks", app_library);
  SetThunks(MojoMakeGLES2ImplEXTDiscardFramebufferThunks,
            "MojoSetGLES2ImplEXTDiscardFramebufferThunks", app_library);
  SetThunks(MojoMakeGLES2ImplEXTOcclusionQueryThunks,
            "MojoSetGLES2ImplEXTOcclusionQueryThunks", app_library);
  SetThunks(MojoMakeGLES2ImplEXTTextureStorageThunks,
            "MojoSetGLES2ImplEXTTextureStorageThunks", app_library);
  SetThunks(MojoMakeGLES2ImplEXTMultisampledRenderToTextureThunks,
            "MojoSetGLES2ImplEXTMultisampledRenderToTextureThunks",
            app_library);
  SetThunks(MojoMakeGLES2ImplKHRBlendEquationAdvancedThunks,
            "MojoSetGLES2ImplKHRBlendEquationAdvancedThunks", app_library);
  SetThunks(MojoMakeGLES2ImplOESVertexArrayObjectThunks,
            "MojoSetGLES2ImplOESVertexArrayObjectThunks", app_library);
  // Deprecated name for "MojoSetGLES2ImplEXTOcclusionQueryThunks" (TODO(vtl):
  // when no app is using this name any longer, delete it):
  SetThunks(MojoMakeGLES2ImplEXTOcclusionQueryThunks,
            "MojoSetGLES2ImplOcclusionQueryEXTThunks", app_library);
  // "Chromium" extensions:
  SetThunks(MojoMakeGLES2ImplCHROMIUMBindUniformLocationThunks,
            "MojoSetGLES2ImplCHROMIUMBindUniformLocationThunks", app_library);
  SetThunks(MojoMakeGLES2ImplCHROMIUMMapSubThunks,
            "MojoSetGLES2ImplCHROMIUMMapSubThunks", app_library);
  SetThunks(MojoMakeGLES2ImplCHROMIUMMiscellaneousThunks,
            "MojoSetGLES2ImplCHROMIUMMiscellaneousThunks", app_library);
  SetThunks(MojoMakeGLES2ImplCHROMIUMResizeThunks,
            "MojoSetGLES2ImplCHROMIUMResizeThunks", app_library);
  SetThunks(MojoMakeGLES2ImplCHROMIUMSyncPointThunks,
            "MojoSetGLES2ImplCHROMIUMSyncPointThunks", app_library);
  SetThunks(MojoMakeGLES2ImplCHROMIUMTextureMailboxThunks,
            "MojoSetGLES2ImplCHROMIUMTextureMailboxThunks", app_library);

  if (SetThunks(MojoMakeMGLThunks, "MojoSetMGLThunks", app_library)) {
    // TODO(jamesr): We should only need to expose the onscreen thunks to apps
    // that need to draw to the screen like the system compositor.
    SetThunks(MojoMakeMGLOnscreenThunks, "MojoSetMGLOnscreenThunks",
              app_library);

    SetThunks(MojoMakeMGLSignalSyncPointThunks,
              "MojoSetMGLSignalSyncPointThunks", app_library);
  }

  typedef MojoResult (*MojoMainFunction)(MojoHandle);
  MojoMainFunction main_function = reinterpret_cast<MojoMainFunction>(
      base::GetFunctionPointerFromNativeLibrary(app_library, "MojoMain"));
  if (!main_function) {
    LOG(ERROR) << "MojoMain not found";
    return false;
  }
  // |MojoMain()| takes ownership of the Application request handle.
  MojoHandle handle = application_request.PassMessagePipe().release().value();
  MojoResult result = main_function(handle);
  LOG_IF(ERROR, result != MOJO_RESULT_OK)
      << "MojoMain returned error (result: " << result << ")";
  return true;
}

}  // namespace shell
