# 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("//build/config/ui.gni")
import("//testing/test.gni")
if (is_mac) {
  import("//build/config/mac/mac_sdk.gni")
}
if (is_android) {
  import("//build/config/android/rules.gni")
}

component("printing") {
  sources = [
    "backend/print_backend.cc",
    "backend/print_backend.h",
    "backend/print_backend_consts.cc",
    "backend/print_backend_consts.h",
    "backend/print_backend_dummy.cc",
    "backend/printing_info_win.cc",
    "backend/printing_info_win.h",
    "emf_win.cc",
    "emf_win.h",
    "image.cc",
    "image.h",
    "image_android.cc",
    "image_linux.cc",
    "image_mac.cc",
    "image_win.cc",
    "metafile.cc",
    "metafile.h",
    "metafile_skia_wrapper.cc",
    "metafile_skia_wrapper.h",
    "page_number.cc",
    "page_number.h",
    "page_range.cc",
    "page_range.h",
    "page_setup.cc",
    "page_setup.h",
    "page_size_margins.h",
    "pdf_metafile_cg_mac.cc",
    "pdf_metafile_cg_mac.h",
    "pdf_metafile_skia.cc",
    "pdf_metafile_skia.h",
    "print_dialog_gtk_interface.h",
    "print_job_constants.cc",
    "print_job_constants.h",
    "print_settings.cc",
    "print_settings.h",
    "print_settings_conversion.cc",
    "print_settings_conversion.h",
    "print_settings_initializer_mac.cc",
    "print_settings_initializer_mac.h",
    "print_settings_initializer_win.cc",
    "print_settings_initializer_win.h",
    "printed_document.cc",
    "printed_document.h",
    "printed_document_linux.cc",
    "printed_document_mac.cc",
    "printed_document_win.cc",
    "printed_page.cc",
    "printed_page.h",
    "printed_pages_source.h",
    "printing_context.cc",
    "printing_context.h",
    "printing_utils.cc",
    "printing_utils.h",
    "units.cc",
    "units.h",
  ]

  cflags = []
  defines = [ "PRINTING_IMPLEMENTATION" ]

  deps = [
    "//base",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//skia",
    "//third_party/icu",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//url",
  ]

  if (use_aura) {
    deps += [ "//ui/aura" ]
  }

  if (is_mac) {
    # Mac-Aura does not support printing.
    if (use_aura) {
      sources -= [ "printed_document_mac.cc" ]
    } else {
      sources += [
        "printing_context_mac.h",
        "printing_context_mac.mm",
      ]
    }
  }

  if (is_win) {
    # PRINT_BACKEND_AVAILABLE disables the default dummy implementation of the
    # print backend and enables a custom implementation instead.
    defines += [ "PRINT_BACKEND_AVAILABLE" ]
    sources += [
      "backend/print_backend_win.cc",
      "backend/win_helper.cc",
      "backend/win_helper.h",
      "printing_context_system_dialog_win.cc",
      "printing_context_system_dialog_win.h",
      "printing_context_win.cc",
      "printing_context_win.h",
    ]
  }

  if (is_chromeos) {
    sources += [
      "printing_context_no_system_dialog.cc",
      "printing_context_no_system_dialog.h",
    ]
  }

  if (use_cups) {
    configs += [ ":cups" ]

    if (is_linux) {
      cups_version = exec_script("cups_config_helper.py",
                                 [ "--api-version" ],
                                 "trim string")

      if (cups_version == "1.6" || cups_version == "1.7") {
        cflags += [
          # CUPS 1.6 deprecated the PPD APIs, but we will stay with this
          # API for now as supported Linux and Mac OS'es are still using
          # older versions of CUPS. More info: crbug.com/226176
          "-Wno-deprecated-declarations",
          # CUPS 1.7 deprecates httpConnectEncrypt(), see the mac section
          # below.
        ]
      }
    }

    if (is_mac && mac_sdk_version == "10.9") {
      # The 10.9 SDK includes cups 1.7, which deprecates
      # httpConnectEncrypt() in favor of httpConnect2(). hhttpConnect2()
      # is new in 1.7, so it doesn't exist on OS X 10.6-10.8 and we
      # can't use it until 10.9 is our minimum system version.
      # (cups_version isn't reliable on OS X, so key the check off of
      # mac_sdk).
      cflags += [ "-Wno-deprecated-declarations" ]
    }

    # PRINT_BACKEND_AVAILABLE disables the default dummy implementation
    # of the print backend and enables a custom implementation instead.
    defines += [ "PRINT_BACKEND_AVAILABLE" ]

    sources += [
      "backend/cups_helper.cc",
      "backend/cups_helper.h",
      "backend/print_backend_cups.cc",
    ]
  }

  if (is_chromeos) {
    # PRINT_BACKEND_AVAILABLE disables the default dummy implementation
    # of the print backend and enables a custom implementation instead.
    defines += [ "PRINT_BACKEND_AVAILABLE" ]

    sources += [ "backend/print_backend_chromeos.cc" ]
  } else if (is_linux) {  # Non-ChromeOS Linux.
    sources += [
      "printing_context_linux.cc",
      "printing_context_linux.h",
    ]
  }

  if (is_android) {
    sources += [
      "printing_context_android.cc",
      "printing_context_android.h",
    ]

    deps += [ ":printing_jni_headers" ]
  }
}

test("printing_unittests") {
  sources = [
    "emf_win_unittest.cc",
    "page_number_unittest.cc",
    "page_range_unittest.cc",
    "page_setup_unittest.cc",
    "pdf_metafile_cg_mac_unittest.cc",
    "printed_page_unittest.cc",
    "printing_context_win_unittest.cc",
    "printing_test.h",
    "printing_utils_unittest.cc",
    "units_unittest.cc",
  ]

  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  if (use_cups) {
    configs += [ ":cups" ]
    sources += [ "backend/cups_helper_unittest.cc" ]
  }

  deps = [
    ":printing",
    "//base/allocator",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gtest",
    "//ui/base",
    "//ui/gfx",
    "//ui/gfx:test_support",
    "//ui/gfx/geometry",
  ]
}

if (use_cups) {
  config("cups") {
    defines = [ "USE_CUPS" ]

    if (is_mac) {
      ldflags = [ "$mac_sdk_path/usr/lib/libcups.dylib" ]
    } else {
      libs = exec_script("cups_config_helper.py", [ "--libs-for-gn" ], "value")
    }
  }
}

if (is_android) {
  # GYP: //printing/printing.gyp:printing_jni_headers
  generate_jni("printing_jni_headers") {
    sources = [
      "android/java/src/org/chromium/printing/PrintingContext.java",
    ]
    jni_package = "printing"
  }

  # GYP: //printing/printing.gyp:printing_java
  android_library("printing_java") {
    deps = [
      "//base:base_java",
    ]
    DEPRECATED_java_in_dir = "android/java/src"
  }
}
