# 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("../../osp/build/config/services.gni")

source_set("impl") {
  sources = [
    "mdns_platform_service.cc",
    "mdns_platform_service.h",
    "network_service_manager.cc",
    "presentation/presentation_common.cc",
    "presentation/presentation_common.h",
    "presentation/presentation_connection.cc",
    "presentation/presentation_controller.cc",
    "presentation/presentation_receiver.cc",
    "presentation/url_availability_requester.cc",
    "presentation/url_availability_requester.h",
    "receiver_list.cc",
    "receiver_list.h",
    "service_listener_impl.cc",
    "service_listener_impl.h",
    "service_publisher_impl.cc",
    "service_publisher_impl.h",
    "with_destruction_callback.cc",
    "with_destruction_callback.h",
  ]

  if (use_mdns_responder) {
    sources += [
      "internal_services.cc",
      "internal_services.h",
      "mdns_responder_service.cc",
      "mdns_responder_service.h",
      "mdns_service_listener_factory.cc",
      "mdns_service_publisher_factory.cc",
    ]
  }

  public_deps = [
    "../../osp/msgs",
    "../../osp/public",
  ]
  deps = [
    "../../platform",
    "../../third_party/abseil",
    "../../util",
    "quic",
  ]
}

if (use_chromium_quic) {
  source_set("chromium_quic_integration") {
    sources = [
      "protocol_connection_client_factory.cc",
      "protocol_connection_server_factory.cc",
      "quic/quic_connection_factory_impl.cc",
      "quic/quic_connection_factory_impl.h",
      "quic/quic_connection_impl.cc",
      "quic/quic_connection_impl.h",
    ]

    public_configs = [ "../../third_party/chromium_quic:chromium_quic_config" ]

    deps = [
      "../../osp/msgs",
      "../../platform",
      "../../third_party/abseil",
      "../../third_party/chromium_quic",
      "../../util",
      "quic",
    ]
  }
}
