# Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
} else if (is_mac) {
  import("//build/config/mac/rules.gni")
} else if (is_ios) {
  import("//build/config/ios/rules.gni")
}
if (is_linux || is_win) {
  import("//webrtc/build/webrtc.gni")
}
if (is_linux) {
  import("//build/config/linux/pkg_config.gni")
}

group("examples") {
  deps = []

  if (is_android) {
    deps += [ ":AppRTCDemo" ]
  }
  if (is_linux) {
    deps += [
      ":peerconnection_client",
      ":peerconnection_server",
      ":relayserver",
      ":stunserver",
      ":turnserver",
    ]
  }
}

if (is_android) {
  android_apk("AppRTCDemo") {
    apk_name = "AppRTCDemo"
    android_manifest = "androidapp/AndroidManifest.xml"

    deps = [
      ":AppRTCDemo_javalib",
      ":AppRTCDemo_resources",
      "//base:base_java",
      "//webrtc/base:base_java",
    ]

    shared_libraries = [ "//webrtc/api:libjingle_peerconnection_so" ]
  }

  android_library("AppRTCDemo_javalib") {
    java_files = [
      "androidapp/src/org/appspot/apprtc/AppRTCAudioManager.java",
      "androidapp/src/org/appspot/apprtc/AppRTCClient.java",
      "androidapp/src/org/appspot/apprtc/AppRTCProximitySensor.java",
      "androidapp/src/org/appspot/apprtc/CallActivity.java",
      "androidapp/src/org/appspot/apprtc/CallFragment.java",
      "androidapp/src/org/appspot/apprtc/CaptureQualityController.java",
      "androidapp/src/org/appspot/apprtc/ConnectActivity.java",
      "androidapp/src/org/appspot/apprtc/CpuMonitor.java",
      "androidapp/src/org/appspot/apprtc/DirectRTCClient.java",
      "androidapp/src/org/appspot/apprtc/HudFragment.java",
      "androidapp/src/org/appspot/apprtc/PeerConnectionClient.java",
      "androidapp/src/org/appspot/apprtc/PercentFrameLayout.java",
      "androidapp/src/org/appspot/apprtc/RoomParametersFetcher.java",
      "androidapp/src/org/appspot/apprtc/SettingsActivity.java",
      "androidapp/src/org/appspot/apprtc/SettingsFragment.java",
      "androidapp/src/org/appspot/apprtc/TCPChannelClient.java",
      "androidapp/src/org/appspot/apprtc/UnhandledExceptionHandler.java",
      "androidapp/src/org/appspot/apprtc/WebSocketChannelClient.java",
      "androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java",
      "androidapp/src/org/appspot/apprtc/util/AppRTCUtils.java",
      "androidapp/src/org/appspot/apprtc/util/AsyncHttpURLConnection.java",
    ]

    deps = [
      ":AppRTCDemo_resources",
      "//webrtc/api:libjingle_peerconnection_java",
      "//webrtc/base:base_java",
      "//webrtc/examples/androidapp/third_party/autobanh:autobanh_java",
    ]
  }

  android_resources("AppRTCDemo_resources") {
    resource_dirs = [ "androidapp/res" ]
    custom_package = "org.appspot.apprtc"
  }

  instrumentation_test_apk("AppRTCDemoTest") {
    apk_name = "AppRTCDemoTest"
    android_manifest = "androidtests/AndroidManifest.xml"

    java_files = [ "androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java" ]

    apk_under_test = ":AppRTCDemo"

    deps = [
      ":AppRTCDemo_javalib",
      "//webrtc/api:libjingle_peerconnection_java",
    ]
  }

  junit_binary("AppRTCDemoJUnitTest") {
    java_files = [
      "androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java",
      "androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java",
    ]

    deps = [
      ":AppRTCDemo_javalib",
      "//webrtc/api:libjingle_peerconnection_java",
      "//webrtc/api:libjingle_peerconnection_jni",
    ]
  }
}

