# Copyright 2018 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.

import("//base/win/embedded_i18n/generate_embedded_i18n.gni")
import("//build/buildflag_header.gni")
import("//build/config/allocator.gni")
import("//build/config/clang/clang.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/dcheck_always_on.gni")
import("//build/nocompile.gni")
import("//build/toolchain/win/midl.gni")
import("//chrome/process_version_rc_template.gni")
import("//testing/libfuzzer/fuzzer_test.gni")
import("//testing/test.gni")
import("//tools/grit/grit_rule.gni")

# This static library is shared with the setup program.
source_set("common") {
  sources = [
    "gcp_crash_reporter_client.cc",
    "gcp_crash_reporter_client.h",
    "gcp_crash_reporting_utils.cc",
    "gcp_crash_reporting_utils.h",
    "gcp_utils.cc",
    "gcp_utils.h",
    "logging.cc",
    "logging.h",
  ]
  public_configs = [ ":common_config" ]
  public_deps = [
    "//chrome/credential_provider/common:common_constants",
  ]
  deps = [
    "//base:base",
    "//components/crash/core/common",
    "//components/version_info",
    "//google_apis:google_apis",
  ]
}

config("common_config") {
  defines = [
    # Needed in order to include the win32 header security.h.
    "SECURITY_WIN32",
  ]
  libs = [
    "secur32.lib",  # For LsaXXX functions
    "wbemuuid.lib",  # For CLSID_WbemLocator
  ]
}

# This static library is shared with the test code.

source_set("gaiacp_lib") {
  sources = [
    "gaia_credential.cc",
    "gaia_credential.h",
    "gaia_credential_base.cc",
    "gaia_credential_base.h",
    "gaia_credential_provider.cc",
    "gaia_credential_provider.h",
    "gaia_credential_provider_module.cc",
    "gaia_credential_provider_module.h",
    "gcp_crash_reporting.cc",
    "gcp_crash_reporting.h",
    "initguid.cc",
    "os_process_manager.cc",
    "os_process_manager.h",
    "os_user_manager.cc",
    "os_user_manager.h",
    "reauth_credential.cc",
    "reauth_credential.h",
    "reg_utils.cc",
    "reg_utils.h",
    "scoped_handle.h",
    "scoped_lsa_policy.cc",
    "scoped_lsa_policy.h",
    "scoped_user_profile.cc",
    "scoped_user_profile.h",
    "stdafx.h",
  ]
  public_configs = [ ":gaiacp_config" ]
  public_deps = [
    ":common",
  ]
  deps = [
    ":gaia_credential_provider_idl",
    ":static_resources",
    ":string_resources",
    "//chrome/common:version_header",
    "//chrome/installer/launcher_support",
    "//components/crash/content/app:app",
    "//components/crash/content/app:crash_export_thunks",
    "//components/crash/content/app:run_as_crashpad_handler",
  ]
  if (is_component_build) {
    deps += [ "//content/public/common" ]
  } else {
    deps += [ "//content/public/common:static_switches" ]
  }
}

config("gaiacp_config") {
  defines = [
    # Needed to build COM objects that will be hosted in a DLL.
    "_WINDLL",
  ]
  cflags = [
    # C4245: 'conversion' : conversion from 'type1' to 'type2',
    #                       signed/unsigned mismatch
    # Disabling because this Level 4 warning is causing ATL code to not compile,
    # warnings are errors:
    #     c:\src\depot_tools\win_toolchain\vs_files\
    #         d3cb0e37bdd120ad0ac4650b674b09e81be45616\vc\atlmfc\include\
    #         atlexcept.h(102): warning C4245: '=':
    #         conversion from 'NTSTATUS' to 'DWORD', signed/unsigned mismatch
    "/wd4245",
  ]
  libs = [
    "advapi32.lib",  # For LookupAccountSid()
    "credui.lib",  # For CredPackAuthenticationBufferW()
    "crypt32.lib",  # For CryptProtectData()
    "netapi32.lib",  # For NetUserXXX()
    "userenv.lib",  # For GetUserProfileDirectoryW()
    "winhttp.lib",  # For WinHttpXXX()
  ]
}

# Targets for the credential provider dll.

process_version_rc_template("version") {
  template_file = "gaia_credential_provider.rc.version"
  output = "$root_out_dir/gaia_credential_provider.rc"
}

if (is_chrome_branded) {
  gaia_credential_provider_clsid = "0b5bfdf0-4594-47ac-940a-cfc69abc561c"
} else {
  gaia_credential_provider_clsid = "89adae71-aee5-4ee2-bffb-e8424e06f519"
}

action("generate_credential_provider_idl_file") {
  script = "//build/util/version.py"

  inputs = [
    "gaia_credential_provider_idl.templ",
  ]
  outputs = [
    "$target_gen_dir/gaia_credential_provider.idl",
  ]

  args = [
    "-e",
    "GAIA_CREDENTIAL_PROVIDER_CLSID='$gaia_credential_provider_clsid'",
    rebase_path(inputs[0], root_build_dir),
    rebase_path(outputs[0], root_build_dir),
  ]
}

midl("gaia_credential_provider_idl") {
  dynamic_guid = gaia_credential_provider_clsid
  deps = [
    ":generate_credential_provider_idl_file",
  ]
  header_file = "gaia_credential_provider_i.h"
  sources = get_target_outputs(":generate_credential_provider_idl_file")
}

grit("static_resources") {
  source = "gaia_static_resources.grd"
  inputs = [
    "gaia_credential_provider.rgs",
    "google_logo_small.bmp",
  ]
  outputs = [
    "grit/gaia_static_resources.h",
    "grit/gaia_static_resources.rc",
  ]
  resource_ids = ""
  grit_flags = [
    "-E",
    "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
  ]
}

shared_library("gaia1_0") {
  sources = [
    "dllmain.cc",
    "dllmain.h",
    "gaia_credential_provider.def",
    "gaia_credential_provider.rgs",
  ]
  deps = [
    ":common",
    ":gaiacp_lib",
    ":version",
    "//chrome/common:version_header",
  ]
  configs += [ "//build/config/win:windowed" ]
}

# String Resource targets for the credential provider dll.

generate_embedded_i18n("generate_strings") {
  grdfile_folder = "./"
  grdfile_name = "gaia_resources"
  xtb_relative_path = "strings"
  grd_files_info = [
    [
      grdfile_folder,
      grdfile_name,
      xtb_relative_path,
      default_embedded_i18_locales
    ]
  ]

  output_file_name_base = grdfile_name
}

# Compile the generated .rc file.
source_set("string_resources") {
  sources = get_target_outputs(":generate_strings")
  public_deps = [
    ":generate_strings",
  ]
}
