#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

AC_PREREQ([2.61])
AC_INIT([guacamole-server], [1.0.0])
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AM_SILENT_RULES([yes])

LT_PREREQ([2.2])
LT_INIT([dlopen])

AC_CONFIG_HEADER([config.h])
AC_CONFIG_MACRO_DIR([m4])

# Programs
AC_PROG_CC
AC_PROG_CC_C99
AC_PROG_LIBTOOL

# Headers
AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/socket.h time.h sys/time.h syslog.h unistd.h cairo/cairo.h pngstruct.h])

# Source characteristics
AC_DEFINE([_XOPEN_SOURCE], [700], [Uses X/Open and POSIX APIs])

# Check for whether math library is required
AC_CHECK_LIB([m], [cos],
             [MATH_LIBS=-lm],
             [AC_CHECK_DECL([cos],,
                            AC_MSG_ERROR("Complex math functions are missing and no libm was found")
                            [#include <math.h>])])

# libpng
AC_CHECK_LIB([png], [png_write_png], [PNG_LIBS=-lpng],
             AC_MSG_ERROR("libpng is required for writing png messages"))

# libjpeg
AC_CHECK_LIB([jpeg], [jpeg_start_compress], [JPEG_LIBS=-ljpeg],
             AC_MSG_ERROR("libjpeg is required for writing jpeg messages"))

# Cairo
AC_CHECK_LIB([cairo], [cairo_create], [CAIRO_LIBS=-lcairo],
             AC_MSG_ERROR("Cairo is required for drawing instructions"))

# libpthread
AC_CHECK_LIB([pthread], [pthread_create], [PTHREAD_LIBS=-lpthread
              AC_DEFINE([HAVE_LIBPTHREAD],,
                        [Whether libpthread was found])])

# Include libdl for dlopen() if necessary
AC_CHECK_LIB([dl], [dlopen],
             [DL_LIBS=-ldl],
             [AC_CHECK_DECL([dlopen],,
                            AC_MSG_ERROR("libdl is required on systems which do not otherwise provide dlopen()"),
                            [#include <dlfcn.h>])])

# OSSP UUID
AC_CHECK_LIB([ossp-uuid], [uuid_make], [UUID_LIBS=-lossp-uuid],
             AC_CHECK_LIB([uuid], [uuid_make], [UUID_LIBS=-luuid],
                          AC_MSG_ERROR("The OSSP UUID library is required")))

# Check for and validate OSSP uuid.h header
AC_CHECK_HEADERS([ossp/uuid.h])
AC_CHECK_DECL([uuid_make],,
              AC_MSG_ERROR("No OSSP uuid.h found in include path"),
              [#ifdef HAVE_OSSP_UUID_H
               #include <ossp/uuid.h>
               #else
               #include <uuid.h>
               #endif
               ])

# cunit
AC_CHECK_LIB([cunit], [CU_run_test], [CUNIT_LIBS=-lcunit])

AC_SUBST(DL_LIBS)
AC_SUBST(MATH_LIBS)
AC_SUBST(PNG_LIBS)
AC_SUBST(JPEG_LIBS)
AC_SUBST(CAIRO_LIBS)
AC_SUBST(PTHREAD_LIBS)
AC_SUBST(UUID_LIBS)
AC_SUBST(CUNIT_LIBS)

# Library functions
AC_CHECK_FUNCS([clock_gettime gettimeofday memmove memset select strdup nanosleep])

AC_CHECK_DECL([png_get_io_ptr],
	[AC_DEFINE([HAVE_PNG_GET_IO_PTR],,
               [Whether png_get_io_ptr() is defined])],,
	[#include <png.h>])

AC_CHECK_DECL([cairo_format_stride_for_width],
	[AC_DEFINE([HAVE_CAIRO_FORMAT_STRIDE_FOR_WIDTH],,
               [Whether cairo_format_stride_for_width() is defined])],,
	[#include <cairo/cairo.h>])

AC_CHECK_DECL([poll],
	[AC_DEFINE([HAVE_POLL],,
               [Whether poll() is defined])],,
	[#include <poll.h>])

# Typedefs
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T

# Bundled libguac
AC_SUBST([LIBGUAC_LTLIB],   '$(top_builddir)/src/libguac/libguac.la')
AC_SUBST([LIBGUAC_INCLUDE], '-I$(top_srcdir)/src/libguac')

# Common non-libguac utility library
AC_SUBST([COMMON_LTLIB],   '$(top_builddir)/src/common/libguac_common.la')
AC_SUBST([COMMON_INCLUDE], '-I$(top_srcdir)/src/common')

# Common PulseAudio utility library
AC_SUBST([PULSE_LTLIB],   '$(top_builddir)/src/pulse/libguac_pulse.la')
AC_SUBST([PULSE_INCLUDE], '-I$(top_srcdir)/src/pulse')

# Common base SSH client
AC_SUBST([COMMON_SSH_LTLIB],   '$(top_builddir)/src/common-ssh/libguac_common_ssh.la')
AC_SUBST([COMMON_SSH_INCLUDE], '-I$(top_srcdir)/src/common-ssh')

# Terminal emulator
AC_SUBST([TERMINAL_LTLIB],   '$(top_builddir)/src/terminal/libguac_terminal.la')
AC_SUBST([TERMINAL_INCLUDE], '-I$(top_srcdir)/src/terminal $(PANGO_CFLAGS) $(PANGOCAIRO_CFLAGS) $(COMMON_INCLUDE)')

# Init directory
AC_ARG_WITH(init_dir,
            [AS_HELP_STRING([--with-init-dir=<path>],
                            [install init scripts to the given directory])
            ],init_dir=$withval)
AM_CONDITIONAL([ENABLE_INIT], [test "x${init_dir}" != "x"])
AC_SUBST(init_dir)

# Systemd directory
AC_ARG_WITH(systemd_dir,
            [AS_HELP_STRING([--with-systemd-dir=<path>],
                            [install systemd units to the given directory])
            ],systemd_dir=$withval)
AM_CONDITIONAL([ENABLE_SYSTEMD], [test "x${systemd_dir}" != "x"])
AC_SUBST(systemd_dir)

# guacd config file
AC_ARG_WITH(guacd_conf,
            [AS_HELP_STRING([--with-guacd-conf=<path>],
                            [the full path to the guacd config file @<:@default=/etc/guacamole/guacd.conf@:>@])],
            [guacd_conf=$withval],
            [guacd_conf=/etc/guacamole/guacd.conf])
AC_DEFINE_UNQUOTED([GUACD_CONF_FILE], ["$guacd_conf"], [The full path to the guacd config file])

#
# libavcodec
#

have_libavcodec=disabled
AC_ARG_WITH([libavcodec],
            [AS_HELP_STRING([--with-libavcodec],
                            [use libavcodec when encoding video @<:@default=check@:>@])],
            [],
            [with_libavcodec=check])

if test "x$with_libavcodec" != "xno"
then
    have_libavcodec=yes
    PKG_CHECK_MODULES([AVCODEC], [libavcodec],, [have_libavcodec=no]);
fi

AM_CONDITIONAL([ENABLE_AVCODEC], [test "x${have_libavcodec}" = "xyes"])

#
# libavutil
#

have_libavutil=disabled
AC_ARG_WITH([libavutil],
            [AS_HELP_STRING([--with-libavutil],
                            [use libavutil when encoding video @<:@default=check@:>@])],
            [],
            [with_libavutil=check])

if test "x$with_libavutil" != "xno"
then
    have_libavutil=yes
    PKG_CHECK_MODULES([AVUTIL], [libavutil],, [have_libavutil=no]);
fi

AM_CONDITIONAL([ENABLE_AVUTIL], [test "x${have_libavutil}" = "xyes"])

#
# libswscale
#

have_libswscale=disabled
AC_ARG_WITH([libswscale],
            [AS_HELP_STRING([--with-libswscale],
                            [use libswscale when encoding video @<:@default=check@:>@])],
            [],
            [with_libswscale=check])

if test "x$with_libswscale" != "xno"
then
    have_libswscale=yes
    PKG_CHECK_MODULES([SWSCALE], [libswscale],, [have_libswscale=no]);
fi

AM_CONDITIONAL([ENABLE_SWSCALE], [test "x${have_libswscale}" = "xyes"])

#
# libssl
#

have_ssl=disabled
SSL_LIBS=
AC_ARG_WITH([ssl],
            [AS_HELP_STRING([--with-ssl],
                            [support SSL encryption @<:@default=check@:>@])],
            [],
            [with_ssl=check])

if test "x$with_ssl" != "xno"
then
    have_ssl=yes

    AC_CHECK_HEADER(openssl/ssl.h,, [have_ssl=no])
    AC_CHECK_LIB([ssl], [SSL_CTX_new], [SSL_LIBS="$SSL_LIBS -lssl -lcrypto"], [have_ssl=no])

    if test "x${have_ssl}" = "xno"
    then
        AC_MSG_WARN([
  --------------------------------------------
   Unable to find libssl.
   guacd will not support SSL connections.
  --------------------------------------------])
    else
        AC_DEFINE([ENABLE_SSL],, [Whether SSL-related support is enabled])

        # OpenSSL 1.1 accessor function for DSA signature values
        AC_CHECK_DECL([DSA_SIG_get0],
            [AC_DEFINE([HAVE_DSA_SIG_GET0],,
                       [Whether libssl provides DSA_SIG_get0()])],,
            [#include <openssl/dsa.h>])

        # OpenSSL 1.1 accessor function for DSA public key parameters
        AC_CHECK_DECL([DSA_get0_pqg],
            [AC_DEFINE([HAVE_DSA_GET0_PQG],,
                       [Whether libssl provides DSA_get0_pqg()])],,
            [#include <openssl/dsa.h>])

        # OpenSSL 1.1 accessor function for DSA public/private key values
        AC_CHECK_DECL([DSA_get0_key],
            [AC_DEFINE([HAVE_DSA_GET0_KEY],,
                       [Whether libssl provides DSA_get0_key()])],,
            [#include <openssl/dsa.h>])

        # OpenSSL 1.1 accessor function for RSA public/private key values
        AC_CHECK_DECL([RSA_get0_key],
            [AC_DEFINE([HAVE_RSA_GET0_KEY],,
                       [Whether libssl provides RSA_get0_key()])],,
            [#include <openssl/rsa.h>])

        # OpenSSL 1.1 does away with explicit threading callbacks
        AC_MSG_CHECKING([whether libssl requires threading callbacks])
        AC_COMPILE_IFELSE([AC_LANG_SOURCE([[

            #include <openssl/opensslv.h>

            #if OPENSSL_VERSION_NUMBER < 0x10100000L
            #error Threading callbacks required.
            #endif

            int main() {
                return 0;
            }

          ]])],
          [AC_MSG_RESULT([no])],
          [AC_MSG_RESULT([yes])
           AC_DEFINE([OPENSSL_REQUIRES_THREADING_CALLBACKS],,
                     [Whether OpenSSL requires explicit threading callbacks for threadsafety])])

    fi
fi

AM_CONDITIONAL([ENABLE_SSL], [test "x${have_ssl}" = "xyes"])
AC_SUBST(SSL_LIBS)

#
# Winsock
#

have_winsock=disabled
WINSOCK_LIBS=
AC_ARG_WITH([winsock],
            [AS_HELP_STRING([--with-winsock],
                            [support Windows Sockets API @<:@default=check@:>@])],
            [],
            [with_winsock=check])

if test "x$with_winsock" != "xno"
then
    have_winsock=yes
    AC_CHECK_LIB([wsock32], [main],
                 [WINSOCK_LIBS="-lwsock32"]
                 [AC_DEFINE([ENABLE_WINSOCK],,
                            [Whether Windows Socket API support is enabled])],
                 [have_winsock=no])
fi

AM_CONDITIONAL([ENABLE_WINSOCK], [test "x${have_winsock}" = "xyes"])
AC_SUBST(WINSOCK_LIBS)

#
# Ogg Vorbis
#

have_vorbis=disabled
VORBIS_LIBS=
AC_ARG_WITH([vorbis],
            [AS_HELP_STRING([--with-vorbis],
                            [support Ogg Vorbis @<:@default=check@:>@])],
            [],
            [with_vorbis=check])

if test "x$with_vorbis" != "xno"
then
    have_vorbis=yes

    AC_CHECK_HEADER(vorbis/vorbisenc.h,, [have_vorbis=no])
    AC_CHECK_LIB([ogg], [ogg_stream_init], [VORBIS_LIBS="$VORBIS_LIBS -logg"], [have_vorbis=no])
    AC_CHECK_LIB([vorbis], [vorbis_block_init], [VORBIS_LIBS="$VORBIS_LIBS -lvorbis"], [have_vorbis=no])
    AC_CHECK_LIB([vorbisenc], [vorbis_encode_init], [VORBIS_LIBS="$VORBIS_LIBS -lvorbisenc"], [have_vorbis=no])

    if test "x${have_vorbis}" = "xno"
    then
        AC_MSG_WARN([
  --------------------------------------------
   Unable to find libogg / libvorbis / libvorbisenc.
   Sound will not be encoded with Ogg Vorbis.
  --------------------------------------------])
    else
        AC_DEFINE([ENABLE_OGG],,
                  [Whether support for Ogg Vorbis is enabled])
    fi
fi

AM_CONDITIONAL([ENABLE_OGG], [test "x${have_vorbis}" = "xyes"])
AC_SUBST(VORBIS_LIBS)

#
# PulseAudio
#

have_pulse=disabled
PULSE_LIBS=
AC_ARG_WITH([pulse],
            [AS_HELP_STRING([--with-pulse],
                            [support PulseAudio @<:@default=check@:>@])],
            [],
            [with_pulse=check])

if test "x$with_pulse" != "xno"
then
    have_pulse=yes

    AC_CHECK_LIB([pulse], [pa_context_new], [PULSE_LIBS="$PULSE_LIBS -lpulse"], [have_pulse=no])

    if test "x${have_pulse}" = "xno"
    then
        AC_MSG_WARN([
  --------------------------------------------
   Unable to find libpulse
   Sound support for VNC will be disabled
  --------------------------------------------])
    else
        AC_DEFINE([ENABLE_PULSE],, [Whether PulseAudio support is enabled])
    fi
fi

AM_CONDITIONAL([ENABLE_PULSE], [test "x${have_pulse}" = "xyes"])
AC_SUBST(PULSE_LIBS)

#
# PANGO
#

have_pango=disabled
AC_ARG_WITH([pango],
            [AS_HELP_STRING([--with-pango],
                            [support Pango text layout @<:@default=check@:>@])],
            [],
            [with_pango=check])

if test "x$with_pango" != "xno"
then
    have_pango=yes
    PKG_CHECK_MODULES([PANGO], [pango],, [have_pango=no]);
    PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo],, [have_pango=no]);
fi

#
# Terminal emulator
#

have_terminal=disabled
AC_ARG_WITH([terminal],
            [AS_HELP_STRING([--with-terminal],
                            [support text-based protocols @<:@default=check@:>@])],
            [],
            [with_terminal=check])

if test "x$with_terminal" != "xno"
then
    have_terminal=yes
    if test "x${have_pango}" != "xyes"
    then
        have_terminal=no
    fi
fi

AM_CONDITIONAL([ENABLE_TERMINAL], [test "x${have_terminal}" = "xyes"])

#
# libVNCServer
#

have_libvncserver=disabled
VNC_LIBS=
AC_ARG_WITH([vnc],
            [AS_HELP_STRING([--with-vnc],
                            [support VNC @<:@default=check@:>@])],
            [],
            [with_vnc=check])

if test "x$with_vnc" != "xno"
then
    have_libvncserver=yes
    AC_CHECK_LIB([vncclient], [rfbInitClient], [VNC_LIBS="$VNC_LIBS -lvncclient"], [have_libvncserver=no])
fi

AM_CONDITIONAL([ENABLE_VNC], [test "x${have_libvncserver}" = "xyes"])
AC_SUBST(VNC_LIBS)

#
# Repeater support within libVNCServer
#

if test "x${have_libvncserver}" = "xyes"
then

    have_vnc_repeater=yes
    AC_CHECK_MEMBERS([rfbClient.destHost, rfbClient.destPort],
                     [], [have_vnc_repeater=no],
                      [[#include <rfb/rfbclient.h>]])

    if test "x${have_vnc_repeater}" = "xno"
    then
        AC_MSG_WARN([
      --------------------------------------------
       No repeater support found in libvncclient.
       Support for VNC repeaters will not be built.
      --------------------------------------------])
    else
        AC_DEFINE([ENABLE_VNC_REPEATER],,
                  [Whether support for VNC repeaters is enabled.])
    fi

fi

#
# Listening support within libVNCServer
#

if test "x${have_libvncserver}" = "xyes"
then

    have_vnc_listen=yes
    AC_CHECK_DECL([listenForIncomingConnectionsNoFork],
                  [], [have_vnc_listen=no],
                  [[#include <rfb/rfbclient.h>]])

    if test "x${have_vnc_listen}" = "xno"
    then
        AC_MSG_WARN([
      --------------------------------------------
       No listening support found in libvncclient.
       Support for listen-mode connections will not be built.
      --------------------------------------------])
    else
        AC_DEFINE([ENABLE_VNC_LISTEN],,
                  [Whether support for listen-mode VNC connections is enabled.])
    fi

fi

#
# FreeRDP
#

have_freerdp=disabled
RDP_LIBS=
AC_ARG_WITH([rdp],
            [AS_HELP_STRING([--with-rdp],
                            [support RDP @<:@default=check@:>@])],
            [],
            [with_rdp=check])

if test "x$with_rdp" != "xno"
then
    have_winpr=yes
    have_freerdp=yes
    legacy_freerdp_extensions=no
    rdpsettings_interface=unknown
    rdpsettings_audiocapture=yes
    rdpsettings_audioplayback=yes
    rdpsettings_deviceredirection=yes
    freerdp_interface=unknown
    event_interface=unknown

    # libfreerdp-core / libfreerdp
    AC_CHECK_LIB([freerdp-core], [freerdp_new],
                 [RDP_LIBS="$RDP_LIBS -lfreerdp-core"],
                 [AC_CHECK_LIB([freerdp], [freerdp_new],
                               [RDP_LIBS="$RDP_LIBS -lfreerdp -lfreerdp-client"],
                               [AC_MSG_WARN([
  --------------------------------------------
   Unable to find libfreerdp-core / libfreerdp
   RDP will be disabled.
  --------------------------------------------])
                  have_freerdp=no])])
fi


# libfreerdp-cache
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_LIB([freerdp-cache], [glyph_cache_register_callbacks],
                 [RDP_LIBS="$RDP_LIBS -lfreerdp-cache"])
fi

# libfreerdp-channels (1.0) / libfreerdp-client + libfreerdp-core (1.1)
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_LIB([freerdp-client], [freerdp_channels_new],
                 [RDP_LIBS="$RDP_LIBS -lfreerdp-client"],
                 [AC_CHECK_LIB([freerdp-channels], [freerdp_channels_new],
                               [RDP_LIBS="$RDP_LIBS -lfreerdp-channels"
                               legacy_freerdp_extensions=yes])],
                 [-lfreerdp-core])
fi

# libfreerdp-utils
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_LIB([freerdp-utils], [svc_plugin_init],
                 [RDP_LIBS="$RDP_LIBS -lfreerdp-utils"])
fi

# libfreerdp-codec
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_LIB([freerdp-codec], [freerdp_image_convert],
                 [RDP_LIBS="$RDP_LIBS -lfreerdp-codec"])
fi

# Available color conversion functions
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_DECL([freerdp_convert_gdi_order_color],
        [AC_DEFINE([HAVE_FREERDP_CONVERT_GDI_ORDER_COLOR],,
                   [Whether freerdp_convert_gdi_order_color() is defined])],,
        [#include <freerdp/codec/color.h>])

    AC_CHECK_DECL([freerdp_color_convert_drawing_order_color_to_gdi_color],
        [AC_DEFINE([HAVE_FREERDP_COLOR_CONVERT_DRAWING_ORDER_COLOR_TO_GDI_COLOR],,
                   [Whether freerdp_color_convert_drawing_order_color_to_gdi_color() is defined])],,
        [#include <freerdp/codec/color.h>])
fi

# Check for interval polling in plugins
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_MEMBERS([rdpSvcPlugin.interval_ms],,,
                     [[#include <freerdp/utils/svc_plugin.h>]])
fi

# Keyboard layout header
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_HEADERS([freerdp/locale/keyboard.h],,
                      [AC_CHECK_HEADERS([freerdp/kbd/layouts.h],,
                                       [AC_MSG_WARN([
  --------------------------------------------
   Unable to find keyboard layout headers
   RDP will be disabled.
  --------------------------------------------])
                                        have_freerdp=no])])
fi

# New headers defining addins
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_HEADERS([freerdp/addin.h freerdp/client/channels.h])
fi

# Header defining cliprdr
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_HEADERS([freerdp/client/cliprdr.h],,
                     [AC_CHECK_HEADERS([freerdp/plugins/cliprdr.h],,
                                       [AC_MSG_WARN([
  --------------------------------------------
   Unable to find cliprdr headers
   RDP will be disabled.
  --------------------------------------------])
                                        have_freerdp=no],
                                       [#include <freerdp/types.h>])],
                     [#include <winpr/wtypes.h>
                      #include <winpr/collections.h>])
fi

# Header defining display update channel
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_HEADERS([freerdp/client/disp.h],
                     [AC_DEFINE([HAVE_FREERDP_DISPLAY_UPDATE_SUPPORT],,
                                [Whether FreeRDP supports the display update channel])]
                     [AC_CHECK_MEMBERS([rdpSettings.SupportDisplayControl],,,
                                       [[#include <freerdp/freerdp.h>]])],,
                     [#include <winpr/wtypes.h>
                      #include <winpr/collections.h>])
fi

# Support for RDP gateways 
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_MEMBERS([rdpSettings.GatewayEnabled],
                     [AC_DEFINE([HAVE_FREERDP_GATEWAY_SUPPORT],,
                                [Whether FreeRDP supports RDP gateways])],,
                     [[#include <freerdp/freerdp.h>]])
fi

# Support for load balancing via connection brokers 
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_MEMBERS([rdpSettings.LoadBalanceInfo],
                     [AC_DEFINE([HAVE_FREERDP_LOAD_BALANCER_SUPPORT],,
                                [Whether FreeRDP supports load balancers])],,
                     [[#include <freerdp/freerdp.h>]])
fi

# Support for "PubSub" event system
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_DECL([PubSub_SubscribeChannelConnected],
        [AC_DEFINE([HAVE_FREERDP_EVENT_PUBSUB],,
                   [Whether this version of FreeRDP provides the PubSub event system])],,
        [#include <freerdp/event.h>])
fi

# Addin registration variations
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_DECL([freerdp_register_addin_provider],
        [AC_DEFINE([HAVE_FREERDP_REGISTER_ADDIN_PROVIDER],,
                   [Whether freerdp_register_addin_provider() is defined])],,
        [#include <freerdp/addin.h>])

    AC_CHECK_DECL([freerdp_channels_global_init],
        [AC_DEFINE([HAVE_FREERDP_CHANNELS_GLOBAL_INIT],,
                   [Whether freerdp_channels_global_init() is defined])],,
        [#include <freerdp/channels/channels.h>])
fi

# Availability of ADDIN_ARGV structure for configuring plugins
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_TYPE([ADDIN_ARGV],
        [AC_DEFINE([HAVE_ADDIN_ARGV],,
                   [Whether the ADDIN_ARGV type is available])],,
        [#include <freerdp/settings.h>])
fi

#
# FreeRDP: WinPR
#

# Check for stream support via WinPR
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_HEADER(winpr/stream.h,,
                    [have_winpr=no,
                     AC_CHECK_DECL([stream_write_uint8],,
                                  [AC_MSG_WARN([
  --------------------------------------------
   Unable to find stream support
   RDP will be disabled.
  --------------------------------------------])
                                   have_freerdp=no],
                                  [#include <freerdp/utils/stream.h>])])
fi

# Check for types in WinPR
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_HEADER(winpr/wtypes.h,,
                    [have_winpr=no,
                     AC_CHECK_HEADER(freerdp/types.h,,
                                     [AC_MSG_WARN([
  --------------------------------------------
   Unable to find type definitions
   RDP will be disabled.
  --------------------------------------------])
                                      have_freerdp=no])])
fi

if test "x${have_freerdp}" = "xyes" -a "x${have_winpr}" = "xyes"
then
    AC_DEFINE([ENABLE_WINPR],,
              [Whether library support for WinPR types was found])
fi

#
# FreeRDP: freerdp 
#

if test "x${have_freerdp}" = "xyes"
then
    # Check for current (as of 1.1) freerdp interface
    AC_CHECK_MEMBERS([freerdp.ContextSize],
                     [freerdp_interface=stable],,
                     [[#include <freerdp/freerdp.h>]])

    # If not current, check for legacy interface
    if test "x${freerdp_interface}" = "xunknown"
    then
        AC_CHECK_MEMBERS([freerdp.context_size],
                         [freerdp_interface=legacy],,
                         [[#include <freerdp/freerdp.h>]])
    fi

    # Set defines based on interface type, warn if unknown
    if test "x${freerdp_interface}" = "xlegacy"; then
        AC_DEFINE([LEGACY_FREERDP],,
                  [Whether the older version of the FreeRDP API was found])
    elif test "x${freerdp_interface}" = "xunknown"; then
        AC_MSG_WARN([
  --------------------------------------------
   Unknown FreeRDP interface
   RDP will be disabled.
  --------------------------------------------])
        have_freerdp=no
    fi
fi

#
# FreeRDP: rdpSettings
#

if test "x${have_freerdp}" = "xyes"
then
    # Check for current (as of 1.1) rdpSettings interface
    AC_CHECK_MEMBERS([rdpSettings.Width,
                      rdpSettings.Height,
                      rdpSettings.FastPathInput,
                      rdpSettings.FastPathOutput,
                      rdpSettings.SendPreconnectionPdu,
                      rdpSettings.OrderSupport],
                     [rdpsettings_interface=stable],,
                     [[#include <freerdp/freerdp.h>]])

    # If not current, check for legacy interface
    if test "x${rdpsettings_interface}" = "xunknown"
    then
        AC_CHECK_MEMBERS([rdpSettings.width,
                          rdpSettings.height,
                          rdpSettings.order_support],
                         [rdpsettings_interface=legacy],,
                         [[#include <freerdp/freerdp.h>]])
    fi

    # Set defines based on interface type, warn if unknown
    if test "x${rdpsettings_interface}" = "xlegacy"; then
        AC_DEFINE([LEGACY_RDPSETTINGS],,
                  [Whether the legacy version of the rdpSettings API was found])

        # Legacy interface may not have AudioPlayback settings
        AC_CHECK_MEMBERS([rdpSettings.audio_playback],,
                         [rdpsettings_audioplayback=no],
                         [[#include <freerdp/freerdp.h>]])

        # Legacy interface may not have AudioCapture settings
        AC_CHECK_MEMBERS([rdpSettings.audio_capture],,
                         [rdpsettings_audiocapture=no],
                         [[#include <freerdp/freerdp.h>]])

        # Legacy interface may not have DeviceRedirection settings
        AC_CHECK_MEMBERS([rdpSettings.device_redirection],,
                         [rdpsettings_deviceredirection=no],
                         [[#include <freerdp/freerdp.h>]])

    elif test "x${rdpsettings_interface}" = "xunknown"; then
        AC_MSG_WARN([
  --------------------------------------------
   Unknown rdpSettings interface
   RDP will be disabled.
  --------------------------------------------]) 
        have_freerdp=no
    fi
fi

# Activate audio playback settings if present
if test "x${have_freerdp}" = "xyes" -a "x${rdpsettings_audioplayback}" = "xyes"; then
    AC_DEFINE([HAVE_RDPSETTINGS_AUDIOPLAYBACK],,
              [Whether the rdpSettings structure has AudioPlayback settings])
fi

# Activate audio capture settings if present
if test "x${have_freerdp}" = "xyes" -a "x${rdpsettings_audiocapture}" = "xyes"; then
    AC_DEFINE([HAVE_RDPSETTINGS_AUDIOCAPTURE],,
              [Whether the rdpSettings structure has AudioCapture settings])
fi

# Activate device redirection settings if present
if test "x${have_freerdp}" = "xyes" -a "x${rdpsettings_deviceredirection}" = "xyes"; then
    AC_DEFINE([HAVE_RDPSETTINGS_DEVICEREDIRECTION],,
              [Whether the rdpSettings structure has DeviceRedirection settings])
fi

# Check if the type CHANNEL_ENTRY_POINTS_FREERDP exists, if not define it to CHANNEL_ENTRY_POINTS_EX
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_TYPE([CHANNEL_ENTRY_POINTS_FREERDP],,
                  AC_DEFINE([CHANNEL_ENTRY_POINTS_FREERDP],[CHANNEL_ENTRY_POINTS_EX], [Type compatibility]),
                  [[#include <freerdp/svc.h>]])
fi

# Check if the freerdp version header exists
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_HEADERS([freerdp/version.h])
fi

#
# FreeRDP: rdpBitmap
#

if test "x${have_freerdp}" = "xyes"
then
    AC_MSG_CHECKING([whether rdpBitmap.Decompress() requires the codec_id])
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <winpr/wtypes.h>
                                        #include <freerdp/freerdp.h>
                                        void __decompress(rdpContext* context,
                                                          rdpBitmap* bitmap,
                                                          UINT8* data,
                                                          int width,
                                                          int height,
                                                          int bpp,
                                                          int length,
                                                          BOOL compressed,
                                                          int codec_id);
                                        rdpBitmap b = { .Decompress = __decompress };]])],
                      [AC_MSG_RESULT([yes])],
                      [AC_MSG_RESULT([no])
                       AC_DEFINE([LEGACY_RDPBITMAP],,
                                 [Whether the legacy rdpBitmap API was found])])
fi

#
# FreeRDP: IWTSVirtualChannelCallback
#

if test "x${have_freerdp}" = "xyes"
then
    AC_MSG_CHECKING([whether IWTSVirtualChannelCallback.OnDataReceived() uses a wStream])
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <winpr/wtypes.h>
                                        #include <freerdp/dvc.h>
                                        #include <freerdp/freerdp.h>
                                        int __data_received(
                                            IWTSVirtualChannelCallback* channel_callback,
                                            wStream* stream);
                                        IWTSVirtualChannelCallback cb = {
                                            .OnDataReceived = __data_received
                                        };
                                        int main() {
                                            return
                                                cb.OnDataReceived(NULL, NULL);
                                        }]])],
                      [AC_MSG_RESULT([yes])],
                      [AC_MSG_RESULT([no])
                       AC_DEFINE([LEGACY_IWTSVIRTUALCHANNELCALLBACK],,
                                 [Whether the legacy IWTSVirtualChannelCallback API was found])])
fi

#
# FreeRDP: Decompression function variants
#

# Check whether interleaved_decompress() can handle the palette
if test "x${have_freerdp}" = "xyes"
then
    AC_MSG_CHECKING([whether interleaved_decompress() accepts an additional palette parameter])
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <freerdp/codec/interleaved.h>

                                        int main() {
                                            BYTE* palette = NULL;
                                            interleaved_decompress(NULL, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, palette);
                                        }]])],
                      [AC_MSG_RESULT([yes])
                       AC_DEFINE([INTERLEAVED_DECOMPRESS_TAKES_PALETTE],,
                                 [Whether interleaved_decompress() accepts an additional palette parameter])],
                      [AC_MSG_RESULT([no])])
fi

# Check whether planar_decompress() will handle flipping
if test "x${have_freerdp}" = "xyes"
then
    AC_MSG_CHECKING([whether planar_decompress() can flip])
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <freerdp/codec/planar.h>

                                        int main() {
                                            BOOL* flip = TRUE;
                                            planar_decompress(NULL, NULL, 0, NULL, 0, 0, 0, 0, 0, 0, flip);
                                        }]])],
                      [AC_MSG_RESULT([yes])
                       AC_DEFINE([PLANAR_DECOMPRESS_CAN_FLIP],,
                                 [Whether planar_decompress() can flip])],
                      [AC_MSG_RESULT([no])])
fi

#
# FreeRDP: rdpContext
#

# Check for rdpContext.codecs
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_MEMBERS([rdpContext.codecs],
                     [AC_DEFINE([FREERDP_BITMAP_REQUIRES_ALIGNED_MALLOC],,
                                [Whether this version of FreeRDP requires _aligned_malloc() for bitmap data])],,
                     [[#include <freerdp/freerdp.h>]])
fi

#
# FreeRDP: rdpPalette
#

if test "x${have_freerdp}" = "xyes"
then
    AC_MSG_CHECKING([whether rdpPalette.entries is static])
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <freerdp/update.h>
                                        rdpPalette p;
                                        PALETTE_ENTRY* foo = p.entries;]])],
                      [AC_MSG_RESULT([yes])],
                      [AC_MSG_RESULT([no])
                       AC_DEFINE([LEGACY_RDPPALETTE],,
                                 [Whether the legacy rdpPalette API was found])])
fi

#
# FreeRDP: rdpPointer
#

# Check for SetDefault and SetNull members of rdpPointer
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_MEMBERS([rdpPointer.SetDefault,
                      rdpPointer.SetNull],
                     ,,
                     [[#include <freerdp/freerdp.h>]])
fi

#
# FreeRDP: wMessage / RDP_EVENT
#

# Check for current (as of 1.1) wMessage interface
if test "x${have_freerdp}" = "xyes"
then
    AC_CHECK_MEMBERS([wMessage.id],
                     [event_interface=stable],,
                     [[#include <winpr/collections.h>]])

    # If not current, check for legacy (RDP_EVENT) interface
    if test "x${event_interface}" = "xunknown"
    then
        AC_CHECK_MEMBERS([RDP_EVENT.event_class],
                         [event_interface=legacy],,
                         [[#include <freerdp/types.h>]])
    fi

    # Set defines based on interface type, warn if unknown
    if test "x${event_interface}" = "xlegacy"; then
        AC_DEFINE([LEGACY_EVENT],,
                  [Whether the legacy RDP_EVENT API was found])
    elif test "x${event_interface}" = "xunknown"; then
        AC_MSG_WARN([
  --------------------------------------------
   Unknown event interface
   RDP will be disabled.
  --------------------------------------------])
        have_freerdp=no
    fi
fi

AM_CONDITIONAL([LEGACY_FREERDP_EXTENSIONS], [test "x${legacy_freerdp_extensions}" = "xyes"])
AM_CONDITIONAL([ENABLE_WINPR], [test "x${have_winpr}"   = "xyes"])
AM_CONDITIONAL([ENABLE_RDP],   [test "x${have_freerdp}" = "xyes"])

AC_SUBST(RDP_LIBS)

#
# libssh2
#

have_libssh2=disabled
SSH_LIBS=
AC_ARG_WITH([ssh],
            [AS_HELP_STRING([--with-ssh],
                            [support SSH @<:@default=check@:>@])],
            [],
            [with_ssh=check])

AC_ARG_ENABLE(ssh_agent,
              [AS_HELP_STRING([--enable-ssh-agent],
                              [enable built-in ssh-agent])
              ],enable_ssh_agent=yes)

if test "x$with_ssh" != "xno"
then
    have_libssh2=yes

    AC_CHECK_LIB([ssh2], [libssh2_session_init_ex],
                         [SSH_LIBS="$SSH_LIBS -lssh2"],
                         [have_libssh2=no])
fi

AM_CONDITIONAL([ENABLE_COMMON_SSH], [test "x${have_libssh2}"  = "xyes" \
                                       -a "x${have_ssl}"      = "xyes"])
AM_COND_IF([ENABLE_COMMON_SSH],
           [AC_DEFINE([ENABLE_COMMON_SSH],,
                      [Whether support for the common SSH core is enabled])])

AM_CONDITIONAL([ENABLE_SSH], [test "x${have_libssh2}"  = "xyes" \
                                -a "x${have_terminal}" = "xyes" \
                                -a "x${have_ssl}"      = "xyes"])

AC_SUBST(SSH_LIBS)

#
# Underlying crypto library usage of libssh2
#

if test "x${have_libssh2}" = "xyes"
then

    # Whether libssh2 was built against libgcrypt
    AC_CHECK_LIB([ssh2], [gcry_control],
                         [AC_CHECK_HEADER(gcrypt.h,
                                          [AC_DEFINE([LIBSSH2_USES_GCRYPT],,
                                                     [Whether libssh2 was built against libgcrypt])],
                                          [AC_MSG_WARN([
  --------------------------------------------
   libssh2 appears to be built against libgcrypt, but the libgcrypt headers
   could not be found. SSH will be disabled.
  --------------------------------------------])
                                           have_libssh2=no])])

fi

#
# Agent forwarding support within libssh2
#

have_ssh_agent=no
if test "x${have_libssh2}" = "xyes" -a "x${enable_ssh_agent}" = "xyes"
then

    AC_CHECK_DECL([libssh2_channel_request_auth_agent],
                  [have_ssh_agent=yes], [],
                  [[#include <libssh2.h>]])

    if test "x${have_ssh_agent}" = "xno"
    then
        AC_MSG_ERROR([
      --------------------------------------------
       Agent forwarding support was requested but no such support was found
       in libssh2.
      --------------------------------------------])
    else
        AC_DEFINE([ENABLE_SSH_AGENT],,
                  [Whether agent forwarding support for SSH is enabled])
    fi

fi

AM_CONDITIONAL([ENABLE_SSH_AGENT],
	   [test "x${have_ssh_agent}"   = "xyes" \
	      -a "x${enable_ssh_agent}" = "xyes"])

#
# libtelnet
#

have_libtelnet=disabled
TELNET_LIBS=
AC_ARG_WITH([telnet],
            [AS_HELP_STRING([--with-telnet],
                            [support Telnet @<:@default=check@:>@])],
            [],
            [with_telnet=check])

if test "x$with_telnet" != "xno"
then
    have_libtelnet=yes
    AC_CHECK_LIB([telnet], [telnet_init],
                           [TELNET_LIBS="$TELNET_LIBS -ltelnet"],
                           [have_libtelnet=no])
fi

AM_CONDITIONAL([ENABLE_TELNET], [test "x${have_libtelnet}"  = "xyes" \
                                   -a "x${have_terminal}" = "xyes"])

AC_SUBST(TELNET_LIBS)

#
# libwebp
#

have_webp=disabled
WEBP_LIBS=
AC_ARG_WITH([webp],
            [AS_HELP_STRING([--with-webp],
                            [support WebP image encoding @<:@default=check@:>@])],
            [],
            [with_webp=check])

if test "x$with_webp" != "xno"
then
    have_webp=yes

    AC_CHECK_HEADER(webp/encode.h,, [have_webp=no])
    AC_CHECK_LIB([webp], [WebPEncode], [WEBP_LIBS="$WEBP_LIBS -lwebp"], [have_webp=no])

    if test "x${have_webp}" = "xno"
    then
        AC_MSG_WARN([
  --------------------------------------------
   Unable to find libwebp.
   Images will not be encoded using WebP.
  --------------------------------------------])
    else
        AC_DEFINE([ENABLE_WEBP],, [Whether WebP support is enabled])
    fi
fi

AM_CONDITIONAL([ENABLE_WEBP], [test "x${have_webp}" = "xyes"])
AC_SUBST(WEBP_LIBS)

#
# guacd
#

AC_ARG_ENABLE([guacd],
              [AS_HELP_STRING([--disable-guacd],
                              [do not build the Guacamole proxy daemon])],
              [],
              [enable_guacd=yes])

AM_CONDITIONAL([ENABLE_GUACD], [test "x${enable_guacd}"  = "xyes"])

#
# guacenc
#

AC_ARG_ENABLE([guacenc],
              [AS_HELP_STRING([--disable-guacenc],
                              [do not build the Guacamole video encoding tool])],
              [],
              [enable_guacenc=yes])

AM_CONDITIONAL([ENABLE_GUACENC], [test "x${enable_guacenc}"  = "xyes" \
                                    -a "x${have_libavcodec}" = "xyes" \
                                    -a "x${have_libavutil}"  = "xyes" \
                                    -a "x${have_libswscale}" = "xyes"])

#
# guaclog
#

AC_ARG_ENABLE([guaclog],
              [AS_HELP_STRING([--disable-guaclog],
                              [do not build the Guacamole input logging tool])],
              [],
              [enable_guaclog=yes])

AM_CONDITIONAL([ENABLE_GUACLOG], [test "x${enable_guaclog}"  = "xyes"])

#
# Output Makefiles
#

AC_CONFIG_FILES([Makefile
                 doc/Doxyfile
                 tests/Makefile
                 src/common/Makefile
                 src/common-ssh/Makefile
                 src/terminal/Makefile
                 src/libguac/Makefile
                 src/guacd/Makefile
                 src/guacd/man/guacd.8
                 src/guacd/man/guacd.conf.5
                 src/guacenc/Makefile
                 src/guacenc/man/guacenc.1
                 src/guaclog/Makefile
                 src/guaclog/man/guaclog.1
                 src/pulse/Makefile
                 src/protocols/rdp/Makefile
                 src/protocols/ssh/Makefile
                 src/protocols/telnet/Makefile
                 src/protocols/vnc/Makefile])
AC_OUTPUT

#
# Protocol build status
#

AM_COND_IF([ENABLE_RDP],    [build_rdp=yes],    [build_rdp=no])
AM_COND_IF([ENABLE_SSH],    [build_ssh=yes],    [build_ssh=no])
AM_COND_IF([ENABLE_TELNET], [build_telnet=yes], [build_telnet=no])
AM_COND_IF([ENABLE_VNC],    [build_vnc=yes],    [build_vnc=no])

#
# Service / tool build status
#

AM_COND_IF([ENABLE_GUACD],   [build_guacd=yes],   [build_guacd=no])
AM_COND_IF([ENABLE_GUACENC], [build_guacenc=yes], [build_guacenc=no])
AM_COND_IF([ENABLE_GUACLOG], [build_guaclog=yes], [build_guaclog=no])

#
# Init scripts
#

AM_COND_IF([ENABLE_INIT], [build_init="${init_dir}"], [build_init=no])

#
# Systemd units
#

AM_COND_IF([ENABLE_SYSTEMD], [build_systemd="${systemd_dir}"], [build_systemd=no])

#
# Display summary
#

echo "
------------------------------------------------
$PACKAGE_NAME version $PACKAGE_VERSION
------------------------------------------------

   Library status:

     freerdp ............. ${have_freerdp}
     pango ............... ${have_pango}
     libavcodec .......... ${have_libavcodec}
     libavutil ........... ${have_libavutil}
     libssh2 ............. ${have_libssh2}
     libssl .............. ${have_ssl}
     libswscale .......... ${have_libswscale}
     libtelnet ........... ${have_libtelnet}
     libVNCServer ........ ${have_libvncserver}
     libvorbis ........... ${have_vorbis}
     libpulse ............ ${have_pulse}
     libwebp ............. ${have_webp}
     wsock32 ............. ${have_winsock}

   Protocol support:

      RDP ....... ${build_rdp}
      SSH ....... ${build_ssh}
      Telnet .... ${build_telnet}
      VNC ....... ${build_vnc}

   Services / tools:

      guacd ...... ${build_guacd}
      guacenc .... ${build_guacenc}
      guaclog .... ${build_guaclog}

   Init scripts: ${build_init}
   Systemd units: ${build_systemd}

Type \"make\" to compile $PACKAGE_NAME.
"