if (is_ios || (is_mac && target_cpu != "x86")) {
  config("warnings_config") {
    # GN orders flags on a target before flags from configs. The default config
    # adds these flags so to cancel them out they need to come from a config and
    # cannot be on the target directly.
    if (is_ios) {
      # Suppress compiler warnings about deprecated that triggered
      # when moving from ios_deployment_target 7.0 to 9.0.
      # See webrtc:5549 for more details.
      cflags = [ "-Wno-deprecated-declarations" ]
    }
  }

  config("apprtc_common_config") {
    include_dirs = [ "objc/AppRTCDemo/common" ]
  }

  source_set("apprtc_common") {
    sources = [
      "objc/AppRTCDemo/common/ARDUtilities.h",
      "objc/AppRTCDemo/common/ARDUtilities.m",
    ]
    configs += [
      "..:common_config",
      ":warnings_config",
      "//build/config/compiler:enable_arc",
    ]
    public_configs = [
      "..:common_inherited_config",
      ":apprtc_common_config",
    ]

    deps = [
      "../sdk:rtc_sdk_common_objc",
      "../system_wrappers:field_trial_default",
      "../system_wrappers:metrics_default",
    ]
  }

  config("apprtc_signaling_config") {
    include_dirs = [ "objc/AppRTCDemo" ]

    # GN orders flags on a target before flags from configs. The default config
    # adds these flags so to cancel them out they need to come from a config and
    # cannot be on the target directly.
    cflags = [
      "-Wno-sign-compare",
      "-Wno-unused-variable",
    ]
    if (is_mac) {
      cflags += [ "-Wno-partial-availability" ]
    }
  }

  source_set("apprtc_signaling") {
    sources = [
      "objc/AppRTCDemo/ARDAppClient+Internal.h",
      "objc/AppRTCDemo/ARDAppClient.h",
      "objc/AppRTCDemo/ARDAppClient.m",
      "objc/AppRTCDemo/ARDAppEngineClient.h",
      "objc/AppRTCDemo/ARDAppEngineClient.m",
      "objc/AppRTCDemo/ARDBitrateTracker.h",
      "objc/AppRTCDemo/ARDBitrateTracker.m",
      "objc/AppRTCDemo/ARDCEODTURNClient.h",
      "objc/AppRTCDemo/ARDCEODTURNClient.m",
      "objc/AppRTCDemo/ARDJoinResponse+Internal.h",
      "objc/AppRTCDemo/ARDJoinResponse.h",
      "objc/AppRTCDemo/ARDJoinResponse.m",
      "objc/AppRTCDemo/ARDMessageResponse+Internal.h",
      "objc/AppRTCDemo/ARDMessageResponse.h",
      "objc/AppRTCDemo/ARDMessageResponse.m",
      "objc/AppRTCDemo/ARDRoomServerClient.h",
      "objc/AppRTCDemo/ARDSDPUtils.h",
      "objc/AppRTCDemo/ARDSDPUtils.m",
      "objc/AppRTCDemo/ARDSignalingChannel.h",
      "objc/AppRTCDemo/ARDSignalingMessage.h",
      "objc/AppRTCDemo/ARDSignalingMessage.m",
      "objc/AppRTCDemo/ARDStatsBuilder.h",
      "objc/AppRTCDemo/ARDStatsBuilder.m",
      "objc/AppRTCDemo/ARDTURNClient.h",
      "objc/AppRTCDemo/ARDWebSocketChannel.h",
      "objc/AppRTCDemo/ARDWebSocketChannel.m",
      "objc/AppRTCDemo/RTCIceCandidate+JSON.h",
      "objc/AppRTCDemo/RTCIceCandidate+JSON.m",
      "objc/AppRTCDemo/RTCIceServer+JSON.h",
      "objc/AppRTCDemo/RTCIceServer+JSON.m",
      "objc/AppRTCDemo/RTCMediaConstraints+JSON.h",
      "objc/AppRTCDemo/RTCMediaConstraints+JSON.m",
      "objc/AppRTCDemo/RTCSessionDescription+JSON.h",
      "objc/AppRTCDemo/RTCSessionDescription+JSON.m",
    ]
    configs += [
      "..:common_config",
      "//build/config/compiler:enable_arc",
      ":warnings_config",
    ]
    public_configs = [
      "..:common_inherited_config",
      ":apprtc_signaling_config",
    ]
    deps = [
      ":apprtc_common",
      ":socketrocket",
    ]
    public_deps = [
      "../sdk:rtc_sdk_peerconnection_objc",
    ]
    libs = [ "QuartzCore.framework" ]
  }

  if (is_ios) {
    ios_app_bundle("AppRTCDemo") {
      sources = [
        "objc/AppRTCDemo/ios/ARDAppDelegate.m",
        "objc/AppRTCDemo/ios/ARDMainView.h",
        "objc/AppRTCDemo/ios/ARDMainView.m",
        "objc/AppRTCDemo/ios/ARDMainViewController.h",
        "objc/AppRTCDemo/ios/ARDMainViewController.m",
        "objc/AppRTCDemo/ios/ARDStatsView.h",
        "objc/AppRTCDemo/ios/ARDStatsView.m",
        "objc/AppRTCDemo/ios/ARDVideoCallView.h",
        "objc/AppRTCDemo/ios/ARDVideoCallView.m",
        "objc/AppRTCDemo/ios/ARDVideoCallViewController.h",
        "objc/AppRTCDemo/ios/ARDVideoCallViewController.m",
        "objc/AppRTCDemo/ios/AppRTCDemo-Prefix.pch",
        "objc/AppRTCDemo/ios/UIImage+ARDUtilities.h",
        "objc/AppRTCDemo/ios/UIImage+ARDUtilities.m",
        "objc/AppRTCDemo/ios/main.m",
      ]

      info_plist = "objc/AppRTCDemo/ios/Info.plist"

      configs += [
        "..:common_config",
        "//build/config/compiler:enable_arc",
        ":warnings_config",
      ]
      public_configs = [ "..:common_inherited_config" ]

      deps = [
        ":AppRTCDemo_ios_bundle_data",
        ":apprtc_common",
        ":apprtc_signaling",
      ]

      if (target_cpu == "x86") {
        deps += [ "//testing/iossim:iossim" ]
      }
    }

    bundle_data("AppRTCDemo_ios_bundle_data") {
      sources = [
        "objc/AppRTCDemo/ios/resources/Roboto-Regular.ttf",
        "objc/AppRTCDemo/ios/resources/iPhone5@2x.png",
        "objc/AppRTCDemo/ios/resources/iPhone6@2x.png",
        "objc/AppRTCDemo/ios/resources/iPhone6p@3x.png",
        "objc/AppRTCDemo/ios/resources/ic_call_end_black_24dp.png",
        "objc/AppRTCDemo/ios/resources/ic_call_end_black_24dp@2x.png",
        "objc/AppRTCDemo/ios/resources/ic_clear_black_24dp.png",
        "objc/AppRTCDemo/ios/resources/ic_clear_black_24dp@2x.png",
        "objc/AppRTCDemo/ios/resources/ic_surround_sound_black_24dp.png",
        "objc/AppRTCDemo/ios/resources/ic_surround_sound_black_24dp@2x.png",
        "objc/AppRTCDemo/ios/resources/ic_switch_video_black_24dp.png",
        "objc/AppRTCDemo/ios/resources/ic_switch_video_black_24dp@2x.png",
        "objc/AppRTCDemo/ios/resources/mozart.mp3",
        "objc/Icon.png",
      ]
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }
  }

  if (is_mac) {
    source_set("AppRTCDemo_app") {
      sources = [
        "objc/AppRTCDemo/mac/APPRTCAppDelegate.h",
        "objc/AppRTCDemo/mac/APPRTCAppDelegate.m",
        "objc/AppRTCDemo/mac/APPRTCViewController.h",
        "objc/AppRTCDemo/mac/APPRTCViewController.m",
      ]
      configs += [
        "..:common_config",
        "..:common_objc",
        "//build/config/compiler:enable_arc",
      ]
      deps = [
        ":apprtc_common",
        ":apprtc_signaling",
      ]
    }

    mac_app_bundle("AppRTCDemo") {
      output_name = "AppRTCDemo"

      extra_substitutions = [ "MACOSX_DEPLOYMENT_TARGET=10.8" ]

      sources = [
        "objc/AppRTCDemo/mac/main.m",
      ]

      public_configs = [ "..:common_inherited_config" ]

      info_plist = "objc/AppRTCDemo/mac/Info.plist"

      libs = [ "AppKit.framework" ]

      deps = [
        ":AppRTCDemo_app",
      ]
    }
  }

  config("socketrocket_include_config") {
    include_dirs = [ "objc/AppRTCDemo/third_party/SocketRocket" ]
  }

  config("socketrocket_warning_config") {
    # GN orders flags on a target before flags from configs. The default config
    # adds these flags so to cancel them out they need to come from a config and
    # cannot be on the target directly.
    cflags = [
      "-Wno-deprecated-declarations",
      "-Wno-nonnull",
      "-Wno-objc-missing-property-synthesis",
      "-Wno-semicolon-before-method-body",
      "-Wno-unused-variable",
    ]

    # Enabled for cflags_objc in build/config/compiler/BUILD.gn.
    cflags_objc = [ "-Wno-objc-missing-property-synthesis" ]

    if (is_mac) {
      cflags += [ "-Wno-partial-availability" ]
    }
  }

  source_set("socketrocket") {
    sources = [
      "objc/AppRTCDemo/third_party/SocketRocket/SRWebSocket.h",
      "objc/AppRTCDemo/third_party/SocketRocket/SRWebSocket.m",
    ]
    configs += [
      "..:common_config",
      "//build/config/compiler:enable_arc",
      ":socketrocket_warning_config",
    ]
    public_configs = [
      "..:common_inherited_config",
      ":socketrocket_include_config",
    ]

    libs = [
      "CFNetwork.framework",
      "icucore",
    ]
  }
}

