# 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/chromeos/ui_mode.gni")
import("//build/config/features.gni")
import("//printing/buildflags/buildflags.gni")

assert(!is_chromeos_ash)

static_library("service") {
  sources = [
    "cloud_print/cloud_print_auth.cc",
    "cloud_print/cloud_print_auth.h",
    "cloud_print/cloud_print_connector.cc",
    "cloud_print/cloud_print_connector.h",
    "cloud_print/cloud_print_message_handler.cc",
    "cloud_print/cloud_print_message_handler.h",
    "cloud_print/cloud_print_proxy.cc",
    "cloud_print/cloud_print_proxy.h",
    "cloud_print/cloud_print_proxy_backend.cc",
    "cloud_print/cloud_print_proxy_backend.h",
    "cloud_print/cloud_print_service_helpers.cc",
    "cloud_print/cloud_print_service_helpers.h",
    "cloud_print/cloud_print_token_store.cc",
    "cloud_print/cloud_print_token_store.h",
    "cloud_print/cloud_print_url_fetcher.cc",
    "cloud_print/cloud_print_url_fetcher.h",
    "cloud_print/cloud_print_wipeout.cc",
    "cloud_print/cloud_print_wipeout.h",
    "cloud_print/connector_settings.cc",
    "cloud_print/connector_settings.h",
    "cloud_print/job_status_updater.cc",
    "cloud_print/job_status_updater.h",
    "cloud_print/print_system.cc",
    "cloud_print/print_system.h",
    "cloud_print/printer_job_handler.cc",
    "cloud_print/printer_job_handler.h",
    "cloud_print/printer_job_queue_handler.cc",
    "cloud_print/printer_job_queue_handler.h",
    "net/in_process_network_connection_tracker.cc",
    "net/in_process_network_connection_tracker.h",
    "net/service_url_request_context_getter.cc",
    "net/service_url_request_context_getter.h",
    "service_ipc_server.cc",
    "service_ipc_server.h",
    "service_main.cc",
    "service_process.cc",
    "service_process.h",
    "service_process_prefs.cc",
    "service_process_prefs.h",
  ]

  if (is_win) {
    sources += [
      "cloud_print/cdd_conversion_win.cc",
      "cloud_print/cdd_conversion_win.h",
      "cloud_print/print_system_win.cc",
    ]
  }

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

  deps = [
    "//base",
    "//build:chromeos_buildflags",
    "//chrome:strings",
    "//chrome/common",
    "//chrome/services/printing/public/mojom",
    "//components/cloud_devices/common",
    "//components/language/core/browser",
    "//components/language/core/common",
    "//components/network_session_configurator/browser",
    "//components/printing/common",
    "//google_apis",
    "//jingle:notifier",
    "//mojo/core/embedder",
    "//mojo/public/cpp/platform",
    "//mojo/public/cpp/system",
    "//net",
    "//printing",
    "//services/network/public/cpp",
    "//skia",
    "//third_party/webrtc_overrides:webrtc_component",
  ]

  public_deps = [ "//chrome/common:service_process_mojom" ]

  if (use_cups) {
    sources += [ "cloud_print/print_system_cups.cc" ]
    configs += [ "//printing:cups" ]
  } else if (is_win) {
    sources += [
      "service_utility_process_host.cc",
      "service_utility_process_host.h",
      "service_utility_process_host_receiver_bindings.cc",
    ]
    deps += [ "//sandbox/win:sandbox" ]
  }
}
