Updated GUPnP-AV to version 0.11.2 (62bb7a1)
authorMark Ryan <mark.d.ryan@intel.com>
Tue, 13 Nov 2012 18:53:31 +0000 (19:53 +0100)
committerMark Ryan <mark.d.ryan@intel.com>
Tue, 13 Nov 2012 19:25:20 +0000 (20:25 +0100)
86 files changed:
Makefile.am
Makefile.in
NEWS
aclocal.m4
build-aux/compile [new file with mode: 0755]
build-aux/config.sub
build-aux/depcomp
build-aux/ltmain.sh
config.h.in
configure
configure.ac
data/Makefile.am [new file with mode: 0644]
data/Makefile.in [new file with mode: 0644]
data/av.xsd [new file with mode: 0644]
data/didl-lite-v2.xsd [new file with mode: 0644]
data/simpledc20021212.xsd [new file with mode: 0644]
data/upnp.xsd [new file with mode: 0644]
data/xml.xsd [new file with mode: 0644]
doc/Makefile.am
doc/Makefile.in
doc/gupnp-av-docs.sgml
doc/gupnp-av-sections.txt
doc/gupnp-av.types
doc/html/GUPnPDIDLLiteContainer.html
doc/html/GUPnPDIDLLiteContributor.html
doc/html/GUPnPDIDLLiteDescriptor.html
doc/html/GUPnPDIDLLiteItem.html
doc/html/GUPnPDIDLLiteObject.html
doc/html/GUPnPDIDLLiteParser.html
doc/html/GUPnPDIDLLiteResource.html
doc/html/GUPnPDIDLLiteWriter.html
doc/html/GUPnPFeature.html [new file with mode: 0644]
doc/html/GUPnPFeatureListParser.html [new file with mode: 0644]
doc/html/GUPnPLastChangeParser.html
doc/html/GUPnPProtocolInfo.html
doc/html/GUPnPSearchCriteriaParser.html
doc/html/annotation-glossary.html
doc/html/ch01.html
doc/html/ch02.html
doc/html/gupnp-av-Error-codes.html
doc/html/gupnp-av.devhelp2
doc/html/index.html
doc/html/index.sgml
doc/version.xml
gupnp-av-1.0-uninstalled.pc.in
gupnp-av-1.0.pc.in
libgupnp-av/Makefile.am
libgupnp-av/Makefile.in
libgupnp-av/fragment-util.c [new file with mode: 0644]
libgupnp-av/fragment-util.h [new file with mode: 0644]
libgupnp-av/gupnp-av-enums.h [new file with mode: 0644]
libgupnp-av/gupnp-av.h
libgupnp-av/gupnp-didl-lite-container.c
libgupnp-av/gupnp-didl-lite-container.h
libgupnp-av/gupnp-didl-lite-createclass-private.h [new file with mode: 0644]
libgupnp-av/gupnp-didl-lite-createclass.c [new file with mode: 0644]
libgupnp-av/gupnp-didl-lite-createclass.h [new file with mode: 0644]
libgupnp-av/gupnp-didl-lite-object-private.h
libgupnp-av/gupnp-didl-lite-object.c
libgupnp-av/gupnp-didl-lite-object.h
libgupnp-av/gupnp-didl-lite-resource.c
libgupnp-av/gupnp-didl-lite-resource.h
libgupnp-av/gupnp-didl-lite-writer.c
libgupnp-av/gupnp-feature-list-parser.c [new file with mode: 0644]
libgupnp-av/gupnp-feature-list-parser.h [new file with mode: 0644]
libgupnp-av/gupnp-feature.c [new file with mode: 0644]
libgupnp-av/gupnp-feature.h [new file with mode: 0644]
libgupnp-av/gupnp-search-criteria-parser.c
libgupnp-av/gvalue-util.c
libgupnp-av/xml-util.c
libgupnp-av/xml-util.h
libgupnp-av/xsd-data.c [new file with mode: 0644]
libgupnp-av/xsd-data.h [new file with mode: 0644]
m4/vapigen.m4 [new file with mode: 0644]
packaging/GUPnP-AV.changes
packaging/GUPnP-AV.spec
tests/Makefile.am
tests/Makefile.in
tests/check-feature-list-parser.c [new file with mode: 0644]
tests/fragments.c [new file with mode: 0644]
tests/gtest/Makefile.in
vala/GUPnPAV-1.0.metadata [new file with mode: 0644]
vala/Makefile.am [new file with mode: 0644]
vala/Makefile.in [new file with mode: 0644]
vala/gupnp-av-1.0-custom.vala [new file with mode: 0644]
vala/gupnp-av-1.0.deps [new file with mode: 0644]

index ee39c97..eff91c3 100644 (file)
@@ -1,11 +1,11 @@
-SUBDIRS = libgupnp-av tests doc
+SUBDIRS = libgupnp-av tests doc vala data
 
 pkgconfig_DATA= gupnp-av-1.0.pc
 pkgconfigdir = $(libdir)/pkgconfig
 
 ACLOCAL_AMFLAGS=-I m4 ${ACLOCAL_FLAGS}
 
-DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
 
 # Extra clean files so that maintainer-clean removes *everything*
 MAINTAINERCLEANFILES = aclocal.m4 compile config.guess config.sub configure depcomp install-sh ltmain.sh Makefile.in missing config.h.in
index a4d26cb..9bfc34f 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -39,15 +56,15 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
        $(srcdir)/Makefile.in $(srcdir)/config.h.in \
        $(srcdir)/gupnp-av-1.0-uninstalled.pc.in \
        $(srcdir)/gupnp-av-1.0.pc.in $(top_srcdir)/configure AUTHORS \
-       COPYING ChangeLog INSTALL NEWS build-aux/config.guess \
-       build-aux/config.sub build-aux/depcomp build-aux/install-sh \
-       build-aux/ltmain.sh build-aux/missing
+       COPYING ChangeLog INSTALL NEWS build-aux/compile \
+       build-aux/config.guess build-aux/config.sub build-aux/depcomp \
+       build-aux/install-sh build-aux/ltmain.sh build-aux/missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
@@ -71,6 +88,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
     $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
@@ -230,6 +252,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -283,11 +306,11 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-SUBDIRS = libgupnp-av tests doc
+SUBDIRS = libgupnp-av tests doc vala data
 pkgconfig_DATA = gupnp-av-1.0.pc
 pkgconfigdir = $(libdir)/pkgconfig
 ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
-DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
+DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
 
 # Extra clean files so that maintainer-clean removes *everything*
 MAINTAINERCLEANFILES = aclocal.m4 compile config.guess config.sub configure depcomp install-sh ltmain.sh Makefile.in missing config.h.in
@@ -359,8 +382,11 @@ distclean-libtool:
        -rm -f libtool config.lt
 install-pkgconfigDATA: $(pkgconfig_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
        @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -545,13 +571,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
@@ -636,7 +659,7 @@ distcheck: dist
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
-       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       chmod -R a-w $(distdir); chmod u+w $(distdir)
        mkdir $(distdir)/_build
        mkdir $(distdir)/_inst
        chmod a-w $(distdir)
diff --git a/NEWS b/NEWS
index 789de8e..02a8a69 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,64 @@
+0.11.2
+======
+
+Changes since 0.11.1:
+- Implement fragment handling and verification in DIDLLiteObject.
+- Don't error out if vapigen cannot be found.
+
+All contributors to this release:
+
+Krzesimir Nowak <krnowak@openismus.com>
+Jens Georg <mail@jensge.org>
+
+0.11.1
+======
+
+Changes since 0.11.0:
+- Add m4 vapigen detection macro.
+- Fix introspection install dirs.
+- Fix objectUpdateID setter.
+- Add a FeatureList parser.
+- Add some XML fragment getters for DIDLLiteObject.
+- Lower G-I requirements.
+- Enable introspection during distcheck.
+- Undeprecate single-value _{get|set}_creator methods.
+
+Bugs fixed in this release:
+ - https://bugzilla.gnome.org/show_bug.cgi?id=685963
+ - https://bugzilla.gnome.org/show_bug.cgi?id=686464
+
+All contributors to this release:
+
+Jens Georg <mail@jensge.org>
+Regis Merlino <regis.merlino@intel.com>
+Christophe Guiraud <christophe.guiraud@intel.com>
+
+0.11.0
+======
+
+Changes since 0.10.3:
+
+- Add support for properties needed to implement MediaServer:3 "Track changes"
+  functionality.
+- Add proper upnp:createClass support.
+- Clean-up pkg-config files and link to the correct libraries instead of
+  relying on gupnp leaking the right ones.
+- Generate vapi from GIR files.
+
+All contributors to this release:
+
+Krzesimir Nowak <krnowak@openismus.com>
+Jens Georg <mail@jensge.org>
+Andreas Henriksson <andreas@fatal.se>
+Christophe Guiraud <christophe.guiraud@intel.com>
+
+Bug fixed in this release:
+ - https://bugzilla.gnome.org/show_bug.cgi?id=684297
+ - https://bugzilla.gnome.org/show_bug.cgi?id=685477
+
+Changes in dependencies:
+ - gupnp >= 0.19.0 for proper cleaned pkg-config file consistency.
+
 0.10.3
 ======
 
index eeb13cc..314dcfb 100644 (file)
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
@@ -14,8 +14,8 @@
 
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically `autoreconf'.])])
@@ -198,7 +198,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.3], [],
+m4_if([$1], [1.11.6], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -214,7 +214,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.3])dnl
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -812,6 +812,41 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
+# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_PROG_CC_C_O
+# --------------
+# Like AC_PROG_CC_C_O, but changed for automake.
+AC_DEFUN([AM_PROG_CC_C_O],
+[AC_REQUIRE([AC_PROG_CC_C_O])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+dnl Make sure AC_PROG_CC is never called again, or it will override our
+dnl setting of CC.
+m4_define([AC_PROG_CC],
+          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
+])
+
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
 # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
@@ -1212,3 +1247,4 @@ m4_include([m4/ltoptions.m4])
 m4_include([m4/ltsugar.m4])
 m4_include([m4/ltversion.m4])
 m4_include([m4/lt~obsolete.m4])
+m4_include([m4/vapigen.m4])
diff --git a/build-aux/compile b/build-aux/compile
new file mode 100755 (executable)
index 0000000..862a14e
--- /dev/null
@@ -0,0 +1,343 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-03-05.13; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
+# Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
index c894da4..6205f84 100755 (executable)
@@ -4,7 +4,7 @@
 #   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
 #   2011, 2012 Free Software Foundation, Inc.
 
-timestamp='2012-02-10'
+timestamp='2012-04-18'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -225,6 +225,12 @@ case $os in
        -isc*)
                basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
                ;;
+       -lynx*178)
+               os=-lynxos178
+               ;;
+       -lynx*5)
+               os=-lynxos5
+               ;;
        -lynx*)
                os=-lynxos
                ;;
@@ -1537,6 +1543,9 @@ case $basic_machine in
        c4x-* | tic4x-*)
                os=-coff
                ;;
+       hexagon-*)
+               os=-elf
+               ;;
        tic54x-*)
                os=-coff
                ;;
index bd0ac08..25a39e6 100755 (executable)
@@ -1,10 +1,10 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2011-12-04.11; # UTC
+scriptversion=2012-03-27.16; # UTC
 
 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
-# 2011 Free Software Foundation, Inc.
+# 2011, 2012 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@ scriptversion=2011-12-04.11; # UTC
 
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
      exit 1;
      ;;
   -h | --h*)
@@ -40,8 +40,8 @@ as side-effects.
 
 Environment variables:
   depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
   DEPDIR      directory where to store dependencies.
   depfile     Dependency file to output.
   tmpdepfile  Temporary file to use when outputting dependencies.
@@ -57,6 +57,12 @@ EOF
     ;;
 esac
 
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
@@ -102,6 +108,12 @@ if test "$depmode" = msvc7msys; then
    depmode=msvc7
 fi
 
+if test "$depmode" = xlc; then
+   # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations.
+   gccflag=-qmakedep=gcc,-MF
+   depmode=gcc
+fi
+
 case "$depmode" in
 gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
@@ -156,15 +168,14 @@ gcc)
 ## The second -e expression handles DOS-style file names with drive letters.
   sed -e 's/^[^:]*: / /' \
       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
 ## The problem is that when a header file which appears in a .P file
 ## is deleted, the dependency causes make to die (because there is
 ## typically no way to rebuild the header).  We avoid this by adding
 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 ## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
+  tr ' ' "$nl" < "$tmpdepfile" |
+## Some versions of gcc put a space before the ':'.  On the theory
 ## that the space means something, we add a space to the output as
 ## well.  hp depmode also adds that space, but also prefixes the VPATH
 ## to the object.  Take care to not repeat it in the output.
@@ -203,18 +214,15 @@ sgi)
     # clever and replace this with sed code, as IRIX sed won't handle
     # lines with more than a fixed number of characters (4096 in
     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
+    # the IRIX cc adds comments like '#:fec' to the end of the
     # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
+    tr ' ' "$nl" < "$tmpdepfile" \
     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> "$depfile"
+    tr "$nl" ' ' >> "$depfile"
     echo >> "$depfile"
 
     # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
+    tr ' ' "$nl" < "$tmpdepfile" \
    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
    >> "$depfile"
   else
@@ -226,10 +234,17 @@ sgi)
   rm -f "$tmpdepfile"
   ;;
 
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
   # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
@@ -259,12 +274,11 @@ aix)
     test -f "$tmpdepfile" && break
   done
   if test -f "$tmpdepfile"; then
-    # Each line is of the form `foo.o: dependent.h'.
+    # Each line is of the form 'foo.o: dependent.h'.
     # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
+    # '$object: dependent.h' and one to simply 'dependent.h:'.
     sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-    # That's a tab and a space in the [].
-    sed -e 's,^.*\.[a-z]*:[     ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+    sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
   else
     # The sourcefile does not contain any dependencies, so just
     # store a dummy comment line, to avoid errors with the Makefile
@@ -275,23 +289,26 @@ aix)
   ;;
 
 icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'.
+  # However on
+  #    $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c
   # ICC 7.0 will fill foo.d with something like
   #    foo.o: sub/foo.c
   #    foo.o: sub/foo.h
-  # which is wrong.  We want:
+  # which is wrong.  We want
   #    sub/foo.o: sub/foo.c
   #    sub/foo.o: sub/foo.h
   #    sub/foo.c:
   #    sub/foo.h:
   # ICC 7.1 will output
   #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using :
+  # and will wrap long lines using '\':
   #    foo.o: sub/foo.c ... \
   #     sub/foo.h ... \
   #     ...
-
+  # tcc 0.9.26 (FIXME still under development at the moment of writing)
+  # will emit a similar output, but also prepend the continuation lines
+  # with horizontal tabulation characters.
   "$@" -MD -MF "$tmpdepfile"
   stat=$?
   if test $stat -eq 0; then :
@@ -300,15 +317,21 @@ icc)
     exit $stat
   fi
   rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Each line is of the form 'foo.o: dependent.h',
+  # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'.
   # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
+  # '$object: dependent.h' and one to simply 'dependent.h:'.
+  sed -e "s/^[ $tab][ $tab]*/  /" -e "s,^[^:]*:,$object :," \
+    < "$tmpdepfile" > "$depfile"
+  sed '
+    s/[ '"$tab"'][ '"$tab"']*/ /g
+    s/^ *//
+    s/ *\\*$//
+    s/^[^:]*: *//
+    /^$/d
+    /:$/d
+    s/$/ :/
+  ' < "$tmpdepfile" >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -344,7 +367,7 @@ hp2)
   done
   if test -f "$tmpdepfile"; then
     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
+    # Add 'dependent.h:' lines.
     sed -ne '2,${
               s/^ *//
               s/ \\*$//
@@ -359,9 +382,9 @@ hp2)
 
 tru64)
    # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
    # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
+   # dependencies in 'foo.d' instead, so we check for that too.
    # Subdirectories are respected.
    dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
    test "x$dir" = "x$object" && dir=
@@ -407,8 +430,7 @@ tru64)
    done
    if test -f "$tmpdepfile"; then
       sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+      sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
    else
       echo "#dummy" > "$depfile"
    fi
@@ -443,11 +465,11 @@ msvc7)
   p
 }' | $cygpath_u | sort -u | sed -n '
 s/ /\\ /g
-s/\(.*\)/      \1 \\/p
+s/\(.*\)/'"$tab"'\1 \\/p
 s/.\(.*\) \\/\1:/
 H
 $ {
-  s/.*/        /
+  s/.*/'"$tab"'/
   G
   p
 }' >> "$depfile"
@@ -478,7 +500,7 @@ dashmstdout)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -498,15 +520,14 @@ dashmstdout)
   done
 
   test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
+  # Require at least two characters before searching for ':'
   # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
   "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+    sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
+  tr ' ' "$nl" < "$tmpdepfile" | \
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
@@ -562,8 +583,7 @@ makedepend)
   # makedepend may prepend the VPATH from the source file name to the object.
   # No need to regex-escape $object, excess matching of '.' is harmless.
   sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
+  sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
     sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
@@ -583,7 +603,7 @@ cpp)
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -652,8 +672,8 @@ msvisualcpp)
   sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::     \1 \\:p' >> "$depfile"
-  echo "       " >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
index c2852d8..0096fe6 100644 (file)
@@ -70,7 +70,7 @@
 #         compiler:            $LTCC
 #         compiler flags:              $LTCFLAGS
 #         linker:              $LD (gnu? $with_gnu_ld)
-#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1
+#         $progname:   (GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu2
 #         automake:    $automake_version
 #         autoconf:    $autoconf_version
 #
@@ -80,7 +80,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1ubuntu1"
+VERSION="2.4.2 Debian-2.4.2-1ubuntu2"
 TIMESTAMP=""
 package_revision=1.3337
 
index 6410d52..e7842b3 100644 (file)
@@ -43,6 +43,9 @@
    */
 #undef LT_OBJDIR
 
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
 /* Name of package */
 #undef PACKAGE
 
index c36338b..bcbc1f0 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,13 +1,11 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for gupnp-av 0.10.3.
+# Generated by GNU Autoconf 2.69 for gupnp-av 0.11.2.
 #
 # Report bugs to <https://bugzilla.gnome.org/enter_bug.cgi?product=GUPnP>.
 #
 #
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -136,6 +134,31 @@ export LANGUAGE
 # CDPATH.
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
 if test "x$CONFIG_SHELL" = x; then
   as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -169,7 +192,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
 else
   exitcode=1; echo positional parameters were not saved.
 fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
   as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@@ -222,21 +246,25 @@ IFS=$as_save_IFS
 
 
       if test "x$CONFIG_SHELL" != x; then :
-  # We cannot yet assume a decent shell, so we have to provide a
-       # neutralization value for shells without unset; and this also
-       # works around shells that cannot unset nonexistent variables.
-       # Preserve -v and -x to the replacement shell.
-       BASH_ENV=/dev/null
-       ENV=/dev/null
-       (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
-       export CONFIG_SHELL
-       case $- in # ((((
-         *v*x* | *x*v* ) as_opts=-vx ;;
-         *v* ) as_opts=-v ;;
-         *x* ) as_opts=-x ;;
-         * ) as_opts= ;;
-       esac
-       exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
 fi
 
     if test x$as_have_required = xno; then :
@@ -340,6 +368,14 @@ $as_echo X"$as_dir" |
 
 
 } # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
 # as_fn_append VAR VALUE
 # ----------------------
 # Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -461,6 +497,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
   chmod +x "$as_me.lineno" ||
     { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
 
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
   # Don't try to exec as it changes $[0], causing all sort of problems
   # (the dirname of $[0] is not the place where we might find the
   # original and so on.  Autoconf is especially sensitive to this).
@@ -495,16 +535,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -516,28 +556,8 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -547,6 +567,66 @@ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
 
 SHELL=${CONFIG_SHELL-/bin/sh}
 
+as_awk_strverscmp='
+  # Use only awk features that work with 7th edition Unix awk (1978).
+  # My, what an old awk you have, Mr. Solaris!
+  END {
+    while (length(v1) && length(v2)) {
+      # Set d1 to be the next thing to compare from v1, and likewise for d2.
+      # Normally this is a single character, but if v1 and v2 contain digits,
+      # compare them as integers and fractions as strverscmp does.
+      if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {
+       # Split v1 and v2 into their leading digit string components d1 and d2,
+       # and advance v1 and v2 past the leading digit strings.
+       for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue
+       for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue
+       d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1)
+       d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1)
+       if (d1 ~ /^0/) {
+         if (d2 ~ /^0/) {
+           # Compare two fractions.
+           while (d1 ~ /^0/ && d2 ~ /^0/) {
+             d1 = substr(d1, 2); len1--
+             d2 = substr(d2, 2); len2--
+           }
+           if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) {
+             # The two components differ in length, and the common prefix
+             # contains only leading zeros.  Consider the longer to be less.
+             d1 = -len1
+             d2 = -len2
+           } else {
+             # Otherwise, compare as strings.
+             d1 = "x" d1
+             d2 = "x" d2
+           }
+         } else {
+           # A fraction is less than an integer.
+           exit 1
+         }
+       } else {
+         if (d2 ~ /^0/) {
+           # An integer is greater than a fraction.
+           exit 2
+         } else {
+           # Compare two integers.
+           d1 += 0
+           d2 += 0
+         }
+       }
+      } else {
+       # The normal case, without worrying about digits.
+       d1 = substr(v1, 1, 1); v1 = substr(v1, 2)
+       d2 = substr(v2, 1, 1); v2 = substr(v2, 2)
+      }
+      if (d1 < d2) exit 1
+      if (d1 > d2) exit 2
+    }
+    # Beware Solaris /usr/xgp4/bin/awk (at least through Solaris 10),
+    # which mishandles some comparisons of empty strings to integers.
+    if (length(v2)) exit 1
+    if (length(v1)) exit 2
+  }
+'
 
 test -n "$DJDIR" || exec 7<&0 </dev/null
 exec 6>&1
@@ -571,8 +651,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='gupnp-av'
 PACKAGE_TARNAME='gupnp-av'
-PACKAGE_VERSION='0.10.3'
-PACKAGE_STRING='gupnp-av 0.10.3'
+PACKAGE_VERSION='0.11.2'
+PACKAGE_STRING='gupnp-av 0.11.2'
 PACKAGE_BUGREPORT='https://bugzilla.gnome.org/enter_bug.cgi?product=GUPnP'
 PACKAGE_URL='http://www.gupnp.org/'
 
@@ -634,6 +714,9 @@ HTML_DIR
 GTKDOC_MKPDF
 GTKDOC_REBASE
 GTKDOC_CHECK
+HAVE_VAPIGEN_FALSE
+HAVE_VAPIGEN_TRUE
+VAPIGEN
 HAVE_INTROSPECTION_FALSE
 HAVE_INTROSPECTION_TRUE
 INTROSPECTION_MAKEFILE
@@ -1253,8 +1336,6 @@ target=$target_alias
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used" >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1340,7 +1421,7 @@ if test "$ac_init_help" = "long"; then
   # 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-av 0.10.3 to adapt to many kinds of systems.
+\`configure' configures gupnp-av 0.11.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1410,7 +1491,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gupnp-av 0.10.3:";;
+     short | recursive ) echo "Configuration of gupnp-av 0.11.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1534,10 +1615,10 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-gupnp-av configure 0.10.3
-generated by GNU Autoconf 2.68
+gupnp-av configure 0.11.2
+generated by GNU Autoconf 2.69
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1723,7 +1804,7 @@ $as_echo "$ac_try_echo"; } >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext && {
         test "$cross_compiling" = yes ||
-        $as_test_x conftest$ac_exeext
+        test -x conftest$ac_exeext
        }; then :
   ac_retval=0
 else
@@ -1812,8 +1893,8 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by gupnp-av $as_me 0.10.3, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+It was created by gupnp-av $as_me 0.11.2, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
 
@@ -2237,7 +2318,7 @@ case $as_dir/ in #((
     # by default.
     for ac_prog in ginstall scoinst install; do
       for ac_exec_ext in '' $ac_executable_extensions; do
-       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
          if test $ac_prog = install &&
            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
@@ -2406,7 +2487,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2446,7 +2527,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2497,7 +2578,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_prog in mkdir gmkdir; do
         for ac_exec_ext in '' $ac_executable_extensions; do
-          { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
           case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
             'mkdir (GNU coreutils) '* | \
             'mkdir (coreutils) '* | \
@@ -2550,7 +2631,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AWK="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2636,7 +2717,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='gupnp-av'
- VERSION='0.10.3'
+ VERSION='0.11.2'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -2821,7 +2902,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2861,7 +2942,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="gcc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2914,7 +2995,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -2955,7 +3036,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
        continue
@@ -3013,7 +3094,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3057,7 +3138,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -3503,8 +3584,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <stdarg.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
 struct buf { int x; };
 FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -3780,6 +3860,132 @@ else
 fi
 
 
+if test "x$CC" != xcc; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
+$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
+$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
+fi
+set dummy $CC; ac_cc=`$as_echo "$2" |
+                     sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+# Make sure it works both with $CC and with simple cc.
+# We do the test twice because some compilers refuse to overwrite an
+# existing .o file with -o, though they will create one.
+ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+rm -f conftest2.*
+if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+   test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+then
+  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
+  if test "x$CC" != xcc; then
+    # Test first that cc exists at all.
+    if { ac_try='cc -c conftest.$ac_ext >&5'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
+      rm -f conftest2.*
+      if { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } &&
+        test -f conftest2.$ac_objext && { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; };
+      then
+       # cc works too.
+       :
+      else
+       # cc exists but doesn't like -o.
+       eval ac_cv_prog_cc_${ac_cc}_c_o=no
+      fi
+    fi
+  fi
+else
+  eval ac_cv_prog_cc_${ac_cc}_c_o=no
+fi
+rm -f core conftest*
+
+fi
+if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
+
+fi
+
+# FIXME: we rely on the cache variable name because
+# there is no other way.
+set dummy $CC
+am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+
+
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -3935,7 +4141,7 @@ do
     for ac_prog in grep ggrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+      as_fn_executable_p "$ac_path_GREP" || continue
 # Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
 case `"$ac_path_GREP" --version 2>&1` in
@@ -4001,7 +4207,7 @@ do
     for ac_prog in egrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+      as_fn_executable_p "$ac_path_EGREP" || continue
 # Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
 case `"$ac_path_EGREP" --version 2>&1` in
@@ -4569,7 +4775,7 @@ do
     for ac_prog in sed gsed; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+      as_fn_executable_p "$ac_path_SED" || continue
 # Check for GNU ac_path_SED and select it if it is found.
   # Check for GNU $ac_path_SED
 case `"$ac_path_SED" --version 2>&1` in
@@ -4648,7 +4854,7 @@ do
     for ac_prog in fgrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
       ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+      as_fn_executable_p "$ac_path_FGREP" || continue
 # Check for GNU ac_path_FGREP and select it if it is found.
   # Check for GNU $ac_path_FGREP
 case `"$ac_path_FGREP" --version 2>&1` in
@@ -4904,7 +5110,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -4948,7 +5154,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5372,7 +5578,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5412,7 +5618,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OBJDUMP="objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5715,7 +5921,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5755,7 +5961,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DLLTOOL="dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5855,7 +6061,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -5899,7 +6105,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_AR="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6024,7 +6230,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6064,7 +6270,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6123,7 +6329,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6163,7 +6369,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6812,7 +7018,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6852,7 +7058,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6932,7 +7138,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -6972,7 +7178,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7024,7 +7230,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7064,7 +7270,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_NMEDIT="nmedit"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7116,7 +7322,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7156,7 +7362,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_LIPO="lipo"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7208,7 +7414,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7248,7 +7454,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OTOOL="otool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7300,7 +7506,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7340,7 +7546,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OTOOL64="otool64"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7578,7 +7784,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_AS="${ac_tool_prefix}as"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7618,7 +7824,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_AS="as"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7670,7 +7876,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7710,7 +7916,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_DLLTOOL="dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7762,7 +7968,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -7802,7 +8008,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_prog_ac_ct_OBJDUMP="objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -11902,7 +12108,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -11945,7 +12151,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -12004,12 +12210,18 @@ if test -n "$LIBGUPNP_CFLAGS"; then
     pkg_cv_LIBGUPNP_CFLAGS="$LIBGUPNP_CFLAGS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gupnp-1.0 >= 0.17.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gupnp-1.0 >= 0.17.0") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gupnp-1.0 >= 0.19.0 \\
+                            gobject-2.0 \\
+                            libxml-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_LIBGUPNP_CFLAGS=`$PKG_CONFIG --cflags "gupnp-1.0 >= 0.17.0" 2>/dev/null`
+  pkg_cv_LIBGUPNP_CFLAGS=`$PKG_CONFIG --cflags "gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -12021,12 +12233,18 @@ if test -n "$LIBGUPNP_LIBS"; then
     pkg_cv_LIBGUPNP_LIBS="$LIBGUPNP_LIBS"
  elif test -n "$PKG_CONFIG"; then
     if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gupnp-1.0 >= 0.17.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "gupnp-1.0 >= 0.17.0") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gupnp-1.0 >= 0.19.0 \\
+                            gobject-2.0 \\
+                            libxml-2.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_LIBGUPNP_LIBS=`$PKG_CONFIG --libs "gupnp-1.0 >= 0.17.0" 2>/dev/null`
+  pkg_cv_LIBGUPNP_LIBS=`$PKG_CONFIG --libs "gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0" 2>/dev/null`
                      test "x$?" != "x0" && pkg_failed=yes
 else
   pkg_failed=yes
@@ -12047,14 +12265,20 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-               LIBGUPNP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gupnp-1.0 >= 0.17.0" 2>&1`
+               LIBGUPNP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0" 2>&1`
         else
-               LIBGUPNP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gupnp-1.0 >= 0.17.0" 2>&1`
+               LIBGUPNP_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0" 2>&1`
         fi
        # Put the nasty error message in config.log where it belongs
        echo "$LIBGUPNP_PKG_ERRORS" >&5
 
-       as_fn_error $? "Package requirements (gupnp-1.0 >= 0.17.0) were not met:
+       as_fn_error $? "Package requirements (gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0) were not met:
 
 $LIBGUPNP_PKG_ERRORS
 
 
 
 
+# vapigen
+if test "x$found_introspection" = "xyes"; then :
+
+       # Extract the first word of "vapigen", so it can be a program name with args.
+set dummy vapigen; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_VAPIGEN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $VAPIGEN in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_VAPIGEN="$VAPIGEN" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_VAPIGEN="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+VAPIGEN=$ac_cv_path_VAPIGEN
+if test -n "$VAPIGEN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VAPIGEN" >&5
+$as_echo "$VAPIGEN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test -z "$VAPIGEN"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No Vala API Generator found. You will not be able to generate .vapi files." >&5
+$as_echo "$as_me: WARNING: No Vala API Generator found. You will not be able to generate .vapi files." >&2;}
+else
+  if test -n "0.14"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking $VAPIGEN is at least version 0.14" >&5
+$as_echo_n "checking $VAPIGEN is at least version 0.14... " >&6; }
+         am__vapigen_version=`$VAPIGEN --version | sed 's/Vala API Generator  *//'`
+         as_arg_v1=0.14
+as_arg_v2="$am__vapigen_version"
+awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null
+case $? in #(
+  1) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; } ;; #(
+  0) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; } ;; #(
+  2) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+            { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Vala API Generator 0.14 not found." >&5
+$as_echo "$as_me: WARNING: Vala API Generator 0.14 not found." >&2;} ;; #(
+  *) :
+     ;;
+esac
+fi
+fi
+
+
+
+fi
+ if test "x$VAPIGEN" != "x"; then
+  HAVE_VAPIGEN_TRUE=
+  HAVE_VAPIGEN_FALSE='#'
+else
+  HAVE_VAPIGEN_TRUE='#'
+  HAVE_VAPIGEN_FALSE=
+fi
+
+
+
 
 
 
@@ -12218,7 +12527,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -12260,7 +12569,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -12304,7 +12613,7 @@ do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
     ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
@@ -12519,7 +12828,7 @@ fi
 
 
 
-ac_config_files="$ac_config_files Makefile libgupnp-av/Makefile tests/Makefile tests/gtest/Makefile doc/Makefile doc/version.xml gupnp-av-1.0.pc gupnp-av-1.0-uninstalled.pc"
+ac_config_files="$ac_config_files Makefile libgupnp-av/Makefile tests/Makefile tests/gtest/Makefile doc/Makefile doc/version.xml data/Makefile vala/Makefile gupnp-av-1.0.pc gupnp-av-1.0-uninstalled.pc"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -12650,6 +12959,10 @@ if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"
   as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_VAPIGEN_TRUE}" && test -z "${HAVE_VAPIGEN_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_VAPIGEN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
   as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -12968,16 +13281,16 @@ if (echo >conf$$.file) 2>/dev/null; then
     # ... but there are two gotchas:
     # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
     # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-    # In both cases, we have to default to `cp -p'.
+    # In both cases, we have to default to `cp -pR'.
     ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-      as_ln_s='cp -p'
+      as_ln_s='cp -pR'
   elif ln conf$$.file conf$$ 2>/dev/null; then
     as_ln_s=ln
   else
-    as_ln_s='cp -p'
+    as_ln_s='cp -pR'
   fi
 else
-  as_ln_s='cp -p'
+  as_ln_s='cp -pR'
 fi
 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
 rmdir conf$$.dir 2>/dev/null
@@ -13037,28 +13350,16 @@ else
   as_mkdir_p=false
 fi
 
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-       test -d "$1/.";
-      else
-       case $1 in #(
-       -*)set "./$1";;
-       esac;
-       case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
-       ???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
 
 # Sed expression to map a string onto a valid CPP name.
 as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -13079,8 +13380,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by gupnp-av $as_me 0.10.3, which was
-generated by GNU Autoconf 2.68.  Invocation command line was
+This file was extended by gupnp-av $as_me 0.11.2, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -13146,11 +13447,11 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-gupnp-av config.status 0.10.3
-configured by $0, generated by GNU Autoconf 2.68,
+gupnp-av config.status 0.11.2
+configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -13241,7 +13542,7 @@ fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
   shift
   \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
   CONFIG_SHELL='$SHELL'
@@ -13563,6 +13864,8 @@ do
     "tests/gtest/Makefile") CONFIG_FILES="$CONFIG_FILES tests/gtest/Makefile" ;;
     "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
     "doc/version.xml") CONFIG_FILES="$CONFIG_FILES doc/version.xml" ;;
+    "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;;
+    "vala/Makefile") CONFIG_FILES="$CONFIG_FILES vala/Makefile" ;;
     "gupnp-av-1.0.pc") CONFIG_FILES="$CONFIG_FILES gupnp-av-1.0.pc" ;;
     "gupnp-av-1.0-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES gupnp-av-1.0-uninstalled.pc" ;;
 
index 7e32993..f8eeba3 100644 (file)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.63])
 AC_INIT([gupnp-av],
-        [0.10.3],
+        [0.11.2],
         [https://bugzilla.gnome.org/enter_bug.cgi?product=GUPnP],
         [gupnp-av],
         [http://www.gupnp.org/])
@@ -16,6 +16,7 @@ AM_SILENT_RULES([yes])
 
 # Check for programs
 AC_PROG_CC
+AM_PROG_CC_C_O
 AC_HEADER_STDC
 AC_FUNC_MMAP
 
@@ -23,7 +24,9 @@ AC_FUNC_MMAP
 LT_PREREQ([2.2])
 LT_INIT([win32-dll])
 
-PKG_CHECK_MODULES(LIBGUPNP, gupnp-1.0 >= 0.17.0)
+PKG_CHECK_MODULES(LIBGUPNP, gupnp-1.0 >= 0.19.0 \
+                            gobject-2.0 \
+                            libxml-2.0)
 
 # glib-genmarshal
 GLIB_GENMARSHAL=`pkg-config --variable=glib_genmarshal glib-2.0`
@@ -39,6 +42,15 @@ fi
 
 GOBJECT_INTROSPECTION_CHECK([0.9.5])
 
+# vapigen
+AS_IF([test "x$found_introspection" = "xyes"],
+      [
+       VALA_PROG_VAPIGEN([0.14])
+      ]
+)
+AM_CONDITIONAL([HAVE_VAPIGEN], [test "x$VAPIGEN" != "x"])
+
+
 GTK_DOC_CHECK([1.10],[--flavour no-tmpl])
 
 AC_CONFIG_FILES([
@@ -48,6 +60,8 @@ tests/Makefile
 tests/gtest/Makefile
 doc/Makefile
 doc/version.xml
+data/Makefile
+vala/Makefile
 gupnp-av-1.0.pc
 gupnp-av-1.0-uninstalled.pc
 ])
diff --git a/data/Makefile.am b/data/Makefile.am
new file mode 100644 (file)
index 0000000..b224106
--- /dev/null
@@ -0,0 +1 @@
+dist_pkgdata_DATA = didl-lite-v2.xsd upnp.xsd av.xsd xml.xsd simpledc20021212.xsd
diff --git a/data/Makefile.in b/data/Makefile.in
new file mode 100644 (file)
index 0000000..f2994ef
--- /dev/null
@@ -0,0 +1,466 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = data
+DIST_COMMON = $(dist_pkgdata_DATA) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkgdatadir)"
+DATA = $(dist_pkgdata_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGUPNP_CFLAGS = @LIBGUPNP_CFLAGS@
+LIBGUPNP_LIBS = @LIBGUPNP_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+dist_pkgdata_DATA = didl-lite-v2.xsd upnp.xsd av.xsd xml.xsd simpledc20021212.xsd
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu data/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-dist_pkgdataDATA: $(dist_pkgdata_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgdatadir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \
+       done
+
+uninstall-dist_pkgdataDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(dist_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+       for dir in "$(DESTDIR)$(pkgdatadir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-dist_pkgdataDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-dist_pkgdataDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+       distclean distclean-generic distclean-libtool distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dist_pkgdataDATA \
+       install-dvi install-dvi-am install-exec install-exec-am \
+       install-html install-html-am install-info install-info-am \
+       install-man install-pdf install-pdf-am install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am uninstall uninstall-am uninstall-dist_pkgdataDATA
+
+
+# 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.
+.NOEXPORT:
diff --git a/data/av.xsd b/data/av.xsd
new file mode 100644 (file)
index 0000000..f9fca2a
--- /dev/null
@@ -0,0 +1,773 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:av="urn:schemas-upnp-org:av:av" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:schemas-upnp-org:av:av" version="3-20101231">
+       <xsd:annotation>
+               <xsd:documentation xml:lang="en">
+               Note that all schema supplied by the UPnP Forum AV WC committee are for informational use only and that the
+               standardized DCPs describe the normative requirements for these schema. Some schema provided do not necessarily
+               embody requirements regarding number of element occurrances allowed or their ordering.
+
+               Schema for UPnP A/V AV
+               </xsd:documentation>
+       </xsd:annotation>
+       <!--=============================-=============================-->
+       <!--                       String Types                        -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="_pName.attributeOnly">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               Dependent property name that has no associated independent property.
+                               MAY include namespace prefix
+                               MUST NOT include independent property name
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([\i-[:]][\c-[:]]*:)?@[\i-[:]][\c-[:]]*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="_pName.elementIncluded">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               General property name type
+                               MUST include independent property name
+                               MAY include namespace prefix
+                               MAY include dependent property name
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(@[\i-[:]][\c-[:]]*)?"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="pName">
+               <xsd:union memberTypes="av:_pName.attributeOnly av:_pName.elementIncluded"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="pName.csv.1-n">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="(([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(@[\i-[:]][\c-[:]])?)|(@[\i-[:]][\c-[:]])(,(([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(@[\i-[:]][\c-[:]])?)|(@[\i-[:]][\c-[:]]))*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="pName.csv.0-n">
+               <xsd:union memberTypes="av:pName.csv.1-n av:string.len.0"/>
+       </xsd:simpleType>
+       <!--
+            Use the following names in type names that represent individual
+            strings or delimited sequences of strings to distinguish the cases
+            where individual string components MUST be empty vs. MAY be empty vs.
+            MUST NOT be empty:
+
+               string.len.0
+               string.len.1_
+                       string.len.0_
+       -->
+       <!--4,294,967,295-->
+       <xsd:simpleType name="_unsignedInt0">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value="0*[0-9]{1,9}"/>
+                       <xsd:pattern value="0*[1-3][0-9]{9}"/>
+                       <xsd:pattern value="0*4[0-1][0-9]{8}"/>
+                       <xsd:pattern value="0*42[0-8][0-9]{7}"/>
+                       <xsd:pattern value="0*429[0-3][0-9]{6}"/>
+                       <xsd:pattern value="0*4294[0-8][0-9]{5}"/>
+                       <xsd:pattern value="0*42949[0-5][0-9]{4}"/>
+                       <xsd:pattern value="0*429496[0-6][0-9]{3}"/>
+                       <xsd:pattern value="0*4294967[0-1][0-9]{2}"/>
+                       <xsd:pattern value="0*42949672[0-8][0-9]"/>
+                       <xsd:pattern value="0*429496729[0-5]"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="_unsignedInt">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value="0*(([0-9]{1,9})|([1-3][0-9]{9})|(4[0-1][0-9]{8})|(42[0-8][0-9]{7})|(429[0-3][0-9]{6})|(4294[0-8][0-9]{5})|(42949[0-5][0-9]{4})|(429496[0-6][0-9]{3})|(4294967[0-1][0-9]{2})|(42949672[0-8][0-9])|(429496729[0-5]))"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.len.0">
+               <xsd:restriction base="xsd:string">
+                       <xsd:length value="0"/>
+                       <xsd:whiteSpace value="collapse"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.len.1_">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="\s*\S+\s*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.len.0_">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.len.0_256">
+               <xsd:restriction base="xsd:string">
+                       <xsd:maxLength value="256"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="NCName.len.1_31">
+               <xsd:restriction base="xsd:NCName">
+                       <xsd:maxLength value="31"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.0_.string.len.1_">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([^,]|\\,)+(,([^,]|\\,)+)*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.0_.string.len.0_">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([^,]|\\,)*(,([^,]|\\,)*)*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.1_.string.len.1_">
+               <xsd:restriction base="av:csv.0_.string.len.1_">
+                       <xsd:minLength value="1"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.1_.string.len.0_">
+               <xsd:restriction base="av:csv.0_.string.len.0_">
+                       <xsd:minLength value="1"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.4.string.len.1_">
+               <xsd:restriction base="av:csv.0_.string.len.1_">
+                       <xsd:pattern value="([^,]|\\,)+(,([^,]|\\,)+){3}"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.4.string.len.0_">
+               <xsd:restriction base="av:csv.0_.string.len.0_">
+                       <xsd:pattern value="([^,]|\\,)*(,([^,]|\\,)*){3}"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.0_.unsignedInteger">
+               <xsd:union memberTypes="av:csv.1_.unsignedInteger av:string.len.0"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.1_.unsignedInteger">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([0-9]+)(,[0-9]+)*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.1_Name">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="(\i\c*)(,(\i\c*))*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.1_.QName">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*(,([\i-[:]][\c-[:]]*:)?[\i-[:]][\c-[:]]*)*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.1_.NCName">
+               <xsd:restriction base="av:csv.1_.QName">
+                       <xsd:pattern value="[^:]+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="csv.1_.colonDelimPairs">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value="[^:]+:[^:]+(,[^:]+:[^:]+)*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                      Named Constants                      -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="string.const.ALL">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="ALL"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.ANY">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="ANY"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.AUTO">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="AUTO"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.DEFAULT">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="DEFAULT"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.FIRST-RUN">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="FIRST-RUN"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.HIGHEST">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="HIGHEST"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.INFINITY">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="INFINITY"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.LOWEST">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="LOWEST"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.NOT_IMPLEMENTED">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="NOT_IMPLEMENTED"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.NOW">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="NOW"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.OBJECTID">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="OBJECTID"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.PREDEF">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="PREDEF"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.REPEAT">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="REPEAT"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.UNBOUNDED">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="UNBOUNDED"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.const.UNKNOWN">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="UNKNOWN"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                     Numeric Datatypes                     -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="unsignedInt.or.UNKNOWN">
+               <xsd:union memberTypes="xsd:unsignedInt av:string.const.UNKNOWN"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="unsignedInt.or.UNBOUNDED">
+               <xsd:union memberTypes="xsd:unsignedInt av:string.const.UNBOUNDED"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="positiveInt">
+               <xsd:restriction base="xsd:unsignedInt">
+                       <xsd:minInclusive value="1"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="rational">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="-?[0-9]+(/0*[1-9][0-9]*)?"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="nonZeroRational">
+               <xsd:restriction base="av:rational">
+                       <xsd:pattern value="[^/]*[1-9].*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="long.-1_">
+               <xsd:restriction base="xsd:long">
+                       <xsd:minInclusive value="-1"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="int.-1_">
+               <xsd:restriction base="xsd:int">
+                       <xsd:minInclusive value="-1"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                       Time Datatypes                      -->
+       <!--=============================-=============================-->
+       <!--
+                               EBNF from ScheduledRecording:1 1.00
+
+               sched-start             ::=     date-time       |
+                                                                       day-of-yr-time  |
+                                                                       named-day-time  |
+                                                                       T-labeled-time  |
+                                                                       'NOW'
+               start-range             ::=     (date-time|'NOW') '/' (date-time|'INFINITY')
+
+               duration                        ::=     'P' [n 'D'] time
+               duration-long   ::=     duration|'INFINITY'
+               duration-any    ::=     duration|'INFINITY'|'ANY'
+               duration-adj    ::=     ('+'|'-') duration
+               duration-range  ::=     duration '/' duration-long
+
+               date-time               ::=     yyyy '-' mm '-' dd T-labeled-time
+               day-of-yr-time  ::=              mm '-' dd T-labeled-time
+               named-day-time  ::=              named-day T-labeled-time
+
+               T-labeled-time  ::=     'T' time [zone]
+               time                            ::=     HH ':' MM ':' SS
+               zone                            ::=     'Z'|(('+'|'-') HH ':' MM)
+               month-day               ::=     mm '-' dd
+               named-day               ::=     'MON'|'TUE'|'WED'|'THU'|'FRI'|'SAT'|'SUN'|
+                                                                       'MON-FRI'|'MON-SAT'
+               n                                       ::=     1*DIGIT (* non-negative integer *)
+               yyyy                            ::=     4DIGIT  (* 0001-9999 *)
+               mm                                      ::=     2DIGIT  (* 01-12 *)
+
+       -->
+       <xsd:simpleType name="dateTime">
+               <xsd:annotation>
+                       <xsd:documentation> Disallows fractional seconds </xsd:documentation>
+               </xsd:annotation>
+               <xsd:restriction base="xsd:dateTime">
+                       <xsd:pattern value="[^\.]*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="signedDuration">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value="[-+]P([0-9]*D)?(2[0-3]|[0-1][0-9])(:[0-5][0-9]){2}"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="unsignedDuration">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="P([0-9]*D)?(2[0-3]|[0-1][0-9])(:[0-5][0-9]){2}"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="unsignedDuration.or.INFINITY">
+               <xsd:union memberTypes="av:unsignedDuration av:string.const.INFINITY"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="unsignedDuration.or.INFINITY.or.ANY">
+               <xsd:union memberTypes="av:unsignedDuration.or.INFINITY av:string.const.ANY"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="dayOfWeek.en.len.3">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="SUN"/>
+                       <xsd:enumeration value="MON"/>
+                       <xsd:enumeration value="TUE"/>
+                       <xsd:enumeration value="WED"/>
+                       <xsd:enumeration value="THU"/>
+                       <xsd:enumeration value="FRI"/>
+                       <xsd:enumeration value="SAT"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!-- Original duration definition in CDS:1 -->
+       <xsd:simpleType name="duration.cds1.decFrac">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="[-+]?[0-9]+(:[0-5][0-9]){2}(\.[0-9]+)?"/>
+               </xsd:restriction>
+               <!-- Decimal fraction version -->
+       </xsd:simpleType>
+       <xsd:simpleType name="duration.cds1.numDenomFrac">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="[-+]?[0-9]+(:[0-5][0-9]){2}(\.[0-9]+/[0-9]+)?"/>
+               </xsd:restriction>
+               <!-- Numerator/denominator fraction version -->
+       </xsd:simpleType>
+       <xsd:simpleType name="duration.cds1">
+               <xsd:union memberTypes="av:duration.cds1.decFrac av:duration.cds1.numDenomFrac"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="duration.cds1.or.NOT_IMPLEMENTED">
+               <xsd:union memberTypes="av:duration.cds1 av:string.const.NOT_IMPLEMENTED"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="daylightSaving.type">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="startTimeUsage">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                Internet-related datatypes                 -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="domainName">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value="([^\.]+\.)+[^\.]+\.?"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!--===========================================================-->
+       <!--                                                           -->
+       <!--                  UPnP Specific Datatypes                  -->
+       <!--                                                           -->
+       <!--===========================================================-->
+       <xsd:simpleType name="UDN">
+               <xsd:restriction base="xsd:anyURI">
+                       <xsd:pattern value="uuid:.+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!--===========================================================-->
+       <!--                                                           -->
+       <!--                   AV Specific Datatypes                   -->
+       <!--                                                           -->
+       <!--===========================================================-->
+       <xsd:simpleType name="sched-start">
+               <xsd:union memberTypes="av:dateTime xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="dateTime-range">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value=".+/.+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="duration-range">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value=".+/.+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="radioBand.wc.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="AM"/>
+                       <xsd:enumeration value="FM"/>
+                       <xsd:enumeration value="Shortwave"/>
+                       <xsd:enumeration value="Internet"/>
+                       <xsd:enumeration value="Satellite"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="radioBand.type">
+               <xsd:union memberTypes="av:radioBand.wc.values av:radioBand.vx.values"/>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                    Simple Common Types                    -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="_id.type">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="_classNameBase.type">
+               <xsd:restriction base="xsd:NCName"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="_title.type">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="stateUpdateID.type">
+               <xsd:restriction base="xsd:unsignedInt"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="string.domainNamePrefixed">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               string.domainNamePrefixed == Domain Name Prefix type
+                               This type is defined in ContentDirectory:2 and ScheduledRecording:1 as
+                               string.domainNamePrefixed ::= domain-name '_' string
+                               Therefore, the only requirement imposed here is the occurrence of at
+                               least one underscore that has at least one character before and after it.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value=".+_.+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                   Storage Related Types                   -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="storageMedium.type">
+               <xsd:attribute name="val" type="av:storageMedium.values" use="required"/>
+       </xsd:complexType>
+       <xsd:simpleType name="storageMedium.wc.values">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="UNKNOWN"/>
+                       <xsd:enumeration value="DV"/>
+                       <xsd:enumeration value="MINI-DV"/>
+                       <xsd:enumeration value="VHS"/>
+                       <xsd:enumeration value="W-VHS"/>
+                       <xsd:enumeration value="S-VHS"/>
+                       <xsd:enumeration value="D-VHS"/>
+                       <xsd:enumeration value="VHSC"/>
+                       <xsd:enumeration value="VIDEO8"/>
+                       <xsd:enumeration value="HI8"/>
+                       <xsd:enumeration value="CD-ROM"/>
+                       <xsd:enumeration value="CD-DA"/>
+                       <xsd:enumeration value="CD-R"/>
+                       <xsd:enumeration value="CD-RW"/>
+                       <xsd:enumeration value="VIDEO-CD"/>
+                       <xsd:enumeration value="SACD"/>
+                       <xsd:enumeration value="MD-AUDIO"/>
+                       <xsd:enumeration value="MD-PICTURE"/>
+                       <xsd:enumeration value="DVD-ROM"/>
+                       <xsd:enumeration value="DVD-VIDEO"/>
+                       <xsd:enumeration value="DVD+R"/>
+                       <xsd:enumeration value="DVD-R"/>
+                       <xsd:enumeration value="DVD+RW"/>
+                       <xsd:enumeration value="DVD-RW"/>
+                       <xsd:enumeration value="DVD-RAM"/>
+                       <xsd:enumeration value="DVD-AUDIO"/>
+                       <xsd:enumeration value="DAT"/>
+                       <xsd:enumeration value="LD"/>
+                       <xsd:enumeration value="HDD"/>
+                       <xsd:enumeration value="MICRO-MV"/>
+                       <xsd:enumeration value="NETWORK"/>
+                       <xsd:enumeration value="NONE"/>
+                       <xsd:enumeration value="NOT_IMPLEMENTED"/>
+                       <xsd:enumeration value="SD"/>
+                       <xsd:enumeration value="PC-CARD"/>
+                       <xsd:enumeration value="MMC"/>
+                       <xsd:enumeration value="CF"/>
+                       <xsd:enumeration value="BD"/>
+                       <xsd:enumeration value="MS"/>
+                       <xsd:enumeration value="HD_DVD"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="storageMedium.values">
+               <xsd:union memberTypes="av:storageMedium.wc.values av:storageMedium.vx.values"/>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                   Program Related Types                   -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="SIprogramID.type">
+               <xsd:restriction base="av:csv.4.string.len.1_"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="SIseriesID.type">
+               <xsd:restriction base="av:csv.4.string.len.1_"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="programID_at_type.wc.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="SI_PROGRAMID"/>
+                       <xsd:enumeration value="SI_SERIESID"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="programID_at_type.values">
+               <xsd:union memberTypes="av:programID_at_type.wc.values av:programID_at_type.vx.values"/>
+       </xsd:simpleType>
+       <xsd:complexType name="programID.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attribute name="type" type="av:programID_at_type.values"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:simpleType name="channelID_at_type.wc.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="ANALOG"/>
+                       <xsd:enumeration value="DIGITAL"/>
+                       <xsd:enumeration value="FREQUENCY"/>
+                       <xsd:enumeration value="SI"/>
+                       <xsd:enumeration value="LINE"/>
+                       <xsd:enumeration value="NETWORK"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="channelID_at_type.values">
+               <xsd:union memberTypes="av:channelID_at_type.wc.values av:channelID_at_type.vx.values"/>
+       </xsd:simpleType>
+       <xsd:complexType name="channelID.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:token">
+                               <xsd:attribute name="type" type="av:channelID_at_type.values" use="required"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:simpleType name="csv.1_.allowedUse">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value="(PLAY|COPY|MOVE|UNKNOWN):(-1|[0-9]+)(,(PLAY|COPY|MOVE|UNKNOWN):(-1|[0-9]+))*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:complexType name="programCode.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:token">
+                               <xsd:attribute name="type" type="av:programCode_at_type.vd.values"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:simpleType name="rating_at_type.wc.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="MPAA.ORG"/>
+                       <xsd:enumeration value="RIAA.ORG"/>
+                       <xsd:enumeration value="ESRB.ORG"/>
+                       <xsd:enumeration value="TVGUIDELINES.ORG"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating_at_type.values">
+               <xsd:union memberTypes="av:rating_at_type.wc.values av:rating_at_type.vx.values"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating.MPAA.ORG.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="G"/>
+                       <xsd:enumeration value="PG"/>
+                       <xsd:enumeration value="R"/>
+                       <xsd:enumeration value="PG-13"/>
+                       <xsd:enumeration value="R"/>
+                       <xsd:enumeration value="NC-17"/>
+                       <xsd:enumeration value="NR"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating.RIIA.ORG.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value=""/>
+                       <xsd:enumeration value="PA-EC"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating.ESRB.ORG.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="EC"/>
+                       <xsd:enumeration value="E"/>
+                       <xsd:enumeration value="E10+"/>
+                       <xsd:enumeration value="T"/>
+                       <xsd:enumeration value="M"/>
+                       <xsd:enumeration value="AO"/>
+                       <xsd:enumeration value="RP"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating.TVGUIDELINES.ORG.values">
+               <xsd:restriction base="xsd:token">
+                       <xsd:enumeration value="TV-Y"/>
+                       <xsd:enumeration value="TV-Y7"/>
+                       <xsd:enumeration value="TV-Y7FV"/>
+                       <xsd:enumeration value="TV-G"/>
+                       <xsd:enumeration value="TV-PG"/>
+                       <xsd:enumeration value="TV-14"/>
+                       <xsd:enumeration value="TV-MA"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating.wc.values">
+               <xsd:union memberTypes="av:rating.MPAA.ORG.values av:rating.RIIA.ORG.values av:rating.ESRB.ORG.values av:rating.TVGUIDELINES.ORG.values"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating.values">
+               <xsd:union memberTypes="av:rating.wc.values av:rating.vx.values"/>
+       </xsd:simpleType>
+       <xsd:complexType name="rating.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="av:rating.values">
+                               <xsd:attribute name="type" type="av:rating_at_type.values"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:simpleType name="FIRST-RUN.or.REPEAT">
+               <xsd:union memberTypes="av:string.const.FIRST-RUN av:string.const.REPEAT"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="ALL.or.FIRST-RUN.or.REPEAT">
+               <xsd:union memberTypes="av:string.const.ALL av:string.const.FIRST-RUN av:string.const.REPEAT"/>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--          User Channel and EPG Related Properties          -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="channelGroupName.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attribute name="id" type="av:string.domainNamePrefixed"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:simpleType name="stationCallSign.type">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="signalStrength.wc.type">
+               <xsd:restriction base="xsd:int">
+                       <xsd:minInclusive value="-1"/>
+                       <xsd:maxInclusive value="100"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="signalStrength.type">
+               <xsd:union memberTypes="av:signalStrength.wc.type av:signalStrength.vx.type"/>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--                Bookmark Related Properties                -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="serviceType">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value="[^#:]{1,64}:[1-9][0-9]*"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="serviceId">
+               <xsd:restriction base="xsd:token">
+                       <xsd:pattern value="[^:]{1,64}"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:complexType name="deviceUDN.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="av:UDN">
+                               <xsd:attribute name="serviceType" type="av:serviceType" use="required"/>
+                               <xsd:attribute name="serviceId" type="av:serviceId" use="required"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <!--=================================-=================================-->
+       <!--                                                                   -->
+       <!--                    Extension Master Datatypes                     -->
+       <!--                                                                   -->
+       <!--=================================-=================================-->
+       <xsd:simpleType name="extensions.simpleType.none">
+               <xsd:annotation>
+                       <xsd:documentation xml:lang="en">
+                               Use this type wherever extensions to a simpleType are allowed by the specification,
+                               but they are disallowed for testing validation purposes.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:restriction base="xsd:NCName">
+                       <xsd:pattern value="[:]+"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:group name="extensions.elementType.none">
+               <xsd:annotation>
+                       <xsd:documentation xml:lang="en">
+                               Use this group wherever element extensions are allowed by the specification,
+                               but they are disallowed for testing validation purposes.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice>
+                       <xsd:any minOccurs="0" maxOccurs="0"/>
+               </xsd:choice>
+       </xsd:group>
+       <xsd:attributeGroup name="extensions.attributes.none">
+               <xsd:annotation>
+                       <xsd:documentation xml:lang="en">
+                               Use this group wherever attribute extensions are allowed by the specification,
+                               but they are disallowed for testing validation purposes.
+                       </xsd:documentation>
+               </xsd:annotation>
+       </xsd:attributeGroup>
+       <xsd:simpleType name="extensions.simpleType.any">
+               <xsd:annotation>
+                       <xsd:documentation xml:lang="en">
+                               Use this type wherever extensions to a simpleType are allowed by the specification,
+                               and no constraints are imposed for testing validation purposes.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:union memberTypes="xsd:duration xsd:date xsd:dateTime xsd:time xsd:gDay xsd:gMonth xsd:gMonthDay xsd:gYear xsd:gYearMonth xsd:boolean xsd:float xsd:decimal xsd:double xsd:anyURI xsd:QName xsd:string xsd:base64Binary xsd:hexBinary"/>
+       </xsd:simpleType>
+       <xsd:group name="extensions.elementType.any">
+               <xsd:annotation>
+                       <xsd:documentation xml:lang="en">
+                               Use this group wherever element extensions are allowed by the specification,
+                               and no constraints are imposed for testing validation purposes.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice>
+                       <xsd:any minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:choice>
+       </xsd:group>
+       <xsd:attributeGroup name="extensions.attributes.any">
+               <xsd:annotation>
+                       <xsd:documentation xml:lang="en">
+                               Use this group wherever attribute extensions are allowed by the specification,
+                               and no constraints are imposed for testing validation purposes.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:anyAttribute/>
+       </xsd:attributeGroup>
+       <!--===================================================================-->
+       <!--                                                                   -->
+       <!--                   Extension Component Datatypes                   -->
+       <!--                                                                   -->
+       <!--===================================================================-->
+       <xsd:simpleType name="storageMedium.vx.values">
+               <xsd:restriction base="av:extensions.simpleType.any"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="programID_at_type.vx.values">
+               <xsd:restriction base="av:domainName"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="channelID_at_type.vx.values">
+               <xsd:restriction base="xsd:token"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating_at_type.vx.values">
+               <xsd:restriction base="av:string.domainNamePrefixed"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="rating.vx.values">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="radioBand.vx.values">
+               <xsd:restriction base="xsd:token"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="signalStrength.vx.type">
+               <xsd:restriction base="xsd:int"/>
+       </xsd:simpleType>
+       <!--===================================================================-->
+       <!--                                                                   -->
+       <!--                Vendor-Defined Component Datatypes                 -->
+       <!--                                                                   -->
+       <!--===================================================================-->
+       <xsd:simpleType name="didl-lite_COLON_at_id.vd.type">
+               <xsd:restriction base="av:_id.type"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="srs_COLON_at_id.vd.type">
+               <xsd:restriction base="av:_id.type"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="programCode_at_type.vd.values">
+               <xsd:restriction base="av:string.domainNamePrefixed"/>
+       </xsd:simpleType>
+</xsd:schema>
diff --git a/data/didl-lite-v2.xsd b/data/didl-lite-v2.xsd
new file mode 100644 (file)
index 0000000..6b05b1f
--- /dev/null
@@ -0,0 +1,424 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema targetNamespace="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:av="urn:schemas-upnp-org:av:av" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:didl-lite="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2-20060531">
+
+       <xsd:annotation>
+               <xsd:documentation xml:lang="en">
+                       DIDL-Lite schema for UPnP A/V ContentDirectory services,
+                       version 2.0.
+               </xsd:documentation>
+       </xsd:annotation>
+
+       <xsd:import namespace="urn:schemas-upnp-org:metadata-1-0/upnp/" schemaLocation="http://www.upnp.org/schemas/av/upnp.xsd"/>
+       <xsd:import namespace="urn:schemas-upnp-org:av:av" schemaLocation="http://www.upnp.org/schemas/av/av.xsd"/>
+       <xsd:import namespace="http://purl.org/dc/elements/1.1/" schemaLocation="http://dublincore.org/schemas/xmls/simpledc20021212.xsd"/>
+       <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2005/08/xml.xsd"/>
+
+       <!--============================================================
+
+       This group defines the subset of Dublin Core elements that are
+       employed in DIDL-Lite.
+
+               Included            Excluded
+               ___________         ___________
+               title               subject
+               rights              type
+               description         format
+               date                identifier
+               language            source
+               creator             coverage
+               publisher
+               contributor
+               relation
+       ============================================================-->
+       <xsd:group name="DublinCoreUsedExcluding-title">
+               <xsd:choice>
+                       <xsd:element ref="dc:contributor"/>
+                       <xsd:element ref="dc:creator"/>
+<!-- XXX - JGR
+                        Would like to use an extension of the dc:date element rather than an extension its data type ("dc:elementType").
+                       As it is now, changes to the dc:date element are not propagated to the 'qualifedDate' data type.  Also, the
+                       namespace of the <date> element is no longer "dc" but rather "didl-lite" which is not exactly what we want.
+                       <dc:date didl-lite:daylightSaving="STANDARD">datevalue</dc:date>
+                       <xsd:element ref="dc:date"/>
+                       <xsd:element ref="didl-lite:qualifiedDCDate"/>
+                       <xsd:element name="dcDate" type="didl-lite:qualifiedDCDate"/>
+-->
+                       <xsd:element ref="dc:date"/>
+                       <xsd:element ref="dc:description"/>
+                       <xsd:element ref="dc:language"/>
+                       <xsd:element ref="dc:publisher"/>
+                       <xsd:element ref="dc:relation"/>
+                       <xsd:element ref="dc:rights"/>
+               </xsd:choice>
+       </xsd:group>
+
+<!-- XXX - JGR
+       <xsd:complexType name="qualifiedDCDate">
+               <xsd:complexContent>
+                       <xsd:element ref="dc:date">
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                       </xsd:element>
+               </xsd:complexContent>
+       </xsd:complexType>
+-->
+       <xsd:complexType name="qualifiedDCDate">
+               <xsd:simpleContent>
+                       <xsd:extension base="dc:elementType">
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+
+
+       <!--============================================================
+       'DIDL-Lite' is the root element of DIDL-Lite documents.
+
+       Attributes:
+               xml:lang: optional. The 'xml:lang' attribute may optionally be
+                       used to specify the language of text in the DIDL-Lite document.
+       ============================================================-->
+       <xsd:group name="allowed-under-DIDL-Lite">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               This group defines the elements allowed under the
+                               DIDL-Lite root
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice>
+                       <xsd:element name="item" type="didl-lite:item.type"/>
+                       <xsd:element name="container" type="didl-lite:container.type"/>
+                       <xsd:element name="desc" type="didl-lite:desc.type"/>
+               </xsd:choice>
+       </xsd:group>
+       <xsd:element name="DIDL-Lite" type="didl-lite:root.type"/>
+       <xsd:complexType name="root.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               DIDL-Lite is the root element
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:group ref="didl-lite:allowed-under-DIDL-Lite" maxOccurs="unbounded"/>
+               <xsd:attribute ref="xml:lang"/>
+       </xsd:complexType>
+
+
+       <!--============================================================
+               Parts shared by 'container' and 'item' objects.
+               ============================================================-->
+
+       <xsd:attributeGroup name="commonAttrs-item-container.group">
+               <xsd:attribute name="id" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="parentID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="restricted" type="xsd:boolean" use="required"/>
+               <xsd:attribute name="neverPlayable" type="xsd:boolean"/>
+       </xsd:attributeGroup>
+
+       <!--============================================================
+               A 'container' element may contain any number of
+               1. Dublin Core,
+               2. upnp,
+               3. res,
+               4. ref,
+               5. item,
+               6. container, and
+               7. desc elements.
+
+               In all cases, the first element in container child element sequence
+               is required to be "dc:title".
+               The 'upnp:class' must also appear under container.
+               Each container is required to specify a value for the 'id' and
+               'parentID' attributes.
+               Each container is also required to specify a value for the
+               'restricted' attribute (true, false, 1, 0).
+               When restricted="true", the ability to change or delete the
+               Container is restricted.
+               Other optional container elements are:
+
+               'parentID', 'childCount', and 'searchable'.
+               Other optional attributes are 'childCount' and 'searchable'.
+
+               id:                     type: string    use: required
+               parentID:       type: string    use: required
+               restricted:     type: string    use: required
+               searchable:     type: string    use: optional
+               childCount:     type: string    use: optional
+
+               The equivalent MPEG21 DIDL element is 'CONTAINER'
+               ============================================================-->
+       <xsd:group name="allowed-under-container">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               This group defines the elements allowed under the
+                               'container' element
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice>
+                       <xsd:group ref="upnp:upnpForContainer"/>
+                       <xsd:group ref="didl-lite:DublinCoreUsedExcluding-title"/>
+                       <xsd:element name="desc" type="didl-lite:desc.type"/>
+                       <xsd:element name="item" type="didl-lite:item.type"/>
+                       <xsd:element name="container" type="didl-lite:container.type"/>
+                       <xsd:element name="res" type="didl-lite:res.type"/>
+               </xsd:choice>
+       </xsd:group>
+
+       <xsd:complexType name="container.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               'container' element may contain any number of
+                               1. Dublin Core,
+                               2. upnp,
+                               3. res,
+                               4. ref,
+                               5 item,
+                               6. container and
+                               7. desc elements.
+                               In all cases, the first element in each container child
+                               element sequence is required to be "dc:title".
+                               A 'upnp:class' element must also appear under container.
+                               container is required to specify a value for the 'id' and
+                               'parentID' attributes.
+                               container is also required to specify a value for the
+                               'restricted' attribute (true, false, 1, 0).
+                               When restricted="true", the ability to change or delete the
+                               container is restricted.
+                               Optional container element attributes are 'childCount', and
+                               'searchable'.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:sequence>
+                       <xsd:element ref="dc:title"/>
+                       <xsd:group ref="didl-lite:allowed-under-container" minOccurs="0" maxOccurs="unbounded"/>
+                       <xsd:group ref="upnp:class.group"/>
+                       <xsd:group ref="didl-lite:allowed-under-container" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+               <xsd:attributeGroup ref="didl-lite:commonAttrs-item-container.group"/>
+               <xsd:attribute name="searchable" type="xsd:boolean"/>
+               <xsd:attribute name="childCount" type="xsd:unsignedInt"/>
+       </xsd:complexType>
+<!--============================================================
+       An 'item' element contains any number of
+       1. Dublin Core,
+       2. upnp,
+       3. res, and
+       4. desc elements.
+
+       In all cases, the first element in each item child element
+       sequence is required to be "dc:title".
+       The 'upnp:class' element must also appear under item.
+       Each item is additionally required to specify a value for the 'id'
+       attribute. If the item is actually a reference to another item, a
+       value for 'refID' is specified.
+       Each item is also required to specify a value for the 'parentID'
+       Attribute and the 'restricted' attribute (true, false, 1, 0).
+       When restricted="true", the ability to change or delete the item is
+       restricted.
+
+       Attributes:
+       Id:                     type: string    use: required
+       parentID:       type: string    use: required
+       refID:          type: string    use: optional
+       restricted:     type: boolean   use: required
+
+       The equivalent MPEG21 DIDL element is 'ITEM'.
+       ============================================================-->
+       <xsd:group name="allowed-under-item">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               This group defines the elements allowed under the 'item'
+                               Element
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice>
+                       <xsd:group ref="upnp:upnpForItem"/>
+                       <xsd:group ref="didl-lite:DublinCoreUsedExcluding-title"/>
+                       <xsd:element name="desc" type="didl-lite:desc.type"/>
+                       <xsd:element name="res" type="didl-lite:res.type"/>
+               </xsd:choice>
+       </xsd:group>
+
+       <xsd:complexType name="item.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               'item' element contains any number of
+                               1. Dublin Core,
+                               2. upnp,
+                               3. res, and
+                               4. desc elements.
+                               In all cases, the first element in each item child element
+                               sequence is required to be "dc:title".
+                               A 'upnp:class' element must also appear under item.
+                               Item is additionally required to specify a value for the
+                               'id' attribute.
+                               If the item is actually a reference to another item,
+                               a value for 'refID' must be specified.
+                               Item is also required to specify a value for the 'parentID'
+                               attribute, and the 'restricted' attribute
+                               (true, false, 1, 0).
+                               When restricted="true", the ability to change or delete the
+                               item is restricted.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:sequence>
+                       <xsd:element ref="dc:title"/>
+                       <xsd:group ref="didl-lite:allowed-under-item" minOccurs="0" maxOccurs="unbounded"/>
+                       <xsd:group ref="upnp:class.group"/>
+                       <xsd:group ref="didl-lite:allowed-under-item" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+               <xsd:attributeGroup ref="didl-lite:commonAttrs-item-container.group"/>
+               <xsd:attribute name="refID" type="av:didl-lite_COLON_at_id.vd.type"/>
+       </xsd:complexType>
+<!--============================================================
+       A 'res' element indentifies a resource. A resource is typically
+       some type of asset, such as a photo, song, video, etc.
+       A 'res' element contains a URI that identifies the resource.
+
+       Attributes:
+
+       'importUri'                     type: anyURI                    use: optional
+       The 'importUri' attribute is the optional uri locator for
+       resource updates.
+
+       'protocolInfo'          type: string                    use: required
+       The 'protocolInfo' attribute is a string that identifies the
+       streaming or transport protocol for transmitting the resource.
+       If not present then the content has not yet been fully imported by
+       the ContentDirectory service and is not yet accessible for playback.
+
+       'size'                          type: unsignedLong      use: optional
+       size, in bytes, of the resource.
+
+       'duration'                      type: string                    use: optional
+       The 'duration' attribute identifies the duration of the playback of
+       the resource, at normal speed.
+
+       The format of the duration string is:
+       H+:MM:SS[.F+], or H+:MM:SS[.F0/F1]
+       Where:
+       +H              one or more digits to indicate elapsed hours,
+       MM              exactly 2 digits to indicate minutes (00 to 59),
+       SS              exactly 2 digits to indicate seconds (00 to 59),
+       F+              any number of digits (including no digits) to indicate fractions of seconds,
+       F0/F1   a fraction, with F0 and F1 at least one digit long,
+                       and F0 < F1.
+       The string may be preceded by an optional + or - sign, and the
+       decimal point itself may be omitted if there are no fractional  seconds digits.
+
+       'bitrate'                       type: unsignedInt               use: optional
+       The bitrate in bytes/second of the resource.
+
+       'sampleFrequency'       type: unsignedInt               use: optional
+       The sample frequency of the resource in Hz
+
+       'bitsPerSample' type: unsignedInt               use: optional
+       The bits per sample of the resource.
+
+       'nrAudioChannels'       type: unsignedInt               use: optional
+       Number of audio channels of the resource, e.g. 1 for mono,
+       2 for stereo, 6 for Dolby surround, etc.
+
+       'resolution'            type: string                    use: optional
+       X*Y resolution of the resource (image or video).
+       The string pattern is restricted to strings of the form:
+       [0-9]+x[0-9]+
+       (one or more digits,'x', followed by one or more digits).
+
+       'colorDepth'            type: unsignedInt               use: optional
+       The color depth in bits of the resource (image or video).
+
+       'protection'            type: string                    use: optional
+       Some statement of the protection type of the resource
+       (not standardized).
+
+       The equivalent MPEG21 DIDL element is 'RESOURCE'.
+       ============================================================-->
+
+       <!--=============================-=============================-->
+       <!--       Resource Encoding Characteristics Properties        -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="res.type" mixed="true">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               A 'res' element indentifies a resource.
+                               A resource is typically some type of binary asset,
+                               such as a photo, song, video, etc.
+                               A 'res' element contains a URI that identifies the resource
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:anyURI">
+                               <xsd:attribute name="importUri" type="xsd:anyURI"/>
+                               <xsd:attribute name="protocolInfo" type="xsd:string" use="required"/>
+                               <xsd:attribute name="size" type="xsd:unsignedLong"/>
+                               <xsd:attribute name="duration" type="av:duration.cds1"/>
+                               <xsd:attribute name="bitrate" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="sampleFrequency" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="bitsPerSample" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="nrAudioChannels" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="resolution">
+                                       <xsd:simpleType>
+                                               <xsd:restriction base="xsd:string">
+                                                       <xsd:pattern value="[0-9]+x[0-9]+"/>
+                                               </xsd:restriction>
+                                       </xsd:simpleType>
+                               </xsd:attribute>
+                               <xsd:attribute name="colorDepth" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="tspec" type="av:string.len.0_256"/>
+                               <xsd:attribute name="allowedUse" type="av:csv.1_.allowedUse"/>
+                               <xsd:attribute name="validityStart" type="av:dateTime"/>
+                               <xsd:attribute name="validityEnd" type="av:dateTime"/>
+                               <xsd:attribute name="remainingTime" type="av:unsignedDuration"/>
+                               <xsd:attribute name="updateCount" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="usageInfo" type="xsd:string"/>
+                               <xsd:attribute name="rightsInfoURI" type="xsd:anyURI"/>
+                               <xsd:attribute name="contentInfoURI" type="xsd:anyURI"/>
+                               <xsd:attribute name="recordQuality" type="av:csv.1_.colonDelimPairs"/>
+                               <xsd:attribute name="protection" type="xsd:string"/>
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+<!--============================================================
+       A 'desc' element identifies a descriptor.
+       A descriptor is intended to contain a block of metadata.
+       The bio of a music artist is an example use of a 'desc' element.
+       A 'desc' element may possess child elements from any namespace
+       except the DIDL-Lite namespace.
+       Values for 'id' and 'nameSpace' are required.
+       An optional 'type' attribute allows designation of the metadata
+       type, e.g. 'ratings', 'rights', etc.
+
+       Attributes:
+
+       'id'            type: string    use: required
+       'type'          type: string    use: optional
+       'nameSpace'     type: uri       use: required
+
+       The equivalent MPEG21 DIDL element is 'DESCRIPTOR'.
+       ============================================================-->
+       <xsd:complexType name="desc.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               A'desc' element identifies a descriptor.
+                               A descriptor is intended to contain a block of metadata.
+                               The bio of a music artist is an example use of 'desc'.
+                               A 'desc' element may possess child elements from any
+                               namespace except the DIDL-Lite namespace.
+                               A value for 'id' is required.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:sequence>
+                       <xsd:any namespace="##other"/>
+               </xsd:sequence>
+               <xsd:attribute name="id" type="xsd:string" use="required"/>
+               <xsd:attribute name="type" type="xsd:string"/>
+               <xsd:attribute name="nameSpace" type="xsd:anyURI" use="required"/>
+       </xsd:complexType>
+
+       <!--===================================================================-->
+       <!--                                                                   -->
+       <!--                Vendor-Defined Component Datatypes                 -->
+       <!--                                                                   -->
+       <!--===================================================================-->
+
+</xsd:schema>
diff --git a/data/simpledc20021212.xsd b/data/simpledc20021212.xsd
new file mode 100644 (file)
index 0000000..36f9057
--- /dev/null
@@ -0,0 +1,71 @@
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://purl.org/dc/elements/1.1/" targetNamespace="http://purl.org/dc/elements/1.1/" elementFormDefault="qualified" attributeFormDefault="unqualified">
+
+  <xs:annotation>
+    <xs:documentation xml:lang="en">
+      Simple DC XML Schema, 2002-10-09
+      by Pete Johnston (p.johnston@ukoln.ac.uk),
+      Carl Lagoze (lagoze@cs.cornell.edu), Andy Powell (a.powell@ukoln.ac.uk),
+      Herbert Van de Sompel (hvdsomp@yahoo.com).
+      This schema defines terms for Simple Dublin Core, i.e. the 15
+      elements from the http://purl.org/dc/elements/1.1/ namespace, with
+      no use of encoding schemes or element refinements.
+      Default content type for all elements is xs:string with xml:lang
+      attribute available.
+
+      Supercedes version of 2002-03-12.
+      Amended to remove namespace declaration for http://www.w3.org/XML/1998/namespace namespace,
+      and to reference lang attribute via built-in xml: namespace prefix.
+      xs:appinfo also removed.
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/03/xml.xsd">
+  </xs:import>
+
+  <xs:element name="title" type="elementType"/>
+  <xs:element name="creator" type="elementType"/>
+  <xs:element name="subject" type="elementType"/>
+  <xs:element name="description" type="elementType"/>
+  <xs:element name="publisher" type="elementType"/>
+  <xs:element name="contributor" type="elementType"/>
+  <xs:element name="date" type="elementType"/>
+  <xs:element name="type" type="elementType"/>
+  <xs:element name="format" type="elementType"/>
+  <xs:element name="identifier" type="elementType"/>
+  <xs:element name="source" type="elementType"/>
+  <xs:element name="language" type="elementType"/>
+  <xs:element name="relation" type="elementType"/>
+  <xs:element name="coverage" type="elementType"/>
+  <xs:element name="rights" type="elementType"/>
+
+  <xs:group name="elementsGroup">
+  <xs:sequence>
+    <xs:choice minOccurs="0" maxOccurs="unbounded">
+      <xs:element ref="title"/>
+      <xs:element ref="creator"/>
+      <xs:element ref="subject"/>
+      <xs:element ref="description"/>
+      <xs:element ref="publisher"/>
+      <xs:element ref="contributor"/>
+      <xs:element ref="date"/>
+      <xs:element ref="type"/>
+      <xs:element ref="format"/>
+      <xs:element ref="identifier"/>
+      <xs:element ref="source"/>
+      <xs:element ref="language"/>
+      <xs:element ref="relation"/>
+      <xs:element ref="coverage"/>
+      <xs:element ref="rights"/>
+    </xs:choice>
+    </xs:sequence>
+  </xs:group>
+
+  <xs:complexType name="elementType">
+    <xs:simpleContent>
+      <xs:extension base="xs:string">
+        <xs:attribute ref="xml:lang" use="optional"/>
+      </xs:extension>
+    </xs:simpleContent>
+  </xs:complexType>
+
+</xs:schema>
\ No newline at end of file
diff --git a/data/upnp.xsd b/data/upnp.xsd
new file mode 100644 (file)
index 0000000..0d8045b
--- /dev/null
@@ -0,0 +1,841 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:av="urn:schemas-upnp-org:av:av" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:schemas-upnp-org:metadata-1-0/upnp/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="4-20101231">
+       <xsd:annotation>
+               <xsd:documentation xml:lang="en">
+               Note that all schema supplied by the UPnP Forum AV WC committee are for informational use only and that the
+               standardized DCPs describe the normative requirements for these schema. Some schema provided do not necessarily
+               embody requirements regarding number of element occurrances allowed or their ordering.
+
+               </xsd:documentation>
+       </xsd:annotation>
+
+       <!-- This schema defines the upnp namespace tags that are employed
+               as descriptors by the DIDL-Lite schema -->
+       <xsd:import namespace="urn:schemas-upnp-org:av:av" schemaLocation="http://www.upnp.org/schemas/av/av.xsd"/>
+       <xsd:group name="class.group">
+               <xsd:sequence>
+                       <xsd:element name="class" type="upnp:class.type"/>
+               </xsd:sequence>
+       </xsd:group>
+       <xsd:group name="upnpForContainer">
+               <xsd:choice>
+                       <!--=============================-=============================-->
+                       <!--                      Base Properties                      -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="searchClass" type="upnp:searchClass.type"/>
+                       <xsd:element name="createClass" type="upnp:searchClass.type"/>
+                       <xsd:element name="writeStatus" type="upnp:status.type"/>
+                       <!--=============================-=============================-->
+                       <!--                 objectLink Properties                  -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="objectLink" type="upnp:objectLink.type"/>
+                       <xsd:element name="objectLinkRef" type="upnp:objectLinkRef.type"/>
+                       <!--=============================-=============================-->
+                       <!--                 resExt Properties                   -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="resExt" type="upnp:resExt.type"/>
+                       <!--=============================-=============================-->
+                       <!--               Contributor Related Properties              -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="artist" type="upnp:personWithRole.type"/>
+                       <xsd:element name="actor" type="upnp:personWithRole.type"/>
+                       <xsd:element name="author" type="upnp:personWithRole.type"/>
+                       <xsd:element name="producer" type="upnp:person.type"/>
+                       <xsd:element name="director" type="upnp:person.type"/>
+                       <!--=============================-=============================-->
+                       <!--               Affiliation Related Properties              -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="genre" type="upnp:genre.type"/>
+                       <xsd:element name="album" type="av:_title.type"/>
+                       <xsd:element name="playlist" type="av:_title.type"/>
+                       <!--=============================-=============================-->
+                       <!--              Associated Resources Properties              -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="albumArtURI" type="xsd:anyURI"/>
+                       <xsd:element name="artistDiscographyURI" type="xsd:anyURI"/>
+                       <xsd:element name="lyricsURI" type="xsd:anyURI"/>
+                       <!-- Should have something restricting dc:relation to a URI. -->
+                       <!--=============================-=============================-->
+                       <!--                 Storage Related Properties                -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="storageTotal" type="av:long.-1_"/>
+                       <xsd:element name="storageUsed" type="av:long.-1_"/>
+                       <xsd:element name="storageFree" type="av:long.-1_"/>
+                       <xsd:element name="storageMaxPartition" type="av:long.-1_"/>
+                       <xsd:element name="storageMedium" type="av:storageMedium.values"/>
+                       <!--=============================-=============================-->
+                       <!--               General Description Properties              -->
+                       <!--                   (mainly for UI purposes)                -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="longDescription" type="xsd:string"/>
+                       <xsd:element name="icon" type="xsd:anyURI"/>
+                       <xsd:element name="region" type="xsd:string"/>
+                       <xsd:element name="rights" type="xsd:string"/>
+                       <xsd:element name="playbackCount" type="av:int.-1_"/>
+                       <xsd:element name="lastPlaybackTime" type="upnp:qualifiedDateTime"/>
+                       <xsd:element name="lastPlaybackPosition" type="av:unsignedDuration"/>
+                       <xsd:element name="recordedStartDateTime" type="upnp:qualifiedDateTime"/>
+                       <xsd:element name="recordedDuration" type="av:unsignedDuration"/>
+                       <xsd:element name="recordedDayOfWeek" type="av:dayOfWeek.en.len.3"/>
+                       <xsd:element name="srsRecordSchedule" type="av:srs_COLON_at_id.vd.type"/>
+                       <xsd:element name="srsRecordTaskID" type="av:srs_COLON_at_id.vd.type"/>
+                       <xsd:element name="recordable" type="xsd:boolean"/>
+                       <!--=============================-=============================-->
+                       <!--            Recorded Object Related Properties             -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="programTitle" type="xsd:string"/>
+                       <xsd:element name="seriesTitle" type="xsd:string"/>
+                       <xsd:element name="programID" type="av:programID.type"/>
+                       <xsd:element name="seriesID" type="av:programID.type"/>
+                       <xsd:element name="channelID" type="av:channelID.type"/>
+                       <xsd:element name="episodeCount" type="xsd:unsignedInt"/>
+                       <xsd:element name="episodeNumber" type="xsd:unsignedInt"/>
+                       <xsd:element name="programCode" type="av:programCode.type"/>
+                       <xsd:element name="rating" type="av:rating.type"/>
+                       <xsd:element name="episodeType" type="av:FIRST-RUN.or.REPEAT"/>
+                       <xsd:element name="programPreserved" type="upnp:programPreserved.Type"/>
+                       <xsd:element name="preservedTimeRange" type="upnp:preservedTimeRange.Type"/>
+                       <xsd:element name="programList" type="upnp:programList.Type"/>
+                       <!--=============================-=============================-->
+                       <!--          User Channel and EPG Related Properties          -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="channelGroupName" type="av:channelGroupName.type"/>
+                       <xsd:element name="callSign" type="av:stationCallSign.type"/>
+                       <xsd:element name="networkAffiliation" type="xsd:string"/>
+                       <xsd:element name="serviceProvider" type="xsd:string"/>
+                       <xsd:element name="price" type="upnp:price.type"/>
+                       <xsd:element name="payPerView" type="xsd:boolean"/>
+                       <xsd:element name="epgProviderName" type="xsd:string"/>
+                       <xsd:element name="dateTimeRange" type="upnp:qualifiedDateTime-range"/>
+                       <!--=============================-=============================-->
+                       <!--                 Radio Broadcast Properties                -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="radioCallSign" type="av:stationCallSign.type"/>
+                       <xsd:element name="radioStationID" type="xsd:string"/>
+                       <xsd:element name="radioBand" type="av:radioBand.type"/>
+                       <!--=============================-=============================-->
+                       <!--                 Video Broadcast Properties                -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="channelNr" type="xsd:int"/>
+                       <xsd:element name="channelName" type="xsd:string"/>
+                       <xsd:element name="scheduledStartTime" type="upnp:qualifiedDateTime.ISO8601"/>
+                       <xsd:element name="scheduledEndTime" type="upnp:qualifiedDateTime.ISO8601"/>
+                       <xsd:element name="scheduledDuration" type="av:unsignedDuration"/>
+                       <!--=============================-=============================-->
+                       <!--          Physical Tuner Status-related Properties         -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="signalStrength" type="av:signalStrength.type"/>
+                       <xsd:element name="signalLocked" type="xsd:boolean"/>
+                       <xsd:element name="tuned" type="xsd:boolean"/>
+                       <!--=============================-=============================-->
+                       <!--                Bookmark Related Properties                -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="bookmarkID" type="av:didl-lite_COLON_at_id.vd.type"/>
+                       <xsd:element name="bookmarkedObjectID" type="av:didl-lite_COLON_at_id.vd.type"/>
+                       <xsd:element name="deviceUDN" type="av:deviceUDN.type"/>
+                       <xsd:element name="stateVariableCollection" type="upnp:stateVariableCollection.type"/>
+                       <!--=============================-=============================-->
+                       <!--            Foreign Metadata Related Properties            -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="foreignMetadata" type="upnp:foreignMetadata.type"/>
+                       <!--=============================-=============================-->
+                       <!--                 Miscellaneous Properties                  -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="DVDRegionCode" type="xsd:int"/>
+                       <xsd:element name="originalTrackNumber" type="xsd:int"/>
+                       <xsd:element name="toc" type="xsd:string"/>
+                       <xsd:element name="userAnnotation" type="xsd:string"/>
+                       <!--=============================-=============================-->
+                       <!--                 Object Tracking Properties                -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="containerUpdateID" type="xsd:unsignedInt"/>
+                       <xsd:element name="objectUpdateID" type="xsd:unsignedInt"/>
+                       <xsd:element name="totalDeletedChildCount" type="xsd:unsignedInt"/>
+                       <xsd:element name="segmentID" type="av:didl-lite_COLON_at_id.vd.type"/>
+                       <!--=============================-=============================-->
+                       <!--                 Content Protection Properties                -->
+                       <!--=============================-=============================-->
+                       <xsd:element name="objectOwner" type="upnp:owner.Type"/>
+                       <xsd:element name="inclusionControl" type="upnp:inclusion.Type"/>
+               </xsd:choice>
+       </xsd:group>
+       <xsd:group name="upnpForItem">
+               <xsd:choice>
+                       <xsd:group ref="upnp:upnpForContainer"/>
+               </xsd:choice>
+       </xsd:group>
+       <!--=============================-=============================-->
+       <!--                      Base Properties                      -->
+       <!--=============================-=============================-->
+       <xsd:simpleType name="className.base.type">
+               <xsd:restriction base="xsd:NCName">
+                       <xsd:minLength value="11"/>
+                       <xsd:pattern value="object\.(item|container)(\.[\i-[:]][\c-[\.:]]*)*">
+                               <xsd:annotation>
+                                       <xsd:documentation>
+                                               This pattern exactly matches the definition for class name syntax
+                                               given in CDS:2 Section C.1.1.
+                                       </xsd:documentation>
+                               </xsd:annotation>
+                       </xsd:pattern>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="className.wc.type">
+               <xsd:restriction base="xsd:NCName">
+                       <xsd:enumeration value="object.item"/>
+                       <xsd:enumeration value="object.item.imageItem"/>
+                       <xsd:enumeration value="object.item.imageItem.photo"/>
+                       <xsd:enumeration value="object.item.audioItem"/>
+                       <xsd:enumeration value="object.item.audioItem.musicTrack"/>
+                       <xsd:enumeration value="object.item.audioItem.audioBroadcast"/>
+                       <xsd:enumeration value="object.item.audioItem.audioBook"/>
+                       <xsd:enumeration value="object.item.videoItem"/>
+                       <xsd:enumeration value="object.item.videoItem.movie"/>
+                       <xsd:enumeration value="object.item.videoItem.videoBroadcast"/>
+                       <xsd:enumeration value="object.item.videoItem.musicVideoClip"/>
+                       <xsd:enumeration value="object.item.playlistItem"/>
+                       <xsd:enumeration value="object.item.textItem"/>
+                       <xsd:enumeration value="object.item.bookmarkItem"/>
+                       <xsd:enumeration value="object.item.epgItem"/>
+                       <xsd:enumeration value="object.item.epgItem.audioProgram"/>
+                       <xsd:enumeration value="object.item.epgItem.videoProgram"/>
+                       <xsd:enumeration value="object.container.person"/>
+                       <xsd:enumeration value="object.container.person.musicArtist"/>
+                       <xsd:enumeration value="object.container.playlistContainer"/>
+                       <xsd:enumeration value="object.container.album"/>
+                       <xsd:enumeration value="object.container.album.musicAlbum"/>
+                       <xsd:enumeration value="object.container.album.photoAlbum"/>
+                       <xsd:enumeration value="object.container.genre"/>
+                       <xsd:enumeration value="object.container.genre.musicGenre"/>
+                       <xsd:enumeration value="object.container.genre.movieGenre"/>
+                       <xsd:enumeration value="object.container.channelGroup"/>
+                       <xsd:enumeration value="object.container.channelGroup.audioChannelGroup"/>
+                       <xsd:enumeration value="object.container.channelGroup.videoChannelGroup"/>
+                       <xsd:enumeration value="object.container.epgContainer"/>
+                       <xsd:enumeration value="object.container.storageSystem"/>
+                       <xsd:enumeration value="object.container.storageVolume"/>
+                       <xsd:enumeration value="object.container.storageFolder"/>
+                       <xsd:enumeration value="object.container.bookmarkFolder"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:simpleType name="_className.type">
+               <xsd:union memberTypes="upnp:className.wc.type upnp:className.vx.type"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="className.type">
+               <xsd:restriction base="upnp:_className.type">
+                       <!-- xxx - JGR
+                       <xsd:pattern value="object\.(item|container)(\.[\i-[:]][\c-[\.:]]*)*"/>
+
+                       Somehow including this pattern restriction rejects the <searchClass> element
+                       but not the <class> element from the following snipet taken from the
+                       ForeignMetadata Example #2.  Even when the values are identical, the
+                       <class> element validates and the <searchClass> element fails.
+
+                       <upnp:class>object.container.storageFolder</upnp:class>
+                       <upnp:searchClass includeDerived="false">
+                               object.container.album.musicAlbum
+                       </upnp:searchClass>
+
+               This inconsistent behavior needs to be investigated.
+-->
+               </xsd:restriction>
+       </xsd:simpleType>
+       <xsd:complexType name="class.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="upnp:className.type">
+                               <xsd:attribute name="name" type="xsd:string"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:complexType name="searchClass.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="upnp:class.type">
+                               <xsd:attribute name="includeDerived" type="xsd:boolean" use="required"/>
+                       </xsd:extension>
+                       <!-- XXX - JGR: Should className.type be used rather than class.type> </-->
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:complexType name="qualifiedDateTime">
+               <xsd:simpleContent>
+                       <xsd:extension base="av:dateTime">
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:complexType name="qualifiedDateTime-range">
+               <xsd:simpleContent>
+                       <xsd:extension base="av:dateTime-range">
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:attributeGroup name="dateTime.attr.group">
+               <xsd:attribute name="daylightSaving" type="av:daylightSaving.type" use="optional"/>
+       </xsd:attributeGroup>
+       <xsd:simpleType name="status.type">
+               <xsd:restriction base="xsd:string">
+                       <xsd:enumeration value="WRITABLE"/>
+                       <xsd:enumeration value="PROTECTED"/>
+                       <xsd:enumeration value="NOT_WRITABLE"/>
+                       <xsd:enumeration value="UNKNOWN"/>
+                       <xsd:enumeration value="MIXED"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--               Contributor Related Properties              -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="personWithRole.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="upnp:person.type">
+                               <xsd:attribute name="role" type="xsd:string"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:simpleType name="person.type">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--               Affiliation Related Properties              -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="genre.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="av:_title.type">
+                               <xsd:attribute name="id" type="av:string.domainNamePrefixed"/>
+                               <xsd:attribute name="extended" type="av:csv.1_.string.len.1_"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--              Associated Resources Properties              -->
+       <!--=============================-=============================-->
+       <!--           This section intentionally left blank           -->
+       <!--=============================-=============================-->
+       <!--                 Storage Related Properties                -->
+       <!--=============================-=============================-->
+       <!--           This section intentionally left blank           -->
+       <!--=============================-=============================-->
+       <!--               General Description Properties              -->
+       <!--                   (mainly for UI purposes)                -->
+       <!--=============================-=============================-->
+       <!--           This section intentionally left blank           -->
+       <!--=============================-=============================-->
+       <!--            Recorded Object Related Properties             -->
+       <!--=============================-=============================-->
+       <!--           This section intentionally left blank           -->
+       <!--=============================-=============================-->
+       <!--          User Channel and EPG Related Properties          -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="price.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:float">
+                               <xsd:attribute name="currency" type="xsd:string" use="required"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--                 Radio Broadcast Properties                -->
+       <!--=============================-=============================-->
+       <!--=============================-=============================-->
+       <!--                 Video Broadcast Properties                -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="qualifiedDateTime.ISO8601">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:complexType name="qualifiedDateTime.ISO8601andUsage">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                               <xsd:attribute name="usage" type="av:startTimeUsage"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--          Physical Tuner Status-related Properties         -->
+       <!--=============================-=============================-->
+       <!--=============================-=============================-->
+       <!--                Bookmark Related Properties                -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="stateVariableCollection.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attributeGroup ref="upnp:serviceAttrGrp"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:attributeGroup name="serviceAttrGrp">
+               <xsd:attribute name="serviceName" use="required">
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:enumeration value="AVTransport"/>
+                                       <xsd:enumeration value="RenderingControl"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:attribute>
+               <xsd:attribute name="rcsInstanceType">
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:enumeration value="pre-mix"/>
+                                       <xsd:enumeration value="post-mix"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:attribute>
+       </xsd:attributeGroup>
+       <xsd:complexType name="stateVariable.type">
+               <xsd:attribute name="variableName" type="xsd:string" use="required"/>
+               <xsd:attribute name="channel" type="xsd:string" use="optional"/>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            Foreign Metadata Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="foreignMetadata.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               WC-defined structure for the Foreign Metadata property.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:sequence>
+                       <xsd:group ref="upnp:fm.elements.group"/>
+               </xsd:sequence>
+               <xsd:attributeGroup ref="upnp:fm.attributes.group"/>
+       </xsd:complexType>
+       <xsd:attributeGroup name="fm.attributes.group">
+               <xsd:attribute name="type" use="required">
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:pattern value="[a-zA-Z0-9_.]+"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:attribute>
+               <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+       </xsd:attributeGroup>
+       <xsd:group name="fm.elements.group">
+               <xsd:sequence>
+                       <xsd:group ref="upnp:fm.elements.wc.group" minOccurs="0" maxOccurs="unbounded"/>
+                       <xsd:group ref="upnp:fm.elements.vx.group" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+       </xsd:group>
+       <xsd:group name="fm.elements.vx.group">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               Allow the Foreign Metadata tag to also hold vendor-defined elements.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:sequence>
+                       <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+       </xsd:group>
+       <xsd:group name="fm.elements.wc.group">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               Foreign Metadata sub-elements defined by the WC.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice>
+                       <xsd:element name="fmId" type="xsd:string"/>
+                       <xsd:element name="fmClass" type="xsd:string"/>
+                       <xsd:element name="fmProvider" type="xsd:string"/>
+                       <xsd:element name="fmBody" type="upnp:fm.elements.body.type"/>
+               </xsd:choice>
+       </xsd:group>
+       <xsd:complexType name="fm.elements.body.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               Contains the actual foreign metadata.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice>
+                       <xsd:element name="fmEmbeddedXML" type="upnp:fm.elements.body.embeddedXML.type"/>
+                       <xsd:element name="fmEmbeddedString" type="upnp:fm.elements.body.embeddedString.type"/>
+                       <xsd:element name="fmURI" type="upnp:fm.elements.body.uri.type"/>
+               </xsd:choice>
+               <xsd:attributeGroup ref="upnp:fm.attrs.bodyAttr.group"/>
+               <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+       </xsd:complexType>
+       <xsd:attributeGroup name="fm.attrs.bodyAttr.group">
+               <xsd:attribute name="xmlFlag" type="xsd:boolean" use="required"/>
+               <xsd:attribute name="mimeType">
+                       <xsd:simpleType>
+                               <xsd:restriction base="xsd:string">
+                                       <xsd:pattern value="[a-zA-Z0-9_./]+"/>
+                               </xsd:restriction>
+                       </xsd:simpleType>
+               </xsd:attribute>
+       </xsd:attributeGroup>
+       <xsd:complexType name="fm.elements.body.embeddedXML.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               Tags allowed inside a Foreign Metadata Body URI element.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                       <xsd:any namespace="##other" processContents="lax"/>
+               </xsd:choice>
+       </xsd:complexType>
+       <xsd:complexType name="fm.elements.body.embeddedString.type">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               Tags allowed inside a Foreign Metadata Body URI element.
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+                       </xsd:extension>
+                       <!-- Placeholder for future WC attributes. -->
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:complexType name="fm.elements.body.uri.type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:anyURI">
+                               <xsd:attributeGroup ref="upnp:fm.extensions.attributes.any"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <xsd:attributeGroup name="fm.extensions.attributes.any">
+               <xsd:attributeGroup ref="av:extensions.attributes.any"/>
+       </xsd:attributeGroup>
+       <!--===================================================================-->
+       <!--                                                                   -->
+       <!--                   Extension Component Datatypes                   -->
+       <!--                                                                   -->
+       <!--===================================================================-->
+       <xsd:simpleType name="className.vx.type">
+               <xsd:restriction base="upnp:className.base.type"/>
+       </xsd:simpleType>
+       <xsd:simpleType name="foreignMetadata.element.vx.type">
+               <xsd:restriction base="xsd:string"/>
+       </xsd:simpleType>
+       <!--=============================-=============================-->
+       <!--            ObjectLink Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="objectLink.type">
+               <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                       <xsd:element name="title" type="xsd:string" maxOccurs="1"/>
+                       <xsd:element name="startObject" type="xsd:boolean" minOccurs="0"/>
+                       <xsd:element name="mode" maxOccurs="1">
+                               <xsd:simpleType>
+                                       <xsd:restriction base="xsd:string">
+                                               <xsd:enumeration value="Playback"/>
+                                               <xsd:enumeration value="Step"/>
+                                               <xsd:enumeration value="Index"/>
+                                       </xsd:restriction>
+                               </xsd:simpleType>
+                       </xsd:element>
+                       <xsd:element name="relatedInfo" minOccurs="0">
+                               <xsd:complexType mixed="true">
+                                       <xsd:simpleContent>
+                                               <xsd:extension base="xsd:string">
+                                                       <xsd:attribute name="role" use="required">
+                                                               <xsd:simpleType>
+                                                                       <xsd:restriction base="xsd:string">
+                                                                               <xsd:pattern value="[A-Za-z0-9]+.*"/>
+                                                                       </xsd:restriction>
+                                                               </xsd:simpleType>
+                                                       </xsd:attribute>
+                                                       <xsd:attribute name="roleText" type="xsd:string" use="required"/>
+                                               </xsd:extension>
+                                       </xsd:simpleContent>
+                               </xsd:complexType>
+                       </xsd:element>
+                       <xsd:element name="startInfo" minOccurs="0">
+                               <xsd:complexType>
+                                       <xsd:attribute name="targetGroupID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+                                       <xsd:attribute name="targetObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+                               </xsd:complexType>
+                       </xsd:element>
+                       <xsd:element name="endAction" minOccurs="0">
+                               <xsd:complexType>
+                                       <xsd:attribute name="action" use="required">
+                                               <xsd:simpleType>
+                                                       <xsd:restriction base="xsd:string">
+                                                               <xsd:enumeration value="Return"/>
+                                                               <xsd:enumeration value="Branch"/>
+                                                               <xsd:enumeration value="Stop"/>
+                                                       </xsd:restriction>
+                                               </xsd:simpleType>
+                                       </xsd:attribute>
+                                       <xsd:attribute name="targetGroupID" type="av:didl-lite_COLON_at_id.vd.type" use="optional"/>
+                                       <xsd:attribute name="targetObjID" type="av:didl-lite_COLON_at_id.vd.type" use="optional"/>
+                               </xsd:complexType>
+                       </xsd:element>
+               </xsd:choice>
+               <xsd:attribute name="groupID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="headObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="nextObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="prevObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            ObjectLinkRef Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="objectLinkRef.type">
+               <xsd:choice minOccurs="0" maxOccurs="1">
+                       <xsd:element name="title" maxOccurs="1"/>
+                       <xsd:element name="startObject" type="xsd:boolean" minOccurs="0"/>
+                       <xsd:element name="relatedInfo" minOccurs="0">
+                               <xsd:complexType>
+                                       <xsd:attribute name="role" use="required">
+                                               <xsd:simpleType>
+                                                       <xsd:restriction base="xsd:string">
+                                                               <xsd:pattern value="[A-Za-z0-9]+.*"/>
+                                                       </xsd:restriction>
+                                               </xsd:simpleType>
+                                       </xsd:attribute>
+                                       <xsd:attribute name="roleText" type="xsd:string" use="required"/>
+                               </xsd:complexType>
+                       </xsd:element>
+               </xsd:choice>
+               <xsd:attribute name="groupID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="targetGroup" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="targetObjID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="return" type="xsd:boolean" use="optional"/>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            resExt Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="resExt.type">
+               <xsd:annotation>
+                       <xsd:documentation xml:lang="en">
+        Defines the permitted child elements of &lt;resExt&gt;. All children are optional and can be listed in any order in an unbounded manner.
+      </xsd:documentation>
+               </xsd:annotation>
+               <xsd:choice minOccurs="0" maxOccurs="unbounded">
+                       <xsd:element name="segmentInfo" type="upnp:segmentInfo.Type"/>
+                       <xsd:element name="clockSync" type="upnp:clockSync.Type"/>
+                       <xsd:element name="DRMInfo" type="upnp:DRMInfo.Type"/>
+                       <xsd:element name="isSyncAnchor" type="xsd:string"/>
+                       <xsd:element name="componentInfo" type="upnp:componentInfo.Type"/>
+               </xsd:choice>
+               <xsd:attribute name="id" type="av:didl-lite_COLON_at_id.vd.type" use="required">
+                       <xsd:annotation>
+                               <xsd:documentation xml:lang="en">
+          Must be child of &lt;item&gt; or &lt;container&gt;. Value must match the res@id value.
+        </xsd:documentation>
+                       </xsd:annotation>
+               </xsd:attribute>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            segmentInfo Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="segmentInfo.Type">
+               <xsd:sequence>
+                       <xsd:element name="timeRange">
+                               <xsd:complexType>
+                                       <xsd:attribute name="start" type="av:duration.cds1.decFrac" use="required"/>
+                                       <xsd:attribute name="end" type="av:duration.cds1.decFrac" use="required"/>
+                               </xsd:complexType>
+                       </xsd:element>
+                       <xsd:element name="byteRange" minOccurs="0">
+                               <xsd:complexType>
+                                       <xsd:attribute name="start" type="xsd:unsignedLong" use="required"/>
+                                       <xsd:attribute name="end" type="xsd:unsignedLong" use="required"/>
+                               </xsd:complexType>
+                       </xsd:element>
+                       <xsd:element name="frameRange" minOccurs="0">
+                               <xsd:complexType>
+                                       <xsd:attribute name="start" type="xsd:unsignedLong" use="required"/>
+                                       <xsd:attribute name="end" type="xsd:unsignedLong" use="required"/>
+                               </xsd:complexType>
+                       </xsd:element>
+               </xsd:sequence>
+               <xsd:attribute name="baseObjectID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+               <xsd:attribute name="baseResID" type="av:didl-lite_COLON_at_id.vd.type" use="required"/>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            clockSync Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="clockSync.Type">
+               <xsd:attribute name="deviceClockInfoID" type="xsd:string" use="required">
+                       <xsd:annotation>
+                               <xsd:documentation xml:lang="en">
+          Identifies the timestamp mechanism that will be used when the associated content-binary is streamed to the network by the device. Its value MUST equal the value of the associated deviceClockInfo@id in a &lt;Feature&gt; element.
+        </xsd:documentation>
+                       </xsd:annotation>
+               </xsd:attribute>
+               <xsd:attribute name="supportedTimestampsID" type="xsd:string" use="required">
+                       <xsd:annotation>
+                               <xsd:documentation xml:lang="en">
+          Identifies the timestamp mechanism that will be used when the associated content-binary is streamed to the network by the device.  Its value MUST equal the value of the associated supportedTimestamps@id in a &lt;Features&gt; element.
+        </xsd:documentation>
+                       </xsd:annotation>
+               </xsd:attribute>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            DRMInfo Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="DRMInfoContent.Type">
+               <xsd:sequence>
+                       <xsd:element name="foreignMetaData" type="upnp:foreignMetadata.type" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+       </xsd:complexType>
+       <xsd:complexType name="DRMInfo.Type">
+               <xsd:sequence>
+                       <xsd:element name="DRMInfo" type="upnp:DRMInfoContent.Type" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            isSynchAnchor Related Properties            -->
+       <!--=============================-=============================-->
+       <!--=============================-=============================-->
+       <!--            componentInfo Related Properties            -->
+       <!--=============================-=============================-->
+       <!--=============================-=============================-->
+       <!--       Resource Encoding Characteristics Properties        -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="upnp.res.type" mixed="true">
+               <xsd:annotation>
+                       <xsd:documentation>
+                               A 'res' element indentifies a resource.
+                               A resource is typically some type of binary asset,
+                               such as a photo, song, video, etc.
+                               A 'res' element contains a URI that identifies the resource
+                       </xsd:documentation>
+               </xsd:annotation>
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:anyURI">
+                               <xsd:attribute name="importUri" type="xsd:anyURI"/>
+                               <xsd:attribute name="protocolInfo" type="xsd:string" use="required"/>
+                               <xsd:attribute name="size" type="xsd:unsignedLong"/>
+                               <xsd:attribute name="duration" type="av:duration.cds1"/>
+                               <xsd:attribute name="bitrate" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="sampleFrequency" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="bitsPerSample" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="nrAudioChannels" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="resolution">
+                                       <xsd:simpleType>
+                                               <xsd:restriction base="xsd:string">
+                                                       <xsd:pattern value="[0-9]+x[0-9]+"/>
+                                               </xsd:restriction>
+                                       </xsd:simpleType>
+                               </xsd:attribute>
+                               <xsd:attribute name="colorDepth" type="xsd:unsignedInt"/>
+                               <xsd:attribute name="tspec" type="av:string.len.0_256"/>
+                               <xsd:attribute name="allowedUse" type="av:csv.1_.allowedUse"/>
+                               <xsd:attribute name="validityStart" type="av:dateTime"/>
+                               <xsd:attribute name="validityEnd" type="av:dateTime"/>
+                               <xsd:attribute name="remainingTime" type="av:unsignedDuration"/>
+                               <xsd:attribute name="usageInfo" type="xsd:string"/>
+                               <xsd:attribute name="rightsInfoURI" type="xsd:anyURI"/>
+                               <xsd:attribute name="contentInfoURI" type="xsd:anyURI"/>
+                               <xsd:attribute name="recordQuality" type="av:csv.1_.colonDelimPairs"/>
+                               <xsd:attribute name="protection" type="xsd:string"/>
+                               <xsd:attributeGroup ref="upnp:dateTime.attr.group"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <!--transform names with extensions-->
+       <xsd:simpleType name="componentClass.Type">
+               <xsd:restriction base="xsd:string">
+                       <xsd:pattern value=".*"/>
+                       <xsd:pattern value="Audio"/>
+                       <xsd:pattern value="Video"/>
+                       <xsd:pattern value="Caption"/>
+                       <xsd:pattern value="Subtitle"/>
+                       <xsd:pattern value="Unknown"/>
+               </xsd:restriction>
+       </xsd:simpleType>
+       <!-- content.type  -->
+       <xsd:complexType name="content.Type">
+               <xsd:sequence/>
+               <xsd:attribute name="MIMEType" type="xsd:string" use="required"/>
+               <xsd:attribute name="extendedType" type="xsd:string" use="required"/>
+       </xsd:complexType>
+       <!-- CompRes.type   -->
+       <xsd:complexType name="compRes.Type" mixed="true">
+               <xsd:sequence>
+                       <!-- we can't reffer directly to didl-lite:res.type since that creates a circular reference -->
+                       <xsd:element name="isSynchAnchor" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+                       <xsd:element name="refUDN" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+                       <xsd:element name="refObjectID" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+                       <xsd:element name="refResID" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+                       <xsd:element name="res" type="upnp:upnp.res.type" minOccurs="0" maxOccurs="unbounded"/>
+                       <!-- <xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> -->
+               </xsd:sequence>
+       </xsd:complexType>
+       <!--Component.type -->
+       <xsd:complexType name="component.Type">
+               <xsd:all minOccurs="1">
+                       <xsd:element name="componentClass" type="upnp:componentClass.Type" maxOccurs="1" minOccurs="1"/>
+                       <xsd:element name="contentType" type="upnp:content.Type" minOccurs="1" maxOccurs="1"/>
+                       <xsd:element name="language" type="xsd:string" minOccurs="0" maxOccurs="1"/>
+                       <xsd:element name="compRes" type="upnp:compRes.Type" minOccurs="0" maxOccurs="1"/>
+               </xsd:all>
+               <xsd:attribute name="componentID" type="xsd:string" use="required"/>
+               <xsd:attribute name="supportive" type="xsd:boolean" use="optional"/>
+               <xsd:attribute name="supportID" type="xsd:string" use="optional"/>
+       </xsd:complexType>
+       <!-- ComponentGroup.type-->
+       <xsd:complexType name="componentGroup.Type">
+               <xsd:sequence>
+                       <xsd:element name="component" type="upnp:component.Type" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+               <xsd:attribute name="groupID" type="xsd:string" use="required"/>
+               <xsd:attribute name="required" type="xsd:boolean" use="required"/>
+       </xsd:complexType>
+       <!--  ComponentInfo.type -->
+       <xsd:complexType name="componentInfo.Type">
+               <xsd:sequence>
+                       <xsd:element name="componentGroup" type="upnp:componentGroup.Type" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+               <xsd:attribute name="componentID" type="xsd:string" use="optional"/>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            programPreserved Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="programPreserved.Type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attribute name="startTime" use="required"/>
+                               <xsd:attribute name="startTimeDaylightSaving"/>
+                               <xsd:attribute name="endTime"/>
+                               <xsd:attribute name="endTimeDaylightSaving"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            programPreserved Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="preservedTimeRange.Type">
+               <xsd:simpleContent>
+                       <xsd:extension base="xsd:string">
+                               <xsd:attribute name="startTime"/>
+                               <xsd:attribute name="startTimeDaylightSaving"/>
+                               <xsd:attribute name="endTime"/>
+                               <xsd:attribute name="endTimeDaylightSaving"/>
+                       </xsd:extension>
+               </xsd:simpleContent>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            programList Related Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="programList.Type">
+               <xsd:sequence>
+                       <xsd:element name="program" minOccurs="0" maxOccurs="unbounded">
+                               <xsd:complexType>
+                                       <xsd:simpleContent>
+                                               <xsd:extension base="xsd:string">
+                                                       <xsd:attribute name="preserved"/>
+                                               </xsd:extension>
+                                       </xsd:simpleContent>
+                               </xsd:complexType>
+                       </xsd:element>
+               </xsd:sequence>
+       </xsd:complexType>
+       <!--=============================-=============================-->
+       <!--            Content Protection Feature Properties            -->
+       <!--=============================-=============================-->
+       <xsd:complexType name="owner.Type">
+               <xsd:sequence>
+                       <xsd:element name="role" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+               <xsd:attribute name="lock" type="xsd:boolean" use="required"/>
+       </xsd:complexType>
+       <xsd:complexType name="inclusion.Type">
+               <xsd:sequence>
+                       <xsd:element name="role" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+               </xsd:sequence>
+       </xsd:complexType>
+</xsd:schema>
diff --git a/data/xml.xsd b/data/xml.xsd
new file mode 100644 (file)
index 0000000..3cd228d
--- /dev/null
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   See http://www.w3.org/XML/1998/namespace.html and
+   http://www.w3.org/TR/REC-xml for information about this namespace.
+
+    This schema document describes the XML namespace, in a form
+    suitable for import by other schema documents.
+
+    Note that local names in this namespace are intended to be defined
+    only by the World Wide Web Consortium or its subgroups.  The
+    following names are currently defined in this namespace and should
+    not be used with conflicting semantics by any Working Group,
+    specification, or document instance:
+
+    base (as an attribute name): denotes an attribute whose value
+         provides a URI to be used as the base for interpreting any
+         relative URIs in the scope of the element on which it
+         appears; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML Base specification.
+
+    id   (as an attribute name): denotes an attribute whose value
+         should be interpreted as if declared to be of type ID.
+         The xml:id specification is not yet a W3C Recommendation,
+         but this attribute is included here to facilitate experimentation
+         with the mechanisms it proposes.  Note that it is _not_ included
+         in the specialAttrs attribute group.
+
+    lang (as an attribute name): denotes an attribute whose value
+         is a language code for the natural language of the content of
+         any element; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML specification.
+
+    space (as an attribute name): denotes an attribute whose
+         value is a keyword indicating what whitespace processing
+         discipline is intended for the content of the element; its
+         value is inherited.  This name is reserved by virtue of its
+         definition in the XML specification.
+
+    Father (in any context at all): denotes Jon Bosak, the chair of
+         the original XML Working Group.  This name is reserved by
+         the following decision of the W3C XML Plenary and
+         XML Coordination groups:
+
+             In appreciation for his vision, leadership and dedication
+             the W3C XML Plenary on this 10th day of February, 2000
+             reserves for Jon Bosak in perpetuity the XML name
+             xml:Father
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>This schema defines attributes and an attribute group
+        suitable for use by
+        schemas wishing to allow xml:base, xml:lang, xml:space or xml:id
+        attributes on elements they define.
+
+        To enable this, such a schema must import this schema
+        for the XML namespace, e.g. as follows:
+        &lt;schema . . .&gt;
+         . . .
+         &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                    schemaLocation="http://www.w3.org/2005/08/xml.xsd"/&gt;
+
+        Subsequently, qualified reference to any of the attributes
+        or the group defined below will have the desired effect, e.g.
+
+        &lt;type . . .&gt;
+         . . .
+         &lt;attributeGroup ref="xml:specialAttrs"/&gt;
+
+         will define a type which will schema-validate an instance
+         element with any of those attributes</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>In keeping with the XML Schema WG's standard versioning
+   policy, this schema document will persist at
+   http://www.w3.org/2005/08/xml.xsd.
+   At the date of issue it can also be found at
+   http://www.w3.org/2001/xml.xsd.
+   The schema document at that URI may however change in the future,
+   in order to remain compatible with the latest version of XML Schema
+   itself, or with the XML namespace itself.  In other words, if the XML
+   Schema or XML namespaces change, the version of this document at
+   http://www.w3.org/2001/xml.xsd will change
+   accordingly; the version at
+   http://www.w3.org/2005/08/xml.xsd will not change.
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>Attempting to install the relevant ISO 2- and 3-letter
+         codes as the enumerated possible values is probably never
+         going to be a realistic possibility.  See
+         RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry
+         at http://www.iana.org/assignments/lang-tag-apps.htm for
+         further information.
+
+         The union allows for the 'un-declaration' of xml:lang with
+         the empty string.</xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xmlbase/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xml-id/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+ </xs:attributeGroup>
+
+</xs:schema>
index 72a89fa..e9091ab 100644 (file)
@@ -3,6 +3,8 @@
 # We require automake 1.6 at least.
 AUTOMAKE_OPTIONS = 1.6
 
+export GUPNP_AV_DATADIR := $(top_srcdir)/data
+
 # This is a blank Makefile.am for using gtk-doc.
 # Copy this to your project's API docs directory and modify the variables to
 # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
index 81ad22c..8cc0f1d 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 # Everything below here is generic #
 ####################################
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -47,7 +64,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -62,6 +79,11 @@ am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
 SOURCES =
 DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
@@ -145,6 +167,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -524,6 +547,8 @@ uninstall-am: uninstall-local
        uninstall-local
 
 
+export GUPNP_AV_DATADIR := $(top_srcdir)/data
+
 @ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP)
 @ENABLE_GTK_DOC_FALSE@all-local:
 
index 443f60e..03171be 100644 (file)
@@ -59,6 +59,8 @@
     <xi:include href="xml/gupnp-last-change-parser.xml"/>
     <xi:include href="xml/gupnp-search-criteria-parser.xml"/>
     <xi:include href="xml/gupnp-protocol-info.xml"/>
+    <xi:include href="xml/gupnp-feature.xml"/>
+    <xi:include href="xml/gupnp-feature-list-parser.xml"/>
 
   </chapter>
 
index 26db573..c0d46b8 100644 (file)
@@ -338,6 +338,44 @@ gupnp_search_criteria_op_get_type
 </SECTION>
 
 <SECTION>
+<FILE>gupnp-feature</FILE>
+<TITLE>GUPnPFeature</TITLE>
+GUPnPFeature
+gupnp_feature_get_name
+gupnp_feature_get_version
+gupnp_feature_get_object_ids
+<SUBSECTION Standard>
+GUPnPFeatureClass
+GUPNP_TYPE_FEATURE
+GUPNP_FEATURE
+GUPNP_FEATURE_CLASS
+GUPNP_IS_FEATURE_PARSER
+GUPNP_IS_FEATURE_PARSER_CLASS
+GUPNP_FEATURE_GET_CLASS
+<SUBSECTION Private>
+GUPnPFeaturePrivate
+gupnp_feature_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gupnp-feature-list-parser</FILE>
+<TITLE>GUPnPFeatureListParser</TITLE>
+GUPnPFeatureListParser
+gupnp_feature_list_parser_new
+gupnp_feature_list_parser_parse_text
+<SUBSECTION Standard>
+GUPnPFeatureListParserClass
+GUPNP_TYPE_FEATURE_LIST_PARSER
+GUPNP_FEATURE_LIST_PARSER
+GUPNP_FEATURE_LIST_PARSER_CLASS
+GUPNP_IS_FEATURE_LIST_PARSER_PARSER
+GUPNP_IS_FEATURE_LIST_PARSER_PARSER_CLASS
+GUPNP_FEATURE_LIST_PARSER_GET_CLASS
+<SUBSECTION Private>
+gupnp_feature_list_parser_get_type
+</SECTION>
+
+<SECTION>
 <FILE>gupnp-av-error</FILE>
 <TITLE>Error codes</TITLE>
 GUPNP_PROTOCOL_ERROR
index 0122595..6e75f28 100644 (file)
@@ -12,3 +12,5 @@ gupnp_protocol_info_get_type
 gupnp_last_change_parser_get_type
 gupnp_search_criteria_parser_get_type
 gupnp_search_criteria_op_get_type
+gupnp_feature_get_type
+gupnp_feature_list_parser_get_type
index 205107d..8208f58 100644 (file)
 <div class="refsynopsisdiv">
 <a name="GUPnPDIDLLiteContainer.synopsis"></a><h2>Synopsis</h2>
 <pre class="synopsis">                    <a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer-struct" title="GUPnPDIDLLiteContainer">GUPnPDIDLLiteContainer</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="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-searchable" title="gupnp_didl_lite_container_get_searchable ()">gupnp_didl_lite_container_get_searchable</a>
+<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-searchable" title="gupnp_didl_lite_container_get_searchable ()">gupnp_didl_lite_container_get_searchable</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>);
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-child-count" title="gupnp_didl_lite_container_get_child_count ()">gupnp_didl_lite_container_get_child_count</a>
+<span class="returnvalue">gint</span>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-child-count" title="gupnp_didl_lite_container_get_child_count ()">gupnp_didl_lite_container_get_child_count</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</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="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-create-classes" title="gupnp_didl_lite_container_get_create_classes ()">gupnp_didl_lite_container_get_create_classes</a>
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-create-classes" title="gupnp_didl_lite_container_get_create_classes ()">gupnp_didl_lite_container_get_create_classes</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</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="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-search-classes" title="gupnp_didl_lite_container_get_search_classes ()">gupnp_didl_lite_container_get_search_classes</a>
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-search-classes" title="gupnp_didl_lite_container_get_search_classes ()">gupnp_didl_lite_container_get_search_classes</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>);
 <span class="returnvalue">gint64</span>              <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-get-storage-used" title="gupnp_didl_lite_container_get_storage_used ()">gupnp_didl_lite_container_get_storage_used</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-set-searchable" title="gupnp_didl_lite_container_set_searchable ()">gupnp_didl_lite_container_set_searchable</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</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> searchable</code></em>);
+                                                         <em class="parameter"><code><span class="type">gboolean</span> searchable</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-set-child-count" title="gupnp_didl_lite_container_set_child_count ()">gupnp_didl_lite_container_set_child_count</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> child_count</code></em>);
+                                                         <em class="parameter"><code><span class="type">gint</span> child_count</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-set-storage-used" title="gupnp_didl_lite_container_set_storage_used ()">gupnp_didl_lite_container_set_storage_used</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code><span class="type">gint64</span> storage_used</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-add-create-class-full" title="gupnp_didl_lite_container_add_create_class_full ()">gupnp_didl_lite_container_add_create_class_full</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *create_class</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> include_derived</code></em>);
+                                                         <em class="parameter"><code><span class="type">gboolean</span> include_derived</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-add-search-class" title="gupnp_didl_lite_container_add_search_class ()">gupnp_didl_lite_container_add_search_class</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *search_class</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-add-search-class-full" title="gupnp_didl_lite_container_add_search_class_full ()">gupnp_didl_lite_container_add_search_class_full</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *search_class</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> include_derived</code></em>);
+                                                         <em class="parameter"><code><span class="type">gboolean</span> include_derived</code></em>);
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteContainer.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>
+  GObject
    +----<a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject">GUPnPDIDLLiteObject</a>
          +----GUPnPDIDLLiteContainer
 </pre>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteContainer.properties"></a><h2>Properties</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--child-count" title='The "child-count" property'>child-count</a>"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--searchable" title='The "searchable" property'>searchable</a>"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--child-count" title='The "child-count" property'>child-count</a>"              <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--container-update-id" title='The "container-update-id" property'>container-update-id</a>"      <span class="type">guint</span>                 : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--searchable" title='The "searchable" property'>searchable</a>"               <span class="type">gboolean</span>              : Read / Write
   "<a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--storage-used" title='The "storage-used" property'>storage-used</a>"             <span class="type">gint64</span>                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--total-deleted-child-count" title='The "total-deleted-child-count" property'>total-deleted-child-count</a>" <span class="type">guint</span>                 : Read / Write
 </pre>
 </div>
 <div class="refsect1">
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-container-get-searchable"></a><h3>gupnp_didl_lite_container_get_searchable ()</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_didl_lite_container_get_searchable
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_didl_lite_container_get_searchable
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>);</pre>
 <p>
 Checks whether <em class="parameter"><code>container</code></em> is searchable.
@@ -123,7 +125,7 @@ Checks whether <em class="parameter"><code>container</code></em> is searchable.
 <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"><span class="type">TRUE</span></a> if <em class="parameter"><code>container</code></em> is searchable.</td>
+<span class="type">TRUE</span> if <em class="parameter"><code>container</code></em> is searchable.</td>
 </tr>
 </tbody>
 </table></div>
@@ -131,7 +133,7 @@ Checks whether <em class="parameter"><code>container</code></em> is searchable.
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-container-get-child-count"></a><h3>gupnp_didl_lite_container_get_child_count ()</h3>
-<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>                gupnp_didl_lite_container_get_child_count
+<pre class="programlisting"><span class="returnvalue">gint</span>                gupnp_didl_lite_container_get_child_count
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>);</pre>
 <p>
 Get the child count of the <em class="parameter"><code>container</code></em>.  If the child count is unknown, -1 is
@@ -154,10 +156,10 @@ returned.
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-container-get-create-classes"></a><h3>gupnp_didl_lite_container_get_create_classes ()</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_didl_lite_container_get_create_classes
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_container_get_create_classes
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>);</pre>
 <p>
-Gets the list of create classes of the <em class="parameter"><code>object</code></em>.
+Gets the list of create classes of the <em class="parameter"><code>container</code></em>.
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
@@ -169,8 +171,8 @@ Gets the list of create classes of the <em class="parameter"><code>object</code>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list of create classes
-belonging to <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
-<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> the returned list after usage and <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><span class="type">g_free</span></a> each string in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+belonging to <em class="parameter"><code>container</code></em>, or <code class="literal">NULL</code>.
+<span class="type">g_list_free</span> the returned list after usage and <span class="type">g_free</span> each string in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
 </tbody>
@@ -179,10 +181,10 @@ belonging to <em class="parameter"><code>object</code></em>, or <a href="http://
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-container-get-search-classes"></a><h3>gupnp_didl_lite_container_get_search_classes ()</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_didl_lite_container_get_search_classes
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_container_get_search_classes
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>);</pre>
 <p>
-Gets the list of search classes of the <em class="parameter"><code>object</code></em>.
+Gets the list of search classes of the <em class="parameter"><code>container</code></em>.
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
@@ -194,8 +196,8 @@ Gets the list of search classes of the <em class="parameter"><code>object</code>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list of search classes
-belonging to <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <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> the returned list after usage
-and <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><span class="type">g_free</span></a> each string in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+belonging to <em class="parameter"><code>container</code></em>, or <code class="literal">NULL</code>. <span class="type">g_list_free</span> the returned list after usage
+and <span class="type">g_free</span> each string in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> utf8][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
 </tbody>
@@ -230,7 +232,7 @@ or -1 if it is unknown.</td>
 <a name="gupnp-didl-lite-container-set-searchable"></a><h3>gupnp_didl_lite_container_set_searchable ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                gupnp_didl_lite_container_set_searchable
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</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> searchable</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">gboolean</span> searchable</code></em>);</pre>
 <p>
 (Un)set the searchibility of <em class="parameter"><code>container</code></em>.
 </p>
@@ -253,7 +255,7 @@ or -1 if it is unknown.</td>
 <a name="gupnp-didl-lite-container-set-child-count"></a><h3>gupnp_didl_lite_container_set_child_count ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                gupnp_didl_lite_container_set_child_count
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> child_count</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">gint</span> child_count</code></em>);</pre>
 <p>
 Set the child count of the <em class="parameter"><code>container</code></em>.
 </p>
@@ -302,7 +304,7 @@ Set the number of bytes used by all child items of the <em class="parameter"><co
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *create_class</code></em>);</pre>
 <p>
-Add a new create class to the <em class="parameter"><code>object</code></em>. includeDerived defaults to "0".
+Add a new create class to the <em class="parameter"><code>container</code></em>. includeDerived defaults to "0".
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
@@ -328,9 +330,9 @@ Add a new create class to the <em class="parameter"><code>object</code></em>. in
 <pre class="programlisting"><span class="returnvalue">void</span>                gupnp_didl_lite_container_add_create_class_full
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *create_class</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> include_derived</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">gboolean</span> include_derived</code></em>);</pre>
 <p>
-Add a new create class to the <em class="parameter"><code>object</code></em>.
+Add a new create class to the <em class="parameter"><code>container</code></em>.
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
@@ -362,7 +364,7 @@ this container or not.</td>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *search_class</code></em>);</pre>
 <p>
-Add a new search class to the <em class="parameter"><code>object</code></em>.
+Add a new search class to the <em class="parameter"><code>container</code></em>.
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
@@ -388,9 +390,9 @@ Add a new search class to the <em class="parameter"><code>object</code></em>.
 <pre class="programlisting"><span class="returnvalue">void</span>                gupnp_didl_lite_container_add_search_class_full
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *search_class</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> include_derived</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">gboolean</span> include_derived</code></em>);</pre>
 <p>
-Add a new search class to the <em class="parameter"><code>object</code></em>.
+Add a new search class to the <em class="parameter"><code>container</code></em>.
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
@@ -419,7 +421,7 @@ Add a new search class to the <em class="parameter"><code>object</code></em>.
 <a name="GUPnPDIDLLiteContainer.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteContainer--child-count"></a><h3>The <code class="literal">"child-count"</code> property</h3>
-<pre class="programlisting">  "child-count"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "child-count"              <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The child count of this container.
 </p>
@@ -428,8 +430,17 @@ The child count of this container.
 </div>
 <hr>
 <div class="refsect2">
+<a name="GUPnPDIDLLiteContainer--container-update-id"></a><h3>The <code class="literal">"container-update-id"</code> property</h3>
+<pre class="programlisting">  "container-update-id"      <span class="type">guint</span>                 : Read / Write</pre>
+<p>
+Update ID of this container.
+</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GUPnPDIDLLiteContainer--searchable"></a><h3>The <code class="literal">"searchable"</code> property</h3>
-<pre class="programlisting">  "searchable"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write</pre>
+<pre class="programlisting">  "searchable"               <span class="type">gboolean</span>              : Read / Write</pre>
 <p>
 Whether this container is searchable.
 </p>
@@ -445,6 +456,15 @@ The number of bytes used by all child items of this container.
 <p>Allowed values: &gt;= -1</p>
 <p>Default value: -1</p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPDIDLLiteContainer--total-deleted-child-count"></a><h3>The <code class="literal">"total-deleted-child-count"</code> property</h3>
+<pre class="programlisting">  "total-deleted-child-count" <span class="type">guint</span>                 : Read / Write</pre>
+<p>
+Total deleted child count of this container.
+</p>
+<p>Default value: 0</p>
+</div>
 </div>
 </div>
 <div class="footer">
index eb229ef..a24152b 100644 (file)
@@ -59,17 +59,17 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteContributor.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>
+  GObject
    +----GUPnPDIDLLiteContributor
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteContributor.properties"></a><h2>Properties</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteContributor.html#GUPnPDIDLLiteContributor--name" title='The "name" property'>name</a>"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteContributor.html#GUPnPDIDLLiteContributor--role" title='The "role" property'>role</a>"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteContributor.html#GUPnPDIDLLiteContributor--name" title='The "name" property'>name</a>"                     <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteContributor.html#GUPnPDIDLLiteContributor--role" title='The "role" property'>role</a>"                     <span class="type">gchar</span>*                : Read / Write
   "<a class="link" href="GUPnPDIDLLiteContributor.html#GUPnPDIDLLiteContributor--xml-doc" title='The "xml-doc" property'>xml-doc</a>"                  <a href="../gupnp/GUPnPXMLDoc.html"><span class="type">GUPnPXMLDoc</span></a>*          : Write / Construct Only
-  "<a class="link" href="GUPnPDIDLLiteContributor.html#GUPnPDIDLLiteContributor--xml-node" title='The "xml-node" property'>xml-node</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="GUPnPDIDLLiteContributor.html#GUPnPDIDLLiteContributor--xml-node" title='The "xml-node" property'>xml-node</a>"                 <span class="type">gpointer</span>              : Read / Write / Construct Only
 </pre>
 </div>
 <div class="refsect1">
@@ -126,7 +126,7 @@ Get the role of the <em class="parameter"><code>contributor</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The role of the <em class="parameter"><code>contributor</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The role of the <em class="parameter"><code>contributor</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -149,7 +149,7 @@ Get the name of the <em class="parameter"><code>contributor</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The name of the <em class="parameter"><code>contributor</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The name of the <em class="parameter"><code>contributor</code></em> or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -215,7 +215,7 @@ Set the name of the <em class="parameter"><code>contributor</code></em> to <em c
 <a name="GUPnPDIDLLiteContributor.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteContributor--name"></a><h3>The <code class="literal">"name"</code> property</h3>
-<pre class="programlisting">  "name"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "name"                     <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The name of this contributor.
 </p>
@@ -224,7 +224,7 @@ The name of this contributor.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteContributor--role"></a><h3>The <code class="literal">"role"</code> property</h3>
-<pre class="programlisting">  "role"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "role"                     <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The role of this contributor.
 </p>
@@ -245,7 +245,7 @@ Internal property.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteContributor--xml-node"></a><h3>The <code class="literal">"xml-node"</code> property</h3>
-<pre class="programlisting">  "xml-node"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "xml-node"                 <span class="type">gpointer</span>              : Read / Write / Construct Only</pre>
 <p>
 The pointer to object node in XML document.
 </p>
index 0ffbafe..72bad38 100644 (file)
@@ -67,19 +67,19 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteDescriptor.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>
+  GObject
    +----GUPnPDIDLLiteDescriptor
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteDescriptor.properties"></a><h2>Properties</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--content" title='The "content" property'>content</a>"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--id" title='The "id" property'>id</a>"                       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--metadata-type" title='The "metadata-type" property'>metadata-type</a>"            <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--name-space" title='The "name-space" property'>name-space</a>"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--content" title='The "content" property'>content</a>"                  <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--id" title='The "id" property'>id</a>"                       <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--metadata-type" title='The "metadata-type" property'>metadata-type</a>"            <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--name-space" title='The "name-space" property'>name-space</a>"               <span class="type">gchar</span>*                : Read / Write
   "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--xml-doc" title='The "xml-doc" property'>xml-doc</a>"                  <a href="../gupnp/GUPnPXMLDoc.html"><span class="type">GUPnPXMLDoc</span></a>*          : Write / Construct Only
-  "<a class="link" href="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--xml-node" title='The "xml-node" property'>xml-node</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="GUPnPDIDLLiteDescriptor.html#GUPnPDIDLLiteDescriptor--xml-node" title='The "xml-node" property'>xml-node</a>"                 <span class="type">gpointer</span>              : Read / Write / Construct Only
 </pre>
 </div>
 <div class="refsect1">
@@ -136,7 +136,7 @@ Get the content of the <em class="parameter"><code>descriptor</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The content of the <em class="parameter"><code>descriptor</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The content of the <em class="parameter"><code>descriptor</code></em> or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -158,7 +158,7 @@ Get the ID of the <em class="parameter"><code>descriptor</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The ID string or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The ID string or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -181,7 +181,7 @@ Get the metadata type of the <em class="parameter"><code>descriptor</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The type as string or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The type as string or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -204,7 +204,7 @@ Get the name space associated with the <em class="parameter"><code>descriptor</c
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The name space or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The name space or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -325,7 +325,7 @@ Set the name space associated with the <em class="parameter"><code>descriptor</c
 <a name="GUPnPDIDLLiteDescriptor.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteDescriptor--content"></a><h3>The <code class="literal">"content"</code> property</h3>
-<pre class="programlisting">  "content"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "content"                  <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The content of this descriptor.
 </p>
@@ -334,7 +334,7 @@ The content of this descriptor.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteDescriptor--id"></a><h3>The <code class="literal">"id"</code> property</h3>
-<pre class="programlisting">  "id"                       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "id"                       <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The ID of this descriptor.
 </p>
@@ -343,7 +343,7 @@ The ID of this descriptor.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteDescriptor--metadata-type"></a><h3>The <code class="literal">"metadata-type"</code> property</h3>
-<pre class="programlisting">  "metadata-type"            <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "metadata-type"            <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The type of this descriptor.
 </p>
@@ -352,7 +352,7 @@ The type of this descriptor.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteDescriptor--name-space"></a><h3>The <code class="literal">"name-space"</code> property</h3>
-<pre class="programlisting">  "name-space"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "name-space"               <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The name space associated with this descriptor.
 </p>
@@ -373,7 +373,7 @@ Internal property.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteDescriptor--xml-node"></a><h3>The <code class="literal">"xml-node"</code> property</h3>
-<pre class="programlisting">  "xml-node"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "xml-node"                 <span class="type">gpointer</span>              : Read / Write / Construct Only</pre>
 <p>
 The pointer to desc node in XML document.
 </p>
index 63c9396..5fb8906 100644 (file)
@@ -50,7 +50,7 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteItem.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>
+  GObject
    +----<a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject">GUPnPDIDLLiteObject</a>
          +----GUPnPDIDLLiteItem
 </pre>
@@ -58,7 +58,7 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteItem.properties"></a><h2>Properties</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteItem.html#GUPnPDIDLLiteItem--ref-id" title='The "ref-id" property'>ref-id</a>"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteItem.html#GUPnPDIDLLiteItem--ref-id" title='The "ref-id" property'>ref-id</a>"                   <span class="type">gchar</span>*                : Read / Write
 </pre>
 </div>
 <div class="refsect1">
@@ -89,7 +89,7 @@ Get the ref ID of the <em class="parameter"><code>item</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The ref ID of the <em class="parameter"><code>item</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The ref ID of the <em class="parameter"><code>item</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -121,7 +121,7 @@ Set the ref ID of the <em class="parameter"><code>item</code></em>.
 <a name="GUPnPDIDLLiteItem.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteItem--ref-id"></a><h3>The <code class="literal">"ref-id"</code> property</h3>
-<pre class="programlisting">  "ref-id"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "ref-id"                   <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The ref ID of this item.
 </p>
index 4a6f0f2..0b7b7d8 100644 (file)
@@ -50,22 +50,22 @@ enum                <a class="link" href="GUPnPDIDLLiteObject.html#GUPnPOCMFlags
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 <span class="returnvalue">xmlNsPtr</span>            <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-dlna-namespace" title="gupnp_didl_lite_object_get_dlna_namespace ()">gupnp_didl_lite_object_get_dlna_namespace</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-properties" title="gupnp_didl_lite_object_get_properties ()">gupnp_didl_lite_object_get_properties</a>
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-properties" title="gupnp_didl_lite_object_get_properties ()">gupnp_didl_lite_object_get_properties</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *name</code></em>);
 const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-id" title="gupnp_didl_lite_object_get_id ()">gupnp_didl_lite_object_get_id</a>       (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-parent-id" title="gupnp_didl_lite_object_get_parent_id ()">gupnp_didl_lite_object_get_parent_id</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-restricted" title="gupnp_didl_lite_object_get_restricted ()">gupnp_didl_lite_object_get_restricted</a>
+<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-restricted" title="gupnp_didl_lite_object_get_restricted ()">gupnp_didl_lite_object_get_restricted</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-title" title="gupnp_didl_lite_object_get_title ()">gupnp_didl_lite_object_get_title</a>    (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creator" title="gupnp_didl_lite_object_get_creator ()">gupnp_didl_lite_object_get_creator</a>  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-artist" title="gupnp_didl_lite_object_get_artist ()">gupnp_didl_lite_object_get_artist</a>   (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-author" title="gupnp_didl_lite_object_get_author ()">gupnp_didl_lite_object_get_author</a>   (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creators" title="gupnp_didl_lite_object_get_creators ()">gupnp_didl_lite_object_get_creators</a> (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-artists" title="gupnp_didl_lite_object_get_artists ()">gupnp_didl_lite_object_get_artists</a>  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-authors" title="gupnp_didl_lite_object_get_authors ()">gupnp_didl_lite_object_get_authors</a>  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-descriptors" title="gupnp_didl_lite_object_get_descriptors ()">gupnp_didl_lite_object_get_descriptors</a>
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creators" title="gupnp_didl_lite_object_get_creators ()">gupnp_didl_lite_object_get_creators</a> (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-artists" title="gupnp_didl_lite_object_get_artists ()">gupnp_didl_lite_object_get_artists</a>  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-authors" title="gupnp_didl_lite_object_get_authors ()">gupnp_didl_lite_object_get_authors</a>  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-descriptors" title="gupnp_didl_lite_object_get_descriptors ()">gupnp_didl_lite_object_get_descriptors</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-write-status" title="gupnp_didl_lite_object_get_write_status ()">gupnp_didl_lite_object_get_write_status</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
@@ -82,12 +82,12 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 <a class="link" href="GUPnPDIDLLiteObject.html#GUPnPOCMFlags" title="enum GUPnPOCMFlags"><span class="returnvalue">GUPnPOCMFlags</span></a>       <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-dlna-managed" title="gupnp_didl_lite_object_get_dlna_managed ()">gupnp_didl_lite_object_get_dlna_managed</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-resources" title="gupnp_didl_lite_object_get_resources ()">gupnp_didl_lite_object_get_resources</a>
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-resources" title="gupnp_didl_lite_object_get_resources ()">gupnp_didl_lite_object_get_resources</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 <a class="link" href="GUPnPDIDLLiteResource.html" title="GUPnPDIDLLiteResource"><span class="returnvalue">GUPnPDIDLLiteResource</span></a> * <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-compat-resource" title="gupnp_didl_lite_object_get_compat_resource ()">gupnp_didl_lite_object_get_compat_resource</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *sink_protocol_info</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> lenient</code></em>);
+                                                         <em class="parameter"><code><span class="type">gboolean</span> lenient</code></em>);
 <a class="link" href="GUPnPDIDLLiteResource.html" title="GUPnPDIDLLiteResource"><span class="returnvalue">GUPnPDIDLLiteResource</span></a> * <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-add-resource" title="gupnp_didl_lite_object_add_resource ()">gupnp_didl_lite_object_add_resource</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);
 <a class="link" href="GUPnPDIDLLiteDescriptor.html" title="GUPnPDIDLLiteDescriptor"><span class="returnvalue">GUPnPDIDLLiteDescriptor</span></a> * <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-add-descriptor" title="gupnp_didl_lite_object_add_descriptor ()">gupnp_didl_lite_object_add_descriptor</a>
@@ -102,7 +102,7 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
                                                          <em class="parameter"><code>const <span class="type">char</span> *parent_id</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-restricted" title="gupnp_didl_lite_object_set_restricted ()">gupnp_didl_lite_object_set_restricted</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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> restricted</code></em>);
+                                                         <em class="parameter"><code><span class="type">gboolean</span> restricted</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-title" title="gupnp_didl_lite_object_set_title ()">gupnp_didl_lite_object_set_title</a>    (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *title</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-creator" title="gupnp_didl_lite_object_set_creator ()">gupnp_didl_lite_object_set_creator</a>  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>,
@@ -143,7 +143,7 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteObject.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>
+  GObject
    +----GUPnPDIDLLiteObject
          +----<a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer">GUPnPDIDLLiteContainer</a>
          +----<a class="link" href="GUPnPDIDLLiteItem.html" title="GUPnPDIDLLiteItem">GUPnPDIDLLiteItem</a>
@@ -152,27 +152,28 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteObject.properties"></a><h2>Properties</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--album" title='The "album" property'>album</a>"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--album-art" title='The "album-art" property'>album-art</a>"                <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--artist" title='The "artist" property'>artist</a>"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--author" title='The "author" property'>author</a>"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--creator" title='The "creator" property'>creator</a>"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--date" title='The "date" property'>date</a>"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--dc-namespace" title='The "dc-namespace" property'>dc-namespace</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="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--description" title='The "description" property'>description</a>"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--album" title='The "album" property'>album</a>"                    <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--album-art" title='The "album-art" property'>album-art</a>"                <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--artist" title='The "artist" property'>artist</a>"                   <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--author" title='The "author" property'>author</a>"                   <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--creator" title='The "creator" property'>creator</a>"                  <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--date" title='The "date" property'>date</a>"                     <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--dc-namespace" title='The "dc-namespace" property'>dc-namespace</a>"             <span class="type">gpointer</span>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--description" title='The "description" property'>description</a>"              <span class="type">gchar</span>*                : Read / Write
   "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--dlna-managed" title='The "dlna-managed" property'>dlna-managed</a>"             <a class="link" href="GUPnPDIDLLiteObject.html#GUPnPOCMFlags" title="enum GUPnPOCMFlags"><span class="type">GUPnPOCMFlags</span></a>         : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--dlna-namespace" title='The "dlna-namespace" property'>dlna-namespace</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="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--genre" title='The "genre" property'>genre</a>"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--id" title='The "id" property'>id</a>"                       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--parent-id" title='The "parent-id" property'>parent-id</a>"                <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--restricted" title='The "restricted" property'>restricted</a>"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--title" title='The "title" property'>title</a>"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--track-number" title='The "track-number" property'>track-number</a>"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-class" title='The "upnp-class" property'>upnp-class</a>"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-namespace" title='The "upnp-namespace" property'>upnp-namespace</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="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--write-status" title='The "write-status" property'>write-status</a>"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--dlna-namespace" title='The "dlna-namespace" property'>dlna-namespace</a>"           <span class="type">gpointer</span>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--genre" title='The "genre" property'>genre</a>"                    <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--id" title='The "id" property'>id</a>"                       <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--parent-id" title='The "parent-id" property'>parent-id</a>"                <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--restricted" title='The "restricted" property'>restricted</a>"               <span class="type">gboolean</span>              : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--title" title='The "title" property'>title</a>"                    <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--track-number" title='The "track-number" property'>track-number</a>"             <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--update-id" title='The "update-id" property'>update-id</a>"                <span class="type">guint</span>                 : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-class" title='The "upnp-class" property'>upnp-class</a>"               <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-namespace" title='The "upnp-namespace" property'>upnp-namespace</a>"           <span class="type">gpointer</span>              : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--write-status" title='The "write-status" property'>write-status</a>"             <span class="type">gchar</span>*                : Read / Write
   "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--xml-doc" title='The "xml-doc" property'>xml-doc</a>"                  <a href="../gupnp/GUPnPXMLDoc.html"><span class="type">GUPnPXMLDoc</span></a>*          : Write / Construct Only
-  "<a class="link" href="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--xml-node" title='The "xml-node" property'>xml-node</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="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--xml-node" title='The "xml-node" property'>xml-node</a>"                 <span class="type">gpointer</span>              : Read / Write / Construct Only
 </pre>
 </div>
 <div class="refsect1">
@@ -342,7 +343,7 @@ document containing this object.
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-properties"></a><h3>gupnp_didl_lite_object_get_properties ()</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_didl_lite_object_get_properties
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_object_get_properties
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *name</code></em>);</pre>
 <p>
@@ -362,8 +363,8 @@ Use this function to retreive property nodes by name.
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list of
-property nodes by the name <em class="parameter"><code>property_name</code></em> belonging to <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
-<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> the returned list after usage but do not modify the contents. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> xmlNode*][<acronym title="Free data container after the code is done."><span class="acronym">transfer container</span></acronym>]</span>
+property nodes by the name <em class="parameter"><code>property_name</code></em> belonging to <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.
+<span class="type">g_list_free</span> the returned list after usage but do not modify the contents. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> xmlNode*][<acronym title="Free data container after the code is done."><span class="acronym">transfer container</span></acronym>]</span>
 </td>
 </tr>
 </tbody>
@@ -385,7 +386,7 @@ Get the ID of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The ID of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The ID of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -407,7 +408,7 @@ Get the ID of the parent of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The ID of parent of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The ID of parent of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -415,7 +416,7 @@ Get the ID of the parent of the <em class="parameter"><code>object</code></em>.
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-restricted"></a><h3>gupnp_didl_lite_object_get_restricted ()</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_didl_lite_object_get_restricted
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_didl_lite_object_get_restricted
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
 <p>
 Whether the <em class="parameter"><code>object</code></em> is restricted or not.
@@ -430,7 +431,7 @@ Whether the <em class="parameter"><code>object</code></em> is restricted or not.
 <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"><span class="type">TRUE</span></a> if <em class="parameter"><code>object</code></em> is restricted.</td>
+<span class="type">TRUE</span> if <em class="parameter"><code>object</code></em> is restricted.</td>
 </tr>
 </tbody>
 </table></div>
@@ -451,7 +452,7 @@ Get the title of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The title of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The title of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -460,10 +461,6 @@ Get the title of the <em class="parameter"><code>object</code></em>.
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-creator"></a><h3>gupnp_didl_lite_object_get_creator ()</h3>
 <pre class="programlisting">const <span class="returnvalue">char</span> *        gupnp_didl_lite_object_get_creator  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
-<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Warning</h3>
-<p><code class="literal">gupnp_didl_lite_object_get_creator</code> has been deprecated since version 0.5.3 and should not be used in newly-written code. Use <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creators" title="gupnp_didl_lite_object_get_creators ()"><span class="type">gupnp_didl_lite_object_get_creators</span></a> instead.</p>
-</div>
 <p>
 Get the creator of the <em class="parameter"><code>object</code></em>.
 </p>
@@ -476,7 +473,7 @@ Get the creator of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The creator of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The creator of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -490,7 +487,7 @@ Get the creator of the <em class="parameter"><code>object</code></em>.
 <p><code class="literal">gupnp_didl_lite_object_get_artist</code> has been deprecated since version 0.5.3 and should not be used in newly-written code. Use <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-artists" title="gupnp_didl_lite_object_get_artists ()"><span class="type">gupnp_didl_lite_object_get_artists</span></a> instead.</p>
 </div>
 <p>
-Get the artist of the <em class="parameter"><code>object</code></em>. If role is not <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>, it is set to the role
+Get the artist of the <em class="parameter"><code>object</code></em>. If role is not <code class="literal">NULL</code>, it is set to the role
 of the artist if available.
 </p>
 <div class="variablelist"><table border="0">
@@ -502,7 +499,7 @@ of the artist if available.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The artist of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The artist of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -527,7 +524,7 @@ Get the author of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The author of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The author of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -535,7 +532,7 @@ Get the author of the <em class="parameter"><code>object</code></em>.
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-creators"></a><h3>gupnp_didl_lite_object_get_creators ()</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_didl_lite_object_get_creators (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_object_get_creators (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
 <p>
 Get the creators of the <em class="parameter"><code>object</code></em>.
 </p>
@@ -549,8 +546,8 @@ Get the creators of the <em class="parameter"><code>object</code></em>.
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list
-of creators belonging to <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
-<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> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteContributor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+of creators belonging to <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.
+<span class="type">g_list_free</span> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteContributor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
 </tbody>
@@ -559,7 +556,7 @@ of creators belonging to <em class="parameter"><code>object</code></em>, or <a h
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-artists"></a><h3>gupnp_didl_lite_object_get_artists ()</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_didl_lite_object_get_artists  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_object_get_artists  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
 <p>
 Get the artists of the <em class="parameter"><code>object</code></em>.
 </p>
@@ -573,8 +570,8 @@ Get the artists of the <em class="parameter"><code>object</code></em>.
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list
-of artists belonging to <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
-<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> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteContributor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+of artists belonging to <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.
+<span class="type">g_list_free</span> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteContributor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
 </tbody>
@@ -583,7 +580,7 @@ of artists belonging to <em class="parameter"><code>object</code></em>, or <a hr
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-authors"></a><h3>gupnp_didl_lite_object_get_authors ()</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_didl_lite_object_get_authors  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_object_get_authors  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
 <p>
 Get the authors of the <em class="parameter"><code>object</code></em>.
 </p>
@@ -597,8 +594,8 @@ Get the authors of the <em class="parameter"><code>object</code></em>.
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list
-of authors belonging to <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
-<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> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteContributor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+of authors belonging to <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.
+<span class="type">g_list_free</span> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteContributor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
 </tbody>
@@ -607,7 +604,7 @@ of authors belonging to <em class="parameter"><code>object</code></em>, or <a hr
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-descriptors"></a><h3>gupnp_didl_lite_object_get_descriptors ()</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_didl_lite_object_get_descriptors
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_object_get_descriptors
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
 <p>
 Get the descriptors of the <em class="parameter"><code>object</code></em>.
@@ -622,8 +619,8 @@ Get the descriptors of the <em class="parameter"><code>object</code></em>.
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list of
-descriptors belonging to <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.
-<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> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteDescriptor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
+descriptors belonging to <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.
+<span class="type">g_list_free</span> the returned list after usage and unref each object in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteDescriptor*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
 </tbody>
@@ -646,7 +643,7 @@ Get the write status of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The write status of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The write status of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -667,7 +664,7 @@ Get the genre of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The genre of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The genre of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -690,7 +687,7 @@ Get the UPnP class of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The class of <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The class of <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -711,7 +708,7 @@ Get the album of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The album of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The album of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -733,7 +730,7 @@ Get the URI to album art of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The URI to album art of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The URI to album art of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -755,7 +752,7 @@ Get the description of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The description of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The description of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -776,7 +773,7 @@ Get the date of the <em class="parameter"><code>object</code></em>.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The date of the <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The date of the <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -828,7 +825,7 @@ Get the 'dlna:dlnaManaged' attribute of the <em class="parameter"><code>object</
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-object-get-resources"></a><h3>gupnp_didl_lite_object_get_resources ()</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_didl_lite_object_get_resources
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_didl_lite_object_get_resources
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>);</pre>
 <p>
 Use this function to retreive resources from the <em class="parameter"><code>object</code></em>.
@@ -843,7 +840,7 @@ Use this function to retreive resources from the <em class="parameter"><code>obj
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The list
-of resources belonging to  <em class="parameter"><code>object</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <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> the
+of resources belonging to  <em class="parameter"><code>object</code></em>, or <code class="literal">NULL</code>. <span class="type">g_list_free</span> the
 returned list after usage and unref each resource in it. <span class="annotation">[<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GUPnPDIDLLiteResource*][<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
@@ -856,7 +853,7 @@ returned list after usage and unref each resource in it. <span class="annotation
 <pre class="programlisting"><a class="link" href="GUPnPDIDLLiteResource.html" title="GUPnPDIDLLiteResource"><span class="returnvalue">GUPnPDIDLLiteResource</span></a> * gupnp_didl_lite_object_get_compat_resource
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *sink_protocol_info</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> lenient</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">gboolean</span> lenient</code></em>);</pre>
 <p>
 Use this function to get a resource from the <em class="parameter"><code>object</code></em> that is compatible with
 any of the protocols specified in the <em class="parameter"><code>sink_protocol_info</code></em>. The value of
@@ -865,8 +862,8 @@ any of the protocols specified in the <em class="parameter"><code>sink_protocol_
 ConnectionManager service.
 </p>
 <p>
-If <em class="parameter"><code>lenient</code></em> is <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><span class="type">TRUE</span></a>, the first resource in the list is returned instead of
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> if none of resources and protocols are found to be compatible.
+If <em class="parameter"><code>lenient</code></em> is <span class="type">TRUE</span>, the first resource in the list is returned instead of
+<code class="literal">NULL</code> if none of resources and protocols are found to be compatible.
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
@@ -886,7 +883,7 @@ If <em class="parameter"><code>lenient</code></em> is <a href="http://library.gn
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
 <td>The resource belonging to <em class="parameter"><code>object</code></em> that is comaptible with
-any of the protocols specified in <em class="parameter"><code>sink_protocol_info</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. Unref after
+any of the protocols specified in <em class="parameter"><code>sink_protocol_info</code></em>, or <code class="literal">NULL</code>. Unref after
 usage. <span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span>
 </td>
 </tr>
@@ -1015,7 +1012,7 @@ Set the ID of the parent of the <em class="parameter"><code>object</code></em> t
 <a name="gupnp-didl-lite-object-set-restricted"></a><h3>gupnp_didl_lite_object_set_restricted ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                gupnp_didl_lite_object_set_restricted
                                                         (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</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> restricted</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">gboolean</span> restricted</code></em>);</pre>
 <p>
 Set the restricted status of <em class="parameter"><code>object</code></em> to <em class="parameter"><code>restricted</code></em>.
 </p>
@@ -1060,10 +1057,6 @@ Set the title of the <em class="parameter"><code>object</code></em> to <em class
 <a name="gupnp-didl-lite-object-set-creator"></a><h3>gupnp_didl_lite_object_set_creator ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                gupnp_didl_lite_object_set_creator  (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *creator</code></em>);</pre>
-<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Warning</h3>
-<p><code class="literal">gupnp_didl_lite_object_set_creator</code> has been deprecated since version 0.5.3 and should not be used in newly-written code. Use <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-add-creator" title="gupnp_didl_lite_object_add_creator ()"><span class="type">gupnp_didl_lite_object_add_creator</span></a> instead.</p>
-</div>
 <p>
 Set the creator of the <em class="parameter"><code>object</code></em> to <em class="parameter"><code>creator</code></em>.
 </p>
@@ -1397,7 +1390,7 @@ Set the 'dlna:dlnaManaged' attribute of the <em class="parameter"><code>object</
 <a name="GUPnPDIDLLiteObject.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--album"></a><h3>The <code class="literal">"album"</code> property</h3>
-<pre class="programlisting">  "album"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "album"                    <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The album of this object.
 </p>
@@ -1406,7 +1399,7 @@ The album of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--album-art"></a><h3>The <code class="literal">"album-art"</code> property</h3>
-<pre class="programlisting">  "album-art"                <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "album-art"                <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The URI to album art of this object.
 </p>
@@ -1415,7 +1408,7 @@ The URI to album art of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--artist"></a><h3>The <code class="literal">"artist"</code> property</h3>
-<pre class="programlisting">  "artist"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "artist"                   <span class="type">gchar</span>*                : Read / Write</pre>
 <div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
 <h3 class="title">Warning</h3>
 <p><code class="literal">GUPnPDIDLLiteObject:artist</code> has been deprecated since version 0.5.3 and should not be used in newly-written code. Use <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-artists" title="gupnp_didl_lite_object_get_artists ()"><span class="type">gupnp_didl_lite_object_get_artists</span></a> and
@@ -1430,7 +1423,7 @@ The artist of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--author"></a><h3>The <code class="literal">"author"</code> property</h3>
-<pre class="programlisting">  "author"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "author"                   <span class="type">gchar</span>*                : Read / Write</pre>
 <div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
 <h3 class="title">Warning</h3>
 <p><code class="literal">GUPnPDIDLLiteObject:author</code> has been deprecated since version 0.5.3 and should not be used in newly-written code. Use <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-authors" title="gupnp_didl_lite_object_get_authors ()"><span class="type">gupnp_didl_lite_object_get_authors</span></a> and
@@ -1445,13 +1438,7 @@ The author of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--creator"></a><h3>The <code class="literal">"creator"</code> property</h3>
-<pre class="programlisting">  "creator"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
-<div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;">
-<h3 class="title">Warning</h3>
-<p><code class="literal">GUPnPDIDLLiteObject:creator</code> has been deprecated since version 0.5.3 and should not be used in newly-written code. Use <a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creators" title="gupnp_didl_lite_object_get_creators ()"><span class="type">gupnp_didl_lite_object_get_creators</span></a> and
-<a class="link" href="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-add-creator" title="gupnp_didl_lite_object_add_creator ()"><span class="type">gupnp_didl_lite_object_add_creator</span></a> instead since unlike this
-property, they are capable of dealing with multiple creator nodes.</p>
-</div>
+<pre class="programlisting">  "creator"                  <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The creator of this object.
 </p>
@@ -1460,7 +1447,7 @@ The creator of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--date"></a><h3>The <code class="literal">"date"</code> property</h3>
-<pre class="programlisting">  "date"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "date"                     <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The date of this object.
 </p>
@@ -1469,7 +1456,7 @@ The date of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--dc-namespace"></a><h3>The <code class="literal">"dc-namespace"</code> property</h3>
-<pre class="programlisting">  "dc-namespace"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "dc-namespace"             <span class="type">gpointer</span>              : Read / Write / Construct Only</pre>
 <p>
 Pointer to the DublinCore namespace registered with the XML document
 containing this object.
@@ -1478,7 +1465,7 @@ containing this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--description"></a><h3>The <code class="literal">"description"</code> property</h3>
-<pre class="programlisting">  "description"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "description"              <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The description of this object.
 </p>
@@ -1495,7 +1482,7 @@ The 'dlna:dlnaManaged' attribute.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--dlna-namespace"></a><h3>The <code class="literal">"dlna-namespace"</code> property</h3>
-<pre class="programlisting">  "dlna-namespace"           <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "dlna-namespace"           <span class="type">gpointer</span>              : Read / Write / Construct Only</pre>
 <p>
 Pointer to the DLNA metadata namespace registered with the XML
 document containing this object.
@@ -1504,7 +1491,7 @@ document containing this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--genre"></a><h3>The <code class="literal">"genre"</code> property</h3>
-<pre class="programlisting">  "genre"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "genre"                    <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The genre of this object.
 </p>
@@ -1513,7 +1500,7 @@ The genre of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--id"></a><h3>The <code class="literal">"id"</code> property</h3>
-<pre class="programlisting">  "id"                       <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "id"                       <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The ID of this object.
 </p>
@@ -1522,7 +1509,7 @@ The ID of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--parent-id"></a><h3>The <code class="literal">"parent-id"</code> property</h3>
-<pre class="programlisting">  "parent-id"                <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "parent-id"                <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The ID of the parent container of this object.
 </p>
@@ -1531,7 +1518,7 @@ The ID of the parent container of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--restricted"></a><h3>The <code class="literal">"restricted"</code> property</h3>
-<pre class="programlisting">  "restricted"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a>              : Read / Write</pre>
+<pre class="programlisting">  "restricted"               <span class="type">gboolean</span>              : Read / Write</pre>
 <p>
 Whether this object is restricted.
 </p>
@@ -1540,7 +1527,7 @@ Whether this object is restricted.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--title"></a><h3>The <code class="literal">"title"</code> property</h3>
-<pre class="programlisting">  "title"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "title"                    <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The title of this object.
 </p>
@@ -1549,7 +1536,7 @@ The title of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--track-number"></a><h3>The <code class="literal">"track-number"</code> property</h3>
-<pre class="programlisting">  "track-number"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "track-number"             <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The original track number of this object.
 </p>
@@ -1558,8 +1545,17 @@ The original track number of this object.
 </div>
 <hr>
 <div class="refsect2">
+<a name="GUPnPDIDLLiteObject--update-id"></a><h3>The <code class="literal">"update-id"</code> property</h3>
+<pre class="programlisting">  "update-id"                <span class="type">guint</span>                 : Read / Write</pre>
+<p>
+Update ID of this object.
+</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GUPnPDIDLLiteObject--upnp-class"></a><h3>The <code class="literal">"upnp-class"</code> property</h3>
-<pre class="programlisting">  "upnp-class"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "upnp-class"               <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The UPnP class of this object.
 </p>
@@ -1568,7 +1564,7 @@ The UPnP class of this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--upnp-namespace"></a><h3>The <code class="literal">"upnp-namespace"</code> property</h3>
-<pre class="programlisting">  "upnp-namespace"           <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "upnp-namespace"           <span class="type">gpointer</span>              : Read / Write / Construct Only</pre>
 <p>
 Pointer to the UPnP namespace registered with the XML document
 containing this object.
@@ -1577,7 +1573,7 @@ containing this object.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--write-status"></a><h3>The <code class="literal">"write-status"</code> property</h3>
-<pre class="programlisting">  "write-status"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "write-status"             <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The write status of this object.
 </p>
@@ -1598,7 +1594,7 @@ Internal property.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteObject--xml-node"></a><h3>The <code class="literal">"xml-node"</code> property</h3>
-<pre class="programlisting">  "xml-node"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "xml-node"                 <span class="type">gpointer</span>              : Read / Write / Construct Only</pre>
 <p>
 The pointer to object node in XML document.
 </p>
index 2c0ea0e..15ef2d3 100644 (file)
 <a name="GUPnPDIDLLiteParser.synopsis"></a><h2>Synopsis</h2>
 <pre class="synopsis">                    <a class="link" href="GUPnPDIDLLiteParser.html#GUPnPDIDLLiteParser-struct" title="GUPnPDIDLLiteParser">GUPnPDIDLLiteParser</a>;
 <a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="returnvalue">GUPnPDIDLLiteParser</span></a> * <a class="link" href="GUPnPDIDLLiteParser.html#gupnp-didl-lite-parser-new" title="gupnp_didl_lite_parser_new ()">gupnp_didl_lite_parser_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="GUPnPDIDLLiteParser.html#gupnp-didl-lite-parser-parse-didl" title="gupnp_didl_lite_parser_parse_didl ()">gupnp_didl_lite_parser_parse_didl</a>   (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="type">GUPnPDIDLLiteParser</span></a> *parser</code></em>,
+<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPDIDLLiteParser.html#gupnp-didl-lite-parser-parse-didl" title="gupnp_didl_lite_parser_parse_didl ()">gupnp_didl_lite_parser_parse_didl</a>   (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="type">GUPnPDIDLLiteParser</span></a> *parser</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *didl</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteParser.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>
+  GObject
    +----GUPnPDIDLLiteParser
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteParser.signals"></a><h2>Signals</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteParser.html#GUPnPDIDLLiteParser-container-available" title='The "container-available" signal'>container-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="GUPnPDIDLLiteParser.html#GUPnPDIDLLiteParser-item-available" title='The "item-available" signal'>item-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="GUPnPDIDLLiteParser.html#GUPnPDIDLLiteParser-object-available" title='The "object-available" signal'>object-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="GUPnPDIDLLiteParser.html#GUPnPDIDLLiteParser-container-available" title='The "container-available" signal'>container-available</a>"                            : <code class="literal">Run Last</code>
+  "<a class="link" href="GUPnPDIDLLiteParser.html#GUPnPDIDLLiteParser-item-available" title='The "item-available" signal'>item-available</a>"                                 : <code class="literal">Run Last</code>
+  "<a class="link" href="GUPnPDIDLLiteParser.html#GUPnPDIDLLiteParser-object-available" title='The "object-available" signal'>object-available</a>"                               : <code class="literal">Run Last</code>
 </pre>
 </div>
 <div class="refsect1">
@@ -90,9 +90,9 @@
 <hr>
 <div class="refsect2">
 <a name="gupnp-didl-lite-parser-parse-didl"></a><h3>gupnp_didl_lite_parser_parse_didl ()</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_didl_lite_parser_parse_didl   (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="type">GUPnPDIDLLiteParser</span></a> *parser</code></em>,
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_didl_lite_parser_parse_didl   (<em class="parameter"><code><a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="type">GUPnPDIDLLiteParser</span></a> *parser</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *didl</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
 <p>
 Parses DIDL-Lite XML string <em class="parameter"><code>didl</code></em>, emitting the ::object-available,
 ::item-available and ::container-available signals appropriately during the
@@ -128,7 +128,7 @@ process.
 <a name="GUPnPDIDLLiteParser-container-available"></a><h3>The <code class="literal">"container-available"</code> signal</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="type">GUPnPDIDLLiteParser</span></a>    *parser,
                                                         <a class="link" href="GUPnPDIDLLiteContainer.html" title="GUPnPDIDLLiteContainer"><span class="type">GUPnPDIDLLiteContainer</span></a> *container,
-                                                        <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>
+                                                        <span class="type">gpointer</span>                user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::container-available signal is emitted each time a container is
 found in the DIDL-Lite XML being parsed.
@@ -157,7 +157,7 @@ found in the DIDL-Lite XML being parsed.
 <a name="GUPnPDIDLLiteParser-item-available"></a><h3>The <code class="literal">"item-available"</code> signal</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="type">GUPnPDIDLLiteParser</span></a> *parser,
                                                         <a class="link" href="GUPnPDIDLLiteItem.html" title="GUPnPDIDLLiteItem"><span class="type">GUPnPDIDLLiteItem</span></a>   *item,
-                                                        <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>
+                                                        <span class="type">gpointer</span>             user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::item-available signal is emitted each time an item is found in
 the DIDL-Lite XML being parsed.
@@ -186,7 +186,7 @@ the DIDL-Lite XML being parsed.
 <a name="GUPnPDIDLLiteParser-object-available"></a><h3>The <code class="literal">"object-available"</code> signal</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPDIDLLiteParser.html" title="GUPnPDIDLLiteParser"><span class="type">GUPnPDIDLLiteParser</span></a> *parser,
                                                         <a class="link" href="GUPnPDIDLLiteObject.html" title="GUPnPDIDLLiteObject"><span class="type">GUPnPDIDLLiteObject</span></a> *object,
-                                                        <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>
+                                                        <span class="type">gpointer</span>             user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::object-available signal is emitted each time an object is
 found in the DIDL-Lite XML being parsed.
index fab7119..2c30af4 100644 (file)
@@ -109,29 +109,30 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteResource.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>
+  GObject
    +----GUPnPDIDLLiteResource
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteResource.properties"></a><h2>Properties</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--audio-channels" title='The "audio-channels" property'>audio-channels</a>"           <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--bitrate" title='The "bitrate" property'>bitrate</a>"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--bits-per-sample" title='The "bits-per-sample" property'>bits-per-sample</a>"          <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--color-depth" title='The "color-depth" property'>color-depth</a>"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--duration" title='The "duration" property'>duration</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a>                 : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--height" title='The "height" property'>height</a>"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--import-uri" title='The "import-uri" property'>import-uri</a>"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--protection" title='The "protection" property'>protection</a>"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--audio-channels" title='The "audio-channels" property'>audio-channels</a>"           <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--bitrate" title='The "bitrate" property'>bitrate</a>"                  <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--bits-per-sample" title='The "bits-per-sample" property'>bits-per-sample</a>"          <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--color-depth" title='The "color-depth" property'>color-depth</a>"              <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--duration" title='The "duration" property'>duration</a>"                 <span class="type">glong</span>                 : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--height" title='The "height" property'>height</a>"                   <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--import-uri" title='The "import-uri" property'>import-uri</a>"               <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--protection" title='The "protection" property'>protection</a>"               <span class="type">gchar</span>*                : Read / Write
   "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--protocol-info" title='The "protocol-info" property'>protocol-info</a>"            <a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a>*    : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--sample-freq" title='The "sample-freq" property'>sample-freq</a>"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--size" title='The "size" property'>size</a>"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a>                 : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--sample-freq" title='The "sample-freq" property'>sample-freq</a>"              <span class="type">gint</span>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--size" title='The "size" property'>size</a>"                     <span class="type">glong</span>                 : Read / Write
   "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--size64" title='The "size64" property'>size64</a>"                   <span class="type">gint64</span>                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--uri" title='The "uri" property'>uri</a>"                      <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--width" title='The "width" property'>width</a>"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--update-count" title='The "update-count" property'>update-count</a>"             <span class="type">guint</span>                 : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--uri" title='The "uri" property'>uri</a>"                      <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--width" title='The "width" property'>width</a>"                    <span class="type">gint</span>                  : Read / Write
   "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--xml-doc" title='The "xml-doc" property'>xml-doc</a>"                  <a href="../gupnp/GUPnPXMLDoc.html"><span class="type">GUPnPXMLDoc</span></a>*          : Write / Construct Only
-  "<a class="link" href="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--xml-node" title='The "xml-node" property'>xml-node</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="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--xml-node" title='The "xml-node" property'>xml-node</a>"                 <span class="type">gpointer</span>              : Read / Write / Construct Only
 </pre>
 </div>
 <div class="refsect1">
@@ -561,7 +562,7 @@ Get the URI associated with the <em class="parameter"><code>resource</code></em>
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The of URI the <em class="parameter"><code>resource</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The of URI the <em class="parameter"><code>resource</code></em> or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -584,7 +585,7 @@ Get the import URI associated with the <em class="parameter"><code>resource</cod
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The import URI or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The import URI or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -607,7 +608,7 @@ Get the protocol info associated with the <em class="parameter"><code>resource</
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The protocol info associated with the <em class="parameter"><code>resource</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. The
+<td>The protocol info associated with the <em class="parameter"><code>resource</code></em> or <code class="literal">NULL</code>. The
 returned object must not be unrefed. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
 </td>
 </tr>
@@ -768,7 +769,7 @@ Get the protection system used by the <em class="parameter"><code>resource</code
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The protection system in use by the <em class="parameter"><code>resource</code></em> or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>.</td>
+<td>The protection system in use by the <em class="parameter"><code>resource</code></em> or <code class="literal">NULL</code>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -892,7 +893,7 @@ Get the pointer to res node in XML document.
 <a name="GUPnPDIDLLiteResource.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--audio-channels"></a><h3>The <code class="literal">"audio-channels"</code> property</h3>
-<pre class="programlisting">  "audio-channels"           <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "audio-channels"           <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The number of audio channels in this resource.
 </p>
@@ -902,7 +903,7 @@ The number of audio channels in this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--bitrate"></a><h3>The <code class="literal">"bitrate"</code> property</h3>
-<pre class="programlisting">  "bitrate"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "bitrate"                  <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The bitrate of this resource.
 </p>
@@ -912,7 +913,7 @@ The bitrate of this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--bits-per-sample"></a><h3>The <code class="literal">"bits-per-sample"</code> property</h3>
-<pre class="programlisting">  "bits-per-sample"          <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "bits-per-sample"          <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The sample size of this resource.
 </p>
@@ -922,7 +923,7 @@ The sample size of this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--color-depth"></a><h3>The <code class="literal">"color-depth"</code> property</h3>
-<pre class="programlisting">  "color-depth"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "color-depth"              <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The color-depth of this image/video resource.
 </p>
@@ -932,7 +933,7 @@ The color-depth of this image/video resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--duration"></a><h3>The <code class="literal">"duration"</code> property</h3>
-<pre class="programlisting">  "duration"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a>                 : Read / Write</pre>
+<pre class="programlisting">  "duration"                 <span class="type">glong</span>                 : Read / Write</pre>
 <p>
 The duration (in seconds) of this resource.
 </p>
@@ -942,7 +943,7 @@ The duration (in seconds) of this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--height"></a><h3>The <code class="literal">"height"</code> property</h3>
-<pre class="programlisting">  "height"                   <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "height"                   <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The height of this image/video resource.
 </p>
@@ -952,7 +953,7 @@ The height of this image/video resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--import-uri"></a><h3>The <code class="literal">"import-uri"</code> property</h3>
-<pre class="programlisting">  "import-uri"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "import-uri"               <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The Import URI associated with this resource.
 </p>
@@ -961,7 +962,7 @@ The Import URI associated with this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--protection"></a><h3>The <code class="literal">"protection"</code> property</h3>
-<pre class="programlisting">  "protection"               <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "protection"               <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The protection system used for this resource.
 </p>
@@ -978,7 +979,7 @@ The protocol info associated with this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--sample-freq"></a><h3>The <code class="literal">"sample-freq"</code> property</h3>
-<pre class="programlisting">  "sample-freq"              <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "sample-freq"              <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The sample frequency of this resource.
 </p>
@@ -988,7 +989,7 @@ The sample frequency of this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--size"></a><h3>The <code class="literal">"size"</code> property</h3>
-<pre class="programlisting">  "size"                     <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#glong"><span class="type">glong</span></a>                 : Read / Write</pre>
+<pre class="programlisting">  "size"                     <span class="type">glong</span>                 : Read / Write</pre>
 <p>
 The size (in bytes) of this resource.
 </p>
@@ -1007,8 +1008,15 @@ The size (in bytes) of this resource.
 </div>
 <hr>
 <div class="refsect2">
+<a name="GUPnPDIDLLiteResource--update-count"></a><h3>The <code class="literal">"update-count"</code> property</h3>
+<pre class="programlisting">  "update-count"             <span class="type">guint</span>                 : Read / Write</pre>
+<p>The update count of this resource.</p>
+<p>Default value: 0</p>
+</div>
+<hr>
+<div class="refsect2">
 <a name="GUPnPDIDLLiteResource--uri"></a><h3>The <code class="literal">"uri"</code> property</h3>
-<pre class="programlisting">  "uri"                      <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "uri"                      <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The URI associated with this resource.
 </p>
@@ -1017,7 +1025,7 @@ The URI associated with this resource.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--width"></a><h3>The <code class="literal">"width"</code> property</h3>
-<pre class="programlisting">  "width"                    <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>                  : Read / Write</pre>
+<pre class="programlisting">  "width"                    <span class="type">gint</span>                  : Read / Write</pre>
 <p>
 The width of this image/video resource.
 </p>
@@ -1039,7 +1047,7 @@ Internal property.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteResource--xml-node"></a><h3>The <code class="literal">"xml-node"</code> property</h3>
-<pre class="programlisting">  "xml-node"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "xml-node"                 <span class="type">gpointer</span>              : Read / Write / Construct Only</pre>
 <p>
 The pointer to res node in XML document.
 </p>
index b81e34e..68350b3 100644 (file)
@@ -58,15 +58,15 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPDIDLLiteWriter.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>
+  GObject
    +----GUPnPDIDLLiteWriter
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPDIDLLiteWriter.properties"></a><h2>Properties</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPDIDLLiteWriter.html#GUPnPDIDLLiteWriter--language" title='The "language" property'>language</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only
-  "<a class="link" href="GUPnPDIDLLiteWriter.html#GUPnPDIDLLiteWriter--xml-node" title='The "xml-node" property'>xml-node</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read
+  "<a class="link" href="GUPnPDIDLLiteWriter.html#GUPnPDIDLLiteWriter--language" title='The "language" property'>language</a>"                 <span class="type">gchar</span>*                : Read / Write / Construct Only
+  "<a class="link" href="GUPnPDIDLLiteWriter.html#GUPnPDIDLLiteWriter--xml-node" title='The "xml-node" property'>xml-node</a>"                 <span class="type">gpointer</span>              : Read
 </pre>
 </div>
 <div class="refsect1">
@@ -90,7 +90,8 @@ const <span class="returnvalue">char</span> *        <a class="link" href="GUPnP
 <tbody>
 <tr>
 <td><p><span class="term"><em class="parameter"><code>language</code></em> :</span></p></td>
-<td>The language the DIDL-Lite fragment is in, or NULL</td>
+<td>The language the DIDL-Lite fragment is in, or NULL. <span class="annotation">[<acronym title="NULL is ok, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span>
+</td>
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
@@ -210,7 +211,7 @@ Creates a string representation of the DIDL-Lite XML document.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The DIDL-Lite XML string, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><span class="type">g_free</span></a> after usage.</td>
+<td>The DIDL-Lite XML string, or <code class="literal">NULL</code>. <span class="type">g_free</span> after usage.</td>
 </tr>
 </tbody>
 </table></div>
@@ -231,7 +232,7 @@ Get the language the DIDL-Lite fragment is in.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The language of the <em class="parameter"><code>writer</code></em>, or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
+<td>The language of the <em class="parameter"><code>writer</code></em>, or <code class="literal">NULL</code>. <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>
@@ -273,7 +274,7 @@ specification for details on this string.
 <a name="GUPnPDIDLLiteWriter.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteWriter--language"></a><h3>The <code class="literal">"language"</code> property</h3>
-<pre class="programlisting">  "language"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write / Construct Only</pre>
+<pre class="programlisting">  "language"                 <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
 <p>
 The language the DIDL-Lite fragment is in.
 </p>
@@ -282,7 +283,7 @@ The language the DIDL-Lite fragment is in.
 <hr>
 <div class="refsect2">
 <a name="GUPnPDIDLLiteWriter--xml-node"></a><h3>The <code class="literal">"xml-node"</code> property</h3>
-<pre class="programlisting">  "xml-node"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>              : Read</pre>
+<pre class="programlisting">  "xml-node"                 <span class="type">gpointer</span>              : Read</pre>
 <p>
 The pointer to root node in XML document.
 </p>
diff --git a/doc/html/GUPnPFeature.html b/doc/html/GUPnPFeature.html
new file mode 100644 (file)
index 0000000..1a6c24c
--- /dev/null
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPFeature</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP A/V Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP A/V">
+<link rel="prev" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo">
+<link rel="next" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser">
+<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="GUPnPProtocolInfo.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.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 A/V Reference Manual</th>
+<td><a accesskey="n" href="GUPnPFeatureListParser.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPFeature.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPFeature.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPFeature.object-hierarchy" class="shortcut">Object Hierarchy</a>
+                  Â | 
+                  <a href="#GUPnPFeature.properties" class="shortcut">Properties</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPFeature"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPFeature.top_of_page"></a>GUPnPFeature</span></h2>
+<p>GUPnPFeature â€” ContentDirectory feature</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPFeature.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPFeature.html#GUPnPFeature-struct" title="GUPnPFeature">GUPnPFeature</a>;
+const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPFeature.html#gupnp-feature-get-name" title="gupnp_feature_get_name ()">gupnp_feature_get_name</a>              (<em class="parameter"><code><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a> *feature</code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPFeature.html#gupnp-feature-get-version" title="gupnp_feature_get_version ()">gupnp_feature_get_version</a>           (<em class="parameter"><code><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a> *feature</code></em>);
+const <span class="returnvalue">char</span> *        <a class="link" href="GUPnPFeature.html#gupnp-feature-get-object-ids" title="gupnp_feature_get_object_ids ()">gupnp_feature_get_object_ids</a>        (<em class="parameter"><code><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a> *feature</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeature.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  GObject
+   +----GUPnPFeature
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeature.properties"></a><h2>Properties</h2>
+<pre class="synopsis">
+  "<a class="link" href="GUPnPFeature.html#GUPnPFeature--name" title='The "name" property'>name</a>"                     <span class="type">gchar</span>*                : Read / Write / Construct Only
+  "<a class="link" href="GUPnPFeature.html#GUPnPFeature--object-ids" title='The "object-ids" property'>object-ids</a>"               <span class="type">gchar</span>*                : Read / Write / Construct Only
+  "<a class="link" href="GUPnPFeature.html#GUPnPFeature--version" title='The "version" property'>version</a>"                  <span class="type">gchar</span>*                : Read / Write / Construct Only
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeature.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a> respresent a Feature element.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeature.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPFeature-struct"></a><h3>GUPnPFeature</h3>
+<pre class="programlisting">typedef struct _GUPnPFeature GUPnPFeature;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-feature-get-name"></a><h3>gupnp_feature_get_name ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        gupnp_feature_get_name              (<em class="parameter"><code><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a> *feature</code></em>);</pre>
+<p>
+Get the name of the <em class="parameter"><code>feature</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>feature</code></em> :</span></p></td>
+<td><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a></td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The name of the <em class="parameter"><code>feature</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-feature-get-version"></a><h3>gupnp_feature_get_version ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        gupnp_feature_get_version           (<em class="parameter"><code><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a> *feature</code></em>);</pre>
+<p>
+Get the version of the <em class="parameter"><code>feature</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>feature</code></em> :</span></p></td>
+<td><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a></td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The version of the <em class="parameter"><code>feature</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-feature-get-object-ids"></a><h3>gupnp_feature_get_object_ids ()</h3>
+<pre class="programlisting">const <span class="returnvalue">char</span> *        gupnp_feature_get_object_ids        (<em class="parameter"><code><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a> *feature</code></em>);</pre>
+<p>
+Get the object IDs related to the <em class="parameter"><code>feature</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>feature</code></em> :</span></p></td>
+<td><a class="link" href="GUPnPFeature.html" title="GUPnPFeature"><span class="type">GUPnPFeature</span></a></td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The object IDs related to the <em class="parameter"><code>feature</code></em>.</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeature.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GUPnPFeature--name"></a><h3>The <code class="literal">"name"</code> property</h3>
+<pre class="programlisting">  "name"                     <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
+<p>
+The name of this feature.
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPFeature--object-ids"></a><h3>The <code class="literal">"object-ids"</code> property</h3>
+<pre class="programlisting">  "object-ids"               <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
+<p>
+The object IDs related to this feature.
+</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GUPnPFeature--version"></a><h3>The <code class="literal">"version"</code> property</h3>
+<pre class="programlisting">  "version"                  <span class="type">gchar</span>*                : Read / Write / Construct Only</pre>
+<p>
+The version of this feature.
+</p>
+<p>Default value: NULL</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>
+          Generated by GTK-Doc V1.18</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/doc/html/GUPnPFeatureListParser.html b/doc/html/GUPnPFeatureListParser.html
new file mode 100644 (file)
index 0000000..5e2d7eb
--- /dev/null
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>GUPnPFeatureListParser</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
+<link rel="home" href="index.html" title="GUPnP A/V Reference Manual">
+<link rel="up" href="ch01.html" title="GUPnP A/V">
+<link rel="prev" href="GUPnPFeature.html" title="GUPnPFeature">
+<link rel="next" href="ch02.html" title="Error Codes">
+<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="GUPnPFeature.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch01.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 A/V Reference Manual</th>
+<td><a accesskey="n" href="ch02.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+</tr>
+<tr><td colspan="5" class="shortcuts">
+<a href="#GUPnPFeatureListParser.synopsis" class="shortcut">Top</a>
+                  Â | 
+                  <a href="#GUPnPFeatureListParser.description" class="shortcut">Description</a>
+                  Â | 
+                  <a href="#GUPnPFeatureListParser.object-hierarchy" class="shortcut">Object Hierarchy</a>
+</td></tr>
+</table>
+<div class="refentry">
+<a name="GUPnPFeatureListParser"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="GUPnPFeatureListParser.top_of_page"></a>GUPnPFeatureListParser</span></h2>
+<p>GUPnPFeatureListParser â€” FeatureList state variable XML parser</p>
+</td>
+<td valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsynopsisdiv">
+<a name="GUPnPFeatureListParser.synopsis"></a><h2>Synopsis</h2>
+<pre class="synopsis">                    <a class="link" href="GUPnPFeatureListParser.html#GUPnPFeatureListParser-struct" title="GUPnPFeatureListParser">GUPnPFeatureListParser</a>;
+<a class="link" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser"><span class="returnvalue">GUPnPFeatureListParser</span></a> * <a class="link" href="GUPnPFeatureListParser.html#gupnp-feature-list-parser-new" title="gupnp_feature_list_parser_new ()">gupnp_feature_list_parser_new</a>  (<em class="parameter"><code><span class="type">void</span></code></em>);
+<span class="returnvalue">GList</span> *             <a class="link" href="GUPnPFeatureListParser.html#gupnp-feature-list-parser-parse-text" title="gupnp_feature_list_parser_parse_text ()">gupnp_feature_list_parser_parse_text</a>
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser"><span class="type">GUPnPFeatureListParser</span></a> *parser</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *text</code></em>,
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeatureListParser.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="synopsis">
+  GObject
+   +----GUPnPFeatureListParser
+</pre>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeatureListParser.description"></a><h2>Description</h2>
+<p>
+<a class="link" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser"><span class="type">GUPnPFeatureListParser</span></a> parses XML strings from ContentDirectory
+FeatureList state variable.
+</p>
+</div>
+<div class="refsect1">
+<a name="GUPnPFeatureListParser.details"></a><h2>Details</h2>
+<div class="refsect2">
+<a name="GUPnPFeatureListParser-struct"></a><h3>GUPnPFeatureListParser</h3>
+<pre class="programlisting">typedef struct _GUPnPFeatureListParser GUPnPFeatureListParser;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-feature-list-parser-new"></a><h3>gupnp_feature_list_parser_new ()</h3>
+<pre class="programlisting"><a class="link" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser"><span class="returnvalue">GUPnPFeatureListParser</span></a> * gupnp_feature_list_parser_new  (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<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="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser"><span class="type">GUPnPFeatureListParser</span></a> object.</td>
+</tr></tbody>
+</table></div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gupnp-feature-list-parser-parse-text"></a><h3>gupnp_feature_list_parser_parse_text ()</h3>
+<pre class="programlisting"><span class="returnvalue">GList</span> *             gupnp_feature_list_parser_parse_text
+                                                        (<em class="parameter"><code><a class="link" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser"><span class="type">GUPnPFeatureListParser</span></a> *parser</code></em>,
+                                                         <em class="parameter"><code>const <span class="type">char</span> *text</code></em>,
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
+<p>
+Parses <em class="parameter"><code>text</code></em> and returns the list of available features.
+If an error occured <em class="parameter"><code>error</code></em> will be set.
+</p>
+<div class="variablelist"><table border="0">
+<col align="left" valign="top">
+<tbody>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>parser</code></em> :</span></p></td>
+<td>A <a class="link" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser"><span class="type">GUPnPFeatureListParser</span></a>
+</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>text</code></em> :</span></p></td>
+<td>The feature list string to be parsed</td>
+</tr>
+<tr>
+<td><p><span class="term"><em class="parameter"><code>error</code></em> :</span></p></td>
+<td>The location where to store the error information if any, or NULL</td>
+</tr>
+<tr>
+<td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
+<td>The list of
+features or <code class="literal">NULL</code> if an error occured. <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> GUPnPFeature]</span>
+</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
index 5c6c65b..f6f26da 100644 (file)
 <a name="GUPnPLastChangeParser.synopsis"></a><h2>Synopsis</h2>
 <pre class="synopsis">                    <a class="link" href="GUPnPLastChangeParser.html#GUPnPLastChangeParser-struct" title="GUPnPLastChangeParser">GUPnPLastChangeParser</a>;
 <a class="link" href="GUPnPLastChangeParser.html" title="GUPnPLastChangeParser"><span class="returnvalue">GUPnPLastChangeParser</span></a> * <a class="link" href="GUPnPLastChangeParser.html#gupnp-last-change-parser-new" title="gupnp_last_change_parser_new ()">gupnp_last_change_parser_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="GUPnPLastChangeParser.html#gupnp-last-change-parser-parse-last-change-valist" title="gupnp_last_change_parser_parse_last_change_valist ()">gupnp_last_change_parser_parse_last_change_valist</a>
+<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPLastChangeParser.html#gupnp-last-change-parser-parse-last-change-valist" title="gupnp_last_change_parser_parse_last_change_valist ()">gupnp_last_change_parser_parse_last_change_valist</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPLastChangeParser.html" title="GUPnPLastChangeParser"><span class="type">GUPnPLastChangeParser</span></a> *parser</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> instance_id</code></em>,
+                                                         <em class="parameter"><code><span class="type">guint</span> instance_id</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *last_change_xml</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>,
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>,
                                                          <em class="parameter"><code><span class="type">va_list</span> var_args</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="GUPnPLastChangeParser.html#gupnp-last-change-parser-parse-last-change" title="gupnp_last_change_parser_parse_last_change ()">gupnp_last_change_parser_parse_last_change</a>
+<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPLastChangeParser.html#gupnp-last-change-parser-parse-last-change" title="gupnp_last_change_parser_parse_last_change ()">gupnp_last_change_parser_parse_last_change</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPLastChangeParser.html" title="GUPnPLastChangeParser"><span class="type">GUPnPLastChangeParser</span></a> *parser</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> instance_id</code></em>,
+                                                         <em class="parameter"><code><span class="type">guint</span> instance_id</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *last_change_xml</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>,
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>,
                                                          <em class="parameter"><code>...</code></em>);
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPLastChangeParser.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>
+  GObject
    +----GUPnPLastChangeParser
 </pre>
 </div>
@@ -91,11 +91,11 @@ generated by AVTransport and RenderingControl services.
 <hr>
 <div class="refsect2">
 <a name="gupnp-last-change-parser-parse-last-change-valist"></a><h3>gupnp_last_change_parser_parse_last_change_valist ()</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_last_change_parser_parse_last_change_valist
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_last_change_parser_parse_last_change_valist
                                                         (<em class="parameter"><code><a class="link" href="GUPnPLastChangeParser.html" title="GUPnPLastChangeParser"><span class="type">GUPnPLastChangeParser</span></a> *parser</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> instance_id</code></em>,
+                                                         <em class="parameter"><code><span class="type">guint</span> instance_id</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *last_change_xml</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>,
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>,
                                                          <em class="parameter"><code><span class="type">va_list</span> var_args</code></em>);</pre>
 <p>
 See <a class="link" href="GUPnPLastChangeParser.html#gupnp-last-change-parser-parse-last-change" title="gupnp_last_change_parser_parse_last_change ()"><code class="function">gupnp_last_change_parser_parse_last_change()</code></a>; this version takes a
@@ -137,11 +137,11 @@ values should be freed after use</td>
 <hr>
 <div class="refsect2">
 <a name="gupnp-last-change-parser-parse-last-change"></a><h3>gupnp_last_change_parser_parse_last_change ()</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_last_change_parser_parse_last_change
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_last_change_parser_parse_last_change
                                                         (<em class="parameter"><code><a class="link" href="GUPnPLastChangeParser.html" title="GUPnPLastChangeParser"><span class="type">GUPnPLastChangeParser</span></a> *parser</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> instance_id</code></em>,
+                                                         <em class="parameter"><code><span class="type">guint</span> instance_id</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *last_change_xml</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>,
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>,
                                                          <em class="parameter"><code>...</code></em>);</pre>
 <p>
 Parses the xml fragment from a LastChange event.
index cb41175..f852a1d 100644 (file)
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GUPnP A/V Reference Manual">
 <link rel="up" href="ch01.html" title="GUPnP A/V">
 <link rel="prev" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser">
-<link rel="next" href="ch02.html" title="Error Codes">
+<link rel="next" href="GUPnPFeature.html" title="GUPnPFeature">
 <meta name="generator" content="GTK-Doc V1.18 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -18,7 +18,7 @@
 <td><a accesskey="u" href="ch01.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 A/V Reference Manual</th>
-<td><a accesskey="n" href="ch02.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="GUPnPFeature.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
 </tr>
 <tr><td colspan="5" class="shortcuts">
 <a href="#GUPnPProtocolInfo.synopsis" class="shortcut">Top</a>
@@ -47,9 +47,9 @@ enum                <a class="link" href="GUPnPProtocolInfo.html#GUPnPDLNAFlags"
 enum                <a class="link" href="GUPnPProtocolInfo.html#GUPnPDLNAOperation" title="enum GUPnPDLNAOperation">GUPnPDLNAOperation</a>;
 <a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="returnvalue">GUPnPProtocolInfo</span></a> * <a class="link" href="GUPnPProtocolInfo.html#gupnp-protocol-info-new" title="gupnp_protocol_info_new ()">gupnp_protocol_info_new</a>             (<em class="parameter"><code><span class="type">void</span></code></em>);
 <a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="returnvalue">GUPnPProtocolInfo</span></a> * <a class="link" href="GUPnPProtocolInfo.html#gupnp-protocol-info-new-from-string" title="gupnp_protocol_info_new_from_string ()">gupnp_protocol_info_new_from_string</a> (<em class="parameter"><code>const <span class="type">char</span> *protocol_info</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);
 <span class="returnvalue">char</span> *              <a class="link" href="GUPnPProtocolInfo.html#gupnp-protocol-info-to-string" title="gupnp_protocol_info_to_string ()">gupnp_protocol_info_to_string</a>       (<em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info</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="GUPnPProtocolInfo.html#gupnp-protocol-info-is-compatible" title="gupnp_protocol_info_is_compatible ()">gupnp_protocol_info_is_compatible</a>   (<em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info1</code></em>,
+<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPProtocolInfo.html#gupnp-protocol-info-is-compatible" title="gupnp_protocol_info_is_compatible ()">gupnp_protocol_info_is_compatible</a>   (<em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info1</code></em>,
                                                          <em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info2</code></em>);
 <span class="returnvalue">void</span>                <a class="link" href="GUPnPProtocolInfo.html#gupnp-protocol-info-set-protocol" title="gupnp_protocol_info_set_protocol ()">gupnp_protocol_info_set_protocol</a>    (<em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *protocol</code></em>);
@@ -86,7 +86,7 @@ const <span class="returnvalue">char</span> **       <a class="link" href="GUPnP
 <div class="refsect1">
 <a name="GUPnPProtocolInfo.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>
+  GObject
    +----GUPnPProtocolInfo
 </pre>
 </div>
@@ -96,11 +96,11 @@ const <span class="returnvalue">char</span> **       <a class="link" href="GUPnP
   "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--dlna-conversion" title='The "dlna-conversion" property'>dlna-conversion</a>"          <a class="link" href="GUPnPProtocolInfo.html#GUPnPDLNAConversion" title="enum GUPnPDLNAConversion"><span class="type">GUPnPDLNAConversion</span></a>   : Read / Write
   "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--dlna-flags" title='The "dlna-flags" property'>dlna-flags</a>"               <a class="link" href="GUPnPProtocolInfo.html#GUPnPDLNAFlags" title="enum GUPnPDLNAFlags"><span class="type">GUPnPDLNAFlags</span></a>        : Read / Write
   "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--dlna-operation" title='The "dlna-operation" property'>dlna-operation</a>"           <a class="link" href="GUPnPProtocolInfo.html#GUPnPDLNAOperation" title="enum GUPnPDLNAOperation"><span class="type">GUPnPDLNAOperation</span></a>    : Read / Write
-  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--dlna-profile" title='The "dlna-profile" property'>dlna-profile</a>"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--mime-type" title='The "mime-type" property'>mime-type</a>"                <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--network" title='The "network" property'>network</a>"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
-  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--play-speeds" title='The "play-speeds" property'>play-speeds</a>"              <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Boxed-Types.html#GStrv"><span class="type">GStrv</span></a>                 : Read / Write
-  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--protocol" title='The "protocol" property'>protocol</a>"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write
+  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--dlna-profile" title='The "dlna-profile" property'>dlna-profile</a>"             <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--mime-type" title='The "mime-type" property'>mime-type</a>"                <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--network" title='The "network" property'>network</a>"                  <span class="type">gchar</span>*                : Read / Write
+  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--play-speeds" title='The "play-speeds" property'>play-speeds</a>"              <span class="type">GStrv</span>                 : Read / Write
+  "<a class="link" href="GUPnPProtocolInfo.html#GUPnPProtocolInfo--protocol" title='The "protocol" property'>protocol</a>"                 <span class="type">gchar</span>*                : Read / Write
 </pre>
 </div>
 <div class="refsect1">
@@ -291,7 +291,7 @@ The seek operations supported by a resource.
 <div class="refsect2">
 <a name="gupnp-protocol-info-new-from-string"></a><h3>gupnp_protocol_info_new_from_string ()</h3>
 <pre class="programlisting"><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="returnvalue">GUPnPProtocolInfo</span></a> * gupnp_protocol_info_new_from_string (<em class="parameter"><code>const <span class="type">char</span> *protocol_info</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
 <p>
 Parses the <em class="parameter"><code>protocol_info</code></em> string and creates a new <a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> object
 as a result.
@@ -331,7 +331,7 @@ Provides the string representation of <em class="parameter"><code>info</code></e
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>String representation of <em class="parameter"><code>info</code></em>. <a href="http://library.gnome.org/devel/glib/unstable/glib-Memory-Allocation.html#g-free"><span class="type">g_free</span></a> after usage.</td>
+<td>String representation of <em class="parameter"><code>info</code></em>. <span class="type">g_free</span> after usage.</td>
 </tr>
 </tbody>
 </table></div>
@@ -339,7 +339,7 @@ Provides the string representation of <em class="parameter"><code>info</code></e
 <hr>
 <div class="refsect2">
 <a name="gupnp-protocol-info-is-compatible"></a><h3>gupnp_protocol_info_is_compatible ()</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_protocol_info_is_compatible   (<em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info1</code></em>,
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_protocol_info_is_compatible   (<em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info1</code></em>,
                                                          <em class="parameter"><code><a class="link" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo"><span class="type">GUPnPProtocolInfo</span></a> *info2</code></em>);</pre>
 <p>
 Checks if the given protocolInfo string is compatible with <em class="parameter"><code>info</code></em>.
@@ -360,8 +360,8 @@ Checks if the given protocolInfo string is compatible with <em class="parameter"
 <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"><span class="type">TRUE</span></a> if <em class="parameter"><code>protocol_info</code></em> is compatible with <em class="parameter"><code>info</code></em>, otherwise
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><span class="type">FALSE</span></a>.</td>
+<span class="type">TRUE</span> if <em class="parameter"><code>protocol_info</code></em> is compatible with <em class="parameter"><code>info</code></em>, otherwise
+<span class="type">FALSE</span>.</td>
 </tr>
 </tbody>
 </table></div>
@@ -602,7 +602,7 @@ Get the protocol of this info.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The protocol of this info or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. This string should not
+<td>The protocol of this info or <code class="literal">NULL</code>. This string should not
 be freed.</td>
 </tr>
 </tbody>
@@ -625,7 +625,7 @@ Get the network this info is associated with.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The network string or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. This string should not be freed.</td>
+<td>The network string or <code class="literal">NULL</code>. This string should not be freed.</td>
 </tr>
 </tbody>
 </table></div>
@@ -647,7 +647,7 @@ Get the MIME-type of this info.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The MIME-type of this info or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. This string should not
+<td>The MIME-type of this info or <code class="literal">NULL</code>. This string should not
 be freed.</td>
 </tr>
 </tbody>
@@ -671,7 +671,7 @@ Get the DLNA profile of this info.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The DLNA profile of this info or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. This string should
+<td>The DLNA profile of this info or <code class="literal">NULL</code>. This string should
 not be freed.</td>
 </tr>
 </tbody>
@@ -694,7 +694,7 @@ Get the allowed play speeds on this info in the form of array of strings.
 </tr>
 <tr>
 <td><p><span class="term"><span class="emphasis"><em>Returns</em></span> :</span></p></td>
-<td>The allowed play speeds as array of strings or <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. This
+<td>The allowed play speeds as array of strings or <code class="literal">NULL</code>. This
 return array and it's content must not be modified or freed. <span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span>
 </td>
 </tr>
@@ -798,7 +798,7 @@ The DLNA operation flags.
 <hr>
 <div class="refsect2">
 <a name="GUPnPProtocolInfo--dlna-profile"></a><h3>The <code class="literal">"dlna-profile"</code> property</h3>
-<pre class="programlisting">  "dlna-profile"             <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "dlna-profile"             <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The DLNA profile of this info.
 </p>
@@ -807,7 +807,7 @@ The DLNA profile of this info.
 <hr>
 <div class="refsect2">
 <a name="GUPnPProtocolInfo--mime-type"></a><h3>The <code class="literal">"mime-type"</code> property</h3>
-<pre class="programlisting">  "mime-type"                <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "mime-type"                <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The MIME-type of this info.
 </p>
@@ -816,7 +816,7 @@ The MIME-type of this info.
 <hr>
 <div class="refsect2">
 <a name="GUPnPProtocolInfo--network"></a><h3>The <code class="literal">"network"</code> property</h3>
-<pre class="programlisting">  "network"                  <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "network"                  <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The network this info is associated with.
 </p>
@@ -825,7 +825,7 @@ The network this info is associated with.
 <hr>
 <div class="refsect2">
 <a name="GUPnPProtocolInfo--play-speeds"></a><h3>The <code class="literal">"play-speeds"</code> property</h3>
-<pre class="programlisting">  "play-speeds"              <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Boxed-Types.html#GStrv"><span class="type">GStrv</span></a>                 : Read / Write</pre>
+<pre class="programlisting">  "play-speeds"              <span class="type">GStrv</span>                 : Read / Write</pre>
 <p>
 The allowed play speeds on this info in the form of array of
 strings.
@@ -834,7 +834,7 @@ strings.
 <hr>
 <div class="refsect2">
 <a name="GUPnPProtocolInfo--protocol"></a><h3>The <code class="literal">"protocol"</code> property</h3>
-<pre class="programlisting">  "protocol"                 <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>*                : Read / Write</pre>
+<pre class="programlisting">  "protocol"                 <span class="type">gchar</span>*                : Read / Write</pre>
 <p>
 The protocol of this info.
 </p>
index a1def87..8cda766 100644 (file)
 enum                <a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaOp-enum" title="enum GUPnPSearchCriteriaOp">GUPnPSearchCriteriaOp</a>;
 <a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="returnvalue">GUPnPSearchCriteriaParser</span></a> * <a class="link" href="GUPnPSearchCriteriaParser.html#gupnp-search-criteria-parser-new" title="gupnp_search_criteria_parser_new ()">gupnp_search_criteria_parser_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="GUPnPSearchCriteriaParser.html#gupnp-search-criteria-parser-parse-text" title="gupnp_search_criteria_parser_parse_text ()">gupnp_search_criteria_parser_parse_text</a>
+<span class="returnvalue">gboolean</span>            <a class="link" href="GUPnPSearchCriteriaParser.html#gupnp-search-criteria-parser-parse-text" title="gupnp_search_criteria_parser_parse_text ()">gupnp_search_criteria_parser_parse_text</a>
                                                         (<em class="parameter"><code><a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *text</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);
 </pre>
 </div>
 <div class="refsect1">
 <a name="GUPnPSearchCriteriaParser.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>
+  GObject
    +----GUPnPSearchCriteriaParser
 </pre>
 <pre class="synopsis">
@@ -65,11 +65,11 @@ enum                <a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSe
 <div class="refsect1">
 <a name="GUPnPSearchCriteriaParser.signals"></a><h2>Signals</h2>
 <pre class="synopsis">
-  "<a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-begin-parens" title='The "begin-parens" signal'>begin-parens</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="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-conjunction" title='The "conjunction" signal'>conjunction</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="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-disjunction" title='The "disjunction" signal'>disjunction</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="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-end-parens" title='The "end-parens" signal'>end-parens</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="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-expression" title='The "expression" signal'>expression</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="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-begin-parens" title='The "begin-parens" signal'>begin-parens</a>"                                   : <code class="literal">Run Last</code>
+  "<a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-conjunction" title='The "conjunction" signal'>conjunction</a>"                                    : <code class="literal">Run Last</code>
+  "<a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-disjunction" title='The "disjunction" signal'>disjunction</a>"                                    : <code class="literal">Run Last</code>
+  "<a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-end-parens" title='The "end-parens" signal'>end-parens</a>"                                     : <code class="literal">Run Last</code>
+  "<a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaParser-expression" title='The "expression" signal'>expression</a>"                                     : <code class="literal">Run Last</code>
 </pre>
 </div>
 <div class="refsect1">
@@ -184,10 +184,10 @@ The possible operators in SearchCriteria strings.
 <hr>
 <div class="refsect2">
 <a name="gupnp-search-criteria-parser-parse-text"></a><h3>gupnp_search_criteria_parser_parse_text ()</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_search_criteria_parser_parse_text
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            gupnp_search_criteria_parser_parse_text
                                                         (<em class="parameter"><code><a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser</code></em>,
                                                          <em class="parameter"><code>const <span class="type">char</span> *text</code></em>,
-                                                         <em class="parameter"><code><a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
+                                                         <em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
 <p>
 Parses <em class="parameter"><code>text</code></em>, emitting the various defined signals on the way. If an
 error occured <em class="parameter"><code>error</code></em> will be set.
@@ -221,7 +221,7 @@ error occured <em class="parameter"><code>error</code></em> will be set.
 <div class="refsect2">
 <a name="GUPnPSearchCriteriaParser-begin-parens"></a><h3>The <code class="literal">"begin-parens"</code> signal</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser,
-                                                        <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>
+                                                        <span class="type">gpointer</span>                   user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::begin_parens signal is emitted to mark the beginning of a
 parenthetical expression.
@@ -244,7 +244,7 @@ parenthetical expression.
 <div class="refsect2">
 <a name="GUPnPSearchCriteriaParser-conjunction"></a><h3>The <code class="literal">"conjunction"</code> signal</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser,
-                                                        <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>
+                                                        <span class="type">gpointer</span>                   user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::conjuction signal is emitted whenever a conjuction marker
 (and) is parsed.
@@ -267,7 +267,7 @@ The ::conjuction signal is emitted whenever a conjuction marker
 <div class="refsect2">
 <a name="GUPnPSearchCriteriaParser-disjunction"></a><h3>The <code class="literal">"disjunction"</code> signal</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser,
-                                                        <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>
+                                                        <span class="type">gpointer</span>                   user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::disjuction signal is emitted whenever a disjuction marker
 (or&amp;rpar is parsed.
@@ -290,7 +290,7 @@ The ::disjuction signal is emitted whenever a disjuction marker
 <div class="refsect2">
 <a name="GUPnPSearchCriteriaParser-end-parens"></a><h3>The <code class="literal">"end-parens"</code> signal</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser,
-                                                        <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>
+                                                        <span class="type">gpointer</span>                   user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::end_parens signal is emitted to mark the end of a parenthetical
 expression.
@@ -312,15 +312,15 @@ expression.
 <hr>
 <div class="refsect2">
 <a name="GUPnPSearchCriteriaParser-expression"></a><h3>The <code class="literal">"expression"</code> signal</h3>
-<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>            user_function                      (<a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser,
-                                                        <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>                     *property,
+<pre class="programlisting"><span class="returnvalue">gboolean</span>            user_function                      (<a class="link" href="GUPnPSearchCriteriaParser.html" title="GUPnPSearchCriteriaParser"><span class="type">GUPnPSearchCriteriaParser</span></a> *parser,
+                                                        <span class="type">gchar</span>                     *property,
                                                         <a class="link" href="GUPnPSearchCriteriaParser.html#GUPnPSearchCriteriaOp"><span class="type">GUPnPSearchCriteriaOp</span></a>      op,
-                                                        <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a>                     *value,
-                                                        <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>                   error,
-                                                        <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>
+                                                        <span class="type">gchar</span>                     *value,
+                                                        <span class="type">gpointer</span>                   error,
+                                                        <span class="type">gpointer</span>                   user_data)      : <code class="literal">Run Last</code></pre>
 <p>
 The ::expression signal is emitted whenever an expression is parsed.
-Set <em class="parameter"><code>error</code></em> and return <a href="http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> if an error occurred.
+Set <em class="parameter"><code>error</code></em> and return <code class="literal">FALSE</code> if an error occurred.
 </p>
 <div class="variablelist"><table border="0">
 <col align="left" valign="top">
index a5445aa..3559cb5 100644 (file)
@@ -20,7 +20,9 @@
 <td> </td>
 </tr>
 <tr><td colspan="5" class="shortcuts">
-<a class="shortcut" href="#glsE">E</a>
+<a class="shortcut" href="#glsA">A</a>
+                     Â | 
+                   <a class="shortcut" href="#glsE">E</a>
                      Â | 
                    <a class="shortcut" href="#glsT">T</a>
 </td></tr>
 <div class="glossary">
 <div class="titlepage"><div><div><h2 class="title">
 <a name="annotation-glossary"></a>Annotation Glossary</h2></div></div></div>
+<a name="glsA"></a><h3 class="title">A</h3>
+<dt>
+<a name="annotation-glossterm-allow-none"></a>allow-none</dt>
+<dd><p>NULL is ok, both for passing and for returning.</p></dd>
 <a name="glsE"></a><h3 class="title">E</h3>
 <dt>
 <a name="annotation-glossterm-element-type"></a>element-type</dt>
index 58cdd62..0e58fc6 100644 (file)
@@ -21,7 +21,7 @@
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
-<a name="idp5135368"></a>GUPnP A/V</h2></div></div></div>
+<a name="idp102136"></a>GUPnP A/V</h2></div></div></div>
 <div class="toc"><dl>
 <dt>
 <span class="refentrytitle"><a href="GUPnPDIDLLiteParser.html">GUPnPDIDLLiteParser</a></span><span class="refpurpose"> â€” A/V DIDL-Lite XML parser</span>
 <dt>
 <span class="refentrytitle"><a href="GUPnPProtocolInfo.html">GUPnPProtocolInfo</a></span><span class="refpurpose"> â€” UPnP AV ProtocolInfo</span>
 </dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPFeature.html">GUPnPFeature</a></span><span class="refpurpose"> â€” ContentDirectory feature</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPFeatureListParser.html">GUPnPFeatureListParser</a></span><span class="refpurpose"> â€” FeatureList state variable XML parser</span>
+</dt>
 </dl></div>
 </div>
 <div class="footer">
index d1b4d05..3d2a9ce 100644 (file)
@@ -6,14 +6,14 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
 <link rel="home" href="index.html" title="GUPnP A/V Reference Manual">
 <link rel="up" href="index.html" title="GUPnP A/V Reference Manual">
-<link rel="prev" href="GUPnPProtocolInfo.html" title="GUPnPProtocolInfo">
+<link rel="prev" href="GUPnPFeatureListParser.html" title="GUPnPFeatureListParser">
 <link rel="next" href="gupnp-av-Error-codes.html" title="Error codes">
 <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="GUPnPProtocolInfo.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="GUPnPFeatureListParser.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
 <td> </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 A/V Reference Manual</th>
@@ -21,7 +21,7 @@
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
-<a name="idp6951928"></a>Error Codes</h2></div></div></div>
+<a name="idp1251560"></a>Error Codes</h2></div></div></div>
 <div class="toc"><dl><dt>
 <span class="refentrytitle"><a href="gupnp-av-Error-codes.html">Error codes</a></span><span class="refpurpose"> â€” Error domains and codes.</span>
 </dt></dl></div>
index 208e088..9defda9 100644 (file)
@@ -53,13 +53,13 @@ enum                <a class="link" href="gupnp-av-Error-codes.html#GUPnPSearchC
 <pre class="programlisting">#define GUPNP_PROTOCOL_ERROR (gupnp_protocol_error_quark ())
 </pre>
 <p>
-The <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> uniquely used by GUPnP AV protocol related errors.
+The <span class="type">GQuark</span> uniquely used by GUPnP AV protocol related errors.
 </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 <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuark"><span class="type">GQuark</span></a> uniquely used by GUPnP AV protocol related errors.</td>
+<td>a <span class="type">GQuark</span> uniquely used by GUPnP AV protocol related errors.</td>
 </tr></tbody>
 </table></div>
 </div>
@@ -77,7 +77,7 @@ The <a href="http://library.gnome.org/devel/glib/unstable/glib-Quarks.html#GQuar
 } GUPnPProtocolError;
 </pre>
 <p>
-<a href="http://library.gnome.org/devel/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> codes used for errors in the <a class="link" href="gupnp-av-Error-codes.html#GUPNP-PROTOCOL-ERROR:CAPS" title="GUPNP_PROTOCOL_ERROR"><span class="type">GUPNP_PROTOCOL_ERROR</span></a> domain, upon any
+<span class="type">GError</span> codes used for errors in the <a class="link" href="gupnp-av-Error-codes.html#GUPNP-PROTOCOL-ERROR:CAPS" title="GUPNP_PROTOCOL_ERROR"><span class="type">GUPNP_PROTOCOL_ERROR</span></a> domain, upon any
 protocol related errors.
 </p>
 <div class="variablelist"><table border="0">
index c71dfdf..39058c1 100644 (file)
@@ -14,6 +14,8 @@
       <sub name="GUPnPLastChangeParser" link="GUPnPLastChangeParser.html"/>
       <sub name="GUPnPSearchCriteriaParser" link="GUPnPSearchCriteriaParser.html"/>
       <sub name="GUPnPProtocolInfo" link="GUPnPProtocolInfo.html"/>
+      <sub name="GUPnPFeature" link="GUPnPFeature.html"/>
+      <sub name="GUPnPFeatureListParser" link="GUPnPFeatureListParser.html"/>
     </sub>
     <sub name="Error Codes" link="ch02.html">
       <sub name="Error codes" link="gupnp-av-Error-codes.html"/>
@@ -38,7 +40,7 @@
     <keyword type="function" name="gupnp_didl_lite_object_get_parent_id ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-parent-id"/>
     <keyword type="function" name="gupnp_didl_lite_object_get_restricted ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-restricted"/>
     <keyword type="function" name="gupnp_didl_lite_object_get_title ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-title"/>
-    <keyword type="function" name="gupnp_didl_lite_object_get_creator ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creator" deprecated="0.5.3: Use #gupnp_didl_lite_object_get_creators instead."/>
+    <keyword type="function" name="gupnp_didl_lite_object_get_creator ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creator"/>
     <keyword type="function" name="gupnp_didl_lite_object_get_artist ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-artist" deprecated="0.5.3: Use #gupnp_didl_lite_object_get_artists instead."/>
     <keyword type="function" name="gupnp_didl_lite_object_get_author ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-author" deprecated="0.5.3: Use #gupnp_didl_lite_object_get_authors instead."/>
     <keyword type="function" name="gupnp_didl_lite_object_get_creators ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-get-creators"/>
@@ -63,7 +65,7 @@
     <keyword type="function" name="gupnp_didl_lite_object_set_parent_id ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-parent-id"/>
     <keyword type="function" name="gupnp_didl_lite_object_set_restricted ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-restricted"/>
     <keyword type="function" name="gupnp_didl_lite_object_set_title ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-title"/>
-    <keyword type="function" name="gupnp_didl_lite_object_set_creator ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-creator" deprecated="0.5.3: Use #gupnp_didl_lite_object_add_creator instead."/>
+    <keyword type="function" name="gupnp_didl_lite_object_set_creator ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-creator"/>
     <keyword type="function" name="gupnp_didl_lite_object_set_artist ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-artist" deprecated="0.5.3: Use #gupnp_didl_lite_object_add_artist instead."/>
     <keyword type="function" name="gupnp_didl_lite_object_set_author ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-set-author" deprecated="0.5.3: Use #gupnp_didl_lite_object_add_author instead."/>
     <keyword type="function" name="gupnp_didl_lite_object_add_creator ()" link="GUPnPDIDLLiteObject.html#gupnp-didl-lite-object-add-creator"/>
@@ -93,6 +95,7 @@
     <keyword type="property" name="The &quot;restricted&quot; property" link="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--restricted"/>
     <keyword type="property" name="The &quot;title&quot; property" link="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--title"/>
     <keyword type="property" name="The &quot;track-number&quot; property" link="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--track-number"/>
+    <keyword type="property" name="The &quot;update-id&quot; property" link="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--update-id"/>
     <keyword type="property" name="The &quot;upnp-class&quot; property" link="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-class"/>
     <keyword type="property" name="The &quot;upnp-namespace&quot; property" link="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-namespace"/>
     <keyword type="property" name="The &quot;write-status&quot; property" link="GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--write-status"/>
     <keyword type="function" name="gupnp_didl_lite_container_add_search_class ()" link="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-add-search-class"/>
     <keyword type="function" name="gupnp_didl_lite_container_add_search_class_full ()" link="GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-add-search-class-full"/>
     <keyword type="property" name="The &quot;child-count&quot; property" link="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--child-count"/>
+    <keyword type="property" name="The &quot;container-update-id&quot; property" link="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--container-update-id"/>
     <keyword type="property" name="The &quot;searchable&quot; property" link="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--searchable"/>
     <keyword type="property" name="The &quot;storage-used&quot; property" link="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--storage-used"/>
+    <keyword type="property" name="The &quot;total-deleted-child-count&quot; property" link="GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--total-deleted-child-count"/>
     <keyword type="struct" name="GUPnPDIDLLiteItem" link="GUPnPDIDLLiteItem.html#GUPnPDIDLLiteItem-struct"/>
     <keyword type="function" name="gupnp_didl_lite_item_get_ref_id ()" link="GUPnPDIDLLiteItem.html#gupnp-didl-lite-item-get-ref-id"/>
     <keyword type="function" name="gupnp_didl_lite_item_set_ref_id ()" link="GUPnPDIDLLiteItem.html#gupnp-didl-lite-item-set-ref-id"/>
     <keyword type="property" name="The &quot;sample-freq&quot; property" link="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--sample-freq"/>
     <keyword type="property" name="The &quot;size&quot; property" link="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--size"/>
     <keyword type="property" name="The &quot;size64&quot; property" link="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--size64"/>
+    <keyword type="property" name="The &quot;update-count&quot; property" link="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--update-count"/>
     <keyword type="property" name="The &quot;uri&quot; property" link="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--uri"/>
     <keyword type="property" name="The &quot;width&quot; property" link="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--width"/>
     <keyword type="property" name="The &quot;xml-doc&quot; property" link="GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--xml-doc"/>
     <keyword type="property" name="The &quot;network&quot; property" link="GUPnPProtocolInfo.html#GUPnPProtocolInfo--network"/>
     <keyword type="property" name="The &quot;play-speeds&quot; property" link="GUPnPProtocolInfo.html#GUPnPProtocolInfo--play-speeds"/>
     <keyword type="property" name="The &quot;protocol&quot; property" link="GUPnPProtocolInfo.html#GUPnPProtocolInfo--protocol"/>
+    <keyword type="struct" name="GUPnPFeature" link="GUPnPFeature.html#GUPnPFeature-struct"/>
+    <keyword type="function" name="gupnp_feature_get_name ()" link="GUPnPFeature.html#gupnp-feature-get-name"/>
+    <keyword type="function" name="gupnp_feature_get_version ()" link="GUPnPFeature.html#gupnp-feature-get-version"/>
+    <keyword type="function" name="gupnp_feature_get_object_ids ()" link="GUPnPFeature.html#gupnp-feature-get-object-ids"/>
+    <keyword type="property" name="The &quot;name&quot; property" link="GUPnPFeature.html#GUPnPFeature--name"/>
+    <keyword type="property" name="The &quot;object-ids&quot; property" link="GUPnPFeature.html#GUPnPFeature--object-ids"/>
+    <keyword type="property" name="The &quot;version&quot; property" link="GUPnPFeature.html#GUPnPFeature--version"/>
+    <keyword type="struct" name="GUPnPFeatureListParser" link="GUPnPFeatureListParser.html#GUPnPFeatureListParser-struct"/>
+    <keyword type="function" name="gupnp_feature_list_parser_new ()" link="GUPnPFeatureListParser.html#gupnp-feature-list-parser-new"/>
+    <keyword type="function" name="gupnp_feature_list_parser_parse_text ()" link="GUPnPFeatureListParser.html#gupnp-feature-list-parser-parse-text"/>
     <keyword type="macro" name="GUPNP_PROTOCOL_ERROR" link="gupnp-av-Error-codes.html#GUPNP-PROTOCOL-ERROR:CAPS"/>
     <keyword type="macro" name="GUPNP_SEARCH_CRITERIA_PARSER_ERROR" link="gupnp-av-Error-codes.html#GUPNP-SEARCH-CRITERIA-PARSER-ERROR:CAPS"/>
     <keyword type="enum" name="enum GUPnPProtocolError" link="gupnp-av-Error-codes.html#GUPnPProtocolError"/>
index 710865c..1fe4fa9 100644 (file)
 <div class="titlepage">
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GUPnP A/V Reference Manual</p></th></tr></table></div>
-<div><p class="releaseinfo">Version 0.10.3
+<div><p class="releaseinfo">Version 0.11.2
 </p></div>
 <div><p class="copyright">Copyright Â© 2007,2008 OpenedHand LTD</p></div>
 <div><p class="copyright">Copyright Â© 2007,2008 Zeeshan Ali &lt;zeenix@gmail.com&gt;</p></div>
 <div><p class="copyright">Copyright Â© 2009,2010 Nokia Corporation</p></div>
 <div><div class="legalnotice">
-<a name="idp5132224"></a><p>
+<a name="idp1987464"></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
 <dt>
 <span class="refentrytitle"><a href="GUPnPProtocolInfo.html">GUPnPProtocolInfo</a></span><span class="refpurpose"> â€” UPnP AV ProtocolInfo</span>
 </dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPFeature.html">GUPnPFeature</a></span><span class="refpurpose"> â€” ContentDirectory feature</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="GUPnPFeatureListParser.html">GUPnPFeatureListParser</a></span><span class="refpurpose"> â€” FeatureList state variable XML parser</span>
+</dt>
 </dl></dd>
 <dt><span class="chapter"><a href="ch02.html">Error Codes</a></span></dt>
 <dd><dl><dt>
index 8ca8411..cc7090b 100644 (file)
@@ -90,6 +90,7 @@
 <ANCHOR id="GUPnPDIDLLiteObject--restricted" href="gupnp-av/GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--restricted">
 <ANCHOR id="GUPnPDIDLLiteObject--title" href="gupnp-av/GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--title">
 <ANCHOR id="GUPnPDIDLLiteObject--track-number" href="gupnp-av/GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--track-number">
+<ANCHOR id="GUPnPDIDLLiteObject--update-id" href="gupnp-av/GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--update-id">
 <ANCHOR id="GUPnPDIDLLiteObject--upnp-class" href="gupnp-av/GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-class">
 <ANCHOR id="GUPnPDIDLLiteObject--upnp-namespace" href="gupnp-av/GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--upnp-namespace">
 <ANCHOR id="GUPnPDIDLLiteObject--write-status" href="gupnp-av/GUPnPDIDLLiteObject.html#GUPnPDIDLLiteObject--write-status">
 <ANCHOR id="gupnp-didl-lite-container-add-search-class-full" href="gupnp-av/GUPnPDIDLLiteContainer.html#gupnp-didl-lite-container-add-search-class-full">
 <ANCHOR id="GUPnPDIDLLiteContainer.property-details" href="gupnp-av/GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer.property-details">
 <ANCHOR id="GUPnPDIDLLiteContainer--child-count" href="gupnp-av/GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--child-count">
+<ANCHOR id="GUPnPDIDLLiteContainer--container-update-id" href="gupnp-av/GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--container-update-id">
 <ANCHOR id="GUPnPDIDLLiteContainer--searchable" href="gupnp-av/GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--searchable">
 <ANCHOR id="GUPnPDIDLLiteContainer--storage-used" href="gupnp-av/GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--storage-used">
+<ANCHOR id="GUPnPDIDLLiteContainer--total-deleted-child-count" href="gupnp-av/GUPnPDIDLLiteContainer.html#GUPnPDIDLLiteContainer--total-deleted-child-count">
 <ANCHOR id="GUPnPDIDLLiteItem" href="gupnp-av/GUPnPDIDLLiteItem.html">
 <ANCHOR id="GUPnPDIDLLiteItem.synopsis" href="gupnp-av/GUPnPDIDLLiteItem.html#GUPnPDIDLLiteItem.synopsis">
 <ANCHOR id="GUPnPDIDLLiteItem.object-hierarchy" href="gupnp-av/GUPnPDIDLLiteItem.html#GUPnPDIDLLiteItem.object-hierarchy">
 <ANCHOR id="GUPnPDIDLLiteResource--sample-freq" href="gupnp-av/GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--sample-freq">
 <ANCHOR id="GUPnPDIDLLiteResource--size" href="gupnp-av/GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--size">
 <ANCHOR id="GUPnPDIDLLiteResource--size64" href="gupnp-av/GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--size64">
+<ANCHOR id="GUPnPDIDLLiteResource--update-count" href="gupnp-av/GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--update-count">
 <ANCHOR id="GUPnPDIDLLiteResource--uri" href="gupnp-av/GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--uri">
 <ANCHOR id="GUPnPDIDLLiteResource--width" href="gupnp-av/GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--width">
 <ANCHOR id="GUPnPDIDLLiteResource--xml-doc" href="gupnp-av/GUPnPDIDLLiteResource.html#GUPnPDIDLLiteResource--xml-doc">
 <ANCHOR id="GUPnPProtocolInfo--network" href="gupnp-av/GUPnPProtocolInfo.html#GUPnPProtocolInfo--network">
 <ANCHOR id="GUPnPProtocolInfo--play-speeds" href="gupnp-av/GUPnPProtocolInfo.html#GUPnPProtocolInfo--play-speeds">
 <ANCHOR id="GUPnPProtocolInfo--protocol" href="gupnp-av/GUPnPProtocolInfo.html#GUPnPProtocolInfo--protocol">
+<ANCHOR id="GUPnPFeature" href="gupnp-av/GUPnPFeature.html">
+<ANCHOR id="GUPnPFeature.synopsis" href="gupnp-av/GUPnPFeature.html#GUPnPFeature.synopsis">
+<ANCHOR id="GUPnPFeature.object-hierarchy" href="gupnp-av/GUPnPFeature.html#GUPnPFeature.object-hierarchy">
+<ANCHOR id="GUPnPFeature.properties" href="gupnp-av/GUPnPFeature.html#GUPnPFeature.properties">
+<ANCHOR id="GUPnPFeature.description" href="gupnp-av/GUPnPFeature.html#GUPnPFeature.description">
+<ANCHOR id="GUPnPFeature.details" href="gupnp-av/GUPnPFeature.html#GUPnPFeature.details">
+<ANCHOR id="GUPnPFeature-struct" href="gupnp-av/GUPnPFeature.html#GUPnPFeature-struct">
+<ANCHOR id="gupnp-feature-get-name" href="gupnp-av/GUPnPFeature.html#gupnp-feature-get-name">
+<ANCHOR id="gupnp-feature-get-version" href="gupnp-av/GUPnPFeature.html#gupnp-feature-get-version">
+<ANCHOR id="gupnp-feature-get-object-ids" href="gupnp-av/GUPnPFeature.html#gupnp-feature-get-object-ids">
+<ANCHOR id="GUPnPFeature.property-details" href="gupnp-av/GUPnPFeature.html#GUPnPFeature.property-details">
+<ANCHOR id="GUPnPFeature--name" href="gupnp-av/GUPnPFeature.html#GUPnPFeature--name">
+<ANCHOR id="GUPnPFeature--object-ids" href="gupnp-av/GUPnPFeature.html#GUPnPFeature--object-ids">
+<ANCHOR id="GUPnPFeature--version" href="gupnp-av/GUPnPFeature.html#GUPnPFeature--version">
+<ANCHOR id="GUPnPFeatureListParser" href="gupnp-av/GUPnPFeatureListParser.html">
+<ANCHOR id="GUPnPFeatureListParser.synopsis" href="gupnp-av/GUPnPFeatureListParser.html#GUPnPFeatureListParser.synopsis">
+<ANCHOR id="GUPnPFeatureListParser.object-hierarchy" href="gupnp-av/GUPnPFeatureListParser.html#GUPnPFeatureListParser.object-hierarchy">
+<ANCHOR id="GUPnPFeatureListParser.description" href="gupnp-av/GUPnPFeatureListParser.html#GUPnPFeatureListParser.description">
+<ANCHOR id="GUPnPFeatureListParser.details" href="gupnp-av/GUPnPFeatureListParser.html#GUPnPFeatureListParser.details">
+<ANCHOR id="GUPnPFeatureListParser-struct" href="gupnp-av/GUPnPFeatureListParser.html#GUPnPFeatureListParser-struct">
+<ANCHOR id="gupnp-feature-list-parser-new" href="gupnp-av/GUPnPFeatureListParser.html#gupnp-feature-list-parser-new">
+<ANCHOR id="gupnp-feature-list-parser-parse-text" href="gupnp-av/GUPnPFeatureListParser.html#gupnp-feature-list-parser-parse-text">
 <ANCHOR id="gupnp-av-Error-codes" href="gupnp-av/gupnp-av-Error-codes.html">
 <ANCHOR id="gupnp-av-Error-codes.synopsis" href="gupnp-av/gupnp-av-Error-codes.html#gupnp-av-Error-codes.synopsis">
 <ANCHOR id="gupnp-av-Error-codes.description" href="gupnp-av/gupnp-av-Error-codes.html#gupnp-av-Error-codes.description">
 <ANCHOR id="GUPNP-PROTOCOL-ERROR-INVALID-SYNTAX:CAPS" href="gupnp-av/gupnp-av-Error-codes.html#GUPNP-PROTOCOL-ERROR-INVALID-SYNTAX:CAPS">
 <ANCHOR id="GUPNP-PROTOCOL-ERROR-OTHER:CAPS" href="gupnp-av/gupnp-av-Error-codes.html#GUPNP-PROTOCOL-ERROR-OTHER:CAPS">
 <ANCHOR id="GUPnPSearchCriteriaParserError" href="gupnp-av/gupnp-av-Error-codes.html#GUPnPSearchCriteriaParserError">
+<ANCHOR id="annotation-glossterm-allow-none" href="gupnp-av/annotation-glossary.html#annotation-glossterm-allow-none">
 <ANCHOR id="annotation-glossterm-element-type" href="gupnp-av/annotation-glossary.html#annotation-glossterm-element-type">
 <ANCHOR id="annotation-glossterm-transfer container" href="gupnp-av/annotation-glossary.html#annotation-glossterm-transfer container">
 <ANCHOR id="annotation-glossterm-transfer full" href="gupnp-av/annotation-glossary.html#annotation-glossterm-transfer full">
index a3f5a8e..bc859cb 100644 (file)
@@ -1 +1 @@
-0.10.3
+0.11.2
index 55d57e8..2be93ac 100644 (file)
@@ -8,4 +8,4 @@ Description: GObject-based AV specific UPnP library
 Version: @VERSION@
 Libs: ${libdir}/libgupnp-av-1.0.la
 Cflags: -I${includedir}
-Requires: gupnp-1.0
+Requires.private: gupnp-1.0
index 7075ea9..3712259 100644 (file)
@@ -8,4 +8,4 @@ Description: GObject-based AV specific UPnP library
 Version: @VERSION@
 Libs: -L${libdir} -lgupnp-av-1.0
 Cflags: -I${includedir}/gupnp-av-1.0
-Requires: gupnp-1.0
+Requires.private: gupnp-1.0
index 40475ed..8c5ea5c 100644 (file)
@@ -9,7 +9,7 @@
 # age to 0.
 LTVERSION = 2:0:0
 
-AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir)
+AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir) -DDATADIR="\"$(pkgdatadir)\""
 
 libgupnp_av_incdir = $(includedir)/gupnp-av-1.0/libgupnp-av
 
@@ -18,6 +18,7 @@ lib_LTLIBRARIES = libgupnp-av-1.0.la
 libgupnp_av_inc_HEADERS = gupnp-didl-lite-object.h \
                          gupnp-didl-lite-item.h \
                          gupnp-didl-lite-container.h \
+                         gupnp-didl-lite-createclass.h \
                          gupnp-didl-lite-parser.h \
                          gupnp-didl-lite-resource.h \
                          gupnp-didl-lite-descriptor.h \
@@ -26,9 +27,12 @@ libgupnp_av_inc_HEADERS = gupnp-didl-lite-object.h \
                          gupnp-protocol-info.h \
                          gupnp-search-criteria-parser.h \
                          gupnp-last-change-parser.h \
+                         gupnp-feature.h \
+                         gupnp-feature-list-parser.h \
                          gupnp-dlna.h \
                          gupnp-av-error.h \
-                         gupnp-av.h
+                         gupnp-av.h \
+                         gupnp-av-enums.h
 
 
 gupnp-av-marshal.c: gupnp-av-marshal.list
@@ -47,6 +51,8 @@ libgupnp_av_1_0_la_SOURCES = gupnp-didl-lite-object.c \
                             gupnp-didl-lite-object-private.h \
                             gupnp-didl-lite-item.c \
                             gupnp-didl-lite-container.c \
+                            gupnp-didl-lite-createclass.c \
+                            gupnp-didl-lite-createclass-private.h \
                             gupnp-didl-lite-parser.c \
                             gupnp-didl-lite-resource.c \
                             gupnp-didl-lite-resource-private.h \
@@ -58,12 +64,18 @@ libgupnp_av_1_0_la_SOURCES = gupnp-didl-lite-object.c \
                             gupnp-protocol-info.c \
                             gupnp-search-criteria-parser.c \
                             gupnp-last-change-parser.c \
+                            gupnp-feature.c \
+                            gupnp-feature-list-parser.c \
                             gupnp-dlna.c \
                             gupnp-av-error.c \
                             xml-util.c \
                             xml-util.h \
                             gvalue-util.c \
                             gvalue-util.h \
+                            fragment-util.c \
+                            fragment-util.h \
+                            xsd-data.c \
+                            xsd-data.h \
                             $(BUILT_SOURCES)
 
 libgupnp_av_1_0_la_LIBADD = $(LIBGUPNP_LIBS)
@@ -76,6 +88,8 @@ INTROSPECTION_SCANNER_ARGS = --warn-all --add-include-path=$(srcdir)
 INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
 
 if HAVE_INTROSPECTION
+export GUPNP_AV_DATADIR := $(top_srcdir)/data
+
 introspection_sources = \
            $(addprefix $(top_srcdir)/libgupnp-av/, \
                        $(libgupnp_av_inc_HEADERS)) \
@@ -87,9 +101,12 @@ introspection_sources = \
            $(top_srcdir)/libgupnp-av/gupnp-didl-lite-descriptor.c \
            $(top_srcdir)/libgupnp-av/gupnp-didl-lite-contributor.c \
            $(top_srcdir)/libgupnp-av/gupnp-didl-lite-writer.c \
+           $(top_srcdir)/libgupnp-av/gupnp-didl-lite-createclass.c \
            $(top_srcdir)/libgupnp-av/gupnp-protocol-info.c \
            $(top_srcdir)/libgupnp-av/gupnp-search-criteria-parser.c \
            $(top_srcdir)/libgupnp-av/gupnp-last-change-parser.c \
+           $(top_srcdir)/libgupnp-av/gupnp-feature.c \
+           $(top_srcdir)/libgupnp-av/gupnp-feature-list-parser.c \
            $(top_srcdir)/libgupnp-av/gupnp-dlna.c \
            $(top_srcdir)/libgupnp-av/gupnp-av-error.c
 
@@ -97,14 +114,15 @@ GUPnPAV-1.0.gir: libgupnp-av-1.0.la
 GUPnPAV_1_0_gir_INCLUDES = GObject-2.0 GSSDP-1.0 Soup-2.4 libxml2-2.0 GUPnP-1.0
 GUPnPAV_1_0_gir_CFLAGS = $(AM_CFLAGS)
 GUPnPAV_1_0_gir_LIBS = libgupnp-av-1.0.la
+GUPnPAV_1_0_gir_NAMESPACE = GUPnPAV
 GUPnPAV_1_0_gir_SCANNERFLAGS = --identifier-prefix=GUPnP --symbol-prefix=gupnp --pkg-export=gupnp-av-1.0
 GUPnPAV_1_0_gir_FILES = $(introspection_sources)
 INTROSPECTION_GIRS += GUPnPAV-1.0.gir
 
-girdir = $(INTROSPECTION_GIRDIR)
+girdir = $(datadir)/gir-1.0
 gir_DATA = $(INTROSPECTION_GIRS)
 
-typelibdir = $(INTROSPECTION_TYPELIBDIR)
+typelibdir = $(libdir)/girepository-1.0
 typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 endif
 
index 4b8de7c..52b1c5c 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -45,7 +62,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -87,11 +104,13 @@ libgupnp_av_1_0_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
 am__objects_1 = gupnp-av-marshal.lo
 am_libgupnp_av_1_0_la_OBJECTS = gupnp-didl-lite-object.lo \
        gupnp-didl-lite-item.lo gupnp-didl-lite-container.lo \
-       gupnp-didl-lite-parser.lo gupnp-didl-lite-resource.lo \
-       gupnp-didl-lite-descriptor.lo gupnp-didl-lite-contributor.lo \
-       gupnp-didl-lite-writer.lo gupnp-protocol-info.lo \
-       gupnp-search-criteria-parser.lo gupnp-last-change-parser.lo \
-       gupnp-dlna.lo gupnp-av-error.lo xml-util.lo gvalue-util.lo \
+       gupnp-didl-lite-createclass.lo gupnp-didl-lite-parser.lo \
+       gupnp-didl-lite-resource.lo gupnp-didl-lite-descriptor.lo \
+       gupnp-didl-lite-contributor.lo gupnp-didl-lite-writer.lo \
+       gupnp-protocol-info.lo gupnp-search-criteria-parser.lo \
+       gupnp-last-change-parser.lo gupnp-feature.lo \
+       gupnp-feature-list-parser.lo gupnp-dlna.lo gupnp-av-error.lo \
+       xml-util.lo gvalue-util.lo fragment-util.lo xsd-data.lo \
        $(am__objects_1)
 libgupnp_av_1_0_la_OBJECTS = $(am_libgupnp_av_1_0_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
@@ -129,6 +148,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
 SOURCES = $(libgupnp_av_1_0_la_SOURCES)
 DIST_SOURCES = $(libgupnp_av_1_0_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 DATA = $(gir_DATA) $(typelib_DATA)
 HEADERS = $(libgupnp_av_inc_HEADERS)
 ETAGS = etags
@@ -216,6 +240,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -280,12 +305,13 @@ top_srcdir = @top_srcdir@
 # If any interfaces have been removed since the last public release, then set
 # age to 0.
 LTVERSION = 2:0:0
-AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir)
+AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir) -DDATADIR="\"$(pkgdatadir)\""
 libgupnp_av_incdir = $(includedir)/gupnp-av-1.0/libgupnp-av
 lib_LTLIBRARIES = libgupnp-av-1.0.la
 libgupnp_av_inc_HEADERS = gupnp-didl-lite-object.h \
                          gupnp-didl-lite-item.h \
                          gupnp-didl-lite-container.h \
+                         gupnp-didl-lite-createclass.h \
                          gupnp-didl-lite-parser.h \
                          gupnp-didl-lite-resource.h \
                          gupnp-didl-lite-descriptor.h \
@@ -294,9 +320,12 @@ libgupnp_av_inc_HEADERS = gupnp-didl-lite-object.h \
                          gupnp-protocol-info.h \
                          gupnp-search-criteria-parser.h \
                          gupnp-last-change-parser.h \
+                         gupnp-feature.h \
+                         gupnp-feature-list-parser.h \
                          gupnp-dlna.h \
                          gupnp-av-error.h \
-                         gupnp-av.h
+                         gupnp-av.h \
+                         gupnp-av-enums.h
 
 BUILT_SOURCES = gupnp-av-marshal.c gupnp-av-marshal.h
 libgupnp_av_1_0_la_LDFLAGS = -version-info $(LTVERSION) -no-undefined
@@ -304,6 +333,8 @@ libgupnp_av_1_0_la_SOURCES = gupnp-didl-lite-object.c \
                             gupnp-didl-lite-object-private.h \
                             gupnp-didl-lite-item.c \
                             gupnp-didl-lite-container.c \
+                            gupnp-didl-lite-createclass.c \
+                            gupnp-didl-lite-createclass-private.h \
                             gupnp-didl-lite-parser.c \
                             gupnp-didl-lite-resource.c \
                             gupnp-didl-lite-resource-private.h \
@@ -315,12 +346,18 @@ libgupnp_av_1_0_la_SOURCES = gupnp-didl-lite-object.c \
                             gupnp-protocol-info.c \
                             gupnp-search-criteria-parser.c \
                             gupnp-last-change-parser.c \
+                            gupnp-feature.c \
+                            gupnp-feature-list-parser.c \
                             gupnp-dlna.c \
                             gupnp-av-error.c \
                             xml-util.c \
                             xml-util.h \
                             gvalue-util.c \
                             gvalue-util.h \
+                            fragment-util.c \
+                            fragment-util.h \
+                            xsd-data.c \
+                            xsd-data.h \
                             $(BUILT_SOURCES)
 
 libgupnp_av_1_0_la_LIBADD = $(LIBGUPNP_LIBS)
@@ -339,20 +376,24 @@ INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-didl-lite-descriptor.c \
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-didl-lite-contributor.c \
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-didl-lite-writer.c \
+@HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-didl-lite-createclass.c \
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-protocol-info.c \
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-search-criteria-parser.c \
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-last-change-parser.c \
+@HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-feature.c \
+@HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-feature-list-parser.c \
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-dlna.c \
 @HAVE_INTROSPECTION_TRUE@          $(top_srcdir)/libgupnp-av/gupnp-av-error.c
 
 @HAVE_INTROSPECTION_TRUE@GUPnPAV_1_0_gir_INCLUDES = GObject-2.0 GSSDP-1.0 Soup-2.4 libxml2-2.0 GUPnP-1.0
 @HAVE_INTROSPECTION_TRUE@GUPnPAV_1_0_gir_CFLAGS = $(AM_CFLAGS)
 @HAVE_INTROSPECTION_TRUE@GUPnPAV_1_0_gir_LIBS = libgupnp-av-1.0.la
+@HAVE_INTROSPECTION_TRUE@GUPnPAV_1_0_gir_NAMESPACE = GUPnPAV
 @HAVE_INTROSPECTION_TRUE@GUPnPAV_1_0_gir_SCANNERFLAGS = --identifier-prefix=GUPnP --symbol-prefix=gupnp --pkg-export=gupnp-av-1.0
 @HAVE_INTROSPECTION_TRUE@GUPnPAV_1_0_gir_FILES = $(introspection_sources)
-@HAVE_INTROSPECTION_TRUE@girdir = $(INTROSPECTION_GIRDIR)
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
 @HAVE_INTROSPECTION_TRUE@gir_DATA = $(INTROSPECTION_GIRS)
-@HAVE_INTROSPECTION_TRUE@typelibdir = $(INTROSPECTION_TYPELIBDIR)
+@HAVE_INTROSPECTION_TRUE@typelibdir = $(libdir)/girepository-1.0
 @HAVE_INTROSPECTION_TRUE@typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 CLEANFILES = $(BUILT_SOURCES) $(gir_DATA) $(typelib_DATA)
 DISTCLEANFILES = $(BUILT_SOURCES)
@@ -394,7 +435,6 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
        @$(NORMAL_INSTALL)
-       test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
        @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
        list2=; for p in $$list; do \
          if test -f $$p; then \
@@ -402,6 +442,8 @@ install-libLTLIBRARIES: $(lib_LTLIBRARIES)
          else :; fi; \
        done; \
        test -z "$$list2" || { \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
          echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
          $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
        }
@@ -432,10 +474,12 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fragment-util.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-av-error.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-av-marshal.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-container.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-contributor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-createclass.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-descriptor.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-item.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-object.Plo@am__quote@
@@ -443,11 +487,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-resource.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-didl-lite-writer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-dlna.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-feature-list-parser.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-feature.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-last-change-parser.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-protocol-info.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gupnp-search-criteria-parser.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gvalue-util.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml-util.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xsd-data.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -477,8 +524,11 @@ clean-libtool:
        -rm -rf .libs _libs
 install-girDATA: $(gir_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)"
        @list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -495,8 +545,11 @@ uninstall-girDATA:
        dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir)
 install-typelibDATA: $(typelib_DATA)
        @$(NORMAL_INSTALL)
-       test -z "$(typelibdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibdir)"
        @list='$(typelib_DATA)'; test -n "$(typelibdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(typelibdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(typelibdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -513,8 +566,11 @@ uninstall-typelibDATA:
        dir='$(DESTDIR)$(typelibdir)'; $(am__uninstall_files_from_dir)
 install-libgupnp_av_incHEADERS: $(libgupnp_av_inc_HEADERS)
        @$(NORMAL_INSTALL)
-       test -z "$(libgupnp_av_incdir)" || $(MKDIR_P) "$(DESTDIR)$(libgupnp_av_incdir)"
        @list='$(libgupnp_av_inc_HEADERS)'; test -n "$(libgupnp_av_incdir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(libgupnp_av_incdir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(libgupnp_av_incdir)" || exit 1; \
+       fi; \
        for p in $$list; do \
          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
          echo "$$d$$p"; \
@@ -758,6 +814,8 @@ gupnp-av-marshal.h: gupnp-av-marshal.list
 
 -include $(INTROSPECTION_MAKEFILE)
 
+@HAVE_INTROSPECTION_TRUE@export GUPNP_AV_DATADIR := $(top_srcdir)/data
+
 @HAVE_INTROSPECTION_TRUE@GUPnPAV-1.0.gir: libgupnp-av-1.0.la
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/libgupnp-av/fragment-util.c b/libgupnp-av/fragment-util.c
new file mode 100644 (file)
index 0000000..32792ec
--- /dev/null
@@ -0,0 +1,795 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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 <stdarg.h>
+#include <libxml/parserInternals.h>
+
+#include "fragment-util.h"
+#include "xml-util.h"
+
+typedef struct {
+        gchar *node_name;
+        gchar *attribute_name;
+} NodeDiff;
+
+static NodeDiff *
+node_diff_new (const xmlChar *node_name,
+               const xmlChar *attribute_name)
+{
+        NodeDiff *diff = g_slice_new (NodeDiff);
+
+        diff->node_name = g_strdup ((gchar *) node_name);
+        diff->attribute_name = g_strdup ((gchar *) attribute_name);
+
+        return diff;
+}
+
+static void
+node_diff_free (NodeDiff *diff)
+{
+        if (diff != NULL) {
+                g_free (diff->node_name);
+                g_free (diff->attribute_name);
+                g_slice_free (NodeDiff, diff);
+        }
+}
+
+static GList *
+get_toplevel_changes (xmlNodePtr current_node,
+                      xmlNodePtr new_node)
+{
+        xmlAttrPtr attribute;
+        GHashTable *current_attributes = xml_util_get_attributes_map
+                                        (current_node);
+        GList *changes = NULL;
+        const xmlChar *name = new_node->name;
+
+        /* compare attributes */
+        for (attribute = new_node->properties;
+             attribute != NULL;
+             attribute = attribute->next) {
+                const xmlChar *value = NULL;
+                const xmlChar *key = attribute->name;
+                gboolean differs = FALSE;
+
+                if (g_hash_table_lookup_extended (current_attributes,
+                                                  key,
+                                                  NULL,
+                                                  (gpointer *) &value)) {
+                        if (xmlStrcmp (value, attribute->children->content))
+                                differs = TRUE;
+                        g_hash_table_remove (current_attributes, key);
+                } else
+                        differs = TRUE;
+                if (differs)
+                        changes = g_list_prepend (changes,
+                                                  node_diff_new (name,
+                                                                 key));
+        }
+
+        if (g_hash_table_size (current_attributes) > 0) {
+                GHashTableIter iter;
+                xmlChar *key = NULL;
+
+                g_hash_table_iter_init (&iter, current_attributes);
+                while (g_hash_table_iter_next (&iter,
+                                               (gpointer *) &key,
+                                               NULL))
+                        changes = g_list_prepend (changes, node_diff_new (name,
+                                                                          key));
+        }
+
+        g_hash_table_unref (current_attributes);
+
+        return changes;
+}
+
+static gboolean
+is_read_only (const gchar *changed_element,
+              const gchar *changed_attribute)
+{
+        static GHashTable *readonly_props = NULL;
+        static gsize readonly_props_loaded = 0;
+
+        if (g_once_init_enter (&readonly_props_loaded)) {
+                readonly_props = g_hash_table_new (g_str_hash,
+                                                   g_str_equal);
+
+                g_hash_table_add (readonly_props, "@id");
+                g_hash_table_add (readonly_props, "@parentID");
+                g_hash_table_add (readonly_props, "@refID");
+                g_hash_table_add (readonly_props, "@restricted");
+                g_hash_table_add (readonly_props, "@searchable");
+                g_hash_table_add (readonly_props, "@childCount");
+                g_hash_table_add (readonly_props, "searchClass");
+                g_hash_table_add (readonly_props, "searchClass@name");
+                g_hash_table_add (readonly_props, "searchClass@includeDerived");
+                g_hash_table_add (readonly_props, "createClass");
+                g_hash_table_add (readonly_props, "createClass@name");
+                g_hash_table_add (readonly_props, "createClass@includeDerived");
+                g_hash_table_add (readonly_props, "writeStatus");
+                g_hash_table_add (readonly_props, "res@importUri");
+                g_hash_table_add (readonly_props, "storageTotal");
+                g_hash_table_add (readonly_props, "storageUsed");
+                g_hash_table_add (readonly_props, "storageFree");
+                g_hash_table_add (readonly_props, "storageMaxPartition");
+                g_hash_table_add (readonly_props, "storageMedium");
+                g_hash_table_add (readonly_props, "playbackCount");
+                g_hash_table_add (readonly_props, "srsRecordScheduleID");
+                g_hash_table_add (readonly_props, "srsRecordTaskID");
+                g_hash_table_add (readonly_props, "price");
+                g_hash_table_add (readonly_props, "price@currency");
+                g_hash_table_add (readonly_props, "payPerView");
+                g_hash_table_add (readonly_props, "dateTimeRange");
+                g_hash_table_add (readonly_props,
+                                  "dateTimeRange@daylightSaving");
+                g_hash_table_add (readonly_props, "signalStrength");
+                g_hash_table_add (readonly_props, "signalLocked");
+                g_hash_table_add (readonly_props, "tuned");
+                g_hash_table_add (readonly_props, "containerUpdateID");
+                g_hash_table_add (readonly_props, "objectUpdateID");
+                g_hash_table_add (readonly_props, "totalDeletedChildCount");
+                g_hash_table_add (readonly_props, "res@updateCount");
+                g_once_init_leave (&readonly_props_loaded, 1);
+        }
+        if (changed_element != NULL) {
+                if (changed_attribute != NULL) {
+                        gchar *test_prop = g_strdup_printf ("%s@%s",
+                                                            changed_element,
+                                                            changed_attribute);
+                        gboolean result = g_hash_table_contains (readonly_props,
+                                                                 test_prop);
+
+                        g_free (test_prop);
+                        if (result)
+                                return TRUE;
+                        test_prop = g_strdup_printf ("@%s", changed_attribute);
+                        result = g_hash_table_contains (readonly_props,
+                                                        test_prop);
+                        g_free (test_prop);
+                        if (result)
+                                return TRUE;
+                }
+
+                return g_hash_table_contains (readonly_props, changed_element);
+        }
+
+        return FALSE;
+}
+
+static gboolean
+is_any_change_read_only (xmlNodePtr current_node,
+                         xmlNodePtr new_node)
+{
+        GList *changes = get_toplevel_changes (current_node, new_node);
+        GList *iter;
+        gboolean read_only = FALSE;
+
+        for (iter = changes; iter != NULL; iter = iter->next) {
+                NodeDiff *diff = (NodeDiff *) iter->data;
+
+                if (is_read_only (diff->node_name,
+                                  diff->attribute_name)) {
+                        read_only = TRUE;
+
+                        break;
+                }
+        }
+
+        if (changes != NULL)
+                g_list_free_full (changes, (GDestroyNotify) node_diff_free);
+        return read_only;
+}
+
+static GUPnPDIDLLiteFragmentResult
+apply_temporary_modification (DocNode    *modified,
+                              xmlNodePtr  current_node,
+                              xmlNodePtr  new_node,
+                              XSDData    *xsd_data)
+{
+        xmlNodePtr mod_cur_node = xml_util_find_node (modified->node,
+                                                      current_node);
+        xmlNodePtr new_node_copy = xml_util_copy_node (new_node);
+
+        if (mod_cur_node == NULL) {
+                return GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+        }
+
+        xmlUnlinkNode (new_node_copy);
+        mod_cur_node = xmlReplaceNode (mod_cur_node, new_node_copy);
+        xmlUnlinkNode (mod_cur_node);
+        xmlFreeNode (mod_cur_node);
+
+        if (!xsd_data_validate_doc (xsd_data, modified->doc))
+                return GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_INVALID;
+
+        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK;
+}
+
+static GUPnPDIDLLiteFragmentResult
+apply_temporary_addition (DocNode    *modified,
+                          xmlNodePtr  sibling,
+                          xmlNodePtr  new_node,
+                          XSDData    *xsd_data)
+{
+        xmlNodePtr mod_sibling;
+        xmlNodePtr new_node_copy = xml_util_copy_node (new_node);
+
+        if (sibling->doc == modified->doc)
+                mod_sibling = sibling;
+        else
+                mod_sibling = xml_util_find_node (modified->node, sibling);
+
+        if (mod_sibling == NULL)
+                return GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+
+        xmlUnlinkNode (new_node_copy);
+
+        if (xmlAddNextSibling (mod_sibling, new_node_copy) == NULL) {
+                xmlFreeNode (new_node_copy);
+
+                return GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+        }
+
+        if (!xsd_data_validate_doc (xsd_data, modified->doc))
+                return GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_INVALID;
+
+        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK;
+}
+
+static GUPnPDIDLLiteFragmentResult
+apply_temporary_removal (DocNode    *modified,
+                         xmlNodePtr  current_node,
+                         XSDData    *xsd_data)
+{
+        xmlNodePtr mod_cur_node = xml_util_find_node (modified->node,
+                                                      current_node);
+
+        if (mod_cur_node == NULL)
+                return GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+
+        xmlUnlinkNode (mod_cur_node);
+        xmlFreeNode (mod_cur_node);
+        if (!xsd_data_validate_doc (xsd_data, modified->doc))
+                /* not sure if this is correct */
+                return GUPNP_DIDL_LITE_FRAGMENT_RESULT_REQUIRED_TAG;
+
+        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK;
+}
+
+typedef struct {
+        gboolean required;
+        GHashTable* required_dep_props; /* string set */
+        GHashTable* required_indep_props; /* string to indep prop */
+} IndependentProperty;
+
+static void
+independent_property_free (IndependentProperty *indep)
+{
+        if (indep != NULL) {
+                g_hash_table_unref (indep->required_dep_props);
+                g_hash_table_unref (indep->required_indep_props);
+                g_slice_free (IndependentProperty, indep);
+        }
+}
+
+static IndependentProperty *
+independent_property_new (gboolean required)
+{
+        IndependentProperty *indep = g_slice_new (IndependentProperty);
+
+        indep->required = required;
+        indep->required_dep_props = g_hash_table_new_full (g_str_hash,
+                                                           g_str_equal,
+                                                           g_free,
+                                                           NULL);
+        indep->required_indep_props = g_hash_table_new_full
+                                   (g_str_hash,
+                                    g_str_equal,
+                                    g_free,
+                                    (GDestroyNotify) independent_property_free);
+
+        return indep;
+}
+
+static void
+insert_indep_prop (GHashTable          *props,
+                   gchar               *name,
+                   IndependentProperty *prop)
+{
+        g_hash_table_insert (props, g_strdup (name), prop);
+}
+
+static void
+insert_indep_prop_to_indep (IndependentProperty *prop,
+                            gchar               *name,
+                            IndependentProperty *req_prop)
+{
+        insert_indep_prop (prop->required_indep_props, name, req_prop);
+}
+
+static void
+add_dep_prop (IndependentProperty *indep,
+              gchar               *name)
+{
+        g_hash_table_add (indep->required_dep_props, g_strdup (name));
+}
+
+static IndependentProperty *
+create_prop_with_required_dep_props (gboolean  required,
+                                     gchar    *dep_prop,
+                                     ...)
+{
+        IndependentProperty *indep = independent_property_new (required);
+
+        if (dep_prop != NULL) {
+                va_list var_args;
+                gchar *name = dep_prop;
+
+                va_start (var_args, dep_prop);
+                do {
+                        add_dep_prop (indep, name);
+                        name = va_arg (var_args, gchar *);
+                } while (name != NULL);
+                va_end (var_args);
+        }
+
+        return indep;
+}
+
+static IndependentProperty *
+create_foreign_metadata_props (void)
+{
+        IndependentProperty *fm = independent_property_new (FALSE);
+        IndependentProperty *other;
+
+        add_dep_prop (fm, "type");
+
+        other = independent_property_new (TRUE);
+        insert_indep_prop_to_indep (fm, "fmId", other);
+
+        other = independent_property_new (TRUE);
+        insert_indep_prop_to_indep (fm, "fmClass", other);
+
+        other = independent_property_new (TRUE);
+        insert_indep_prop_to_indep (fm, "fmProvider", other);
+
+        other = independent_property_new (TRUE);
+        add_dep_prop (other, "xmlFlag");
+        insert_indep_prop_to_indep (fm, "fmBody", other);
+
+        return fm;
+}
+
+static GHashTable *
+get_required_properties (void)
+{
+        static GHashTable *required_props = NULL;
+        static gsize required_props_loaded = 0;
+
+        if (g_once_init_enter (&required_props_loaded)) {
+                required_props = g_hash_table_new_full
+                                   (g_str_hash,
+                                    g_str_equal,
+                                    g_free,
+                                    (GDestroyNotify) independent_property_free);
+
+                insert_indep_prop (required_props,
+                                   "",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "id",
+                                         "parentID",
+                                         "restricted",
+                                         NULL));
+
+                insert_indep_prop (required_props,
+                                   "title",
+                                   independent_property_new (TRUE));
+                insert_indep_prop (required_props,
+                                   "class",
+                                   independent_property_new (TRUE));
+
+                insert_indep_prop (required_props,
+                                   "res",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "protocolInfo",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "programID",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "type",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "seriesID",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "type",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "channelID",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "type",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "programCode",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "type",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "channelGroupName",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "id",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "price",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "currency",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "desc",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "nameSpace",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "deviceUDN",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "serviceType",
+                                         "serviceId",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "stateVariableCollection",
+                                   create_prop_with_required_dep_props
+                                        (FALSE,
+                                         "serviceName",
+                                         "rcsInstanceType",
+                                         NULL));
+                insert_indep_prop (required_props,
+                                   "foreignMetadata",
+                                   create_foreign_metadata_props ());
+                g_once_init_leave (&required_props_loaded, 1);
+        }
+
+        return required_props;
+}
+
+static gboolean
+is_required (const xmlChar *changed_element,
+             const xmlChar *changed_attribute)
+{
+        GHashTable *required_props = get_required_properties ();
+
+        if (changed_element != NULL) {
+                IndependentProperty *toplevel_prop = g_hash_table_lookup
+                                        (required_props,
+                                         "");
+                IndependentProperty *this_prop = g_hash_table_lookup
+                                        (required_props,
+                                         (gpointer) changed_element);
+
+                if (changed_attribute != NULL) {
+                        if (g_hash_table_contains
+                                        (toplevel_prop->required_dep_props,
+                                         changed_attribute))
+                                return TRUE;
+                        if (g_hash_table_contains
+                                        (this_prop->required_dep_props,
+                                         changed_attribute))
+                                return TRUE;
+                }
+                if (g_hash_table_contains (toplevel_prop->required_indep_props,
+                                           changed_element))
+                                return TRUE;
+                /* TODO: check if changed element is not a required
+                 * property of its parent element. That needs some
+                 * additions in IndepependentProperty.
+                 */
+        }
+
+        return FALSE;
+}
+
+static GUPnPDIDLLiteFragmentResult
+new_doc_is_valid_modification (DocNode   *modified,
+                               xmlDocPtr  current_doc,
+                               xmlDocPtr  new_doc,
+                               XSDData   *xsd_data)
+{
+        xmlNodePtr current_node = current_doc->children->children;
+        xmlNodePtr new_node = new_doc->children->children;
+        xmlNodePtr last_sibling = NULL;
+
+        while (current_node != NULL && new_node != NULL) {
+                GUPnPDIDLLiteFragmentResult result;
+                xmlNodePtr temp_current_node = current_node;
+                xmlNodePtr temp_new_node = new_node;
+
+                last_sibling = new_node;
+                /* We can't put this line into for instruction,
+                 * because new_node could be unlinked from its
+                 * document and put into another one in
+                 * apply_temporary_modification. We have to get its
+                 * sibling before that could happen.
+                 */
+                new_node = new_node->next;
+                current_node = current_node->next;
+                if (xml_util_node_deep_equal (temp_current_node, temp_new_node))
+                        /* This is just a context, skip the checks. */
+                        continue;
+                if (xmlStrcmp (temp_current_node->name, temp_new_node->name))
+                        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_INVALID;
+                if (is_any_change_read_only (temp_current_node, temp_new_node))
+                        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_READONLY_TAG;
+                result = apply_temporary_modification (modified,
+                                                       temp_current_node,
+                                                       temp_new_node,
+                                                       xsd_data);
+                if (result != GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK)
+                        return result;
+        }
+        if (last_sibling == NULL) {
+                if (modified->node->children != NULL)
+                        last_sibling = modified->node->last;
+                else
+                        /* We expect that modified object has some
+                         * required tags like <upnp:class> or
+                         * <dc:title>.
+                         */
+                        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+        }
+        /* If there are some more nodes in current fragment then it
+         * means they are going to be removed. Check against required
+         * or read-only tag removal.
+         */
+        while (current_node != NULL) {
+                GUPnPDIDLLiteFragmentResult result;
+                xmlNodePtr temp_node = current_node;
+
+                current_node = current_node->next;
+                /* TODO: should we check if there are some readonly
+                 * attributes when we remove whole element?
+                 */
+                if (is_read_only ((gchar *) temp_node->name, NULL))
+                        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_READONLY_TAG;
+                /* We don't check for required attributes or
+                 * subelements, because most of them are required only
+                 * when the element exists. And we are removing this
+                 * one.
+                 */
+                if (is_required (temp_node->name, NULL))
+                        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_REQUIRED_TAG;
+                result = apply_temporary_removal (modified,
+                                                  temp_node,
+                                                  xsd_data);
+
+                if (result != GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK)
+                        return result;
+        }
+        /* If there are some more nodes in new fragment then it means
+         * they are going to be added. Check against read-only tags
+         * addition and general sanity check.
+         */
+        while (new_node != NULL) {
+                GUPnPDIDLLiteFragmentResult result;
+                xmlNodePtr temp_node;
+
+                if (is_read_only ((gchar *) new_node->name, NULL))
+                        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_READONLY_TAG;
+                /* TODO: We probably should check if newly added node
+                 * has all required properties. Maybe XSD check could
+                 * do that for us.
+                 */
+                temp_node = new_node;
+                new_node = new_node->next;
+                result = apply_temporary_addition (modified,
+                                                   last_sibling,
+                                                   temp_node,
+                                                   xsd_data);
+                if (result != GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK)
+                        return result;
+        }
+
+        return GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK;
+}
+
+static gchar *
+fix_fragment (const gchar *fragment)
+{
+        return g_strdup_printf
+                    ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+                     "<DIDLLiteFragment\n"
+                     "xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"
+                     "xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\"\n"
+                     "xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\"\n"
+                     "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+                     ">%s</DIDLLiteFragment>\n",
+                     fragment);
+}
+
+static gboolean
+is_current_doc_part_of_original_doc (DocNode   *original,
+                                     xmlDocPtr  current_doc)
+{
+        xmlNodePtr current_node = current_doc->children->children;
+        xmlNodePtr this_node;
+
+        /* No current node means that we want to add new elements to
+           the document. */
+        if (current_node == NULL)
+                return TRUE;
+
+        this_node = xml_util_find_node (original->node, current_node);
+
+        if (this_node == NULL)
+                return FALSE;
+
+        for (current_node = current_node->next, this_node = this_node->next;
+             current_node != NULL && this_node != NULL;
+             current_node = current_node->next, this_node = this_node->next)
+                if (!xml_util_node_deep_equal (current_node, this_node))
+                        return FALSE;
+
+        return TRUE;
+}
+
+GUPnPDIDLLiteFragmentResult
+fragment_util_check_fragments (DocNode     *original,
+                               DocNode     *modified,
+                               const gchar *current_fragment,
+                               const gchar *new_fragment,
+                               XSDData     *xsd_data)
+{
+        gchar *fixed_current_fragment = fix_fragment (current_fragment);
+        gchar *fixed_new_fragment = fix_fragment (new_fragment);
+        xmlDocPtr current_doc = xmlReadDoc (BAD_CAST (fixed_current_fragment),
+                                            NULL,
+                                            NULL,
+                                            XML_PARSE_NONET);
+        xmlDocPtr new_doc = xmlReadDoc (BAD_CAST (fixed_new_fragment),
+                                        NULL,
+                                        NULL,
+                                        XML_PARSE_NONET);
+        GUPnPDIDLLiteFragmentResult result;
+
+        if (current_doc == NULL) {
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_BAD_XML;
+
+                goto out;
+        }
+        if (new_doc == NULL) {
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_BAD_XML;
+
+                goto out;
+        }
+
+        if (!is_current_doc_part_of_original_doc (original, current_doc)) {
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_INVALID;
+
+                goto out;
+        }
+
+        result = new_doc_is_valid_modification (modified,
+                                                current_doc,
+                                                new_doc,
+                                                xsd_data);
+
+ out:
+        if (new_doc != NULL)
+                xmlFreeDoc (new_doc);
+        if (current_doc != NULL)
+                xmlFreeDoc (current_doc);
+        g_free (fixed_new_fragment);
+        g_free (fixed_current_fragment);
+
+        return result;
+}
+
+static const gchar *
+get_data_dir (void)
+{
+        const gchar *datadir = g_getenv ("GUPNP_AV_DATADIR");
+
+        if (datadir == NULL)
+                /* that's a macro defined by -DDATADIR=foo */
+                datadir = DATADIR;
+
+        return datadir;
+}
+
+static gchar *
+get_xsd_path (const gchar *path)
+{
+        return g_strdup_printf ("%s" G_DIR_SEPARATOR_S "%s",
+                                get_data_dir (),
+                                path);
+}
+
+static xmlParserInputPtr
+our_own_loader (const char       *url,
+                const char       *id,
+                xmlParserCtxtPtr  context)
+{
+        gchar *basename;
+        gchar *path;
+        xmlParserInputPtr input;
+
+        g_debug ("URL: %s, ID: %s.", url, id);
+
+        basename = g_path_get_basename (url);
+        path = get_xsd_path (basename);
+        g_debug ("BASENAME: %s, PATH: %s", basename, path);
+        input = xmlNewInputFromFile (context, path);
+
+        g_free (basename);
+        g_free (path);
+
+        return input;
+}
+
+XSDData *
+fragment_util_get_didl_lite_xsd_data (void)
+{
+        gchar *path = get_xsd_path ("didl-lite-v2.xsd");
+        xmlExternalEntityLoader original_loader = xmlGetExternalEntityLoader ();
+        XSDData *xsd_data;
+
+        xmlSetExternalEntityLoader (our_own_loader);
+        xsd_data = xsd_data_new (path);
+        xmlSetExternalEntityLoader (original_loader);
+
+        g_free (path);
+
+        return xsd_data;
+}
+
+gboolean
+fragment_util_apply_modification (xmlNodePtr *node_ptr,
+                                  DocNode    *modified)
+{
+        xmlNodePtr node_copy;
+        xmlNodePtr old;
+
+        if (node_ptr == NULL || *node_ptr == NULL)
+                return FALSE;
+
+        node_copy = xml_util_copy_node (modified->node);
+
+        if (node_copy == NULL)
+                return FALSE;
+
+        old = xmlReplaceNode (*node_ptr, node_copy);
+
+        if (old == NULL)
+                return FALSE;
+
+        *node_ptr = node_copy;
+        xmlFreeNode (old);
+
+        return TRUE;
+}
diff --git a/libgupnp-av/fragment-util.h b/libgupnp-av/fragment-util.h
new file mode 100644 (file)
index 0000000..c24d7ec
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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 __FRAGMENT_UTIL_H__
+#define __FRAGMENT_UTIL_H__
+
+#include <glib.h>
+#include <libxml/tree.h>
+
+#include "xsd-data.h"
+#include "gupnp-av-enums.h"
+
+G_BEGIN_DECLS
+
+typedef struct {
+        xmlDocPtr doc;
+        xmlNodePtr node;
+} DocNode;
+
+G_GNUC_INTERNAL XSDData *
+fragment_util_get_didl_lite_xsd_data    (void);
+
+G_GNUC_INTERNAL GUPnPDIDLLiteFragmentResult
+fragment_util_check_fragments           (DocNode     *original,
+                                         DocNode     *modified,
+                                         const gchar *current_fragment,
+                                         const gchar *new_fragment,
+                                         XSDData     *xsd_data);
+
+G_GNUC_INTERNAL gboolean
+fragment_util_apply_modification        (xmlNodePtr *node_ptr,
+                                         DocNode    *modified);
+
+G_END_DECLS
+
+#endif /* __FRAGMENT_UTIL_H__ */
diff --git a/libgupnp-av/gupnp-av-enums.h b/libgupnp-av/gupnp-av-enums.h
new file mode 100644 (file)
index 0000000..701fd14
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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_AV_ENUMS_H__
+#define __GUPNP_AV_ENUMS_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef enum {
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_BAD_XML,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_BAD_XML,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_INVALID,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_INVALID,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_REQUIRED_TAG,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_READONLY_TAG,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_MISMATCH,
+      GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR
+} GUPnPDIDLLiteFragmentResult;
+
+G_END_DECLS
+
+#endif /* __GUPNP_AV_ENUMS_H__ */
index 63ee485..21da810 100644 (file)
  * Boston, MA 02110-1301, USA.
  */
 
+#include "gupnp-av-enums.h"
 #include "gupnp-didl-lite-object.h"
 #include "gupnp-didl-lite-container.h"
+#include "gupnp-didl-lite-createclass.h"
 #include "gupnp-didl-lite-item.h"
 #include "gupnp-didl-lite-parser.h"
 #include "gupnp-didl-lite-resource.h"
@@ -31,5 +33,7 @@
 #include "gupnp-protocol-info.h"
 #include "gupnp-search-criteria-parser.h"
 #include "gupnp-last-change-parser.h"
+#include "gupnp-feature.h"
+#include "gupnp-feature-list-parser.h"
 #include "gupnp-dlna.h"
 
index 1a0abf4..16a535a 100644 (file)
@@ -1,8 +1,11 @@
 /*
  * Copyright (C) 2009 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation
  *
- * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
- *                                <zeeshanak@gnome.org>
+ * Authors: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+ *                                <zeeshan.ali@nokia.com>
+ *          Krzesimir Nowak <krnowak@openismus.com>
+ *          Christophe Guiraud <christophe.guiraud@intel.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 #include <string.h>
 
 #include "gupnp-didl-lite-container.h"
+#include "gupnp-didl-lite-object-private.h"
+#include "gupnp-didl-lite-createclass.h"
+#include "gupnp-didl-lite-createclass-private.h"
 #include "xml-util.h"
 
+
 G_DEFINE_TYPE (GUPnPDIDLLiteContainer,
                gupnp_didl_lite_container,
                GUPNP_TYPE_DIDL_LITE_OBJECT);
@@ -40,7 +47,9 @@ enum {
         PROP_0,
         PROP_SEARCHABLE,
         PROP_CHILD_COUNT,
-        PROP_STORAGE_USED
+        PROP_STORAGE_USED,
+        PROP_CONTAINER_UPDATE_ID,
+        PROP_TOTAL_DELETED_CHILD_COUNT
 };
 
 static void
@@ -75,6 +84,18 @@ gupnp_didl_lite_container_get_property (GObject    *object,
                         (value,
                          gupnp_didl_lite_container_get_storage_used (container));
                 break;
+        case PROP_CONTAINER_UPDATE_ID:
+                g_value_set_uint
+                              (value,
+                               gupnp_didl_lite_container_get_container_update_id
+                                        (container));
+                break;
+        case PROP_TOTAL_DELETED_CHILD_COUNT:
+                g_value_set_uint
+                        (value,
+                         gupnp_didl_lite_container_get_total_deleted_child_count
+                                        (container));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                 break;
@@ -108,6 +129,16 @@ gupnp_didl_lite_container_set_property (GObject      *object,
                                         (container,
                                          g_value_get_int64 (value));
                 break;
+        case PROP_CONTAINER_UPDATE_ID:
+                gupnp_didl_lite_container_set_container_update_id
+                                        (container,
+                                         g_value_get_uint (value));
+                break;
+        case PROP_TOTAL_DELETED_CHILD_COUNT:
+                gupnp_didl_lite_container_set_total_deleted_child_count
+                                        (container,
+                                         g_value_get_uint (value));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                 break;
@@ -179,6 +210,44 @@ gupnp_didl_lite_container_class_init (GUPnPDIDLLiteContainerClass *klass)
                                      G_PARAM_STATIC_NAME |
                                      G_PARAM_STATIC_NICK |
                                      G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteContainer:container-update-id:
+         *
+         * Update ID of this container.
+         **/
+        g_object_class_install_property
+                             (object_class,
+                              PROP_CONTAINER_UPDATE_ID,
+                              g_param_spec_uint ("container-update-id",
+                                                 "ContainerUpdateID",
+                                                 "Update ID of this container.",
+                                                 0,
+                                                 G_MAXUINT,
+                                                 0,
+                                                 G_PARAM_READWRITE |
+                                                 G_PARAM_STATIC_NAME |
+                                                 G_PARAM_STATIC_NICK |
+                                                 G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteContainer:total-deleted-child-count:
+         *
+         * Total deleted child count of this container.
+         **/
+        g_object_class_install_property
+             (object_class,
+              PROP_TOTAL_DELETED_CHILD_COUNT,
+              g_param_spec_uint ("total-deleted-child-count",
+                                 "TotalDeletedChildCOunt",
+                                 "Total deleted child count of this container.",
+                                 0,
+                                 G_MAXUINT,
+                                 0,
+                                 G_PARAM_READWRITE |
+                                 G_PARAM_STATIC_NAME |
+                                 G_PARAM_STATIC_NICK |
+                                 G_PARAM_STATIC_BLURB));
 }
 
 /**
@@ -227,13 +296,112 @@ gupnp_didl_lite_container_get_child_count (GUPnPDIDLLiteContainer *container)
 }
 
 /**
+ * gupnp_didl_lite_container_get_container_update_id:
+ * @container: #GUPnPDIDLLiteContainer
+ *
+ * Get the container update ID of the @container.
+ *
+ * Return value: The container update ID of the @container.
+ **/
+guint
+gupnp_didl_lite_container_get_container_update_id
+                                        (GUPnPDIDLLiteContainer *container)
+{
+        xmlNode *xml_node;
+
+        g_return_val_if_fail (container != NULL, 0);
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), 0);
+
+        xml_node = gupnp_didl_lite_object_get_xml_node
+                                (GUPNP_DIDL_LITE_OBJECT (container));
+
+        return xml_util_get_uint_child_element (xml_node,
+                                                "containerUpdateID",
+                                                0);
+}
+
+/**
+ * gupnp_didl_lite_container_container_update_id_is_set:
+ * @container: #GUPnPDIDLLiteContainer
+ *
+ * Get whether the container update ID of the @container is set.
+ *
+ * Return value: %TRUE if update ID is set, otherwise %FALSE
+ **/
+gboolean
+gupnp_didl_lite_container_container_update_id_is_set
+                                        (GUPnPDIDLLiteContainer *container)
+{
+        const char *content;
+        xmlNode *xml_node;
+
+        g_return_val_if_fail (container != NULL, FALSE);
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), FALSE);
+
+        xml_node = gupnp_didl_lite_object_get_xml_node
+                                        (GUPNP_DIDL_LITE_OBJECT (container));
+        content = xml_util_get_child_element_content (xml_node,
+                                                      "containerUpdateID");
+        return content != NULL;
+}
+
+/**
+ * gupnp_didl_lite_container_get_total_deleted_child_count:
+ * @container: #GUPnPDIDLLiteContainer
+ *
+ * Get the total deleted child count of the @container.
+ *
+ * Return value: The total deleted child count of the @container.
+ **/
+guint
+gupnp_didl_lite_container_get_total_deleted_child_count
+                                        (GUPnPDIDLLiteContainer *container)
+{
+        xmlNode *xml_node;
+
+        g_return_val_if_fail (container != NULL, 0);
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), 0);
+
+        xml_node = gupnp_didl_lite_object_get_xml_node
+                                (GUPNP_DIDL_LITE_OBJECT (container));
+
+        return xml_util_get_uint_child_element (xml_node,
+                                                "totalDeletedChildCount",
+                                                0);
+}
+
+/**
+ * gupnp_didl_lite_container_total_deleted_child_count_is_set:
+ * @container: #GUPnPDIDLLiteContainer
+ *
+ * Get whether the total deleted child conut of the @container is set.
+ *
+ * Return value: %TRUE if property is set, otherwise %FALSE
+ **/
+gboolean
+gupnp_didl_lite_container_total_deleted_child_count_is_set
+                                        (GUPnPDIDLLiteContainer *container)
+{
+        const char *content;
+        xmlNode *xml_node;
+
+        g_return_val_if_fail (container != NULL, FALSE);
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), FALSE);
+
+        xml_node = gupnp_didl_lite_object_get_xml_node
+                                        (GUPNP_DIDL_LITE_OBJECT (container));
+        content = xml_util_get_child_element_content (xml_node,
+                                                      "totalDeletedChildCount");
+        return content != NULL;
+}
+/**
  * gupnp_didl_lite_container_get_create_classes:
  * @container: #GUPnPDIDLLiteContainer
  *
- * Gets the list of create classes of the @object.
+ * Gets the list of create classes of the @container.
  *
  * Returns: (element-type utf8) (transfer full): The list of create classes
- * belonging to @object, or %NULL.
+ * belonging to @container, or %NULL.
  * #g_list_free the returned list after usage and #g_free each string in it.
  **/
 GList *
@@ -255,6 +423,7 @@ gupnp_didl_lite_container_get_create_classes (GUPnPDIDLLiteContainer *container)
                 xmlNode *node;
 
                 node = (xmlNode *) l->data;
+
                 if (node->children != NULL) {
                     create_class = g_strdup ((const char *) node->children->content);
 
@@ -268,13 +437,60 @@ gupnp_didl_lite_container_get_create_classes (GUPnPDIDLLiteContainer *container)
 }
 
 /**
+ * gupnp_didl_lite_container_get_create_classes_full:
+ * @container: #GUPnPDIDLLiteContainer
+ *
+ * Gets the list of create classes of the @container.
+ *
+ * Returns: (element-type GUPnPDIDLLiteCreateClass*) (transfer full): The list
+ * of create classes belonging to @container, or %NULL.
+ * #g_list_free the returned list after usage and unref each object in it.
+ **/
+GList *
+gupnp_didl_lite_container_get_create_classes_full (
+                                            GUPnPDIDLLiteContainer *container)
+{
+        GList *cc_list = NULL;
+        GList *ret = NULL;
+        GList *l;
+
+        g_return_val_if_fail (container != NULL, NULL);
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container), NULL);
+
+        cc_list = gupnp_didl_lite_object_get_properties (
+                                           GUPNP_DIDL_LITE_OBJECT (container),
+                                           "createClass");
+
+        for (l = cc_list; l; l = l->next) {
+                GUPnPDIDLLiteCreateClass *cc;
+                xmlNode *cc_node;
+                GUPnPXMLDoc *cc_doc;
+
+                cc_node = (xmlNode *) l->data;
+                if (!cc_node->children)
+                        continue;
+
+                cc_doc = gupnp_didl_lite_object_get_gupnp_xml_doc (
+                                           GUPNP_DIDL_LITE_OBJECT (container));
+
+                cc = gupnp_didl_lite_create_class_new_from_xml (cc_node, cc_doc);
+
+                ret = g_list_append (ret, cc);
+        }
+
+        g_list_free (cc_list);
+
+        return ret;
+}
+
+/**
  * gupnp_didl_lite_container_get_search_classes:
  * @container: #GUPnPDIDLLiteContainer
  *
- * Gets the list of search classes of the @object.
+ * Gets the list of search classes of the @container.
  *
  * Return value: (element-type utf8) (transfer full): The list of search classes
- * belonging to @object, or %NULL. #g_list_free the returned list after usage
+ * belonging to @container, or %NULL. #g_list_free the returned list after usage
  * and #g_free each string in it.
  **/
 GList *
@@ -404,11 +620,129 @@ gupnp_didl_lite_container_set_child_count (GUPnPDIDLLiteContainer *container,
 }
 
 /**
+ * gupnp_didl_lite_container_set_container_update_id:
+ * @container: #GUPnPDIDLLiteContainer
+ * @update_id: The container update ID
+ *
+ * Set the container update ID of the @container.
+ **/
+void
+gupnp_didl_lite_container_set_container_update_id
+                                        (GUPnPDIDLLiteContainer *container,
+                                         guint                   update_id)
+{
+        xmlNode *xml_node;
+        xmlNsPtr upnp_ns;
+        GUPnPXMLDoc *xml_doc;
+        char *str;
+        GUPnPDIDLLiteObject *self_as_object;
+
+        g_return_if_fail (container != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
+
+        self_as_object = GUPNP_DIDL_LITE_OBJECT (container);
+        xml_node = gupnp_didl_lite_object_get_xml_node (self_as_object);
+        xml_doc = gupnp_didl_lite_object_get_gupnp_xml_doc (self_as_object);
+        upnp_ns = gupnp_didl_lite_object_get_upnp_namespace (self_as_object);
+
+        str = g_strdup_printf ("%u", update_id);
+        xml_util_set_child (xml_node,
+                            upnp_ns,
+                            xml_doc->doc,
+                            "containerUpdateID",
+                            str);
+        g_free (str);
+
+        g_object_notify (G_OBJECT (container), "container-update-id");
+}
+
+/**
+ * gupnp_didl_lite_container_unset_container_update_id:
+ * @container: #GUPnPDIDLLiteContainer
+ *
+ * Unset the container update ID property of the @container.
+ **/
+void
+gupnp_didl_lite_container_unset_container_update_id
+                                        (GUPnPDIDLLiteContainer *container)
+{
+        xmlNode *xml_node;
+
+        g_return_if_fail (container != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
+
+        xml_node = gupnp_didl_lite_object_get_xml_node
+                                        (GUPNP_DIDL_LITE_OBJECT (container));
+        xml_util_unset_child (xml_node, "containerUpdateID");
+
+        g_object_notify (G_OBJECT (container), "container-update-id");
+}
+
+/**
+ * gupnp_didl_lite_container_set_total_deleted_child_count:
+ * @container: #GUPnPDIDLLiteContainer
+ * @count: The container update ID
+ *
+ * Set the container update ID of the @container.
+ **/
+void
+gupnp_didl_lite_container_set_total_deleted_child_count
+                                        (GUPnPDIDLLiteContainer *container,
+                                         guint                   count)
+{
+        xmlNode *xml_node;
+        xmlNsPtr upnp_ns;
+        GUPnPXMLDoc *xml_doc;
+        char *str;
+        GUPnPDIDLLiteObject *self_as_object;
+
+        g_return_if_fail (container != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
+
+        self_as_object = GUPNP_DIDL_LITE_OBJECT (container);
+        xml_node = gupnp_didl_lite_object_get_xml_node (self_as_object);
+        xml_doc = gupnp_didl_lite_object_get_gupnp_xml_doc (self_as_object);
+        upnp_ns = gupnp_didl_lite_object_get_upnp_namespace (self_as_object);
+
+        str = g_strdup_printf ("%u", count);
+        xml_util_set_child (xml_node,
+                            upnp_ns,
+                            xml_doc->doc,
+                            "totalDeletedChildCount",
+                            str);
+        g_free (str);
+
+        g_object_notify (G_OBJECT (container), "total-deleted-child-count");
+}
+
+/**
+ * gupnp_didl_lite_container_unset_total_deleted_child_count:
+ * @container: #GUPnPDIDLLiteContainer
+ *
+ * Unset the total deleted child count property of the @container.
+ **/
+void
+gupnp_didl_lite_container_unset_total_deleted_child_count
+                                        (GUPnPDIDLLiteContainer *container)
+{
+        xmlNode *xml_node;
+
+        g_return_if_fail (container != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_CONTAINER (container));
+
+        xml_node = gupnp_didl_lite_object_get_xml_node
+                                        (GUPNP_DIDL_LITE_OBJECT (container));
+        xml_util_unset_child (xml_node, "totalDeletedChildCount");
+
+        g_object_notify (G_OBJECT (container), "total-deleted-child-count");
+}
+
+/**
  * gupnp_didl_lite_container_add_create_class:
  * @container: #GUPnPDIDLLiteContainer
  * @create_class: The createClass to add.
  *
- * Add a new create class to the @object. includeDerived defaults to "0".
+ * Add a new create class to the @container. includeDerived defaults to "0".
  *
  * Return value: None.
  **/
@@ -429,7 +763,7 @@ gupnp_didl_lite_container_add_create_class (
  * @include_derived: Whether object with dervied classes may be created in
  * this container or not.
  *
- * Add a new create class to the @object.
+ * Add a new create class to the @container.
  *
  * Return value: None.
  **/
@@ -470,7 +804,7 @@ gupnp_didl_lite_container_add_create_class_full (
  * @container: #GUPnPDIDLLiteContainer
  * @search_class: The searchClass to add.
  *
- * Add a new search class to the @object.
+ * Add a new search class to the @container.
  *
  * Return value: None.
  **/
@@ -490,7 +824,7 @@ gupnp_didl_lite_container_add_search_class (
  * @search_class: The searchClass to add.
  * @include_derived: includeDerived attribute of the DIDL
  *
- * Add a new search class to the @object.
+ * Add a new search class to the @container.
  *
  * Return value: None.
  **/
index e1af1cd..7c4ced7 100644 (file)
@@ -1,8 +1,11 @@
 /*
  * Copyright (C) 2009 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
  *                                <zeeshanak@gnome.org>
+ *          Christophe Guiraud <christophe.guiraud@intel.com>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -74,11 +77,30 @@ gint
 gupnp_didl_lite_container_get_child_count
                                         (GUPnPDIDLLiteContainer *container);
 
+guint
+gupnp_didl_lite_container_get_container_update_id
+                                        (GUPnPDIDLLiteContainer *container);
+
+gboolean
+gupnp_didl_lite_container_container_update_id_is_set
+                                        (GUPnPDIDLLiteContainer *container);
+
+guint
+gupnp_didl_lite_container_get_total_deleted_child_count
+                                        (GUPnPDIDLLiteContainer *container);
+
+gboolean
+gupnp_didl_lite_container_total_deleted_child_count_is_set
+                                        (GUPnPDIDLLiteContainer *container);
+
 GList *
 gupnp_didl_lite_container_get_create_classes
                                         (GUPnPDIDLLiteContainer *container);
 
 GList *
+gupnp_didl_lite_container_get_create_classes_full
+                                        (GUPnPDIDLLiteContainer *container);
+GList *
 gupnp_didl_lite_container_get_search_classes
                                         (GUPnPDIDLLiteContainer *container);
 
@@ -93,6 +115,24 @@ gupnp_didl_lite_container_set_child_count
                                          gint                    child_count);
 
 void
+gupnp_didl_lite_container_set_container_update_id
+                                        (GUPnPDIDLLiteContainer *container,
+                                         guint                   update_id);
+
+void
+gupnp_didl_lite_container_unset_container_update_id
+                                        (GUPnPDIDLLiteContainer *container);
+
+void
+gupnp_didl_lite_container_set_total_deleted_child_count
+                                        (GUPnPDIDLLiteContainer *container,
+                                         guint                   count);
+
+void
+gupnp_didl_lite_container_unset_total_deleted_child_count
+                                        (GUPnPDIDLLiteContainer *container);
+
+void
 gupnp_didl_lite_container_add_create_class
                                         (GUPnPDIDLLiteContainer *container,
                                          const char             *create_class);
@@ -121,6 +161,7 @@ void
 gupnp_didl_lite_container_set_storage_used
                                        (GUPnPDIDLLiteContainer *container,
                                         gint64                  storage_used);
+
 G_END_DECLS
 
 #endif /* __GUPNP_DIDL_LITE_CONTAINER_H__ */
diff --git a/libgupnp-av/gupnp-didl-lite-createclass-private.h b/libgupnp-av/gupnp-didl-lite-createclass-private.h
new file mode 100644 (file)
index 0000000..59ce5f6
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Christophe Guiraud <christophe.guiraud@intel.com>
+ * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+ *                               <zeeshan.ali@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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_DIDL_LITE_CREATE_CLASS_PRIVATE_H__
+#define __GUPNP_DIDL_LITE_CREATE_CLASS_PRIVATE_H__
+
+#include <glib-object.h>
+#include <libxml/tree.h>
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL GUPnPDIDLLiteCreateClass *
+gupnp_didl_lite_create_class_new_from_xml (xmlNode     *xml_node,
+                                           GUPnPXMLDoc *xml_doc);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DIDL_LITE_CREATE_CLASS_PRIVATE_H__ */
diff --git a/libgupnp-av/gupnp-didl-lite-createclass.c b/libgupnp-av/gupnp-didl-lite-createclass.c
new file mode 100644 (file)
index 0000000..707d187
--- /dev/null
@@ -0,0 +1,445 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Christophe Guiraud <christophe.guiraud@intel.com>
+ * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+ *                               <zeeshan.ali@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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-didl-lite-create-class
+ * @short_description: DIDL-Lite CreateClass
+ *
+ * #GUPnPDIDLLiteCreateClass respresents a DIDL-Lite create class element.
+ */
+
+#include <string.h>
+
+#include "gupnp-didl-lite-createclass.h"
+#include "xml-util.h"
+
+G_DEFINE_TYPE (GUPnPDIDLLiteCreateClass,
+               gupnp_didl_lite_create_class,
+               G_TYPE_OBJECT);
+
+struct _GUPnPDIDLLiteCreateClassPrivate {
+        xmlNode     *xml_node;
+        GUPnPXMLDoc *xml_doc;
+};
+
+enum {
+        PROP_0,
+        PROP_XML_NODE,
+        PROP_XML_DOC,
+        PROP_CONTENT,
+        PROP_INCLUDE_DERIVED,
+        PROP_FRIENDLY_NAME,
+};
+
+static void
+gupnp_didl_lite_create_class_init (GUPnPDIDLLiteCreateClass *create_class)
+{
+        create_class->priv = G_TYPE_INSTANCE_GET_PRIVATE
+                                        (create_class,
+                                         GUPNP_TYPE_DIDL_LITE_CREATE_CLASS,
+                                         GUPnPDIDLLiteCreateClassPrivate);
+}
+
+static void
+gupnp_didl_lite_create_class_get_property (GObject    *object,
+                                           guint       property_id,
+                                           GValue     *value,
+                                           GParamSpec *pspec)
+{
+        GUPnPDIDLLiteCreateClass *create_class;
+
+        create_class = GUPNP_DIDL_LITE_CREATE_CLASS (object);
+
+        switch (property_id) {
+        case PROP_XML_NODE:
+                g_value_set_pointer
+                    (value,
+                     gupnp_didl_lite_create_class_get_xml_node
+                                                            (create_class));
+                break;
+        case PROP_CONTENT:
+                g_value_set_string
+                    (value,
+                     gupnp_didl_lite_create_class_get_content
+                                                            (create_class));
+                break;
+        case PROP_INCLUDE_DERIVED:
+                g_value_set_boolean
+                    (value,
+                     gupnp_didl_lite_create_class_get_include_derived
+                                                            (create_class));
+                break;
+        case PROP_FRIENDLY_NAME:
+                g_value_set_string
+                    (value,
+                     gupnp_didl_lite_create_class_get_friendly_name
+                                                            (create_class));
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_didl_lite_create_class_set_property (GObject      *object,
+                                            guint         property_id,
+                                            const GValue *value,
+                                            GParamSpec   *pspec)
+{
+        GUPnPDIDLLiteCreateClass *create_class;
+
+        create_class = GUPNP_DIDL_LITE_CREATE_CLASS (object);
+
+        switch (property_id) {
+        case PROP_XML_NODE:
+                create_class->priv->xml_node = g_value_get_pointer (value);
+                break;
+        case PROP_XML_DOC:
+                create_class->priv->xml_doc = g_value_dup_object (value);
+                break;
+        case PROP_CONTENT:
+                gupnp_didl_lite_create_class_set_content
+                                                 (create_class,
+                                                  g_value_get_string (value));
+                break;
+        case PROP_INCLUDE_DERIVED:
+                gupnp_didl_lite_create_class_set_include_derived
+                                                 (create_class,
+                                                  g_value_get_boolean (value));
+                break;
+        case PROP_FRIENDLY_NAME:
+                gupnp_didl_lite_create_class_set_friendly_name
+                                                 (create_class,
+                                                  g_value_get_string (value));
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_didl_lite_create_class_dispose (GObject *object)
+{
+        GObjectClass                    *object_class;
+        GUPnPDIDLLiteCreateClassPrivate *priv;
+
+        priv = GUPNP_DIDL_LITE_CREATE_CLASS (object)->priv;
+
+        if (priv->xml_doc) {
+                g_object_unref (priv->xml_doc);
+                priv->xml_doc = NULL;
+        }
+
+        object_class = G_OBJECT_CLASS
+                                   (gupnp_didl_lite_create_class_parent_class);
+        object_class->dispose (object);
+}
+
+static void
+gupnp_didl_lite_create_class_class_init (GUPnPDIDLLiteCreateClassClass *klass)
+{
+        GObjectClass *object_class;
+
+        object_class = G_OBJECT_CLASS (klass);
+
+        object_class->get_property = gupnp_didl_lite_create_class_get_property;
+        object_class->set_property = gupnp_didl_lite_create_class_set_property;
+        object_class->dispose = gupnp_didl_lite_create_class_dispose;
+
+        g_type_class_add_private (klass,
+                                  sizeof (GUPnPDIDLLiteCreateClassPrivate));
+
+        /**
+         * GUPnPDIDLLiteCreateClass:xml-node:
+         *
+         * The pointer to desc node in XML document.
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_XML_NODE,
+                 g_param_spec_pointer
+                                   ("xml-node",
+                                    "XMLNode",
+                                    "The pointer to desc node in XML"
+                                    " document.",
+                                    G_PARAM_READWRITE |
+                                    G_PARAM_CONSTRUCT_ONLY |
+                                    G_PARAM_STATIC_NAME |
+                                    G_PARAM_STATIC_NICK |
+                                    G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteCreateClass:xml-doc:
+         *
+         * The reference to XML document containing this object.
+         *
+         * Internal property.
+         *
+         * Stability: Private
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_XML_DOC,
+                 g_param_spec_object
+                                   ("xml-doc",
+                                    "XMLDoc",
+                                    "The reference to XML document"
+                                    " containing this object.",
+                                    GUPNP_TYPE_XML_DOC,
+                                    G_PARAM_WRITABLE |
+                                    G_PARAM_CONSTRUCT_ONLY |
+                                    G_PARAM_STATIC_NAME |
+                                    G_PARAM_STATIC_NICK |
+                                    G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteCreateClass:content:
+         *
+         * The content of this create Class.
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_CONTENT,
+                 g_param_spec_string
+                                   ("content",
+                                    "Content",
+                                    "The content of this create Class.",
+                                    NULL,
+                                    G_PARAM_READWRITE |
+                                    G_PARAM_STATIC_NAME |
+                                    G_PARAM_STATIC_NICK |
+                                    G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteCreateClass:include-derived:
+         *
+         * Whether this create Class can be derived.
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_INCLUDE_DERIVED,
+                 g_param_spec_boolean
+                                   ("include-derived",
+                                    "IncludeDerived",
+                                    "Wether this create Class can be derived.",
+                                    FALSE,
+                                    G_PARAM_READWRITE |
+                                    G_PARAM_STATIC_NAME |
+                                    G_PARAM_STATIC_NICK |
+                                    G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteCreateClass:friendly-name:
+         *
+         * The friendly name of this create Class.
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_FRIENDLY_NAME,
+                 g_param_spec_string
+                                   ("friendly-name",
+                                    "FriendlyName",
+                                    "The friendly name of this create Class.",
+                                    NULL,
+                                    G_PARAM_READWRITE |
+                                    G_PARAM_STATIC_NAME |
+                                    G_PARAM_STATIC_NICK |
+                                    G_PARAM_STATIC_BLURB));
+}
+
+/**
+ * gupnp_didl_lite_create_class_get_content:
+ * @create_class: #GUPnPDIDLLiteCreateClass
+ *
+ * Get the content of the @create_class.
+ *
+ * Return value: The Content of the @create_class, or %NULL.
+ **/
+const char *
+gupnp_didl_lite_create_class_get_content
+                                    (GUPnPDIDLLiteCreateClass *create_class)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class),
+                              NULL);
+
+        if (G_UNLIKELY (create_class->priv->xml_node->children == NULL))
+                return NULL;
+
+        return (const char *) create_class->priv->xml_node->children->content;
+}
+
+/**
+ * gupnp_didl_lite_create_class_set_content:
+ * @create_class: #GUPnPDIDLLiteCreateClass
+ * @content: The content
+ *
+ * Set the content of the @create_class.
+ **/
+void
+gupnp_didl_lite_create_class_set_content
+                                    (GUPnPDIDLLiteCreateClass *create_class,
+                                     const char               *content)
+{
+        xmlChar *escaped;
+
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class));
+        g_return_if_fail (create_class != NULL);
+
+        escaped = xmlEncodeSpecialChars (create_class->priv->xml_doc->doc,
+                                         (const unsigned char *) content);
+        xmlNodeSetContent (create_class->priv->xml_node, escaped);
+        xmlFree (escaped);
+
+        g_object_notify (G_OBJECT (create_class), "content");
+}
+
+/**
+ * gupnp_didl_lite_create_class_get_include_derived:
+ * @create_class: #GUPnPDIDLLiteCreateClass
+ *
+ * Checks whether @create_class can be derived.
+ *
+ * Return value: #TRUE if @create_class can be derived.
+ **/
+gboolean
+gupnp_didl_lite_create_class_get_include_derived
+                                    (GUPnPDIDLLiteCreateClass *create_class)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class),
+                              FALSE);
+
+        return xml_util_get_boolean_attribute (create_class->priv->xml_node,
+                                               "includeDerived");
+}
+
+/**
+ * gupnp_didl_lite_create_class_set_include_derived:
+ * @create_class: #GUPnPDIDLLiteCreateClass
+ * @include_derived: the derivability
+ *
+ * (Un)set the derivability of create_class.
+ **/
+void
+gupnp_didl_lite_create_class_set_include_derived
+                                    (GUPnPDIDLLiteCreateClass *create_class,
+                                     gboolean                 include_derived)
+{
+        const char *str;
+
+        g_return_if_fail (create_class != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class));
+
+        if (include_derived)
+                str = "1";
+        else
+                str = "0";
+        xmlSetProp (create_class->priv->xml_node,
+                    (unsigned char *) "includeDerived",
+                    (unsigned char *) str);
+
+        g_object_notify (G_OBJECT (create_class), "include-derived");
+}
+
+/**
+ * gupnp_didl_lite_create_class_get_friendly_name:
+ * @create_class: #GUPnPDIDLLiteCreateClass
+ *
+ * Get the friendly name of the @create_class.
+ *
+ * Return value: The FriendlyName of the @create_class, or %NULL.
+ **/
+const char *
+gupnp_didl_lite_create_class_get_friendly_name
+                                    (GUPnPDIDLLiteCreateClass *create_class)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class),
+                              NULL);
+        return xml_util_get_attribute_content (create_class->priv->xml_node,
+                                               "name");
+}
+
+/**
+ * gupnp_didl_lite_create_class_set_friendly_name:
+ * @create_class: #GUPnPDIDLLiteCreateClass
+ * @friendly_name: The friendly name
+ *
+ * Set the friendly name of the @create_class.
+ **/
+void
+gupnp_didl_lite_create_class_set_friendly_name
+                                    (GUPnPDIDLLiteCreateClass *create_class,
+                                     const char               *friendly_name)
+{
+        g_return_if_fail (create_class != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class));
+
+        xmlSetProp (create_class->priv->xml_node,
+                    (unsigned char *) "name",
+                    (const unsigned char *) friendly_name);
+
+        g_object_notify (G_OBJECT (create_class), "friendly-name");
+}
+
+/**
+ * gupnp_didl_lite_create_class_new_from_xml:
+ * @xml_node: The pointer to relevant node in XML document
+ * @xml_doc: The reference to containing XML document
+ *
+ * Creates a new #GUPnPDIDLLiteCreateClass for the @xml_node.
+ *
+ * Returns: (transfer full): A new #GUPnPDIDLLiteCreateClass object. Unref after usage.
+ **/
+GUPnPDIDLLiteCreateClass *
+gupnp_didl_lite_create_class_new_from_xml (xmlNode     *xml_node,
+                                           GUPnPXMLDoc *xml_doc)
+{
+        GUPnPDIDLLiteCreateClass *create_class;
+
+        return g_object_new (GUPNP_TYPE_DIDL_LITE_CREATE_CLASS,
+                             "xml-node", xml_node,
+                             "xml-doc", xml_doc,
+                             NULL);
+
+        return create_class;
+}
+
+/**
+ * gupnp_didl_lite_create_class_get_xml_node:
+ * @create_class: The #GUPnPDIDLLiteCreateClass
+ *
+ * Get the pointer to relevant node in XML document.
+ *
+ * Returns: (transfer none): The pointer to relevant node in XML document.
+ **/
+xmlNode *
+gupnp_didl_lite_create_class_get_xml_node
+                                      (GUPnPDIDLLiteCreateClass *create_class)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_CREATE_CLASS (create_class),
+                              NULL);
+
+        return create_class->priv->xml_node;
+}
diff --git a/libgupnp-av/gupnp-didl-lite-createclass.h b/libgupnp-av/gupnp-didl-lite-createclass.h
new file mode 100644 (file)
index 0000000..7df5935
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ * Copyright (C) 2009 Nokia Corporation.
+ *
+ * Author: Christophe Guiraud <christophe.guiraud@intel.com>
+ * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+ *                               <zeeshan.ali@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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_DIDL_LITE_CREATE_CLASS_H__
+#define __GUPNP_DIDL_LITE_CREATE_CLASS_H__
+
+#include <glib-object.h>
+#include <libxml/tree.h>
+#include "gupnp-didl-lite-container.h"
+
+G_BEGIN_DECLS
+
+GType
+gupnp_didl_lite_create_class_get_type (void) G_GNUC_CONST;
+
+#define GUPNP_TYPE_DIDL_LITE_CREATE_CLASS \
+                (gupnp_didl_lite_create_class_get_type ())
+#define GUPNP_DIDL_LITE_CREATE_CLASS(obj) \
+                (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                 GUPNP_TYPE_DIDL_LITE_CREATE_CLASS, \
+                 GUPnPDIDLLiteCreateClass))
+#define GUPNP_DIDL_LITE_CREATE_CLASS_CLASS(obj) \
+                (G_TYPE_CHECK_CLASS_CAST ((obj), \
+                 GUPNP_TYPE_DIDL_LITE_CREATE_CLASS, \
+                 GUPnPDIDLLiteCreateClassClass))
+#define GUPNP_IS_DIDL_LITE_CREATE_CLASS(obj) \
+                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                 GUPNP_TYPE_DIDL_LITE_CREATE_CLASS))
+#define GUPNP_IS_DIDL_LITE_CREATE_CLASS_CLASS(obj) \
+                (G_TYPE_CHECK_CLASS_TYPE ((obj), \
+                 GUPNP_TYPE_DIDL_LITE_CREATE_CLASS))
+#define GUPNP_DIDL_LITE_CREATE_CLASS_GET_CLASS(obj) \
+                (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                 GUPNP_TYPE_DIDL_LITE_CREATE_CLASS, \
+                 GUPnPDIDLLiteCreateClassClass))
+
+typedef struct _GUPnPDIDLLiteCreateClassPrivate GUPnPDIDLLiteCreateClassPrivate;
+
+typedef struct {
+        GObject parent;
+
+        GUPnPDIDLLiteCreateClassPrivate *priv;
+} GUPnPDIDLLiteCreateClass;
+
+typedef struct {
+        GObjectClass parent_class;
+
+        /* future padding */
+        void (* _gupnp_reserved1) (void);
+        void (* _gupnp_reserved2) (void);
+        void (* _gupnp_reserved3) (void);
+        void (* _gupnp_reserved4) (void);
+} GUPnPDIDLLiteCreateClassClass;
+
+const char *
+gupnp_didl_lite_create_class_get_content
+                                    (GUPnPDIDLLiteCreateClass *create_class);
+
+void
+gupnp_didl_lite_create_class_set_content
+                                    (GUPnPDIDLLiteCreateClass *create_class,
+                                     const char               *content);
+
+gboolean
+gupnp_didl_lite_create_class_get_include_derived
+                                    (GUPnPDIDLLiteCreateClass *create_class);
+
+void
+gupnp_didl_lite_create_class_set_include_derived
+                                    (GUPnPDIDLLiteCreateClass *create_class,
+                                     gboolean                 include_derived);
+
+const char *
+gupnp_didl_lite_create_class_get_friendly_name
+                                    (GUPnPDIDLLiteCreateClass *create_class);
+
+void
+gupnp_didl_lite_create_class_set_friendly_name
+                                    (GUPnPDIDLLiteCreateClass *create_class,
+                                     const char               *friendly_name);
+
+xmlNode *
+gupnp_didl_lite_create_class_get_xml_node
+                                    (GUPnPDIDLLiteCreateClass *create_class);
+
+G_END_DECLS
+
+#endif /* __GUPNP_DIDL_LITE_CREATE_CLASS_H__ */
index 780e495..5a01b20 100644 (file)
@@ -1,8 +1,10 @@
 /*
  * Copyright (C) 2009 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
  *                                <zeeshanak@gnome.org>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -35,6 +37,10 @@ gupnp_didl_lite_object_new_from_xml     (xmlNode     *xml_node,
                                          xmlNs       *dc_ns,
                                          xmlNs       *dlna_ns);
 
+G_GNUC_INTERNAL GUPnPXMLDoc *
+gupnp_didl_lite_object_get_gupnp_xml_doc
+                                        (GUPnPDIDLLiteObject *object);
+
 G_END_DECLS
 
 #endif /* __GUPNP_DIDL_LITE_OBJECT_PRIVATE_H__ */
index 5c916a6..30533c5 100644 (file)
@@ -1,8 +1,10 @@
 /*
  * Copyright (C) 2009 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
  *                                <zeeshanak@gnome.org>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -38,6 +40,8 @@
 #include "gupnp-didl-lite-item.h"
 #include "gupnp-didl-lite-contributor-private.h"
 #include "xml-util.h"
+#include "fragment-util.h"
+#include "xsd-data.h"
 
 G_DEFINE_ABSTRACT_TYPE (GUPnPDIDLLiteObject,
                         gupnp_didl_lite_object,
@@ -52,6 +56,8 @@ struct _GUPnPDIDLLiteObjectPrivate {
         xmlNs *dlna_ns;
 };
 
+static XSDData *didl_lite_xsd;
+
 enum {
         PROP_0,
         PROP_XML_NODE,
@@ -75,6 +81,7 @@ enum {
         PROP_DATE,
         PROP_TRACK_NUMBER,
         PROP_DLNA_MANAGED,
+        PROP_UPDATE_ID
 };
 
 static int
@@ -205,6 +212,11 @@ gupnp_didl_lite_object_set_property (GObject      *object,
                                         (didl_object,
                                          g_value_get_flags (value));
                 break;
+        case PROP_UPDATE_ID:
+                gupnp_didl_lite_object_set_update_id
+                                        (didl_object,
+                                         g_value_get_uint (value));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                 break;
@@ -325,6 +337,11 @@ gupnp_didl_lite_object_get_property (GObject    *object,
                         (value,
                          gupnp_didl_lite_object_get_dlna_managed (didl_object));
                 break;
+        case PROP_UPDATE_ID:
+                g_value_set_uint
+                        (value,
+                         gupnp_didl_lite_object_get_update_id (didl_object));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                 break;
@@ -556,9 +573,6 @@ gupnp_didl_lite_object_class_init (GUPnPDIDLLiteObjectClass *klass)
          *
          * The creator of this object.
          *
-         * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_get_creators and
-         * #gupnp_didl_lite_object_add_creator instead since unlike this
-         * property, they are capable of dealing with multiple creator nodes.
          **/
         g_object_class_install_property
                 (object_class,
@@ -750,6 +764,28 @@ gupnp_didl_lite_object_class_init (GUPnPDIDLLiteObjectClass *klass)
                                      G_PARAM_STATIC_NAME |
                                      G_PARAM_STATIC_NICK |
                                      G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteObject:update-id:
+         *
+         * Update ID of this object.
+         **/
+        g_object_class_install_property
+                                (object_class,
+                                 PROP_UPDATE_ID,
+                                 g_param_spec_uint ("update-id",
+                                                    "UpdateID",
+                                                    "Update ID of this object.",
+                                                    0,
+                                                    G_MAXUINT,
+                                                    0,
+                                                    G_PARAM_READWRITE |
+                                                    G_PARAM_STATIC_NAME |
+                                                    G_PARAM_STATIC_NICK |
+                                                    G_PARAM_STATIC_BLURB));
+
+        if (didl_lite_xsd == NULL)
+                didl_lite_xsd = fragment_util_get_didl_lite_xsd_data ();
 }
 
 static gboolean
@@ -812,6 +848,70 @@ get_contributor_list_by_name (GUPnPDIDLLiteObject *object,
         return ret;
 }
 
+static char *
+get_contributors_xml_string_by_name (GUPnPDIDLLiteObject *object,
+                                     const char          *name)
+{
+        GList     *contributors = NULL;
+        char      *ret = NULL;
+        GList     *l;
+        xmlBuffer *buffer;
+
+        contributors = gupnp_didl_lite_object_get_properties (object, name);
+        if (contributors == NULL)
+                return NULL;
+
+        buffer = xmlBufferCreate ();
+
+        for (l = contributors; l; l = l->next) {
+                xmlNode *node;
+
+                node = (xmlNode *) l->data;
+                if (!node->children)
+                        continue;
+
+                xmlNodeDump (buffer,
+                             object->priv->xml_doc->doc,
+                             node,
+                             0,
+                             0);
+        }
+
+        ret = g_strndup ((char *) xmlBufferContent (buffer),
+                         xmlBufferLength (buffer));
+        xmlBufferFree (buffer);
+
+        g_list_free (contributors);
+
+        return ret;
+}
+
+static void
+unset_contributors_by_name (GUPnPDIDLLiteObject *object, const char *name)
+{
+        GList *contributors = NULL;
+        GList *l;
+
+        contributors = gupnp_didl_lite_object_get_properties (object, name);
+        if (contributors == NULL)
+                return;
+
+        for (l = contributors; l; l = l->next) {
+                xmlNode *node;
+
+                node = (xmlNode *) l->data;
+                if (!node->children)
+                        continue;
+
+                xmlUnlinkNode (node);
+                xmlFreeNode (node);
+        }
+
+        g_list_free (contributors);
+
+        return;
+}
+
 /**
  * gupnp_didl_lite_object_new_from_xml:
  * @xml_node: The pointer to 'res' node in XML document
@@ -858,6 +958,23 @@ gupnp_didl_lite_object_new_from_xml (xmlNode     *xml_node,
 }
 
 /**
+ * gupnp_didl_lite_object_get_gupnp_xml_doc:
+ * @object: The #GUPnPDIDLLiteObject
+ *
+ * Get the pointer to the XML document containing this object.
+ *
+ * Returns: (transfer none): The pointer to the XML document containing this
+ * object.
+ **/
+GUPnPXMLDoc *
+gupnp_didl_lite_object_get_gupnp_xml_doc (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
+
+        return object->priv->xml_doc;
+}
+
+/**
  * gupnp_didl_lite_object_get_xml_node:
  * @object: The #GUPnPDIDLLiteObject
  *
@@ -1036,8 +1153,6 @@ gupnp_didl_lite_object_get_title (GUPnPDIDLLiteObject *object)
  * Get the creator of the @object.
  *
  * Return value: The creator of the @object, or %NULL.
- *
- * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_get_creators instead.
  **/
 const char *
 gupnp_didl_lite_object_get_creator (GUPnPDIDLLiteObject *object)
@@ -1334,6 +1449,46 @@ gupnp_didl_lite_object_get_dlna_managed (GUPnPDIDLLiteObject *object)
 }
 
 /**
+ * gupnp_didl_lite_object_get_update_id:
+ * @object: #GUPnPDIDLLiteObject
+ *
+ * Get the update ID of the @object.
+ *
+ * Return value: The update ID of the @object.
+ **/
+guint
+gupnp_didl_lite_object_get_update_id (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (object != NULL, 0);
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), 0);
+
+        return xml_util_get_uint_child_element (object->priv->xml_node,
+                                                "objectUpdateID",
+                                                0);
+}
+
+/**
+ * gupnp_didl_lite_object_update_id_is_set:
+ * @object: #GUPnPDIDLLiteObject
+ *
+ * Get whether the update ID of the @object is set.
+ *
+ * Return value: %TRUE if update ID is set, otherwise %FALSE
+ **/
+gboolean
+gupnp_didl_lite_object_update_id_is_set (GUPnPDIDLLiteObject *object)
+{
+        const char *content;
+
+        g_return_val_if_fail (object != NULL, FALSE);
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), FALSE);
+
+        content = xml_util_get_child_element_content (object->priv->xml_node,
+                                                      "objectUpdateID");
+        return content != NULL;
+}
+
+/**
  * gupnp_didl_lite_object_get_resources:
  * @object: #GUPnPDIDLLiteObject
  *
@@ -1571,8 +1726,6 @@ gupnp_didl_lite_object_set_title (GUPnPDIDLLiteObject *object,
  * @creator: The creator
  *
  * Set the creator of the @object to @creator.
- *
- * Deprecated: 0.5.3: Use #gupnp_didl_lite_object_add_creator instead.
  **/
 void
 gupnp_didl_lite_object_set_creator (GUPnPDIDLLiteObject *object,
@@ -1917,6 +2070,51 @@ gupnp_didl_lite_object_set_dlna_managed (GUPnPDIDLLiteObject *object,
 }
 
 /**
+ * gupnp_didl_lite_object_set_update_id:
+ * @object: #GUPnPDIDLLiteObject
+ * @update_id: Update ID
+ *
+ * Set the update ID of the @object.
+ **/
+void
+gupnp_didl_lite_object_set_update_id (GUPnPDIDLLiteObject *object,
+                                      guint                update_id)
+{
+        char *str;
+
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
+
+        str = g_strdup_printf ("%u", update_id);
+        xml_util_set_child (object->priv->xml_node,
+                            object->priv->upnp_ns,
+                            object->priv->xml_doc->doc,
+                            "objectUpdateID",
+                            str);
+        g_free (str);
+
+        g_object_notify (G_OBJECT (object), "update-id");
+}
+
+/**
+ * gupnp_didl_lite_object_unset_update_id:
+ * @object: #GUPnPDIDLLiteObject
+ *
+ * Unset the update ID property of the @object.
+ **/
+void
+gupnp_didl_lite_object_unset_update_id (GUPnPDIDLLiteObject *object)
+{
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
+
+        xml_util_unset_child (object->priv->xml_node,
+                              "objectUpdateID");
+
+        g_object_notify (G_OBJECT (object), "update-id");
+}
+
+/**
  * gupnp_didl_lite_object_add_resource:
  * @object: A #GUPnPDIDLLiteObject
  *
@@ -1964,3 +2162,269 @@ gupnp_didl_lite_object_add_descriptor (GUPnPDIDLLiteObject *object)
                                                         object->priv->xml_doc);
 }
 
+/**
+ * gupnp_didl_lite_object_get_title_xml_string:
+ * @object: A #GUPnPDIDLLiteObject
+ *
+ * Creates a string representation of the DIDL-Lite XML fragment related to the
+ * object title.
+ *
+ * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
+ **/
+char *
+gupnp_didl_lite_object_get_title_xml_string (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
+
+        return xml_util_get_child_string (object->priv->xml_node,
+                                          object->priv->xml_doc->doc,
+                                          "title");
+}
+
+/**
+ * gupnp_didl_lite_object_get_date_xml_string:
+ * @object: A #GUPnPDIDLLiteObject
+ *
+ * Creates a string representation of the DIDL-Lite XML fragment related to the
+ * object date.
+ *
+ * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
+ **/
+char *
+gupnp_didl_lite_object_get_date_xml_string (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
+
+        return xml_util_get_child_string (object->priv->xml_node,
+                                          object->priv->xml_doc->doc,
+                                          "date");
+}
+
+/**
+ * gupnp_didl_lite_object_get_upnp_class_xml_string:
+ * @object: A #GUPnPDIDLLiteObject
+ *
+ * Creates a string representation of the DIDL-Lite XML fragment related to the
+ * object UPnP class.
+ *
+ * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
+ **/
+char *
+gupnp_didl_lite_object_get_upnp_class_xml_string (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
+
+        return xml_util_get_child_string (object->priv->xml_node,
+                                          object->priv->xml_doc->doc,
+                                          "class");
+}
+
+/**
+ * gupnp_didl_lite_object_get_album_xml_string:
+ * @object: A #GUPnPDIDLLiteObject
+ *
+ * Creates a string representation of the DIDL-Lite XML fragment related to the
+ * object album.
+ *
+ * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
+ **/
+char *
+gupnp_didl_lite_object_get_album_xml_string (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
+
+        return xml_util_get_child_string (object->priv->xml_node,
+                                          object->priv->xml_doc->doc,
+                                          "album");
+}
+
+/**
+ * gupnp_didl_lite_object_get_track_number_xml_string:
+ * @object: A #GUPnPDIDLLiteObject
+ *
+ * Creates a string representation of the DIDL-Lite XML fragment related to the
+ * object track number.
+ *
+ * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
+ **/
+char *
+gupnp_didl_lite_object_get_track_number_xml_string (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
+
+        return xml_util_get_child_string (object->priv->xml_node,
+                                          object->priv->xml_doc->doc,
+                                          "originalTrackNumber");
+}
+
+/**
+ * gupnp_didl_lite_object_get_artists_xml_string:
+ * @object: A #GUPnPDIDLLiteObject
+ *
+ * Creates a string representation of the DIDL-Lite XML fragments related to the
+ * object artists.
+ *
+ * Return value: A DIDL-Lite XML fragment string, or %NULL. #g_free after usage.
+ **/
+char *
+gupnp_didl_lite_object_get_artists_xml_string (GUPnPDIDLLiteObject *object)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object), NULL);
+
+        return get_contributors_xml_string_by_name (object, "artist");
+}
+
+/**
+ * gupnp_didl_lite_object_unset_artists:
+ * @object: #GUPnPDIDLLiteObject
+ *
+ * Unset the artists properties of the @object.
+ **/
+void
+gupnp_didl_lite_object_unset_artists (GUPnPDIDLLiteObject *object)
+{
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object));
+
+        unset_contributors_by_name (object, "artist");
+
+        g_object_notify (G_OBJECT (object), "artist");
+}
+
+/* GENERAL DOCS ABOUT FRAGMENT APPLYING.
+ *
+ * The function applying fragments takes two arrays of fragments. One
+ * array contains current fragments and another one contains new
+ * fragments. Both arrays have to be of equal length and have more
+ * then zero elements. Each of fragments in both arrays make a pair
+ * (i.e. first/second/third/... fragment in current array and
+ * first/second/third/... fragment in new array form a pair). Each
+ * fragment can have zero, one or more XML elements.
+ *
+ * For each fragment pair first we check if current fragment is indeed
+ * a part of this object's document. If it is then we check validity
+ * of new fragment for applying. If it is then we replace the current
+ * fragment with new fragment in object's document copy and validate
+ * the modified document against didl-lite schema. After all fragment
+ * pairs are processed we replace a part describing this object in
+ * original document with respective one in modified document.
+ *
+ * Checking if current fragment is a part of object's document is in
+ * essence checking for deep equality of document's node and this
+ * fragment (i.e. element name and properties have to be equal, same
+ * for children).
+ *
+ * Checking if new fragment is valid for applying is about checking
+ * whether element in new fragment is either a context (i.e. both
+ * current element and new element are deep equal) or element
+ * modification (i.e. changes attributes but element name is still the
+ * same). There may be a case when there are more elements in current
+ * fragment than in new fragment then those excessive elements are
+ * checked whether they can be really removed. The other case is when
+ * there are more elements in new fragments than in current fragment -
+ * in such situation we check if additions are valid.
+ *
+ * By checking validity of modification, removals or additions we mean
+ * that no read-only properties are changed. Additionaly, for
+ * removals, we check if required properties are not removed.
+ *
+ * This approach may fail in some more twisted cases.
+ */
+
+/**
+ * gupnp_didl_lite_object_apply_fragments:
+ * @object: The #GUPnPDIDLLiteObject
+ * @current_fragments: (array length=current_size) (transfer none): XML
+ * fragments of @object.
+ * @current_size: Size of @current_fragments or -1.
+ * @new_fragments: (array length=new_size) (transfer none): Substitutes
+ * for @current_fragments.
+ * @new_size: Size of @new_fragments or -1.
+ *
+ * Updates object by applying @new_fragments in places of
+ * @current_fragments. For @current_size and @new_size -1 can be
+ * passed when respectively @current_fragments and @new_fragments are
+ * NULL terminated.
+ *
+ * Returns: Result of operation.
+ */
+GUPnPDIDLLiteFragmentResult
+gupnp_didl_lite_object_apply_fragments (GUPnPDIDLLiteObject  *object,
+                                        gchar               **current_fragments,
+                                        gint                  current_size,
+                                        gchar               **new_fragments,
+                                        gint                  new_size)
+{
+        DocNode modified;
+        DocNode original;
+        GUPnPDIDLLiteFragmentResult result;
+        gint iter;
+
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_OBJECT (object),
+                              GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR);
+        g_return_val_if_fail (current_fragments != NULL,
+                              GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_INVALID);
+        g_return_val_if_fail (new_fragments != NULL,
+                              GUPNP_DIDL_LITE_FRAGMENT_RESULT_NEW_INVALID);
+
+        result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK;
+        modified.doc = NULL;
+
+        if (current_size < 0)
+                current_size = g_strv_length (current_fragments);
+        if (new_size < 0)
+                new_size = g_strv_length (new_fragments);
+
+        if (current_size != new_size) {
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_MISMATCH;
+
+                goto out;
+        }
+
+        if (!current_size) {
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_CURRENT_INVALID;
+
+                goto out;
+        }
+
+        original.doc = object->priv->xml_doc->doc;
+        original.node = object->priv->xml_node;
+        modified.doc = xmlCopyDoc (original.doc, 1);
+
+        if (modified.doc == NULL) {
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+
+                goto out;
+        }
+
+        modified.node = xml_util_find_node (modified.doc->children,
+                                            original.node);
+
+        if (modified.node == NULL) {
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+
+                goto out;
+        }
+
+        for (iter = 0; iter < new_size; ++iter) {
+                const gchar *current_fragment = current_fragments[iter];
+                const gchar *new_fragment = new_fragments[iter];
+
+                result = fragment_util_check_fragments (&original,
+                                                        &modified,
+                                                        current_fragment,
+                                                        new_fragment,
+                                                        didl_lite_xsd);
+
+                if (result != GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK)
+                        goto out;
+        }
+
+        if (!fragment_util_apply_modification (&object->priv->xml_node,
+                                               &modified))
+                result = GUPNP_DIDL_LITE_FRAGMENT_RESULT_UNKNOWN_ERROR;
+ out:
+        if (modified.doc != NULL)
+                xmlFreeDoc (modified.doc);
+        return result;
+}
index 722e833..6ca982d 100644 (file)
@@ -1,10 +1,12 @@
 /*
  * Copyright (C) 2009 Nokia Corporation.
  * Copyright (C) 2007, 2008 OpenedHand Ltd.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
  *                                <zeeshanak@gnome.org>
  *          Jorn Baayen <jorn@openedhand.com>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -32,6 +34,7 @@
 #include "gupnp-didl-lite-resource.h"
 #include "gupnp-didl-lite-descriptor.h"
 #include "gupnp-didl-lite-contributor.h"
+#include "gupnp-av-enums.h"
 
 G_BEGIN_DECLS
 
@@ -110,10 +113,10 @@ gupnp_didl_lite_object_get_restricted   (GUPnPDIDLLiteObject *object);
 const char *
 gupnp_didl_lite_object_get_title        (GUPnPDIDLLiteObject *object);
 
-#ifndef GUPNP_DISABLE_DEPRECATED
 const char *
 gupnp_didl_lite_object_get_creator      (GUPnPDIDLLiteObject *object);
 
+#ifndef GUPNP_DISABLE_DEPRECATED
 const char *
 gupnp_didl_lite_object_get_artist       (GUPnPDIDLLiteObject *object);
 
@@ -158,6 +161,12 @@ gupnp_didl_lite_object_get_track_number (GUPnPDIDLLiteObject *object);
 GUPnPOCMFlags
 gupnp_didl_lite_object_get_dlna_managed (GUPnPDIDLLiteObject *object);
 
+guint
+gupnp_didl_lite_object_get_update_id    (GUPnPDIDLLiteObject *object);
+
+gboolean
+gupnp_didl_lite_object_update_id_is_set (GUPnPDIDLLiteObject *object);
+
 GList *
 gupnp_didl_lite_object_get_resources    (GUPnPDIDLLiteObject *object);
 
@@ -194,11 +203,11 @@ void
 gupnp_didl_lite_object_set_title        (GUPnPDIDLLiteObject *object,
                                          const char          *title);
 
-#ifndef GUPNP_DISABLE_DEPRECATED
 void
 gupnp_didl_lite_object_set_creator      (GUPnPDIDLLiteObject *object,
                                          const char          *creator);
 
+#ifndef GUPNP_DISABLE_DEPRECATED
 void
 gupnp_didl_lite_object_set_artist       (GUPnPDIDLLiteObject *object,
                                          const char          *artist);
@@ -235,12 +244,12 @@ gupnp_didl_lite_object_set_album_art    (GUPnPDIDLLiteObject *object,
                                          const char          *album_art);
 
 void
-gupnp_didl_lite_object_set_description (GUPnPDIDLLiteObject *object,
-                                        const char          *description);
+gupnp_didl_lite_object_set_description  (GUPnPDIDLLiteObject *object,
+                                         const char          *description);
 
 void
-gupnp_didl_lite_object_set_date        (GUPnPDIDLLiteObject *object,
-                                        const char          *date);
+gupnp_didl_lite_object_set_date         (GUPnPDIDLLiteObject *object,
+                                         const char          *date);
 
 void
 gupnp_didl_lite_object_set_track_number (GUPnPDIDLLiteObject *object,
@@ -250,6 +259,48 @@ void
 gupnp_didl_lite_object_set_dlna_managed (GUPnPDIDLLiteObject *object,
                                          GUPnPOCMFlags        dlna_managed);
 
+void
+gupnp_didl_lite_object_set_update_id    (GUPnPDIDLLiteObject *object,
+                                         guint                update_id);
+
+void
+gupnp_didl_lite_object_unset_update_id  (GUPnPDIDLLiteObject *object);
+
+char *
+gupnp_didl_lite_object_get_title_xml_string
+                                        (GUPnPDIDLLiteObject *object);
+
+char *
+gupnp_didl_lite_object_get_date_xml_string
+                                        (GUPnPDIDLLiteObject *object);
+
+char *
+gupnp_didl_lite_object_get_upnp_class_xml_string
+                                        (GUPnPDIDLLiteObject *object);
+
+char *
+gupnp_didl_lite_object_get_album_xml_string
+                                        (GUPnPDIDLLiteObject *object);
+
+char *
+gupnp_didl_lite_object_get_track_number_xml_string
+                                        (GUPnPDIDLLiteObject *object);
+
+char *
+gupnp_didl_lite_object_get_artists_xml_string
+                                        (GUPnPDIDLLiteObject *object);
+
+void
+gupnp_didl_lite_object_unset_artists    (GUPnPDIDLLiteObject *object);
+
+GUPnPDIDLLiteFragmentResult
+gupnp_didl_lite_object_apply_fragments
+                                      (GUPnPDIDLLiteObject  *object,
+                                       gchar               **current_fragments,
+                                       gint                  current_size,
+                                       gchar               **new_fragments,
+                                       gint                  new_size);
+
 G_END_DECLS
 
 #endif /* __GUPNP_DIDL_LITE_OBJECT_H__ */
index 240b070..8b4e064 100644 (file)
@@ -1,10 +1,12 @@
 /*
  * Copyright (C) 2009 Nokia Corporation.
  * Copyright (C) 2007, 2008 OpenedHand Ltd.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
  *                                <zeeshanak@gnome.org>
  *          Jorn Baayen <jorn@openedhand.com>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -70,7 +72,9 @@ enum {
 
         PROP_WIDTH,
         PROP_HEIGHT,
-        PROP_COLOR_DEPTH
+        PROP_COLOR_DEPTH,
+
+        PROP_UPDATE_COUNT
 };
 
 static void
@@ -227,6 +231,11 @@ gupnp_didl_lite_resource_set_property (GObject      *object,
                                 (resource,
                                  g_value_get_int (value));
                 break;
+        case PROP_UPDATE_COUNT:
+                gupnp_didl_lite_resource_set_update_count
+                                        (resource,
+                                         g_value_get_uint (value));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                 break;
@@ -318,6 +327,11 @@ gupnp_didl_lite_resource_get_property (GObject    *object,
                         (value,
                          gupnp_didl_lite_resource_get_color_depth (resource));
                 break;
+        case PROP_UPDATE_COUNT:
+                g_value_set_uint
+                         (value,
+                          gupnp_didl_lite_resource_get_update_count (resource));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                 break;
@@ -663,6 +677,25 @@ gupnp_didl_lite_resource_class_init (GUPnPDIDLLiteResourceClass *klass)
                                    G_PARAM_STATIC_NAME |
                                    G_PARAM_STATIC_NICK |
                                    G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPDIDLLiteResource:update_count:
+         *
+         * The update count of this resource.
+         **/
+        g_object_class_install_property
+                       (object_class,
+                        PROP_UPDATE_COUNT,
+                        g_param_spec_uint ("update-count",
+                                           "UpdateCount",
+                                           "The update count of this resource.",
+                                           0,
+                                           G_MAXUINT,
+                                           0,
+                                           G_PARAM_READWRITE |
+                                           G_PARAM_STATIC_NAME |
+                                           G_PARAM_STATIC_NICK |
+                                           G_PARAM_STATIC_BLURB));
 }
 
 /**
@@ -985,6 +1018,44 @@ gupnp_didl_lite_resource_get_color_depth (GUPnPDIDLLiteResource *resource)
 }
 
 /**
+ * gupnp_didl_lite_resource_get_update_count:
+ * @resource: A #GUPnPDIDLLiteResource
+ *
+ * Get the update count of this resource.
+ *
+ * Return value: The update count of the @resource.
+ **/
+guint
+gupnp_didl_lite_resource_get_update_count (GUPnPDIDLLiteResource *resource)
+{
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), 0);
+
+        return xml_util_get_uint_attribute (resource->priv->xml_node,
+                                            "updateCount",
+                                            -1);
+}
+
+/**
+ * gupnp_didl_lite_resource_update_count_is_set:
+ * @resource: A #GUPnPDIDLLiteResource
+ *
+ * Check whether the update count property of this resource is set.
+ *
+ * Return value: %TRUE if set, otherwise %FALSE.
+ **/
+gboolean
+gupnp_didl_lite_resource_update_count_is_set (GUPnPDIDLLiteResource *resource)
+{
+        const char *content;
+
+        g_return_val_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource), FALSE);
+
+        content = xml_util_get_attribute_content (resource->priv->xml_node,
+                                                  "updateCount");
+        return content != NULL;
+}
+
+/**
  * gupnp_didl_lite_resource_set_uri:
  * @resource: A #GUPnPDIDLLiteResource
  * @uri: The URI as string
@@ -1417,3 +1488,47 @@ gupnp_didl_lite_resource_set_color_depth (GUPnPDIDLLiteResource *resource,
         g_object_notify (G_OBJECT (resource), "color-depth");
 }
 
+/**
+ * gupnp_didl_lite_resource_set_update_count:
+ * @resource: A #GUPnPDIDLLiteResource
+ * @update_count: The update_count
+ *
+ * Set the update count of this resource.
+ *
+ * Return value: None.
+ **/
+void
+gupnp_didl_lite_resource_set_update_count (GUPnPDIDLLiteResource *resource,
+                                          guint                  update_count)
+{
+        char *str;
+
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource));
+
+        str = g_strdup_printf ("%u", update_count);
+        xmlSetProp (resource->priv->xml_node,
+                    (unsigned char *) "updateCount",
+                    (unsigned char *) str);
+        g_free (str);
+
+        g_object_notify (G_OBJECT (resource), "update-count");
+}
+
+/**
+ * gupnp_didl_lite_resource_unset_update_count:
+ * @resource: A #GUPnPDIDLLiteResource
+ *
+ * Unset the update count of this resource.
+ *
+ * Return value: None.
+ **/
+void
+gupnp_didl_lite_resource_unset_update_count (GUPnPDIDLLiteResource *resource)
+{
+        g_return_if_fail (GUPNP_IS_DIDL_LITE_RESOURCE (resource));
+
+        xmlUnsetProp (resource->priv->xml_node,
+                      (unsigned char *) "updateCount");
+
+        g_object_notify (G_OBJECT (resource), "update-count");
+}
index 1f3b8f3..cba2e71 100644 (file)
@@ -1,10 +1,12 @@
 /*
  * Copyright (C) 2009 Nokia Corporation.
  * Copyright (C) 2007, 2008 OpenedHand Ltd.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Authors: Zeeshan Ali (Khattak) <zeeshan.ali@nokia.com>
  *                                <zeeshanak@gnome.org>
  *          Jorn Baayen <jorn@openedhand.com>
+ *          Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -139,6 +141,15 @@ gupnp_didl_lite_resource_set_color_depth
                                         (GUPnPDIDLLiteResource *resource,
                                          int                    color_depth);
 
+void
+gupnp_didl_lite_resource_set_update_count
+                                        (GUPnPDIDLLiteResource *resource,
+                                         guint                  update_count);
+
+void
+gupnp_didl_lite_resource_unset_update_count
+                                        (GUPnPDIDLLiteResource *resource);
+
 xmlNode *
 gupnp_didl_lite_resource_get_xml_node   (GUPnPDIDLLiteResource *resource);
 
@@ -189,6 +200,14 @@ int
 gupnp_didl_lite_resource_get_color_depth
                                         (GUPnPDIDLLiteResource *resource);
 
+guint
+gupnp_didl_lite_resource_get_update_count
+                                        (GUPnPDIDLLiteResource *resource);
+
+gboolean
+gupnp_didl_lite_resource_update_count_is_set
+                                        (GUPnPDIDLLiteResource *resource);
+
 G_END_DECLS
 
 #endif /* __GUPNP_DIDL_LITE_RESOURCE_H__ */
index baec6fc..e4dcaef 100644 (file)
@@ -441,7 +441,7 @@ gupnp_didl_lite_writer_class_init (GUPnPDIDLLiteWriterClass *klass)
 
 /**
  * gupnp_didl_lite_writer_new:
- * @language: The language the DIDL-Lite fragment is in, or NULL
+ * @language: (allow-none):The language the DIDL-Lite fragment is in, or NULL
  *
  * Return value: A new #GUPnPDIDLLiteWriter object.
  **/
diff --git a/libgupnp-av/gupnp-feature-list-parser.c b/libgupnp-av/gupnp-feature-list-parser.c
new file mode 100644 (file)
index 0000000..0f69277
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Regis Merlino <regis.merlino@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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-feature-list-parser
+ * @short_description: FeatureList state variable XML parser
+ *
+ * #GUPnPFeatureListParser parses XML strings from ContentDirectory
+ * FeatureList state variable.
+ *
+ */
+
+#include <string.h>
+#include "gupnp-feature-list-parser.h"
+#include "gupnp-av.h"
+#include "xml-util.h"
+
+/* GUPnPFeatureListParser */
+G_DEFINE_TYPE (GUPnPFeatureListParser,
+               gupnp_feature_list_parser,
+               G_TYPE_OBJECT);
+
+static void
+gupnp_feature_list_parser_init (GUPnPFeatureListParser *parser)
+{
+        /* Nothing to do here */
+}
+
+static void
+gupnp_feature_list_parser_finalize (GObject *object)
+{
+        GObjectClass *object_class;
+
+        object_class = G_OBJECT_CLASS (gupnp_feature_list_parser_parent_class);
+        object_class->finalize (object);
+}
+
+static void
+gupnp_feature_list_parser_class_init (GUPnPFeatureListParserClass *klass)
+{
+        GObjectClass *object_class;
+
+        object_class = G_OBJECT_CLASS (klass);
+
+        object_class->finalize = gupnp_feature_list_parser_finalize;
+}
+
+/**
+ * gupnp_feature_list_parser_new:
+ *
+ * Return value: A new #GUPnPFeatureListParser object.
+ **/
+GUPnPFeatureListParser *
+gupnp_feature_list_parser_new (void)
+{
+        return g_object_new (GUPNP_TYPE_FEATURE_LIST_PARSER, NULL);
+}
+
+static char *
+get_feature_object_ids (xmlNode *feature)
+{
+        xmlNode    *element;
+        char       *object_ids = NULL;
+        const char *content;
+
+        object_ids = (char *) g_malloc0(1);
+
+        for (element = feature->children; element; element = element->next) {
+                gsize new_size;
+
+                if (g_ascii_strcasecmp ((char *) element->name,
+                                        "objectIDs") == 0) {
+                        content = (const char *) xmlNodeGetContent (element);
+
+                        new_size = strlen (object_ids) + strlen (content) + 1;
+                        if (*object_ids)
+                                new_size++;
+
+                        object_ids = g_realloc (object_ids, new_size);
+
+                        if (*object_ids)
+                                strcat (object_ids, ",");
+                        strcat (object_ids, content);
+                }
+        }
+
+        return object_ids;
+}
+
+/**
+ * gupnp_feature_list_parser_parse_text:
+ * @parser: A #GUPnPFeatureListParser
+ * @text: The feature list string to be parsed
+ * @error: The location where to store the error information if any, or NULL
+ *
+ * Parses @text and returns the list of available features.
+ * If an error occured @error will be set.
+ *
+ * Return value: (transfer full) (element-type GUPnPFeature): The list of
+ * features or %NULL if an error occured.
+ **/
+GList *
+gupnp_feature_list_parser_parse_text (GUPnPFeatureListParser *parser,
+                                      const char             *text,
+                                      GError                **error)
+{
+        xmlDoc       *doc;
+        xmlNode      *element;
+        GList        *feature_list = NULL;
+
+        doc = xmlRecoverMemory (text, strlen (text));
+        if (doc == NULL) {
+                g_set_error (error,
+                             GUPNP_XML_ERROR,
+                             GUPNP_XML_ERROR_PARSE,
+                             "Could not parse FeatureList XML:\n%s", text);
+
+                return NULL;
+        }
+
+        /* Get a pointer to root element */
+        element = xml_util_get_element ((xmlNode *) doc, "Features", NULL);
+        if (element == NULL) {
+                g_set_error (error,
+                             GUPNP_XML_ERROR,
+                             GUPNP_XML_ERROR_NO_NODE,
+                             "No 'Features' node in the XML:\n%s",
+                             text);
+                xmlFreeDoc (doc);
+
+                return NULL;
+        }
+
+        for (element = element->children; element; element = element->next) {
+                GUPnPFeature *feature;
+                const char   *name;
+                const char   *version;
+                char         *object_ids;
+
+                if (g_ascii_strcasecmp ((char *) element->name,
+                                        "Feature") == 0) {
+                        name = xml_util_get_attribute_content (element, "name");
+                        version = xml_util_get_attribute_content (element,
+                                                                  "version");
+                        if (!name || !version) {
+                                g_set_error (error,
+                                             GUPNP_XML_ERROR,
+                                             GUPNP_XML_ERROR_INVALID_ATTRIBUTE,
+                                             "Invalid attributes in 'Feature' "
+                                             "node in the XML:\n%s",
+                                             text);
+
+                                xmlFreeDoc (doc);
+                                if (feature_list)
+                                        g_list_free_full (feature_list,
+                                                          g_object_unref);
+
+                                return NULL;
+                        }
+
+                        object_ids = get_feature_object_ids (element);
+
+                        feature = g_object_new (GUPNP_TYPE_FEATURE,
+                                                "name", name,
+                                                "version", version,
+                                                "object-ids", object_ids,
+                                                NULL);
+
+                        feature_list = g_list_append (feature_list, feature);
+
+                        g_free (object_ids);
+                }
+        }
+
+        xmlFreeDoc (doc);
+
+        return feature_list;
+}
diff --git a/libgupnp-av/gupnp-feature-list-parser.h b/libgupnp-av/gupnp-feature-list-parser.h
new file mode 100644 (file)
index 0000000..aa7cc68
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Regis Merlino <regis.merlino@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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_FEATURE_LIST_PARSER_H_
+#define __GUPNP_FEATURE_LIST_PARSER_H_
+
+#include <glib-object.h>
+#include "gupnp-feature.h"
+
+G_BEGIN_DECLS
+
+GType
+gupnp_feature_list_parser_get_type (void) G_GNUC_CONST;
+
+#define GUPNP_TYPE_FEATURE_LIST_PARSER \
+                (gupnp_feature_list_parser_get_type ())
+#define GUPNP_FEATURE_LIST_PARSER(obj) \
+                (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                 GUPNP_TYPE_FEATURE_LIST_PARSER, \
+                 GUPnPFeatureListParser))
+#define GUPNP_FEATURE_LIST_PARSER_CLASS(obj) \
+                (G_TYPE_CHECK_CLASS_CAST ((obj), \
+                 GUPNP_TYPE_FEATURE_LIST_PARSER, \
+                 GUPnPFeatureListParserClass))
+#define GUPNP_IS_FEATURE_LIST_PARSER(obj) \
+                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                 GUPNP_TYPE_FEATURE_LIST_PARSER))
+#define GUPNP_IS_FEATURE_LIST_PARSER_CLASS(obj) \
+                (G_TYPE_CHECK_CLASS_TYPE ((obj), \
+                 GUPNP_TYPE_FEATURE_LIST_PARSER))
+#define GUPNP_FEATURE_LIST_PARSER_GET_CLASS(obj) \
+                (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                 GUPNP_TYPE_FEATURE_LIST_PARSER, \
+                 GUPnPFeatureListParserClass))
+
+typedef struct {
+        GObject parent;
+} GUPnPFeatureListParser;
+
+typedef struct {
+        GObjectClass parent_class;
+} GUPnPFeatureListParserClass;
+
+GUPnPFeatureListParser *
+gupnp_feature_list_parser_new        (void);
+
+GList *
+gupnp_feature_list_parser_parse_text (GUPnPFeatureListParser *parser,
+                                      const char             *text,
+                                      GError                 **error);
+
+G_END_DECLS
+
+#endif /* __GUPNP_FEATURE_LIST_PARSER_H_ */
diff --git a/libgupnp-av/gupnp-feature.c b/libgupnp-av/gupnp-feature.c
new file mode 100644 (file)
index 0000000..872857d
--- /dev/null
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Regis Merlino <regis.merlino@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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-feature
+ * @short_description: ContentDirectory feature
+ *
+ * #GUPnPFeature respresent a Feature element.
+ */
+
+#include "gupnp-feature.h"
+
+G_DEFINE_TYPE (GUPnPFeature,
+               gupnp_feature,
+               G_TYPE_OBJECT);
+
+struct _GUPnPFeaturePrivate {
+        char *name;
+        char *version;
+        char *object_ids;
+};
+
+enum {
+        PROP_0,
+        PROP_NAME,
+        PROP_VERSION,
+        PROP_OBJECT_IDS
+};
+
+static void
+gupnp_feature_init (GUPnPFeature *object)
+{
+        object->priv = G_TYPE_INSTANCE_GET_PRIVATE (object,
+                                                    GUPNP_TYPE_FEATURE,
+                                                    GUPnPFeaturePrivate);
+}
+
+static void
+gupnp_feature_finalize (GObject *object)
+{
+        GObjectClass        *object_class;
+        GUPnPFeaturePrivate *priv;
+
+        priv = GUPNP_FEATURE (object)->priv;
+        g_free (priv->name);
+        g_free (priv->version);
+        g_free (priv->object_ids);
+
+        object_class = G_OBJECT_CLASS (gupnp_feature_parent_class);
+        object_class->finalize (object);
+}
+
+static void
+gupnp_feature_get_property (GObject    *object,
+                            guint       property_id,
+                            GValue     *value,
+                            GParamSpec *pspec)
+{
+        GUPnPFeature *feature;
+
+        feature = GUPNP_FEATURE (object);
+
+        switch (property_id) {
+        case PROP_NAME:
+                g_value_set_string (value, gupnp_feature_get_name (feature));
+                break;
+        case PROP_VERSION:
+                g_value_set_string (value, gupnp_feature_get_version (feature));
+                break;
+        case PROP_OBJECT_IDS:
+                g_value_set_string (value,
+                                    gupnp_feature_get_object_ids (feature));
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_feature_set_property (GObject      *object,
+                            guint         property_id,
+                            const GValue *value,
+                            GParamSpec   *pspec)
+{
+        GUPnPFeature *feature;
+
+        feature = GUPNP_FEATURE (object);
+
+        switch (property_id) {
+        case PROP_NAME:
+                feature->priv->name = g_value_dup_string (value);
+                break;
+        case PROP_VERSION:
+                feature->priv->version = g_value_dup_string (value);
+                break;
+        case PROP_OBJECT_IDS:
+                feature->priv->object_ids = g_value_dup_string (value);
+                break;
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+                break;
+        }
+}
+
+static void
+gupnp_feature_class_init (GUPnPFeatureClass *klass)
+{
+        GObjectClass *object_class;
+
+        object_class = G_OBJECT_CLASS (klass);
+
+        object_class->get_property = gupnp_feature_get_property;
+        object_class->set_property = gupnp_feature_set_property;
+        object_class->finalize = gupnp_feature_finalize;
+
+        g_type_class_add_private (klass, sizeof (GUPnPFeaturePrivate));
+
+        /**
+         * GUPnPFeature:name:
+         *
+         * The name of this feature.
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_NAME,
+                 g_param_spec_string ("name",
+                                      "Name",
+                                      "The name of this feature.",
+                                      NULL,
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY |
+                                      G_PARAM_STATIC_NAME |
+                                      G_PARAM_STATIC_NICK |
+                                      G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPFeature:version:
+         *
+         * The version of this feature.
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_VERSION,
+                 g_param_spec_string ("version",
+                                      "Version",
+                                      "The version of this feature.",
+                                      NULL,
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY |
+                                      G_PARAM_STATIC_NAME |
+                                      G_PARAM_STATIC_NICK |
+                                      G_PARAM_STATIC_BLURB));
+
+        /**
+         * GUPnPFeature:object-ids:
+         *
+         * The object IDs related to this feature.
+         **/
+        g_object_class_install_property
+                (object_class,
+                 PROP_OBJECT_IDS,
+                 g_param_spec_string ("object-ids",
+                                      "Object IDs",
+                                      "The object IDs of this feature.",
+                                      NULL,
+                                      G_PARAM_READWRITE |
+                                      G_PARAM_CONSTRUCT_ONLY |
+                                      G_PARAM_STATIC_NAME |
+                                      G_PARAM_STATIC_NICK |
+                                      G_PARAM_STATIC_BLURB));
+}
+
+/**
+ * gupnp_feature_get_name:
+ * @feature: #GUPnPFeature
+ *
+ * Get the name of the @feature.
+ *
+ * Return value: The name of the @feature.
+ **/
+const char *
+gupnp_feature_get_name (GUPnPFeature *feature)
+{
+        return feature->priv->name;
+}
+
+/**
+ * gupnp_feature_get_version:
+ * @feature: #GUPnPFeature
+ *
+ * Get the version of the @feature.
+ *
+ * Return value: The version of the @feature.
+ **/
+const char *
+gupnp_feature_get_version (GUPnPFeature *feature)
+{
+        return feature->priv->version;
+}
+
+/**
+ * gupnp_feature_get_object_ids:
+ * @feature: #GUPnPFeature
+ *
+ * Get the object IDs related to the @feature.
+ *
+ * Return value: The object IDs related to the @feature.
+ **/
+const char *
+gupnp_feature_get_object_ids (GUPnPFeature *feature)
+{
+        return feature->priv->object_ids;
+}
diff --git a/libgupnp-av/gupnp-feature.h b/libgupnp-av/gupnp-feature.h
new file mode 100644 (file)
index 0000000..cc3e259
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * Authors: Regis Merlino <regis.merlino@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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_FEATURE_H_
+#define __GUPNP_FEATURE_H_
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+GType
+gupnp_feature_get_type (void) G_GNUC_CONST;
+
+#define GUPNP_TYPE_FEATURE \
+                (gupnp_feature_get_type ())
+#define GUPNP_FEATURE(obj) \
+                (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                 GUPNP_TYPE_FEATURE, \
+                 GUPnPFeature))
+#define GUPNP_FEATURE_CLASS(obj) \
+                (G_TYPE_CHECK_CLASS_CAST ((obj), \
+                 GUPNP_TYPE_FEATURE, \
+                 GUPnPFeatureClass))
+#define GUPNP_IS_FEATURE(obj) \
+                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                 GUPNP_TYPE_FEATURE))
+#define GUPNP_IS_FEATURE_CLASS(obj) \
+                (G_TYPE_CHECK_CLASS_TYPE ((obj), \
+                 GUPNP_TYPE_FEATURE))
+#define GUPNP_FEATURE_GET_CLASS(obj) \
+                (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+                 GUPNP_TYPE_FEATURE, \
+                 GUPnPFeatureClass))
+
+typedef struct _GUPnPFeaturePrivate GUPnPFeaturePrivate;
+
+typedef struct {
+        GObject parent;
+
+        GUPnPFeaturePrivate *priv;
+} GUPnPFeature;
+
+typedef struct {
+        GObjectClass parent_class;
+} GUPnPFeatureClass;
+
+const char *
+gupnp_feature_get_name       (GUPnPFeature *feature);
+
+const char *
+gupnp_feature_get_version    (GUPnPFeature *feature);
+
+const char *
+gupnp_feature_get_object_ids (GUPnPFeature *feature);
+
+G_END_DECLS
+
+#endif /* __GUPNP_FEATURE_H_ */
index 9e4dbda..c6fb141 100644 (file)
@@ -46,34 +46,34 @@ gupnp_search_criteria_op_get_type (void)
                 static const GEnumValue values[] = {
                         { GUPNP_SEARCH_CRITERIA_OP_EQ,
                           "GUPNP_SEARCH_CRITERIA_OP_EQ",
-                          "none" },
+                          "EQ" },
                         { GUPNP_SEARCH_CRITERIA_OP_NEQ,
                           "GUPNP_SEARCH_CRITERIA_OP_NEQ",
-                          "none" },
+                          "NEQ" },
                         { GUPNP_SEARCH_CRITERIA_OP_LESS,
                           "GUPNP_SEARCH_CRITERIA_OP_LESS",
-                          "none" },
+                          "LESS" },
                         { GUPNP_SEARCH_CRITERIA_OP_LEQ,
                           "GUPNP_SEARCH_CRITERIA_OP_LEQ",
-                          "none" },
+                          "LEQ" },
                         { GUPNP_SEARCH_CRITERIA_OP_GREATER,
                           "GUPNP_SEARCH_CRITERIA_OP_GREATER",
-                          "none" },
+                          "GREATER" },
                         { GUPNP_SEARCH_CRITERIA_OP_GEQ,
                           "GUPNP_SEARCH_CRITERIA_OP_GEQ",
-                          "none" },
+                          "GEQ" },
                         { GUPNP_SEARCH_CRITERIA_OP_CONTAINS,
                           "GUPNP_SEARCH_CRITERIA_OP_CONTAINS",
-                          "none" },
+                          "CONTAINS" },
                         { GUPNP_SEARCH_CRITERIA_OP_DOES_NOT_CONTAIN,
                           "GUPNP_SEARCH_CRITERIA_OP_DOES_NOT_CONTAIN",
-                          "none" },
+                          "DOES_NOT_CONTAIN" },
                         { GUPNP_SEARCH_CRITERIA_OP_DERIVED_FROM,
                           "GUPNP_SEARCH_CRITERIA_OP_DERIVED_FROM",
-                          "none" },
+                          "DERIVED_FROM" },
                         { GUPNP_SEARCH_CRITERIA_OP_EXISTS,
                           "GUPNP_SEARCH_CRITERIA_OP_EXISTS",
-                          "none" },
+                          "EXISTS" },
                         { 0, NULL, NULL }
                 };
 
index 4017648..1342ddc 100644 (file)
@@ -42,7 +42,11 @@ gvalue_util_set_value_from_string (GValue     *value,
                 break;
 
         case G_TYPE_CHAR:
+#if GLIB_CHECK_VERSION(2,32,0)
+                g_value_set_schar (value, *str);
+#else
                 g_value_set_char (value, *str);
+#endif
 
                 break;
 
index 92e71bb..4543c74 100644 (file)
@@ -1,9 +1,11 @@
 /*
  * Copyright (C) 2006, 2007 OpenedHand Ltd.
  * Copyright (C) 2007 Zeeshan Ali.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Author: Jorn Baayen <jorn@openedhand.com>
  * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+ * Author: Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -63,9 +65,8 @@ xml_util_get_child_elements_by_name (xmlNode *node, const char *name)
        GList *children = NULL;
 
        for (node = node->children; node; node = node->next) {
-               if (node->name == NULL) {
+               if (node->name == NULL)
                        continue;
-               }
 
                if (strcmp (name, (char *) node->name) == 0) {
                        children = g_list_append (children, node);
@@ -93,6 +94,34 @@ xml_util_get_child_element_content (xmlNode    *node,
         return content;
 }
 
+guint
+xml_util_get_uint_child_element (xmlNode    *node,
+                                 const char *child_name,
+                                 guint       default_value)
+{
+        const char *content;
+
+        content = xml_util_get_child_element_content (node, child_name);
+        if (!content)
+                return default_value;
+
+        return strtoul (content, NULL, 0);
+}
+
+guint64
+xml_util_get_uint64_child_element (xmlNode    *node,
+                                   const char *child_name,
+                                   guint64     default_value)
+{
+        const char *content;
+
+        content = xml_util_get_child_element_content (node, child_name);
+        if (!content)
+                return default_value;
+
+        return g_ascii_strtoull (content, NULL, 0);
+}
+
 const char *
 xml_util_get_attribute_content (xmlNode    *node,
                                 const char *attribute_name)
@@ -199,12 +228,11 @@ xml_util_set_child (xmlNode    *parent_node,
         xmlChar *escaped;
 
         node = xml_util_get_element (parent_node, name, NULL);
-        if (node == NULL) {
+        if (node == NULL)
                 node = xmlNewChild (parent_node,
                                     namespace,
                                     (unsigned char *) name,
                                     NULL);
-        }
 
         escaped = xmlEncodeSpecialChars (doc, (const unsigned char *) value);
         xmlNodeSetContent (node, escaped);
@@ -213,6 +241,19 @@ xml_util_set_child (xmlNode    *parent_node,
         return node;
 }
 
+void
+xml_util_unset_child (xmlNode    *parent_node,
+                      const char *name)
+{
+        xmlNode *node;
+
+        node = xml_util_get_element (parent_node, name, NULL);
+        if (node != NULL) {
+                xmlUnlinkNode (node);
+                xmlFreeNode (node);
+        }
+}
+
 gboolean
 xml_util_verify_attribute_is_boolean (xmlNode    *node,
                                       const char *attribute_name)
@@ -234,3 +275,139 @@ xml_util_verify_attribute_is_boolean (xmlNode    *node,
                g_ascii_strcasecmp (str, "1") == 0;
 }
 
+char *
+xml_util_get_child_string (xmlNode    *parent_node,
+                           xmlDoc     *doc,
+                           const char *name)
+{
+        xmlBuffer *buffer;
+        char      *ret;
+        xmlNode   *node;
+
+        node = xml_util_get_element (parent_node, name, NULL);
+        if (!node)
+                return NULL;
+
+        buffer = xmlBufferCreate ();
+        xmlNodeDump (buffer,
+                     doc,
+                     node,
+                     0,
+                     0);
+        ret = g_strndup ((char *) xmlBufferContent (buffer),
+                         xmlBufferLength (buffer));
+        xmlBufferFree (buffer);
+
+        return ret;
+}
+
+gboolean
+xml_util_node_deep_equal (xmlNode *first,
+                          xmlNode *second)
+{
+        GHashTable *first_attributes;
+        xmlAttr *attribute;
+        gboolean equal;
+
+        if (first == NULL && second == NULL)
+                return TRUE;
+        if (first == NULL || second == NULL)
+                return FALSE;
+
+        if (xmlStrcmp (first->name, second->name))
+                return FALSE;
+
+        equal = FALSE;
+        first_attributes = xml_util_get_attributes_map (first);
+        /* compare attributes */
+        for (attribute = second->properties;
+             attribute != NULL;
+             attribute = attribute->next) {
+                const xmlChar *value = NULL;
+                const xmlChar *key = attribute->name;
+
+                if (g_hash_table_lookup_extended (first_attributes,
+                                                  key,
+                                                  NULL,
+                                                  (gpointer *) &value))
+                        if (!xmlStrcmp (value, attribute->children->content)) {
+                                g_hash_table_remove (first_attributes, key);
+
+                                continue;
+                        }
+
+                goto out;
+        }
+
+        if (g_hash_table_size (first_attributes))
+                goto out;
+
+        /* compare content */
+        if (xmlStrcmp (first->content, second->content))
+                goto out;
+        equal = TRUE;
+ out:
+        g_hash_table_unref (first_attributes);
+        if (equal) {
+                xmlNode *first_child;
+                xmlNode *second_child;
+
+                for (first_child = first->children,
+                     second_child = second->children;
+                     first_child != NULL && second_child != NULL;
+                     first_child = first_child->next,
+                     second_child = second_child->next)
+                        if (!xml_util_node_deep_equal (first_child, second_child))
+                                return FALSE;
+                if (first_child != NULL || second_child != NULL)
+                        return FALSE;
+        }
+
+        return equal;
+}
+
+xmlNode *
+xml_util_find_node (xmlNode *haystack,
+                    xmlNode *needle)
+{
+        xmlNodePtr iter;
+
+        if (xml_util_node_deep_equal (haystack, needle))
+                return haystack;
+
+        for (iter = haystack->children; iter != NULL; iter = iter->next) {
+                xmlNodePtr found_node = xml_util_find_node (iter, needle);
+
+                if (found_node != NULL)
+                        return found_node;
+        }
+
+        return NULL;
+}
+
+xmlNode *
+xml_util_copy_node (xmlNode *node)
+{
+        xmlNode *dup = xmlCopyNode (node, 1);
+
+        /* TODO: remove useless namespace definition. */
+
+        return dup;
+}
+
+GHashTable *
+xml_util_get_attributes_map (xmlNode *node)
+{
+        xmlAttr *attribute;
+        GHashTable *attributes_map = g_hash_table_new (g_str_hash,
+                                                       g_str_equal);
+
+        for (attribute = node->properties;
+             attribute != NULL;
+             attribute = attribute->next)
+                g_hash_table_insert (attributes_map,
+                                     (gpointer) attribute->name,
+                                     (gpointer) attribute->children->content);
+
+        return attributes_map;
+}
index e50066c..ffa5e50 100644 (file)
@@ -1,9 +1,11 @@
 /*
  * Copyright (C) 2006, 2007 OpenedHand Ltd.
  * Copyright (C) 2007 Zeeshan Ali.
+ * Copyright (C) 2012 Intel Corporation
  *
  * Author: Jorn Baayen <jorn@openedhand.com>
  * Author: Zeeshan Ali (Khattak) <zeeshanak@gnome.org>
+ * Author: Krzesimir Nowak <krnowak@openismus.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -28,6 +30,8 @@
 #include <libxml/tree.h>
 #include <stdarg.h>
 
+G_BEGIN_DECLS
+
 /* Misc utilities for inspecting xmlNodes */
 G_GNUC_INTERNAL xmlNode *
 xml_util_get_element                    (xmlNode    *node,
@@ -41,6 +45,16 @@ G_GNUC_INTERNAL const char *
 xml_util_get_child_element_content      (xmlNode    *node,
                                          const char *child_name);
 
+G_GNUC_INTERNAL guint
+xml_util_get_uint_child_element         (xmlNode    *node,
+                                         const char *child_name,
+                                         guint       default_value);
+
+G_GNUC_INTERNAL guint64
+xml_util_get_uint64_child_element       (xmlNode    *node,
+                                         const char *child_name,
+                                         guint64     default_value);
+
 G_GNUC_INTERNAL const char *
 xml_util_get_attribute_content          (xmlNode    *node,
                                          const char *attribute_name);
@@ -76,8 +90,33 @@ xml_util_set_child                      (xmlNode    *parent_node,
                                          const char *name,
                                          const char *value);
 
+G_GNUC_INTERNAL void
+xml_util_unset_child                    (xmlNode    *parent_node,
+                                         const char *name);
+
 G_GNUC_INTERNAL gboolean
 xml_util_verify_attribute_is_boolean    (xmlNode    *node,
                                          const char *attribute_name);
 
+G_GNUC_INTERNAL char *
+xml_util_get_child_string               (xmlNode    *parent_node,
+                                         xmlDoc     *doc,
+                                         const char *name);
+
+G_GNUC_INTERNAL gboolean
+xml_util_node_deep_equal                (xmlNode *first,
+                                         xmlNode *second);
+
+G_GNUC_INTERNAL xmlNode *
+xml_util_find_node                      (xmlNode *haystack,
+                                         xmlNode *needle);
+
+G_GNUC_INTERNAL xmlNode *
+xml_util_copy_node                      (xmlNode *node);
+
+G_GNUC_INTERNAL GHashTable *
+xml_util_get_attributes_map             (xmlNode *node);
+
+G_END_DECLS
+
 #endif /* __XML_UTIL_H__ */
diff --git a/libgupnp-av/xsd-data.c b/libgupnp-av/xsd-data.c
new file mode 100644 (file)
index 0000000..3f985a4
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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 <libxml/parser.h>
+#include <libxml/xmlschemas.h>
+
+#include "xsd-data.h"
+
+struct _XSDData {
+        xmlSchemaPtr schema;
+        xmlSchemaValidCtxtPtr valid_context;
+};
+
+XSDData *
+xsd_data_new (const gchar *xsd_file)
+{
+        XSDData *xsd_data = g_slice_new0 (XSDData);
+        gboolean failed = TRUE;
+        xmlSchemaParserCtxtPtr context = xmlSchemaNewParserCtxt (xsd_file);
+
+        if (context == NULL)
+                /* unable to create a parser context for the schema */
+                goto out;
+        xsd_data->schema = xmlSchemaParse (context);
+        if (xsd_data->schema == NULL)
+                /* the schema itself is not valid */
+                goto out;
+        xsd_data->valid_context = xmlSchemaNewValidCtxt (xsd_data->schema);
+        if (xsd_data->valid_context == NULL)
+                /* unable to create a validation context for the schema */
+                goto out;
+        failed = FALSE;
+ out:
+        if (context != NULL)
+                xmlSchemaFreeParserCtxt (context);
+        if (failed) {
+                xsd_data_free (xsd_data);
+                xsd_data = NULL;
+        }
+
+        return xsd_data;
+}
+
+void
+xsd_data_free (XSDData *xsd_data)
+{
+        if (xsd_data == NULL)
+                return;
+        if (xsd_data->valid_context != NULL)
+                xmlSchemaFreeValidCtxt (xsd_data->valid_context);
+        if (xsd_data->schema != NULL)
+                xmlSchemaFree (xsd_data->schema);
+        g_slice_free (XSDData, xsd_data);
+}
+
+gboolean
+xsd_data_validate_doc (XSDData *xsd_data,
+                       xmlDoc  *doc)
+{
+        static xmlSAXHandler empty_handler = {
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                NULL,
+                XML_SAX2_MAGIC,
+                NULL,
+                NULL,
+                NULL,
+                NULL
+        };
+        xmlChar *dump = NULL;
+        int size = 0;
+        xmlParserInputBufferPtr buffer = NULL;
+        gboolean result = FALSE;
+
+        if (xsd_data == NULL)
+                return TRUE;
+
+        xmlDocDumpMemory (doc, &dump, &size);
+        if (dump == NULL)
+                goto out;
+        g_debug ("Doc dump:\n%s", dump);
+        buffer = xmlParserInputBufferCreateMem ((char *) dump,
+                                                   size,
+                                                   XML_CHAR_ENCODING_NONE);
+        if (buffer == NULL)
+                goto out;
+        if (!xmlSchemaValidateStream (xsd_data->valid_context,
+                                      buffer,
+                                      XML_CHAR_ENCODING_NONE,
+                                      &empty_handler,
+                                      NULL))
+                result = TRUE;
+ out:
+        /* Commented out, because it crashes because of double free. I
+         * suppose that it is freed by xmlSchemaValidateStream.
+         */
+        /*
+        if (buffer)
+                xmlFreeParserInputBuffer (buffer);
+        */
+        if (dump != NULL)
+                xmlFree (dump);
+        return result;
+}
diff --git a/libgupnp-av/xsd-data.h b/libgupnp-av/xsd-data.h
new file mode 100644 (file)
index 0000000..b89dcd6
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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 __XSD_DATA_H__
+#define __XSD_DATA_H__
+
+#include <glib.h>
+#include <libxml/tree.h>
+
+G_BEGIN_DECLS
+
+typedef struct _XSDData XSDData;
+
+G_GNUC_INTERNAL XSDData *
+xsd_data_new                            (const gchar *xsd_file);
+
+G_GNUC_INTERNAL void
+xsd_data_free                           (XSDData *data);
+
+G_GNUC_INTERNAL gboolean
+xsd_data_validate_doc                   (XSDData *data,
+                                         xmlDoc  *doc);
+
+G_END_DECLS
+
+#endif /* __XSD_DATA_H__ */
diff --git a/m4/vapigen.m4 b/m4/vapigen.m4
new file mode 100644 (file)
index 0000000..df6395d
--- /dev/null
@@ -0,0 +1,41 @@
+
+dnl vala.m4
+dnl
+dnl Copyright 2010 Marc-Andre Lureau
+dnl Copyright 2011 Rodney Dawes <dobey.pwns@gmail.com>
+dnl
+dnl This library is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Lesser General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2.1 of the License, or (at your option) any later version.
+dnl
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+dnl Lesser General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU Lesser General Public
+dnl License along with this library; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
+
+dnl dropped everything but VALA_PROG_VAPIGEN - Jens Georg <mail@jensge.org>
+
+# Check whether the Vala API Generator exists in `PATH'. If it is found,
+# the variable VAPIGEN is set. Optionally a minimum release number of the
+# generator can be requested.
+#
+# VALA_PROG_VAPIGEN([MINIMUM-VERSION])
+# ------------------------------------
+AC_DEFUN([VALA_PROG_VAPIGEN],
+[AC_PATH_PROG([VAPIGEN], [vapigen], [])
+  AS_IF([test -z "$VAPIGEN"],
+    [AC_MSG_WARN([No Vala API Generator found. You will not be able to generate .vapi files.])],
+    [AS_IF([test -n "$1"],
+        [AC_MSG_CHECKING([$VAPIGEN is at least version $1])
+         am__vapigen_version=`$VAPIGEN --version | sed 's/Vala API Generator  *//'`
+         AS_VERSION_COMPARE([$1], ["$am__vapigen_version"],
+           [AC_MSG_RESULT([yes])],
+           [AC_MSG_RESULT([yes])],
+           [AC_MSG_RESULT([no])
+            AC_MSG_WARN([Vala API Generator $1 not found.])])])])
+])
index 2f5f6f4..7c028c4 100644 (file)
@@ -1,2 +1,5 @@
+* Tue Nov 13 19:46:48 CET 2012 - Mark Ryan <mark.d.ryan@intel.com>
+- Submit version 0.11.2 (62bb7a1) of GUPnP-AV
+
 * Fri Sep 14 16:44:24 CEST 2012 - Mark Ryan <mark.d.ryan@intel.com>
 - Submit version 0.10.3 (56ad1c8) of GUPnP-AV
index 40f3f0d..d955fae 100644 (file)
@@ -7,16 +7,17 @@
 
 Name:       gupnp-av
 Summary:    GUPnP-AV is a collection of helpers for building UPnP AV applications
-Version:    0.10.3
+Version:    0.11.2
 Release:    0
 Group:      System/Libraries
 License:    LGPLv2+
 URL:        http://www.gupnp.org/
-Source0:    http://download.gnome.org/sources/%{name}/0.10/%{name}-%{version}.tar.gz
+Source0:    http://download.gnome.org/sources/%{name}/0.11/%{name}-%{version}.tar.gz
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
 BuildRequires:  pkgconfig(gupnp-1.0)
 BuildRequires:  pkgconfig(glib-2.0)
+BuildRequires:  pkgconfig(gobject-2.0)
 BuildRequires:  pkgconfig(libxml-2.0)
 
 
@@ -88,5 +89,6 @@ rm -rf  $RPM_BUILD_ROOT%{_datadir}/gtk-doc
 %{_includedir}/gupnp-av-1.0/libgupnp-av
 %{_libdir}/*.so
 %{_libdir}/pkgconfig/gupnp-av-1.0.pc
+%{_datadir}/gupnp-av/*.xsd
 # << files devel
 
index 262ec91..de27f44 100644 (file)
@@ -1,16 +1,33 @@
 SUBDIRS = gtest
 
-AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir)
+common_cflags = \
+       $(LIBGUPNP_CFLAGS) \
+       -I$(top_srcdir)
+common_ldadd = \
+       $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
+       $(LIBGUPNP_LIBS)
 
 noinst_PROGRAMS = test-search-criteria-parser
+
 test_search_criteria_parser_SOURCES = test-search-criteria-parser.c
-test_search_criteria_parser_LDADD = \
-                       $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
-                       $(LIBGUPNP_LIBS)
+test_search_criteria_parser_LDADD = $(common_ldadd)
+test_search_criteria_parser_CFLAGS = $(common_cflags)
+
+check_PROGRAMS = \
+       check-search \
+       check-feature-list-parser \
+       fragments
 
-check_PROGRAMS = check-search
 check_search_SOURCES = check-search.c
-check_search_LDADD = $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
-                    $(LIBGUPNP_LIBS)
+check_search_LDADD = $(common_ldadd)
+check_search_CFLAGS = $(common_cflags)
+
+check_feature_list_parser_SOURCES = check-feature-list-parser.c
+check_feature_list_parser_LDADD = $(common_ldadd)
+check_feature_list_parser_CFLAGS = $(common_cflags)
+
+fragments_SOURCES = fragments.c
+fragments_LDADD = $(common_ldadd)
+fragments_CFLAGS = $(common_cflags) -DABS_TOP_SRCDIR="\"$(abs_top_srcdir)\""
 
 TESTS = $(check_PROGRAMS)
index 49d6445..7d5dec7 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 @SET_MAKE@
 
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -35,7 +52,8 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 noinst_PROGRAMS = test-search-criteria-parser$(EXEEXT)
-check_PROGRAMS = check-search$(EXEEXT)
+check_PROGRAMS = check-search$(EXEEXT) \
+       check-feature-list-parser$(EXEEXT) fragments$(EXEEXT)
 subdir = tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -43,7 +61,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -51,22 +69,41 @@ CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 PROGRAMS = $(noinst_PROGRAMS)
-am_check_search_OBJECTS = check-search.$(OBJEXT)
-check_search_OBJECTS = $(am_check_search_OBJECTS)
+am_check_feature_list_parser_OBJECTS =  \
+       check_feature_list_parser-check-feature-list-parser.$(OBJEXT)
+check_feature_list_parser_OBJECTS =  \
+       $(am_check_feature_list_parser_OBJECTS)
 am__DEPENDENCIES_1 =
-check_search_DEPENDENCIES =  \
-       $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
+am__DEPENDENCIES_2 = $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
        $(am__DEPENDENCIES_1)
+check_feature_list_parser_DEPENDENCIES = $(am__DEPENDENCIES_2)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
-am_test_search_criteria_parser_OBJECTS =  \
-       test-search-criteria-parser.$(OBJEXT)
+check_feature_list_parser_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(check_feature_list_parser_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+       $(LDFLAGS) -o $@
+am_check_search_OBJECTS = check_search-check-search.$(OBJEXT)
+check_search_OBJECTS = $(am_check_search_OBJECTS)
+check_search_DEPENDENCIES = $(am__DEPENDENCIES_2)
+check_search_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(check_search_CFLAGS) \
+       $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_fragments_OBJECTS = fragments-fragments.$(OBJEXT)
+fragments_OBJECTS = $(am_fragments_OBJECTS)
+fragments_DEPENDENCIES = $(am__DEPENDENCIES_2)
+fragments_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+       $(LIBTOOLFLAGS) --mode=link $(CCLD) $(fragments_CFLAGS) \
+       $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_test_search_criteria_parser_OBJECTS = test_search_criteria_parser-test-search-criteria-parser.$(OBJEXT)
 test_search_criteria_parser_OBJECTS =  \
        $(am_test_search_criteria_parser_OBJECTS)
-test_search_criteria_parser_DEPENDENCIES =  \
-       $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
-       $(am__DEPENDENCIES_1)
+test_search_criteria_parser_DEPENDENCIES = $(am__DEPENDENCIES_2)
+test_search_criteria_parser_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+       $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+       $(test_search_criteria_parser_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+       $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
@@ -93,9 +130,10 @@ am__v_CCLD_0 = @echo "  CCLD  " $@;
 AM_V_GEN = $(am__v_GEN_@AM_V@)
 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
-SOURCES = $(check_search_SOURCES) \
-       $(test_search_criteria_parser_SOURCES)
-DIST_SOURCES = $(check_search_SOURCES) \
+SOURCES = $(check_feature_list_parser_SOURCES) $(check_search_SOURCES) \
+       $(fragments_SOURCES) $(test_search_criteria_parser_SOURCES)
+DIST_SOURCES = $(check_feature_list_parser_SOURCES) \
+       $(check_search_SOURCES) $(fragments_SOURCES) \
        $(test_search_criteria_parser_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        html-recursive info-recursive install-data-recursive \
@@ -104,6 +142,11 @@ RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
        install-pdf-recursive install-ps-recursive install-recursive \
        installcheck-recursive installdirs-recursive pdf-recursive \
        ps-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
 AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
@@ -222,6 +265,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
@@ -276,16 +320,26 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 SUBDIRS = gtest
-AM_CFLAGS = $(LIBGUPNP_CFLAGS) -I$(top_srcdir)
-test_search_criteria_parser_SOURCES = test-search-criteria-parser.c
-test_search_criteria_parser_LDADD = \
-                       $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
-                       $(LIBGUPNP_LIBS)
+common_cflags = \
+       $(LIBGUPNP_CFLAGS) \
+       -I$(top_srcdir)
 
-check_search_SOURCES = check-search.c
-check_search_LDADD = $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
-                    $(LIBGUPNP_LIBS)
+common_ldadd = \
+       $(top_builddir)/libgupnp-av/libgupnp-av-1.0.la \
+       $(LIBGUPNP_LIBS)
 
+test_search_criteria_parser_SOURCES = test-search-criteria-parser.c
+test_search_criteria_parser_LDADD = $(common_ldadd)
+test_search_criteria_parser_CFLAGS = $(common_cflags)
+check_search_SOURCES = check-search.c
+check_search_LDADD = $(common_ldadd)
+check_search_CFLAGS = $(common_cflags)
+check_feature_list_parser_SOURCES = check-feature-list-parser.c
+check_feature_list_parser_LDADD = $(common_ldadd)
+check_feature_list_parser_CFLAGS = $(common_cflags)
+fragments_SOURCES = fragments.c
+fragments_LDADD = $(common_ldadd)
+fragments_CFLAGS = $(common_cflags) -DABS_TOP_SRCDIR="\"$(abs_top_srcdir)\""
 TESTS = $(check_PROGRAMS)
 all: all-recursive
 
@@ -339,12 +393,18 @@ clean-noinstPROGRAMS:
        list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
        echo " rm -f" $$list; \
        rm -f $$list
+check-feature-list-parser$(EXEEXT): $(check_feature_list_parser_OBJECTS) $(check_feature_list_parser_DEPENDENCIES) $(EXTRA_check_feature_list_parser_DEPENDENCIES) 
+       @rm -f check-feature-list-parser$(EXEEXT)
+       $(AM_V_CCLD)$(check_feature_list_parser_LINK) $(check_feature_list_parser_OBJECTS) $(check_feature_list_parser_LDADD) $(LIBS)
 check-search$(EXEEXT): $(check_search_OBJECTS) $(check_search_DEPENDENCIES) $(EXTRA_check_search_DEPENDENCIES) 
        @rm -f check-search$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(check_search_OBJECTS) $(check_search_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(check_search_LINK) $(check_search_OBJECTS) $(check_search_LDADD) $(LIBS)
+fragments$(EXEEXT): $(fragments_OBJECTS) $(fragments_DEPENDENCIES) $(EXTRA_fragments_DEPENDENCIES) 
+       @rm -f fragments$(EXEEXT)
+       $(AM_V_CCLD)$(fragments_LINK) $(fragments_OBJECTS) $(fragments_LDADD) $(LIBS)
 test-search-criteria-parser$(EXEEXT): $(test_search_criteria_parser_OBJECTS) $(test_search_criteria_parser_DEPENDENCIES) $(EXTRA_test_search_criteria_parser_DEPENDENCIES) 
        @rm -f test-search-criteria-parser$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(test_search_criteria_parser_OBJECTS) $(test_search_criteria_parser_LDADD) $(LIBS)
+       $(AM_V_CCLD)$(test_search_criteria_parser_LINK) $(test_search_criteria_parser_OBJECTS) $(test_search_criteria_parser_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -352,8 +412,10 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-search.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-search-criteria-parser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_feature_list_parser-check-feature-list-parser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check_search-check-search.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fragments-fragments.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_search_criteria_parser-test-search-criteria-parser.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -376,6 +438,62 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+check_feature_list_parser-check-feature-list-parser.o: check-feature-list-parser.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_feature_list_parser_CFLAGS) $(CFLAGS) -MT check_feature_list_parser-check-feature-list-parser.o -MD -MP -MF $(DEPDIR)/check_feature_list_parser-check-feature-list-parser.Tpo -c -o check_feature_list_parser-check-feature-list-parser.o `test -f 'check-feature-list-parser.c' || echo '$(srcdir)/'`check-feature-list-parser.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/check_feature_list_parser-check-feature-list-parser.Tpo $(DEPDIR)/check_feature_list_parser-check-feature-list-parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='check-feature-list-parser.c' object='check_feature_list_parser-check-feature-list-parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_feature_list_parser_CFLAGS) $(CFLAGS) -c -o check_feature_list_parser-check-feature-list-parser.o `test -f 'check-feature-list-parser.c' || echo '$(srcdir)/'`check-feature-list-parser.c
+
+check_feature_list_parser-check-feature-list-parser.obj: check-feature-list-parser.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_feature_list_parser_CFLAGS) $(CFLAGS) -MT check_feature_list_parser-check-feature-list-parser.obj -MD -MP -MF $(DEPDIR)/check_feature_list_parser-check-feature-list-parser.Tpo -c -o check_feature_list_parser-check-feature-list-parser.obj `if test -f 'check-feature-list-parser.c'; then $(CYGPATH_W) 'check-feature-list-parser.c'; else $(CYGPATH_W) '$(srcdir)/check-feature-list-parser.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/check_feature_list_parser-check-feature-list-parser.Tpo $(DEPDIR)/check_feature_list_parser-check-feature-list-parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='check-feature-list-parser.c' object='check_feature_list_parser-check-feature-list-parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_feature_list_parser_CFLAGS) $(CFLAGS) -c -o check_feature_list_parser-check-feature-list-parser.obj `if test -f 'check-feature-list-parser.c'; then $(CYGPATH_W) 'check-feature-list-parser.c'; else $(CYGPATH_W) '$(srcdir)/check-feature-list-parser.c'; fi`
+
+check_search-check-search.o: check-search.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_search_CFLAGS) $(CFLAGS) -MT check_search-check-search.o -MD -MP -MF $(DEPDIR)/check_search-check-search.Tpo -c -o check_search-check-search.o `test -f 'check-search.c' || echo '$(srcdir)/'`check-search.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/check_search-check-search.Tpo $(DEPDIR)/check_search-check-search.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='check-search.c' object='check_search-check-search.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_search_CFLAGS) $(CFLAGS) -c -o check_search-check-search.o `test -f 'check-search.c' || echo '$(srcdir)/'`check-search.c
+
+check_search-check-search.obj: check-search.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_search_CFLAGS) $(CFLAGS) -MT check_search-check-search.obj -MD -MP -MF $(DEPDIR)/check_search-check-search.Tpo -c -o check_search-check-search.obj `if test -f 'check-search.c'; then $(CYGPATH_W) 'check-search.c'; else $(CYGPATH_W) '$(srcdir)/check-search.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/check_search-check-search.Tpo $(DEPDIR)/check_search-check-search.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='check-search.c' object='check_search-check-search.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(check_search_CFLAGS) $(CFLAGS) -c -o check_search-check-search.obj `if test -f 'check-search.c'; then $(CYGPATH_W) 'check-search.c'; else $(CYGPATH_W) '$(srcdir)/check-search.c'; fi`
+
+fragments-fragments.o: fragments.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fragments_CFLAGS) $(CFLAGS) -MT fragments-fragments.o -MD -MP -MF $(DEPDIR)/fragments-fragments.Tpo -c -o fragments-fragments.o `test -f 'fragments.c' || echo '$(srcdir)/'`fragments.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/fragments-fragments.Tpo $(DEPDIR)/fragments-fragments.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='fragments.c' object='fragments-fragments.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fragments_CFLAGS) $(CFLAGS) -c -o fragments-fragments.o `test -f 'fragments.c' || echo '$(srcdir)/'`fragments.c
+
+fragments-fragments.obj: fragments.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fragments_CFLAGS) $(CFLAGS) -MT fragments-fragments.obj -MD -MP -MF $(DEPDIR)/fragments-fragments.Tpo -c -o fragments-fragments.obj `if test -f 'fragments.c'; then $(CYGPATH_W) 'fragments.c'; else $(CYGPATH_W) '$(srcdir)/fragments.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/fragments-fragments.Tpo $(DEPDIR)/fragments-fragments.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='fragments.c' object='fragments-fragments.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fragments_CFLAGS) $(CFLAGS) -c -o fragments-fragments.obj `if test -f 'fragments.c'; then $(CYGPATH_W) 'fragments.c'; else $(CYGPATH_W) '$(srcdir)/fragments.c'; fi`
+
+test_search_criteria_parser-test-search-criteria-parser.o: test-search-criteria-parser.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_search_criteria_parser_CFLAGS) $(CFLAGS) -MT test_search_criteria_parser-test-search-criteria-parser.o -MD -MP -MF $(DEPDIR)/test_search_criteria_parser-test-search-criteria-parser.Tpo -c -o test_search_criteria_parser-test-search-criteria-parser.o `test -f 'test-search-criteria-parser.c' || echo '$(srcdir)/'`test-search-criteria-parser.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/test_search_criteria_parser-test-search-criteria-parser.Tpo $(DEPDIR)/test_search_criteria_parser-test-search-criteria-parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='test-search-criteria-parser.c' object='test_search_criteria_parser-test-search-criteria-parser.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_search_criteria_parser_CFLAGS) $(CFLAGS) -c -o test_search_criteria_parser-test-search-criteria-parser.o `test -f 'test-search-criteria-parser.c' || echo '$(srcdir)/'`test-search-criteria-parser.c
+
+test_search_criteria_parser-test-search-criteria-parser.obj: test-search-criteria-parser.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_search_criteria_parser_CFLAGS) $(CFLAGS) -MT test_search_criteria_parser-test-search-criteria-parser.obj -MD -MP -MF $(DEPDIR)/test_search_criteria_parser-test-search-criteria-parser.Tpo -c -o test_search_criteria_parser-test-search-criteria-parser.obj `if test -f 'test-search-criteria-parser.c'; then $(CYGPATH_W) 'test-search-criteria-parser.c'; else $(CYGPATH_W) '$(srcdir)/test-search-criteria-parser.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/test_search_criteria_parser-test-search-criteria-parser.Tpo $(DEPDIR)/test_search_criteria_parser-test-search-criteria-parser.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='test-search-criteria-parser.c' object='test_search_criteria_parser-test-search-criteria-parser.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_search_criteria_parser_CFLAGS) $(CFLAGS) -c -o test_search_criteria_parser-test-search-criteria-parser.obj `if test -f 'test-search-criteria-parser.c'; then $(CYGPATH_W) 'test-search-criteria-parser.c'; else $(CYGPATH_W) '$(srcdir)/test-search-criteria-parser.c'; fi`
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -642,13 +760,10 @@ distdir: $(DISTFILES)
        done
        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
          if test "$$subdir" = .; then :; else \
-           test -d "$(distdir)/$$subdir" \
-           || $(MKDIR_P) "$(distdir)/$$subdir" \
-           || exit 1; \
-         fi; \
-       done
-       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
            $(am__relativize); \
            new_distdir=$$reldir; \
diff --git a/tests/check-feature-list-parser.c b/tests/check-feature-list-parser.c
new file mode 100644 (file)
index 0000000..492d9ed
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Regis Merlino <regis.merlino@intel.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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-av/gupnp-feature-list-parser.h>
+#include <stdlib.h>
+#include <string.h>
+
+static const char * const names[] = {
+        "BOOKMARK",
+        "EPG",
+};
+
+static const char * const versions[] = {
+        "1",
+        "2",
+};
+
+static const char * const ids[] = {
+        "bookmark1,bookmark2,bookmark3",
+        "epg1,epg2",
+};
+
+static const char *text =
+        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+        "<Features "
+                "xmlns=\"urn:schemas-upnp-org:av:avs\" "
+                "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
+                "xsi:schemaLocation=\""
+                "urn:schemas-upnp-org:av:avs "
+                "http://www.upnp.org/schemas/av/avs-v1-20060531.xsd\">"
+                "<Feature name=\"BOOKMARK\" version=\"1\">"
+                        "<objectIDs>bookmark1</objectIDs>"
+                        "<objectIDs>bookmark2,bookmark3</objectIDs>"
+                "</Feature>"
+                "<Feature name=\"EPG\" version=\"2\">"
+                        "<objectIDs>epg1,epg2</objectIDs>"
+                "</Feature>"
+        "</Features>";
+
+static gboolean
+check_feature (GUPnPFeature *feature)
+{
+        static int index = 0;
+
+        if (strcmp (names[index], gupnp_feature_get_name (feature)))
+                        return FALSE;
+
+        if (strcmp (versions[index], gupnp_feature_get_version (feature)))
+                        return FALSE;
+
+        if (strcmp (ids[index], gupnp_feature_get_object_ids (feature)))
+                        return FALSE;
+
+        index++;
+
+        return TRUE;
+}
+
+int
+main (int argc, char **argv)
+{
+        GUPnPFeatureListParser *parser;
+        GError                 *error;
+        GList                  *features;
+        GList                  *item;
+        gboolean               success = TRUE;
+
+        g_type_init ();
+
+        parser = gupnp_feature_list_parser_new ();
+
+        error = NULL;
+        features = gupnp_feature_list_parser_parse_text (parser, text, &error);
+        if (features == NULL) {
+                g_printerr ("Parse error: %s\n", error->message);
+                g_error_free (error);
+                return EXIT_FAILURE;
+        }
+
+        for (item = features; item != NULL; item = g_list_next (item)) {
+                success = check_feature ((GUPnPFeature *) item->data);
+                if (!success)
+                        break;
+        }
+
+        g_print ("\n");
+
+        g_list_free_full (features, g_object_unref);
+        g_object_unref (parser);
+
+        return (success) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/tests/fragments.c b/tests/fragments.c
new file mode 100644 (file)
index 0000000..0ecb47b
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2012 Intel Corporation
+ *
+ * Authors: Krzesimir Nowak <krnowak@openismus.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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 <glib-object.h>
+#include <libgupnp-av/gupnp-didl-lite-object.h>
+#include <libgupnp-av/gupnp-didl-lite-writer.h>
+#include <libgupnp-av/gupnp-didl-lite-item.h>
+
+/* creates an item described by:
+static const gchar * const didllite =
+        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+        "<DIDL-Lite\n"
+        "xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"
+        "xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\"\n"
+        "xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\"\n"
+        "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
+        "xsi:schemaLocation=\"\n"
+        "urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\n"
+        "http://www.upnp.org/schemas/av/didl-lite.xsd\n"
+        "urn:schemas-upnp-org:metadata-1-0/upnp/\n"
+        "http://www.upnp.org/schemas/av/upnp.xsd\">\n"
+        "<item id=\"$id\" parentID=\"$parent_id\" restricted=\"0\">\n"
+        "<dc:title>Try a little tenderness</dc:title>\n"
+        "<upnp:class>object.item.audioItem.musicTrack</upnp:class>\n"
+        "<res protocolInfo=\"http-get:*:audio/mpeg:*\" size=\"3558000\">\n"
+        "http://168.192.1.1/audio197.mp3\n"
+        "</res>\n"
+        "<upnp:artist>Unknown</upnp:artist>\n"
+        "</item>\n"
+        "</DIDL-Lite>\n";
+*/
+static GUPnPDIDLLiteObject *
+get_item (GUPnPDIDLLiteWriter *writer, guint id, guint parent_id)
+{
+        GUPnPDIDLLiteItem *item = gupnp_didl_lite_writer_add_item (writer);
+        GUPnPDIDLLiteObject *object = GUPNP_DIDL_LITE_OBJECT (item);
+        GUPnPDIDLLiteContributor *artist;
+        GUPnPDIDLLiteResource *resource;
+        GUPnPProtocolInfo *info;
+        gchar *str_id = g_strdup_printf ("%u", id);
+
+        gupnp_didl_lite_object_set_id (object, str_id);
+        g_free (str_id);
+        str_id = g_strdup_printf ("%u", parent_id);
+        gupnp_didl_lite_object_set_parent_id (object, str_id);
+        g_free (str_id);
+        gupnp_didl_lite_object_set_restricted (object, FALSE);
+        gupnp_didl_lite_object_set_title (object, "Try a little tenderness");
+        gupnp_didl_lite_object_set_upnp_class
+                                        (object,
+                                         "object.item.audioItem.musicTrack");
+        artist = gupnp_didl_lite_object_add_artist (object);
+        gupnp_didl_lite_contributor_set_name (artist, "Unknown");
+        g_object_unref (artist);
+        resource = gupnp_didl_lite_object_add_resource (object);
+        info = gupnp_protocol_info_new ();
+        gupnp_protocol_info_set_protocol (info, "http-get");
+        gupnp_protocol_info_set_network (info, "*");
+        gupnp_protocol_info_set_mime_type (info, "audio/mpeg");
+        gupnp_didl_lite_resource_set_protocol_info (resource, info);
+        g_object_unref (info);
+        gupnp_didl_lite_resource_set_size (resource, 3558000);
+        gupnp_didl_lite_resource_set_uri (resource,
+                                          "http://168.192.1.1/audio197.mp3");
+        g_object_unref (resource);
+
+        return object;
+}
+
+static gchar *current_fragments[] = {
+        /* 1 */
+        "<upnp:class>object.item.audioItem.musicTrack</upnp:class>",
+        /* 2 */
+        "",
+        /* 3 */
+        "<upnp:artist>Unknown</upnp:artist>",
+        /* 4 */
+        "<dc:title>Try a little tenderness</dc:title>"
+};
+
+static gchar *new_fragments[] = {
+        /* 1 */
+        "<upnp:class>object.item.audioItem.musicTrack</upnp:class>"
+        "<upnp:genre>Obscure</upnp:genre>",
+        /* 2 */
+        "<upnp:genre>Even more obscure</upnp:genre>",
+        /* 3 */
+        "",
+        /* 4 */
+        "<dc:title>Cthulhu fhtagn</dc:title>"
+};
+
+static void
+debug_dump (GUPnPDIDLLiteObject *object)
+{
+        xmlChar *dump = NULL;
+        xmlNodePtr node = gupnp_didl_lite_object_get_xml_node (object);
+        xmlDocPtr doc = node->doc;
+
+        xmlDocDumpMemory (doc, &dump, NULL);
+        g_debug ("Obj dump:\n%s", dump);
+        xmlFree (dump);
+}
+
+int main (void)
+{
+        GUPnPDIDLLiteObject *temp_object;
+        GUPnPDIDLLiteObject *object;
+        GUPnPDIDLLiteFragmentResult result;
+        GUPnPDIDLLiteWriter *writer;
+        int retval = 1;
+        const gchar *value;
+        GList* artists;
+        GUPnPDIDLLiteContributor *artist;
+
+        g_type_init ();
+        g_setenv ("GUPNP_AV_DATADIR", ABS_TOP_SRCDIR G_DIR_SEPARATOR_S "data", FALSE);
+
+        writer = gupnp_didl_lite_writer_new (NULL);
+        temp_object = get_item (writer, 3, 2);
+        object = get_item (writer, 18, 13);
+        debug_dump (object);
+        result = gupnp_didl_lite_object_apply_fragments (object,
+                                                         current_fragments,
+                                                         G_N_ELEMENTS (current_fragments),
+                                                         new_fragments,
+                                                         G_N_ELEMENTS (new_fragments));
+        debug_dump (object);
+        if (result != GUPNP_DIDL_LITE_FRAGMENT_RESULT_OK) {
+                g_warning ("Applying fragments failed.");
+                goto out;
+        }
+
+        value = gupnp_didl_lite_object_get_title (object);
+
+        if (g_strcmp0 (value, "Cthulhu fhtagn")) {
+                g_warning ("Title is '%s', should be 'Cthulhu fhtagn'.", value);
+                goto out;
+        }
+
+        artists = gupnp_didl_lite_object_get_artists (object);
+
+        if (artists) {
+                g_warning ("Should be no artists.");
+                g_list_free_full (artists, g_object_unref);
+                goto out;
+        }
+
+        value = gupnp_didl_lite_object_get_title (temp_object);
+
+        if (g_strcmp0 (value, "Try a little tenderness")) {
+                g_warning ("Title is '%s', should be 'Try a little tenderness'.", value);
+                goto out;
+        }
+
+        artists = gupnp_didl_lite_object_get_artists (temp_object);
+
+        if (!artists) {
+                g_warning ("Should be one artist, there are none.");
+                goto out;
+        }
+        if (artists->next) {
+                g_list_free_full (artists, g_object_unref);
+                g_warning ("Should be one artist, there are more.");
+                goto out;
+        }
+        artist = g_object_ref (artists->data);
+        g_list_free_full (artists, g_object_unref);
+        value = gupnp_didl_lite_contributor_get_name (artist);
+        if (g_strcmp0 (value, "Unknown")) {
+                g_object_unref (artist);
+                g_warning ("Artist is '%s', but should be 'Unknown'.", value);
+                goto out;
+        }
+        g_object_unref (artist);
+
+        retval = 0;
+ out:
+        g_object_unref (object);
+        g_object_unref (temp_object);
+        g_object_unref (writer);
+        return retval;
+}
index e03acdb..bb54c2c 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 
 @SET_MAKE@
 VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
 pkgdatadir = $(datadir)/@PACKAGE@
 pkgincludedir = $(includedir)/@PACKAGE@
 pkglibdir = $(libdir)/@PACKAGE@
@@ -41,7 +58,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
        $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
        $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
        $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-       $(top_srcdir)/configure.ac
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -86,6 +103,11 @@ am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
 am__v_GEN_0 = @echo "  GEN   " $@;
 SOURCES = $(test_regression_SOURCES)
 DIST_SOURCES = $(test_regression_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
 ETAGS = etags
 CTAGS = ctags
 am__tty_colors = \
@@ -173,6 +195,7 @@ SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
 VERSION = @VERSION@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
diff --git a/vala/GUPnPAV-1.0.metadata b/vala/GUPnPAV-1.0.metadata
new file mode 100644 (file)
index 0000000..2abec5b
--- /dev/null
@@ -0,0 +1,12 @@
+GUPnPAV cheader_filename="libgupnp-av/gupnp-av.h"
+DIDLLiteObject
+    .get_*_namespace type="Xml.Ns*"
+
+*.xml_node type="Xml.Node*"
+DIDL_LITE_WRITER_NAMESPACE_* skip
+*.gupnp_reserved skip
+SearchCriteriaParserError skip
+SearchCriteriaParser
+    .expression skip
+ProtocolError skip
+protocol_error_quark skip
diff --git a/vala/Makefile.am b/vala/Makefile.am
new file mode 100644 (file)
index 0000000..de290b4
--- /dev/null
@@ -0,0 +1,21 @@
+if HAVE_INTROSPECTION
+if HAVE_VAPIGEN
+gupnp-av-1.0.vapi: gupnp-av-1.0.stamp
+       @true
+
+gupnp-av-1.0.stamp: $(top_builddir)/libgupnp-av/GUPnPAV-1.0.gir \
+               $(srcdir)/GUPnPAV-1.0.metadata \
+               $(srcdir)/gupnp-av-1.0-custom.vala
+       $(AM_V_GEN)$(VAPIGEN) --metadatadir=$(srcdir) \
+                                 --pkg gupnp-1.0 --pkg=libsoup-2.4 \
+                             --library=gupnp-av-1.0 --pkg=gio-2.0 --pkg=libxml-2.0 \
+                             $(top_builddir)/libgupnp-av/GUPnPAV-1.0.gir \
+                                 $(srcdir)/gupnp-av-1.0-custom.vala && \
+       echo timestmap > $(@F)
+
+vapidir = $(datadir)/vala/vapi
+vapi_DATA = gupnp-av-1.0.vapi $(srcdir)/gupnp-av-1.0.deps
+CLEANFILES = gupnp-av-1.0.vapi gupnp-av-1.0.stamp
+EXTRA_DIST = gupnp-av-1.0.deps GUPnPAV-1.0.metadata gupnp-av-1.0-custom.vala
+endif
+endif
diff --git a/vala/Makefile.in b/vala/Makefile.in
new file mode 100644 (file)
index 0000000..d326575
--- /dev/null
@@ -0,0 +1,481 @@
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+# Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__make_dryrun = \
+  { \
+    am__dry=no; \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        echo 'am--echo: ; @echo "AM"  OK' | $(MAKE) -f - 2>/dev/null \
+          | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+      *) \
+        for am__flg in $$MAKEFLAGS; do \
+          case $$am__flg in \
+            *=*|--*) ;; \
+            *n*) am__dry=yes; break;; \
+          esac; \
+        done;; \
+    esac; \
+    test $$am__dry = yes; \
+  }
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = vala
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
+       $(top_srcdir)/m4/introspection.m4 $(top_srcdir)/m4/libtool.m4 \
+       $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+       $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+       $(top_srcdir)/m4/vapigen.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN   " $@;
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(vapidir)"
+DATA = $(vapi_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GREP = @GREP@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBGUPNP_CFLAGS = @LIBGUPNP_CFLAGS@
+LIBGUPNP_LIBS = @LIBGUPNP_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VAPIGEN = @VAPIGEN@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@vapidir = $(datadir)/vala/vapi
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@vapi_DATA = gupnp-av-1.0.vapi $(srcdir)/gupnp-av-1.0.deps
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@CLEANFILES = gupnp-av-1.0.vapi gupnp-av-1.0.stamp
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@EXTRA_DIST = gupnp-av-1.0.deps GUPnPAV-1.0.metadata gupnp-av-1.0-custom.vala
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu vala/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnu vala/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+       -rm -f *.lo
+
+clean-libtool:
+       -rm -rf .libs _libs
+install-vapiDATA: $(vapi_DATA)
+       @$(NORMAL_INSTALL)
+       @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(vapidir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(vapidir)" || exit 1; \
+       fi; \
+       for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         echo "$$d$$p"; \
+       done | $(am__base_list) | \
+       while read files; do \
+         echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(vapidir)'"; \
+         $(INSTALL_DATA) $$files "$(DESTDIR)$(vapidir)" || exit $$?; \
+       done
+
+uninstall-vapiDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(vapi_DATA)'; test -n "$(vapidir)" || list=; \
+       files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+       dir='$(DESTDIR)$(vapidir)'; $(am__uninstall_files_from_dir)
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+       for dir in "$(DESTDIR)$(vapidir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-vapiDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-vapiDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+       distclean distclean-generic distclean-libtool distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-dvi install-dvi-am \
+       install-exec install-exec-am install-html install-html-am \
+       install-info install-info-am install-man install-pdf \
+       install-pdf-am install-ps install-ps-am install-strip \
+       install-vapiDATA installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+       uninstall uninstall-am uninstall-vapiDATA
+
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@gupnp-av-1.0.vapi: gupnp-av-1.0.stamp
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   @true
+
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@gupnp-av-1.0.stamp: $(top_builddir)/libgupnp-av/GUPnPAV-1.0.gir \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@           $(srcdir)/GUPnPAV-1.0.metadata \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@           $(srcdir)/gupnp-av-1.0-custom.vala
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   $(AM_V_GEN)$(VAPIGEN) --metadatadir=$(srcdir) \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                             --pkg gupnp-1.0 --pkg=libsoup-2.4 \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                         --library=gupnp-av-1.0 --pkg=gio-2.0 --pkg=libxml-2.0 \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                         $(top_builddir)/libgupnp-av/GUPnPAV-1.0.gir \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@                             $(srcdir)/gupnp-av-1.0-custom.vala && \
+@HAVE_INTROSPECTION_TRUE@@HAVE_VAPIGEN_TRUE@   echo timestmap > $(@F)
+
+# 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.
+.NOEXPORT:
diff --git a/vala/gupnp-av-1.0-custom.vala b/vala/gupnp-av-1.0-custom.vala
new file mode 100644 (file)
index 0000000..c26ee8a
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2008 OpenedHand Ltd.
+ * Copyright (C) 2012 Jens Georg.
+ *
+ * Author: Jussi Kukkonen <jku@o-hand.com>
+ *         Jens Georg <mail@jensge.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library 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.
+ */
+
+namespace GUPnP {
+        public class DIDLLiteWriter : GLib.Object {
+                [CCode (cname = "GUPNP_DIDL_LITE_WRITER_NAMESPACE_DC")]
+                public const string NAMESPACE_DC;
+
+                [CCode (cname = "GUPNP_DIDL_LITE_WRITER_NAMESPACE_UPNP")]
+                public const string NAMESPACE_UPNP;
+
+                [CCode (cname = "GUPNP_DIDL_LITE_WRITER_NAMESPACE_DLNA")]
+                public const string NAMESPACE_DLNA;
+        }
+
+        public errordomain SearchCriteriaParserError {
+                [CCode (cname = "GUPNP_SEARCH_CRITERIA_PARSER_ERROR_FAILED")]
+                FAILED
+        }
+
+       [CCode (cheader_filename = "libgupnp-av/gupnp-av.h", cprefix = "GUPNP_PROTOCOL_ERROR_")]
+       public errordomain ProtocolError {
+               INVALID_SYNTAX,
+               OTHER;
+               public static GLib.Quark quark ();
+       }
+
+        public class SearchCriteriaParser : GLib.Object {
+            public virtual signal bool expression (string property, GUPnP.SearchCriteriaOp op, string value, GLib.Error error);
+        }
+}
diff --git a/vala/gupnp-av-1.0.deps b/vala/gupnp-av-1.0.deps
new file mode 100644 (file)
index 0000000..dfc90c6
--- /dev/null
@@ -0,0 +1,2 @@
+gupnp-1.0
+libxml-2.0