if (is_linux || is_win) {
  if (is_linux) {
    pkg_config("gtk2_config") {
      # Gtk requires gmodule, but it does not list it as a dependency in some
      # misconfigured systems.
      packages = [
        "gmodule-2.0",
        "gtk+-2.0",
        "gthread-2.0",
      ]
    }
  }

  executable("peerconnection_client") {
    sources = [
      "peerconnection/client/conductor.cc",
      "peerconnection/client/conductor.h",
      "peerconnection/client/defaults.cc",
      "peerconnection/client/defaults.h",
      "peerconnection/client/peer_connection_client.cc",
      "peerconnection/client/peer_connection_client.h",
    ]
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
    if (is_win) {
      sources += [
        "peerconnection/client/flagdefs.h",
        "peerconnection/client/main.cc",
        "peerconnection/client/main_wnd.cc",
        "peerconnection/client/main_wnd.h",
      ]
      cflags = [ "/wd4245" ]
      configs += [ "//build/config/win:windowed" ]
    }
    if (is_linux) {
      sources += [
        "peerconnection/client/linux/main.cc",
        "peerconnection/client/linux/main_wnd.cc",
        "peerconnection/client/linux/main_wnd.h",
      ]
      libs = [
        "X11",
        "Xcomposite",
        "Xext",
        "Xrender",
      ]
      public_configs = [ ":gtk2_config" ]
    }
    deps = [
      "//build/config/sanitizers:deps",
      "//webrtc/api:libjingle_peerconnection",
      "//webrtc/system_wrappers:field_trial_default",
      "//webrtc/system_wrappers:metrics_default",
    ]
    if (rtc_build_json) {
      deps += [ "//third_party/jsoncpp" ]
    }
  }
  executable("peerconnection_server") {
    sources = [
      "peerconnection/server/data_socket.cc",
      "peerconnection/server/data_socket.h",
      "peerconnection/server/main.cc",
      "peerconnection/server/peer_channel.cc",
      "peerconnection/server/peer_channel.h",
      "peerconnection/server/utils.cc",
      "peerconnection/server/utils.h",
    ]
    deps = [
      "//build/config/sanitizers:deps",
      "//webrtc:webrtc_common",
      "//webrtc/base:rtc_base_approved",
      "//webrtc/tools:command_line_parser",
    ]
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
  executable("relayserver") {
    sources = [
      "relayserver/relayserver_main.cc",
    ]
    deps = [
      "//build/config/sanitizers:deps",
      "//webrtc/base:rtc_base_approved",
      "//webrtc/pc:rtc_pc",
      "//webrtc/system_wrappers:field_trial_default",
      "//webrtc/system_wrappers:metrics_default",
    ]
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
  executable("turnserver") {
    sources = [
      "turnserver/turnserver_main.cc",
    ]
    deps = [
      "//build/config/sanitizers:deps",
      "//webrtc/base:rtc_base_approved",
      "//webrtc/pc:rtc_pc",
      "//webrtc/system_wrappers:field_trial_default",
      "//webrtc/system_wrappers:metrics_default",
    ]
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
  executable("stunserver") {
    sources = [
      "stunserver/stunserver_main.cc",
    ]
    deps = [
      "//build/config/sanitizers:deps",
      "//webrtc/base:rtc_base_approved",
      "//webrtc/pc:rtc_pc",
      "//webrtc/system_wrappers:field_trial_default",
      "//webrtc/system_wrappers:metrics_default",
    ]
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}
