# Copyright 2018 The Fuchsia Authors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#    * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#    * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

config("wsman_config") {
  visibility = [ ":*" ]
  include_dirs = [ "include" ]
}

config("wsman_private_config") {
  visibility = [ ":*" ]
  defines = [
    "_BSD_SOURCE",
    "HAVE_CONFIG_H",
  ]
  cflags = [
    "-Wno-conditional-type-mismatch",
    "-Wno-enum-conversion",
    "-Wno-implicit-function-declaration",
    "-Wno-int-conversion",
    "-Wno-sign-compare",
    "-Wno-sometimes-uninitialized",
    "-Wno-unused-const-variable",
  ]
  include_dirs = [ target_gen_dir ]
}

copy("copy_wsman_config") {
  visibility = [ ":*" ]
  if (is_fuchsia) {
    sources = [
      "wsman_config.h.fuchsia",
    ]
  } else {
    sources = [
      "wsman_config.h",
    ]
  }
  outputs = [
    "$target_gen_dir/wsman_config.h",
  ]
}

group("wsman_settings") {
  visibility = [ ":*" ]
  public_configs = [ ":wsman_private_config" ]
  deps = [
    ":copy_wsman_config",
  ]
}

static_library("wsman") {
  sources = [
    "src/lib/u/base64.c",
    "src/lib/u/buf.c",
    "src/lib/u/debug.c",
    "src/lib/u/gettimeofday.c",
    "src/lib/u/hash.c",
    "src/lib/u/iniparser.c",
    "src/lib/u/list.c",
    "src/lib/u/lock.c",
    "src/lib/u/log.c",
    "src/lib/u/md5.c",
    "src/lib/u/memory.c",
    "src/lib/u/misc.c",
    "src/lib/u/os.c",
    "src/lib/u/pthreadx_win32.c",
    "src/lib/u/strings.c",
    "src/lib/u/syslog.c",
    "src/lib/u/uerr.c",
    "src/lib/u/uoption.c",
    "src/lib/u/uri.c",
    "src/lib/u/uuid.c",
    "src/lib/wsman-cimindication-processor.c",
    "src/lib/wsman-debug.c",
    "src/lib/wsman-dispatcher.c",
    "src/lib/wsman-epr.c",
    "src/lib/wsman-event-pool.c",
    "src/lib/wsman-faults.c",
    "src/lib/wsman-filter.c",
    "src/lib/wsman-key-value.c",
    "src/lib/wsman-libxml2-binding.c",
    "src/lib/wsman-soap-envelope.c",
    "src/lib/wsman-soap-message.c",
    "src/lib/wsman-soap.c",
    "src/lib/wsman-subscription-repository.c",
    "src/lib/wsman-xml-serialize.c",
    "src/lib/wsman-xml.c",
  ]
  public_configs = [ ":wsman_config" ]
  public_deps = [
    "//third_party/boringssl",
    "//third_party/curl:libcurl",
    "//third_party/libxml2",
    "//third_party/sblim-sfcc:cmpisfcc",
  ]
  deps = [
    ":wsman_settings",
  ]
}

static_library("wsman_client") {
  sources = [
    "src/lib/wsman-client.c",
  ]
  public_configs = [ ":wsman_config" ]
  public_deps = [
    "//third_party/boringssl",
    "//third_party/curl:libcurl",
    "//third_party/libxml2",
    "//third_party/sblim-sfcc:cmpisfcc",
  ]
  deps = [
    ":wsman_settings",
  ]
}

static_library("wsman_curl_client_transport") {
  sources = [
    "src/lib/wsman-client-transport.c",
    "src/lib/wsman-curl-client-transport.c",
  ]
  public_configs = [ ":wsman_config" ]
  public_deps = [
    "//third_party/boringssl",
    "//third_party/curl:libcurl",
    "//third_party/libxml2",
    "//third_party/sblim-sfcc:cmpisfcc",
  ]
  deps = [
    ":wsman_settings",
  ]
}
