# 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("//mojo/public/mojo_application.gni")

if (is_android) {
  import("//build/config/android/rules.gni")

  java_library_path = "$target_out_dir/java_library.dex.jar"

  mojo_android_application("network") {
    output_name = "network_service"
    input_so = "$root_out_dir/lib.stripped/libnetwork_service.so"
    input_dex_jar = java_library_path
  }

  shared_library("native_library") {
    output_name = "network_service"

    sources = [
      "android_hooks.cc",
    ]

    deps = [
      ":sources",
      "//base",
      "//net",
    ]
  }

  android_standalone_library("java_library") {
    dex_path = java_library_path

    deps = [
      "//net/android:net_java",
    ]
  }
} else {
  mojo_native_application("network") {
    output_name = "network_service"

    deps = [
      ":sources",
    ]
  }
}

source_set("lib") {
  sources = [
    "cookie_store_impl.cc",
    "cookie_store_impl.h",
    "net_adapters.cc",
    "net_adapters.h",
    "net_address_type_converters.cc",
    "net_address_type_converters.h",
    "network_context.cc",
    "network_context.h",
    "network_service_impl.cc",
    "network_service_impl.h",
    "tcp_bound_socket_impl.cc",
    "tcp_bound_socket_impl.h",
    "tcp_connected_socket_impl.cc",
    "tcp_connected_socket_impl.h",
    "tcp_server_socket_impl.cc",
    "tcp_server_socket_impl.h",
    "udp_socket_impl.cc",
    "udp_socket_impl.h",
    "url_loader_impl.cc",
    "url_loader_impl.h",
    "web_socket_impl.cc",
    "web_socket_impl.h",
  ]

  deps = [
    "//base",
    "//mojo/application",
    "//mojo/common",
    "//mojo/environment:chromium",
    "//mojo/public/cpp/bindings",
    "//mojo/services/network/public/cpp",
    "//mojo/services/network/public/interfaces",
    "//net",
    "//url",
  ]
}

source_set("sources") {
  visibility = [ ":*" ]

  sources = [
    "network_service.cc",
  ]

  deps = [
    ":lib",
    "//base",
    "//mojo/application",
    "//mojo/public/c/system:for_shared_library",
    "//mojo/public/cpp/bindings:bindings",
    "//mojo/services/network/public/cpp",
    "//mojo/services/network/public/interfaces",
  ]
}

mojo_native_application("apptests") {
  output_name = "network_service_apptests"
  testonly = true

  sources = [
    "udp_socket_apptest.cc",
    "url_loader_impl_apptest.cc",
  ]

  deps = [
    ":lib",
    ":network",
    "//base",
    "//mojo/application",
    "//mojo/application:test_support",
    "//mojo/common",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/bindings:callback",
    "//mojo/services/network/public/cpp",
    "//mojo/services/network/public/interfaces",
    "//net",
    "//net:test_support",
    "//testing/gtest",
  ]
}
