GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@
+0.20.5
+======
+
+Changes since 0.20.5:
+ - Add some missing G_{BEGIN,END}_DECLS guards.
+ - Fix uninitialized variable use introduced in previous version.
+ - Add simple network device whitelisting infrastructure.
+ - Port gupnp-binding-tool so it's usable with python3.
+ - Minor code fixes.
+ - Fix crashes in NetworkManager context manager during some async calls.
+ - Fix a small memory leak in the unix and windows CM.
+ - Always enable GTest tests.
+ - Upgrade gtk-doc stuff.
+ - Fix the service example in documentation.
+ - Remove the test for inverted arguments in the GUPnPContext tests.
+
+Bugs fixed in this release:
+ - https://bugzilla.gnome.org/show_bug.cgi?id=694454
+ - https://bugzilla.gnome.org/show_bug.cgi?id=704094
+ - https://bugzilla.gnome.org/show_bug.cgi?id=704383
+ - https://bugzilla.gnome.org/show_bug.cgi?id=705712
+ - https://bugzilla.gnome.org/show_bug.cgi?id=706326
+
+All contributors to this release:
+ - Jens Georg <mail@jensge.org>
+ - Ludovic Ferrandis <ludovic.ferrandis@intel.com>
+ - Olivier Crête <olivier.crete@collabora.com>
+ - Bohuslav Kabrda <bkabrda@redhat.com>
+
+0.20.4
+======
+
+Changes since 0.20.3:
+- Fix warnings in gtk-doc run.
+- Some minor improvements to the documentation.
+- Make the user-agent ASCII-only to fix issues with discovery when
+ g_get_application_name () returned a translated string.
+- Force HTTP version to be 1.1 in SOAP requests.
+- Fix potential crashes in XML parsing.
+- Fix potential memory leak in gupnp_service_proxy_send_action_valist.
+- Some codestyle fixes.
+- Add gupnp_device_info_list_dlna_device_class_identifier () to retrieve the
+ content of <dlna:X_DLNADOC> nodes.
+
+Bugs fixed in this release:
+ - https://bugzilla.gnome.org/show_bug.cgi?id=704953
+ - https://bugzilla.gnome.org/show_bug.cgi?id=702555
+ - https://bugzilla.gnome.org/show_bug.cgi?id=704094
+ - https://bugzilla.gnome.org/show_bug.cgi?id=700947
+
+All contributors to this release:
+ Ludovic Ferrandis <ludovic.ferrandis@intel.com>
+ Jens Georg <mail@jensge.org>
+ Sébastien Bianti <sebastien.bianti@linux.intel.com>
+ Bastien Nocera <hadess@hadess.net>
+
0.20.3
======
# compiler: $LTCC
# compiler flags: $LTCFLAGS
# linker: $LD (gnu? $with_gnu_ld)
-# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu2
+# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.2ubuntu1
# automake: $automake_version
# autoconf: $autoconf_version
#
PROGRAM=libtool
PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1ubuntu2"
+VERSION="2.4.2 Debian-2.4.2-1.2ubuntu1"
TIMESTAMP=""
package_revision=1.3337
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for gupnp 0.20.3.
+# Generated by GNU Autoconf 2.69 for gupnp 0.20.5.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=gupnp&component=gupnp>.
#
# Identity of this package.
PACKAGE_NAME='gupnp'
PACKAGE_TARNAME='gupnp'
-PACKAGE_VERSION='0.20.3'
-PACKAGE_STRING='gupnp 0.20.3'
+PACKAGE_VERSION='0.20.5'
+PACKAGE_STRING='gupnp 0.20.5'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=gupnp&component=gupnp'
PACKAGE_URL='http://www.gupnp.org/'
GTHREAD_CFLAGS
LIBGUPNP_LIBS
LIBGUPNP_CFLAGS
-HAVE_GTEST_FALSE
-HAVE_GTEST_TRUE
-GTest_LIBS
-GTest_CFLAGS
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
PKG_CONFIG
PKG_CONFIG
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
-GTest_CFLAGS
-GTest_LIBS
LIBGUPNP_CFLAGS
LIBGUPNP_LIBS
GTHREAD_CFLAGS
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures gupnp 0.20.3 to adapt to many kinds of systems.
+\`configure' configures gupnp 0.20.5 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of gupnp 0.20.3:";;
+ short | recursive ) echo "Configuration of gupnp 0.20.5:";;
esac
cat <<\_ACEOF
directories to add to pkg-config's search path
PKG_CONFIG_LIBDIR
path overriding pkg-config's built-in search path
- GTest_CFLAGS
- C compiler flags for GTest, overriding pkg-config
- GTest_LIBS linker flags for GTest, overriding pkg-config
LIBGUPNP_CFLAGS
C compiler flags for LIBGUPNP, overriding pkg-config
LIBGUPNP_LIBS
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-gupnp configure 0.20.3
+gupnp configure 0.20.5
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by gupnp $as_me 0.20.3, which was
+It was created by gupnp $as_me 0.20.5, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
# Define the identity of the package.
PACKAGE='gupnp'
- VERSION='0.20.3'
+ VERSION='0.20.5'
cat >>confdefs.h <<_ACEOF
;;
*)
lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
else
fi
;;
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
haiku*)
lt_cv_deplibs_check_method=pass_all
;;
;;
# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
lt_cv_deplibs_check_method=pass_all
;;
LD="${LD-ld} -m elf_i386_fbsd"
;;
x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
;;
ppc64-*linux*|powerpc64-*linux*)
LD="${LD-ld} -m elf32ppclinux"
lt_prog_compiler_static='-non_shared'
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
# old Intel for x86_64 which still supported -KPIC.
ecc*)
esac
;;
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
haiku*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
;;
# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking operating system" >&5
+$as_echo_n "checking operating system... " >&6; }
+os_win32=no
+case "$target_os" in
+ mingw*|cygwin*)
+ os_win32=yes
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Win32" >&5
+$as_echo "Win32" >&6; }
+ UUID=
+ ;;
+ darwin*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5
+$as_echo "Darwin" >&6; }
+ UUID=
+ ;;
+ *)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $target_os" >&5
+$as_echo "$target_os" >&6; }
+ UUID=uuid
+ ;;
+esac
+
fi
pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTest" >&5
-$as_echo_n "checking for GTest... " >&6; }
-
-if test -n "$GTest_CFLAGS"; then
- pkg_cv_GTest_CFLAGS="$GTest_CFLAGS"
- elif test -n "$PKG_CONFIG"; then
- if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16\""; } >&5
- ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- pkg_cv_GTest_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.16" 2>/dev/null`
- test "x$?" != "x0" && pkg_failed=yes
-else
- pkg_failed=yes
-fi
- else
- pkg_failed=untried
-fi
-if test -n "$GTest_LIBS"; then
- pkg_cv_GTest_LIBS="$GTest_LIBS"
- elif test -n "$PKG_CONFIG"; then
- if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.16\""; } >&5
- ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.16") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then
- pkg_cv_GTest_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.16" 2>/dev/null`
- test "x$?" != "x0" && pkg_failed=yes
-else
- pkg_failed=yes
-fi
- else
- pkg_failed=untried
-fi
-
-
-
-if test $pkg_failed = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
- _pkg_short_errors_supported=yes
-else
- _pkg_short_errors_supported=no
-fi
- if test $_pkg_short_errors_supported = yes; then
- GTest_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.16" 2>&1`
- else
- GTest_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.16" 2>&1`
- fi
- # Put the nasty error message in config.log where it belongs
- echo "$GTest_PKG_ERRORS" >&5
-
- gtest=no
-elif test $pkg_failed = untried; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- gtest=no
-else
- GTest_CFLAGS=$pkg_cv_GTest_CFLAGS
- GTest_LIBS=$pkg_cv_GTest_LIBS
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- gtest=yes
-fi
- if test x$gtest = xyes; then
- HAVE_GTEST_TRUE=
- HAVE_GTEST_FALSE='#'
-else
- HAVE_GTEST_TRUE='#'
- HAVE_GTEST_FALSE=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking operating system" >&5
-$as_echo_n "checking operating system... " >&6; }
-os_win32=no
-case "$target_os" in
- mingw*|cygwin*)
- os_win32=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Win32" >&5
-$as_echo "Win32" >&6; }
- UUID=
- ;;
- darwin*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Darwin" >&5
-$as_echo "Darwin" >&6; }
- UUID=
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $target_os" >&5
-$as_echo "$target_os" >&6; }
- UUID=uuid
- ;;
-esac
-
-
-pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGUPNP" >&5
$as_echo_n "checking for LIBGUPNP... " >&6; }
if test x$enable_gtk_doc = xyes; then
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.0\""; } >&5
- ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.0") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.14\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.14") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
:
else
- as_fn_error $? "You need to have gtk-doc >= 1.0 installed to build $PACKAGE_NAME" "$LINENO" 5
+ as_fn_error $? "You need to have gtk-doc >= 1.14 installed to build $PACKAGE_NAME" "$LINENO" 5
fi
if test "x$PACKAGE_NAME" != "xglib"; then
as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${HAVE_GTEST_TRUE}" && test -z "${HAVE_GTEST_FALSE}"; then
- as_fn_error $? "conditional \"HAVE_GTEST\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then
as_fn_error $? "conditional \"OS_WIN32\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by gupnp $as_me 0.20.3, which was
+This file was extended by gupnp $as_me 0.20.5, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-gupnp config.status 0.20.3
+gupnp config.status 0.20.5
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
AC_PREREQ([2.64])
AC_INIT([gupnp],
- [0.20.3],
+ [0.20.5],
[http://bugzilla.gnome.org/enter_bug.cgi?product=gupnp&component=gupnp],
[gupnp],
[http://www.gupnp.org/])
LT_INIT
-PKG_CHECK_MODULES(GTest, glib-2.0 >= 2.16, [gtest=yes], [gtest=no])
-AM_CONDITIONAL(HAVE_GTEST, [test x$gtest = xyes])
-
AC_MSG_CHECKING([operating system])
os_win32=no
case "$target_os" in
AM_CONDITIONAL([HAVE_VAPIGEN], [test "x$VAPIGEN" != "x"])
# Gtk-doc
-GTK_DOC_CHECK([1.0])
+GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
AC_CONFIG_FILES([
Makefile
# The name of the module, e.g. 'glib'.
DOC_MODULE=gupnp
+# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
+#DOC_MODULE_VERSION=2
+
+
# The top-level SGML file. You can change this if you want to.
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.xml
-# The directory containing the source code. Relative to $(srcdir).
-# gtk-doc will search all .c & .h files beneath here for inline comments
-# documenting the functions and macros.
-# e.g. DOC_SOURCE_DIR=../../../gtk
+# Directories containing the source code.
+# gtk-doc will search all .c and .h files beneath these paths
+# for inline comments documenting functions and macros.
+# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk
DOC_SOURCE_DIR=../libgupnp
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
SCANGOBJ_OPTIONS=
# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
SCAN_OPTIONS=--deprecated-guards="GUPNP_DISABLE_DEPRECATED"
# Extra options to supply to gtkdoc-mkdb.
-# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
-MKDB_OPTIONS=--sgml-mode --output-format=xml
+# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
+MKDB_OPTIONS=--xml-mode --output-format=xml
# Extra options to supply to gtkdoc-mktmpl
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
MKTMPL_OPTIONS=
+# Extra options to supply to gtkdoc-mkhtml
+MKHTML_OPTIONS=
+
# Extra options to supply to gtkdoc-fixref. Not normally needed.
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
FIXXREF_OPTIONS=
HFILE_GLOB=$(top_srcdir)/libgupnp/*.h
CFILE_GLOB=$(top_srcdir)/libgupnp/*.c
-# Header files to ignore when scanning.
-# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
+# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
+EXTRA_HFILES=
+
+# Header files or dirs to ignore when scanning. Use base file/dir names
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
IGNORE_HFILES=gena-protocol.h \
xml-util.h \
gvalue-util.h \
http-headers.h \
gupnp-marshal.h \
gupnp-context-private.h \
+ gupnp-linux-context-manager.h \
gupnp-network-manager.h \
gupnp-unix-context-manager.h \
gupnp-device-info-private.h \
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
# signals and properties.
-# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
-INCLUDES=-I$(top_srcdir) $(LIBGUPNP_CFLAGS)
+GTKDOC_CFLAGS=-I$(top_srcdir) $(LIBGUPNP_CFLAGS)
GTKDOC_LIBS=$(top_builddir)/libgupnp/libgupnp-1.0.la $(LIBGUPNP_LIBS)
# This includes the standard gtk-doc make rules, copied by gtkdocize.
# Other files to distribute
# e.g. EXTRA_DIST += version.xml.in
EXTRA_DIST += version.xml.in
+
+# Files not to distribute
+# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
+# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
+#DISTCLEANFILES +=
+
+# Comment this out if you want 'make check' to test you doc status
+# and run some sanity checks
+if ENABLE_GTK_DOC
+TESTS_ENVIRONMENT = cd $(srcdir) && \
+ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
+ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
+# TESTS = $(GTKDOC_CHECK)
+endif
+
+-include $(top_srcdir)/git.mk
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@
# The name of the module, e.g. 'glib'.
DOC_MODULE = gupnp
+# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
+#DOC_MODULE_VERSION=2
+
# The top-level SGML file. You can change this if you want to.
DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.xml
-# The directory containing the source code. Relative to $(srcdir).
-# gtk-doc will search all .c & .h files beneath here for inline comments
-# documenting the functions and macros.
-# e.g. DOC_SOURCE_DIR=../../../gtk
+# Directories containing the source code.
+# gtk-doc will search all .c and .h files beneath these paths
+# for inline comments documenting functions and macros.
+# e.g. DOC_SOURCE_DIR=$(top_srcdir)/gtk $(top_srcdir)/gdk
DOC_SOURCE_DIR = ../libgupnp
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
SCANGOBJ_OPTIONS =
# Extra options to supply to gtkdoc-scan.
+# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
SCAN_OPTIONS = --deprecated-guards="GUPNP_DISABLE_DEPRECATED"
# Extra options to supply to gtkdoc-mkdb.
-# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
-MKDB_OPTIONS = --sgml-mode --output-format=xml
+# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
+MKDB_OPTIONS = --xml-mode --output-format=xml
# Extra options to supply to gtkdoc-mktmpl
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
MKTMPL_OPTIONS =
+# Extra options to supply to gtkdoc-mkhtml
+MKHTML_OPTIONS =
+
# Extra options to supply to gtkdoc-fixref. Not normally needed.
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
FIXXREF_OPTIONS =
HFILE_GLOB = $(top_srcdir)/libgupnp/*.h
CFILE_GLOB = $(top_srcdir)/libgupnp/*.c
-# Header files to ignore when scanning.
-# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
+# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
+# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
+EXTRA_HFILES =
+
+# Header files or dirs to ignore when scanning. Use base file/dir names
+# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
IGNORE_HFILES = gena-protocol.h \
xml-util.h \
gvalue-util.h \
http-headers.h \
gupnp-marshal.h \
gupnp-context-private.h \
+ gupnp-linux-context-manager.h \
gupnp-network-manager.h \
gupnp-unix-context-manager.h \
gupnp-device-info-private.h \
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
# signals and properties.
-# e.g. INCLUDES=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
+# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
-INCLUDES = -I$(top_srcdir) $(LIBGUPNP_CFLAGS)
+GTKDOC_CFLAGS = -I$(top_srcdir) $(LIBGUPNP_CFLAGS)
GTKDOC_LIBS = $(top_builddir)/libgupnp/libgupnp-1.0.la $(LIBGUPNP_LIBS)
@GTK_DOC_USE_LIBTOOL_FALSE@GTKDOC_CC = $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@GTK_DOC_USE_LIBTOOL_TRUE@GTKDOC_CC = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(INCLUDES) $(GTKDOC_DEPS_CFLAGS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
# Other files to distribute
# e.g. EXTRA_DIST += version.xml.in
EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) version.xml.in
-DOC_STAMPS = setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
+DOC_STAMPS = setup-build.stamp scan-build.stamp sgml-build.stamp \
html-build.stamp pdf-build.stamp \
- tmpl.stamp sgml.stamp html.stamp pdf.stamp
+ sgml.stamp html.stamp pdf.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp
@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP =
@ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp
+
+# Files not to distribute
+# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
+# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
+#DISTCLEANFILES +=
+
+# Comment this out if you want 'make check' to test you doc status
+# and run some sanity checks
+@ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \
+@ENABLE_GTK_DOC_TRUE@ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
+@ENABLE_GTK_DOC_TRUE@ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
+
all: all-am
.SUFFIXES:
cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
done; \
fi; \
- test -d $(abs_srcdir)/tmpl && \
- { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \
- chmod -R u+w $(abs_builddir)/tmpl; } \
fi
@touch setup-build.stamp
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
@true
-#### templates ####
-
-tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- @echo ' DOC Rebuilding template files'
- @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- if test -w $(abs_srcdir) ; then \
- cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \
- fi \
- fi
- @touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
#### xml ####
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
@echo ' DOC Building XML'
- @-chmod -R u+w $(srcdir)
@_source_dir='' ; \
for i in $(DOC_SOURCE_DIR) ; do \
_source_dir="$${_source_dir} --source-dir=$$i" ; \
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
- rm -rf tmpl; \
fi
maintainer-clean-local: clean
@ENABLE_GTK_DOC_FALSE@ @false
dist-hook: dist-check-gtkdoc dist-hook-local
- @mkdir $(distdir)/tmpl
@mkdir $(distdir)/html
- @-cp ./tmpl/*.sgml $(distdir)/tmpl
@cp ./html/* $(distdir)/html
@-cp ./$(DOC_MODULE).pdf $(distdir)/
@-cp ./$(DOC_MODULE).types $(distdir)/
@$(GTKDOC_REBASE) --online --relative --html-dir=$(distdir)/html
.PHONY : dist-hook-local docs
+# TESTS = $(GTKDOC_CHECK)
+
+-include $(top_srcdir)/git.mk
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
<para>
It is possible to get change notifications for the service state variables
that have attribute <literal>sendEvents="yes"</literal>. We'll demonstrate
- this by modifying <function>service_proxy_available_cb()</function> and using
+ this by modifying <function>service_proxy_available_cb</function> and using
gupnp_service_proxy_add_notify() to setup a notification callback:
</para>
<programlisting>static void
<xi:include href="xml/gupnp-context.xml"/>
<xi:include href="xml/gupnp-context-manager.xml"/>
+ <xi:include href="xml/gupnp-white-list.xml"/>
<xi:include href="xml/gupnp-resource-factory.xml"/>
<xi:include href="xml/gupnp-xml-doc.xml"/>
<xi:include href="xml/gupnp-error.xml"/>
gupnp_device_info_get_upc
gupnp_device_info_get_icon_url
gupnp_device_info_list_dlna_capabilities
+gupnp_device_info_list_dlna_device_class_identifier
gupnp_device_info_get_description_value
gupnp_device_info_list_devices
gupnp_device_info_list_device_types
gupnp_context_manager_manage_control_point
gupnp_context_manager_manage_root_device
gupnp_context_manager_get_port
+gupnp_context_manager_get_white_list
<SUBSECTION Standard>
GUPnPContextManagerClass
GUPNP_CONTEXT_MANAGER
gupnp_control_error_quark
gupnp_xml_error_quark
</SECTION>
+
+<SECTION>
+<FILE>gupnp-connman-manager</FILE>
+<SUBSECTION Private>
+GUPNP_CONNMAN_MANAGER
+GUPNP_CONNMAN_MANAGER_CLASS
+GUPNP_CONNMAN_MANAGER_GET_CLASS
+GUPNP_IS_CONNMAN_MANAGER
+GUPNP_IS_CONNMAN_MANAGER_CLASS
+GUPNP_TYPE_CONNMAN_MANAGER
+GUPnPConnmanManager
+GUPnPConnmanManagerClass
+GUPnPConnmanManagerPrivate
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-simple-context-manager</FILE>
+<SUBSECTION Private>
+GUPNP_IS_SIMPLE_CONTEXT_MANAGER
+GUPNP_IS_SIMPLE_CONTEXT_MANAGER_CLASS
+GUPNP_SIMPLE_CONTEXT_MANAGER
+GUPNP_SIMPLE_CONTEXT_MANAGER_CLASS
+GUPNP_SIMPLE_CONTEXT_MANAGER_GET_CLASS
+GUPNP_TYPE_SIMPLE_CONTEXT_MANAGER
+GUPnPSimpleContextManager
+GUPnPSimpleContextManagerClass
+GUPnPSimpleContextManagerPrivate
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-windows-context-manager</FILE>
+<SUBSECTION Private>
+GUPNP_IS_WINDOWS_CONTEXT_MANAGER
+GUPNP_IS_WINDOWS_CONTEXT_MANAGER_CLASS
+GUPNP_TYPE_WINDOWS_CONTEXT_MANAGER
+GUPNP_WINDOWS_CONTEXT_MANAGER
+GUPNP_WINDOWS_CONTEXT_MANAGER_CLASS
+GUPNP_WINDOWS_CONTEXT_MANAGER_GET_CLASS
+GUPnPWindowsContextManager
+GUPnPWindowsContextManagerClass
+gupnp_windows_context_manager_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-unix-context-manager</FILE>
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-linux-context-manager</FILE>
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-network-manager</FILE>
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-white-list</FILE>
+<TITLE>GUPnPWhiteList</TITLE>
+GUPnPWhiteList
+gupnp_white_list_add_entry
+gupnp_white_list_check_context
+gupnp_white_list_clear
+gupnp_white_list_set_enabled
+gupnp_white_list_get_entries
+gupnp_white_list_is_empty
+gupnp_white_list_get_enabled
+gupnp_white_list_new
+gupnp_white_list_remove_entry
+<SUBSECTION Standard>
+gupnp_white_list_get_type
+GUPNP_IS_WHITE_LIST
+GUPNP_IS_WHITE_LIST_CLASS
+GUPNP_TYPE_WHITE_LIST
+GUPNP_WHITE_LIST
+GUPNP_WHITE_LIST_CLASS
+GUPNP_WHITE_LIST_GET_CLASS
+GUPnPWhiteListClass
+<SUBSECTION Private>
+GUPnPWhiteListPrivate
+</SECTION>
</p>
<p>
For debugging, it is possible to see the messages being sent and received by
-exporting <code class="literal">GUPNP_DEBUG</code>.
+exporting <code class="envar">GUPNP_DEBUG</code>.
</p>
</div>
<div class="refsect1">
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
-<tbody><tr>
+<tbody>
+<tr>
<td><p><span class="term"><em class="parameter"><code>context</code></em>Â :</span></p></td>
<td>A <a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a>
-<em class="parameter"><code>language</code></em> A language tag as defined in RFC 2616 3.10</td>
-</tr></tbody>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>language</code></em>Â :</span></p></td>
+<td>A language tag as defined in RFC 2616 3.10</td>
+</tr>
+</tbody>
</table></div>
</div>
<hr>
<link rel="home" href="index.html" title="GUPnP Reference Manual">
<link rel="up" href="api-utility.html" title="Utility Functions">
<link rel="prev" href="GUPnPContext.html" title="GUPnPContext">
-<link rel="next" href="GUPnPResourceFactory.html" title="GUPnPResourceFactory">
+<link rel="next" href="GUPnPWhiteList.html" title="GUPnPWhiteList">
<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<td><a accesskey="u" href="api-utility.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<th width="100%" align="center">GUPnP Reference Manual</th>
-<td><a accesskey="n" href="GUPnPResourceFactory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="GUPnPWhiteList.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
</tr>
<tr><td colspan="5" class="shortcuts">
<a href="#GUPnPContextManager.synopsis" class="shortcut">Top</a>
(<em class="parameter"><code><a class="link" href="GUPnPContextManager.html" title="GUPnPContextManager"><span class="type">GUPnPContextManager</span></a> *manager</code></em>,
<em class="parameter"><code><a class="link" href="GUPnPRootDevice.html" title="GUPnPRootDevice"><span class="type">GUPnPRootDevice</span></a> *root_device</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a> <a class="link" href="GUPnPContextManager.html#gupnp-context-manager-get-port" title="gupnp_context_manager_get_port ()">gupnp_context_manager_get_port</a> (<em class="parameter"><code><a class="link" href="GUPnPContextManager.html" title="GUPnPContextManager"><span class="type">GUPnPContextManager</span></a> *manager</code></em>);
+<a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="returnvalue">GUPnPWhiteList</span></a> * <a class="link" href="GUPnPContextManager.html#gupnp-context-manager-get-white-list" title="gupnp_context_manager_get_white_list ()">gupnp_context_manager_get_white_list</a>
+ (<em class="parameter"><code><a class="link" href="GUPnPContextManager.html" title="GUPnPContextManager"><span class="type">GUPnPContextManager</span></a> *manager</code></em>);
</pre>
</div>
<div class="refsect1">
<pre class="synopsis">
"<a class="link" href="GUPnPContextManager.html#GUPnPContextManager--main-context" title='The "main-context" property'>main-context</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> : Read / Write / Construct Only
"<a class="link" href="GUPnPContextManager.html#GUPnPContextManager--port" title='The "port" property'>port</a>" <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> : Read / Write / Construct Only
+ "<a class="link" href="GUPnPContextManager.html#GUPnPContextManager--white-list" title='The "white-list" property'>white-list</a>" <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>* : Read
</pre>
</div>
<div class="refsect1">
<a name="GUPnPContextManager.signals"></a><h2>Signals</h2>
<pre class="synopsis">
- "<a class="link" href="GUPnPContextManager.html#GUPnPContextManager-context-available" title='The "context-available" signal'>context-available</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
+ "<a class="link" href="GUPnPContextManager.html#GUPnPContextManager-context-available" title='The "context-available" signal'>context-available</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
"<a class="link" href="GUPnPContextManager.html#GUPnPContextManager-context-unavailable" title='The "context-unavailable" signal'>context-unavailable</a>" : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a>
</pre>
</div>
</tbody>
</table></div>
</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-context-manager-get-white-list"></a><h3>gupnp_context_manager_get_white_list ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="returnvalue">GUPnPWhiteList</span></a> * gupnp_context_manager_get_white_list
+ (<em class="parameter"><code><a class="link" href="GUPnPContextManager.html" title="GUPnPContextManager"><span class="type">GUPnPContextManager</span></a> *manager</code></em>);</pre>
+<p>
+Get the <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> associated with <em class="parameter"><code>manager</code></em>.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>manager</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPContextManager.html" title="GUPnPContextManager"><span class="type">GUPnPContextManager</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>The <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> asssociated with this
+context manager. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
</div>
<div class="refsect1">
<a name="GUPnPContextManager.property-details"></a><h2>Property Details</h2>
</p>
<p>Default value: 0</p>
</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPContextManager--white-list"></a><h3>The <code class="literal">"white-list"</code> property</h3>
+<pre class="programlisting"> "white-list" <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>* : Read</pre>
+<p>
+The white list to use.
+</p>
+</div>
</div>
<div class="refsect1">
<a name="GUPnPContextManager.signal-details"></a><h2>Signal Details</h2>
<a name="GUPnPContextManager-context-available"></a><h3>The <code class="literal">"context-available"</code> signal</h3>
<pre class="programlisting"><span class="returnvalue">void</span> user_function (<a class="link" href="GUPnPContextManager.html" title="GUPnPContextManager"><span class="type">GUPnPContextManager</span></a> *context_manager,
<a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> *context,
- <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
+ <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data) : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-FIRST:CAPS"><code class="literal">Run First</code></a></pre>
<p>
Signals the availability of new <a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a>.
</p>
<em class="parameter"><code><span class="type">int</span> *height</code></em>);
<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-capabilities" title="gupnp_device_info_list_dlna_capabilities ()">gupnp_device_info_list_dlna_capabilities</a>
(<em class="parameter"><code><a class="link" href="GUPnPDeviceInfo.html" title="GUPnPDeviceInfo"><span class="type">GUPnPDeviceInfo</span></a> *info</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-device-class-identifier" title="gupnp_device_info_list_dlna_device_class_identifier ()">gupnp_device_info_list_dlna_device_class_identifier</a>
+ (<em class="parameter"><code><a class="link" href="GUPnPDeviceInfo.html" title="GUPnPDeviceInfo"><span class="type">GUPnPDeviceInfo</span></a> *info</code></em>);
<span class="returnvalue">char</span> * <a class="link" href="GUPnPDeviceInfo.html#gupnp-device-info-get-description-value" title="gupnp_device_info_get_description_value ()">gupnp_device_info_get_description_value</a>
(<em class="parameter"><code><a class="link" href="GUPnPDeviceInfo.html" title="GUPnPDeviceInfo"><span class="type">GUPnPDeviceInfo</span></a> *info</code></em>,
<em class="parameter"><code>const <span class="type">char</span> *element</code></em>);
<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gupnp_device_info_list_dlna_capabilities
(<em class="parameter"><code><a class="link" href="GUPnPDeviceInfo.html" title="GUPnPDeviceInfo"><span class="type">GUPnPDeviceInfo</span></a> *info</code></em>);</pre>
<p>
-Get a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of strings that represent the device capabilities as announced
+Get a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of strings that represent the device capabilities as announced
in the device description file using the <dlna:X_DLNACAP> element.
</p>
<div class="variablelist"><table border="0">
</div>
<hr>
<div class="refsect2">
+<a name="gupnp-device-info-list-dlna-device-class-identifier"></a><h3>gupnp_device_info_list_dlna_device_class_identifier ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gupnp_device_info_list_dlna_device_class_identifier
+ (<em class="parameter"><code><a class="link" href="GUPnPDeviceInfo.html" title="GUPnPDeviceInfo"><span class="type">GUPnPDeviceInfo</span></a> *info</code></em>);</pre>
+<p>
+Get a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of strings that represent the device class and version as
+announced in the device description file using the <dlna:X_DLNADOC>
+element.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>info</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPDeviceInfo.html" title="GUPnPDeviceInfo"><span class="type">GUPnPDeviceInfo</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of newly allocated strings or
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if the device description doesn't contain the <dlna:X_DLNADOC>
+element. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
<a name="gupnp-device-info-get-description-value"></a><h3>gupnp_device_info_get_description_value ()</h3>
<pre class="programlisting"><span class="returnvalue">char</span> * gupnp_device_info_get_description_value
(<em class="parameter"><code><a class="link" href="GUPnPDeviceInfo.html" title="GUPnPDeviceInfo"><span class="type">GUPnPDeviceInfo</span></a> *info</code></em>,
<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
<link rel="home" href="index.html" title="GUPnP Reference Manual">
<link rel="up" href="api-utility.html" title="Utility Functions">
-<link rel="prev" href="GUPnPContextManager.html" title="GUPnPContextManager">
+<link rel="prev" href="GUPnPWhiteList.html" title="GUPnPWhiteList">
<link rel="next" href="GUPnPXMLDoc.html" title="GUPnPXMLDoc">
<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
<tr valign="middle">
-<td><a accesskey="p" href="GUPnPContextManager.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="GUPnPWhiteList.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="api-utility.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<th width="100%" align="center">GUPnP Reference Manual</th>
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
-<tbody><tr>
+<tbody>
+<tr>
<td><p><span class="term"><em class="parameter"><code>action</code></em>Â :</span></p></td>
<td>A <a class="link" href="GUPnPService.html#GUPnPServiceAction"><span class="type">GUPnPServiceAction</span></a>
</td>
-</tr></tbody>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em>Â :</span></p></td>
+<td>tuples of argument name, argument type, and argument value
+location, terminated with <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
</table></div>
</div>
<hr>
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
-<tbody><tr>
+<tbody>
+<tr>
<td><p><span class="term"><em class="parameter"><code>action</code></em>Â :</span></p></td>
<td>A <a class="link" href="GUPnPService.html#GUPnPServiceAction"><span class="type">GUPnPServiceAction</span></a>
</td>
-</tr></tbody>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em>Â :</span></p></td>
+<td>tuples of return value name, return value type, and
+actual return value, terminated with <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
</table></div>
</div>
<hr>
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
-<tbody><tr>
+<tbody>
+<tr>
<td><p><span class="term"><em class="parameter"><code>service</code></em>Â :</span></p></td>
<td>A <a class="link" href="GUPnPService.html" title="GUPnPService"><span class="type">GUPnPService</span></a>
</td>
-</tr></tbody>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em>Â :</span></p></td>
+<td>Tuples of variable name, variable type, and variable value,
+terminated with <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+</tr>
+</tbody>
</table></div>
</div>
<hr>
A convenience function that attempts to connect all possible
<a class="link" href="GUPnPService.html#GUPnPService-action-invoked" title='The "action-invoked" signal'><span class="type">"action-invoked"</span></a> and <a class="link" href="GUPnPService.html#GUPnPService-query-variable" title='The "query-variable" signal'><span class="type">"query-variable"</span></a> signals to
appropriate callbacks for the service <em class="parameter"><code>service</code></em>. It uses service introspection
-and GModule's introspective features. It is very simillar to
+and <a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#GModule"><span class="type">GModule</span></a>'s introspective features. It is very simillar to
<a href="http://developer.gnome.org/gtk2/GtkBuilder.html#gtk-builder-connect-signals"><code class="function">gtk_builder_connect_signals()</code></a> except that it attempts to guess the names of
the signal handlers on its own.
</p>
off the action names and either prepend "on_" or append "_cb" to them. Same
goes for <a class="link" href="GUPnPService.html#GUPnPService-query-variable" title='The "query-variable" signal'><span class="type">"query-variable"</span></a> signals, except that "query_" should
be prepended to the variable name. For example, callback function for
-"GetSystemUpdateID" action should be either named as
+<code class="varname">GetSystemUpdateID</code> action should be either named as
"get_system_update_id_cb" or "on_get_system_update_id" and callback function
for the query of "SystemUpdateID" state variable should be named
-"query_system_update_id_cb" or "on_query_system_update_id".
+<code class="function">query_system_update_id_cb</code> or
+<code class="function">on_query_system_update_id</code>.
</p>
<p>
-Note that this function will not work correctly if GModule is not supported
-on the platform or introspection is not available for service <em class="parameter"><code>service</code></em>.
</p>
+<div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Note</h3>This function will not work correctly if <a href="http://library.gnome.org/devel/glib/unstable/glib-Dynamic-Loading-of-Modules.html#GModule"><span class="type">GModule</span></a> is not supported
+on the platform or introspection is not available for <em class="parameter"><code>service</code></em>.</div>
<p>
-WARNING: This function can not and therefore does not guarantee that the
+</p>
+<p>
+</p>
+<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
+<h3 class="title">Warning</h3>This function can not and therefore does not guarantee that the
resulting signal connections will be correct as it depends heavily on a
-particular naming schemes described above.
+particular naming schemes described above.</div>
+<p>
</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
</td>
</tr>
<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em>Â :</span></p></td>
+<td>tuples of in parameter name, in parameter type, and in parameter
+value, followed by <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, and then tuples of out parameter name,
+out parameter type, and out parameter value location, terminated with <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
<td>
<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if sending the action was succesful.</td>
</td>
</tr>
<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em>Â :</span></p></td>
+<td>tuples of in parameter name, in parameter type, and in parameter
+value, terminated with <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>
+</td>
+</tr>
+<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
<td>A <a class="link" href="GUPnPServiceProxy.html#GUPnPServiceProxyAction" title="GUPnPServiceProxyAction"><span class="type">GUPnPServiceProxyAction</span></a> handle. This will be freed when
<a class="link" href="GUPnPServiceProxy.html#gupnp-service-proxy-cancel-action" title="gupnp_service_proxy_cancel_action ()"><code class="function">gupnp_service_proxy_cancel_action()</code></a> or
</td>
</tr>
<tr>
+<td><p><span class="term"><em class="parameter"><code>...</code></em>Â :</span></p></td>
+<td>tuples of out parameter name, out parameter type, and out parameter
+value location, terminated with <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. The out parameter values should be
+freed after use</td>
+</tr>
+<tr>
<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
<td>
<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> on success.</td>
in <em class="parameter"><code>out_values</code></em> must be freed using <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#g-list-free"><span class="type">g_list_free</span></a> and each element in it using
<a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-unset"><span class="type">g_value_unset</span></a> and <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Slices.html#g-slice-free"><span class="type">g_slice_free</span></a>.
</p>
-<p>
-Return value : <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> on success.
-</p>
<div class="variablelist"><table border="0">
<col align="left" valign="top">
<tbody>
(as <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#GValue"><span class="type">GValue</span></a>) that line up with <em class="parameter"><code>out_names</code></em> and <em class="parameter"><code>out_types</code></em>. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GValue][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span>
</td>
</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> on success.</td>
+</tr>
</tbody>
</table></div>
</div>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPWhiteList</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP Reference Manual">
+<link rel="up" href="api-utility.html" title="Utility Functions">
+<link rel="prev" href="GUPnPContextManager.html" title="GUPnPContextManager">
+<link rel="next" href="GUPnPResourceFactory.html" title="GUPnPResourceFactory">
+<meta name="generator" content="GTK-Doc V1.18 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
+<tr valign="middle">
+<td><a accesskey="p" href="GUPnPContextManager.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="api-utility.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
+<th width="100%" align="center">GUPnP Reference Manual</th>
+<td><a accesskey="n" href="GUPnPResourceFactory.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPWhiteList.synopsis" class="shortcut">Top</a>
+ Â |Â
+ <a href="#GUPnPWhiteList.description" class="shortcut">Description</a>
+ Â |Â
+ <a href="#GUPnPWhiteList.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPWhiteList"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPWhiteList.top_of_page"></a>GUPnPWhiteList</span></h2>
+<p>GUPnPWhiteList — Class for network filtering.</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPWhiteList.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">struct <a class="link" href="GUPnPWhiteList.html#GUPnPWhiteList-struct" title="struct GUPnPWhiteList">GUPnPWhiteList</a>;
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-add-entry" title="gupnp_white_list_add_entry ()">gupnp_white_list_add_entry</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *entry</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-check-context" title="gupnp_white_list_check_context ()">gupnp_white_list_check_context</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> *context</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-clear" title="gupnp_white_list_clear ()">gupnp_white_list_clear</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);
+<span class="returnvalue">void</span> <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-set-enabled" title="gupnp_white_list_set_enabled ()">gupnp_white_list_set_enabled</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enable</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-get-entries" title="gupnp_white_list_get_entries ()">gupnp_white_list_get_entries</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-is-empty" title="gupnp_white_list_is_empty ()">gupnp_white_list_is_empty</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-get-enabled" title="gupnp_white_list_get_enabled ()">gupnp_white_list_get_enabled</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);
+<a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="returnvalue">GUPnPWhiteList</span></a> * <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-new" title="gupnp_white_list_new ()">gupnp_white_list_new</a> (<em class="parameter"><code><span class="type">void</span></code></em>);
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> <a class="link" href="GUPnPWhiteList.html#gupnp-white-list-remove-entry" title="gupnp_white_list_remove_entry ()">gupnp_white_list_remove_entry</a> (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *entry</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPWhiteList.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+ <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+ +----GUPnPWhiteList
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPWhiteList.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> handles network filtering. It provides API to manage a list
+of entries that will be used to filter networks.
+The <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> could be enabled or not. If it's enabled but the entries
+list is empty, it behaves as disabled.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPWhiteList.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPWhiteList-struct"></a><h3>struct GUPnPWhiteList</h3>
+<pre class="programlisting">struct GUPnPWhiteList;</pre>
+<p>
+This struct contains private data only, and should be accessed using the
+functions below.
+</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-add-entry"></a><h3>gupnp_white_list_add_entry ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gupnp_white_list_add_entry (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *entry</code></em>);</pre>
+<p>
+Add <em class="parameter"><code>entry</code></em> in the list of valid criteria used by <em class="parameter"><code>white_list</code></em> to
+filter networks.
+if <em class="parameter"><code>entry</code></em> already exists, it won't be added a second time.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em>Â :</span></p></td>
+<td>A value used to filter network</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>entry</code></em> is added, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-check-context"></a><h3>gupnp_white_list_check_context ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gupnp_white_list_check_context (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> *context</code></em>);</pre>
+<p>
+It will check if the <em class="parameter"><code>context</code></em> is allowed or not. The <em class="parameter"><code>white_list</code></em> will check
+all its entries againt <a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> interface, host ip and network fields
+information. This function doesn't take into account the <em class="parameter"><code>white_list</code></em> status
+(enabled or not).
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>context</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> to test.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>context</code></em> is matching the <em class="parameter"><code>white_list</code></em> criterias,
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-clear"></a><h3>gupnp_white_list_clear ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gupnp_white_list_clear (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);</pre>
+<p>
+Remove all entries from <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> that compose the white list.
+The list is now empty. Even if <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> is enabled, it will have the
+same behavior as if it was disabled.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-set-enabled"></a><h3>gupnp_white_list_set_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span> gupnp_white_list_set_enabled (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enable</code></em>);</pre>
+<p>
+Enable or disable the <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> to perform the network filtering.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>enable</code></em>Â :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> to enable <em class="parameter"><code>white_list</code></em>, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-get-entries"></a><h3>gupnp_white_list_get_entries ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> * gupnp_white_list_get_entries (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);</pre>
+<p>
+Get the <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of entries that compose the white list. Do not free
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>a <a href="http://library.gnome.org/devel/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of entries
+used to filter networks, interfaces,... or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
+Do not modify or free the list nor its elements. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8][<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-is-empty"></a><h3>gupnp_white_list_is_empty ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gupnp_white_list_is_empty (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);</pre>
+<p>
+Return the state of the entries list of <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>white_list</code></em> is empty, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-get-enabled"></a><h3>gupnp_white_list_get_enabled ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gupnp_white_list_get_enabled (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>);</pre>
+<p>
+Return the status of the <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>white_list</code></em> is enabled, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-new"></a><h3>gupnp_white_list_new ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="returnvalue">GUPnPWhiteList</span></a> * gupnp_white_list_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<p>
+Create a new <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>.
+The white list is disabled by default.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>A new <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> object. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-white-list-remove-entry"></a><h3>gupnp_white_list_remove_entry ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a> gupnp_white_list_remove_entry (<em class="parameter"><code><a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a> *white_list</code></em>,
+ <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *entry</code></em>);</pre>
+<p>
+Remove <em class="parameter"><code>entry</code></em> in the list of valid criteria used by <em class="parameter"><code>white_list</code></em> to
+filter networks.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>white_list</code></em>Â :</span></p></td>
+<td>A <a class="link" href="GUPnPWhiteList.html" title="GUPnPWhiteList"><span class="type">GUPnPWhiteList</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>entry</code></em>Â :</span></p></td>
+<td>A value to remove from the filter list.</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span>Â :</span></p></td>
+<td>
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>entry</code></em> is removed, <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+ Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
};
</pre>
<p>
+Reference-counting wrapper for libxml's <span class="type">xmlDoc</span>
</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody><tr>
+<td><p><span class="term"><span class="type">xmlDoc</span>Â *<em class="structfield"><code><a name="GUPnPXMLDoc-struct.doc"></a>doc</code></em>;</span></p></td>
+<td>Pointer to the document.</td>
+</tr></tbody>
+</table></div>
</div>
<hr>
<div class="refsect2">
<span class="refentrytitle"><a href="GUPnPContextManager.html">GUPnPContextManager</a></span><span class="refpurpose"> — Manages <a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> objects.</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="GUPnPWhiteList.html">GUPnPWhiteList</a></span><span class="refpurpose"> — Class for network filtering.</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="GUPnPResourceFactory.html">GUPnPResourceFactory</a></span><span class="refpurpose"> — Class for resource and resource proxy object creation.</span>
</dt>
<dt>
<span class="refentrytitle"><a href="GUPnPContextManager.html">GUPnPContextManager</a></span><span class="refpurpose"> — Manages <a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> objects.</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="GUPnPWhiteList.html">GUPnPWhiteList</a></span><span class="refpurpose"> — Class for network filtering.</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="GUPnPResourceFactory.html">GUPnPResourceFactory</a></span><span class="refpurpose"> — Class for resource and resource proxy object creation.</span>
</dt>
<dt>
<a name="client-tutorial"></a>Writing a UPnP Client</h2></div></div></div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp10800944"></a>Introduction</h2></div></div></div>
+<a name="idp6270480"></a>Introduction</h2></div></div></div>
<p>
This chapter explains how to write an application which fetches the
external IP address from an UPnP-compliant modem. To do this a
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp7083952"></a>Finding Services</h2></div></div></div>
+<a name="idp8317008"></a>Finding Services</h2></div></div></div>
<p>
First, we initialize GUPnP and create a control point targeting the
service type. Then we connect a signal handler so that we are notified
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp6640096"></a>Invoking Actions</h2></div></div></div>
+<a name="idp9039984"></a>Invoking Actions</h2></div></div></div>
<p>
Now we have an application which searches for the service we specified and
calls <code class="function">service_proxy_available_cb</code> for each one it
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp5661232"></a>Subscribing to state variable change notifications</h2></div></div></div>
+<a name="idp9827344"></a>Subscribing to state variable change notifications</h2></div></div></div>
<p>
It is possible to get change notifications for the service state variables
that have attribute <code class="literal">sendEvents="yes"</code>. We'll demonstrate
- this by modifying <code class="function">service_proxy_available_cb()</code> and using
+ this by modifying <code class="function">service_proxy_available_cb</code> and using
gupnp_service_proxy_add_notify() to setup a notification callback:
</p>
<pre class="programlisting">static void
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp10748192"></a>Generating Wrappers</h2></div></div></div>
+<a name="idp9597728"></a>Generating Wrappers</h2></div></div></div>
<p>
Using gupnp_service_proxy_send_action() and gupnp_service_proxy_add_notify ()
can become tedious, because of the requirement to specify the types and deal
</tr>
<tr>
<td><p><a name="GUPNP-XML-ERROR-INVALID-ATTRIBUTE:CAPS"></a><span class="term"><code class="literal">GUPNP_XML_ERROR_INVALID_ATTRIBUTE</code></span></p></td>
-<td>
+<td>An XML node has an unknown attribute.
</td>
</tr>
<tr>
<div class="cmdsynopsis"><p><code class="command">gupnp-binding-tool</code> [--prefix {PREFIX}] [--mode {client|server}] {SCPD file}</p></div>
</div>
<div class="refsect1">
-<a name="idp6198416"></a><h2>Description</h2>
+<a name="idp8665712"></a><h2>Description</h2>
<p>
<span class="command"><strong>gupnp-binding-tool</strong></span> takes a <a class="glossterm" href="glossary.html#scpd"><em class="glossterm">SCPD file</em></a> and generates convenience C functions
which call the actual GUPnP functions. The client-side bindings can be seen
</p>
</div>
<div class="refsect1">
-<a name="idp13153104"></a><h2>Client side bindings</h2>
+<a name="idp11454640"></a><h2>Client side bindings</h2>
<p>
As an example, this action:
</p>
</p>
</div>
<div class="refsect1">
-<a name="idp13166992"></a><h2>Server side bindings</h2>
+<a name="idp12866592"></a><h2>Server side bindings</h2>
<p>
The corresponding server bindings for the same UPnP action
(DeletePortMapping) look like this:
<sub name="Utility Functions" link="api-utility.html">
<sub name="GUPnPContext" link="GUPnPContext.html"/>
<sub name="GUPnPContextManager" link="GUPnPContextManager.html"/>
+ <sub name="GUPnPWhiteList" link="GUPnPWhiteList.html"/>
<sub name="GUPnPResourceFactory" link="GUPnPResourceFactory.html"/>
<sub name="GUPnPXMLDoc" link="GUPnPXMLDoc.html"/>
<sub name="Error codes" link="gupnp-Error-codes.html"/>
<keyword type="function" name="gupnp_device_info_get_upc ()" link="GUPnPDeviceInfo.html#gupnp-device-info-get-upc"/>
<keyword type="function" name="gupnp_device_info_get_icon_url ()" link="GUPnPDeviceInfo.html#gupnp-device-info-get-icon-url"/>
<keyword type="function" name="gupnp_device_info_list_dlna_capabilities ()" link="GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-capabilities"/>
+ <keyword type="function" name="gupnp_device_info_list_dlna_device_class_identifier ()" link="GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-device-class-identifier"/>
<keyword type="function" name="gupnp_device_info_get_description_value ()" link="GUPnPDeviceInfo.html#gupnp-device-info-get-description-value"/>
<keyword type="function" name="gupnp_device_info_list_devices ()" link="GUPnPDeviceInfo.html#gupnp-device-info-list-devices"/>
<keyword type="function" name="gupnp_device_info_list_device_types ()" link="GUPnPDeviceInfo.html#gupnp-device-info-list-device-types"/>
<keyword type="function" name="gupnp_context_manager_manage_control_point ()" link="GUPnPContextManager.html#gupnp-context-manager-manage-control-point"/>
<keyword type="function" name="gupnp_context_manager_manage_root_device ()" link="GUPnPContextManager.html#gupnp-context-manager-manage-root-device"/>
<keyword type="function" name="gupnp_context_manager_get_port ()" link="GUPnPContextManager.html#gupnp-context-manager-get-port"/>
+ <keyword type="function" name="gupnp_context_manager_get_white_list ()" link="GUPnPContextManager.html#gupnp-context-manager-get-white-list"/>
<keyword type="property" name="The "main-context" property" link="GUPnPContextManager.html#GUPnPContextManager--main-context"/>
<keyword type="property" name="The "port" property" link="GUPnPContextManager.html#GUPnPContextManager--port"/>
+ <keyword type="property" name="The "white-list" property" link="GUPnPContextManager.html#GUPnPContextManager--white-list"/>
<keyword type="signal" name="The "context-available" signal" link="GUPnPContextManager.html#GUPnPContextManager-context-available"/>
<keyword type="signal" name="The "context-unavailable" signal" link="GUPnPContextManager.html#GUPnPContextManager-context-unavailable"/>
+ <keyword type="struct" name="struct GUPnPWhiteList" link="GUPnPWhiteList.html#GUPnPWhiteList-struct"/>
+ <keyword type="function" name="gupnp_white_list_add_entry ()" link="GUPnPWhiteList.html#gupnp-white-list-add-entry"/>
+ <keyword type="function" name="gupnp_white_list_check_context ()" link="GUPnPWhiteList.html#gupnp-white-list-check-context"/>
+ <keyword type="function" name="gupnp_white_list_clear ()" link="GUPnPWhiteList.html#gupnp-white-list-clear"/>
+ <keyword type="function" name="gupnp_white_list_set_enabled ()" link="GUPnPWhiteList.html#gupnp-white-list-set-enabled"/>
+ <keyword type="function" name="gupnp_white_list_get_entries ()" link="GUPnPWhiteList.html#gupnp-white-list-get-entries"/>
+ <keyword type="function" name="gupnp_white_list_is_empty ()" link="GUPnPWhiteList.html#gupnp-white-list-is-empty"/>
+ <keyword type="function" name="gupnp_white_list_get_enabled ()" link="GUPnPWhiteList.html#gupnp-white-list-get-enabled"/>
+ <keyword type="function" name="gupnp_white_list_new ()" link="GUPnPWhiteList.html#gupnp-white-list-new"/>
+ <keyword type="function" name="gupnp_white_list_remove_entry ()" link="GUPnPWhiteList.html#gupnp-white-list-remove-entry"/>
<keyword type="struct" name="struct GUPnPResourceFactory" link="GUPnPResourceFactory.html#GUPnPResourceFactory-struct"/>
<keyword type="function" name="gupnp_resource_factory_new ()" link="GUPnPResourceFactory.html#gupnp-resource-factory-new"/>
<keyword type="function" name="gupnp_resource_factory_get_default ()" link="GUPnPResourceFactory.html#gupnp-resource-factory-get-default"/>
<div class="titlepage">
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GUPnP Reference Manual</p></th></tr></table></div>
-<div><p class="releaseinfo">Version 0.20.3
+<div><p class="releaseinfo">Version 0.20.5
</p></div>
<div><p class="copyright">Copyright © 2007, 2008, 2009 OpenedHand Ltd, Nokia Corporation</p></div>
<div><div class="legalnotice">
-<a name="idp882592"></a><p>
+<a name="idp4402048"></a><p>
Permission is granted to copy, distribute and/or modify this
document under the terms of the <em class="citetitle">GNU Free
Documentation License</em>, Version 1.1 or any later
<span class="refentrytitle"><a href="GUPnPContextManager.html">GUPnPContextManager</a></span><span class="refpurpose"> — Manages <a class="link" href="GUPnPContext.html" title="GUPnPContext"><span class="type">GUPnPContext</span></a> objects.</span>
</dt>
<dt>
+<span class="refentrytitle"><a href="GUPnPWhiteList.html">GUPnPWhiteList</a></span><span class="refpurpose"> — Class for network filtering.</span>
+</dt>
+<dt>
<span class="refentrytitle"><a href="GUPnPResourceFactory.html">GUPnPResourceFactory</a></span><span class="refpurpose"> — Class for resource and resource proxy object creation.</span>
</dt>
<dt>
<ANCHOR id="gupnp-device-info-get-upc" href="gupnp/GUPnPDeviceInfo.html#gupnp-device-info-get-upc">
<ANCHOR id="gupnp-device-info-get-icon-url" href="gupnp/GUPnPDeviceInfo.html#gupnp-device-info-get-icon-url">
<ANCHOR id="gupnp-device-info-list-dlna-capabilities" href="gupnp/GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-capabilities">
+<ANCHOR id="gupnp-device-info-list-dlna-device-class-identifier" href="gupnp/GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-device-class-identifier">
<ANCHOR id="gupnp-device-info-get-description-value" href="gupnp/GUPnPDeviceInfo.html#gupnp-device-info-get-description-value">
<ANCHOR id="gupnp-device-info-list-devices" href="gupnp/GUPnPDeviceInfo.html#gupnp-device-info-list-devices">
<ANCHOR id="gupnp-device-info-list-device-types" href="gupnp/GUPnPDeviceInfo.html#gupnp-device-info-list-device-types">
<ANCHOR id="gupnp-context-manager-manage-control-point" href="gupnp/GUPnPContextManager.html#gupnp-context-manager-manage-control-point">
<ANCHOR id="gupnp-context-manager-manage-root-device" href="gupnp/GUPnPContextManager.html#gupnp-context-manager-manage-root-device">
<ANCHOR id="gupnp-context-manager-get-port" href="gupnp/GUPnPContextManager.html#gupnp-context-manager-get-port">
+<ANCHOR id="gupnp-context-manager-get-white-list" href="gupnp/GUPnPContextManager.html#gupnp-context-manager-get-white-list">
<ANCHOR id="GUPnPContextManager.property-details" href="gupnp/GUPnPContextManager.html#GUPnPContextManager.property-details">
<ANCHOR id="GUPnPContextManager--main-context" href="gupnp/GUPnPContextManager.html#GUPnPContextManager--main-context">
<ANCHOR id="GUPnPContextManager--port" href="gupnp/GUPnPContextManager.html#GUPnPContextManager--port">
+<ANCHOR id="GUPnPContextManager--white-list" href="gupnp/GUPnPContextManager.html#GUPnPContextManager--white-list">
<ANCHOR id="GUPnPContextManager.signal-details" href="gupnp/GUPnPContextManager.html#GUPnPContextManager.signal-details">
<ANCHOR id="GUPnPContextManager-context-available" href="gupnp/GUPnPContextManager.html#GUPnPContextManager-context-available">
<ANCHOR id="GUPnPContextManager-context-unavailable" href="gupnp/GUPnPContextManager.html#GUPnPContextManager-context-unavailable">
+<ANCHOR id="GUPnPWhiteList" href="gupnp/GUPnPWhiteList.html">
+<ANCHOR id="GUPnPWhiteList.synopsis" href="gupnp/GUPnPWhiteList.html#GUPnPWhiteList.synopsis">
+<ANCHOR id="GUPnPWhiteList.object-hierarchy" href="gupnp/GUPnPWhiteList.html#GUPnPWhiteList.object-hierarchy">
+<ANCHOR id="GUPnPWhiteList.description" href="gupnp/GUPnPWhiteList.html#GUPnPWhiteList.description">
+<ANCHOR id="GUPnPWhiteList.details" href="gupnp/GUPnPWhiteList.html#GUPnPWhiteList.details">
+<ANCHOR id="GUPnPWhiteList-struct" href="gupnp/GUPnPWhiteList.html#GUPnPWhiteList-struct">
+<ANCHOR id="gupnp-white-list-add-entry" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-add-entry">
+<ANCHOR id="gupnp-white-list-check-context" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-check-context">
+<ANCHOR id="gupnp-white-list-clear" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-clear">
+<ANCHOR id="gupnp-white-list-set-enabled" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-set-enabled">
+<ANCHOR id="gupnp-white-list-get-entries" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-get-entries">
+<ANCHOR id="gupnp-white-list-is-empty" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-is-empty">
+<ANCHOR id="gupnp-white-list-get-enabled" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-get-enabled">
+<ANCHOR id="gupnp-white-list-new" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-new">
+<ANCHOR id="gupnp-white-list-remove-entry" href="gupnp/GUPnPWhiteList.html#gupnp-white-list-remove-entry">
<ANCHOR id="GUPnPResourceFactory" href="gupnp/GUPnPResourceFactory.html">
<ANCHOR id="GUPnPResourceFactory.synopsis" href="gupnp/GUPnPResourceFactory.html#GUPnPResourceFactory.synopsis">
<ANCHOR id="GUPnPResourceFactory.object-hierarchy" href="gupnp/GUPnPResourceFactory.html#GUPnPResourceFactory.object-hierarchy">
</tr></table>
<div class="index">
<div class="titlepage"><div><div><h2 class="title">
-<a name="idp38112"></a>Index</h2></div></div></div>
+<a name="idp53232"></a>Index</h2></div></div></div>
<div class="index"><div class="indexdiv">
<h3>G</h3>
<dl>
</dt>
<dt>GUPnPContextManager:port, <a class="indexterm" href="GUPnPContextManager.html#GUPnPContextManager--port">The "port" property</a>
</dt>
+<dt>GUPnPContextManager:white-list, <a class="indexterm" href="GUPnPContextManager.html#GUPnPContextManager--white-list">The "white-list" property</a>
+</dt>
<dt>GUPnPControlError, <a class="indexterm" href="gupnp-Error-codes.html#GUPnPControlError">enum GUPnPControlError</a>
</dt>
<dt>GUPnPControlPoint, <a class="indexterm" href="GUPnPControlPoint.html#GUPnPControlPoint-struct">struct GUPnPControlPoint</a>
</dt>
<dt>GUPnPServiceStateVariableInfo, <a class="indexterm" href="gupnp-gupnp-service-introspection.html#GUPnPServiceStateVariableInfo">GUPnPServiceStateVariableInfo</a>
</dt>
+<dt>GUPnPWhiteList, <a class="indexterm" href="GUPnPWhiteList.html#GUPnPWhiteList-struct">struct GUPnPWhiteList</a>
+</dt>
<dt>GUPnPXMLDoc, <a class="indexterm" href="GUPnPXMLDoc.html#GUPnPXMLDoc-struct">struct GUPnPXMLDoc</a>
</dt>
<dt>GUPnPXMLError, <a class="indexterm" href="gupnp-Error-codes.html#GUPnPXMLError">enum GUPnPXMLError</a>
</dt>
<dt>gupnp_context_manager_get_port, <a class="indexterm" href="GUPnPContextManager.html#gupnp-context-manager-get-port">gupnp_context_manager_get_port ()</a>
</dt>
+<dt>gupnp_context_manager_get_white_list, <a class="indexterm" href="GUPnPContextManager.html#gupnp-context-manager-get-white-list">gupnp_context_manager_get_white_list ()</a>
+</dt>
<dt>gupnp_context_manager_manage_control_point, <a class="indexterm" href="GUPnPContextManager.html#gupnp-context-manager-manage-control-point">gupnp_context_manager_manage_control_point ()</a>
</dt>
<dt>gupnp_context_manager_manage_root_device, <a class="indexterm" href="GUPnPContextManager.html#gupnp-context-manager-manage-root-device">gupnp_context_manager_manage_root_device ()</a>
</dt>
<dt>gupnp_device_info_list_dlna_capabilities, <a class="indexterm" href="GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-capabilities">gupnp_device_info_list_dlna_capabilities ()</a>
</dt>
+<dt>gupnp_device_info_list_dlna_device_class_identifier, <a class="indexterm" href="GUPnPDeviceInfo.html#gupnp-device-info-list-dlna-device-class-identifier">gupnp_device_info_list_dlna_device_class_identifier ()</a>
+</dt>
<dt>gupnp_device_info_list_services, <a class="indexterm" href="GUPnPDeviceInfo.html#gupnp-device-info-list-services">gupnp_device_info_list_services ()</a>
</dt>
<dt>gupnp_device_info_list_service_types, <a class="indexterm" href="GUPnPDeviceInfo.html#gupnp-device-info-list-service-types">gupnp_device_info_list_service_types ()</a>
</dt>
<dt>GUPNP_TYPE_UUID, <a class="indexterm" href="gupnp-Special-UPnP-types.html#GUPNP-TYPE-UUID:CAPS">GUPNP_TYPE_UUID</a>
</dt>
+<dt>gupnp_white_list_add_entry, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-add-entry">gupnp_white_list_add_entry ()</a>
+</dt>
+<dt>gupnp_white_list_check_context, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-check-context">gupnp_white_list_check_context ()</a>
+</dt>
+<dt>gupnp_white_list_clear, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-clear">gupnp_white_list_clear ()</a>
+</dt>
+<dt>gupnp_white_list_get_enabled, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-get-enabled">gupnp_white_list_get_enabled ()</a>
+</dt>
+<dt>gupnp_white_list_get_entries, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-get-entries">gupnp_white_list_get_entries ()</a>
+</dt>
+<dt>gupnp_white_list_is_empty, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-is-empty">gupnp_white_list_is_empty ()</a>
+</dt>
+<dt>gupnp_white_list_new, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-new">gupnp_white_list_new ()</a>
+</dt>
+<dt>gupnp_white_list_remove_entry, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-remove-entry">gupnp_white_list_remove_entry ()</a>
+</dt>
+<dt>gupnp_white_list_set_enabled, <a class="indexterm" href="GUPnPWhiteList.html#gupnp-white-list-set-enabled">gupnp_white_list_set_enabled ()</a>
+</dt>
<dt>gupnp_xml_doc_new, <a class="indexterm" href="GUPnPXMLDoc.html#gupnp-xml-doc-new">gupnp_xml_doc_new ()</a>
</dt>
<dt>gupnp_xml_doc_new_from_path, <a class="indexterm" href="GUPnPXMLDoc.html#gupnp-xml-doc-new-from-path">gupnp_xml_doc_new_from_path ()</a>
<a name="server-tutorial"></a>Writing a UPnP Service</h2></div></div></div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp10638256"></a>Introduction</h2></div></div></div>
+<a name="idp5609200"></a>Introduction</h2></div></div></div>
<p>
This chapter explains how to implement a UPnP service using GUPnP. For
this example we will create a virtual UPnP-enabled light bulb.
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp7011344"></a>Defining the Device</h2></div></div></div>
+<a name="idp7391456"></a>Defining the Device</h2></div></div></div>
<p>
The first step is to write the <em class="firstterm">device description</em>
file. This is a short XML document which describes the device and what
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp6936832"></a>Defining Services</h2></div></div></div>
+<a name="idm8096"></a>Defining Services</h2></div></div></div>
<p>
Because we are using a standard service we can use the service description
from the specification. This is the <code class="literal">SwitchPower1</code>
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp9823184"></a>Implementing the Device</h2></div></div></div>
+<a name="idp6387216"></a>Implementing the Device</h2></div></div></div>
<p>
Before starting to implement the device, some boilerplate code is needed
to initialise GUPnP. GLib types and threading needs to be initialised,
/* Create the GUPnP context with default host and port */
context = gupnp_context_new (NULL, NULL, 0, NULL);</pre>
<p>
- UPnP uses HTTP to provide the device and service description files, so
- next we tell GUPnP to publish them. This is done with
- gupnp_context_host_path() which takes a local filename to send when a
- certain server path is requested.
- </p>
-<pre class="programlisting">gupnp_context_host_path (context, "BinaryLight1.xml", "/BinaryLight1.xml");
-gupnp_context_host_path (context, "SwitchPower1.xml", "/SwitchPower1.xml");</pre>
-<p>
- Next the root device can be created.
+ Next the root device can be created. The name of the device description
+ file can be passed as an absolute file path or a relative path to the
+ second parameter of gupnp_root_device_new(). The service description
+ files referenced in the device description are expected to be at the path
+ given there as well.
</p>
<pre class="programlisting">GUPnPRootDevice *dev;
/* Create the root device object */
-dev = gupnp_root_device_new (context, "/BinaryLight1.xml");
+dev = gupnp_root_device_new (context, "BinaryLight1.xml", ".");
/* Activate the root device, so that it announces itself */
gupnp_root_device_set_available (dev, TRUE);</pre>
<p>
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp9829280"></a>Implementing a Service</h2></div></div></div>
+<a name="idp8436720"></a>Implementing a Service</h2></div></div></div>
<p>
To implement a service we first fetch the #GUPnPService from the root
device using gupnp_device_info_get_service() (#GUPnPRootDevice is a
</div>
<div class="simplesect">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
-<a name="idp5162272"></a>Generating Service-specific Wrappers</h2></div></div></div>
+<a name="idp9527792"></a>Generating Service-specific Wrappers</h2></div></div></div>
<p>
Using service-specific wrappers can simplify the implementation of a service.
Wrappers can be generated with <a class="xref" href="gupnp-binding-tool.html" title="gupnp-binding-tool"><span class="refentrytitle">gupnp-binding-tool</span>(1)</a>
/* Create the GUPnP context with default host and port */
context = gupnp_context_new (NULL, NULL, 0, NULL);</programlisting>
<para>
- UPnP uses HTTP to provide the device and service description files, so
- next we tell GUPnP to publish them. This is done with
- gupnp_context_host_path() which takes a local filename to send when a
- certain server path is requested.
- </para>
-<programlisting>gupnp_context_host_path (context, "BinaryLight1.xml", "/BinaryLight1.xml");
-gupnp_context_host_path (context, "SwitchPower1.xml", "/SwitchPower1.xml");</programlisting>
- <para>
- Next the root device can be created.
+ Next the root device can be created. The name of the device description
+ file can be passed as an absolute file path or a relative path to the
+ second parameter of gupnp_root_device_new(). The service description
+ files referenced in the device description are expected to be at the path
+ given there as well.
</para>
<programlisting>GUPnPRootDevice *dev;
/* Create the root device object */
-dev = gupnp_root_device_new (context, "/BinaryLight1.xml");
+dev = gupnp_root_device_new (context, "BinaryLight1.xml", ".");
/* Activate the root device, so that it announces itself */
gupnp_root_device_set_available (dev, TRUE);</programlisting>
<para>
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPContextManager
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPContextManager ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SIGNAL GUPnPContextManager::context-available ##### -->
-<para>
-
-</para>
-
-@gupnpcontextmanager: the object which received the signal.
-@arg1:
-
-<!-- ##### SIGNAL GUPnPContextManager::context-unavailable ##### -->
-<para>
-
-</para>
-
-@gupnpcontextmanager: the object which received the signal.
-@arg1:
-
-<!-- ##### ARG GUPnPContextManager:main-context ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPContextManager:port ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION gupnp_context_manager_new ##### -->
-<para>
-
-</para>
-
-@main_context:
-@port:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_manager_create ##### -->
-<para>
-
-</para>
-
-@port:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_manager_rescan_control_points ##### -->
-<para>
-
-</para>
-
-@manager:
-
-
-<!-- ##### FUNCTION gupnp_context_manager_manage_control_point ##### -->
-<para>
-
-</para>
-
-@manager:
-@control_point:
-
-
-<!-- ##### FUNCTION gupnp_context_manager_manage_root_device ##### -->
-<para>
-
-</para>
-
-@manager:
-@root_device:
-
-
-<!-- ##### FUNCTION gupnp_context_manager_get_port ##### -->
-<para>
-
-</para>
-
-@manager:
-@Returns:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPContext
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPContext ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG GUPnPContext:default-language ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPContext:port ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPContext:server ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPContext:session ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPContext:subscription-timeout ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION gupnp_context_new ##### -->
-<para>
-
-</para>
-
-@main_context:
-@iface:
-@port:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_get_host_ip ##### -->
-<para>
-
-</para>
-
-@context:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_get_port ##### -->
-<para>
-
-</para>
-
-@context:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_get_server ##### -->
-<para>
-
-</para>
-
-@context:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_get_session ##### -->
-<para>
-
-</para>
-
-@context:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_set_subscription_timeout ##### -->
-<para>
-
-</para>
-
-@context:
-@timeout:
-
-
-<!-- ##### FUNCTION gupnp_context_get_subscription_timeout ##### -->
-<para>
-
-</para>
-
-@context:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_get_default_language ##### -->
-<para>
-
-</para>
-
-@context:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_set_default_language ##### -->
-<para>
-
-</para>
-
-@context:
-@language:
-
-
-<!-- ##### FUNCTION gupnp_context_host_path ##### -->
-<para>
-
-</para>
-
-@context:
-@local_path:
-@server_path:
-
-
-<!-- ##### FUNCTION gupnp_context_host_path_for_agent ##### -->
-<para>
-
-</para>
-
-@context:
-@local_path:
-@server_path:
-@user_agent:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_context_unhost_path ##### -->
-<para>
-
-</para>
-
-@context:
-@server_path:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPControlPoint
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPControlPoint ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SIGNAL GUPnPControlPoint::device-proxy-available ##### -->
-<para>
-
-</para>
-
-@gupnpcontrolpoint: the object which received the signal.
-@arg1:
-
-<!-- ##### SIGNAL GUPnPControlPoint::device-proxy-unavailable ##### -->
-<para>
-
-</para>
-
-@gupnpcontrolpoint: the object which received the signal.
-@arg1:
-
-<!-- ##### SIGNAL GUPnPControlPoint::service-proxy-available ##### -->
-<para>
-
-</para>
-
-@gupnpcontrolpoint: the object which received the signal.
-@arg1:
-
-<!-- ##### SIGNAL GUPnPControlPoint::service-proxy-unavailable ##### -->
-<para>
-
-</para>
-
-@gupnpcontrolpoint: the object which received the signal.
-@arg1:
-
-<!-- ##### ARG GUPnPControlPoint:resource-factory ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION gupnp_control_point_new ##### -->
-<para>
-
-</para>
-
-@context:
-@target:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_control_point_new_full ##### -->
-<para>
-
-</para>
-
-@context:
-@factory:
-@target:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_control_point_get_resource_factory ##### -->
-<para>
-
-</para>
-
-@control_point:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_control_point_get_context ##### -->
-<para>
-
-</para>
-
-@control_point:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_control_point_list_device_proxies ##### -->
-<para>
-
-</para>
-
-@control_point:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_control_point_list_service_proxies ##### -->
-<para>
-
-</para>
-
-@control_point:
-@Returns:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPDeviceInfo
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPDeviceInfo ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG GUPnPDeviceInfo:context ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPDeviceInfo:device-type ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPDeviceInfo:document ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPDeviceInfo:element ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPDeviceInfo:location ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPDeviceInfo:resource-factory ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPDeviceInfo:udn ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPDeviceInfo:url-base ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION gupnp_device_info_get_resource_factory ##### -->
-<para>
-
-</para>
-
-@device_info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_context ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_location ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_url_base ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_udn ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_device_type ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_friendly_name ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_manufacturer ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_manufacturer_url ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_model_description ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_model_name ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_model_number ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_model_url ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_serial_number ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_presentation_url ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_upc ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_icon_url ##### -->
-<para>
-
-</para>
-
-@info:
-@requested_mime_type:
-@requested_depth:
-@requested_width:
-@requested_height:
-@prefer_bigger:
-@mime_type:
-@depth:
-@width:
-@height:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_list_dlna_capabilities ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_description_value ##### -->
-<para>
-
-</para>
-
-@info:
-@element:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_list_devices ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_list_device_types ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_device ##### -->
-<para>
-
-</para>
-
-@info:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_list_services ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_list_service_types ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_device_info_get_service ##### -->
-<para>
-
-</para>
-
-@info:
-@type:
-@Returns:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPDeviceProxy
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPDeviceProxy ##### -->
-<para>
-
-</para>
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPDevice
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPDevice ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG GUPnPDevice:root-device ##### -->
-<para>
-
-</para>
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-Error codes
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO GUPNP_SERVER_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM GUPnPServerError ##### -->
-<para>
-
-</para>
-
-@GUPNP_SERVER_ERROR_INTERNAL_SERVER_ERROR:
-@GUPNP_SERVER_ERROR_NOT_FOUND:
-@GUPNP_SERVER_ERROR_NOT_IMPLEMENTED:
-@GUPNP_SERVER_ERROR_INVALID_RESPONSE:
-@GUPNP_SERVER_ERROR_INVALID_URL:
-@GUPNP_SERVER_ERROR_OTHER:
-
-<!-- ##### MACRO GUPNP_EVENTING_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM GUPnPEventingError ##### -->
-<para>
-
-</para>
-
-@GUPNP_EVENTING_ERROR_SUBSCRIPTION_FAILED:
-@GUPNP_EVENTING_ERROR_SUBSCRIPTION_LOST:
-@GUPNP_EVENTING_ERROR_NOTIFY_FAILED:
-
-<!-- ##### MACRO GUPNP_CONTROL_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM GUPnPControlError ##### -->
-<para>
-
-</para>
-
-@GUPNP_CONTROL_ERROR_INVALID_ACTION:
-@GUPNP_CONTROL_ERROR_INVALID_ARGS:
-@GUPNP_CONTROL_ERROR_OUT_OF_SYNC:
-@GUPNP_CONTROL_ERROR_ACTION_FAILED:
-
-<!-- ##### MACRO GUPNP_XML_ERROR ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### ENUM GUPnPXMLError ##### -->
-<para>
-
-</para>
-
-@GUPNP_XML_ERROR_PARSE:
-@GUPNP_XML_ERROR_NO_NODE:
-@GUPNP_XML_ERROR_EMPTY_NODE:
-@GUPNP_XML_ERROR_INVALID_ATTRIBUTE:
-@GUPNP_XML_ERROR_OTHER:
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPResourceFactory
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPResourceFactory ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION gupnp_resource_factory_new ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_resource_factory_get_default ##### -->
-<para>
-
-</para>
-
-@void:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_resource_factory_register_resource_type ##### -->
-<para>
-
-</para>
-
-@factory:
-@upnp_type:
-@type:
-
-
-<!-- ##### FUNCTION gupnp_resource_factory_unregister_resource_type ##### -->
-<para>
-
-</para>
-
-@factory:
-@upnp_type:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_resource_factory_register_resource_proxy_type ##### -->
-<para>
-
-</para>
-
-@factory:
-@upnp_type:
-@type:
-
-
-<!-- ##### FUNCTION gupnp_resource_factory_unregister_resource_proxy_type ##### -->
-<para>
-
-</para>
-
-@factory:
-@upnp_type:
-@Returns:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPRootDevice
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPRootDevice ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG GUPnPRootDevice:available ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPRootDevice:description-dir ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPRootDevice:description-doc ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPRootDevice:description-path ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION gupnp_root_device_new ##### -->
-<para>
-
-</para>
-
-@context:
-@description_path:
-@description_dir:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_root_device_new_full ##### -->
-<para>
-
-</para>
-
-@context:
-@factory:
-@description_doc:
-@description_path:
-@description_dir:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_root_device_set_available ##### -->
-<para>
-
-</para>
-
-@root_device:
-@available:
-
-
-<!-- ##### FUNCTION gupnp_root_device_get_available ##### -->
-<para>
-
-</para>
-
-@root_device:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_root_device_get_relative_location ##### -->
-<para>
-
-</para>
-
-@root_device:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_root_device_get_description_dir ##### -->
-<para>
-
-</para>
-
-@root_device:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_root_device_get_description_path ##### -->
-<para>
-
-</para>
-
-@root_device:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_root_device_get_ssdp_resource_group ##### -->
-<para>
-
-</para>
-
-@root_device:
-@Returns:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPServiceInfo
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPServiceInfo ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG GUPnPServiceInfo:context ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPServiceInfo:document ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPServiceInfo:element ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPServiceInfo:location ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPServiceInfo:service-type ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPServiceInfo:udn ##### -->
-<para>
-
-</para>
-
-<!-- ##### ARG GUPnPServiceInfo:url-base ##### -->
-<para>
-
-</para>
-
-<!-- ##### USER_FUNCTION GUPnPServiceIntrospectionCallback ##### -->
-<para>
-
-</para>
-
-@info:
-@introspection:
-@error:
-@user_data:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_context ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_location ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_url_base ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_udn ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_service_type ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_id ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_scpd_url ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_control_url ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_event_subscription_url ##### -->
-<para>
-
-</para>
-
-@info:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_introspection ##### -->
-<para>
-
-</para>
-
-@info:
-@error:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_info_get_introspection_async ##### -->
-<para>
-
-</para>
-
-@info:
-@callback:
-@user_data:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPServiceIntrospection
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### ENUM GUPnPServiceActionArgDirection ##### -->
-<para>
-
-</para>
-
-@GUPNP_SERVICE_ACTION_ARG_DIRECTION_IN:
-@GUPNP_SERVICE_ACTION_ARG_DIRECTION_OUT:
-
-<!-- ##### STRUCT GUPnPServiceActionArgInfo ##### -->
-<para>
-
-</para>
-
-@name:
-@direction:
-@related_state_variable:
-@retval:
-
-<!-- ##### STRUCT GUPnPServiceActionInfo ##### -->
-<para>
-
-</para>
-
-@name:
-@arguments:
-
-<!-- ##### STRUCT GUPnPServiceStateVariableInfo ##### -->
-<para>
-
-</para>
-
-@name:
-@send_events:
-@is_numeric:
-@type:
-@default_value:
-@minimum:
-@maximum:
-@step:
-@allowed_values:
-
-<!-- ##### STRUCT GUPnPServiceIntrospection ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### ARG GUPnPServiceIntrospection:scpd ##### -->
-<para>
-
-</para>
-
-<!-- ##### FUNCTION gupnp_service_introspection_list_action_names ##### -->
-<para>
-
-</para>
-
-@introspection:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_introspection_list_actions ##### -->
-<para>
-
-</para>
-
-@introspection:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_introspection_get_action ##### -->
-<para>
-
-</para>
-
-@introspection:
-@action_name:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_introspection_list_state_variable_names ##### -->
-<para>
-
-</para>
-
-@introspection:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_introspection_list_state_variables ##### -->
-<para>
-
-</para>
-
-@introspection:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_introspection_get_state_variable ##### -->
-<para>
-
-</para>
-
-@introspection:
-@variable_name:
-@Returns:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPServiceProxy
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPServiceProxy ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SIGNAL GUPnPServiceProxy::subscription-lost ##### -->
-<para>
-
-</para>
-
-@gupnpserviceproxy: the object which received the signal.
-@arg1:
-
-<!-- ##### ARG GUPnPServiceProxy:subscribed ##### -->
-<para>
-
-</para>
-
-<!-- ##### STRUCT GUPnPServiceProxyAction ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### USER_FUNCTION GUPnPServiceProxyActionCallback ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@user_data:
-
-
-<!-- ##### USER_FUNCTION GUPnPServiceProxyNotifyCallback ##### -->
-<para>
-
-</para>
-
-@proxy:
-@variable:
-@value:
-@user_data:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_send_action ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@...:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_send_action_valist ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@var_args:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_send_action_hash ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@in_hash:
-@out_hash:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_send_action_list ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@in_names:
-@in_values:
-@out_names:
-@out_types:
-@out_values:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_begin_action ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@callback:
-@user_data:
-@...:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_begin_action_valist ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@callback:
-@user_data:
-@var_args:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_begin_action_hash ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@callback:
-@user_data:
-@hash:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_begin_action_list ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@in_names:
-@in_values:
-@callback:
-@user_data:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_end_action ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@...:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_end_action_valist ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@var_args:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_end_action_hash ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@hash:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_end_action_list ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-@error:
-@out_names:
-@out_types:
-@out_values:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_cancel_action ##### -->
-<para>
-
-</para>
-
-@proxy:
-@action:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_add_notify ##### -->
-<para>
-
-</para>
-
-@proxy:
-@variable:
-@type:
-@callback:
-@user_data:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_remove_notify ##### -->
-<para>
-
-</para>
-
-@proxy:
-@variable:
-@callback:
-@user_data:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_set_subscribed ##### -->
-<para>
-
-</para>
-
-@proxy:
-@subscribed:
-
-
-<!-- ##### FUNCTION gupnp_service_proxy_get_subscribed ##### -->
-<para>
-
-</para>
-
-@proxy:
-@Returns:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPService
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPService ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SIGNAL GUPnPService::action-invoked ##### -->
-<para>
-
-</para>
-
-@gupnpservice: the object which received the signal.
-@arg1:
-
-<!-- ##### SIGNAL GUPnPService::notify-failed ##### -->
-<para>
-
-</para>
-
-@gupnpservice: the object which received the signal.
-@arg1:
-@arg2:
-
-<!-- ##### SIGNAL GUPnPService::query-variable ##### -->
-<para>
-
-</para>
-
-@gupnpservice: the object which received the signal.
-@arg1:
-@arg2:
-
-<!-- ##### ARG GUPnPService:root-device ##### -->
-<para>
-
-</para>
-
-<!-- ##### STRUCT GUPnPServiceAction ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_name ##### -->
-<para>
-
-</para>
-
-@action:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_locales ##### -->
-<para>
-
-</para>
-
-@action:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get ##### -->
-<para>
-
-</para>
-
-@action:
-@...:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_valist ##### -->
-<para>
-
-</para>
-
-@action:
-@var_args:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_value ##### -->
-<para>
-
-</para>
-
-@action:
-@argument:
-@value:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_gvalue ##### -->
-<para>
-
-</para>
-
-@action:
-@argument:
-@type:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_values ##### -->
-<para>
-
-</para>
-
-@action:
-@arg_names:
-@arg_types:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_action_set ##### -->
-<para>
-
-</para>
-
-@action:
-@...:
-
-
-<!-- ##### FUNCTION gupnp_service_action_set_valist ##### -->
-<para>
-
-</para>
-
-@action:
-@var_args:
-
-
-<!-- ##### FUNCTION gupnp_service_action_set_value ##### -->
-<para>
-
-</para>
-
-@action:
-@argument:
-@value:
-
-
-<!-- ##### FUNCTION gupnp_service_action_set_values ##### -->
-<para>
-
-</para>
-
-@action:
-@arg_names:
-@arg_values:
-
-
-<!-- ##### FUNCTION gupnp_service_action_return ##### -->
-<para>
-
-</para>
-
-@action:
-
-
-<!-- ##### FUNCTION gupnp_service_action_return_error ##### -->
-<para>
-
-</para>
-
-@action:
-@error_code:
-@error_description:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_message ##### -->
-<para>
-
-</para>
-
-@action:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_action_get_argument_count ##### -->
-<para>
-
-</para>
-
-@action:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_service_notify ##### -->
-<para>
-
-</para>
-
-@service:
-@...:
-
-
-<!-- ##### FUNCTION gupnp_service_notify_valist ##### -->
-<para>
-
-</para>
-
-@service:
-@var_args:
-
-
-<!-- ##### FUNCTION gupnp_service_notify_value ##### -->
-<para>
-
-</para>
-
-@service:
-@variable:
-@value:
-
-
-<!-- ##### FUNCTION gupnp_service_freeze_notify ##### -->
-<para>
-
-</para>
-
-@service:
-
-
-<!-- ##### FUNCTION gupnp_service_thaw_notify ##### -->
-<para>
-
-</para>
-
-@service:
-
-
-<!-- ##### FUNCTION gupnp_service_signals_autoconnect ##### -->
-<para>
-
-</para>
-
-@service:
-@user_data:
-@error:
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-Special UPnP types
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### MACRO GUPNP_TYPE_BIN_BASE64 ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_BIN_HEX ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_DATE ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_DATE_TIME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_DATE_TIME_TZ ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_TIME ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_TIME_TZ ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_URI ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### MACRO GUPNP_TYPE_UUID ##### -->
-<para>
-
-</para>
-
-
-
+++ /dev/null
-<!-- ##### SECTION Title ##### -->
-GUPnPXMLDoc
-
-<!-- ##### SECTION Short_Description ##### -->
-
-
-<!-- ##### SECTION Long_Description ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION See_Also ##### -->
-<para>
-
-</para>
-
-
-<!-- ##### SECTION Stability_Level ##### -->
-
-
-<!-- ##### SECTION Image ##### -->
-
-
-<!-- ##### STRUCT GUPnPXMLDoc ##### -->
-<para>
-
-</para>
-
-@doc:
-
-<!-- ##### FUNCTION gupnp_xml_doc_new ##### -->
-<para>
-
-</para>
-
-@xml_doc:
-@Returns:
-
-
-<!-- ##### FUNCTION gupnp_xml_doc_new_from_path ##### -->
-<para>
-
-</para>
-
-@path:
-@error:
-@Returns:
-
-
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@
$(HTML_IMAGES) \
$(SETUP_FILES)
-DOC_STAMPS=setup-build.stamp scan-build.stamp tmpl-build.stamp sgml-build.stamp \
+DOC_STAMPS=setup-build.stamp scan-build.stamp sgml-build.stamp \
html-build.stamp pdf-build.stamp \
- tmpl.stamp sgml.stamp html.stamp pdf.stamp
+ sgml.stamp html.stamp pdf.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \
done; \
fi; \
- test -d $(abs_srcdir)/tmpl && \
- { cp -rp $(abs_srcdir)/tmpl $(abs_builddir)/; \
- chmod -R u+w $(abs_builddir)/tmpl; } \
fi
@touch setup-build.stamp
+
#### scan ####
scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB)
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp
@true
-#### templates ####
-
-tmpl-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt
- @echo ' DOC Rebuilding template files'
- @gtkdoc-mktmpl --module=$(DOC_MODULE) $(MKTMPL_OPTIONS)
- @if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
- if test -w $(abs_srcdir) ; then \
- cp -rp $(abs_builddir)/tmpl $(abs_srcdir)/; \
- fi \
- fi
- @touch tmpl-build.stamp
-
-tmpl.stamp: tmpl-build.stamp
- @true
-
-$(srcdir)/tmpl/*.sgml:
- @true
-
#### xml ####
-sgml-build.stamp: tmpl.stamp $(DOC_MODULE)-sections.txt $(srcdir)/tmpl/*.sgml $(expand_content_files)
+sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files)
@echo ' DOC Building XML'
- @-chmod -R u+w $(srcdir)
@_source_dir='' ; \
for i in $(DOC_SOURCE_DIR) ; do \
_source_dir="$${_source_dir} --source-dir=$$i" ; \
$(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \
rm -f $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types; \
- rm -rf tmpl; \
fi
maintainer-clean-local: clean
endif
dist-hook: dist-check-gtkdoc dist-hook-local
- @mkdir $(distdir)/tmpl
@mkdir $(distdir)/html
- @-cp ./tmpl/*.sgml $(distdir)/tmpl
@cp ./html/* $(distdir)/html
@-cp ./$(DOC_MODULE).pdf $(distdir)/
@-cp ./$(DOC_MODULE).types $(distdir)/
gupnp-service-proxy.h \
gupnp-service-introspection.h \
gupnp-xml-doc.h \
+ gupnp-white-list.h \
gupnp-types.h \
gupnp.h
gupnp-service-proxy.c \
gupnp-service-introspection.c \
gupnp-xml-doc.c \
+ gupnp-white-list.c \
gupnp-types.c
gupnp-device-info.h gupnp-device-proxy.h gupnp-error.h \
gupnp-resource-factory.h gupnp-root-device.h gupnp-service.h \
gupnp-service-info.h gupnp-service-proxy.h \
- gupnp-service-introspection.h gupnp-xml-doc.h gupnp-types.h \
- gupnp.h gupnp-context.c gupnp-context-manager.c \
- gupnp-control-point.c gupnp-device.c gupnp-device-info.c \
- gupnp-device-proxy.c gupnp-error.c gupnp-resource-factory.c \
- gupnp-root-device.c gupnp-service.c gupnp-service-info.c \
- gupnp-service-proxy.c gupnp-service-introspection.c \
- gupnp-xml-doc.c gupnp-types.c http-headers.c http-headers.h \
+ gupnp-service-introspection.h gupnp-xml-doc.h \
+ gupnp-white-list.h gupnp-types.h gupnp.h gupnp-context.c \
+ gupnp-context-manager.c gupnp-control-point.c gupnp-device.c \
+ gupnp-device-info.c gupnp-device-proxy.c gupnp-error.c \
+ gupnp-resource-factory.c gupnp-root-device.c gupnp-service.c \
+ gupnp-service-info.c gupnp-service-proxy.c \
+ gupnp-service-introspection.c gupnp-xml-doc.c \
+ gupnp-white-list.c gupnp-types.c http-headers.c http-headers.h \
gupnp-context-private.h gupnp-unix-context-manager.c \
gupnp-unix-context-manager.h gupnp-network-manager.c \
gupnp-network-manager.h gupnp-connman-manager.c \
gupnp-device.lo gupnp-device-info.lo gupnp-device-proxy.lo \
gupnp-error.lo gupnp-resource-factory.lo gupnp-root-device.lo \
gupnp-service.lo gupnp-service-info.lo gupnp-service-proxy.lo \
- gupnp-service-introspection.lo gupnp-xml-doc.lo gupnp-types.lo
+ gupnp-service-introspection.lo gupnp-xml-doc.lo \
+ gupnp-white-list.lo gupnp-types.lo
@OS_WIN32_FALSE@@USE_NETWORK_MANAGER_TRUE@am__objects_3 = gupnp-network-manager.lo
@OS_WIN32_FALSE@@USE_CONNMAN_TRUE@@USE_NETWORK_MANAGER_FALSE@am__objects_4 = gupnp-connman-manager.lo
@HAVE_NETLINK_TRUE@am__objects_5 = gupnp-linux-context-manager.lo
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@
gupnp-service-proxy.h \
gupnp-service-introspection.h \
gupnp-xml-doc.h \
+ gupnp-white-list.h \
gupnp-types.h \
gupnp.h
gupnp-service-proxy.c \
gupnp-service-introspection.c \
gupnp-xml-doc.c \
+ gupnp-white-list.c \
gupnp-types.c
BUILT_SOURCES = gupnp-marshal.c gupnp-marshal.h
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-simple-context-manager.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-types.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-unix-context-manager.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-white-list.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-windows-context-manager.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-xml-doc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvalue-util.Plo@am__quote@
/*
* Copyright (C) 2009 Nokia Corporation.
* Copyright (C) 2006, 2007, 2008 OpenedHand Ltd.
+ * Copyright (C) 2013 Intel Corporation.
*
* Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
* Jorn Baayen <jorn@openedhand.com>
+ * Ludovic Ferrandis <ludovic.ferrandis@intel.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
GUPnPContextManager *impl;
GList *objects; /* control points and root devices */
+ GList *blacklisted; /* Blacklisted Context */
+
+ GUPnPWhiteList *white_list;
};
enum {
PROP_0,
PROP_MAIN_CONTEXT,
PROP_PORT,
+ PROP_WHITE_LIST
};
enum {
static guint signals[SIGNAL_LAST];
static void
+on_context_available (GUPnPContextManager *manager,
+ GUPnPContext *context,
+ G_GNUC_UNUSED gpointer *user_data)
+{
+ GUPnPWhiteList *white_list;
+
+ white_list = manager->priv->white_list;
+
+ /* Try to catch the notification, only if the white list
+ * is enabled, not empty and the context doesn't match */
+ if (!gupnp_white_list_is_empty (white_list) &&
+ gupnp_white_list_get_enabled (white_list) &&
+ !gupnp_white_list_check_context (white_list, context)) {
+ /* If the conext doesn't match, block the notification
+ * and disable the context */
+ g_signal_stop_emission_by_name (manager, "context-available");
+
+ /* Make sure we don't send anything on now blocked network */
+ g_object_set (context, "active", FALSE, NULL);
+
+ /* Save it in case we need to re-enable it */
+ manager->priv->blacklisted = g_list_prepend (
+ manager->priv->blacklisted,
+ g_object_ref (context));
+ }
+}
+
+static void
on_context_unavailable (GUPnPContextManager *manager,
GUPnPContext *context,
G_GNUC_UNUSED gpointer *user_data)
{
GList *l;
+ GList *black;
/* Make sure we don't send anything on now unavailable network */
g_object_set (context, "active", FALSE, NULL);
l = l->next;
}
}
+
+ black = g_list_find (manager->priv->blacklisted, context);
+
+ if (black != NULL) {
+ g_signal_stop_emission_by_name (manager, "context-unavailable");
+
+ g_object_unref (black->data);
+ manager->priv->blacklisted =
+ g_list_delete_link (manager->priv->blacklisted, black);
+ }
+}
+
+static void
+gupnp_context_manager_filter_context (GUPnPWhiteList *white_list,
+ GUPnPContextManager *manager,
+ gboolean check)
+{
+ GList *next;
+ GList *obj;
+ GList *blk;
+ gboolean match;
+ GUPnPContext *context;
+ GSSDPResourceBrowser *browser;
+
+ obj = manager->priv->objects;
+ blk = manager->priv->blacklisted;
+
+ while (obj != NULL) {
+ if (!GUPNP_IS_CONTROL_POINT (obj->data))
+ continue;
+
+ /* If the white list is empty, treat it as disabled */
+ if (check) {
+ /* Filter out context */
+ context = gupnp_control_point_get_context (obj->data);
+ match = gupnp_white_list_check_context (white_list,
+ context);
+ } else {
+ /* Re-activate all context, if needed */
+ match = TRUE;
+ }
+
+ browser = GSSDP_RESOURCE_BROWSER (obj->data);
+ gssdp_resource_browser_set_active (browser, match);
+
+ if (match)
+ (void) gssdp_resource_browser_rescan (browser);
+
+ obj = obj->next;
+ }
+
+ while (blk != NULL) {
+ /* If the white list is empty, treat it as disabled */
+ if (check)
+ /* Filter out context */
+ match = gupnp_white_list_check_context (white_list,
+ blk->data);
+ else
+ /* Re-activate all context, if needed */
+ match = TRUE;
+
+ if (!match) {
+ blk = blk->next;
+ continue;
+ }
+
+ next = blk->next;
+ g_object_set (blk->data, "active", TRUE, NULL);
+
+ g_signal_emit_by_name (manager, "context-available", blk->data);
+
+ g_object_unref (blk->data);
+ manager->priv->blacklisted = g_list_delete_link (
+ manager->priv->blacklisted,
+ blk);
+ blk = next;
+ }
+}
+
+static void
+on_white_list_change_cb (GUPnPWhiteList *white_list,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ GUPnPContextManager *manager = GUPNP_CONTEXT_MANAGER (user_data);
+ gboolean enabled;
+ gboolean is_empty;
+
+ enabled = gupnp_white_list_get_enabled (white_list);
+ is_empty = gupnp_white_list_is_empty (white_list);
+
+ if (enabled)
+ gupnp_context_manager_filter_context (white_list,
+ manager,
+ !is_empty);
+}
+
+static void
+on_white_list_enabled_cb (GUPnPWhiteList *white_list,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ GUPnPContextManager *manager = GUPNP_CONTEXT_MANAGER (user_data);
+ gboolean enabled;
+ gboolean is_empty;
+
+ enabled = gupnp_white_list_get_enabled (white_list);
+ is_empty = gupnp_white_list_is_empty (white_list);
+
+ if (!is_empty)
+ gupnp_context_manager_filter_context (white_list,
+ manager,
+ enabled);
}
static void
G_TYPE_INSTANCE_GET_PRIVATE (manager,
GUPNP_TYPE_CONTEXT_MANAGER,
GUPnPContextManagerPrivate);
+
+ manager->priv->white_list = gupnp_white_list_new ();
+
+ g_signal_connect_after (manager->priv->white_list, "notify::entries",
+ G_CALLBACK (on_white_list_change_cb), manager);
+
+ g_signal_connect_after (manager->priv->white_list, "notify::enabled",
+ G_CALLBACK (on_white_list_enabled_cb), manager);
}
static void
g_value_set_pointer (value,
g_main_context_get_thread_default ());
break;
+ case PROP_WHITE_LIST:
+ g_value_set_object (value, manager->priv->white_list);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
gupnp_context_manager_dispose (GObject *object)
{
GUPnPContextManager *manager;
+ GUPnPWhiteList *wl;
GObjectClass *object_class;
manager = GUPNP_CONTEXT_MANAGER (object);
+ wl = manager->priv->white_list;
+
+ g_signal_handlers_disconnect_by_func (wl,
+ on_white_list_enabled_cb,
+ manager);
- g_list_foreach (manager->priv->objects, (GFunc) g_object_unref, NULL);
- g_list_free (manager->priv->objects);
+ g_signal_handlers_disconnect_by_func (wl,
+ on_white_list_change_cb,
+ NULL);
+
+ g_list_free_full (manager->priv->objects, g_object_unref);
manager->priv->objects = NULL;
+ g_list_free_full (manager->priv->blacklisted, g_object_unref);
+ manager->priv->blacklisted = NULL;
+
+ if (wl) {
+ g_object_unref (wl);
+ manager->priv->white_list = NULL;
+ }
/* Call super */
object_class = G_OBJECT_CLASS (gupnp_context_manager_parent_class);
G_PARAM_STATIC_NICK |
G_PARAM_STATIC_BLURB));
- /**
+ /**
+ * GUPnPContextManager:white-list:
+ *
+ * The white list to use.
+ **/
+ g_object_class_install_property
+ (object_class,
+ PROP_WHITE_LIST,
+ g_param_spec_object ("white-list",
+ "White List",
+ "The white list to use",
+ GUPNP_TYPE_WHITE_LIST,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_NAME |
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB));
+
+ /**
* GUPnPContextManager::context-available:
* @context_manager: The #GUPnPContextManager that received the signal
* @context: The now available #GUPnPContext
*
**/
signals[CONTEXT_AVAILABLE] =
- g_signal_new ("context-available",
- GUPNP_TYPE_CONTEXT_MANAGER,
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE,
- 1,
- GUPNP_TYPE_CONTEXT);
+ g_signal_new_class_handler ("context-available",
+ GUPNP_TYPE_CONTEXT_MANAGER,
+ G_SIGNAL_RUN_FIRST,
+ G_CALLBACK (on_context_available),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1,
+ GUPNP_TYPE_CONTEXT);
/**
* GUPnPContextManager::context-unavailable:
return manager->priv->port;
}
+
+/**
+ * gupnp_context_manager_get_white_list:
+ * @manager: A #GUPnPContextManager
+ *
+ * Get the #GUPnPWhiteList associated with @manager.
+ *
+ * Returns: (transfer none): The #GUPnPWhiteList asssociated with this
+ * context manager.
+ */
+GUPnPWhiteList *
+gupnp_context_manager_get_white_list (GUPnPContextManager *manager)
+{
+ g_return_val_if_fail (GUPNP_IS_CONTEXT_MANAGER (manager), NULL);
+
+ return manager->priv->white_list;
+}
#include <glib.h>
#include "gupnp.h"
+#include "gupnp-white-list.h"
G_BEGIN_DECLS
guint
gupnp_context_manager_get_port (GUPnPContextManager *manager);
+
+GUPnPWhiteList *
+gupnp_context_manager_get_white_list (GUPnPContextManager *manager);
+
G_END_DECLS
#endif /* __GUPNP_CONTEXT_MANAGER_H__ */
* GUPnP classes. It automatically starts a web server on demand.
*
* For debugging, it is possible to see the messages being sent and received by
- * exporting %GUPNP_DEBUG.
+ * exporting <envar>GUPNP_DEBUG</envar>.
*/
#include <config.h>
NULL);
user_agent = g_strdup_printf ("%s GUPnP/" VERSION " DLNADOC/1.50",
- g_get_application_name ()? : "");
+ g_get_prgname ()? : "");
g_object_set (context->priv->session,
SOUP_SESSION_USER_AGENT,
user_agent,
/**
* gupnp_context_set_default_language:
* @context: A #GUPnPContext
- * @language A language tag as defined in RFC 2616 3.10
+ * @language: A language tag as defined in RFC 2616 3.10
*
* Set the default language for the Content-Length header to @language.
*
switch (property_id) {
case PROP_RESOURCE_FACTORY:
- info->priv->factory =
+ info->priv->factory =
GUPNP_RESOURCE_FACTORY (g_value_dup_object (value));
break;
case PROP_CONTEXT:
* @info: A #GUPnPDeviceInfo
*
* Get the friendly name of the device.
- *
+ *
* Return value: A string, or %NULL. g_free() after use.
**/
char *
* @info: A #GUPnPDeviceInfo
*
* Get a URL pointing to the device model's website.
- *
+ *
* Return value: A string, or %NULL. g_free() after use.
**/
char *
* @info: A #GUPnPDeviceInfo
*
* Get the serial number of the device.
- *
+ *
* Return value: A string, or %NULL. g_free() after use.
**/
char *
*
* Get a URL pointing to the device's presentation page, for web-based
* administration.
- *
+ *
* Return value: A string, or %NULL. g_free() after use.
**/
char *
icon = icon_parse (info, element);
if (requested_mime_type) {
- mime_type_ok =
- !strcmp (requested_mime_type,
- (char *) icon->mime_type);
+ if (icon->mime_type)
+ mime_type_ok = !strcmp (
+ requested_mime_type,
+ (char *) icon->mime_type);
+ else
+ mime_type_ok = FALSE;
} else
mime_type_ok = TRUE;
return ret;
}
-/* Returns TRUE if @query matches against @base.
+/* Returns TRUE if @query matches against @base.
* - If @query does not specify a version, it matches any version specified
* in @base.
* - If @query specifies a version, it matches any version specified in @base
}
/**
+ * gupnp_device_info_list_dlna_device_class_identifier:
+ * @info: A #GUPnPDeviceInfo
+ *
+ * Get a #GList of strings that represent the device class and version as
+ * announced in the device description file using the <dlna:X_DLNADOC>
+ * element.
+ * Returns: (transfer full) (element-type utf8): a #GList of newly allocated strings or
+ * %NULL if the device description doesn't contain the <dlna:X_DLNADOC>
+ * element.
+ **/
+GList *
+gupnp_device_info_list_dlna_device_class_identifier (GUPnPDeviceInfo *info)
+{
+ xmlNode *element;
+ GList *list = NULL;
+
+ g_return_val_if_fail (GUPNP_IS_DEVICE_INFO (info), NULL);
+
+ element = info->priv->element;
+
+ for (element = element->children; element; element = element->next) {
+ /* No early exit since the node explicitly may appear multiple
+ * times: 7.2.10.3 */
+ if (!strcmp ("X_DLNADOC", (char *) element->name))
+ list = g_list_prepend (list,
+ xmlNodeGetContent(element));
+ }
+
+ /* Return in order of appearance in document */
+ return g_list_reverse (list);
+}
+
+/**
* gupnp_device_info_list_dlna_capabilities:
* @info: A #GUPnPDeviceInfo
*
- * Get a #GList of strings that represent the device capabilities as announced
+ * Get a #GList of strings that represent the device capabilities as announced
* in the device description file using the <dlna:X_DLNACAP> element.
*
* Returns: (transfer full) (element-type utf8): a #GList of newly allocated strings or
xmlNode *element;
g_return_val_if_fail (GUPNP_IS_DEVICE_INFO (info), NULL);
+ g_return_val_if_fail (type != NULL, NULL);
class = GUPNP_DEVICE_INFO_GET_CLASS (info);
xmlNode *element;
g_return_val_if_fail (GUPNP_IS_DEVICE_INFO (info), NULL);
+ g_return_val_if_fail (type != NULL, NULL);
class = GUPNP_DEVICE_INFO_GET_CLASS (info);
gupnp_device_info_get_presentation_url (GUPnPDeviceInfo *info);
GList *
+gupnp_device_info_list_dlna_device_class_identifier (GUPnPDeviceInfo *info);
+
+GList *
gupnp_device_info_list_dlna_capabilities (GUPnPDeviceInfo *info);
char *
* @GUPNP_XML_ERROR_PARSE: Generic XML parsing error.
* @GUPNP_XML_ERROR_NO_NODE: A required XML node was not found.
* @GUPNP_XML_ERROR_EMPTY_NODE: An XML node is unexpectedly empty.
+ * @GUPNP_XML_ERROR_INVALID_ATTRIBUTE: An XML node has an unknown attribute.
* @GUPNP_XML_ERROR_OTHER: Unknown/unhandled XML related errors.
*
* #GError codes used for errors in the #GUPNP_XML_ERROR domain, during
typedef struct
{
+ gint ref_count;
+
GUPnPNetworkManager *manager;
GUPnPContext *context;
nm_device = g_slice_new0 (NMDevice);
- nm_device->manager = manager;
- nm_device->proxy = device_proxy;
+ g_atomic_int_set (&nm_device->ref_count, 1);
+ nm_device->manager = g_object_ref (manager);
+ nm_device->proxy = g_object_ref (device_proxy);
+
+ return nm_device;
+}
+
+static NMDevice *
+nm_device_ref (NMDevice *nm_device)
+{
+ g_atomic_int_inc (&nm_device->ref_count);
return nm_device;
}
static void
-nm_device_free (NMDevice *nm_device)
+nm_device_unref (NMDevice *nm_device)
{
+ if (!g_atomic_int_dec_and_test (&nm_device->ref_count))
+ return;
+
g_object_unref (nm_device->proxy);
if (nm_device->wifi_proxy != NULL)
g_object_unref (nm_device->wifi_proxy);
g_object_unref (nm_device->context);
}
+ g_object_unref (nm_device->proxy);
+ g_object_unref (nm_device->manager);
g_slice_free (NMDevice, nm_device);
}
static void
ap_proxy_new_cb (GObject *source_object,
GAsyncResult *res,
- gpointer user_data) {
+ gpointer user_data)
+{
NMDevice *nm_device;
GError *error;
if (G_UNLIKELY (error != NULL)) {
g_message ("Failed to create D-Bus proxy: %s", error->message);
g_error_free (error);
+ goto done;
}
create_context_for_device (nm_device);
+
+done:
+ nm_device_unref (nm_device);
}
static void
AP_INTERFACE,
nm_device->manager->priv->cancellable,
ap_proxy_new_cb,
- nm_device);
+ nm_device_ref (nm_device));
}
g_variant_unref (value);
if (G_UNLIKELY (error != NULL)) {
g_message ("Failed to create D-Bus proxy: %s", error->message);
g_error_free (error);
+ goto done;
}
use_new_device (nm_device->manager, nm_device);
+
+done:
+ nm_device_unref (nm_device);
}
static void
g_message ("Failed to create D-Bus proxy: %s", error->message);
g_error_free (error);
- return;
+ goto done;
}
value = g_dbus_proxy_get_cached_property (device_proxy, "DeviceType");
if (G_UNLIKELY (value == NULL)) {
g_object_unref (device_proxy);
- return;
+ goto done;
}
if (G_UNLIKELY (!g_variant_is_of_type (value, G_VARIANT_TYPE_UINT32))) {
g_variant_unref (value);
g_object_unref (device_proxy);
- return;
+ goto done;
}
type = g_variant_get_uint32 (value);
WIFI_INTERFACE,
manager->priv->cancellable,
wifi_proxy_new_cb,
- nm_device);
+ nm_device_ref (nm_device));
} else
use_new_device (manager, nm_device);
+
+done:
+ g_object_unref (manager);
}
static int
DEVICE_INTERFACE,
manager->priv->cancellable,
device_proxy_new_cb,
- manager);
+ g_object_ref (manager));
g_free (device_path);
} else if (g_strcmp0 (signal_name, "DeviceRemoved") == 0) {
GList *device_node;
nm_device = (NMDevice *) device_node->data;
priv->nm_devices = g_list_remove (priv->nm_devices, nm_device);
- nm_device_free (nm_device);
+ nm_device_unref (nm_device);
g_free (device_path);
}
}
error->message);
g_error_free (error);
-
- return;
+ goto done;
}
g_variant_get_child (ret, 0, "ao", &device_iter);
DEVICE_INTERFACE,
manager->priv->cancellable,
device_proxy_new_cb,
- user_data);
+ g_object_ref (user_data));
g_variant_iter_free (device_iter);
g_variant_unref (ret);
+
+done:
+ g_object_unref (manager);
}
static void
g_main_context_get_thread_default ());
g_source_set_callback (manager->priv->idle_context_creation_src,
create_loopback_context,
- manager,
- NULL);
+ g_object_ref (manager),
+ (GDestroyNotify) g_object_unref);
g_source_unref (manager->priv->idle_context_creation_src);
}
-1,
priv->cancellable,
get_devices_cb,
- manager);
+ g_object_ref (manager));
}
static void
}
if (priv->nm_devices != NULL) {
- g_list_foreach (priv->nm_devices, (GFunc) nm_device_free, NULL);
+ g_list_foreach (priv->nm_devices, (GFunc) nm_device_unref,
+ NULL);
g_list_free (priv->nm_devices);
priv->nm_devices = NULL;
}
g_source_destroy (proxy->priv->notify_idle_src);
proxy->priv->notify_idle_src = NULL;
}
-
+
while (proxy->priv->pending_notifies) {
emit_notify_data_free (proxy->priv->pending_notifies->data);
proxy->priv->pending_notifies =
g_list_delete_link (proxy->priv->pending_notifies,
proxy->priv->pending_notifies);
}
-
+
/* Call super */
object_class = G_OBJECT_CLASS (gupnp_service_proxy_parent_class);
object_class->dispose (object);
* @proxy: A #GUPnPServiceProxy
* @action: An action
* @error: The location where to store any error, or %NULL
- * @Varargs: tuples of in parameter name, in parameter type, and in parameter
+ * @...: tuples of in parameter name, in parameter type, and in parameter
* value, followed by %NULL, and then tuples of out parameter name,
* out parameter type, and out parameter value location, terminated with %NULL
*
main_loop);
if (!handle) {
g_main_loop_unref (main_loop);
+ result = FALSE;
- return FALSE;
+ goto out;
}
/* Loop till we get a reply (or time out) */
} else {
g_propagate_error (error, local_error);
}
+out:
va_end (var_args_copy);
g_list_free_full (in_names, g_free);
g_list_free_full (in_values, value_free);
* @callback: (scope async): The callback to call when sending the action has succeeded
* or failed
* @user_data: User data for @callback
- * @Varargs: tuples of in parameter name, in parameter type, and in parameter
+ * @...: tuples of in parameter name, in parameter type, and in parameter
* value, terminated with %NULL
*
* Sends action @action with parameters @Varargs to the service exposed by
* @proxy: A #GUPnPServiceProxy
* @action: A #GUPnPServiceProxyAction handle
* @error: The location where to store any error, or %NULL
- * @Varargs: tuples of out parameter name, out parameter type, and out parameter
+ * @...: tuples of out parameter name, out parameter type, and out parameter
* value location, terminated with %NULL. The out parameter values should be
* freed after use
*
* in @out_values must be freed using #g_list_free and each element in it using
* #g_value_unset and #g_slice_free.
*
- * Return value : %TRUE on success.
+ * Returns: %TRUE on success.
**/
gboolean
gupnp_service_proxy_end_action_list (GUPnPServiceProxy *proxy,
g_source_unref (proxy->priv->notify_idle_src);
}
-
+
/* Everything went OK */
soup_message_set_status (msg, SOUP_STATUS_OK);
}
/**
* gupnp_service_action_get:
* @action: A #GUPnPServiceAction
- * @Varargs: tuples of argument name, argument type, and argument value
+ * @...: tuples of argument name, argument type, and argument value
* location, terminated with %NULL.
*
* Retrieves the specified action arguments.
/**
* gupnp_service_action_set:
* @action: A #GUPnPServiceAction
- * @Varargs: tuples of return value name, return value type, and
+ * @...: tuples of return value name, return value type, and
* actual return value, terminated with %NULL.
*
* Sets the specified action return values.
return;
}
+ /* DLNA 7.2.5.6: Always use HTTP 1.1 */
+ if (soup_message_get_http_version (msg) == SOUP_HTTP_1_0) {
+ soup_message_set_http_version (msg, SOUP_HTTP_1_1);
+ soup_message_headers_append (msg->response_headers,
+ "Connection",
+ "close");
+ }
+
context = gupnp_service_info_get_context (GUPNP_SERVICE_INFO (service));
/* Get action name */
/**
* gupnp_service_notify:
* @service: A #GUPnPService
- * @Varargs: Tuples of variable name, variable type, and variable value,
+ * @...: Tuples of variable name, variable type, and variable value,
* terminated with %NULL.
*
* Notifies listening clients that the properties listed in @Varargs
* A convenience function that attempts to connect all possible
* #GUPnPService::action-invoked and #GUPnPService::query-variable signals to
* appropriate callbacks for the service @service. It uses service introspection
- * and GModule's introspective features. It is very simillar to
+ * and #GModule<!-- -->'s introspective features. It is very simillar to
* gtk_builder_connect_signals() except that it attempts to guess the names of
* the signal handlers on its own.
*
* off the action names and either prepend "on_" or append "_cb" to them. Same
* goes for #GUPnPService::query-variable signals, except that "query_" should
* be prepended to the variable name. For example, callback function for
- * "GetSystemUpdateID" action should be either named as
+ * <varname>GetSystemUpdateID</varname> action should be either named as
* "get_system_update_id_cb" or "on_get_system_update_id" and callback function
* for the query of "SystemUpdateID" state variable should be named
- * "query_system_update_id_cb" or "on_query_system_update_id".
+ * <function>query_system_update_id_cb</function> or
+ * <function>on_query_system_update_id</function>.
*
- * Note that this function will not work correctly if GModule is not supported
- * on the platform or introspection is not available for service @service.
+ * <note>This function will not work correctly if #GModule is not supported
+ * on the platform or introspection is not available for @service.</note>
*
- * WARNING: This function can not and therefore does not guarantee that the
+ * <warning>This function can not and therefore does not guarantee that the
* resulting signal connections will be correct as it depends heavily on a
- * particular naming schemes described above.
+ * particular naming schemes described above.</warning>
**/
void
gupnp_service_signals_autoconnect (GUPnPService *service,
while (ifaces) {
create_and_signal_context ((char *) ifaces->data, manager);
g_free (ifaces->data);
- ifaces = g_list_remove_link (ifaces, ifaces);
+ ifaces = g_list_delete_link (ifaces, ifaces);
}
return FALSE;
--- /dev/null
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gupnp-white-list
+ * @short_description: Class for network filtering.
+ *
+ * #GUPnPWhiteList handles network filtering. It provides API to manage a list
+ * of entries that will be used to filter networks.
+ * The #GUPnPWhiteList could be enabled or not. If it's enabled but the entries
+ * list is empty, it behaves as disabled.
+ */
+
+#include <string.h>
+
+#include "gupnp-white-list.h"
+
+G_DEFINE_TYPE (GUPnPWhiteList,
+ gupnp_white_list,
+ G_TYPE_OBJECT);
+
+struct _GUPnPWhiteListPrivate {
+ gboolean enabled;
+ GList *entries;
+};
+
+enum {
+ PROP_0,
+ PROP_ENABLED,
+ PROP_ENTRIES
+};
+
+enum {
+ ENTRY_CHANGE,
+ ENABLED,
+ SIGNAL_LAST
+};
+
+static void
+gupnp_white_list_init (GUPnPWhiteList *list)
+{
+ list->priv = G_TYPE_INSTANCE_GET_PRIVATE (list,
+ GUPNP_TYPE_WHITE_LIST,
+ GUPnPWhiteListPrivate);
+
+ list->priv->entries = NULL;
+}
+
+static void
+gupnp_white_list_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GUPnPWhiteList *list;
+
+ list = GUPNP_WHITE_LIST (object);
+
+ switch (property_id) {
+ case PROP_ENABLED:
+ list->priv->enabled = g_value_get_boolean (value);
+ break;
+ case PROP_ENTRIES:
+ list->priv->entries = g_value_get_pointer (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gupnp_white_list_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GUPnPWhiteList *list;
+
+ list = GUPNP_WHITE_LIST (object);
+
+ switch (property_id) {
+ case PROP_ENABLED:
+ g_value_set_boolean (value, list->priv->enabled);
+ break;
+ case PROP_ENTRIES:
+ g_value_set_pointer (value, list->priv->entries);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+gupnp_white_list_class_finalize (GObject *object)
+{
+ GUPnPWhiteList *list;
+ GObjectClass *object_class;
+
+ list = GUPNP_WHITE_LIST (object);
+
+ g_list_free_full (list->priv->entries, g_free);
+ list->priv->entries = NULL;
+
+ /* Call super */
+ object_class = G_OBJECT_CLASS (gupnp_white_list_parent_class);
+ object_class->finalize (object);
+}
+
+static void
+gupnp_white_list_class_init (GUPnPWhiteListClass *klass)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (klass);
+
+ object_class->set_property = gupnp_white_list_set_property;
+ object_class->get_property = gupnp_white_list_get_property;
+ object_class->finalize = gupnp_white_list_class_finalize;
+
+ g_type_class_add_private (klass, sizeof (GUPnPWhiteListPrivate));
+
+ /**
+ * GUPnPWhiteList:enabled:
+ *
+ * Whether this white list is active or not.
+ **/
+ g_object_class_install_property
+ (object_class,
+ PROP_ENABLED,
+ g_param_spec_boolean
+ ("enabled",
+ "Enabled",
+ "TRUE if the white list is active.",
+ FALSE,
+ G_PARAM_CONSTRUCT |
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * GUPnPWhiteList:entries:
+ *
+ * Whether this white list is active or not.
+ * Type: GList
+ * Transfer: none
+ **/
+ g_object_class_install_property
+ (object_class,
+ PROP_ENTRIES,
+ g_param_spec_pointer
+ ("entries",
+ "Entries",
+ "GList of strings that compose the white list.",
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * gupnp_white_list_new:
+ *
+ * Create a new #GUPnPWhiteList.
+ * The white list is disabled by default.
+ *
+ * Returns: (transfer full): A new #GUPnPWhiteList object.
+ **/
+GUPnPWhiteList *
+gupnp_white_list_new (void)
+{
+ return g_object_new (GUPNP_TYPE_WHITE_LIST, NULL);
+}
+
+/**
+ * gupnp_white_list_set_enabled:
+ * @white_list: A #GUPnPWhiteList
+ * @enable: %TRUE to enable @white_list, %FALSE otherwise
+ *
+ * Enable or disable the #GUPnPWhiteList to perform the network filtering.
+**/
+void
+gupnp_white_list_set_enabled (GUPnPWhiteList *white_list, gboolean enable)
+{
+ g_return_if_fail (GUPNP_IS_WHITE_LIST (white_list));
+
+ white_list->priv->enabled = enable;
+ g_object_notify (G_OBJECT (white_list), "enabled");
+}
+
+/**
+ * gupnp_white_list_get_enabled:
+ * @white_list: A #GUPnPWhiteList
+ *
+ * Return the status of the #GUPnPWhiteList
+ *
+ * Return value: %TRUE if @white_list is enabled, %FALSE otherwise.
+ **/
+gboolean
+gupnp_white_list_get_enabled (GUPnPWhiteList *white_list)
+{
+ g_return_val_if_fail (GUPNP_IS_WHITE_LIST (white_list), FALSE);
+
+ return white_list->priv->enabled;
+}
+
+/**
+ * gupnp_white_list_is_empty:
+ * @white_list: A #GUPnPWhiteList
+ *
+ * Return the state of the entries list of #GUPnPWhiteList
+ *
+ * Return value: %TRUE if @white_list is empty, %FALSE otherwise.
+ **/
+gboolean
+gupnp_white_list_is_empty (GUPnPWhiteList *white_list)
+{
+ g_return_val_if_fail (GUPNP_IS_WHITE_LIST (white_list), TRUE);
+
+ return (white_list->priv->entries == NULL);
+}
+
+/**
+ * gupnp_white_list_add_entry:
+ * @white_list: A #GUPnPWhiteList
+ * @entry: A value used to filter network
+ *
+ * Add @entry in the list of valid criteria used by @white_list to
+ * filter networks.
+ * if @entry already exists, it won't be added a second time.
+ *
+ * Return value: %TRUE if @entry is added, %FALSE otherwise.
+ **/
+gboolean
+gupnp_white_list_add_entry (GUPnPWhiteList *white_list, gchar* entry)
+{
+ GList *s_entry;
+ GUPnPWhiteListPrivate *priv;
+
+ g_return_val_if_fail (GUPNP_IS_WHITE_LIST (white_list), FALSE);
+ g_return_val_if_fail ((entry != NULL), FALSE);
+
+ priv = white_list->priv;
+
+ s_entry = g_list_find_custom (priv->entries, entry,
+ (GCompareFunc) g_ascii_strcasecmp);
+
+ if (s_entry == NULL) {
+ priv->entries = g_list_prepend (priv->entries,
+ g_strdup (entry));
+ g_object_notify (G_OBJECT (white_list), "entries");
+ }
+
+ return (s_entry == NULL);
+}
+
+/**
+ * gupnp_white_list_remove_entry:
+ * @white_list: A #GUPnPWhiteList
+ * @entry: A value to remove from the filter list.
+ *
+ * Remove @entry in the list of valid criteria used by @white_list to
+ * filter networks.
+ *
+ * Return value: %TRUE if @entry is removed, %FALSE otherwise.
+ **/
+gboolean
+gupnp_white_list_remove_entry (GUPnPWhiteList *white_list, gchar* entry)
+{
+ GList *s_entry;
+ GUPnPWhiteListPrivate *priv;
+
+ g_return_val_if_fail (GUPNP_IS_WHITE_LIST (white_list), FALSE);
+ g_return_val_if_fail ((entry != NULL), FALSE);
+
+ priv = white_list->priv;
+
+ s_entry = g_list_find_custom (priv->entries, entry,
+ (GCompareFunc) g_ascii_strcasecmp);
+
+ if (s_entry != NULL) {
+ priv->entries = g_list_remove_link (priv->entries, s_entry);
+ g_list_free_full (s_entry, g_free);
+ g_object_notify (G_OBJECT (white_list), "entries");
+ }
+
+ return (s_entry != NULL);
+}
+
+/**
+ * gupnp_white_list_get_entries:
+ * @white_list: A #GUPnPWhiteList
+ *
+ * Get the #GList of entries that compose the white list. Do not free
+ *
+ * Return value: (element-type utf8) (transfer none): a #GList of entries
+ * used to filter networks, interfaces,... or %NULL.
+ * Do not modify or free the list nor its elements.
+ **/
+GList *
+gupnp_white_list_get_entries (GUPnPWhiteList *white_list)
+{
+ g_return_val_if_fail (GUPNP_IS_WHITE_LIST (white_list), NULL);
+
+ return white_list->priv->entries;
+}
+
+/**
+ * gupnp_white_list_clear:
+ * @white_list: A #GUPnPWhiteList
+ *
+ * Remove all entries from #GList that compose the white list.
+ * The list is now empty. Even if #GUPnPWhiteList is enabled, it will have the
+ * same behavior as if it was disabled.
+**/
+void
+gupnp_white_list_clear (GUPnPWhiteList *white_list)
+{
+ GUPnPWhiteListPrivate *priv;
+
+ g_return_if_fail (GUPNP_IS_WHITE_LIST(white_list));
+
+ priv = white_list->priv;
+ g_list_free_full (priv->entries, g_free);
+ priv->entries = NULL;
+ g_object_notify (G_OBJECT (white_list), "entries");
+}
+
+/**
+ * gupnp_white_list_check_context:
+ * @white_list: A #GUPnPWhiteList
+ * @context: A #GUPnPContext to test.
+ *
+ * It will check if the @context is allowed or not. The @white_list will check
+ * all its entries againt #GUPnPContext interface, host ip and network fields
+ * information. This function doesn't take into account the @white_list status
+ * (enabled or not).
+ *
+ * Return value: %TRUE if @context is matching the @white_list criterias,
+ * %FALSE otherwise.
+ **/
+gboolean
+gupnp_white_list_check_context (GUPnPWhiteList *white_list,
+ GUPnPContext *context)
+{
+ GSSDPClient *client;
+ GList *l;
+ const char *interface;
+ const char *host_ip;
+ const char *network;
+ gboolean match = FALSE;
+
+ g_return_val_if_fail (GUPNP_IS_WHITE_LIST (white_list), FALSE);
+ g_return_val_if_fail (GUPNP_IS_CONTEXT (context), FALSE);
+
+ client = GSSDP_CLIENT (context);
+
+ interface = gssdp_client_get_interface (client);
+ host_ip = gssdp_client_get_host_ip (client);
+ network = gssdp_client_get_network (client);
+
+ l = white_list->priv->entries;
+
+ while (l && !match) {
+ match = (interface && !strcmp (l->data, interface)) ||
+ (host_ip && !strcmp (l->data, host_ip)) ||
+ (network && !strcmp (l->data, network));
+
+ l = l->next;
+ }
+
+ return match;
+}
--- /dev/null
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __GUPNP_WHITE_LIST_H__
+#define __GUPNP_WHITE_LIST_H__
+
+#include <glib.h>
+#include "gupnp-context.h"
+
+G_BEGIN_DECLS
+
+GType
+gupnp_white_list_get_type (void) G_GNUC_CONST;
+
+#define GUPNP_TYPE_WHITE_LIST \
+ (gupnp_white_list_get_type ())
+#define GUPNP_WHITE_LIST(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ GUPNP_TYPE_WHITE_LIST, \
+ GUPnPWhiteList))
+#define GUPNP_WHITE_LIST_CLASS(obj) \
+ (G_TYPE_CHECK_CLASS_CAST ((obj), \
+ GUPNP_TYPE_WHITE_LIST, \
+ GUPnPWhiteListClass))
+#define GUPNP_IS_WHITE_LIST(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ GUPNP_TYPE_WHITE_LIST))
+#define GUPNP_IS_WHITE_LIST_CLASS(obj) \
+ (G_TYPE_CHECK_CLASS_TYPE ((obj), \
+ GUPNP_TYPE_WHITE_LIST))
+#define GUPNP_WHITE_LIST_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ GUPNP_TYPE_WHITE_LIST, \
+ GUPnPWhiteListClass))
+
+typedef struct _GUPnPWhiteListPrivate GUPnPWhiteListPrivate;
+typedef struct _GUPnPWhiteList GUPnPWhiteList;
+typedef struct _GUPnPWhiteListClass GUPnPWhiteListClass;
+
+/**
+ * GUPnPWhiteList:
+ *
+ * This struct contains private data only, and should be accessed using the
+ * functions below.
+ */
+struct _GUPnPWhiteList {
+ GObject parent;
+
+ GUPnPWhiteListPrivate *priv;
+};
+
+struct _GUPnPWhiteListClass {
+ GObjectClass parent_class;
+};
+
+GUPnPWhiteList *
+gupnp_white_list_new (void);
+
+void
+gupnp_white_list_set_enabled (GUPnPWhiteList *white_list,
+ gboolean enable);
+
+gboolean
+gupnp_white_list_get_enabled (GUPnPWhiteList *white_list);
+
+gboolean
+gupnp_white_list_is_empty (GUPnPWhiteList *white_list);
+
+gboolean
+gupnp_white_list_add_entry (GUPnPWhiteList *white_list,
+ gchar* entry);
+
+gboolean
+gupnp_white_list_remove_entry (GUPnPWhiteList *white_list,
+ gchar* entry);
+
+GList *
+gupnp_white_list_get_entries (GUPnPWhiteList *white_list);
+
+void
+gupnp_white_list_clear (GUPnPWhiteList *white_list);
+
+gboolean
+gupnp_white_list_check_context (GUPnPWhiteList *white_list,
+ GUPnPContext *context);
+
+G_END_DECLS
+
+#endif /* __GUPNP_WHITE_LIST_H__ */
#include <libxml/tree.h>
#include <glib-object.h>
+G_BEGIN_DECLS
+
GType
gupnp_xml_doc_get_type (void) G_GNUC_CONST;
typedef struct _GUPnPXMLDoc GUPnPXMLDoc;
typedef struct _GUPnPXMLDocClass GUPnPXMLDocClass;
+/**
+ * GUPnPXMLDoc:
+ * @doc: Pointer to the document.
+ *
+ * Reference-counting wrapper for libxml's #xmlDoc
+ */
struct _GUPnPXMLDoc {
GObject parent;
/*< public >*/
gupnp_xml_doc_new_from_path (const char *path,
GError **error);
+G_END_DECLS
+
#endif /* __GUPNP_XML_DOC_H__ */
#include "gupnp-service-info.h"
#include "gupnp-service-introspection.h"
#include "gupnp-service-proxy.h"
+#include "gupnp-white-list.h"
#include "gupnp-xml-doc.h"
#include "gupnp-types.h"
LD="${LD-ld} -m elf_i386_fbsd"
;;
x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
;;
ppc64-*linux*|powerpc64-*linux*)
LD="${LD-ld} -m elf32ppclinux"
;;
*)
lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
else
esac
;;
-gnu*)
- version_type=linux # correct to gnu/linux during the next big refactor
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
-
haiku*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
;;
# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
fi
;;
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
haiku*)
lt_cv_deplibs_check_method=pass_all
;;
;;
# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
lt_cv_deplibs_check_method=pass_all
;;
;;
esac
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
KCC*)
# KAI C++ Compiler
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
# old Intel for x86_64 which still supported -KPIC.
ecc*)
_LT_TAGVAR(ld_shlibs, $1)=yes
;;
- gnu*)
- ;;
-
haiku*)
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
_LT_TAGVAR(link_all_deplibs, $1)=yes
_LT_TAGVAR(inherit_rpath, $1)=yes
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
+* Wed Aug 21 2013 Regis Merlino <regis.merlino@intel.com>
+- Update gupnp to 0.20.5 (fdeb6f9f)
+
* Tue Jul 16 00:01:36 UTC 2013 - tracy.graydon@intel.com
- Stripped old yaml cruft out of spec file
Name: gupnp
Summary: GUPnP is an framework for creating UPnP devices & control points
-Version: 0.20.3
+Version: 0.20.5
Release: 1
Group: System/Libraries
License: LGPLv2+
noinst_PROGRAMS = test-browsing \
test-proxy \
test-server \
- test-introspection
+ test-introspection \
+ test-white-list
test_browsing_SOURCES = test-browsing.c
test_browsing_LDADD = $(top_builddir)/libgupnp/libgupnp-1.0.la \
$(LIBGUPNP_LIBS)
test_server_LDFLAGS = -export-dynamic
+test_white_list_SOURCES = test-white-list.c
+test_white_list_LDADD = $(top_builddir)/libgupnp/libgupnp-1.0.la \
+ $(GTHREAD_LIBS) \
+ $(LIBGUPNP_LIBS)
+
CLEANFILES = $(BUILT_SOURCES)
DISTCLEANFILES = $(BUILT_SOURCES)
MAINTAINERCLEANFILES = Makefile.in $(BUILT_SOURCES)
host_triplet = @host@
target_triplet = @target@
noinst_PROGRAMS = test-browsing$(EXEEXT) test-proxy$(EXEEXT) \
- test-server$(EXEEXT) test-introspection$(EXEEXT)
+ test-server$(EXEEXT) test-introspection$(EXEEXT) \
+ test-white-list$(EXEEXT)
subdir = tests
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
test_server_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(test_server_LDFLAGS) $(LDFLAGS) -o $@
+am_test_white_list_OBJECTS = test-white-list.$(OBJEXT)
+test_white_list_OBJECTS = $(am_test_white_list_OBJECTS)
+test_white_list_DEPENDENCIES = \
+ $(top_builddir)/libgupnp/libgupnp-1.0.la $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
am__depfiles_maybe = depfiles
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(test_browsing_SOURCES) $(test_introspection_SOURCES) \
- $(test_proxy_SOURCES) $(test_server_SOURCES)
+ $(test_proxy_SOURCES) $(test_server_SOURCES) \
+ $(test_white_list_SOURCES)
DIST_SOURCES = $(test_browsing_SOURCES) $(test_introspection_SOURCES) \
- $(test_proxy_SOURCES) $(test_server_SOURCES)
+ $(test_proxy_SOURCES) $(test_server_SOURCES) \
+ $(test_white_list_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-dvi-recursive install-exec-recursive \
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@
$(LIBGUPNP_LIBS)
test_server_LDFLAGS = -export-dynamic
+test_white_list_SOURCES = test-white-list.c
+test_white_list_LDADD = $(top_builddir)/libgupnp/libgupnp-1.0.la \
+ $(GTHREAD_LIBS) \
+ $(LIBGUPNP_LIBS)
+
CLEANFILES = $(BUILT_SOURCES)
DISTCLEANFILES = $(BUILT_SOURCES)
MAINTAINERCLEANFILES = Makefile.in $(BUILT_SOURCES)
test-server$(EXEEXT): $(test_server_OBJECTS) $(test_server_DEPENDENCIES) $(EXTRA_test_server_DEPENDENCIES)
@rm -f test-server$(EXEEXT)
$(AM_V_CCLD)$(test_server_LINK) $(test_server_OBJECTS) $(test_server_LDADD) $(LIBS)
+test-white-list$(EXEEXT): $(test_white_list_OBJECTS) $(test_white_list_DEPENDENCIES) $(EXTRA_test_white_list_DEPENDENCIES)
+ @rm -f test-white-list$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(test_white_list_OBJECTS) $(test_white_list_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-introspection.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-proxy.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-server.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-white-list.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-if HAVE_GTEST
TESTS_ENVIRONMENT = G_SLICE=debug-blocks \
LD_LIBRARY_PATH=$(top_builddir)/libgupnp/.libs:$(LD_LIBRARY_PATH)
test_context_SOURCES = test-context.c
test_bugs_SOURCES = test-bugs.c
-endif
LDADD = \
$(top_builddir)/libgupnp/libgupnp-1.0.la \
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-@HAVE_GTEST_TRUE@check_PROGRAMS = test-context$(EXEEXT) \
-@HAVE_GTEST_TRUE@ test-bugs$(EXEEXT)
+check_PROGRAMS = test-context$(EXEEXT) test-bugs$(EXEEXT)
subdir = tests/gtest
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
-am__test_bugs_SOURCES_DIST = test-bugs.c
-@HAVE_GTEST_TRUE@am_test_bugs_OBJECTS = test-bugs.$(OBJEXT)
+am_test_bugs_OBJECTS = test-bugs.$(OBJEXT)
test_bugs_OBJECTS = $(am_test_bugs_OBJECTS)
test_bugs_LDADD = $(LDADD)
am__DEPENDENCIES_1 =
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
-am__test_context_SOURCES_DIST = test-context.c
-@HAVE_GTEST_TRUE@am_test_context_OBJECTS = test-context.$(OBJEXT)
+am_test_context_OBJECTS = test-context.$(OBJEXT)
test_context_OBJECTS = $(am_test_context_OBJECTS)
test_context_LDADD = $(LDADD)
test_context_DEPENDENCIES = $(top_builddir)/libgupnp/libgupnp-1.0.la \
am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(test_bugs_SOURCES) $(test_context_SOURCES)
-DIST_SOURCES = $(am__test_bugs_SOURCES_DIST) \
- $(am__test_context_SOURCES_DIST)
+DIST_SOURCES = $(test_bugs_SOURCES) $(test_context_SOURCES)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-@HAVE_GTEST_TRUE@TESTS_ENVIRONMENT = G_SLICE=debug-blocks \
-@HAVE_GTEST_TRUE@ LD_LIBRARY_PATH=$(top_builddir)/libgupnp/.libs:$(LD_LIBRARY_PATH)
+TESTS_ENVIRONMENT = G_SLICE=debug-blocks \
+ LD_LIBRARY_PATH=$(top_builddir)/libgupnp/.libs:$(LD_LIBRARY_PATH)
-@HAVE_GTEST_TRUE@TESTS = $(check_PROGRAMS)
-@HAVE_GTEST_TRUE@test_context_SOURCES = test-context.c
-@HAVE_GTEST_TRUE@test_bugs_SOURCES = test-bugs.c
+TESTS = $(check_PROGRAMS)
+test_context_SOURCES = test-context.c
+test_bugs_SOURCES = test-bugs.c
LDADD = \
$(top_builddir)/libgupnp/libgupnp-1.0.la \
$(LIBGUPNP_LIBS)
g_object_unref (message);
- /* Try with inverted arguments */
- message = soup_message_new ("GET", uri);
- g_object_ref (message);
-
- soup_message_headers_set_range (message->request_headers, 499, 0);
- soup_session_queue_message (session,
- message,
- on_message_finished,
- loop);
-
- g_main_loop_run (loop);
- g_assert_cmpint (message->status_code, ==, SOUP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE);
-
- g_object_unref (message);
-
g_free (uri);
g_object_unref (context);
g_main_loop_unref (loop);
--- /dev/null
+/*
+ * Copyright (C) 2013 Intel Corporation.
+ *
+ * Author: Ludovic Ferrandis <ludovic.ferrandis@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <libgupnp/gupnp-control-point.h>
+#include <libgupnp/gupnp-context-manager.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <signal.h>
+#include <glib.h>
+
+GMainLoop *main_loop;
+
+static void
+interrupt_signal_handler (G_GNUC_UNUSED int signum)
+{
+ g_main_loop_quit (main_loop);
+}
+
+static void
+device_proxy_available_cb (G_GNUC_UNUSED GUPnPControlPoint *cp,
+ GUPnPDeviceProxy *proxy)
+{
+ const char *type, *location;
+
+ type = gupnp_device_info_get_device_type (GUPNP_DEVICE_INFO (proxy));
+ location = gupnp_device_info_get_location (GUPNP_DEVICE_INFO (proxy));
+
+ g_print ("Device available:\n");
+ g_print ("\ttype: %s\n", type);
+ g_print ("\tlocation: %s\n", location);
+}
+
+static void
+device_proxy_unavailable_cb (G_GNUC_UNUSED GUPnPControlPoint *cp,
+ GUPnPDeviceProxy *proxy)
+{
+ const char *type, *location;
+
+ type = gupnp_device_info_get_device_type (GUPNP_DEVICE_INFO (proxy));
+ location = gupnp_device_info_get_location (GUPNP_DEVICE_INFO (proxy));
+
+ g_print ("Device unavailable:\n");
+ g_print ("\ttype: %s\n", type);
+ g_print ("\tlocation: %s\n", location);
+}
+
+static void
+service_proxy_available_cb (G_GNUC_UNUSED GUPnPControlPoint *cp,
+ GUPnPServiceProxy *proxy)
+{
+ const char *type, *location;
+
+ type = gupnp_service_info_get_service_type (GUPNP_SERVICE_INFO (proxy));
+ location = gupnp_service_info_get_location (GUPNP_SERVICE_INFO (proxy));
+
+ g_print ("Service available:\n");
+ g_print ("\ttype: %s\n", type);
+ g_print ("\tlocation: %s\n", location);
+}
+
+static void
+service_proxy_unavailable_cb (G_GNUC_UNUSED GUPnPControlPoint *cp,
+ GUPnPServiceProxy *proxy)
+{
+ const char *type, *location;
+
+ type = gupnp_service_info_get_service_type (GUPNP_SERVICE_INFO (proxy));
+ location = gupnp_service_info_get_location (GUPNP_SERVICE_INFO (proxy));
+
+ g_print ("Service unavailable:\n");
+ g_print ("\ttype: %s\n", type);
+ g_print ("\tlocation: %s\n", location);
+}
+
+static void
+context_available_cb(GUPnPContextManager *context_manager,
+ GUPnPContext *context,
+ gpointer user_data)
+{
+ GUPnPControlPoint *cp;
+ GSSDPClient *client = GSSDP_CLIENT(context);
+
+ g_print ("Context Available:\n");
+ g_print ("\tServer ID: %s\n", gssdp_client_get_server_id (client));
+ g_print ("\tInterface: %s\n", gssdp_client_get_interface (client));
+ g_print ("\tHost IP : %s\n", gssdp_client_get_host_ip (client));
+ g_print ("\tNetwork : %s\n", gssdp_client_get_network (client));
+ g_print ("\tActive : %s\n", gssdp_client_get_active (client)? "TRUE" : "FALSE");
+
+
+ /* We're interested in everything */
+ cp = gupnp_control_point_new (context, "ssdp:all");
+
+ g_signal_connect (cp,
+ "device-proxy-available",
+ G_CALLBACK (device_proxy_available_cb),
+ NULL);
+ g_signal_connect (cp,
+ "device-proxy-unavailable",
+ G_CALLBACK (device_proxy_unavailable_cb),
+ NULL);
+ g_signal_connect (cp,
+ "service-proxy-available",
+ G_CALLBACK (service_proxy_available_cb),
+ NULL);
+ g_signal_connect (cp,
+ "service-proxy-unavailable",
+ G_CALLBACK (service_proxy_unavailable_cb),
+ NULL);
+
+ gssdp_resource_browser_set_active (GSSDP_RESOURCE_BROWSER (cp), TRUE);
+ gupnp_context_manager_manage_control_point(context_manager, cp);
+ g_object_unref(cp);
+}
+
+static void
+context_unavailable_cb(GUPnPContextManager *context_manager,
+ GUPnPContext *context,
+ gpointer user_data)
+{
+ GSSDPClient *client = GSSDP_CLIENT(context);
+
+ g_print ("Context Unavailable:\n");
+ g_print ("\tServer ID: %s\n", gssdp_client_get_server_id (client));
+ g_print ("\tInterface: %s\n", gssdp_client_get_interface (client));
+ g_print ("\tHost IP : %s\n", gssdp_client_get_host_ip (client));
+ g_print ("\tNetwork : %s\n", gssdp_client_get_network (client));
+ g_print ("\tActive : %s\n", gssdp_client_get_active (client)? "TRUE" : "FALSE");
+}
+
+static void
+print_wl_entry(gpointer data, gpointer user_data)
+{
+ g_print ("\t\t\tEntry: %s\n", (char *)data);
+}
+
+static void
+print_white_list_entries(GUPnPWhiteList *wl)
+{
+ GList *list;
+
+ g_print ("\t\tWhite List Entries:\n");
+ list = gupnp_white_list_get_entries(wl);
+ g_list_foreach (list, print_wl_entry, NULL);
+ g_print ("\n");
+}
+
+static gboolean
+change_white_list(gpointer user_data)
+{
+ GUPnPContextManager *context_manager = user_data;
+ GUPnPWhiteList *white_list;
+ static int tomato = 0;
+
+ g_print ("\nChange White List:\n");
+ g_print ("\t Action number %d:\n", tomato);
+
+ white_list = gupnp_context_manager_get_white_list(context_manager);
+
+ switch (tomato) {
+ case 0:
+ g_print ("\t Add Entry eth0\n\n");
+ gupnp_white_list_add_entry(white_list, "eth0");
+ print_white_list_entries (white_list);
+ break;
+ case 1:
+ g_print ("\t Enable WL\n\n");
+ gupnp_white_list_set_enabled (white_list, TRUE);
+ break;
+ case 2:
+ g_print ("\t Add Entry 127.0.0.1\n\n");
+ gupnp_white_list_add_entry(white_list, "127.0.0.1");
+ print_white_list_entries (white_list);
+ break;
+ case 3:
+ g_print ("\t Add Entry eth5\n\n");
+ gupnp_white_list_add_entry(white_list, "eth5");
+ print_white_list_entries (white_list);
+ break;
+ case 4:
+ g_print ("\t Remove Entry eth5\n\n");
+ gupnp_white_list_remove_entry(white_list, "eth5");
+ print_white_list_entries (white_list);
+ break;
+ case 5:
+ g_print ("\t Clear all entries\n\n");
+ gupnp_white_list_clear(white_list);
+ print_white_list_entries (white_list);
+ break;
+ case 6:
+ g_print ("\t Add Entry wlan2\n\n");
+ gupnp_white_list_add_entry(white_list, "wlan2");
+ print_white_list_entries(white_list);
+ break;
+ case 7:
+ g_print ("\t Disable WL\n\n");
+ gupnp_white_list_set_enabled (white_list, FALSE);
+ break;
+ case 8:
+ g_print ("\t Enable WL\n\n");
+ gupnp_white_list_set_enabled (white_list, TRUE);
+ break;
+ case 9:
+ g_print ("\t Connect to wlan0\n\n");
+ g_timeout_add_seconds (35, change_white_list, context_manager);
+ break;
+ case 10:
+ g_print ("\t Add Entry wlan0\n\n");
+ gupnp_white_list_add_entry(white_list, "wlan0");
+ print_white_list_entries (white_list);
+ break;
+ //~ case 11:
+ //~ g_print ("\t Enable WL\n");
+ //~ gupnp_white_list_enable(white_list, FALSE);
+ //~ break;
+ default:
+ break;
+ }
+
+ tomato++;
+
+ return (tomato < 11) && (tomato != 10);
+}
+
+int
+main (G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv)
+{
+ GUPnPContextManager *cm;
+ guint id;
+#ifndef G_OS_WIN32
+ struct sigaction sig_action;
+#endif /* G_OS_WIN32 */
+
+#if !GLIB_CHECK_VERSION(2,35,0)
+ g_type_init ();
+#endif
+ setlocale (LC_ALL, "");
+
+ cm = gupnp_context_manager_create(0);
+
+ g_signal_connect(cm,
+ "context-available",
+ G_CALLBACK(context_available_cb),
+ NULL);
+
+ g_signal_connect(cm,
+ "context-unavailable",
+ G_CALLBACK(context_unavailable_cb),
+ NULL);
+
+ main_loop = g_main_loop_new (NULL, FALSE);
+
+ id = g_timeout_add_seconds (5, change_white_list, cm);
+
+#ifndef G_OS_WIN32
+ /* Hook the handler for SIGTERM */
+ memset (&sig_action, 0, sizeof (sig_action));
+ sig_action.sa_handler = interrupt_signal_handler;
+ sigaction (SIGINT, &sig_action, NULL);
+#else
+ signal(SIGINT, interrupt_signal_handler);
+#endif /* G_OS_WIN32 */
+
+ g_main_loop_run (main_loop);
+ g_main_loop_unref (main_loop);
+
+ g_source_remove (id);
+
+ g_object_unref (cm);
+
+ return EXIT_SUCCESS;
+}
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@
def printClientSyncActionBinding(a):
indent = (2 + len (a.c_prefixed_name)) * " "
- print "static inline gboolean"
- print "%s (GUPnPServiceProxy *proxy," % a.c_prefixed_name
+ print("static inline gboolean")
+ print("%s (GUPnPServiceProxy *proxy," % a.c_prefixed_name)
for arg in a.in_args:
- print "%sconst %sin_%s," % (indent, arg.related_var.ctype, arg.c_name)
+ print("%sconst %sin_%s," % (indent, arg.related_var.ctype, arg.c_name))
for arg in a.out_args:
- print "%s%s*out_%s," % (indent, arg.related_var.ctype, arg.c_name)
+ print("%s%s*out_%s," % (indent, arg.related_var.ctype, arg.c_name))
- print "%sGError **error)" % indent
+ print("%sGError **error)" % indent)
- print "{"
+ print("{")
- print " return gupnp_service_proxy_send_action"
- print " (proxy, \"%s\", error," % a.name
+ print(" return gupnp_service_proxy_send_action")
+ print(" (proxy, \"%s\", error," % a.name)
for arg in a.in_args:
- print " \"%s\", %s, in_%s," % (arg.name, arg.related_var.gtype, arg.c_name)
- print " NULL,"
+ print(" \"%s\", %s, in_%s," % (arg.name, arg.related_var.gtype, arg.c_name))
+ print(" NULL,")
for arg in a.out_args:
- print " \"%s\", %s, out_%s," % (arg.name, arg.related_var.gtype, arg.c_name)
- print " NULL);"
+ print(" \"%s\", %s, out_%s," % (arg.name, arg.related_var.gtype, arg.c_name))
+ print(" NULL);")
- print "}\n"
+ print("}\n")
def printClientAsyncActionBinding(a):
# User-callback prototype
indent = (24 + len (a.c_prefixed_name)) * " "
- print "typedef void (*%s_reply) (GUPnPServiceProxy *proxy," % a.c_prefixed_name
+ print("typedef void (*%s_reply) (GUPnPServiceProxy *proxy," % a.c_prefixed_name)
for arg in a.out_args:
- print "%sconst %sout_%s," % (indent, arg.related_var.ctype, arg.c_name)
- print "%sGError *error," % indent
- print "%sgpointer userdata);" % indent
- print
+ print("%sconst %sout_%s," % (indent, arg.related_var.ctype, arg.c_name))
+ print("%sGError *error," % indent)
+ print("%sgpointer userdata);" % indent)
+ print("")
# Generated async callback handler, calls user-provided callback
indent = (30 + len (a.c_prefixed_name)) * " "
- print "static void _%s_async_callback (GUPnPServiceProxy *proxy," % a.c_prefixed_name
- print "%sGUPnPServiceProxyAction *action," % indent
- print "%sgpointer user_data)" % indent
- print "{"
- print " GUPnPAsyncData *cbdata;"
- print " GError *error = NULL;"
+ print("static void _%s_async_callback (GUPnPServiceProxy *proxy," % a.c_prefixed_name)
+ print("%sGUPnPServiceProxyAction *action," % indent)
+ print("%sgpointer user_data)" % indent)
+ print("{")
+ print(" GUPnPAsyncData *cbdata;")
+ print(" GError *error = NULL;")
for arg in a.out_args:
- print " %s%s;" % (arg.related_var.ctype, arg.c_name)
- print
- print " cbdata = (GUPnPAsyncData *) user_data;"
- print " gupnp_service_proxy_end_action"
- print " (proxy, action, &error,"
+ print(" %s%s;" % (arg.related_var.ctype, arg.c_name))
+ print("")
+ print(" cbdata = (GUPnPAsyncData *) user_data;")
+ print(" gupnp_service_proxy_end_action")
+ print(" (proxy, action, &error,")
for arg in a.out_args:
- print " \"%s\", %s, &%s," % (arg.name, arg.related_var.gtype, arg.c_name)
- print " NULL);"
- print " ((%s_reply)cbdata->cb)" % a.c_prefixed_name
- print " (proxy,"
+ print(" \"%s\", %s, &%s," % (arg.name, arg.related_var.gtype, arg.c_name))
+ print(" NULL);")
+ print(" ((%s_reply)cbdata->cb)" % a.c_prefixed_name)
+ print(" (proxy,")
for arg in a.out_args:
- print " %s," % arg.c_name
- print " error, cbdata->userdata);"
- print
- print " g_slice_free1 (sizeof (*cbdata), cbdata);"
- print "}"
- print
+ print(" %s," % arg.c_name)
+ print(" error, cbdata->userdata);")
+ print("")
+ print(" g_slice_free1 (sizeof (*cbdata), cbdata);")
+ print("}")
+ print("")
# Entry point
indent = (8 + len (a.c_prefixed_name)) * " "
- print "static inline GUPnPServiceProxyAction *"
- print "%s_async (GUPnPServiceProxy *proxy," % a.c_prefixed_name
+ print("static inline GUPnPServiceProxyAction *")
+ print("%s_async (GUPnPServiceProxy *proxy," % a.c_prefixed_name)
for arg in a.in_args:
- print "%sconst %sin_%s," % (indent, arg.related_var.ctype, arg.c_name)
- print "%s%s_reply callback," % (indent, a.c_prefixed_name)
- print "%sgpointer userdata)" % indent
- print "{"
- print " GUPnPServiceProxyAction* action;"
- print " GUPnPAsyncData *cbdata;"
- print
- print " cbdata = (GUPnPAsyncData *) g_slice_alloc (sizeof (*cbdata));"
- print " cbdata->cb = G_CALLBACK (callback);"
- print " cbdata->userdata = userdata;"
- print " action = gupnp_service_proxy_begin_action"
- print " (proxy, \"%s\"," % a.name
- print " _%s_async_callback, cbdata," % a.c_prefixed_name
+ print("%sconst %sin_%s," % (indent, arg.related_var.ctype, arg.c_name))
+ print("%s%s_reply callback," % (indent, a.c_prefixed_name))
+ print("%sgpointer userdata)" % indent)
+ print("{")
+ print(" GUPnPServiceProxyAction* action;")
+ print(" GUPnPAsyncData *cbdata;")
+ print("")
+ print(" cbdata = (GUPnPAsyncData *) g_slice_alloc (sizeof (*cbdata));")
+ print(" cbdata->cb = G_CALLBACK (callback);")
+ print(" cbdata->userdata = userdata;")
+ print(" action = gupnp_service_proxy_begin_action")
+ print(" (proxy, \"%s\"," % a.name)
+ print(" _%s_async_callback, cbdata," % a.c_prefixed_name)
for arg in a.in_args:
- print " \"%s\", %s, in_%s," % (arg.name, arg.related_var.gtype, arg.c_name)
- print " NULL);"
- print
- print " return action;"
- print "}"
+ print(" \"%s\", %s, in_%s," % (arg.name, arg.related_var.gtype, arg.c_name))
+ print(" NULL);")
+ print("")
+ print(" return action;")
+ print("}")
def printClientVariableNotifyBinding(v):
# callback prototype
indent = (22 + len (v.c_prefixed_name)) * " "
- print "typedef void"
- print "(*%s_changed_callback) (GUPnPServiceProxy *proxy," % v.c_prefixed_name
- print "%s%s%s," % (indent, ctype, v.c_name)
- print "%sgpointer userdata);" % indent
- print
+ print("typedef void")
+ print("(*%s_changed_callback) (GUPnPServiceProxy *proxy," % v.c_prefixed_name)
+ print("%s%s%s," % (indent, ctype, v.c_name))
+ print("%sgpointer userdata);" % indent)
+ print("")
# private callback
indent = (20 + len (v.c_prefixed_name)) * " "
- print "static void"
- print "_%s_changed_callback (GUPnPServiceProxy *proxy," % v.c_prefixed_name
- print "%sconst gchar *variable," % indent
- print "%sGValue *value," % indent
- print "%sgpointer userdata)" % indent
- print "{"
- print " GUPnPAsyncData *cbdata;"
- print " %s%s;" % (ctype, v.c_name)
- print
- print " cbdata = (GUPnPAsyncData *) userdata;"
- print " %s = %s (value);" % (v.c_name, v.get_function)
- print " ((%s_changed_callback)cbdata->cb)" % v.c_prefixed_name
- print " (proxy,"
- print " %s," % v.c_name
- print " cbdata->userdata);"
- print
- print " g_slice_free1 (sizeof (*cbdata), cbdata);"
- print "}"
- print
+ print("static void")
+ print("_%s_changed_callback (GUPnPServiceProxy *proxy," % v.c_prefixed_name)
+ print("%sconst gchar *variable," % indent)
+ print("%sGValue *value," % indent)
+ print("%sgpointer userdata)" % indent)
+ print("{")
+ print(" GUPnPAsyncData *cbdata;")
+ print(" %s%s;" % (ctype, v.c_name))
+ print("")
+ print(" cbdata = (GUPnPAsyncData *) userdata;")
+ print(" %s = %s (value);" % (v.c_name, v.get_function))
+ print(" ((%s_changed_callback)cbdata->cb)" % v.c_prefixed_name)
+ print(" (proxy,")
+ print(" %s," % v.c_name)
+ print(" cbdata->userdata);")
+ print("")
+ print(" g_slice_free1 (sizeof (*cbdata), cbdata);")
+ print("}")
+ print("")
# public notify_add function
indent = (13 + len (v.c_prefixed_name)) * " "
- print "static inline gboolean"
- print "%s_add_notify (GUPnPServiceProxy *proxy," % v.c_prefixed_name
- print "%s%s_changed_callback callback," % (indent, v.c_prefixed_name)
- print "%sgpointer userdata)" % indent
- print "{"
- print " GUPnPAsyncData *cbdata;"
- print
- print " cbdata = (GUPnPAsyncData *) g_slice_alloc (sizeof (*cbdata));"
- print " cbdata->cb = G_CALLBACK (callback);"
- print " cbdata->userdata = userdata;"
- print
- print " return gupnp_service_proxy_add_notify"
- print " (proxy,"
- print " \"%s\"," % v.name
- print " %s," % v.gtype
- print " _%s_changed_callback," % v.c_prefixed_name
- print " cbdata);"
- print "}"
+ print("static inline gboolean")
+ print("%s_add_notify (GUPnPServiceProxy *proxy," % v.c_prefixed_name)
+ print("%s%s_changed_callback callback," % (indent, v.c_prefixed_name))
+ print("%sgpointer userdata)" % indent)
+ print("{")
+ print(" GUPnPAsyncData *cbdata;")
+ print("")
+ print(" cbdata = (GUPnPAsyncData *) g_slice_alloc (sizeof (*cbdata));")
+ print(" cbdata->cb = G_CALLBACK (callback);")
+ print(" cbdata->userdata = userdata;")
+ print("")
+ print(" return gupnp_service_proxy_add_notify")
+ print(" (proxy,")
+ print(" \"%s\"," % v.name)
+ print(" %s," % v.gtype)
+ print(" _%s_changed_callback," % v.c_prefixed_name)
+ print(" cbdata);")
+ print("}")
def printServerVariableQueryBinding(v):
# User callback proto
indent = (28 + len (v.ctype)+ len (v.c_prefixed_name)) * " "
- print "typedef %s(*%s_query_callback) (GUPnPService *service," % (v.ctype, v.c_prefixed_name)
- print "%sgpointer userdata);" % indent
- print
+ print("typedef %s(*%s_query_callback) (GUPnPService *service," % (v.ctype, v.c_prefixed_name))
+ print("%sgpointer userdata);" % indent)
+ print("")
indent = (12 + len (v.c_prefixed_name)) * " "
- print "static void"
- print "_%s_query_cb (GUPnPService *service," % v.c_prefixed_name
- print "%sgchar *variable," % indent
- print "%sGValue *value," % indent
- print "%sgpointer userdata)" % indent
- print "{"
- print " GUPnPAsyncData *cbdata;"
- print " %s%s;" % (v.ctype, v.c_name)
- print
+ print("static void")
+ print("_%s_query_cb (GUPnPService *service," % v.c_prefixed_name)
+ print("%sgchar *variable," % indent)
+ print("%sGValue *value," % indent)
+ print("%sgpointer userdata)" % indent)
+ print("{")
+ print(" GUPnPAsyncData *cbdata;")
+ print(" %s%s;" % (v.ctype, v.c_name))
+ print("")
indent = (36 + len (v.c_name) + len (v.c_prefixed_name)) * " "
- print " cbdata = (GUPnPAsyncData *) userdata;"
- print " %s = ((%s_query_callback)cbdata->cb) (service," % (v.c_name, v.c_prefixed_name)
- print "%scbdata->userdata);" % indent
- print " g_value_init (value, %s);" % v.gtype
- print " %s (value, %s);" % (v.set_function, v.c_name)
- print "}"
- print
+ print(" cbdata = (GUPnPAsyncData *) userdata;")
+ print(" %s = ((%s_query_callback)cbdata->cb) (service," % (v.c_name, v.c_prefixed_name))
+ print("%scbdata->userdata);" % indent)
+ print(" g_value_init (value, %s);" % v.gtype)
+ print(" %s (value, %s);" % (v.set_function, v.c_name))
+ print("}")
+ print("")
indent = (16 + len (v.c_prefixed_name)) * " "
- print "gulong"
- print "%s_query_connect (GUPnPService *service," % v.c_prefixed_name
- print "%s%s_query_callback callback," % (indent, v.c_prefixed_name)
- print "%sgpointer userdata)" % indent
- print "{"
- print " GUPnPAsyncData *cbdata;"
- print
- print " cbdata = (GUPnPAsyncData *) g_slice_alloc (sizeof (*cbdata));"
- print " cbdata->cb = G_CALLBACK (callback);"
- print " cbdata->userdata = userdata;"
- print
- print " return g_signal_connect_data (service,"
- print " \"query-variable::%s\"," % v.name
- print " G_CALLBACK (_%s_query_cb)," % v.c_prefixed_name
- print " cbdata,"
- print " _free_cb_data,"
- print " (GConnectFlags) 0);"
- print "}"
- print
+ print("gulong")
+ print("%s_query_connect (GUPnPService *service," % v.c_prefixed_name)
+ print("%s%s_query_callback callback," % (indent, v.c_prefixed_name))
+ print("%sgpointer userdata)" % indent)
+ print("{")
+ print(" GUPnPAsyncData *cbdata;")
+ print("")
+ print(" cbdata = (GUPnPAsyncData *) g_slice_alloc (sizeof (*cbdata));")
+ print(" cbdata->cb = G_CALLBACK (callback);")
+ print(" cbdata->userdata = userdata;")
+ print("")
+ print(" return g_signal_connect_data (service,")
+ print(" \"query-variable::%s\"," % v.name)
+ print(" G_CALLBACK (_%s_query_cb)," % v.c_prefixed_name)
+ print(" cbdata,")
+ print(" _free_cb_data,")
+ print(" (GConnectFlags) 0);")
+ print("}")
+ print("")
def printServerActionBinding(a):
# getter and setter func for GUPnPServiceAction
indent = (13 + len (a.c_prefixed_name)) * " "
if len (a.in_args) > 0:
- print "static inline void"
- print "%s_action_get (GUPnPServiceAction *action," % (a.c_prefixed_name)
+ print("static inline void")
+ print("%s_action_get (GUPnPServiceAction *action," % (a.c_prefixed_name))
for arg in a.in_args[:-1]:
- print "%s%s*in_%s," % (indent, arg.related_var.ctype, arg.c_name)
- print "%s%s*in_%s)" % (indent, a.in_args[-1].related_var.ctype, a.in_args[-1].c_name)
- print "{"
- print " gupnp_service_action_get (action,"
+ print("%s%s*in_%s," % (indent, arg.related_var.ctype, arg.c_name))
+ print("%s%s*in_%s)" % (indent, a.in_args[-1].related_var.ctype, a.in_args[-1].c_name))
+ print("{")
+ print(" gupnp_service_action_get (action,")
for arg in a.in_args:
- print " \"%s\", %s, in_%s," % (arg.name, arg.related_var.gtype, arg.c_name)
- print " NULL);"
- print "}"
- print
+ print(" \"%s\", %s, in_%s," % (arg.name, arg.related_var.gtype, arg.c_name))
+ print(" NULL);")
+ print("}")
+ print("")
if len (a.out_args) > 0:
- print "static inline void"
- print "%s_action_set (GUPnPServiceAction *action," % (a.c_prefixed_name)
+ print("static inline void")
+ print("%s_action_set (GUPnPServiceAction *action," % (a.c_prefixed_name))
for arg in a.out_args[:-1]:
- print "%sconst %sout_%s," % (indent, arg.related_var.ctype, arg.c_name)
- print "%sconst %sout_%s)" % (indent, a.out_args[-1].related_var.ctype, a.out_args[-1].c_name)
- print "{"
- print " gupnp_service_action_set (action,"
+ print("%sconst %sout_%s," % (indent, arg.related_var.ctype, arg.c_name))
+ print("%sconst %sout_%s)" % (indent, a.out_args[-1].related_var.ctype, a.out_args[-1].c_name))
+ print("{")
+ print(" gupnp_service_action_set (action,")
for arg in a.out_args:
- print " \"%s\", %s, out_%s," % (arg.name, arg.related_var.gtype, arg.c_name)
- print " NULL);"
- print "}"
- print
+ print(" \"%s\", %s, out_%s," % (arg.name, arg.related_var.gtype, arg.c_name))
+ print(" NULL);")
+ print("}")
+ print("")
indent = (17 + len (a.c_prefixed_name)) * " "
- print "static inline gulong"
- print "%s_action_connect (GUPnPService *service," % a.c_prefixed_name
- print "%sGCallback callback," % indent
- print "%sgpointer userdata)" % indent
- print "{"
- print " return g_signal_connect (service,"
- print " \"action-invoked::%s\"," % a.name
- print " callback,"
- print " userdata);"
- print "}"
- print
+ print("static inline gulong")
+ print("%s_action_connect (GUPnPService *service," % a.c_prefixed_name)
+ print("%sGCallback callback," % indent)
+ print("%sgpointer userdata)" % indent)
+ print("{")
+ print(" return g_signal_connect (service,")
+ print(" \"action-invoked::%s\"," % a.name)
+ print(" callback,")
+ print(" userdata);")
+ print("}")
+ print("")
def PrintServerVariableNotifyBinding(v):
indent = (18 + len (v.c_prefixed_name)) * " "
- print "void"
- print "%s_variable_notify (GUPnPService *service," % v.c_prefixed_name
- print "%sconst %s%s)" % (indent ,v.ctype, v.c_name)
- print "{"
- print " gupnp_service_notify (service,"
- print " \"%s\", %s, %s," % (v.name, v.gtype, v.c_name)
- print " NULL);"
- print "}"
- print
+ print("void")
+ print("%s_variable_notify (GUPnPService *service," % v.c_prefixed_name)
+ print("%sconst %s%s)" % (indent ,v.ctype, v.c_name))
+ print("{")
+ print(" gupnp_service_notify (service,")
+ print(" \"%s\", %s, %s," % (v.name, v.gtype, v.c_name))
+ print(" NULL);")
+ print("}")
+ print("")
def parseSCPD(scpd, prefix):
"""
def printClientBindings(binding_name, actions, variables):
define = "GUPNP_GENERATED_CLIENT_BINDING_%s" % binding_name
- print "/* Generated by gupnp-binding-tool */"
- print
- print "#include <libgupnp/gupnp.h>"
- print
- print "#ifndef %s" % define
- print "#define %s" % define
- print
- print "G_BEGIN_DECLS"
-
- print "\n#ifndef __GUPNPASYNCDATA_TYPE__"
- print "#define __GUPNPASYNCDATA_TYPE__"
- print "typedef struct {GCallback cb; gpointer userdata; } GUPnPAsyncData;"
- print "#endif"
+ print("/* Generated by gupnp-binding-tool */")
+ print("")
+ print("#include <libgupnp/gupnp.h>")
+ print("")
+ print("#ifndef %s" % define)
+ print("#define %s" % define)
+ print("")
+ print("G_BEGIN_DECLS")
+
+ print("\n#ifndef __GUPNPASYNCDATA_TYPE__")
+ print("#define __GUPNPASYNCDATA_TYPE__")
+ print("typedef struct {GCallback cb; gpointer userdata; } GUPnPAsyncData;")
+ print("#endif")
for a in actions:
- print "\n/* action %s */\n" % a.name
+ print("\n/* action %s */\n" % a.name)
printClientSyncActionBinding(a)
printClientAsyncActionBinding(a)
for v in variables:
if (not v.dummy) and v.notified:
- print "\n/* state variable %s */\n" % v.name
+ print("\n/* state variable %s */\n" % v.name)
printClientVariableNotifyBinding(v)
- print
- print "G_END_DECLS"
- print
- print "#endif /* %s */" % define
+ print("")
+ print("G_END_DECLS")
+ print("")
+ print("#endif /* %s */" % define)
def printServerBindings(binding_name, actions, variables):
define = "GUPNP_GENERATED_CLIENT_BINDING_%s" % binding_name
- print "/* Generated by gupnp-binding-tool */"
- print
- print "#include <libgupnp/gupnp.h>"
- print
- print "#ifndef %s" % define
- print "#define %s" % define
- print
- print "G_BEGIN_DECLS"
-
- print "\n#ifndef __GUPNPASYNCDATA_TYPE__"
- print "#define __GUPNPASYNCDATA_TYPE__"
- print "typedef struct {GCallback cb; gpointer userdata; } GUPnPAsyncData;"
- print "#endif"
-
- print "static void"
- print "_free_cb_data (gpointer data, GClosure *closure)"
- print "{"
- print " GUPnPAsyncData *cbdata = (GUPnPAsyncData *) data;"
- print " g_slice_free1 (sizeof (*cbdata), cbdata);"
- print "}"
- print
+ print("/* Generated by gupnp-binding-tool */")
+ print("")
+ print("#include <libgupnp/gupnp.h>")
+ print("")
+ print("#ifndef %s" % define)
+ print("#define %s" % define)
+ print("")
+ print("G_BEGIN_DECLS")
+
+ print("\n#ifndef __GUPNPASYNCDATA_TYPE__")
+ print("#define __GUPNPASYNCDATA_TYPE__")
+ print("typedef struct {GCallback cb; gpointer userdata; } GUPnPAsyncData;")
+ print("#endif")
+
+ print("static void")
+ print("_free_cb_data (gpointer data, GClosure *closure)")
+ print("{")
+ print(" GUPnPAsyncData *cbdata = (GUPnPAsyncData *) data;")
+ print(" g_slice_free1 (sizeof (*cbdata), cbdata);")
+ print("}")
+ print("")
for a in actions:
- print "\n/* action %s */\n" % a.name
+ print("\n/* action %s */\n" % a.name)
printServerActionBinding(a)
for v in variables:
if not v.dummy:
- print "\n/* state variable %s */\n" % v.name
+ print("\n/* state variable %s */\n" % v.name)
printServerVariableQueryBinding(v)
if v.notified:
PrintServerVariableNotifyBinding(v)
- print
- print "G_END_DECLS"
- print
- print "#endif /* %s */" % define
+ print("")
+ print("G_END_DECLS")
+ print("")
+ print("#endif /* %s */" % define)
def main ():
.end_action_list skip
.send_action_hash skip
.send_action_list skip
+WhiteList
+ .entries skip
ControlError skip
control_error_quark skip
EventingError skip
GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
GTKDOC_MKPDF = @GTKDOC_MKPDF@
GTKDOC_REBASE = @GTKDOC_REBASE@
-GTest_CFLAGS = @GTest_CFLAGS@
-GTest_LIBS = @GTest_LIBS@
HAVE_NETLINK = @HAVE_NETLINK@
HTML_DIR = @HTML_DIR@
INSTALL = @INSTALL@