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

import("//build/config/features.gni")
import("//media/media_options.gni")
import("//remoting/remoting_options.gni")
import("//remoting/remoting_locales.gni")
import("//remoting/remoting_version.gni")

if (is_win) {
  import("//remoting/host/predefines_win.gni")
}
if (is_mac) {
  import("//build/config/mac/rules.gni")
  import("//third_party/icu/config.gni")
}

source_set("common") {
  sources = [
    "it2me_confirmation_dialog.h",
    "it2me_confirmation_dialog_linux.cc",
    "it2me_confirmation_dialog_mac.mm",
    "it2me_confirmation_dialog_proxy.cc",
    "it2me_confirmation_dialog_proxy.h",
    "it2me_confirmation_dialog_win.cc",
    "it2me_host.cc",
    "it2me_host.h",
    "it2me_native_messaging_host.cc",
    "it2me_native_messaging_host.h",
  ]

  if (is_chromeos) {
    sources += [ "it2me_confirmation_dialog_chromeos.cc" ]

    sources -= [ "it2me_confirmation_dialog_linux.cc" ]
  }

  configs += [
    "//build/config/compiler:wexit_time_destructors",
    "//remoting/build/config:version",
  ]

  deps = [
    "//base:i18n",
    "//net",
    "//remoting/base",
    "//remoting/host",
    "//remoting/protocol",
    "//remoting/resources",
    "//remoting/signaling",
  ]

  if (is_desktop_linux) {
    deps += [
      "//build/config/linux/gtk",

      # GTK pulls pangoft2, which requires HarfBuzz symbols. Since we
      # link our own HarfBuzz, avoid mixing symbols from system HarfBuzz
      # and own ones, hence the dependency to harfbuzz-ng here.
      "//third_party/harfbuzz-ng",
    ]
  }
}

if (!is_chromeos && enable_remoting_host) {
  if (is_win) {
    executable("remote_assistance_host") {
      configs += [ "//build/config/compiler:wexit_time_destructors" ]

      deps = [
        "//base/allocator",
        "//remoting/host/win:dpi_aware_exe_manifest",
        "//remoting/host/win:remoting_core",
        "//remoting/host/win:remoting_windows_resources",
      ]

      sources = [
        "$root_gen_dir/remoting/version.rc",
        "it2me_native_messaging_host_entry_point.cc",
      ]

      defines = host_predefines +
                [ "REMOTING_HOST_BINARY=BINARY_REMOTE_ASSISTANCE_HOST" ]

      ldflags = [
        # "/NODEFAULTLIB", TODO(zijiehe): Why IgnoreAllDefaultLibraries: true in
        # GYP does not take effect?
        "comctl32.lib",
      ]
    }

    executable("remote_assistance_host_uiaccess") {
      configs += [ "//build/config/compiler:wexit_time_destructors" ]

      deps = [
        "//base/allocator",
        "//remoting/host/win:remoting_core",
        "//remoting/host/win:remoting_windows_resources",
      ]

      sources = [
        "$root_gen_dir/remoting/version.rc",
        "it2me_native_messaging_host_entry_point.cc",
      ]

      defines = host_predefines +
                [ "REMOTING_HOST_BINARY=BINARY_HOST_IT2ME_UIACCESS" ]

      ldflags = [
        # "/NODEFAULTLIB", TODO(zijiehe): Why IgnoreAllDefaultLibraries: true in
        # GYP does not take effect?
        "comctl32.lib",
      ]

      # uiAccess requires a signed build to work correctly, so only enable the
      # manifest flag when the binary will be properly signed.
      if (is_official_build) {
        deps += [ "//remoting/host/win:dpi_aware_uiaccess_exe_manifest" ]
      } else {
        deps += [ "//remoting/host/win:dpi_aware_exe_manifest" ]
      }
    }
  } else {
    if (is_mac) {
      app_target_type = "mac_app_bundle"

      bundle_data("remote_assistance_host_dialog_icon") {
        sources = [
          "//remoting/resources/chromoting128.png",
        ]

        outputs = [
          "{{bundle_resources_dir}}/{{source_file_part}}",
        ]
      }

      # remote_assistance_host-InfoPlist.strings
      foreach(locale, remoting_locales_with_underscores) {
        bundle_data("remote_assistance_host_strings_${locale}_bundle_data") {
          sources = [
            "$root_gen_dir/remoting/host/remote_assistance_host-InfoPlist.strings/$locale.lproj/InfoPlist.strings",
          ]
          outputs = [
            "{{bundle_resources_dir}}/$locale.lproj/{{source_file_part}}",
          ]
          deps = [
            "//remoting/host:remoting_infoplist_strings",
          ]
        }
      }

      mac_xib_bundle_data("remote_assistance_host_xibs") {
        sources = [
          "//remoting/host/mac/disconnect_window.xib",
        ]
      }

      if (icu_use_data_file) {
        bundle_data("remote_assistance_host_resources") {
          sources = [
            "$root_out_dir/icudtl.dat",
          ]

          outputs = [
            "{{bundle_resources_dir}}/{{source_file_part}}",
          ]

          public_deps = [
            "//third_party/icu:icudata",
          ]
        }
      }
    } else {
      app_target_type = "executable"
    }

    target(app_target_type, "remote_assistance_host") {
      if (is_mac) {
        info_plist = "remote_assistance_host-Info.plist"
        extra_substitutions = [
          "BUNDLE_ID=$remote_assistance_host_bundle_id",
          "VERSION_FULL=$remoting_version_full",
          "VERSION_SHORT=$remoting_version_short",
          "MACOSX_DEPLOYMENT_TARGET=10.7",
        ]
        extra_configs = [
          "//build/config/compiler:wexit_time_destructors",
          "//remoting/build/config:version",
        ]
      } else {
        configs += [
          "//build/config/compiler:wexit_time_destructors",
          "//remoting/build/config:version",
        ]
      }

      sources = [
        "it2me_native_messaging_host_entry_point.cc",
        "it2me_native_messaging_host_main.cc",
        "it2me_native_messaging_host_main.h",
      ]

      deps = [
        ":common",
        "//build/config:exe_and_shlib_deps",
        "//remoting/host",
        "//remoting/host/native_messaging",
        "//remoting/proto",
        "//ui/gfx",
      ]
      if (is_mac) {
        foreach(locale, remoting_locales_with_underscores) {
          deps += [
            ":remote_assistance_host_strings_${locale}_bundle_data",
            "//remoting/host/mac:remoting_host_locale_${locale}_bundle_data",
          ]
        }
        deps += [
          ":remote_assistance_host_dialog_icon",
          ":remote_assistance_host_xibs",
          "//remoting/host:remoting_infoplist_strings",
          "//remoting/resources:copy_locales",
        ]
        if (icu_use_data_file) {
          deps += [ ":remote_assistance_host_resources" ]
        }
      }

      if (enable_webrtc) {
        deps += [ "//third_party/webrtc_overrides:init_webrtc" ]
      }

      if (is_desktop_linux) {
        deps += [ "//build/config/linux/gtk" ]
      }
    }
  }
}
