# 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")
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.mm",
        "printing_context_mac.h",
      ]
    }
  }

  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/win_helper.cc",
      "backend/win_helper.h",
      "backend/print_backend_win.cc",
      "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",
  ]

  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"
  }
}
