libupnp-1.8.0~svn20100507/0000777000175000017500000000000011373047473011753 500000000000000libupnp-1.8.0~svn20100507/m4/0000777000175000017500000000000011373047467012276 500000000000000libupnp-1.8.0~svn20100507/m4/rt_bool_arg_enable.m40000644000175000017500000000350611021325542016236 00000000000000dnl @synopsis RT_BOOL_ARG_ENABLE([FLAG],[DEFAULT],[HELP STRING]) dnl dnl This macro declares a configure option with 'AC_ARG_ENABLE'. dnl It is a boolean argument (yes or no values only), and dnl the corresponding shell variable 'enable_arg' is guaranteed to dnl be one or the other. dnl A message is also printed. dnl dnl Arguments dnl $1 = flag name e.g. [debug] dnl $2 = default value, shall be m4 constant, either [yes] or [no] dnl $3 = help string (default value is appended) e.g. [compile debugging code] dnl dnl @version $Id: rt_bool_arg_enable.m4,v 1.2 2006/02/18 14:35:09 r3mi Exp $ dnl @author Rémi Turboult dnl @license GPLWithACException dnl dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl AC_DEFUN([RT_BOOL_ARG_ENABLE],[ dnl m4_pushdef([Name],AS_TR_SH($1))dnl m4_pushdef([NAME],AS_TR_CPP($1))dnl dnl AC_MSG_CHECKING([for --enable-]Name) dnl dnl use some m4 sugar to have only one 'AC_ARG_ENABLE' declaration, dnl else "configure --help" is confused dnl AC_ARG_ENABLE(Name, [m4_case([$2], [yes],AS_HELP_STRING([--disable-]Name, [disable $3 @<:@default=enabled@:>@]), [no],AS_HELP_STRING([--enable-]Name, [enable $3 @<:@default=disabled@:>@]), [m4_fatal([incorrect boolean argument '$2'])] )]) test "x$enable_[$1]" != [x]m4_if([$2],[yes],[no],[yes]) dnl && enable_[]Name=[$2] AC_MSG_RESULT($enable_[]Name) AM_CONDITIONAL([ENABLE_]NAME, test x"$enable_[]Name" = xyes) dnl m4_popdef([NAME])dnl m4_popdef([Name])dnl dnl ])dnl libupnp-1.8.0~svn20100507/m4/ax_cflags_warn_all.m40000644000175000017500000001435511021325542016251 00000000000000##### http://autoconf-archive.cryp.to/ax_cflags_warn_all.html # # SYNOPSIS # # AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] # # DESCRIPTION # # Try to find a compiler option that enables most reasonable # warnings. This macro is directly derived from VL_PROG_CC_WARNINGS # which is split up into two AX_CFLAGS_WARN_ALL and # AX_CFLAGS_WARN_ALL_ANSI # # For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The # result is added to the shellvar being CFLAGS by default. # # Currently this macro knows about GCC, Solaris C compiler, Digital # Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C # compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos # 10.0.0.8) C compiler. # # - $1 shell-variable-to-add-to : CFLAGS # - $2 add-value-if-not-found : nothing # - $3 action-if-found : add value to shellvariable # - $4 action-if-not-found : nothing # # LAST MODIFICATION # # 2006-12-12 # # COPYLEFT # # Copyright (c) 2006 Guido U. Draheim # # 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 of the # License, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # # As a special exception, the respective Autoconf Macro's copyright # owner gives unlimited permission to copy, distribute and modify the # configure scripts that are the output of Autoconf when processing # the Macro. You need not follow the terms of the GNU General Public # License when using or distributing such scripts, even though # portions of the text of the Macro appear in them. The GNU General # Public License (GPL) does govern all other use of the material that # constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the # Autoconf Macro released by the Autoconf Macro Archive. When you # make and distribute a modified version of the Autoconf Macro, you # may extend this special exception to the GPL to apply to your # modified version as well. AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_warn_all])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_C ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic % -Wall" dnl GCC "-xstrconst % -v" dnl Solaris C "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX "-ansi -ansiE % -fullwarn" dnl IRIX "+ESlit % +w1" dnl HP-UX C "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) "-h conform % -h msglevel 2" dnl Cray C (Unicos) # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[ AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) dnl the only difference - the LANG selection... and the default FLAGS AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_CPLUSPLUS ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic % -Wall" dnl GCC "-xstrconst % -v" dnl Solaris C "-std1 % -verbose -w0 -warnprotos" dnl Digital Unix "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX "-ansi -ansiE % -fullwarn" dnl IRIX "+ESlit % +w1" dnl HP-UX C "-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) "-h conform % -h msglevel 2" dnl Cray C (Unicos) # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[ AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) dnl implementation tactics: dnl the for-argument contains a list of options. The first part of dnl these does only exist to detect the compiler - usually it is dnl a global option to enable -ansi or -extrawarnings. All other dnl compilers will fail about it. That was needed since a lot of dnl compilers will give false positives for some option-syntax dnl like -Woption or -Xoption as they think of it is a pass-through dnl to later compile stages or something. The "%" is used as a dnl delimimiter. A non-option comment can be given after "%%" marks dnl which will be shown but not added to the respective C/CXXFLAGS. libupnp-1.8.0~svn20100507/m4/ax_cflags_gcc_option.m40000644000175000017500000002074111021325542016572 00000000000000##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html # # SYNOPSIS # # AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) # # DESCRIPTION # # AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like # "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the # optionflag to CFLAGS if it is understood. You can override the # shellvar-default of CFLAGS of course. The order of arguments stems # from the explicit macros like AX_CFLAGS_WARN_ALL. # # The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add # to CXXFLAGS - and it uses the autoconf setup for C++ instead of C # (since it is possible to use different compilers for C and C++). # # The macro is a lot simpler than any special AX_CFLAGS_* macro (or # ac_cxx_rtti.m4 macro) but allows to check for arbitrary options. # However, if you use this macro in a few places, it would be great # if you would make up a new function-macro and submit it to the # ac-archive. # # - $1 option-to-check-for : required ("-option" as non-value) # - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) # - $3 action-if-found : add value to shellvariable # - $4 action-if-not-found : nothing # # note: in earlier versions, $1-$2 were swapped. We try to detect the # situation and accept a $2=~/-/ as being the old # option-to-check-for. # # also: there are other variants that emerged from the original macro # variant which did just test an option to be possibly added. # However, some compilers accept an option silently, or possibly for # just another option that was not intended. Therefore, we have to do # a generic test for a compiler family. For gcc we check "-pedantic" # being accepted which is also understood by compilers who just want # to be compatible with gcc even when not being made from gcc # sources. # # see also: # # AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION # AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION # # LAST MODIFICATION # # 2006-12-12 # # COPYLEFT # # Copyright (c) 2006 Guido U. Draheim # # 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 of the # License, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # # As a special exception, the respective Autoconf Macro's copyright # owner gives unlimited permission to copy, distribute and modify the # configure scripts that are the output of Autoconf when processing # the Macro. You need not follow the terms of the GNU General Public # License when using or distributing such scripts, even though # portions of the text of the Macro appear in them. The GNU General # Public License (GPL) does govern all other use of the material that # constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the # Autoconf Macro released by the Autoconf Macro Archive. When you # make and distribute a modified version of the Autoconf Macro, you # may extend this special exception to the GPL to apply to your # modified version as well. AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$2])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_C ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) dnl the only difference - the LANG selection... and the default FLAGS AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_OLD], [dnl AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_CPLUSPLUS ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) dnl ------------------------------------------------------------------------- AC_DEFUN([AX_CFLAGS_GCC_OPTION_NEW], [dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$1])dnl AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_C ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"]) m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) dnl the only difference - the LANG selection... and the default FLAGS AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_NEW], [dnl AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_CPLUSPLUS ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"]) m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) AC_DEFUN([AX_CFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, [AX_CFLAGS_GCC_OPTION_NEW($@)],[AX_CFLAGS_GCC_OPTION_OLD($@)])]) AC_DEFUN([AX_CXXFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, [AX_CXXFLAGS_GCC_OPTION_NEW($@)],[AX_CXXFLAGS_GCC_OPTION_OLD($@)])]) libupnp-1.8.0~svn20100507/m4/acx_pthread.m40000644000175000017500000002536611021325542014731 00000000000000##### http://autoconf-archive.cryp.to/acx_pthread.html # # SYNOPSIS # # ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. # It sets the PTHREAD_LIBS output variable to the threads library and # linker flags, and the PTHREAD_CFLAGS output variable to any special # C compiler flags that are needed. (The user can also force certain # compiler flags/libs to be tested by setting these environment # variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). # (This is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these # flags, but also link it with them as well. e.g. you should link # with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS # $LIBS # # If you are only building threads programs, you may wish to use # these variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute # constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to # that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # ACTION-IF-FOUND is a list of shell commands to run if a threads # library is found, and ACTION-IF-NOT-FOUND is a list of commands to # run it if it is not found. If ACTION-IF-FOUND is not specified, the # default action will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or # if you have any other suggestions or comments. This macro was based # on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) # (with help from M. Frigo), as well as ac_pthread and hb_pthread # macros posted by Alejandro Forero Cuervo to the autoconf macro # repository. We are also grateful for the helpful feedback of # numerous users. # # LAST MODIFICATION # # 2006-05-29 # # COPYLEFT # # Copyright (c) 2006 Steven G. Johnson # # 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 of the # License, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # # As a special exception, the respective Autoconf Macro's copyright # owner gives unlimited permission to copy, distribute and modify the # configure scripts that are the output of Autoconf when processing # the Macro. You need not follow the terms of the GNU General Public # License when using or distributing such scripts, even though # portions of the text of the Macro appear in them. The GNU General # Public License (GPL) does govern all other use of the material that # constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the # Autoconf Macro released by the Autoconf Macro Archive. When you # make and distribute a modified version of the Autoconf Macro, you # may extend this special exception to the GPL to apply to your # modified version as well. AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD libupnp-1.8.0~svn20100507/NEWS0000644000175000017500000000624511021325545012362 00000000000000 What is new in libupnp 1.3.1 * fix: "upnp.h" includes "upnpdebug.h" only if debug enabled in the library (else header file is not installed) * fix: add inter-library dependencies between upnp and ixml / threadutil, so that programs linking against upnp only still work. ============================================================================ What is new in libupnp 1.3.0 * major change: autoconfiscate build system. automake + autoconf replace the previous makefiles. This should allow for easier build and installation on various distributions. * change: optional library features are selected with configure options (such as "./configure --enable-debug --disable-device") : see README file for the main options, and "./configure --help" to display a complete list. * new: install a pkgconfig file "libupnp.pc" * new: a new installed file provides macros to know the installed library version, and the optional features which have been configured in the library. * change: the old included file "config.h", which contained internal definitions needed to compile the library, is no longer installed in * change: the debug definitions previously available in are now available in (only if library configured with debug enabled). * change: add libtool versionning for the 3 libraries. Also hide all library symbols not part of the public API. * change: remove "hard" limit to 32K in UpnpSetContentLength (not suitable for UPnP AV clients). * new: new "UpnpSetMaxContentLength" function to globally set the maximum incoming content-length that the SDK will process (should be used instead of UpnpSetContentLength, which does not uses its handle argument) * change: returns OUTOF_BOUNDS instead of BAD_HTTPMSG when exceed allowed Content Length * new: ixml: new function ixmlRelaxParser to make the XML parser more tolerant to malformed text, if required (default behaviour is unchanged : abort on error) * fix: compilation error with gcc4 * fix: add some missing const's in public API * fix: add check for availability of socklen_t type * fix: miscellaneous bugs and warnings (see details in ChangeLog) ============================================================================ Changes to the SDK for UPnP Devices version 1.2.1a: - Changes the NAME_SIZE constant used for URL buffers to 256 bytes to accomodate longer URLs. ============================================================================ Changes to the SDK for UPnP Devices version 1.2.1: - Integrates an entirely new XML parser that features DOM2 API support and a much smaller code size. - Integrates a new threading utility library that manages all threads in the library. - Elimination of C++ and other code optimizations have reduced the binary size by over 60%. - The web server now supports application-level callbacks to handle dynamically generated data. - The web server now correctly handles chunked encoding. - A new client HTTP API has been added that allows downloading of items of unlimited size. - The SDK supports much better cross-compilation support. - Numerous memory leaks and bugs have been fixed. libupnp-1.8.0~svn20100507/TODO0000644000175000017500000000144211336633540012353 00000000000000 To Be Done ========== - add FreeBSD patches ( http://sf.net/tracker/index.php?func=detail&aid=1332618&group_id=7189&atid=307189 ?) - non-regression testing - replace doc++ by Doxygen for documentation generation - incorporate public patches and fix reported bugs : http://sourceforge.net/tracker/?group_id=7189&atid=107189 and http://sourceforge.net/tracker/?group_id=7189&atid=307189 - RPM packaging (a preliminary one here : https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=176617 ) - make API clean for large files and 64 bits - Why is NUM_HANDLE defined to 200 when we can register only: A) One client(1) B) An IPv4 and IPv6 device (2) NUM_HANDLE should be 3 - A sane way to implement the virtual directory callback initialization and checking against NULL pointers. libupnp-1.8.0~svn20100507/docs/0000777000175000017500000000000011373047473012703 500000000000000libupnp-1.8.0~svn20100507/docs/dist/0000777000175000017500000000000011373047473013646 500000000000000libupnp-1.8.0~svn20100507/docs/dist/html/0000777000175000017500000000000011373047473014612 500000000000000libupnp-1.8.0~svn20100507/docs/dist/html/ixml/0000777000175000017500000000000011373047475015565 500000000000000libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_hasAttributeNS.html0000644000175000017500000000264511021325544023623 00000000000000 EXPORT_SPEC BOOL ixmlElement_hasAttributeNS

EXPORT_SPEC BOOL ixmlElement_hasAttributeNS

(IXML_Element* element,
  DOMString namespaceURI,
  DOMString localName )

Queries whether the Element has an attribute with the given local name and namespace URI or has a default value for that attribute.

Documentation

Queries whether the Element has an attribute with the given local name and namespace URI or has a default value for that attribute.

Parameters:
element - The Element on which to check for the attribute.
namespaceURI - The namespace URI of the attribute.
localName - The local name of the attribute.
Returns:
[BOOL] TRUE if the Element has an attribute with the given namespace and local name or has a default value for that attribute, otherwise FALSE.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getNodeType.html0000644000175000017500000000251411021325544022441 00000000000000 EXPORT_SPEC unsigned short ixmlNode_getNodeType

EXPORT_SPEC unsigned short ixmlNode_getNodeType

(IXML_Node* nodeptr )

Retrieves the type of a Node.

Documentation

Retrieves the type of a Node. The defined Node constants are:
  • eATTRIBUTE_NODE
  • eCDATA_SECTION_NODE
  • eCOMMENT_NODE
  • eDOCUMENT_FRAGMENT_NODE
  • eDOCUMENT_NODE
  • eDOCUMENT_TYPE_NODE
  • eELEMENT_NODE
  • eENTITY_NODE
  • eENTITY_REFERENCE_NODE
  • eNOTATION_NODE
  • ePROCESSING_INSTRUCTION_NODE
  • eTEXT_NODE

Parameters:
nodeptr - The Node from which to retrieve the type.
Returns:
[const unsigned short] An integer representing the type of the Node.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_appendChild.html0000644000175000017500000000314311021325544022424 00000000000000 EXPORT_SPEC int ixmlNode_appendChild

EXPORT_SPEC int ixmlNode_appendChild

(IXML_Node* nodeptr,
  IXML_Node* newChild )

Appends a child Node to the list of children of a Node.

Documentation

Appends a child Node to the list of children of a Node. If newChild is already in the tree, it is removed first.

Parameters:
nodeptr - The Node in which to append the new child.
newChild - The new child to append.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either nodeptr or newChild is NULL.
  • IXML_HIERARCHY_REQUEST_ERR: newChild is of a type that cannot be added as a child of nodeptr or newChild is an ancestor of nodeptr.
  • IXML_WRONG_DOCUMENT_ERR: newChild was created from a different document than nodeptr.
  • IXML_NO_MODIFICATION_ALLOWED_ERR: nodeptr is a read-only Node.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getPrefix.html0000644000175000017500000000233611021325544022151 00000000000000 EXPORT_SPEC DOMString ixmlNode_getPrefix

EXPORT_SPEC DOMString ixmlNode_getPrefix

(IXML_Node* nodeptr )

Retrieves the namespace prefix, if present.

Documentation

Retrieves the namespace prefix, if present. The prefix is the name used as an alias for the namespace URI for this element. Only Nodes of type eELEMENT_NODE or eATTRIBUTE_NODE can have a prefix. Nodes created through the Document interface will only contain a prefix if created using ixmlDocument_createElementNS.

Parameters:
nodeptr - The Node from which to retrieve the prefix.
Returns:
[DOMString] A DOMString representing the namespace prefix or NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_getElementsByTagNameNS.html0000644000175000017500000000271511021325544025166 00000000000000 EXPORT_SPEC IXML_NodeList* ixmlElement_getElementsByTagNameNS

EXPORT_SPEC IXML_NodeList* ixmlElement_getElementsByTagNameNS

(IXML_Element* element,
  DOMString namespaceURI,
  DOMString localName )

Returns a NodeList of all descendant Elements with a given tag name, in the order in which they are encountered in the pre-order traversal of the Element tree.

Documentation

Returns a NodeList of all descendant Elements with a given tag name, in the order in which they are encountered in the pre-order traversal of the Element tree.

Parameters:
element - The Element from which to start the search.
namespaceURI - The namespace URI of the Elements to find.
localName - The local name of the Elements to find.
Returns:
[NodeList*] A NodeList of matching Elements or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/InterfaceitNamedNodeMap.html0000644000175000017500000000602611021325544023023 00000000000000 Interface <I>NamedNodeMap</I>

Interface NamedNodeMap

A NamedNodeMap object represents a list of objects that can be accessed by name. A NamedNodeMap maintains the objects in no particular order. The Node interface uses a NamedNodeMap to maintain the attributes of a node.

o ixmlNamedNodeMap_getLength
Returns the number of items contained in this NamedNodeMap.
o ixmlNamedNodeMap_getNamedItem
Retrieves a Node from the NamedNodeMap by name.
o ixmlNamedNodeMap_setNamedItem
Adds a new Node to the NamedNodeMap using the Node name attribute.
o ixmlNamedNodeMap_removeNamedItem
Removes a Node from a NamedNodeMap specified by name.
o ixmlNamedNodeMap_item
Retrieves a Node from a NamedNodeMap specified by a numerical index.
o ixmlNamedNodeMap_getNamedItemNS
Retrieves a Node from a NamedNodeMap specified by namespace URI and local name.
o ixmlNamedNodeMap_setNamedItemNS
Adds a new Node to the NamedNodeMap using the Node local name and namespace URI attributes.
o ixmlNamedNodeMap_removeNamedItemNS
Removes a Node from a NamedNodeMap specified by namespace URI and local name.
o ixmlNamedNodeMap_free
Frees a NamedNodeMap.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getChildNodes.html0000644000175000017500000000215711021325544022731 00000000000000 EXPORT_SPEC IXML_NodeList* ixmlNode_getChildNodes

EXPORT_SPEC IXML_NodeList* ixmlNode_getChildNodes

(IXML_Node* nodeptr )

Retrieves the list of children of a Node in a NodeList structure.

Documentation

Retrieves the list of children of a Node in a NodeList structure. If a Node has no children, ixmlNode_getChildNodes returns a NodeList structure that contains no Nodes.

Parameters:
nodeptr - The Node from which to retrieve the children.
Returns:
[NodeList*] A NodeList of the children of the Node.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createDocument.html0000644000175000017500000000147011021325544024045 00000000000000 EXPORT_SPEC IXML_Document* ixmlDocument_createDocument

EXPORT_SPEC IXML_Document* ixmlDocument_createDocument

()

Creates a new empty Document node.

Documentation

Creates a new empty Document node.

Returns:
[Document*] A pointer to the new Document or NULL on failure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_free.html0000644000175000017500000000154711021325544021140 00000000000000 EXPORT_SPEC void ixmlNode_free

EXPORT_SPEC void ixmlNode_free

(IXML_Node* IXML_Node )

Frees a Node and all Nodes in its subtree.

Documentation

Frees a Node and all Nodes in its subtree.

Parameters:
IXML_Node - The Node to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/InterfaceitAttr.html0000644000175000017500000000170111021325544021440 00000000000000 Interface <I>Attr</I>

Interface Attr

The Attr interface represents an attribute of an Element. The document type definition (DTD) or schema usually dictate the allowable attributes and values for a particular element. For more information, refer to the Interface Attr section in the DOM2-Core.

o ixmlAttr_free
Frees an Attr node.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_removeAttributeNode.html0000644000175000017500000000265611021325544024714 00000000000000 EXPORT_SPEC int ixmlElement_removeAttributeNode

EXPORT_SPEC int ixmlElement_removeAttributeNode

(IXML_Element* element,
  IXML_Attr* oldAttr,
  IXML_Attr** rtAttr )

Removes the specified attribute node from an Element.

Documentation

Removes the specified attribute node from an Element.

Parameters:
element - The Element from which to remove the attribute.
oldAttr - The attribute to remove from the Element.
rtAttr - A pointer to an attribute in which to place the removed attribute.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either element or oldAttr is NULL.
  • IXML_NOT_FOUND_ERR: oldAttr is not among the list attributes of element.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_getNamedItemNS.html0000644000175000017500000000240211021325544024415 00000000000000 EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_getNamedItemNS

EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_getNamedItemNS

(IXML_NamedNodeMap* nnMap,
  DOMString* namespaceURI,
  DOMString localName )

Retrieves a Node from a NamedNodeMap specified by namespace URI and local name.

Documentation

Retrieves a Node from a NamedNodeMap specified by namespace URI and local name.

Parameters:
nnMap - The NamedNodeMap from which to remove the Node.
namespaceURI - The namespace URI of the Node to remove.
localName - The local name of the Node to remove.
Returns:
[Node*] A pointer to the Node, if found, or NULL if it wasn't

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_getTagName.html0000644000175000017500000000170111021325544022727 00000000000000 EXPORT_SPEC const DOMString ixmlElement_getTagName

EXPORT_SPEC const DOMString ixmlElement_getTagName

(IXML_Element* element )

Returns the name of the tag as a constant string.

Documentation

Returns the name of the tag as a constant string.

Parameters:
element - The Element from which to retrieve the name.
Returns:
[const DOMString] A DOMString representing the name of the Element.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlLoadDocumentEx.html0000644000175000017500000000276111021325544022124 00000000000000 EXPORT_SPEC int ixmlLoadDocumentEx

EXPORT_SPEC int ixmlLoadDocumentEx

(char* xmlFile,
  IXML_Document** doc )

Parses an XML text file converting it into an IXML DOM representation.

Documentation

Parses an XML text file converting it into an IXML DOM representation.

The ixmlLoadDocumentEx API differs from the ixmlLoadDocument API in that it returns a an error code representing the actual failure rather than just NULL.

Parameters:
xmlFile - The filename of the XML text to convert to a Document.
doc - A pointer to the Document if file correctly parses or NULL on an error.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: The xmlFile is not a valid pointer.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getAttributes.html0000644000175000017500000000207311021325544023040 00000000000000 EXPORT_SPEC IXML_NamedNodeMap* ixmlNode_getAttributes

EXPORT_SPEC IXML_NamedNodeMap* ixmlNode_getAttributes

(IXML_Node* nodeptr )

Retrieves the attributes of a Node, if it is an Element node, in a NamedNodeMap structure.

Documentation

Retrieves the attributes of a Node, if it is an Element node, in a NamedNodeMap structure.

Parameters:
nodeptr - The Node from which to retrieve the attributes.
Returns:
[NamedNodeMap*] A NamedNodeMap of the attributes or NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/IXMLAPI.html0000644000175000017500000000572711021325544017467 00000000000000 IXML API

IXML API

The IXML API contains utility functions that are not part of the standard DOM interfaces. They include functions to create a DOM structure from a file or buffer, create an XML file from a DOM structure, and manipulate DOMString objects.

o ixmlPrintDocument
Renders a Node and all sub-elements into an XML document representation.
o ixmlPrintNode
Renders a Node and all sub-elements into an XML text representation.
o ixmlDocumenttoString
Renders a Node and all sub-elements into an XML document representation.
o ixmlNodetoString
Renders a Node and all sub-elements into an XML text representation.
o ixmlRelaxParser
Makes the XML parser more tolerant to malformed text.
o ixmlParseBuffer
Parses an XML text buffer converting it into an IXML DOM representation.
o ixmlParseBufferEx
Parses an XML text buffer converting it into an IXML DOM representation.
o ixmlLoadDocument
Parses an XML text file converting it into an IXML DOM representation.
o ixmlLoadDocumentEx
Parses an XML text file converting it into an IXML DOM representation.
o ixmlCloneDOMString
Clones an existing DOMString.
o ixmlFreeDOMString
Frees a DOMString.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNodeList_length.html0000644000175000017500000000170411021325544022327 00000000000000 EXPORT_SPEC unsigned long ixmlNodeList_length

EXPORT_SPEC unsigned long ixmlNodeList_length

(IXML_NodeList* nList )

Returns the number of Nodes in a NodeList.

Documentation

Returns the number of Nodes in a NodeList.

Parameters:
nList - The NodeList for which to retrieve the number of Nodes.
Returns:
[unsigned long] The number of Nodes in the NodeList.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createElementNS.html0000644000175000017500000000232011021325544024114 00000000000000 EXPORT_SPEC IXML_Element* ixmlDocument_createElementNS

EXPORT_SPEC IXML_Element* ixmlDocument_createElementNS

(IXML_Document* doc,
  DOMString namespaceURI,
  DOMString qualifiedName )

Creates a new Element node in the given qualified name and namespace URI.

Documentation

Creates a new Element node in the given qualified name and namespace URI.

Parameters:
doc - The owner Document of the new node.
namespaceURI - The namespace URI for the new Element.
qualifiedName - The qualified name of the new Element.
Returns:
[Element*] A pointer to the new Element or NULL on failure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_setNamedItem.html0000644000175000017500000000230111021325544024166 00000000000000 EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_setNamedItem

EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_setNamedItem

(IXML_NamedNodeMap* nnMap,
  IXML_Node* arg )

Adds a new Node to the NamedNodeMap using the Node name attribute.

Documentation

Adds a new Node to the NamedNodeMap using the Node name attribute.

Parameters:
nnMap - The NamedNodeMap in which to add the new Node.
arg - The new Node to add to the NamedNodeMap.
Returns:
[Node*] The old Node if the new Node replaces it or NULL if the Node was not in the NamedNodeMap before.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_setNodeValue.html0000644000175000017500000000252011021325544022605 00000000000000 EXPORT_SPEC int ixmlNode_setNodeValue

EXPORT_SPEC int ixmlNode_setNodeValue

(IXML_Node* nodeptr,
  char* newNodeValue )

Assigns a new value to a Node.

Documentation

Assigns a new value to a Node. The newNodeValue string is duplicated and stored in the Node so that the original does not have to persist past this call.

Parameters:
nodeptr - The Node to which to assign a new value.
newNodeValue - The new value of the Node.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: The Node* is not a valid pointer.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlParseBuffer.html0000644000175000017500000000176211021325544021455 00000000000000 EXPORT_SPEC IXML_Document* ixmlParseBuffer

EXPORT_SPEC IXML_Document* ixmlParseBuffer

(char* buffer )

Parses an XML text buffer converting it into an IXML DOM representation.

Documentation

Parses an XML text buffer converting it into an IXML DOM representation.

Parameters:
buffer - The buffer that contains the XML text to convert to a Document.
Returns:
[Document*] A Document if the buffer correctly parses or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createAttributeNSEx.html0000644000175000017500000000343011021325544024766 00000000000000 EXPORT_SPEC int ixmlDocument_createAttributeNSEx

EXPORT_SPEC int ixmlDocument_createAttributeNSEx

(IXML_Document* doc,
  DOMString namespaceURI,
  DOMString qualifiedName,
  IXML_Attr** attrNode )

Creates a new Attr node with the given qualified name and namespace URI.

Documentation

Creates a new Attr node with the given qualified name and namespace URI.

The ixmlDocument_createAttributeNSEx API differs from the ixmlDocument_createAttributeNS API in that it returns an error code describing the reason for failure rather than just NULL.

Parameters:
doc - The owner Document of the new Attr.
namespaceURI - The namespace URI for the attribute.
qualifiedName - The qualified name of the attribute.
attrNode - A pointer to an Attr where the new object will be stored.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either doc, namespaceURI, or qualifiedName is NULL.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createAttributeNS.html0000644000175000017500000000227111021325544024473 00000000000000 EXPORT_SPEC IXML_Attr* ixmlDocument_createAttributeNS

EXPORT_SPEC IXML_Attr* ixmlDocument_createAttributeNS

(IXML_Document* doc,
  DOMString namespaceURI,
  DOMString qualifiedName )

Creates a new Attr node with the given qualified name and namespace URI.

Documentation

Creates a new Attr node with the given qualified name and namespace URI.

Parameters:
doc - The owner Document of the new Attr.
namespaceURI - The namespace URI for the attribute.
qualifiedName - The qualified name of the attribute.
Returns:
[Attr*] A pointer to the new Attr or NULL on failure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_removeChild.html0000644000175000017500000000315311021325544022453 00000000000000 EXPORT_SPEC int ixmlNode_removeChild

EXPORT_SPEC int ixmlNode_removeChild

(IXML_Node* nodeptr,
  IXML_Node* oldChild,
  IXML_Node** returnNode )

Removes a child from the list of children of a Node.

Documentation

Removes a child from the list of children of a Node. returnNode will contain the oldChild Node, appropriately removed from the tree (i.e. it will no longer have an owner document).

Parameters:
nodeptr - The parent of the child to remove.
oldChild - The child Node to remove.
returnNode - Pointer to a Node to place the removed oldChild Node.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either nodeptr or oldChild is NULL.
  • IXML_NO_MODIFICATION_ALLOWED_ERR: nodeptr or its parent is read-only.
  • IXML_NOT_FOUND_ERR: oldChild is not among the children of nodeptr.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_removeAttribute.html0000644000175000017500000000216211021325544024076 00000000000000 EXPORT_SPEC int ixmlElement_removeAttribute

EXPORT_SPEC int ixmlElement_removeAttribute

(IXML_Element* element,
  DOMString name )

Removes an attribute by name.

Documentation

Removes an attribute by name.

Parameters:
element - The Element from which to remove the attribute.
name - The name of the attribute to remove.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either element or name is NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlRelaxParser.html0000644000175000017500000000204411021325544021473 00000000000000 void ixmlRelaxParser

void ixmlRelaxParser

(char errorChar)

Makes the XML parser more tolerant to malformed text.

Documentation

Makes the XML parser more tolerant to malformed text.

If errorChar is 0 (default), the parser is strict about XML encoding : invalid UTF-8 sequences or "&" entities are rejected, and the parsing aborts. If errorChar is not 0, the parser is relaxed : invalid UTF-8 characters are replaced by the errorChar, and invalid "&" entities are left untranslated. The parsing is then allowed to continue.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_removeAttributeNS.html0000644000175000017500000000247111021325544024342 00000000000000 EXPORT_SPEC int ixmlElement_removeAttributeNS

EXPORT_SPEC int ixmlElement_removeAttributeNS

(IXML_Element* element,
  DOMString namespaceURI,
  DOMString localName )

Removes an attribute using the namespace URI and local name.

Documentation

Removes an attribute using the namespace URI and local name.

Parameters:
element - The Element from which to remove the the attribute.
namespaceURI - The namespace URI of the attribute.
localName - The local name of the attribute.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either element, namespaceURI, or localName is NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/InterfaceitNodeList.html0000644000175000017500000000252011021325544022247 00000000000000 Interface <I>NodeList</I>

Interface NodeList

The NodeList interface abstracts an ordered collection of nodes. Note that changes to the underlying nodes will change the nodes contained in a NodeList. The DOM2-Core refers to this as being live.

o ixmlNodeList_item
Retrieves a Node from a NodeList specified by a numerical index.
o ixmlNodeList_length
Returns the number of Nodes in a NodeList.
o ixmlNodeList_free
Frees a NodeList object.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlPrintDocument.html0000644000175000017500000000272711021325544022046 00000000000000 DOMString ixmlPrintDocument

DOMString ixmlPrintDocument

(IXML_Document* doc)

Renders a Node and all sub-elements into an XML document representation.

Documentation

Renders a Node and all sub-elements into an XML document representation. The caller is required to free the DOMString returned from this function using ixmlFreeDOMString when it is no longer required.

Note that this function can be used for any Node-derived interface. The difference between ixmlPrintDocument and ixmlPrintNode is ixmlPrintDocument includes the XML prolog while ixmlPrintNode only produces XML elements. An XML document is not well formed unless it includes the prolog and at least one element.

This function introduces lots of white space to print the DOMString in readable format.

Returns:
[DOMString] A DOMString with the XML document representation of the DOM tree or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlParseBufferEx.html0000644000175000017500000000277111021325544021753 00000000000000 EXPORT_SPEC int ixmlParseBufferEx

EXPORT_SPEC int ixmlParseBufferEx

(char* buffer,
  IXML_Document** doc )

Parses an XML text buffer converting it into an IXML DOM representation.

Documentation

Parses an XML text buffer converting it into an IXML DOM representation.

The ixmlParseBufferEx API differs from the ixmlParseBuffer API in that it returns an error code representing the actual failure rather than just NULL.

Parameters:
buffer - The buffer that contains the XML text to convert to a Document.
doc - A point to store the Document if file correctly parses or NULL on an error.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: The buffer is not a valid pointer.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_getLength.html0000644000175000017500000000171311021325544023536 00000000000000 EXPORT_SPEC unsigned long ixmlNamedNodeMap_getLength

EXPORT_SPEC unsigned long ixmlNamedNodeMap_getLength

(IXML_NamedNodeMap* nnMap )

Returns the number of items contained in this NamedNodeMap.

Documentation

Returns the number of items contained in this NamedNodeMap.

Parameters:
nnMap - The NamedNodeMap from which to retrieve the size.
Returns:
[unsigned long] The number of nodes in this map.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlAttr_free.html0000644000175000017500000000145711021325544021165 00000000000000 EXPORT_SPEC void ixmlAttr_free

EXPORT_SPEC void ixmlAttr_free

(IXML_Attr* attrNode )

Frees an Attr node.

Documentation

Frees an Attr node.

Parameters:
attrNode - The Attr node to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/index.html0000644000175000017500000000231711021325544017463 00000000000000 IXML v1.2

IXML v1.2

Linux DOM2 XML Parser Version 1.2

Copyright (C) 2000-2003 Intel Corporation ALL RIGHTS RESERVED

Revision 1.2.1 (Tue 04 Jul 2006 04:58:36 PM EEST)


o Introduction
o License
o BOOL
o DOM Interfaces
o IXML API

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getPreviousSibling.html0000644000175000017500000000201311021325544024030 00000000000000 EXPORT_SPEC IXML_Node* ixmlNode_getPreviousSibling

EXPORT_SPEC IXML_Node* ixmlNode_getPreviousSibling

(IXML_Node* nodeptr )

Retrieves the sibling Node immediately preceding this Node.

Documentation

Retrieves the sibling Node immediately preceding this Node.

Parameters:
nodeptr - The Node for which to retrieve the previous sibling.
Returns:
[Node*] A pointer to the previous sibling Node or NULL if no such Node exists.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_setAttribute.html0000644000175000017500000000311411021325544023372 00000000000000 EXPORT_SPEC int ixmlElement_setAttribute

EXPORT_SPEC int ixmlElement_setAttribute

(IXML_Element* element,
  DOMString name,
  DOMString value )

Adds a new attribute to an Element.

Documentation

Adds a new attribute to an Element. If an attribute with the same name already exists, the attribute value will be updated with the new value in value.

Parameters:
element - The Element on which to set the attribute.
name - The name of the attribute.
value - The value of the attribute. Note that this is a non-parsed string and any markup must be escaped.
Returns:
[int] An integer representing of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either element, name, or value is NULL.
  • IXML_INVALID_CHARACTER_ERR: name contains an illegal character.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete the operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_removeNamedItem.html0000644000175000017500000000210011021325544024665 00000000000000 EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_removeNamedItem

EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_removeNamedItem

(IXML_NamedNodeMap* nnMap,
  DOMString name )

Removes a Node from a NamedNodeMap specified by name.

Documentation

Removes a Node from a NamedNodeMap specified by name.

Parameters:
nnMap - The NamedNodeMap from which to remove the item.
name - The name of the item to remove.
Returns:
[Node*] A pointer to the Node, if found, or NULL if it wasn't.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_getElementById.html0000644000175000017500000000206611021325544023746 00000000000000 EXPORT_SPEC IXML_Element* ixmlDocument_getElementById

EXPORT_SPEC IXML_Element* ixmlDocument_getElementById

(IXML_Document* doc,
  DOMString tagName )

Returns the Element whose ID matches that given id.

Documentation

Returns the Element whose ID matches that given id.

Parameters:
doc - The owner Document of the Element.
tagName - The name of the Element.
Returns:
[Element*] A pointer to the matching Element or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createAttribute.html0000644000175000017500000000176611021325544024242 00000000000000 EXPORT_SPEC IXML_Attr* ixmlDocument_createAttribute

EXPORT_SPEC IXML_Attr* ixmlDocument_createAttribute

(IXML_Document* doc,
  char* name )

Creates a new Attr node with the given name.

Documentation

Creates a new Attr node with the given name.

Parameters:
doc - The owner Document of the new node.
name - The name of the new attribute.
Returns:
[Attr*] A pointer to the new Attr or NULL on failure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlCDATASection_init.html0000644000175000017500000000155511021325544022435 00000000000000 EXPORT_SPEC void ixmlCDATASection_init

EXPORT_SPEC void ixmlCDATASection_init

(IXML_CDATASection* nodeptr )

Initializes a CDATASection node.

Documentation

Initializes a CDATASection node.

Parameters:
nodeptr - The CDATASection node to initialize.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlCDATASection_free.html0000644000175000017500000000153211021325544022406 00000000000000 EXPORT_SPEC void ixmlCDATASection_free

EXPORT_SPEC void ixmlCDATASection_free

(IXML_CDATASection* nodeptr )

Frees a CDATASection node.

Documentation

Frees a CDATASection node.

Parameters:
nodeptr - The CDATASection node to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createElementEx.html0000644000175000017500000000353111021325544024155 00000000000000 EXPORT_SPEC int ixmlDocument_createElementEx

EXPORT_SPEC int ixmlDocument_createElementEx

(IXML_Document* doc,
  const DOMString tagName,
  IXML_Element** rtElement )

Creates a new Element node with the given tag name.

Documentation

Creates a new Element node with the given tag name. The new Element node has a nodeName of tagName and the localName, prefix, and namespaceURI set to NULL. To create an Element with a namespace, see ixmlDocument_createElementNS.

The ixmlDocument_createElementEx API differs from the ixmlDocument_createElement API in that it returns an error code describing the reason for failure rather than just NULL.

Parameters:
doc - The owner Document of the new node.
tagName - The tag name of the new Element node.
rtElement - Pointer to an Element where the new object will be stored.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either doc or tagName is NULL.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_init.html0000644000175000017500000000152511021325544022047 00000000000000 EXPORT_SPEC void ixmlDocument_init

EXPORT_SPEC void ixmlDocument_init

(IXML_Document* nodeptr )

Initializes a Document node.

Documentation

Initializes a Document node.

Parameters:
nodeptr - The Document node to initialize.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_free.html0000644000175000017500000000205411021325544022023 00000000000000 EXPORT_SPEC void ixmlDocument_free

EXPORT_SPEC void ixmlDocument_free

(IXML_Document* doc )

Frees a Document object and all Nodes associated with it.

Documentation

Frees a Document object and all Nodes associated with it. Any Nodes extracted via any other interface function, e.g. ixmlDocument_GetElementById, become invalid after this call unless explicitly cloned.

Parameters:
doc - The Document to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getParentNode.html0000644000175000017500000000170411021325544022751 00000000000000 EXPORT_SPEC IXML_Node* ixmlNode_getParentNode

EXPORT_SPEC IXML_Node* ixmlNode_getParentNode

(IXML_Node* nodeptr )

Retrieves the parent Node for a Node.

Documentation

Retrieves the parent Node for a Node.

Parameters:
nodeptr - The Node from which to retrieve the parent.
Returns:
[Node*] A pointer to the parent Node or NULL if the Node has no parent.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getFirstChild.html0000644000175000017500000000174411021325544022751 00000000000000 EXPORT_SPEC IXML_Node* ixmlNode_getFirstChild

EXPORT_SPEC IXML_Node* ixmlNode_getFirstChild

(IXML_Node* nodeptr )

Retrieves the first child Node of a Node.

Documentation

Retrieves the first child Node of a Node.

Parameters:
nodeptr - The Node from which to retrieve the first child.
Returns:
[Node*] A pointer to the first child Node or NULL if the Node does not have any children.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getNamespaceURI.html0000644000175000017500000000235711021325544023173 00000000000000 EXPORT_SPEC const DOMString ixmlNode_getNamespaceURI

EXPORT_SPEC const DOMString ixmlNode_getNamespaceURI

(IXML_Node* nodeptr )

Retrieves the namespace URI for a Node as a DOMString.

Documentation

Retrieves the namespace URI for a Node as a DOMString. Only Nodes of type eELEMENT_NODE or eATTRIBUTE_NODE can have a namespace URI. Nodes created through the Document interface will only contain a namespace if created using ixmlDocument_createElementNS.

Parameters:
nodeptr - The Node for which to retrieve the namespace.
Returns:
[const DOMString] A DOMString representing the URI of the namespace or NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createAttributeEx.html0000644000175000017500000000305711021325544024532 00000000000000 EXPORT_SPEC int ixmlDocument_createAttributeEx

EXPORT_SPEC int ixmlDocument_createAttributeEx

(IXML_Document* doc,
  char* name,
  IXML_Attr** attrNode )

Creates a new Attr node with the given name.

Documentation

Creates a new Attr node with the given name.

The ixmlDocument_createAttributeEx API differs from the ixmlDocument_createAttribute API in that it returns an error code describing the reason for failure rather than just NULL.

Parameters:
doc - The owner Document of the new node.
name - The name of the new attribute.
attrNode - A pointer to a Attr where the new object will be stored.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either doc or name is NULL.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createTextNode.html0000644000175000017500000000202311021325544024014 00000000000000 EXPORT_SPEC IXML_Node* ixmlDocument_createTextNode

EXPORT_SPEC IXML_Node* ixmlDocument_createTextNode

(IXML_Document* doc,
  const DOMString data )

Creates a new Text node with the given data.

Documentation

Creates a new Text node with the given data.

Parameters:
doc - The owner Document of the new node.
data - The data to associate with the new Text node.
Returns:
[Node*] A pointer to the new Node or NULL on failure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/InterfaceitElement.html0000644000175000017500000001224711021325544022126 00000000000000 Interface <I>Element</I>

Interface Element

The Element interface represents an element in an XML document. Only Elements are allowed to have attributes, which are stored in the attributes member of a Node. The Element interface extends the Node interface and adds more operations to manipulate attributes.

o ixmlElement_init
Initializes a IXML_Element node.
o ixmlElement_getTagName
Returns the name of the tag as a constant string.
o ixmlElement_getAttribute
Retrieves an attribute of an Element by name.
o ixmlElement_setAttribute
Adds a new attribute to an Element.
o ixmlElement_removeAttribute
Removes an attribute by name.
o ixmlElement_getAttributeNode
Retrieves an attribute node by name.
o ixmlElement_setAttributeNode
Adds a new attribute node to an Element.
o ixmlElement_removeAttributeNode
Removes the specified attribute node from an Element.
o ixmlElement_getElementsByTagName
Returns a NodeList of all descendant Elements with a given tag name, in the order in which they are encountered in a pre-order traversal of this Element tree.
o ixmlElement_getAttributeNS
Retrieves an attribute value using the local name and namespace URI.
o ixmlElement_setAttributeNS
Adds a new attribute to an Element using the local name and namespace URI.
o ixmlElement_removeAttributeNS
Removes an attribute using the namespace URI and local name.
o ixmlElement_getAttributeNodeNS
Retrieves an Attr node by local name and namespace URI.
o ixmlElement_setAttributeNodeNS
Adds a new attribute node.
o ixmlElement_getElementsByTagNameNS
Returns a NodeList of all descendant Elements with a given tag name, in the order in which they are encountered in the pre-order traversal of the Element tree.
o ixmlElement_hasAttribute
Queries whether the Element has an attribute with the given name or a default value.
o ixmlElement_hasAttributeNS
Queries whether the Element has an attribute with the given local name and namespace URI or has a default value for that attribute.
o ixmlElement_free
Frees the given Element and any subtree of the Element.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_getAttributeNS.html0000644000175000017500000000224711021325544023625 00000000000000 EXPORT_SPEC DOMString ixmlElement_getAttributeNS

EXPORT_SPEC DOMString ixmlElement_getAttributeNS

(IXML_Element* element,
  DOMString namespaceURI,
  DOMString localname )

Retrieves an attribute value using the local name and namespace URI.

Documentation

Retrieves an attribute value using the local name and namespace URI.

Parameters:
element - The Element from which to get the attribute value.
namespaceURI - The namespace URI of the attribute.
localname - The local name of the attribute.
Returns:
[DOMString] A DOMString representing the value of the matching attribute.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_hasChildNodes.html0000644000175000017500000000171211021325544022721 00000000000000 EXPORT_SPEC BOOL ixmlNode_hasChildNodes

EXPORT_SPEC BOOL ixmlNode_hasChildNodes

(IXML_Node* nodeptr )

Queries whether or not a Node has children.

Documentation

Queries whether or not a Node has children.

Parameters:
nodeptr - The Node to query for children.
Returns:
[BOOL] TRUE if the Node has one or more children otherwise FALSE.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createDocumentEx.html0000644000175000017500000000241711021325544024344 00000000000000 EXPORT_SPEC int ixmlDocument_createDocumentEx

EXPORT_SPEC int ixmlDocument_createDocumentEx

(IXML_Document** doc )

Creates a new empty Document node.

Documentation

Creates a new empty Document node. The ixmlDocument_createDocumentEx API differs from the ixmlDocument_createDocument API in that it returns an error code describing the reason for the failure rather than just NULL.

Parameters:
doc - Pointer to a Document where the new object will be stored.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlFreeDOMString.html0000644000175000017500000000145111021325544021654 00000000000000 EXPORT_SPEC void ixmlFreeDOMString

EXPORT_SPEC void ixmlFreeDOMString

(DOMString buf )

Frees a DOMString.

Documentation

Frees a DOMString.

Parameters:
buf - The DOMString to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNodetoString.html0000644000175000017500000000257211021325544021670 00000000000000 EXPORT_SPEC DOMString ixmlNodetoString

EXPORT_SPEC DOMString ixmlNodetoString

(IXML_Node* doc )

Renders a Node and all sub-elements into an XML text representation.

Documentation

Renders a Node and all sub-elements into an XML text representation. The caller is required to free the DOMString returned from this function using ixmlFreeDOMString when it is no longer required.

Note that this function can be used for any Node-derived interface. The difference between ixmlNodetoString and ixmlDocumenttoString is ixmlNodetoString does not include the XML prolog, it only produces XML elements.

Parameters:
doc - The root of the Node tree to render to XML text.
Returns:
[DOMString] A DOMString with the XML text representation of the DOM tree or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/toc.html0000644000175000017500000000064011021325544017136 00000000000000 Table of Contents

Table of Contents

General stuff



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/InterfaceitCDATASection.html0000644000175000017500000000241011021325544022665 00000000000000 Interface <I>CDATASection</I>

Interface CDATASection

The CDATASection is used to escape blocks of text containing characters that would otherwise be regarded as markup. CDATA sections cannot be nested. Their primary purpose is for including material such XML fragments, without needing to escape all the delimiters. For more information, refer to the Interface CDATASection section in the DOM2-Core.

o ixmlCDATASection_init
Initializes a CDATASection node.
o ixmlCDATASection_free
Frees a CDATASection node.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_setNamedItemNS.html0000644000175000017500000000233611021325544024437 00000000000000 EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_setNamedItemNS

EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_setNamedItemNS

(IXML_NamedNodeMap* nnMap,
  IXML_Node* arg )

Adds a new Node to the NamedNodeMap using the Node local name and namespace URI attributes.

Documentation

Adds a new Node to the NamedNodeMap using the Node local name and namespace URI attributes.

Parameters:
nnMap - The NamedNodeMap in which to add the Node.
arg - The Node to add to the map.
Returns:
[Node*] The old Node if the new Node replaces it or NULL if the Node was not in the NamedNodeMap before.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlCloneDOMString.html0000644000175000017500000000165611021325544022042 00000000000000 EXPORT_SPEC DOMString ixmlCloneDOMString

EXPORT_SPEC DOMString ixmlCloneDOMString

(const DOMString src )

Clones an existing DOMString.

Documentation

Clones an existing DOMString.

Parameters:
src - The source DOMString to clone.
Returns:
[DOMString] A new DOMString that is a duplicate of the original or NULL if the operation could not be completed.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/License.html0000644000175000017500000000372311021325544017740 00000000000000 License

License

Copyright (c) 2000-2003 Intel Corporation All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

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

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getNextSibling.html0000644000175000017500000000177311021325544023146 00000000000000 EXPORT_SPEC IXML_Node* ixmlNode_getNextSibling

EXPORT_SPEC IXML_Node* ixmlNode_getNextSibling

(IXML_Node* nodeptr )

Retrieves the sibling Node immediately following this Node.

Documentation

Retrieves the sibling Node immediately following this Node.

Parameters:
nodeptr - The Node from which to retrieve the next sibling.
Returns:
[Node*] A pointer to the next sibling Node or NULL if no such Node exists.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_free.html0000644000175000017500000000163411021325544022540 00000000000000 EXPORT_SPEC void ixmlNamedNodeMap_free

EXPORT_SPEC void ixmlNamedNodeMap_free

(IXML_NamedNodeMap* nnMap )

Frees a NamedNodeMap.

Documentation

Frees a NamedNodeMap. The Nodes inside the map are not freed, just the NamedNodeMap object.

Parameters:
nnMap - The NamedNodeMap to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_getNamedItem.html0000644000175000017500000000201311021325544024152 00000000000000 EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_getNamedItem

EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_getNamedItem

(IXML_NamedNodeMap* nnMap,
  DOMString name )

Retrieves a Node from the NamedNodeMap by name.

Documentation

Retrieves a Node from the NamedNodeMap by name.

Parameters:
nnMap - The NamedNodeMap to search.
name - The name of the Node to find.
Returns:
[Node*] A Node or NULL if there is an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_item.html0000644000175000017500000000212711021325544022553 00000000000000 EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_item

EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_item

(IXML_NamedNodeMap* nnMap,
  unsigned long index )

Retrieves a Node from a NamedNodeMap specified by a numerical index.

Documentation

Retrieves a Node from a NamedNodeMap specified by a numerical index.

Parameters:
nnMap - The NamedNodeMap from which to remove the Node.
index - The index into the map to remove.
Returns:
[Node*] A pointer to the Node, if found, or NULL if it wasn't.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createTextNodeEx.html0000644000175000017500000000310711021325544024315 00000000000000 EXPORT_SPEC int ixmlDocument_createTextNodeEx

EXPORT_SPEC int ixmlDocument_createTextNodeEx

(IXML_Document* doc,
  const DOMString data,
  IXML_Node** textNode )

Creates a new Text node with the given data.

Documentation

Creates a new Text node with the given data. The ixmlDocument_createTextNodeEx API differs from the ixmlDocument_createTextNode API in that it returns an error code describing the reason for failure rather than just NULL.

Parameters:
doc - The owner Document of the new node.
data - The data to associate with the new Text node.
textNode - A pointer to a Node where the new object will be stored.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either doc or data is NULL.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getNodeValue.html0000644000175000017500000000176411021325544022602 00000000000000 EXPORT_SPEC DOMString ixmlNode_getNodeValue

EXPORT_SPEC DOMString ixmlNode_getNodeValue

(IXML_Node* nodeptr )

Returns the value of the Node as a string.

Documentation

Returns the value of the Node as a string. Note that this string is not a copy and modifying it will modify the value of the Node.

Parameters:
nodeptr - Pointer to the Node to retrieve the value.
Returns:
[DOMString] A DOMString of the Node value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_replaceChild.html0000644000175000017500000000433011021325544022567 00000000000000 EXPORT_SPEC int ixmlNode_replaceChild

EXPORT_SPEC int ixmlNode_replaceChild

(IXML_Node* nodeptr,
  IXML_Node* newChild,
  IXML_Node* oldChild,
  IXML_Node** returnNode )

Replaces an existing child Node with a new child Node in the list of children of a Node.

Documentation

Replaces an existing child Node with a new child Node in the list of children of a Node. If newChild is already in the tree, it will first be removed. returnNode will contain the oldChild Node, appropriately removed from the tree (i.e. it will no longer have an owner document).

Parameters:
nodeptr - The parent of the Node which contains the child to replace.
newChild - The child with which to replace oldChild.
oldChild - The child to replace with newChild.
returnNode - Pointer to a Node to place the removed oldChild Node.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMTER: Either nodeptr, newChild, or oldChild is NULL.
  • IXML_HIERARCHY_REQUEST_ERR: The newChild is not a type of Node that can be inserted into this tree or newChild is an ancestor of nodePtr.
  • IXML_WRONG_DOCUMENT_ERR: newChild was created from a different document than nodeptr.
  • IXML_NO_MODIFICATION_ALLOWED_ERR: nodeptr or its parent is read-only.
  • IXML_NOT_FOUND_ERR: oldChild is not a child of nodeptr.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createCDATASectionEx.html0000644000175000017500000000314711021325544024730 00000000000000 EXPORT_SPEC int ixmlDocument_createCDATASectionEx

EXPORT_SPEC int ixmlDocument_createCDATASectionEx

(IXML_Document* doc,
  DOMString data,
  IXML_CDATASection** cdNode )

Creates a new CDATASection node with given data.

Documentation

Creates a new CDATASection node with given data.

The ixmlDocument_createCDATASectionEx API differs from the ixmlDocument_createCDATASection API in that it returns an error code describing the reason for failure rather than just NULL.

Parameters:
doc - The owner Document of the new node.
data - The data to associate with the new CDATASection node.
cdNode - A pointer to a Node where the new object will be stored.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either doc or {\bd data} is NULL.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getOwnerDocument.html0000644000175000017500000000226111021325544023502 00000000000000 EXPORT_SPEC IXML_Document* ixmlNode_getOwnerDocument

EXPORT_SPEC IXML_Document* ixmlNode_getOwnerDocument

(IXML_Node* nodeptr )

Retrieves the document object associated with this Node.

Documentation

Retrieves the document object associated with this Node. This owner document Node allows other Nodes to be created in the context of this document. Note that Document nodes do not have an owner document.

Parameters:
nodeptr - The Node from which to retrieve the owner document.
Returns:
[Document*] A pointer to the owning Document or NULL, if the Node does not have an owner.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_hasAttributes.html0000644000175000017500000000175711021325544023044 00000000000000 EXPORT_SPEC BOOL ixmlNode_hasAttributes

EXPORT_SPEC BOOL ixmlNode_hasAttributes

(IXML_Node* node )

Queries whether this Node has attributes.

Documentation

Queries whether this Node has attributes. Note that only Element nodes have attributes.

Parameters:
node - The Node to query for attributes.
Returns:
[BOOL] TRUE if the Node has attributes otherwise FALSE.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/DOMInterfaces.html0000644000175000017500000000376011021325544021002 00000000000000 DOM Interfaces

DOM Interfaces

The Document Object Model consists of a set of objects and interfaces for accessing and manipulating documents. IXML does not implement all the interfaces documented in the DOM2-Core recommendation but defines a subset of the most useful interfaces. A description of the supported interfaces and methods is presented in this section.

For a complete discussion on the object model, the object hierarchy, etc., refer to section 1.1 of the DOM2-Core recommendation.


o Interface Node
o Interface Attr
o Interface CDATASection
o Interface Document
o Interface Element
o Interface NamedNodeMap
o Interface NodeList

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_cloneNode.html0000644000175000017500000000231411021325544022116 00000000000000 EXPORT_SPEC IXML_Node* ixmlNode_cloneNode

EXPORT_SPEC IXML_Node* ixmlNode_cloneNode

(IXML_Node* nodeptr,
  BOOL deep )

Clones a Node.

Documentation

Clones a Node. The new Node does not have a parent. The deep parameter controls whether the subtree of the Node is also cloned. For details on cloning specific types of Nodes, refer to the DOM2-Core recommendation.

Parameters:
nodeptr - The Node to clone.
deep - TRUE to clone the subtree also or FALSE to clone only nodeptr.
Returns:
[Node*] A clone of nodeptr or NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/icon1.gif0000644000175000017500000000050611021325544017164 00000000000000GIF89aĄ˙˙˙€{ĆFAÍÍkbÍÖţţďĆ{{ĆÍţ04ţ ţçś‹¨ţ¤Ćţţ˝”„$ ţÖ„Z޵c˝­ZJssJJJśdbÍk21Ś!ů,c@€pH,ŹÄ€`0Ž„‚Áp@$EĹÂŔh8 ‚(08"’IR±Gァ@2š÷ć±YpîyCw !"D #$!%E&''!ť(G ""—H§¨DA;libupnp-1.8.0~svn20100507/docs/dist/html/ixml/icon2.gif0000644000175000017500000000050611021325544017165 00000000000000GIF89aŐîîî‘›utYYt†…”UUsdded_^€ONj›RQnmlŽ~›ih‹\[|?>TŻłżĽÁÉmlŽJJe;:O==Mvu•ZYv44G##0WWwHGa('5KJeED]##0(55C--=(eeq……”**9RR_!ů,c@€pH,ŹÄ€`0Ž„‚Áp@$EĹÂŔh8 ‚(08"’IR±Gァ@2š÷ć±YpîyCw !"D #$!%E&''!ť(G ""—H§¨DA;libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getNodeName.html0000644000175000017500000000215511021325544022401 00000000000000 EXPORT_SPEC const DOMString ixmlNode_getNodeName

EXPORT_SPEC const DOMString ixmlNode_getNodeName

(IXML_Node* nodeptr )

Returns the name of the Node, depending on what type of Node it is, in a read-only string.

Documentation

Returns the name of the Node, depending on what type of Node it is, in a read-only string. Refer to the table in the DOM2-Core for a description of the node names for various interfaces.

Parameters:
nodeptr - Pointer to the node to retrieve the name.
Returns:
[const DOMString] A constant DOMString of the node name.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_getElementsByTagName.html0000644000175000017500000000242711021325544025112 00000000000000 EXPORT_SPEC IXML_NodeList* ixmlDocument_getElementsByTagName

EXPORT_SPEC IXML_NodeList* ixmlDocument_getElementsByTagName

(IXML_Document* doc,
  DOMString tagName )

Returns a NodeList of all Elements that match the given tag name in the order in which they were encountered in a preorder traversal of the Document tree.

Documentation

Returns a NodeList of all Elements that match the given tag name in the order in which they were encountered in a preorder traversal of the Document tree.

Parameters:
doc - The Document to search.
tagName - The tag name to find.
Returns:
[NodeList*] A pointer to a NodeList containing the matching items or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_importNode.html0000644000175000017500000000401111021325544023215 00000000000000 EXPORT_SPEC int ixmlDocument_importNode

EXPORT_SPEC int ixmlDocument_importNode

(IXML_Document* doc,
  IXML_Node* importNode,
  BOOL deep,
  IXML_Node** rtNode )

Imports a Node from another Document into this Document.

Documentation

Imports a Node from another Document into this Document. The new Node does not a have parent node: it is a clone of the original Node with the ownerDocument set to doc. The deep parameter controls whether all the children of the Node are imported. Refer to the DOM2-Core recommendation for details on importing specific node types.

Parameters:
doc - The Document into which to import.
importNode - The Node to import.
deep - TRUE to import all children of importNode or FALSE to import only the root node.
rtNode - A pointer to a new Node owned by doc.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either doc or importNode is not a valid pointer.
  • IXML_NOT_SUPPORTED_ERR: importNode is a Document, which cannot be imported.
  • IXML_FAILED: The import operation failed because the Node to be imported could not be cloned.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_getElementsByTagName.html0000644000175000017500000000251611021325544024724 00000000000000 EXPORT_SPEC IXML_NodeList* ixmlElement_getElementsByTagName

EXPORT_SPEC IXML_NodeList* ixmlElement_getElementsByTagName

(IXML_Element* element,
  DOMString tagName )

Returns a NodeList of all descendant Elements with a given tag name, in the order in which they are encountered in a pre-order traversal of this Element tree.

Documentation

Returns a NodeList of all descendant Elements with a given tag name, in the order in which they are encountered in a pre-order traversal of this Element tree.

Parameters:
element - The Element from which to start the search.
tagName - The name of the tag for which to search.
Returns:
[NodeList*] A NodeList of the matching Elements or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/Introduction.html0000644000175000017500000000345511021325544021041 00000000000000 Introduction

Introduction

The Linux DOM2 XML Parser Version 1.2 (IXML) is a lightweight, portable XML parser supporting the standard Document Object Model (DOM) Level 2 interfaces. The parser uses a C-style interface, making it idea for small, embedded applications. This document describes the interfaces supported by IXML 1.2, referencing the W3C DOM2 recommendations when necessary, and the additional utility application programming interfaces (APIs) that it supports.

Note that this document assumes that the reader has a copy of the DOM2-Core recommendation. Refer to the link below to obtain a copy. Only a brief description is included here and the reader is pointed to the DOM2-Core recommendation for more details. This document does, however, clarify IXML-specific behavior when the recommendation is unclear.

About DOM

The Document Object Model (DOM) is a set of interfaces that give a programmatic interface to documents. It provides a platform-neutral and language-neutral interface for random access and updating elements inside XML documents. DOM Level 1 provided the basic interfaces to access document elements. DOM Level 2 extended the interfaces to provide proper support for XML namespaces.

The latest DOM 2 recommendation is maintained by W3C and is available from http://www.w3.org/TR/DOM-Level-2-Core.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/General.html0000644000175000017500000000057011021325544017730 00000000000000 General Bits

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_getAttribute.html0000644000175000017500000000202311021325544023354 00000000000000 EXPORT_SPEC DOMString ixmlElement_getAttribute

EXPORT_SPEC DOMString ixmlElement_getAttribute

(IXML_Element* element,
  DOMString name )

Retrieves an attribute of an Element by name.

Documentation

Retrieves an attribute of an Element by name.

Parameters:
element - The Element from which to retrieve the attribute.
name - The name of the attribute to retrieve.
Returns:
[DOMString] A DOMString representing the value of the attribute.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_init.html0000644000175000017500000000152211021325544021657 00000000000000 EXPORT_SPEC void ixmlElement_init

EXPORT_SPEC void ixmlElement_init

(IXML_Element* element )

Initializes a IXML_Element node.

Documentation

Initializes a IXML_Element node.

Parameters:
element - The Element to initialize.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_free.html0000644000175000017500000000161111021325544021634 00000000000000 EXPORT_SPEC void ixmlElement_free

EXPORT_SPEC void ixmlElement_free

(IXML_Element* element )

Frees the given Element and any subtree of the Element.

Documentation

Frees the given Element and any subtree of the Element.

Parameters:
element - The Element to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_getAttributeNode.html0000644000175000017500000000217611021325544024173 00000000000000 EXPORT_SPEC IXML_Attr* ixmlElement_getAttributeNode

EXPORT_SPEC IXML_Attr* ixmlElement_getAttributeNode

(IXML_Element* element,
  DOMString name )

Retrieves an attribute node by name.

Documentation

Retrieves an attribute node by name. See ixmlElement_getAttributeNodeNS to retrieve an attribute node using a qualified name or namespace URI.

Parameters:
element - The Element from which to get the attribute node.
name - The name of the attribute node to find.
Returns:
[Attr*] A pointer to the attribute matching name or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getLastChild.html0000644000175000017500000000173511021325544022565 00000000000000 EXPORT_SPEC IXML_Node* ixmlNode_getLastChild

EXPORT_SPEC IXML_Node* ixmlNode_getLastChild

(IXML_Node* nodeptr )

Retrieves the last child Node of a Node.

Documentation

Retrieves the last child Node of a Node.

Parameters:
nodeptr - The Node from which to retrieve the last child.
Returns:
[Node*] A pointer to the last child Node or NULL if the Node does not have any children.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_setAttributeNodeNS.html0000644000175000017500000000317511021325544024450 00000000000000 EXPORT_SPEC int ixmlElement_setAttributeNodeNS

EXPORT_SPEC int ixmlElement_setAttributeNodeNS

(IXML_Element* element,
  IXML_Attr* newAttr,
  IXML_Attr** rcAttr )

Adds a new attribute node.

Documentation

Adds a new attribute node. If an attribute with the same local name and namespace URI already exists in the Element, the existing attribute node is replaced with newAttr and the old returned in rcAttr.

Parameters:
element - The Element in which to add the attribute node.
newAttr - The new Attr to add.
rcAttr - A pointer to the replaced Attr, if it exists.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either element or newAttr is NULL.
  • IXML_WRONG_DOCUMENT_ERR: newAttr does not belong to the same document as element.
  • IXML_INUSE_ATTRIBUTE_ERR: newAttr already is an attribute of another Element.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlPrintNode.html0000644000175000017500000000257011021325544021151 00000000000000 DOMString ixmlPrintNode

DOMString ixmlPrintNode

(IXML_Node* doc )

Renders a Node and all sub-elements into an XML text representation.

Documentation

Renders a Node and all sub-elements into an XML text representation. The caller is required to free the DOMString returned from this function using ixmlFreeDOMString when it is no longer required.

Note that this function can be used for any Node-derived interface. A similar ixmlPrintDocument function is defined to avoid casting when printing whole documents. This function introduces lots of white space to print the DOMString in readable format.

Parameters:
doc - The root of the Node tree to render to XML text.
Returns:
[DOMString] A DOMString with the XML text representation of the DOM tree or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocumenttoString.html0000644000175000017500000000260011021325544022551 00000000000000 DOMString ixmlDocumenttoString

DOMString ixmlDocumenttoString

(IXML_Document* doc)

Renders a Node and all sub-elements into an XML document representation.

Documentation

Renders a Node and all sub-elements into an XML document representation. The caller is required to free the DOMString returned from this function using ixmlFreeDOMString when it is no longer required.

Note that this function can be used for any Node-derived interface. The difference between ixmlDocumenttoString and ixmlNodetoString is ixmlDocumenttoString includes the XML prolog while ixmlNodetoString only produces XML elements. An XML document is not well formed unless it includes the prolog and at least one element.

Returns:
[DOMString] A DOMString with the XML text representation of the DOM tree or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlLoadDocument.html0000644000175000017500000000174611021325544021631 00000000000000 EXPORT_SPEC IXML_Document* ixmlLoadDocument

EXPORT_SPEC IXML_Document* ixmlLoadDocument

(char* xmlFile )

Parses an XML text file converting it into an IXML DOM representation.

Documentation

Parses an XML text file converting it into an IXML DOM representation.

Parameters:
xmlFile - The filename of the XML text to convert to a Document.
Returns:
[Document*] A Document if the file correctly parses or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createElementNSEx.html0000644000175000017500000000344411021325544024421 00000000000000 EXPORT_SPEC int ixmlDocument_createElementNSEx

EXPORT_SPEC int ixmlDocument_createElementNSEx

(IXML_Document* doc,
  DOMString namespaceURI,
  DOMString qualifiedName,
  IXML_Element** rtElement )

Creates a new Element node in the given qualified name and namespace URI.

Documentation

Creates a new Element node in the given qualified name and namespace URI.

The ixmlDocument_createElementNSEx API differs from the ixmlDocument_createElementNS API in that it returns an error code describing the reason for failure rather than just NULL.

Parameters:
doc - The owner Document of the new node.
namespaceURI - The namespace URI for the new Element.
qualifiedName - The qualified name of the new Element.
rtElement - A pointer to an Element where the new object will be stored.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either doc, namespaceURI, or qualifiedName is NULL.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_getAttributeNodeNS.html0000644000175000017500000000221711021325544024430 00000000000000 EXPORT_SPEC IXML_Attr* ixmlElement_getAttributeNodeNS

EXPORT_SPEC IXML_Attr* ixmlElement_getAttributeNodeNS

(IXML_Element* element,
  DOMString namespaceURI,
  DOMString localName )

Retrieves an Attr node by local name and namespace URI.

Documentation

Retrieves an Attr node by local name and namespace URI.

Parameters:
element - The Element from which to get the attribute.
namespaceURI - The namespace URI of the attribute.
localName - The local name of the attribute.
Returns:
[Attr*] A pointer to an Attr or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_hasAttribute.html0000644000175000017500000000231011021325544023347 00000000000000 EXPORT_SPEC BOOL ixmlElement_hasAttribute

EXPORT_SPEC BOOL ixmlElement_hasAttribute

(IXML_Element* element,
  DOMString name )

Queries whether the Element has an attribute with the given name or a default value.

Documentation

Queries whether the Element has an attribute with the given name or a default value.

Parameters:
element - The Element on which to check for an attribute.
name - The name of the attribute for which to check.
Returns:
[BOOL] TRUE if the Element has an attribute with this name or has a default value for that attribute, otherwise FALSE.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_getElementsByTagNameNS.html0000644000175000017500000000321611021325544025350 00000000000000 EXPORT_SPEC IXML_NodeList* ixmlDocument_getElementsByTagNameNS

EXPORT_SPEC IXML_NodeList* ixmlDocument_getElementsByTagNameNS

(IXML_Document* doc,
  DOMString namespaceURI,
  DOMString localName )

Returns a NodeList of Elements that match the given local name and namespace URI in the order they are encountered in a preorder traversal of the Document tree.

Documentation

Returns a NodeList of Elements that match the given local name and namespace URI in the order they are encountered in a preorder traversal of the Document tree. Either namespaceURI or localName can be the special "*" character, which matches any namespace or any local name respectively.

Parameters:
doc - The Document to search.
namespaceURI - The namespace of the elements to find or "*" to match any namespace.
localName - The local name of the elements to find or "*" to match any local name.
Returns:
[NodeList*] A pointer to a NodeList containing the matching items or NULL on an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNamedNodeMap_removeNamedItemNS.html0000644000175000017500000000240611021325544025137 00000000000000 EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_removeNamedItemNS

EXPORT_SPEC IXML_Node* ixmlNamedNodeMap_removeNamedItemNS

(IXML_NamedNodeMap* nnMap,
  DOMString namespaceURI,
  DOMString localName )

Removes a Node from a NamedNodeMap specified by namespace URI and local name.

Documentation

Removes a Node from a NamedNodeMap specified by namespace URI and local name.

Parameters:
nnMap - The NamedNodeMap from which to remove the Node.
namespaceURI - The namespace URI of the Node to remove.
localName - The local name of the Node to remove.
Returns:
[Node*] A pointer to the Node, if found, or NULL if it wasn't.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_getLocalName.html0000644000175000017500000000242311021325544022544 00000000000000 EXPORT_SPEC const DOMString ixmlNode_getLocalName

EXPORT_SPEC const DOMString ixmlNode_getLocalName

(IXML_Node* nodeptr )

Retrieves the local name of a Node, if present.

Documentation

Retrieves the local name of a Node, if present. The local name is the tag name without the namespace prefix. Only Nodes of type eELEMENT_NODE or eATTRIBUTE_NODE can have a local name. {\Bf Node}s created through the Document interface will only contain a local name if created using ixmlDocument_createElementNS.

Parameters:
nodeptr - The Node from which to retrieve the local name.
Returns:
[const DOMString] A DOMString representing the local name of the Element or NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_setAttributeNode.html0000644000175000017500000000327311021325544024206 00000000000000 EXPORT_SPEC int ixmlElement_setAttributeNode

EXPORT_SPEC int ixmlElement_setAttributeNode

(IXML_Element* element,
  IXML_Attr* newAttr,
  IXML_Attr** rtAttr )

Adds a new attribute node to an Element.

Documentation

Adds a new attribute node to an Element. If an attribute already exists with newAttr as a name, it will be replaced with the new one and the old one will be returned in rtAttr.

Parameters:
element - The Element in which to add the new attribute.
newAttr - The new Attr to add.
rtAttr - A pointer to an Attr where the old Attr will be stored. This will have a NULL if no prior node existed.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either element or newAttr is NULL.
  • IXML_WRONG_DOCUMENT_ERR: newAttr does not belong to the same one as element.
  • IXML_INUSE_ATTRIBUTE_ERR: newAttr is already an attribute of another Element.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNodeList_free.html0000644000175000017500000000170711021325544021772 00000000000000 EXPORT_SPEC void ixmlNodeList_free

EXPORT_SPEC void ixmlNodeList_free

(IXML_NodeList* nList )

Frees a NodeList object.

Documentation

Frees a NodeList object. Since the underlying Nodes are references, they are not freed using this operating. This only frees the NodeList object.

Parameters:
nList - The NodeList to free.
Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNode_insertBefore.html0000644000175000017500000000447111021325544022645 00000000000000 EXPORT_SPEC int ixmlNode_insertBefore

EXPORT_SPEC int ixmlNode_insertBefore

(IXML_Node* nodeptr,
  IXML_Node* newChild,
  IXML_Node* refChild )

Inserts a new child Node before the existing child Node.

Documentation

Inserts a new child Node before the existing child Node. refChild can be NULL, which inserts newChild at the end of the list of children. Note that the Node (or Nodes) in newChild must already be owned by the owner document (or have no owner at all) of nodeptr for insertion. If not, the Node (or Nodes) must be imported into the document using ixmlDocument_importNode. If newChild is already in the tree, it is removed first.

Parameters:
nodeptr - The parent of the Node before which to insert the new child.
newChild - The Node to insert into the tree.
refChild - The reference child where the new Node should be inserted. The new Node will appear directly before the reference child.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either nodeptr or newChild is NULL.
  • IXML_HIERARCHY_REQUEST_ERR: The type of the Node does not allow children of the type of newChild.
  • IXML_WRONG_DOCUMENT_ERR: newChild has an owner document that does not match the owner of nodeptr.
  • IXML_NO_MODIFICATION_ALLOWED_ERR: nodeptr is read-only or the parent of the Node being inserted is read-only.
  • IXML_NOT_FOUND_ERR: refChild is not a child of nodeptr.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlNodeList_item.html0000644000175000017500000000211511021325544022001 00000000000000 EXPORT_SPEC IXML_Node* ixmlNodeList_item

EXPORT_SPEC IXML_Node* ixmlNodeList_item

(IXML_NodeList* nList,
  unsigned long index )

Retrieves a Node from a NodeList specified by a numerical index.

Documentation

Retrieves a Node from a NodeList specified by a numerical index.

Parameters:
nList - The NodeList from which to retrieve the Node.
index - The index into the NodeList to retrieve.
Returns:
[Node*] A pointer to a Node or NULL if there was an error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlElement_setAttributeNS.html0000644000175000017500000000403411021325544023635 00000000000000 EXPORT_SPEC int ixmlElement_setAttributeNS

EXPORT_SPEC int ixmlElement_setAttributeNS

(IXML_Element* element,
  DOMString namespaceURI,
  DOMString qualifiedName,
  DOMString value )

Adds a new attribute to an Element using the local name and namespace URI.

Documentation

Adds a new attribute to an Element using the local name and namespace URI. If another attribute matches the same local name and namespace, the prefix is changed to be the prefix part of the qualifiedName and the value is changed to value.

Parameters:
element - The Element on which to set the attribute.
namespaceURI - The namespace URI of the new attribute.
qualifiedName - The qualified name of the attribute.
value - The new value for the attribute.
Returns:
[int] An integer representing one of the following:
  • IXML_SUCCESS: The operation completed successfully.
  • IXML_INVALID_PARAMETER: Either element, namespaceURI, qualifiedName, or value is NULL.
  • IXML_INVALID_CHARACTER_ERR: qualifiedName contains an invalid character.
  • IXML_NAMESPACE_ERR: Either the qualifiedName or namespaceURI is malformed. Refer to the DOM2-Core for possible reasons.
  • IXML_INSUFFICIENT_MEMORY: Not enough free memory exist to complete the operation.
  • IXML_FAILED: The operation could not be completed.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createCDATASection.html0000644000175000017500000000210711021325544024426 00000000000000 EXPORT_SPEC IXML_CDATASection* ixmlDocument_createCDATASection

EXPORT_SPEC IXML_CDATASection* ixmlDocument_createCDATASection

(IXML_Document* doc,
  DOMString data )

Creates a new CDATASection node with given data.

Documentation

Creates a new CDATASection node with given data.

Parameters:
doc - The owner Document of the new node.
data - The data to associate with the new CDATASection node.
Returns:
[CDATASection*] A pointer to the new CDATASection or NULL on failure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/InterfaceitNode.html0000644000175000017500000001327111021325544021420 00000000000000 Interface <I>Node</I>

Interface Node

The Node interface forms the primary datatype for all other DOM objects. Every other interface is derived from this interface, inheriting its functionality. For more information, refer to DOM2-Core page 34.

o ixmlNode_getNodeName
Returns the name of the Node, depending on what type of Node it is, in a read-only string.
o ixmlNode_getNodeValue
Returns the value of the Node as a string.
o ixmlNode_setNodeValue
Assigns a new value to a Node.
o ixmlNode_getNodeType
Retrieves the type of a Node.
o ixmlNode_getParentNode
Retrieves the parent Node for a Node.
o ixmlNode_getChildNodes
Retrieves the list of children of a Node in a NodeList structure.
o ixmlNode_getFirstChild
Retrieves the first child Node of a Node.
o ixmlNode_getLastChild
Retrieves the last child Node of a Node.
o ixmlNode_getPreviousSibling
Retrieves the sibling Node immediately preceding this Node.
o ixmlNode_getNextSibling
Retrieves the sibling Node immediately following this Node.
o ixmlNode_getAttributes
Retrieves the attributes of a Node, if it is an Element node, in a NamedNodeMap structure.
o ixmlNode_getOwnerDocument
Retrieves the document object associated with this Node.
o ixmlNode_getNamespaceURI
Retrieves the namespace URI for a Node as a DOMString.
o ixmlNode_getPrefix
Retrieves the namespace prefix, if present.
o ixmlNode_getLocalName
Retrieves the local name of a Node, if present.
o ixmlNode_insertBefore
Inserts a new child Node before the existing child Node.
o ixmlNode_replaceChild
Replaces an existing child Node with a new child Node in the list of children of a Node.
o ixmlNode_removeChild
Removes a child from the list of children of a Node.
o ixmlNode_appendChild
Appends a child Node to the list of children of a Node.
o ixmlNode_hasChildNodes
Queries whether or not a Node has children.
o ixmlNode_cloneNode
Clones a Node.
o ixmlNode_hasAttributes
Queries whether this Node has attributes.
o ixmlNode_free
Frees a Node and all Nodes in its subtree.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/ixmlDocument_createElement.html0000644000175000017500000000245011021325544023657 00000000000000 EXPORT_SPEC IXML_Element* ixmlDocument_createElement

EXPORT_SPEC IXML_Element* ixmlDocument_createElement

(IXML_Document* doc,
  const DOMString tagName )

Creates a new Element node with the given tag name.

Documentation

Creates a new Element node with the given tag name. The new Element node has a nodeName of tagName and the localName, prefix, and namespaceURI set to NULL. To create an Element with a namespace, see ixmlDocument_createElementNS.

Parameters:
doc - The owner Document of the new node.
tagName - The tag name of the new Element node.
Returns:
[Document*] A pointer to the new Element or NULL on failure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/ixml/InterfaceitDocument.html0000644000175000017500000001326711021325544022316 00000000000000 Interface <I>Document</I>

Interface Document

The Document interface represents the entire XML document. In essence, it is the root of the document tree and provides the primary interface to the elements of the document. For more information, refer to the Interface Document section in the DOM2Core.

o ixmlDocument_init
Initializes a Document node.
o ixmlDocument_createDocumentEx
Creates a new empty Document node.
o ixmlDocument_createDocument
Creates a new empty Document node.
o ixmlDocument_createElementEx
Creates a new Element node with the given tag name.
o ixmlDocument_createElement
Creates a new Element node with the given tag name.
o ixmlDocument_createTextNodeEx
Creates a new Text node with the given data.
o ixmlDocument_createTextNode
Creates a new Text node with the given data.
o ixmlDocument_createCDATASectionEx
Creates a new CDATASection node with given data.
o ixmlDocument_createCDATASection
Creates a new CDATASection node with given data.
o ixmlDocument_createAttribute
Creates a new Attr node with the given name.
o ixmlDocument_createAttributeEx
Creates a new Attr node with the given name.
o ixmlDocument_getElementsByTagName
Returns a NodeList of all Elements that match the given tag name in the order in which they were encountered in a preorder traversal of the Document tree.
o ixmlDocument_createElementNSEx
Creates a new Element node in the given qualified name and namespace URI.
o ixmlDocument_createElementNS
Creates a new Element node in the given qualified name and namespace URI.
o ixmlDocument_createAttributeNSEx
Creates a new Attr node with the given qualified name and namespace URI.
o ixmlDocument_createAttributeNS
Creates a new Attr node with the given qualified name and namespace URI.
o ixmlDocument_getElementsByTagNameNS
Returns a NodeList of Elements that match the given local name and namespace URI in the order they are encountered in a preorder traversal of the Document tree.
o ixmlDocument_getElementById
Returns the Element whose ID matches that given id.
o ixmlDocument_free
Frees a Document object and all Nodes associated with it.
o ixmlDocument_importNode
Imports a Node from another Document into this Document.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/0000777000175000017500000000000011373047474015575 500000000000000libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSendActionAsync.html0000644000175000017500000000541611021325544022260 00000000000000 EXPORT_SPEC int UpnpSendActionAsync

EXPORT_SPEC int UpnpSendActionAsync

( IN UpnpClient_Handle Hnd,
  IN const char* ActionURL,
  IN const char* ServiceType,
  IN const char* DevUDN,
  IN IXML_Document* Action,
  IN Upnp_FunPtr Fun,
  IN const void* Cookie )

UpnpSendActionAsync sends a message to change a state variable in a service, generating a callback when the operation is complete.

Documentation

UpnpSendActionAsync sends a message to change a state variable in a service, generating a callback when the operation is complete. See UpnpSendAction for comments on positive return values. These positive return values are sent in the event struct associated with the UPNP_CONTROL_ACTION_COMPLETE event.

Parameters:
Hnd - The handle of the control point sending the action.
ActionURL - The action URL of the service.
- ServiceType The type of the service.
- DevUDN This parameter is ignored and must be NULL.
Action - The DOM document for the action to perform on this device.
Fun - Pointer to a callback function to be invoked when the operation completes.
Cookie - Pointer to user data that to be passed to the callback when invoked.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: ActionUrl is an invalid URL.
  • UPNP_E_INVALID_DEVICE: DevUDN is an invalid device.
  • UPNP_E_INVALID_PARAM: Either Fun is not a valid callback function or ServiceType, Act, or ActionUrl is NULL.
  • UPNP_E_INVALID_ACTION: This action is not valid.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpGetErrorMessage.html0000644000175000017500000000212311021325544022261 00000000000000 EXPORT_SPEC const char* UpnpGetErrorMessage

EXPORT_SPEC const char* UpnpGetErrorMessage

( int errorcode )

UpnpGetErrorMessage converts an SDK error code into a string error message suitable for display.

Documentation

UpnpGetErrorMessage converts an SDK error code into a string error message suitable for display. The memory returned from this function should NOT be freed.

Parameters:
errorcode - The SDK error code to convert.
Returns:
[char*] An ASCII text string representation of the error message associated with the error code.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html0000644000175000017500000000120211021325544023000 00000000000000 UPNP_E_SUBSCRIBE_UNACCEPTED [-301]

UPNP_E_SUBSCRIBE_UNACCEPTED [-301]

UPNP_E_SUBSCRIBE_UNACCEPTED signifies that a subscription request was rejected from the remote side.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpAddToAction.html0000644000175000017500000000373111021325544021362 00000000000000 EXPORT_SPEC int UpnpAddToAction

EXPORT_SPEC int UpnpAddToAction

( IN OUT IXML_Document** ActionDoc,
  IN const char* ActionName,
  IN const char* ServType,
  IN const char* ArgName,
  IN const char* ArgVal )

UpnpAddToAction creates an action request packet based on its input parameters (status variable name and value pair).

Documentation

UpnpAddToAction creates an action request packet based on its input parameters (status variable name and value pair). This API is specially suitable inside a loop to add any number input parameters into an existing action. If no action document exists in the beginning then a Upnp_Document variable initialized with NULL should be passed as a parameter.

Parameters:
ActionDoc - A pointer to store the action document node.
- ActionName The action name.
ServType - The service type.
ArgName - The status variable name.
ArgVal - The status variable value.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: One or more of the parameters are invalid.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_OUTOF_MEMORY-104.html0000644000175000017500000000130311021325544021753 00000000000000 UPNP_E_OUTOF_MEMORY [-104]

UPNP_E_OUTOF_MEMORY [-104]

UPNP_E_OUTOF_MEMORY signifies that not enough resources are currently available to complete the operation. Most operations require some free memory in order to complete their work.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INVALID_SERVICE-111.html0000644000175000017500000000137411021325544022243 00000000000000 UPNP_E_INVALID_SERVICE [-111]

UPNP_E_INVALID_SERVICE [-111]

UPNP_E_INVALID_SERVICE is returned only by UpnpNotify, UpnpNotifyExt, UpnpAcceptSubscription, and UpnpAcceptSubscriptionExt to signify that the device ID/service ID pair does not refer to a valid service.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INIT-105.html0000644000175000017500000000131711021325543020537 00000000000000 UPNP_E_INIT [-105]

UPNP_E_INIT [-105]

UPNP_E_INIT signifies that the SDK has already been initialized. The SDK needs to be initialied only once per process. Any additional initialization attempts simply return this error with no other ill effects.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSendAdvertisement.html0000644000175000017500000000300611021325543022647 00000000000000 EXPORT_SPEC int UpnpSendAdvertisement

EXPORT_SPEC int UpnpSendAdvertisement

( IN UpnpDevice_Handle Hnd,
  IN int Exp )

UpnpSendAdvertisement sends out the discovery announcements for all devices and services for a device.

Documentation

UpnpSendAdvertisement sends out the discovery announcements for all devices and services for a device. Each announcement is made with the same expiration time.

UpnpSendAdvertisement is a synchronous call.

Parameters:
Hnd - The device handle for which to send out the announcements.
Exp - The expiration age, in seconds, of the announcements.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.
  • UPNP_E_OUTOF_MEMORY: There are insufficient resources to send future advertisements.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_State_Var_Request.html0000644000175000017500000000702711021325544022772 00000000000000 struct Upnp_State_Var_Request

struct Upnp_State_Var_Request

Represents the request for current value of a state variable in a service state table.

[more]struct in_addr CtrlPtIPAddr
IP address of sender requesting the state variable.
[more]DOMString CurrentVal
The current value of the variable.
[more]char DevUDN[NAME_SIZE]
The unique device ID.
[more]int ErrCode
The result of the operation.
[more]char ErrStr[LINE_SIZE]
The error string in case of error.
[more]char ServiceID[NAME_SIZE]
The service ID.
[more]int Socket
The socket number of the connection to the requestor.
[more]char StateVarName[NAME_SIZE]
The name of the variable.


Documentation

Represents the request for current value of a state variable in a service state table.
oint ErrCode
The result of the operation.

oint Socket
The socket number of the connection to the requestor.

ochar ErrStr[LINE_SIZE]
The error string in case of error.

ochar DevUDN[NAME_SIZE]
The unique device ID.

ochar ServiceID[NAME_SIZE]
The service ID.

ochar StateVarName[NAME_SIZE]
The name of the variable.

ostruct in_addr CtrlPtIPAddr
IP address of sender requesting the state variable.

oDOMString CurrentVal
The current value of the variable. This needs to be allocated by the caller. When finished with it, the SDK frees this DOMString.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/InitializationandRegistration.html0000644000175000017500000000630111021325543024426 00000000000000 Initialization and Registration

Initialization and Registration


o UpnpInit
Initializes the Linux SDK for UPnP Devices.
o UpnpFinish
Terminates the Linux SDK for UPnP Devices.
o UpnpGetServerPort
If '0' is used as the port number in UpnpInit, then this function can be used to retrieve the actual port allocated to the SDK.
o UpnpGetServerIpAddress
If NULL is used as the IP address in UpnpInit, then this function can be used to retrieve the actual interface address on which device is running.
o UpnpRegisterClient
UpnpRegisterClient registers a control point application with the SDK.
o UpnpRegisterRootDevice
UpnpRegisterRootDevice registers a device application with the SDK.
o UpnpRegisterRootDevice2
UpnpRegisterRootDevice2 is similar to UpnpRegisterRootDevice, except that it also allows the description document to be specified as a file or a memory buffer.
o UpnpUnRegisterClient
UpnpUnRegisterClient unregisters a control point application, unsubscribing all active subscriptions.
o UpnpUnRegisterRootDevice
Unregisters a root device registered with UpnpRegisterRootDevice or UpnpRegisterRootDevice2.
o UpnpSetContentLength
OBSOLETE METHOD : use UpnpSetMaxContentLength instead.
o UpnpSetMaxContentLength
Sets the maximum content-length that the SDK will process on an incoming SOAP requests or responses.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpNotify.html0000644000175000017500000000445611021325544020506 00000000000000 EXPORT_SPEC int UpnpNotify

EXPORT_SPEC int UpnpNotify

( IN UpnpDevice_Handle,
  IN const char* DevID,
  IN const char* ServID,
  IN const char** VarName,
  IN const char** NewVal,
  IN int cVariables )

UpnpNotify sends out an event change notification to all control points subscribed to a particular service.

Documentation

UpnpNotify sends out an event change notification to all control points subscribed to a particular service. This function is synchronous and generates no callbacks.

UpnpNotify may be called during a callback function to send out a notification.

Parameters:
- UpnpDevice_Handle The handle to the device sending the event.
DevID - The device ID of the subdevice of the service generating the event.
ServID - The unique identifier of the service generating the event.
VarName - Pointer to an array of variables that have changed.
NewVal - Pointer to an array of new values for those variables.
cVariables - The count of variables included in this notification.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.
  • UPNP_E_INVALID_SERVICE: The DevId/ServId pair refers to an invalid service.
  • UPNP_E_INVALID_PARAM: Either VarName, NewVal, DevID, or ServID is not a valid pointer or cVariables is less than zero.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSubscribe.html0000644000175000017500000000540211021325543021146 00000000000000 EXPORT_SPEC int UpnpSubscribe

EXPORT_SPEC int UpnpSubscribe

( IN UpnpClient_Handle Hnd,
  IN const char* PublisherUrl,
  INOUT int* TimeOut,
  OUT Upnp_SID SubsId )

UpnpSubscribe registers a control point to receive event notifications from another device.

Documentation

UpnpSubscribe registers a control point to receive event notifications from another device. This operation is synchronous.

Parameters:
Hnd - The handle of the control point.
- PublisherUrl The URL of the service to subscribe to.
- TimeOut Pointer to a variable containing the requested subscription time. Upon return, it contains the actual subscription time returned from the service.
SubsId - Pointer to a variable to receive the subscription ID (SID).
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: PublisherUrl is not a valid URL.
  • UPNP_E_INVALID_PARAM: Timeout is not a valid pointer or SubsId or PublisherUrl is NULL.
  • UPNP_E_NETWORK_ERROR: A network error occured.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting to PublisherUrl.
  • UPNP_E_OUTOF_SOCKET: An error occurred creating a socket.
  • UPNP_E_BAD_RESPONSE: An error occurred in response from the publisher.
  • UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused the subscription request.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpOpenHttpGetEx.html0000644000175000017500000000576511021325544021740 00000000000000 EXPORT_SPEC int UpnpOpenHttpGetEx

EXPORT_SPEC int UpnpOpenHttpGetEx

( IN const char* url,
  IN OUT void** handle,
  IN OUT char** contentType,
  IN OUT int* contentLength,
  IN OUT int* httpStatus,
  IN int lowRange,
  IN int highRange,
  IN int timeout )

UpnpOpenHttpGetEx gets specified number of bytes from a file specified in the URL.

Documentation

UpnpOpenHttpGetEx gets specified number of bytes from a file specified in the URL. The number of bytes is specified through a low count and a high count which are passed as a range of bytes for the request. The SDK allocates the memory for handle and contentType, the application is responsible for freeing this memory.

Parameters:
url - The URL of the item to get.
handle - A pointer to store the handle for this connection.
contentType - A buffer to store the media type of the item.
contentLength - A buffer to store the length of the item.
httpStatus - The status returned on receiving a response message from the remote server.
lowRange - An integer value representing the low end of a range to retrieve.
highRange - An integer value representing the high end of a range to retrieve.
timeout - A time out value sent with the request during which a response is expected from the server, failing which, an error is reported back to the user.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either url, handle, contentType, contentLength or httpStatus is not a valid pointer.
  • UPNP_E_INVALID_URL: The url is not a valid URL.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to download this file.
  • UPNP_E_NETWORK_ERROR: A network error occurred.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting a socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.
  • UPNP_E_BAD_RESPONSE: A bad response was received from the remote server.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpReadHttpGet.html0000644000175000017500000000366711021325543021413 00000000000000 EXPORT_SPEC int UpnpReadHttpGet

EXPORT_SPEC int UpnpReadHttpGet

( IN void* handle,
  IN OUT char* buf,
  IN OUT unsigned int* size,
  IN int timeout )

UpnpReadHttpGet gets specified number of bytes from a file specified in a URL.

Documentation

UpnpReadHttpGet gets specified number of bytes from a file specified in a URL.

Parameters:
handle - The token created by the call to UpnpOpenHttpGet.
buf - The buffer to store the read item.
size - The size of the buffer to be read.
timeout - The time out value sent with the request during which a response is expected from the server, failing which, an error is reported back to the user.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either handle, buf or size is not a valid pointer.
  • UPNP_E_BAD_RESPONSE: A bad response was received from the remote server.
  • UPNP_E_BAD_HTTPMSG: Either the request or response was in the incorrect format.
  • UPNP_E_CANCELED: another thread called UpnpCancelHttpGet.
Note: In case of return values, the status code parameter of the passed in handle value may provide additional information on the return value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_FINISH-116.html0000644000175000017500000000130611021325543020754 00000000000000 UPNP_E_FINISH [-116]

UPNP_E_FINISH [-116]

UPNP_E_FINISH signifies that UpnpInit has not been called, or that UpnpFinish has already been called. None of the API functions operate until UpnpInit successfully completes.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Eventing.html0000644000175000017500000000755111021325543020150 00000000000000 Eventing

Eventing


o UpnpAcceptSubscription
UpnpAcceptSubscription accepts a subscription request and sends out the current state of the eventable variables for a service.
o UpnpAcceptSubscriptionExt
UpnpAcceptSubscriptionExt is similar to UpnpAcceptSubscription except that it takes a DOM document for the variables to event rather than an array of strings.
o UpnpNotify
UpnpNotify sends out an event change notification to all control points subscribed to a particular service.
o UpnpNotifyExt
UpnpNotifyExt is similar to UpnpNotify except that it takes a DOM document for the event rather than an array of strings.
o UpnpRenewSubscription
UpnpRenewSubscription renews a subscription that is about to expire.
o UpnpRenewSubscriptionAsync
UpnpRenewSubscriptionAsync renews a subscription that is about to expire, generating a callback when the operation is complete.
o UpnpSetMaxSubscriptions
UpnpSetMaxSubscriptions sets the maximum number of subscriptions accepted per service.
o UpnpSetMaxSubscriptionTimeOut
UpnpSetMaxSubscriptionTimeOut sets the maximum time-out accepted for a subscription request or renewal.
o UpnpSubscribe
UpnpSubscribe registers a control point to receive event notifications from another device.
o UpnpSubscribeAsync
UpnpSubscribeAsync performs the same operation as UpnpSubscribe, but returns immediately and calls the registered callback function when the operation is complete.
o UpnpUnSubscribe
UpnpUnSubscribe removes the subscription of a control point from a service previously subscribed to using UpnpSubscribe or UpnpSubscribeAsync.
o UpnpUnSubscribeAsync
UpnpUnSubscribeAsync removes a subscription of a control point from a service previously subscribed to using UpnpSubscribe or UpnpSubscribeAsync, generating a callback when the operation is complete.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_Discovery.html0000644000175000017500000001074211021325544021337 00000000000000 struct Upnp_Discovery

struct Upnp_Discovery

Returned in a UPNP_DISCOVERY_RESULT callback.

[more]char Date[LINE_SIZE]
Date when the response was generated.
[more]SOCKADDRIN* DestAddr
The host address of the device responding to the search.
[more]char DeviceId[LINE_SIZE]
The unique device identifier.
[more]char DeviceType[LINE_SIZE]
The device type.
[more]int ErrCode
The result code of the UpnpSearchAsync call.
[more]int Expires
The expiration time of the advertisement.
[more]char Ext[LINE_SIZE]
Confirmation that the MAN header was understood by the device.
[more]char Location[LINE_SIZE]
The URL to the UPnP description document for the device.
[more]char Os[LINE_SIZE]
The operating system the device is running.
[more]char ServiceType[LINE_SIZE]
The service type.
[more]char ServiceVer[LINE_SIZE]
The service version.


Documentation

Returned in a UPNP_DISCOVERY_RESULT callback.
oint ErrCode
The result code of the UpnpSearchAsync call.

oint Expires
The expiration time of the advertisement.

ochar DeviceId[LINE_SIZE]
The unique device identifier.

ochar DeviceType[LINE_SIZE]
The device type.

ochar ServiceType[LINE_SIZE]
The service type.

ochar ServiceVer[LINE_SIZE]
The service version.

ochar Location[LINE_SIZE]
The URL to the UPnP description document for the device.

ochar Os[LINE_SIZE]
The operating system the device is running.

ochar Date[LINE_SIZE]
Date when the response was generated.

ochar Ext[LINE_SIZE]
Confirmation that the MAN header was understood by the device.

oSOCKADDRIN* DestAddr
The host address of the device responding to the search.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_ALIVE.html0000644000175000017500000000154011021325544023605 00000000000000 UPNP_DISCOVERY_ADVERTISEMENT_ALIVE

UPNP_DISCOVERY_ADVERTISEMENT_ALIVE

Received by a control point when a new device or service is available.

Documentation

Received by a control point when a new device or service is available. The Event parameter contains a pointer to a Upnp_Discovery structure with the information about the device or service.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpUnSubscribeAsync.html0000644000175000017500000000721611021325543022454 00000000000000 EXPORT_SPEC int UpnpUnSubscribeAsync

EXPORT_SPEC int UpnpUnSubscribeAsync

( IN UpnpClient_Handle Hnd,
  IN Upnp_SID SubsId,
  IN Upnp_FunPtr Fun,
  IN const void* Cookie )

UpnpUnSubscribeAsync removes a subscription of a control point from a service previously subscribed to using UpnpSubscribe or UpnpSubscribeAsync, generating a callback when the operation is complete.

Documentation

UpnpUnSubscribeAsync removes a subscription of a control point from a service previously subscribed to using UpnpSubscribe or UpnpSubscribeAsync, generating a callback when the operation is complete.

Note that many of the error codes for this function are returned in the Upnp_Event_Subscribe structure. In those cases, the function returns UPNP_E_SUCCESS and the appropriate error code will be in the Upnp_Event_Subscribe.ErrCode field in the Event structure passed to the callback.

Parameters:
Hnd - The handle of the subscribed control point.
SubsId - The ID returned when the control point subscribed to the service.
Fun - Pointer to a callback function to be called when the operation is complete.
Cookie - Pointer to user data to pass to the callback function when invoked.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_SID: The SubsId is not a valid SID.
  • UPNP_E_INVALID_PARAM: Fun is not a valid callback function pointer.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.
  • UPNP_E_NETWORK_ERROR: A network error occured (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_BIND: An error occurred binding the socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting to PublisherUrl (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_OUTOF_SOCKET: An error occurred creating a socket ( returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_BAD_RESPONSE: An error occurred in response from the publisher (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_UNSUBSCRIBE_UNACCEPTED: The publisher refused the subscription request (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_SOCKET_WRITE-201.html0000644000175000017500000000152611021325544021736 00000000000000 UPNP_E_SOCKET_WRITE [-201]

UPNP_E_SOCKET_WRITE [-201]

UPNP_E_SOCKET_WRITE signifies an error writing to a socket. This occurs in any function that makes network connections, such as discovery (e.g. UpnpSearchAsync or UpnpSendAdvertisement), control (e.g. UpnpSendAction), eventing (e.g. UpnpNotify), and HTTP functions (e.g. UpnpDownloadXmlDoc).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_OUTOF_SOCKET-205.html0000644000175000017500000000154611021325543021745 00000000000000 UPNP_E_OUTOF_SOCKET [-205]

UPNP_E_OUTOF_SOCKET [-205]

UPNP_E_OUTOF_SOCKET signifies that the SDK cannot create any more sockets. This occurs in any function that makes network connections, such as discovery (e.g. UpnpSearchAsync or UpnpSendAdvertisement), control (e.g. UpnpSendAction), eventing (e.g. UpnpNotify), and HTTP functions (e.g. UpnpDownloadXmlDoc).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNPREG_URL_DESC.html0000644000175000017500000000122511021325543021021 00000000000000 UPNPREG_URL_DESC

UPNPREG_URL_DESC

The description is the URL to the description document.

Documentation

The description is the URL to the description document.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_SOCKET_CONNECT-204.html0000644000175000017500000000156711021325543022144 00000000000000 UPNP_E_SOCKET_CONNECT [-204]

UPNP_E_SOCKET_CONNECT [-204]

UPNP_E_SOCKET_CONNECT signifies that the SDK had a problem connecting to a remote host. This occurs in any function that makes network connections, such as discovery (e.g. UpnpSearchAsync or UpnpSendAdvertisement), control (e.g. UpnpSendAction), eventing (e.g. UpnpNotify), and HTTP functions (e.g. UpnpDownloadXmlDoc).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpRemoveVirtualDir.html0000644000175000017500000000220011021325544022462 00000000000000 EXPORT_SPEC int UpnpRemoveVirtualDir

EXPORT_SPEC int UpnpRemoveVirtualDir

( IN const char* dirName )

UpnpRemoveVirtualDir removes a virtual directory mapping made with UpnpAddVirtualDir.

Documentation

UpnpRemoveVirtualDir removes a virtual directory mapping made with UpnpAddVirtualDir.

Parameters:
dirName - The name of the virtual directory mapping to remove.
Returns:
[int] An integer representing one of the following:
  • UPPN_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_ARGUMENT: dirName is not valid.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNPREG_FILENAME_DESC.html0000644000175000017500000000136511021325544021545 00000000000000 UPNPREG_FILENAME_DESC

UPNPREG_FILENAME_DESC

The description is a file name on the local file system containing the description of the device.

Documentation

The description is a file name on the local file system containing the description of the device.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSubscribeAsync.html0000644000175000017500000000773111021325544022154 00000000000000 EXPORT_SPEC int UpnpSubscribeAsync

EXPORT_SPEC int UpnpSubscribeAsync

( IN UpnpClient_Handle Hnd,
  IN const char* PublisherUrl,
  IN int TimeOut,
  IN Upnp_FunPtr Fun,
  IN const void* Cookie )

UpnpSubscribeAsync performs the same operation as UpnpSubscribe, but returns immediately and calls the registered callback function when the operation is complete.

Documentation

UpnpSubscribeAsync performs the same operation as UpnpSubscribe, but returns immediately and calls the registered callback function when the operation is complete.

Note that many of the error codes for this function are returned in the Upnp_Event_Subscribe structure. In those cases, the function returns UPNP_E_SUCCESS and the appropriate error code will be in the Upnp_Event_Subscribe.ErrCode field in the Event structure passed to the callback.

Parameters:
Hnd - The handle of the control point that is subscribing.
- PublisherUrl The URL of the service to subscribe to.
- TimeOut The requested subscription time. Upon return, it contains the actual subscription time returned from the service.
Fun - Pointer to the callback function for this subscribe request.
Cookie - A user data value passed to the callback function when invoked.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: The PublisherUrl is not a valid URL.
  • UPNP_E_INVALID_PARAM: Either TimeOut or Fun or PublisherUrl is not a valid pointer.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.
  • UPNP_E_NETWORK_ERROR: A network error occured (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_BIND: An error occurred binding the socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting to PublisherUrl (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_OUTOF_SOCKET: An error occurred creating the socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_BAD_RESPONSE: An error occurred in response from the publisher (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused the subscription request (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_EVENT_SUBSCRIBE_COMPLETE.html0000644000175000017500000000141011021325544022772 00000000000000 UPNP_EVENT_SUBSCRIBE_COMPLETE

UPNP_EVENT_SUBSCRIBE_COMPLETE

A UpnpSubscribeAsync call completed.

Documentation

A UpnpSubscribeAsync call completed. The status of the subscription is in the Event parameter as a Upnp_Event_Subscription structure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpDownloadXmlDoc.html0000644000175000017500000000403211021325543022101 00000000000000 EXPORT_SPEC int UpnpDownloadXmlDoc

EXPORT_SPEC int UpnpDownloadXmlDoc

( IN const char* url,
  OUT IXML_Document** xmlDoc )

UpnpDownloadXmlDoc downloads an XML document specified in a URL.

Documentation

UpnpDownloadXmlDoc downloads an XML document specified in a URL. The SDK parses the document and returns it in the form of a DOM document. The application is responsible for freeing the DOM document.

Parameters:
url - URL of the XML document.
xmlDoc - A pointer in which to store the XML document.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either url or xmlDoc is not a valid pointer.
  • UPNP_E_INVALID_DESC: The XML document was not found or it does not contain a valid XML description.
  • UPNP_E_INVALID_URL: The url is not a valid URL.
  • UPNP_E_OUTOF_MEMORY: There are insufficient resources to download the XML document.
  • UPNP_E_NETWORK_ERROR: A network error occurred.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting the socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INVALID_DESC-107.html0000644000175000017500000000127011021325544021661 00000000000000 UPNP_E_INVALID_DESC [-107]

UPNP_E_INVALID_DESC [-107]

UPNP_E_INVALID_DESC signifies that the description document passed to UpnpRegisterRootDevice or UpnpRegisterRootDevice2 is an invalid description document.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INIT_FAILED-117.html0000644000175000017500000000121611021325544021545 00000000000000 UPNP_E_INIT_FAILED [-117]

UPNP_E_INIT_FAILED [-117]

UPNP_E_INIT_FAILED signifies that UpnpInit cannot complete. The typical reason is failure to allocate sufficient resources.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_CONTROL_GET_VAR_REQUEST.html0000644000175000017500000000153411021325543022765 00000000000000 UPNP_CONTROL_GET_VAR_REQUEST

UPNP_CONTROL_GET_VAR_REQUEST

Received by a device when a query for a single service variable arrives.

Documentation

Received by a device when a query for a single service variable arrives. The Event parameter contains a pointer to a Upnp_State_Var_Request structure containing the name of the variable and value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html0000644000175000017500000000120311021325544022472 00000000000000 UPNP_E_NOTIFY_UNACCEPTED [-303]

UPNP_E_NOTIFY_UNACCEPTED [-303]

UPNP_E_NOTIFY_UNACCEPTED signifies that the remote host did not accept the notify sent from the local device.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_SID44.html0000644000175000017500000000154511021325544020160 00000000000000 typedef char Upnp_SID[44]

typedef char Upnp_SID[44]

The Upnp_SID holds the subscription identifier for a subscription between a client and a device.

Documentation

The Upnp_SID holds the subscription identifier for a subscription between a client and a device. The SID is a string representation of a globally unique id (GUID) and should not be modified.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpInit.html0000644000175000017500000000431711021325543020134 00000000000000 EXPORT_SPEC int UpnpInit

EXPORT_SPEC int UpnpInit

( IN const char* HostIP,
  IN unsigned short DestPort )

Initializes the Linux SDK for UPnP Devices.

Documentation

Initializes the Linux SDK for UPnP Devices. This function must be called before any other API function can be called. It should be called only once. Subsequent calls to this API return a UPNP_E_INIT error code.

Optionally, the application can specify a host IP address (in the case of a multi-homed configuration) and a port number to use for all UPnP operations. Since a port number can be used only by one process, multiple processes using the SDK must specify different port numbers.

If unspecified, the SDK will use the first adapter's IP address and an arbitrary port.

This call is synchronous.

Parameters:
HostIP - The host IP address to use, in string format, for example "192.168.0.1", or NULL to use the first adapter's IP address.
DestPort - The destination port number to use. 0 will pick an arbitrary free port.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to initialize the SDK.
  • UPNP_E_INIT: The SDK is already initialized.
  • UPNP_E_INIT_FAILED: The SDK initialization failed for an unknown reason.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_LISTEN: An error occurred listening to a socket.
  • UPNP_E_OUTOF_SOCKET: An error ocurred creating a socket.
  • UPNP_E_INTERNAL_ERROR: An internal error ocurred.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_S_ALL.html0000644000175000017500000000120111021325544020110 00000000000000 UPNP_S_ALL

UPNP_S_ALL

Search for all devices and services on the network.

Documentation

Search for all devices and services on the network.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_SOCKET_READ-202.html0000644000175000017500000000152511021325544021557 00000000000000 UPNP_E_SOCKET_READ [-202]

UPNP_E_SOCKET_READ [-202]

UPNP_E_SOCKET_READ signifies an error reading from a socket. This occurs in any function that makes network connections, such as discovery (e.g. UpnpSearchAsync or UpnpSendAdvertisement), control (e.g. UpnpSendAction), eventing (e.g. UpnpNotify), and HTTP functions (e.g. UpnpDownloadXmlDoc).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSendAction.html0000644000175000017500000000515611021325544021263 00000000000000 EXPORT_SPEC int UpnpSendAction

EXPORT_SPEC int UpnpSendAction

( IN UpnpClient_Handle Hnd,
  IN const char* ActionURL,
  IN const char* ServiceType,
  IN const char* DevUDN,
  IN IXML_Document* Action,
  OUT IXML_Document** RespNode )

UpnpSendAction sends a message to change a state variable in a service.

Documentation

UpnpSendAction sends a message to change a state variable in a service. This is a synchronous call that does not return until the action is complete.

Note that a positive return value indicates a SOAP-protocol error code. In this case, the error description can be retrieved from RespNode. A negative return value indicates an SDK error.

Parameters:
Hnd - The handle of the control point sending the action.
ActionURL - The action URL of the service.
- ServiceType The type of the service.
- DevUDN This parameter is ignored and must be NULL.
Action - The DOM document for the action.
RespNode - The DOM document for the response to the action. The SDK allocates this document and the caller needs to free it.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: ActionUrl is not a valid URL.
  • UPNP_E_INVALID_ACTION: This action is not valid.
  • UPNP_E_INVALID_DEVICE: DevUDN is not a valid device.
  • UPNP_E_INVALID_PARAM: ServiceType, Action, ActionUrl, or RespNode is not a valid pointer.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSetMaxContentLength.html0000644000175000017500000000255311021325543023127 00000000000000 EXPORT_SPEC int UpnpSetMaxContentLength

EXPORT_SPEC int UpnpSetMaxContentLength

( IN size_t contentLength )

Sets the maximum content-length that the SDK will process on an incoming SOAP requests or responses.

Documentation

Sets the maximum content-length that the SDK will process on an incoming SOAP requests or responses. This API allows devices that have memory constraints to exhibit consistent behaviour if the size of the incoming SOAP message exceeds the memory that device can allocate. The default maximum content-length is DEFAULT_SOAP_CONTENT_LENGTH = 16K bytes.

Parameters:
contentLength - The maximum permissible content length for incoming SOAP actions, in bytes.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Control.html0000644000175000017500000000403011021325544017777 00000000000000 Control

Control


o UpnpGetServiceVarStatus
UpnpGetServiceVarStatus queries the state of a state variable of a service on another device.
o UpnpGetServiceVarStatusAsync
UpnpGetServiceVarStatusAsync queries the state of a variable of a service, generating a callback when the operation is complete.
o UpnpSendAction
UpnpSendAction sends a message to change a state variable in a service.
o UpnpSendActionEx
UpnpSendActionEx sends a message to change a state variable in a service.
o UpnpSendActionAsync
UpnpSendActionAsync sends a message to change a state variable in a service, generating a callback when the operation is complete.
o UpnpSendActionExAsync
UpnpSendActionExAsync sends a message to change a state variable in a service, generating a callback when the operation is complete.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpGetServerPort.html0000644000175000017500000000205511021325543022001 00000000000000 EXPORT_SPEC unsigned short UpnpGetServerPort

EXPORT_SPEC unsigned short UpnpGetServerPort

(void)

If '0' is used as the port number in UpnpInit, then this function can be used to retrieve the actual port allocated to the SDK.

Documentation

If '0' is used as the port number in UpnpInit, then this function can be used to retrieve the actual port allocated to the SDK. If UpnpInit has not succeeded then 0 is returned.

Returns:
[unsigned short] The port on which an internal server is listening for UPnP related requests.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_DISCOVERY_SEARCH_RESULT.html0000644000175000017500000000154411021325544022722 00000000000000 UPNP_DISCOVERY_SEARCH_RESULT

UPNP_DISCOVERY_SEARCH_RESULT

Received by a control point when a matching device or service responds.

Documentation

Received by a control point when a matching device or service responds. The Event parameter contains a pointer to a Upnp_Discovery structure containing the information about the reply to the search request.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpDownloadUrlItem.html0000644000175000017500000000420511021325543022276 00000000000000 EXPORT_SPEC int UpnpDownloadUrlItem

EXPORT_SPEC int UpnpDownloadUrlItem

( IN const char* url,
  OUT char** outBuf,
  OUT char* contentType )

UpnpDownloadUrlItem downloads a file specified in a URL.

Documentation

UpnpDownloadUrlItem downloads a file specified in a URL. The SDK allocates the memory for outBuf and the application is responsible for freeing this memory. Note that the item is passed as a single buffer. Large items should not be transferred using this function.

Parameters:
url - URL of an item to download.
outBuf - Buffer to store the downloaded item.
contentType - HTTP header value content type if present. It should be at least LINE_SIZE bytes in size.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either url, outBuf or contentType is not a valid pointer.
  • UPNP_E_INVALID_URL: The url is not a valid URL.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to download this file.
  • UPNP_E_NETWORK_ERROR: A network error occurred.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting a socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpOpenHttpGetProxy.html0000644000175000017500000000530311021325543022470 00000000000000 EXPORT_SPEC int UpnpOpenHttpGetProxy

EXPORT_SPEC int UpnpOpenHttpGetProxy

( IN const char* url,
  IN const char* proxy_str,
  IN OUT void** handle,
  IN OUT char** contentType,
  IN OUT int* contentLength,
  IN OUT int* httpStatus,
  IN int timeout )

UpnpOpenHttpGetProxy gets a file specified in a URL through the specified proxy.

Documentation

UpnpOpenHttpGetProxy gets a file specified in a URL through the specified proxy. The SDK allocates the memory for handle and contentType, the application is responsible for freeing this memory.

Parameters:
url - The URL of an item to get.
proxy_str - The URL of the proxy.
handle - A pointer to store the handle for this connection.
contentType - A buffer to store the media type of the item.
contentLength - A pointer to store the length of the item.
httpStatus - The status returned on receiving a response message.
timeout - The time out value sent with the request during which a response is expected from the server, failing which, an error is reported back to the user.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either url, handle, contentType, contentLength or httpStatus is not a valid pointer.
  • UPNP_E_INVALID_URL: The url is not a valid URL.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to download this file.
  • UPNP_E_NETWORK_ERROR: A network error occurred.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting a socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.
  • UPNP_E_BAD_RESPONSE: A bad response was received from the remote server.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_FunPtr.html0000644000175000017500000000346111021325543020605 00000000000000 typedef int (*Upnp_FunPtr)

typedef int (*Upnp_FunPtr)

( IN Upnp_EventType EventType,
  IN void* Event, IN void* Cookie )

All callback functions share the same prototype, documented below.

Documentation

All callback functions share the same prototype, documented below. Note that any memory passed to the callback function is valid only during the callback and should be copied if it needs to persist. This callback function needs to be thread safe. The context of the callback is always on a valid thread context and standard synchronization methods can be used. Note, however, because of this the callback cannot call SDK functions unless explicitly noted.

      int CallbackFxn( Upnp_EventType EventType, void* Event, void* Cookie );
    

where EventType is the event that triggered the callback, Event is a structure that denotes event-specific information for that event, and Cookie is the user data passed when the callback was registered.

See Upnp_EventType for more information on the callback values and the associated Event parameter.

The return value of the callback is currently ignored. It may be used in the future to communicate results back to the SDK.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_SUCCESS0.html0000644000175000017500000000143311021325543020660 00000000000000 UPNP_E_SUCCESS [0]

UPNP_E_SUCCESS [0]

UPNP_E_SUCCESS signifies that the operation completed successfully. For asynchronous functions, this only means that the packet generated by the operation was successfully transmitted on the network. The result of the entire operation comes as part of the callback for that operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INTERNAL_ERROR-911.html0000644000175000017500000000117111021325544022165 00000000000000 UPNP_E_INTERNAL_ERROR [-911]

UPNP_E_INTERNAL_ERROR [-911]

UPNP_E_INTERNAL_ERROR is the generic error code for internal conditions not covered by other error codes.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE.html0000644000175000017500000000153211021325543023724 00000000000000 UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE

UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE

Received by a control point when a device or service shuts down.

Documentation

Received by a control point when a device or service shuts down. The Event parameter contains a pointer to a Upnp_Discovery structure containing the information about the device or service.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_SOCKET_ERROR-208.html0000644000175000017500000000127711021325544021747 00000000000000 UPNP_E_SOCKET_ERROR [-208]

UPNP_E_SOCKET_ERROR [-208]

UPNP_E_SOCKET_ERROR is the generic socket error code for conditions not covered by other error codes. This error can be returned by any function that performs network operations.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INVALID_URL-108.html0000644000175000017500000000136711021325544021615 00000000000000 UPNP_E_INVALID_URL [-108]

UPNP_E_INVALID_URL [-108]

UPNP_E_INVALID_URL signifies that a URL passed into the function is invalid. The actual cause is function specific, but in general, the URL itself might be malformed (e.g. have invalid characters in it) or the host might be unreachable.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_EVENT_SUBSCRIPTION_REQUEST.html0000644000175000017500000000212211021325544023316 00000000000000 UPNP_EVENT_SUBSCRIPTION_REQUEST

UPNP_EVENT_SUBSCRIPTION_REQUEST

Received by a device when a subscription arrives.

Documentation

Received by a device when a subscription arrives. The Event parameter contains a pointer to a Upnp_Subscription_Request structure. At this point, the subscription has already been accepted. UpnpAcceptSubscription needs to be called to confirm the subscription and transmit the initial state table. This can be done during this callback. The SDK generates no events for a subscription unless the device application calls UpnpAcceptSubscription.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_NOT_FOUND-507.html0000644000175000017500000000116311021325543021374 00000000000000 UPNP_E_NOT_FOUND [-507]

UPNP_E_NOT_FOUND [-507]

UPNP_E_NOT_FOUND signifies that the response to a SOAP request did not contain the required XML constructs.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/index.html0000644000175000017500000000244611021325544017477 00000000000000 Linux SDK for UPnP Devices v1.4

Linux SDK for UPnP Devices v1.4

Linux SDK for UPnP Devices Version 1.4

Copyright (C) 2000-2003 Intel Corporation ALL RIGHTS RESERVED

Revision 1.4.1 (Tue 04 Jul 2006 04:58:36 PM EEST)


o Introduction
o License
o About Callbacks
o The API
o Optional Tool APIs

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/ConstantsStructuresandTypes.html0000644000175000017500000000756611021325543024167 00000000000000 Constants, Structures, and Types

Constants, Structures, and Types


o UpnpClient_Handle
Returned when a control point application registers with UpnpRegisterClient.
o UpnpDevice_Handle
Returned when a device application registers with UpnpRegisterRootDevice or UpnpRegisterRootDevice2.
o UPnP_EventType
The reason code for an event callback.
o Upnp_SID[44]
The Upnp_SID holds the subscription identifier for a subscription between a client and a device.
o Upnp_SType
Represents the different types of searches that can be performed using the SDK for UPnP Devices API.
o Upnp_DescType
Specifies the type of description in UpnpRegisterRootDevice2.
o Upnp_Action_Request
Returned as part of a UPNP_CONTROL_ACTION_COMPLETE callback.
o Upnp_State_Var_Request
Represents the request for current value of a state variable in a service state table.
o Upnp_State_Var_Complete
Represents the reply for the current value of a state variable in an asynchronous call.
o Upnp_Event
Returned along with a UPNP_EVENT_RECEIVED callback.
o Upnp_Discovery
Returned in a UPNP_DISCOVERY_RESULT callback.
o Upnp_Event_Subscribe
Returned along with a UPNP_EVENT_SUBSCRIBE_COMPLETE or UPNP_EVENT_UNSUBSCRIBE_COMPLETE callback.
o Upnp_Subscription_Request
Returned along with a UPNP_EVENT_SUBSCRIPTION_REQUEST callback.
o UpnpVirtualDirCallbacks
The UpnpVirtualDirCallbacks structure contains the pointers to file-related callback functions a device application can register to virtualize URLs.
o (*Upnp_FunPtr)
All callback functions share the same prototype, documented below.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSendActionExAsync.html0000644000175000017500000000566311021325543022560 00000000000000 EXPORT_SPEC int UpnpSendActionExAsync

EXPORT_SPEC int UpnpSendActionExAsync

( IN UpnpClient_Handle Hnd,
  IN const char* ActionURL,
  IN const char* ServiceType,
  IN const char* DevUDN,
  IN IXML_Document* Header,
  IN IXML_Document* Action,
  IN Upnp_FunPtr Fun,
  IN const void* Cookie )

UpnpSendActionExAsync sends a message to change a state variable in a service, generating a callback when the operation is complete.

Documentation

UpnpSendActionExAsync sends a message to change a state variable in a service, generating a callback when the operation is complete. See UpnpSendAction for comments on positive return values. These positive return values are sent in the event struct associated with the UPNP_CONTROL_ACTION_COMPLETE event.

Parameters:
Hnd - The handle of the control point sending the action.
ActionURL - The action URL of the service.
- ServiceType The type of the service.
- DevUDN This parameter is ignored and must be NULL.
Header - The DOM document for the SOAP header. This may be NULL if the header is not required.
Action - The DOM document for the action to perform on this device.
Fun - Pointer to a callback function to be invoked when the operation completes.
Cookie - Pointer to user data that to be passed to the callback when invoked.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: ActionUrl is an invalid URL.
  • UPNP_E_INVALID_DEVICE: DevUDN is an invalid device.
  • UPNP_E_INVALID_PARAM: Either Fun is not a valid callback function or ServiceType, Act, or ActionUrl is NULL.
  • UPNP_E_INVALID_ACTION: This action is not valid.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_S_DEVICE.html0000644000175000017500000000125111021325544020444 00000000000000 UPNP_S_DEVICE

UPNP_S_DEVICE

Search for a particular device type or a particular device instance.

Documentation

Search for a particular device type or a particular device instance.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpMakeActionResponse.html0000644000175000017500000000316511021325543022763 00000000000000 EXPORT_SPEC IXML_Document* UpnpMakeActionResponse

EXPORT_SPEC IXML_Document* UpnpMakeActionResponse

( IN const char* ActionName,
  IN const char* ServType,
  IN int NumArg,
  IN const char* Arg,
  IN ... )

UpnpMakeActionResponse creates an action response packet based on its output parameters (status variable name and value pair).

Documentation

UpnpMakeActionResponse creates an action response packet based on its output parameters (status variable name and value pair). Any number of input parameters can be passed to this function but every output variable name should have a matching value argument.

Parameters:
- ActionName The action name.
ServType - The service type.
NumArg - The number of argument pairs passed.
Arg - The status variable name and value pair.
Returns:
[IXML_Document*] The action node of Upnp_Document type or NULL if the operation failed.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpResolveURL.html0000644000175000017500000000314311021325543021227 00000000000000 EXPORT_SPEC int UpnpResolveURL

EXPORT_SPEC int UpnpResolveURL

( IN const char* BaseURL,
  IN const char* RelURL,
  OUT char* AbsURL )

UpnpResolveURL combines a base URL and a relative URL into a single absolute URL.

Documentation

UpnpResolveURL combines a base URL and a relative URL into a single absolute URL. The memory for AbsURL needs to be allocated by the caller and must be large enough to hold the BaseURL and RelURL combined.

Parameters:
BaseURL - The base URL to combine.
RelURL - The relative URL to BaseURL.
AbsURL - A pointer to a buffer to store the absolute URL.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: RelURL is NULL.
  • UPNP_E_INVALID_URL: The BaseURL / RelURL combination does not form a valid URL.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpAddToActionResponse.html0000644000175000017500000000403311021325544023075 00000000000000 EXPORT_SPEC int UpnpAddToActionResponse

EXPORT_SPEC int UpnpAddToActionResponse

( IN OUT IXML_Document** ActionResponse,
  IN const char* ActionName,
  IN const char* ServType,
  IN const char* ArgName,
  IN const char* ArgVal )

UpnpAddToActionResponse creates an action response packet based on its output parameters (status variable name and value pair).

Documentation

UpnpAddToActionResponse creates an action response packet based on its output parameters (status variable name and value pair). This API is especially suitable inside a loop to add any number of input parameters into an existing action response. If no action document exists in the beginning, a Upnp_Document variable initialized with NULL should be passed as a parameter.

Parameters:
ActionResponse - Pointer to a document to store the action document node.
- ActionName The action name.
ServType - The service type.
ArgName - The status variable name.
ArgVal - The status variable value.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: One or more of the parameters are invalid.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpRenewSubscription.html0000644000175000017500000000472111021325543022715 00000000000000 EXPORT_SPEC int UpnpRenewSubscription

EXPORT_SPEC int UpnpRenewSubscription

( IN UpnpClient_Handle Hnd,
  INOUT int* TimeOut,
  IN Upnp_SID SubsId )

UpnpRenewSubscription renews a subscription that is about to expire.

Documentation

UpnpRenewSubscription renews a subscription that is about to expire. This function is synchronous.

Parameters:
Hnd - The handle of the control point that is renewing the subscription.
- TimeOut Pointer to a variable containing the requested subscription time. Upon return, it contains the actual renewal time.
SubsId - The ID for the subscription to renew.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_PARAM: Timeout is not a valid pointer.
  • UPNP_E_INVALID_SID: The SID being passed to this function is not a valid subscription ID.
  • UPNP_E_NETWORK_ERROR: A network error occured.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting to PublisherUrl.
  • UPNP_E_OUTOF_SOCKET: An error occurred creating a socket.
  • UPNP_E_BAD_RESPONSE: An error occurred in response from the publisher.
  • UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused the subscription renew.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/OptionalToolAPIs.html0000644000175000017500000000546411021325543021532 00000000000000 Optional Tool APIs

Optional Tool APIs

The Linux SDK for UPnP Devices contains some additional, optional utility APIs that can be helpful in writing applications using the SDK. These additional APIs can be compiled out in order to save code size in the SDK. Refer to the README for details.

o UpnpResolveURL
UpnpResolveURL combines a base URL and a relative URL into a single absolute URL.
o UpnpMakeAction
UpnpMakeAction creates an action request packet based on its input parameters (status variable name and value pair).
o UpnpAddToAction
UpnpAddToAction creates an action request packet based on its input parameters (status variable name and value pair).
o UpnpMakeActionResponse
UpnpMakeActionResponse creates an action response packet based on its output parameters (status variable name and value pair).
o UpnpAddToActionResponse
UpnpAddToActionResponse creates an action response packet based on its output parameters (status variable name and value pair).
o UpnpAddToPropertySet
UpnpAddToPropertySet can be used when an application needs to transfer the status of many variables at once.
o UpnpCreatePropertySet
UpnpCreatePropertySet creates a property set message packet.
o UpnpGetErrorMessage
UpnpGetErrorMessage converts an SDK error code into a string error message suitable for display.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_S_SERVICE.html0000644000175000017500000000134011021325544020604 00000000000000 UPNP_S_SERVICE

UPNP_S_SERVICE

Search for a particular service type, possibly on a particular device type or device instance.

Documentation

Search for a particular service type, possibly on a particular device type or device instance.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpCreatePropertySet.html0000644000175000017500000000230411021325543022647 00000000000000 EXPORT_SPEC IXML_Document* UpnpCreatePropertySet

EXPORT_SPEC IXML_Document* UpnpCreatePropertySet

( IN int NumArg,
  IN const char* Arg,
  IN ... )

UpnpCreatePropertySet creates a property set message packet.

Documentation

UpnpCreatePropertySet creates a property set message packet. Any number of input parameters can be passed to this function but every input variable name should have a matching value input argument.

Parameters:
NumArg - The number of argument pairs passed.
Arg - The status variable name and value pair.
Returns:
[IXML_Document*] NULL on failure, or the property-set document node.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSetVirtualDirCallbacks.html0000644000175000017500000000254211021325543023570 00000000000000 EXPORT_SPEC int UpnpSetVirtualDirCallbacks

EXPORT_SPEC int UpnpSetVirtualDirCallbacks

( IN struct UpnpVirtualDirCallbacks* callbacks )

UpnpSetVirtualDirCallbacks sets the callback function to be used to access a virtual directory.

Documentation

UpnpSetVirtualDirCallbacks sets the callback function to be used to access a virtual directory. Refer to the description of UpnpVirtualDirCallbacks for a description of the functions.

Parameters:
callbacks - Pointer to a structure containing points to the virtual interface functions.
Returns:
[int] An integer representing one of the following:
  • UPPN_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_ARGUMENT: callbacks is not a valid pointer.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_SOCKET_BIND-203.html0000644000175000017500000000157211021325544021563 00000000000000 UPNP_E_SOCKET_BIND [-203]

UPNP_E_SOCKET_BIND [-203]

UPNP_E_SOCKET_BIND signifies that the SDK had a problem binding a socket to a network interface. This occurs in any function that makes network connections, such as discovery (e.g. UpnpSearchAsync or UpnpSendAdvertisement), control (e.g. UpnpSendAction), eventing (e.g. UpnpNotify), and HTTP functions (e.g. UpnpDownloadXmlDoc).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPnP_EventType.html0000644000175000017500000001032311021325544021206 00000000000000 enum UPnP_EventType

enum UPnP_EventType

The reason code for an event callback.
The Event parameter will be different depending on the reason for the callback. The descriptions for each event type describe the contents of the Event parameter.

o UPNP_CONTROL_ACTION_REQUEST
Received by a device when a control point issues a control request.
o UPNP_CONTROL_ACTION_COMPLETE
A UpnpSendActionAsync call completed.
o UPNP_CONTROL_GET_VAR_REQUEST
Received by a device when a query for a single service variable arrives.
o UPNP_CONTROL_GET_VAR_COMPLETE
A UpnpGetServiceVarStatus call completed.
o UPNP_DISCOVERY_ADVERTISEMENT_ALIVE
Received by a control point when a new device or service is available.
o UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE
Received by a control point when a device or service shuts down.
o UPNP_DISCOVERY_SEARCH_RESULT
Received by a control point when a matching device or service responds.
o UPNP_DISCOVERY_SEARCH_TIMEOUT
Received by a control point when the search timeout expires.
o UPNP_EVENT_SUBSCRIPTION_REQUEST
Received by a device when a subscription arrives.
o UPNP_EVENT_RECEIVED
Received by a control point when an event arrives.
o UPNP_EVENT_RENEWAL_COMPLETE
A UpnpRenewSubscriptionAsync call completed.
o UPNP_EVENT_SUBSCRIBE_COMPLETE
A UpnpSubscribeAsync call completed.
o UPNP_EVENT_UNSUBSCRIBE_COMPLETE
A UpnpUnSubscribeAsync call completed.
o UPNP_EVENT_AUTORENEWAL_FAILED
The auto-renewal of a client subscription failed.
o UPNP_EVENT_SUBSCRIPTION_EXPIRED
A client subscription has expired.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_BAD_HTTPMSG-119.html0000644000175000017500000000165711021325544021605 00000000000000 UPNP_E_BAD_HTTPMSG [-119]

UPNP_E_BAD_HTTPMSG [-119]

UPNP_E_BAD_HTTPMSG signifies that the HTTP message contains invalid message headers. The error always refers to the HTTP message header received from the remote host. The main areas where this occurs are in SOAP control messages (e.g. UpnpSendAction), GENA subscription message (e.g. UpnpSubscribe), GENA event notifications (e.g. UpnpNotify), and HTTP transfers (e.g. UpnpDownloadXmlDoc).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpOpenHttpGet.html0000644000175000017500000000504211021325543021426 00000000000000 EXPORT_SPEC int UpnpOpenHttpGet

EXPORT_SPEC int UpnpOpenHttpGet

( IN const char* url,
  IN OUT void** handle,
  IN OUT char** contentType,
  IN OUT int* contentLength,
  IN OUT int* httpStatus,
  IN int timeout )

UpnpOpenHttpGet gets a file specified in a URL.

Documentation

UpnpOpenHttpGet gets a file specified in a URL. The SDK allocates the memory for handle and contentType, the application is responsible for freeing this memory.

Parameters:
url - The URL of an item to get.
handle - A pointer to store the handle for this connection.
contentType - A buffer to store the media type of the item.
contentLength - A pointer to store the length of the item.
httpStatus - The status returned on receiving a response message.
timeout - The time out value sent with the request during which a response is expected from the server, failing which, an error is reported back to the user.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either url, handle, contentType, contentLength or httpStatus is not a valid pointer.
  • UPNP_E_INVALID_URL: The url is not a valid URL.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to download this file.
  • UPNP_E_NETWORK_ERROR: A network error occurred.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting a socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.
  • UPNP_E_BAD_RESPONSE: A bad response was received from the remote server.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_Event_Subscribe.html0000644000175000017500000000462711021325543022456 00000000000000 struct Upnp_Event_Subscribe

struct Upnp_Event_Subscribe

Returned along with a UPNP_EVENT_SUBSCRIBE_COMPLETE or UPNP_EVENT_UNSUBSCRIBE_COMPLETE callback.

[more]int ErrCode
The result of the operation.
[more]char PublisherUrl[NAME_SIZE]
The event URL being subscribed to or removed from.
[more]Upnp_SID Sid
The SID for this subscription.
[more]int TimeOut
The actual subscription time (for subscriptions only).


Documentation

Returned along with a UPNP_EVENT_SUBSCRIBE_COMPLETE or UPNP_EVENT_UNSUBSCRIBE_COMPLETE callback.
oUpnp_SID Sid
The SID for this subscription. For subscriptions, this only contains a valid SID if the Upnp_EventSubscribe.result field contains a UPNP_E_SUCCESS result code. For unsubscriptions, this contains the SID from which the subscription is being unsubscribed.

oint ErrCode
The result of the operation.

ochar PublisherUrl[NAME_SIZE]
The event URL being subscribed to or removed from.

oint TimeOut
The actual subscription time (for subscriptions only).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_EVENT_UNSUBSCRIBE_COMPLETE.html0000644000175000017500000000141511021325543023241 00000000000000 UPNP_EVENT_UNSUBSCRIBE_COMPLETE

UPNP_EVENT_UNSUBSCRIBE_COMPLETE

A UpnpUnSubscribeAsync call completed.

Documentation

A UpnpUnSubscribeAsync call completed. The status of the subscription is in the Event parameter as a Upnp_Event_Subscribe structure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_FILE_NOT_FOUND-502.html0000644000175000017500000000123111021325543022162 00000000000000 UPNP_E_FILE_NOT_FOUND [-502]

UPNP_E_FILE_NOT_FOUND [-502]

UPNP_E_FILE_NOT_FOUND signifies that the filename passed to one of the device registration functions was not found or was not accessible.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNPREG_BUF_DESC.html0000644000175000017500000000133511021325543020775 00000000000000 UPNPREG_BUF_DESC

UPNPREG_BUF_DESC

The description is a pointer to a character array containing the XML description document.

Documentation

The description is a pointer to a character array containing the XML description document.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpAddVirtualDir.html0000644000175000017500000000233611021325544021727 00000000000000 EXPORT_SPEC int UpnpAddVirtualDir

EXPORT_SPEC int UpnpAddVirtualDir

( IN const char* dirName )

UpnpAddVirtualDir adds a virtual directory mapping.

Documentation

UpnpAddVirtualDir adds a virtual directory mapping.

All webserver requests containing the given directory are read using functions contained in a UpnpVirtualDirCallbacks structure registered via UpnpSetVirtualDirCallbacks.

Parameters:
dirName - The name of the new directory mapping to add.
Returns:
[int] An integer representing one of the following:
  • UPPN_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_ARGUMENT: dirName is not valid.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/TheAPI.html0000644000175000017500000000276511021325544017446 00000000000000 The API

The API


o Error codes
o Constants, Structures, and Types
o Initialization and Registration
o Discovery
o Control
o Eventing
o Control Point HTTP API
o Web Server API

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSearchAsync.html0000644000175000017500000000442011021325544021430 00000000000000 EXPORT_SPEC int UpnpSearchAsync

EXPORT_SPEC int UpnpSearchAsync

( IN UpnpClient_Handle Hnd,
  IN int Mx,
  IN const char* Target,
  IN const void* Cookie )

UpnpSearchAsync searches for devices matching the given search target.

Documentation

UpnpSearchAsync searches for devices matching the given search target. The function returns immediately and the SDK calls the default callback function, registered during the UpnpRegisterClient call, for each matching root device, device, or service. The application specifies the search type by the Target parameter.

Note that there is no way for the SDK to distinguish which client instance issued a particular search. Therefore, the client can get search callbacks that do not match the original criteria of the search. Also, the application will receive multiple callbacks for each search.

Parameters:
Hnd - The handle of the client performing the search.
Mx - The time, in seconds, to wait for responses. If the time is greater than MAX_SEARCH_TIME then the time is set to MAX_SEARCH_TIME. If the time is less than MIN_SEARCH_TIME then the time is set to MIN_SEARCH_TIME.
Target - The search target as defined in the UPnP Device Architecture v1.0 specification.
Cookie - The user data to pass when the callback function is invoked.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_PARAM: Target is NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Discovery.html0000644000175000017500000000167411021325544020341 00000000000000 Discovery

Discovery


o UpnpSearchAsync
UpnpSearchAsync searches for devices matching the given search target.
o UpnpSendAdvertisement
UpnpSendAdvertisement sends out the discovery announcements for all devices and services for a device.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INVALID_ARGUMENT-501.html0000644000175000017500000000132211021325543022360 00000000000000 UPNP_E_INVALID_ARGUMENT [-501]

UPNP_E_INVALID_ARGUMENT [-501]

UPNP_E_INVALID_ARGUMENT signifies that one or more of the parameters passed to a function is invalid. Refer to the individual function descriptions for the acceptable ranges for parameters.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_State_Var_Complete.html0000644000175000017500000000421611021325544023107 00000000000000 struct Upnp_State_Var_Complete

struct Upnp_State_Var_Complete

Represents the reply for the current value of a state variable in an asynchronous call.

[more]char CtrlUrl[NAME_SIZE]
The control URL for the service.
[more]DOMString CurrentVal
The current value of the variable or error string in case of error.
[more]int ErrCode
The result of the operation.
[more]char StateVarName[NAME_SIZE]
The name of the variable.


Documentation

Represents the reply for the current value of a state variable in an asynchronous call.
oint ErrCode
The result of the operation.

ochar CtrlUrl[NAME_SIZE]
The control URL for the service.

ochar StateVarName[NAME_SIZE]
The name of the variable.

oDOMString CurrentVal
The current value of the variable or error string in case of error.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpUnRegisterRootDevice.html0000644000175000017500000000313411021325544023301 00000000000000 EXPORT_SPEC int UpnpUnRegisterRootDevice

EXPORT_SPEC int UpnpUnRegisterRootDevice

( IN UpnpDevice_Handle )

Unregisters a root device registered with UpnpRegisterRootDevice or UpnpRegisterRootDevice2.

Documentation

Unregisters a root device registered with UpnpRegisterRootDevice or UpnpRegisterRootDevice2. After this call, the UpnpDevice_Handle is no longer valid. For all advertisements that have not yet expired, the SDK sends a device unavailable message automatically.

UpnpUnRegisterRootDevice is a synchronous call and generates no callbacks. Once this call returns, the SDK will no longer generate callbacks to the application.

Parameters:
- UpnpDevice_Handle The handle of the root device instance to unregister.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_CONTROL_ACTION_COMPLETE.html0000644000175000017500000000142111021325543022666 00000000000000 UPNP_CONTROL_ACTION_COMPLETE

UPNP_CONTROL_ACTION_COMPLETE

A UpnpSendActionAsync call completed.

Documentation

A UpnpSendActionAsync call completed. The Event parameter contains a pointer to a Upnp_Action_Complete structure with the results of the action.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/WebServerAPI.html0000644000175000017500000000422411021325544020622 00000000000000 Web Server API

Web Server API


o UpnpSetWebServerRootDir
UpnpSetWebServerRootDir sets the document root directory for the internal web server.
o UpnpSetVirtualDirCallbacks
UpnpSetVirtualDirCallbacks sets the callback function to be used to access a virtual directory.
o UpnpEnableWebserver
UpnpEnableWebServer enables or disables the webserver.
o UpnpIsWebserverEnabled
UpnpIsWebServerEnabled returns TRUE if the webserver is enabled, or FALSE if it is not.
o UpnpAddVirtualDir
UpnpAddVirtualDir adds a virtual directory mapping.
o UpnpRemoveVirtualDir
UpnpRemoveVirtualDir removes a virtual directory mapping made with UpnpAddVirtualDir.
o UpnpRemoveAllVirtualDirs
UpnpRemoveAllVirtualDirs removes all virtual directory mappings.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/toc.html0000644000175000017500000000066511021325544017156 00000000000000 Table of Contents

Table of Contents

General stuff



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpCloseHttpPost.html0000644000175000017500000000351511021325543022003 00000000000000 EXPORT_SPEC int UpnpCloseHttpPost

EXPORT_SPEC int UpnpCloseHttpPost

( IN void* handle,
  IN OUT int* httpStatus,
  IN int timeout )

UpnpCloseHttpPost sends and receives any pending data, closes the connection with the server, and frees memory allocated during the UpnpOpenHttpPost call.

Documentation

UpnpCloseHttpPost sends and receives any pending data, closes the connection with the server, and frees memory allocated during the UpnpOpenHttpPost call.

Parameters:
handle - The handle of the connection to close, created by the call to UpnpOpenHttpPost.
httpStatus - A pointer to a buffer to store the final status of the connection.
timeout - A time out value sent with the request during which a response is expected from the server, failing which, an error is reported.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either handle, or httpStatus is not a valid pointer.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_UNSUBSCRIBE_UNACCEPTED-302.html0000644000175000017500000000120611021325543023247 00000000000000 UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302]

UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302]

UPNP_E_UNSUBSCRIBE_UNACCEPTED signifies that an unsubscribe request was rejected from the remote side.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/License.html0000644000175000017500000000372311021325543017750 00000000000000 License

License

Copyright (c) 2000-2003 Intel Corporation All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

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

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpUnSubscribe.html0000644000175000017500000000447411021325544021462 00000000000000 EXPORT_SPEC int UpnpUnSubscribe

EXPORT_SPEC int UpnpUnSubscribe

( IN UpnpClient_Handle Hnd,
  IN Upnp_SID SubsId )

UpnpUnSubscribe removes the subscription of a control point from a service previously subscribed to using UpnpSubscribe or UpnpSubscribeAsync.

Documentation

UpnpUnSubscribe removes the subscription of a control point from a service previously subscribed to using UpnpSubscribe or UpnpSubscribeAsync. This is a synchronous call.

Parameters:
Hnd - The handle of the subscribed control point.
SubsId - The ID returned when the control point subscribed to the service.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_SID: The SubsId is not a valid subscription ID.
  • UPNP_E_NETWORK_ERROR: A network error occured.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting to PublisherUrl.
  • UPNP_E_OUTOF_SOCKET: An error ocurred creating a socket.
  • UPNP_E_BAD_RESPONSE: An error occurred in response from the publisher.
  • UPNP_E_UNSUBSCRIBE_UNACCEPTED: The publisher refused the unsubscribe request (the client is still unsubscribed and no longer receives events).
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_CANCELED-210.html0000644000175000017500000000121711021325543021126 00000000000000 UPNP_E_CANCELED [-210]

UPNP_E_CANCELED [-210]

UPNP_E_CANCELED signifies that the operation was canceled. This error can be returned by any function that allows for external cancelation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpClient_Handle.html0000644000175000017500000000147511021325544021725 00000000000000 typedef int UpnpClient_Handle

typedef int UpnpClient_Handle

Returned when a control point application registers with UpnpRegisterClient.

Documentation

Returned when a control point application registers with UpnpRegisterClient. Client handles can only be used with functions that operate with a client handle.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_NETWORK_ERROR-200.html0000644000175000017500000000146611021325543022077 00000000000000 UPNP_E_NETWORK_ERROR [-200]

UPNP_E_NETWORK_ERROR [-200]

UPNP_E_NETWORK_ERROR signifies that a network error occurred. It is the generic error code for network problems that are not covered under one of the more specific error codes. The typical meaning is the SDK failed to read the local IP address or had problems configuring one of the sockets.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_CONTROL_GET_VAR_COMPLETE.html0000644000175000017500000000144511021325543023046 00000000000000 UPNP_CONTROL_GET_VAR_COMPLETE

UPNP_CONTROL_GET_VAR_COMPLETE

A UpnpGetServiceVarStatus call completed.

Documentation

A UpnpGetServiceVarStatus call completed. The Event parameter contains a pointer to a Upnp_State_Var_Complete structure containing the value for the variable.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpHttpGetProgress.html0000644000175000017500000000252411021325543022333 00000000000000 EXPORT_SPEC int UpnpHttpGetProgress

EXPORT_SPEC int UpnpHttpGetProgress

( IN void* handle,
  OUT unsigned int* length,
  OUT unsigned int* total )

UpnpHttpGetProgress rettrieve progress information of a http-get transfer.

Documentation

UpnpHttpGetProgress rettrieve progress information of a http-get transfer.

Parameters:
handle - The token created by the call to UpnpOpenHttpGet.
length - The number of bytes received.
total - The content length.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either handle, length or total is not a valid pointer.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Errorcodes.html0000644000175000017500000001411611021325543020473 00000000000000 Error codes

Error codes

The functions in the SDK API can return a variety of error codes to describe problems encountered during execution. This section lists the error codes and provides a brief description of what each error code means. Refer to the documentation for each function for a description of what an error code means in that context.

o UPNP_E_SUCCESS [0]
o UPNP_E_INVALID_HANDLE [-100]
o UPNP_E_INVALID_PARAM [-101]
o UPNP_E_OUTOF_HANDLE [-102]
o UPNP_E_OUTOF_MEMORY [-104]
o UPNP_E_INIT [-105]
o UPNP_E_INVALID_DESC [-107]
o UPNP_E_INVALID_URL [-108]
o UPNP_E_INVALID_SERVICE [-111]
o UPNP_E_BAD_RESPONSE [-113]
o UPNP_E_INVALID_ACTION [-115]
o UPNP_E_FINISH [-116]
o UPNP_E_INIT_FAILED [-117]
o UPNP_E_BAD_HTTPMSG [-119]
o UPNP_E_ALREADY_REGISTERED [-120]
o UPNP_E_NETWORK_ERROR [-200]
o UPNP_E_SOCKET_WRITE [-201]
o UPNP_E_SOCKET_READ [-202]
o UPNP_E_SOCKET_BIND [-203]
o UPNP_E_SOCKET_CONNECT [-204]
o UPNP_E_OUTOF_SOCKET [-205]
o UPNP_E_LISTEN [-206]
o UPNP_E_TIMEDOUT [-207]
o UPNP_E_SOCKET_ERROR [-208]
o UPNP_E_CANCELED [-210]
o UPNP_E_SUBSCRIBE_UNACCEPTED [-301]
o UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302]
o UPNP_E_NOTIFY_UNACCEPTED [-303]
o UPNP_E_INVALID_ARGUMENT [-501]
o UPNP_E_FILE_NOT_FOUND [-502]
o UPNP_E_FILE_READ_ERROR [-503]
o UPNP_E_EXT_NOT_XML [-504]
o UPNP_E_NOT_FOUND [-507]
o UPNP_E_INTERNAL_ERROR [-911]

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSetMaxSubscriptionTimeOut.html0000644000175000017500000000322111021325544024340 00000000000000 EXPORT_SPEC int UpnpSetMaxSubscriptionTimeOut

EXPORT_SPEC int UpnpSetMaxSubscriptionTimeOut

( IN UpnpDevice_Handle Hnd,
  IN int MaxSubscriptionTimeOut )

UpnpSetMaxSubscriptionTimeOut sets the maximum time-out accepted for a subscription request or renewal.

Documentation

UpnpSetMaxSubscriptionTimeOut sets the maximum time-out accepted for a subscription request or renewal. The default value accepts the time-out set by the control point. If a control point requests a subscription time-out less than or equal to the maximum, the SDK grants the value requested by the control point. If the time-out is greater, the SDK returns the maximum value.

Parameters:
Hnd - The handle of the device for which the maximum subscription time-out is being set.
MaxSubscriptionTimeOut - The maximum subscription time-out to be accepted.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpCloseHttpGet.html0000644000175000017500000000205511021325544021574 00000000000000 EXPORT_SPEC int UpnpCloseHttpGet

EXPORT_SPEC int UpnpCloseHttpGet

(IN void* handle)

UpnpCloseHttpGet closes the connection and frees memory that was allocated for the handle parameter.

Documentation

UpnpCloseHttpGet closes the connection and frees memory that was allocated for the handle parameter.

Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: handle is not a valid pointer.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpWriteHttpPost.html0000644000175000017500000000345611021325543022034 00000000000000 EXPORT_SPEC int UpnpWriteHttpPost

EXPORT_SPEC int UpnpWriteHttpPost

( IN void* handle,
  IN char* buf,
  IN unsigned int* size,
  IN int timeout )

UpnpWriteHttpPost sends a request to a server to copy the contents of a buffer to the URI specified in the UpnpOpenHttpPost call.

Documentation

UpnpWriteHttpPost sends a request to a server to copy the contents of a buffer to the URI specified in the UpnpOpenHttpPost call.

Parameters:
handle - The handle of the connection created by the call to UpnpOpenHttpPost.
buf - The buffer to be posted.
size - The size, in bytes of buf.
timeout - A timeout value sent with the request during which a response is expected from the server, failing which, an error is reported.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either handle, buf or size is not a valid pointer.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpGetServiceVarStatusAsync.html0000644000175000017500000000402211021325543024135 00000000000000 EXPORT_SPEC int UpnpGetServiceVarStatusAsync

EXPORT_SPEC int UpnpGetServiceVarStatusAsync

( IN UpnpClient_Handle Hnd,
  IN const char* ActionURL,
  IN const char* VarName,
  IN Upnp_FunPtr Fun,
  IN const void* Cookie )

UpnpGetServiceVarStatusAsync queries the state of a variable of a service, generating a callback when the operation is complete.

Documentation

UpnpGetServiceVarStatusAsync queries the state of a variable of a service, generating a callback when the operation is complete. Note that the use of this function is deprecated by the UPnP Forum.

Parameters:
Hnd - The handle of the control point.
ActionURL - The URL of the service.
VarName - The name of the variable to query.
Fun - Pointer to a callback function to be invoked when the operation is complete.
Cookie - Pointer to user data to pass to the callback function when invoked.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: The ActionUrl is not a valid URL.
  • UPNP_E_INVALID_PARAM: VarName, Fun or ActionUrl is not a valid pointer.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/icon1.gif0000644000175000017500000000050611021325544017175 00000000000000GIF89aĄ˙˙˙€{ĆFAÍÍkbÍÖţţďĆ{{ĆÍţ04ţ ţçś‹¨ţ¤Ćţţ˝”„$ ţÖ„Z޵c˝­ZJssJJJśdbÍk21Ś!ů,c@€pH,ŹÄ€`0Ž„‚Áp@$EĹÂŔh8 ‚(08"’IR±Gァ@2š÷ć±YpîyCw !"D #$!%E&''!ť(G ""—H§¨DA;libupnp-1.8.0~svn20100507/docs/dist/html/upnp/icon2.gif0000644000175000017500000000050611021325544017176 00000000000000GIF89aŐîîî‘›utYYt†…”UUsdded_^€ONj›RQnmlŽ~›ih‹\[|?>TŻłżĽÁÉmlŽJJe;:O==Mvu•ZYv44G##0WWwHGa('5KJeED]##0(55C--=(eeq……”**9RR_!ů,c@€pH,ŹÄ€`0Ž„‚Áp@$EĹÂŔh8 ‚(08"’IR±Gァ@2š÷ć±YpîyCw !"D #$!%E&''!ť(G ""—H§¨DA;libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_LISTEN-206.html0000644000175000017500000000126011021325544020772 00000000000000 UPNP_E_LISTEN [-206]

UPNP_E_LISTEN [-206]

UPNP_E_LISTEN signifies that the SDK had a problem setting the socket to listen for incoming connections. This error only happens during initialization (i.e. UpnpInit).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSetWebServerRootDir.html0000644000175000017500000000273111021325544023113 00000000000000 EXPORT_SPEC int UpnpSetWebServerRootDir

EXPORT_SPEC int UpnpSetWebServerRootDir

( IN const char* rootDir )

UpnpSetWebServerRootDir sets the document root directory for the internal web server.

Documentation

UpnpSetWebServerRootDir sets the document root directory for the internal web server. This directory is considered the root directory (i.e. "/") of the web server.

This function also activates or deactivates the web server. To disable the web server, pass NULL for rootDir; to activate, pass a valid directory string.

Note that this function is not available when the web server is not compiled into the SDK.

Parameters:
rootDir - Path of the root directory of the web server.
Returns:
[int] An integer representing one of the following:
  • UPPN_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_ARGUMENT: rootDir is an invalid directory.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INVALID_PARAM-101.html0000644000175000017500000000134011021325544021773 00000000000000 UPNP_E_INVALID_PARAM [-101]

UPNP_E_INVALID_PARAM [-101]

UPNP_E_INVALID_PARAM signifies that one or more of the parameters passed to the function is not valid. Refer to the documentation for each function for more information on the valid ranges of the parameters.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_CONTROL_ACTION_REQUEST.html0000644000175000017500000000157111021325544022615 00000000000000 UPNP_CONTROL_ACTION_REQUEST

UPNP_CONTROL_ACTION_REQUEST

Received by a device when a control point issues a control request.

Documentation

Received by a device when a control point issues a control request. The Event parameter contains a pointer to a Upnp_Action_Request structure containing the action. The application stores the results of the action in this structure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpOpenHttpPost.html0000644000175000017500000000504311021325544021636 00000000000000 EXPORT_SPEC int UpnpOpenHttpPost

EXPORT_SPEC int UpnpOpenHttpPost

( IN const char* url,
  IN OUT void** handle,
  IN const char* contentType,
  IN int contentLength,
  IN int timeout )

UpnpOpenHttpPost makes an HTTP POST request message, opens a connection to the server and sends the POST request to the server if the connection to the server succeeds.

Documentation

UpnpOpenHttpPost makes an HTTP POST request message, opens a connection to the server and sends the POST request to the server if the connection to the server succeeds. The SDK allocates the memory for handle and contentType, the application is responsible for freeing this memory.

Parameters:
url - The URL in which to send the POST request.
handle - A pointer in which to store the handle for this connection. This handle is required for futher operations over this connection.
contentType - A buffer to store the media type of content being sent.
contentLength - The length of the content, in bytes, being posted.
timeout - The time out value sent with the request during which a response is expected from the receiver, failing which, an error is reported.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: Either url, handle or contentType is not a valid pointer.
  • UPNP_E_INVALID_URL: The url is not a valid URL.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to download this file.
  • UPNP_E_SOCKET_ERROR: Error occured allocating a socket and resources or an error occurred binding a socket.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting a socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Introduction.html0000644000175000017500000000207211021325544021044 00000000000000 Introduction

Introduction

This document gives a brief description of the Linux SDK for UPnP Devices API. Section 1 covers the license under which the SDK is distributed. Section 2 talks about the callback functions used in many parts of the API. Finally, section 3 details the structures and functions that comprise the API.

The Linux SDK for UPnP Devices version 1.2 supports the following platforms:

  • Linux* running on an Intel Architecture processor
  • Linux running on an Intel StrongARM or XScale processor

* Other brands and names are the property of their respective owners.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_EVENT_RECEIVED.html0000644000175000017500000000137411021325544021360 00000000000000 UPNP_EVENT_RECEIVED

UPNP_EVENT_RECEIVED

Received by a control point when an event arrives.

Documentation

Received by a control point when an event arrives. The Event parameter contains a Upnp_Event structure with the information about the event.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/General.html0000644000175000017500000000057011021325544017741 00000000000000 General Bits

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_ALREADY_REGISTERED-120.html0000644000175000017500000000131411021325544022565 00000000000000 UPNP_E_ALREADY_REGISTERED [-120]

UPNP_E_ALREADY_REGISTERED [-120]

UPNP_E_ALREADY_REGISTERED signifies that a client or a device is already registered. The SDK currently has a limit of one registered client and one registered device per process.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_Event.html0000644000175000017500000000336011021325543020446 00000000000000 struct Upnp_Event

struct Upnp_Event

Returned along with a UPNP_EVENT_RECEIVED callback.

[more]IXML_Document* ChangedVariables
The DOM tree representing the changes generating the event.
[more]int EventKey
The event sequence number.
[more]Upnp_SID Sid
The subscription ID for this subscription.


Documentation

Returned along with a UPNP_EVENT_RECEIVED callback.
oUpnp_SID Sid
The subscription ID for this subscription.

oint EventKey
The event sequence number.

oIXML_Document* ChangedVariables
The DOM tree representing the changes generating the event.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpCancelHttpGet.html0000644000175000017500000000174411021325544021720 00000000000000 EXPORT_SPEC int UpnpCancelHttpGet

EXPORT_SPEC int UpnpCancelHttpGet

(IN void* handle)

UpnpCancelHttpGet set the cancel flag of the handle parameter.

Documentation

UpnpCancelHttpGet set the cancel flag of the handle parameter.

Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: handle is not a valid pointer.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpGetServerIpAddress.html0000644000175000017500000000214611021325543022734 00000000000000 EXPORT_SPEC char* UpnpGetServerIpAddress

EXPORT_SPEC char* UpnpGetServerIpAddress

(void)

If NULL is used as the IP address in UpnpInit, then this function can be used to retrieve the actual interface address on which device is running.

Documentation

If NULL is used as the IP address in UpnpInit, then this function can be used to retrieve the actual interface address on which device is running. If UpnpInit has not succeeded then NULL is returned.

Returns:
[char*] The IP address on which an internal server is listening for UPnP related requests.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_BAD_RESPONSE-113.html0000644000175000017500000000130011021325544021670 00000000000000 UPNP_E_BAD_RESPONSE [-113]

UPNP_E_BAD_RESPONSE [-113]

UPNP_E_BAD_RESPONSE signifies that the response received from the remote side of a connection is not correct for the protocol. This applies to the GENA, SOAP, and HTTP protocols.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_EVENT_SUBSCRIPTION_EXPIRED.html0000644000175000017500000000147111021325544023274 00000000000000 UPNP_EVENT_SUBSCRIPTION_EXPIRED

UPNP_EVENT_SUBSCRIPTION_EXPIRED

A client subscription has expired.

Documentation

A client subscription has expired. This will only occur if auto-renewal of subscriptions is disabled. The Event parameter is a Upnp_Event_Subscribe structure. The subscription is no longer valid.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSetMaxSubscriptions.html0000644000175000017500000000313411021325544023217 00000000000000 EXPORT_SPEC int UpnpSetMaxSubscriptions

EXPORT_SPEC int UpnpSetMaxSubscriptions

( IN UpnpDevice_Handle Hnd,
  IN int MaxSubscriptions )

UpnpSetMaxSubscriptions sets the maximum number of subscriptions accepted per service.

Documentation

UpnpSetMaxSubscriptions sets the maximum number of subscriptions accepted per service. The default value accepts as many as system resources allow. If the number of current subscriptions for a service is greater than the requested value, the SDK accepts no new subscriptions or renewals, however, the SDK does not remove any current subscriptions.

Parameters:
Hnd - The handle of the device for which the maximum number of subscriptions is being set.
MaxSubscriptions - The maximum number of subscriptions to be allowed per service.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSendActionEx.html0000644000175000017500000000542311021325544021555 00000000000000 EXPORT_SPEC int UpnpSendActionEx

EXPORT_SPEC int UpnpSendActionEx

( IN UpnpClient_Handle Hnd,
  IN const char* ActionURL,
  IN const char* ServiceType,
  IN const char* DevUDN,
  IN IXML_Document* Header,
  IN IXML_Document* Action,
  OUT IXML_Document** RespNode )

UpnpSendActionEx sends a message to change a state variable in a service.

Documentation

UpnpSendActionEx sends a message to change a state variable in a service. This is a synchronous call that does not return until the action is complete.

Note that a positive return value indicates a SOAP-protocol error code. In this case, the error description can be retrieved from RespNode. A negative return value indicates an SDK error.

Parameters:
Hnd - The handle of the control point sending the action.
ActionURL - The action URL of the service.
- ServiceType The type of the service.
- DevUDN This parameter is ignored and must be NULL.
Header - The DOM document for the SOAP header. This may be NULL if the header is not required.
Action - The DOM document for the action.
RespNode - The DOM document for the response to the action. The SDK allocates this document and the caller needs to free it.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: ActionUrl is not a valid URL.
  • UPNP_E_INVALID_ACTION: This action is not valid.
  • UPNP_E_INVALID_DEVICE: DevUDN is not a valid device.
  • UPNP_E_INVALID_PARAM: ServiceType, Action, ActionUrl, or RespNode is not a valid pointer.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpIsWebserverEnabled.html0000644000175000017500000000176611021325543022751 00000000000000 EXPORT_SPEC int UpnpIsWebserverEnabled

EXPORT_SPEC int UpnpIsWebserverEnabled

()

UpnpIsWebServerEnabled returns TRUE if the webserver is enabled, or FALSE if it is not.

Documentation

UpnpIsWebServerEnabled returns TRUE if the webserver is enabled, or FALSE if it is not.

Returns:
[int] An integer representing one of the following:
  • TRUE: The webserver is enabled.
  • FALSE: The webserver is not enabled

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/ControlPointHTTPAPI.html0000644000175000017500000000662011021325544022052 00000000000000 Control Point HTTP API

Control Point HTTP API


o UpnpDownloadUrlItem
UpnpDownloadUrlItem downloads a file specified in a URL.
o UpnpOpenHttpGet
UpnpOpenHttpGet gets a file specified in a URL.
o UpnpOpenHttpGetProxy
UpnpOpenHttpGetProxy gets a file specified in a URL through the specified proxy.
o UpnpOpenHttpGetEx
UpnpOpenHttpGetEx gets specified number of bytes from a file specified in the URL.
o UpnpReadHttpGet
UpnpReadHttpGet gets specified number of bytes from a file specified in a URL.
o UpnpHttpGetProgress
UpnpHttpGetProgress rettrieve progress information of a http-get transfer.
o UpnpCancelHttpGet
UpnpCancelHttpGet set the cancel flag of the handle parameter.
o UpnpCloseHttpGet
UpnpCloseHttpGet closes the connection and frees memory that was allocated for the handle parameter.
o UpnpOpenHttpPost
UpnpOpenHttpPost makes an HTTP POST request message, opens a connection to the server and sends the POST request to the server if the connection to the server succeeds.
o UpnpWriteHttpPost
UpnpWriteHttpPost sends a request to a server to copy the contents of a buffer to the URI specified in the UpnpOpenHttpPost call.
o UpnpCloseHttpPost
UpnpCloseHttpPost sends and receives any pending data, closes the connection with the server, and frees memory allocated during the UpnpOpenHttpPost call.
o UpnpDownloadXmlDoc
UpnpDownloadXmlDoc downloads an XML document specified in a URL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpAddToPropertySet.html0000644000175000017500000000334211021325543022442 00000000000000 EXPORT_SPEC int UpnpAddToPropertySet

EXPORT_SPEC int UpnpAddToPropertySet

( IN OUT IXML_Document** PropSet,
  IN const char* ArgName,
  IN const char* ArgVal )

UpnpAddToPropertySet can be used when an application needs to transfer the status of many variables at once.

Documentation

UpnpAddToPropertySet can be used when an application needs to transfer the status of many variables at once. It can be used (inside a loop) to add some extra status variables into an existing property set. If the application does not already have a property set document, the application should create a variable initialized with NULL and pass that as the first parameter.

Parameters:
PropSet - A pointer to the document containing the property set document node.
ArgName - The status variable name.
ArgVal - The status variable value.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_PARAM: One or more of the parameters are invalid.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_Action_Request.html0000644000175000017500000001030211021325543022304 00000000000000 struct Upnp_Action_Request

struct Upnp_Action_Request

Returned as part of a UPNP_CONTROL_ACTION_COMPLETE callback.

[more]char ActionName[NAME_SIZE]
The Action Name.
[more]IXML_Document* ActionRequest
The DOM document describing the action.
[more]IXML_Document* ActionResult
The DOM document describing the result of the action.
[more]struct in_addr CtrlPtIPAddr
IP address of the control point requesting this action.
[more]char DevUDN[NAME_SIZE]
The unique device ID.
[more]int ErrCode
The result of the operation.
[more]char ErrStr[LINE_SIZE]
The error string in case of error.
[more]char ServiceID[NAME_SIZE]
The service ID.
[more]IXML_Document* SoapHeader
The DOM document containing the information from the the SOAP header.
[more]int Socket
The socket number of the connection to the requestor.


Documentation

Returned as part of a UPNP_CONTROL_ACTION_COMPLETE callback.
oint ErrCode
The result of the operation.

oint Socket
The socket number of the connection to the requestor.

ochar ErrStr[LINE_SIZE]
The error string in case of error.

ochar ActionName[NAME_SIZE]
The Action Name.

ochar DevUDN[NAME_SIZE]
The unique device ID.

ochar ServiceID[NAME_SIZE]
The service ID.

oIXML_Document* ActionRequest
The DOM document describing the action.

oIXML_Document* ActionResult
The DOM document describing the result of the action.

ostruct in_addr CtrlPtIPAddr
IP address of the control point requesting this action.

oIXML_Document* SoapHeader
The DOM document containing the information from the the SOAP header.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpSetContentLength.html0000644000175000017500000000171111021325544022455 00000000000000 EXPORT_SPEC int UpnpSetContentLength

EXPORT_SPEC int UpnpSetContentLength

( IN UpnpClient_Handle Hnd,
  IN int contentLength )

OBSOLETE METHOD : use UpnpSetMaxContentLength instead.

Documentation

OBSOLETE METHOD : use UpnpSetMaxContentLength instead. Warning: the Handle argument provided here is not used, so the effect of this function is global to the SDK (= same as UpnpSetMaxContentLength ).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpRegisterRootDevice.html0000644000175000017500000000542611021325544023004 00000000000000 EXPORT_SPEC int UpnpRegisterRootDevice

EXPORT_SPEC int UpnpRegisterRootDevice

( IN const char* DescUrl,
  IN Upnp_FunPtr Callback,
  IN const void* Cookie,
  OUT UpnpDevice_Handle* Hnd )

UpnpRegisterRootDevice registers a device application with the SDK.

Documentation

UpnpRegisterRootDevice registers a device application with the SDK. A device application cannot make any other API calls until it registers using this function. Device applications can also register as control points (see UpnpRegisterClient to get a control point handle to perform control point functionality).

UpnpRegisterRootDevice is synchronous and does not generate any callbacks. Callbacks can occur as soon as this function returns.

Parameters:
DescUrl - Pointer to a string containing the description URL for this root device instance.
Callback - Pointer to the callback function for receiving asynchronous events.
Cookie - Pointer to user data returned with the callback function when invoked.
Hnd - Pointer to a variable to store the new device handle.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_FINISH: The SDK is already terminated or is not initialized.
  • UPNP_E_INVALID_DESC: The description document was not a valid device description.
  • UPNP_E_INVALID_URL: The URL for the description document is not valid.
  • UPNP_E_INVALID_PARAM: Either Callback or Hnd is not a valid pointer or DescURL is NULL.
  • UPNP_E_NETWORK_ERROR: A network error occurred.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting the socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.
  • UPNP_E_OUTOF_MEMORY: There are insufficient resources to register this root device.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpUnRegisterClient.html0000644000175000017500000000265111021325544022457 00000000000000 EXPORT_SPEC int UpnpUnRegisterClient

EXPORT_SPEC int UpnpUnRegisterClient

( IN UpnpClient_Handle Hnd )

UpnpUnRegisterClient unregisters a control point application, unsubscribing all active subscriptions.

Documentation

UpnpUnRegisterClient unregisters a control point application, unsubscribing all active subscriptions. After this call, the UpnpClient_Handle is no longer valid.

UpnpUnRegisterClient is a synchronous call and generates no callbacks. The SDK generates no more callbacks after this function returns.

Parameters:
Hnd - The handle of the control point instance to unregister.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpDevice_Handle.html0000644000175000017500000000157311021325544021705 00000000000000 typedef int UpnpDevice_Handle

typedef int UpnpDevice_Handle

Returned when a device application registers with UpnpRegisterRootDevice or UpnpRegisterRootDevice2.

Documentation

Returned when a device application registers with UpnpRegisterRootDevice or UpnpRegisterRootDevice2. Device handles can only be used with functions that operate with a device handle.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpRegisterRootDevice2.html0000644000175000017500000001274611021325544023071 00000000000000 EXPORT_SPEC int UpnpRegisterRootDevice2

EXPORT_SPEC int UpnpRegisterRootDevice2

( IN Upnp_DescType descriptionType,
  IN const char* description,
  IN size_t bufferLen,
  IN int config_baseURL,
  IN Upnp_FunPtr Fun,
  IN const void* Cookie,
  OUT UpnpDevice_Handle* Hnd )

UpnpRegisterRootDevice2 is similar to UpnpRegisterRootDevice, except that it also allows the description document to be specified as a file or a memory buffer.

Documentation

UpnpRegisterRootDevice2 is similar to UpnpRegisterRootDevice, except that it also allows the description document to be specified as a file or a memory buffer. The description can also be configured to have the correct IP and port address.

NOTE: For the configuration to be functional, the internal web server MUST be present. In addition, the web server MUST be activated (using UpnpSetWebServerRootDir) before calling this function. The only condition where the web server can be absent is if the description document is specified as a URL and no configuration is required (i.e. config_baseURL = 0.)

UpnpRegisterRootDevice2 is synchronous and does not generate any callbacks. Callbacks can occur as soon as this function returns.

Examples of using different types of description documents:

    1) Description specified as a URL:
          descriptionType == UPNPREG_URL_DESC
          description is the URL
          bufferLen = 0 (ignored)
    2) Description specified as a file:
          descriptionType == UPNPREG_FILENAME_DESC
          description is a filename
          bufferLen = 0 (ignored)
    3) Description specified as a memory buffer:
          descriptionType == UPNPREG_BUF_DESC
          description is pointer to a memory buffer
          bufferLen == length of memory buffer
    

Parameters:
descriptionType - The type of the description document.
description - Treated as a URL, file name or memory buffer depending on description type.
bufferLen - The length of memory buffer if passing a description in a buffer, otherwise it is ignored.
config_baseURL - If nonzero, URLBase of description document is configured and the description is served using the internal web server.
Fun - Pointer to the callback function for receiving asynchronous events.
Cookie - Pointer to user data returned with the callback function when invoked.
Hnd - Pointer to a variable to store the new device handle.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_FINISH: The SDK is already terminated or is not initialized.
  • UPNP_E_INVALID_DESC: The description document is not a valid device description.
  • UPNP_E_INVALID_PARAM: Either Callback or Hnd is not a valid pointer or DescURL is NULL.
  • UPNP_E_NETWORK_ERROR: A network error occurred.
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket.
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket.
  • UPNP_E_SOCKET_BIND: An error occurred binding a socket.
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting the socket.
  • UPNP_E_OUTOF_SOCKET: Too many sockets are currently allocated.
  • UPNP_E_OUTOF_MEMORY: There are insufficient resources to register this root device.
  • UPNP_E_URL_TOO_BIG: Length of the URL is bigger than the internal buffer.
  • UPNP_E_FILE_NOT_FOUND: The description file could not be found.
  • UPNP_E_FILE_READ_ERROR: An error occurred reading the description file.
  • UPNP_E_INVALID_URL: The URL to the description document is invalid.
  • UPNP_E_EXT_NOT_XML: The URL to the description document or file should have a .xml extension.
  • UPNP_E_NO_WEB_SERVER: The internal web server has been compiled out; the SDK cannot configure itself from the description document.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpAcceptSubscriptionExt.html0000644000175000017500000000472511021325544023522 00000000000000 EXPORT_SPEC int UpnpAcceptSubscriptionExt

EXPORT_SPEC int UpnpAcceptSubscriptionExt

( IN UpnpDevice_Handle Hnd,
  IN const char* DevID,
  IN const char* ServID,
  IN IXML_Document* PropSet,
  IN Upnp_SID SubsId )

UpnpAcceptSubscriptionExt is similar to UpnpAcceptSubscription except that it takes a DOM document for the variables to event rather than an array of strings.

Documentation

UpnpAcceptSubscriptionExt is similar to UpnpAcceptSubscription except that it takes a DOM document for the variables to event rather than an array of strings. This function is sychronous and generates no callbacks.

UpnpAcceptSubscriptionExt can be called during the execution of a callback function.

Parameters:
Hnd - The handle of the device.
DevID - The device ID of the subdevice of the service generating the event.
ServID - The unique service identifier of the service generating the event.
PropSet - The DOM document for the property set. Property set documents must conform to the XML schema defined in section 4.3 of the Universal Plug and Play Device Architecture specification.
SubsId - The subscription ID of the newly registered control point.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.
  • UPNP_E_INVALID_SERVICE: The DevId/ServId pair refers to an invalid service.
  • UPNP_E_INVALID_SID: The specified subscription ID is not valid.
  • UPNP_E_INVALID_PARAM: Either VarName, NewVal, DevID, ServID, or PropSet is not a valid pointer.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/AboutCallbacks.html0000644000175000017500000000223411021325544021235 00000000000000 About Callbacks

About Callbacks

The Linux SDK for UPnP Devices contains functions that generate asynchronous callbacks. To simplify the application callback functions, these callbacks are executed on a thread owned by the SDK itself. The SDK executes the application's callback function in a thread context so the application can allocate memory and preserve the information it needs. The application can also use standard thread synchronization methods to ensure data integrity. Due to the possibility of deadlock, the application cannot call back into the SDK during these callbacks unless explicitly noted. There is no restriction in calling into the operating system or any other application interfaces.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpRegisterClient.html0000644000175000017500000000346711021325543022161 00000000000000 EXPORT_SPEC int UpnpRegisterClient

EXPORT_SPEC int UpnpRegisterClient

( IN Upnp_FunPtr Callback,
  IN const void* Cookie,
  OUT UpnpClient_Handle* Hnd )

UpnpRegisterClient registers a control point application with the SDK.

Documentation

UpnpRegisterClient registers a control point application with the SDK. A control point application cannot make any other API calls until it registers using this function.

UpnpRegisterClient is a synchronous call and generates no callbacks. Callbacks can occur as soon as this function returns.

Parameters:
Callback - Pointer to a function for receiving asynchronous events.
Cookie - Pointer to user data returned with the callback function when invoked.
Hnd - Pointer to a variable to store the new control point handle.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_FINISH: The SDK is already terminated or is not initialized.
  • UPNP_E_INVALID_PARAM: Either Callback or Hnd is not a valid pointer.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to register this control point.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpFinish.html0000644000175000017500000000205411021325543020445 00000000000000 EXPORT_SPEC int UpnpFinish

EXPORT_SPEC int UpnpFinish

()

Terminates the Linux SDK for UPnP Devices.

Documentation

Terminates the Linux SDK for UPnP Devices. This function must be the last API function called. It should be called only once. Subsequent calls to this API return a UPNP_E_FINISH error code.

Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_FINISH: The SDK is already terminated or it is not initialized.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpRemoveAllVirtualDirs.html0000644000175000017500000000147311021325543023310 00000000000000 EXPORT_SPEC void UpnpRemoveAllVirtualDirs

EXPORT_SPEC void UpnpRemoveAllVirtualDirs

( )

UpnpRemoveAllVirtualDirs removes all virtual directory mappings.

Documentation

UpnpRemoveAllVirtualDirs removes all virtual directory mappings.

Returns:
[void] This function does not return a value.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpVirtualDirCallbacks.html0000644000175000017500000001530211021325544023113 00000000000000 struct UpnpVirtualDirCallbacks

struct UpnpVirtualDirCallbacks

The UpnpVirtualDirCallbacks structure contains the pointers to file-related callback functions a device application can register to virtualize URLs.

[more]int (*close)( IN UpnpWebFileHandle fileHnd )
Called by the web server to close a file opened via the open callback.
[more]int (*get_info)( IN const char* filename, OUT struct File_Info* info )
Called by the web server to query information on a file.
[more]UpnpWebFileHandle (*open)( IN const char* filename, IN enum UpnpOpenFileMode Mode )
Called by the web server to open a file.
[more]int (*read)( IN UpnpWebFileHandle fileHnd, OUT char* buf, IN size_t buflen )
Called by the web server to perform a sequential read from an open file.
[more]int (*seek)( IN UpnpWebFileHandle fileHnd, IN long offset, IN int origin )
Called by the web server to move the file pointer, or offset, into an open file.
[more]int (*write)( IN UpnpWebFileHandle fileHnd, IN char* buf, IN size_t buflen )
Called by the web server to perform a sequential write to an open file.


Documentation

The UpnpVirtualDirCallbacks structure contains the pointers to file-related callback functions a device application can register to virtualize URLs.
oint (*get_info)( IN const char* filename, OUT struct File_Info* info )
Called by the web server to query information on a file. The callback should return 0 on success or -1 on an error.
Parameters:
filename - The name of the file to query.
info - Pointer to a structure to store the information on the file.

oUpnpWebFileHandle (*open)( IN const char* filename, IN enum UpnpOpenFileMode Mode )
Called by the web server to open a file. The callback should return a valid handle if the file can be opened. Otherwise, it should return NULL to signify an error.
Parameters:
filename - The name of the file to open.
Mode - The mode in which to open the file. Valid values are UPNP_READ or UPNP_WRITE.

oint (*read)( IN UpnpWebFileHandle fileHnd, OUT char* buf, IN size_t buflen )
Called by the web server to perform a sequential read from an open file. The callback should copy buflen bytes from the file into the buffer.
Parameters:
fileHnd - The handle of the file to read.
buf - The buffer in which to place the data.
buflen - The size of the buffer (i.e. the number of bytes to read).
Returns:
[int] An integer representing one of the following:
  • 0: The file contains no more data (EOF).
  • >0: A successful read of the number of bytes in the return code.
  • <0: An error occurred reading the file. \end{itemzie}

oint (*write)( IN UpnpWebFileHandle fileHnd, IN char* buf, IN size_t buflen )
Called by the web server to perform a sequential write to an open file. The callback should write buflen bytes into the file from the buffer. It should return the actual number of bytes written, which might be less than buflen in the case of a write error.
Parameters:
fileHnd - The handle of the file to write.
buf - The buffer with the bytes to write.
buflen - The number of bytes to write.

oint (*seek)( IN UpnpWebFileHandle fileHnd, IN long offset, IN int origin )
Called by the web server to move the file pointer, or offset, into an open file. The origin parameter determines where to start moving the file pointer. A value of SEEK_CUR moves the file pointer relative to where it is. The offset parameter can be either positive (move forward) or negative (move backward). SEEK_END moves relative to the end of the file. A positive offset extends the file. A negative offset moves backward in the file. Finally, SEEK_SET moves to an absolute position in the file. In this case, offset must be positive. The callback should return 0 on a successful seek or a non-zero value on an error.
Parameters:
fileHnd - The handle of the file to move the file pointer.
offset - The number of bytes to move in the file. Positive values move foward and negative values move backward. Note that this must be positive if the origin is SEEK_SET.
origin - The position to move relative to. It can be SEEK_CUR to move relative to the current position, SEEK_END to move relative to the end of the file, or SEEK_SET to specify an absolute offset.

oint (*close)( IN UpnpWebFileHandle fileHnd )
Called by the web server to close a file opened via the open callback. It should return 0 on success, or a non-zero value on an error.
Parameters:
fileHnd - The handle of the file to close.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_EVENT_AUTORENEWAL_FAILED.html0000644000175000017500000000147211021325543022762 00000000000000 UPNP_EVENT_AUTORENEWAL_FAILED

UPNP_EVENT_AUTORENEWAL_FAILED

The auto-renewal of a client subscription failed.

Documentation

The auto-renewal of a client subscription failed. The Event parameter is a Upnp_Event_Subscribe structure with the error code set appropriately. The subscription is no longer valid.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpNotifyExt.html0000644000175000017500000000442711021325543021164 00000000000000 EXPORT_SPEC int UpnpNotifyExt

EXPORT_SPEC int UpnpNotifyExt

( IN UpnpDevice_Handle,
  IN const char* DevID,
  IN const char* ServID,
  IN IXML_Document* PropSet )

UpnpNotifyExt is similar to UpnpNotify except that it takes a DOM document for the event rather than an array of strings.

Documentation

UpnpNotifyExt is similar to UpnpNotify except that it takes a DOM document for the event rather than an array of strings. This function is synchronous and generates no callbacks.

UpnpNotifyExt may be called during a callback function to send out a notification.

Parameters:
- UpnpDevice_Handle The handle to the device sending the event.
DevID - The device ID of the subdevice of the service generating the event.
ServID - The unique identifier of the service generating the event.
PropSet - The DOM document for the property set. Property set documents must conform to the XML schema defined in section 4.3 of the Universal Plug and Play Device Architecture specification.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.
  • UPNP_E_INVALID_SERVICE: The DevId/ServId pair refers to an invalid service.
  • UPNP_E_INVALID_PARAM: Either VarName, NewVal, DevID, ServID, or PropSet is not a valid pointer or cVariables is less than zero.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_TIMEDOUT-207.html0000644000175000017500000000131711021325543021231 00000000000000 UPNP_E_TIMEDOUT [-207]

UPNP_E_TIMEDOUT [-207]

UPNP_E_TIMEDOUT signifies that too much time elapsed before the required number of bytes were sent or received over a socket. This error can be returned by any function that performs network operations.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_DescType.html0000644000175000017500000000257011021325544021110 00000000000000 enum Upnp_DescType

enum Upnp_DescType

Specifies the type of description in UpnpRegisterRootDevice2.
These values control how UpnpRegisterRootDevice2 interprets the description parameter.

o UPNPREG_URL_DESC
The description is the URL to the description document.
o UPNPREG_FILENAME_DESC
The description is a file name on the local file system containing the description of the device.
o UPNPREG_BUF_DESC
The description is a pointer to a character array containing the XML description document.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_OUTOF_HANDLE-102.html0000644000175000017500000000127111021325543021677 00000000000000 UPNP_E_OUTOF_HANDLE [-102]

UPNP_E_OUTOF_HANDLE [-102]

UPNP_E_OUTOF_HANDLE signifies that the SDK does not have any more space for additional handles. The SDK allocates space for only a few handles in order to conserve memory.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_S_ROOT.html0000644000175000017500000000116311021325543020271 00000000000000 UPNP_S_ROOT

UPNP_S_ROOT

Search for all root devices on the network.

Documentation

Search for all root devices on the network.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_SType.html0000644000175000017500000000307511021325543020434 00000000000000 enum Upnp_SType

enum Upnp_SType

Represents the different types of searches that can be performed using the SDK for UPnP Devices API.
By specifying these different values to UpnpSearchAsync, the control point application can control the scope of the search from all devices to specific devices or services.

o UPNP_S_ALL
Search for all devices and services on the network.
o UPNP_S_ROOT
Search for all root devices on the network.
o UPNP_S_DEVICE
Search for a particular device type or a particular device instance.
o UPNP_S_SERVICE
Search for a particular service type, possibly on a particular device type or device instance.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_EXT_NOT_XML-504.html0000644000175000017500000000122611021325544021677 00000000000000 UPNP_E_EXT_NOT_XML [-504]

UPNP_E_EXT_NOT_XML [-504]

UPNP_E_EXT_NOT_XML signifies that the file name of the description document passed to UpnpRegisterRootDevice2 does not end in ".xml".

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpRenewSubscriptionAsync.html0000644000175000017500000000752411021325543023717 00000000000000 EXPORT_SPEC int UpnpRenewSubscriptionAsync

EXPORT_SPEC int UpnpRenewSubscriptionAsync

( IN UpnpClient_Handle Hnd,
  IN int TimeOut,
  IN Upnp_SID SubsId,
  IN Upnp_FunPtr Fun,
  IN const void* Cookie )

UpnpRenewSubscriptionAsync renews a subscription that is about to expire, generating a callback when the operation is complete.

Documentation

UpnpRenewSubscriptionAsync renews a subscription that is about to expire, generating a callback when the operation is complete.

Note that many of the error codes for this function are returned in the Upnp_Event_Subscribe structure. In those cases, the function returns UPNP_E_SUCCESS and the appropriate error code will be in the Upnp_Event_Subscribe.ErrCode field in the Event structure passed to the callback.

Parameters:
Hnd - The handle of the control point that is renewing the subscription.
- TimeOut The requested subscription time. The actual timeout value is returned when the callback function is called.
SubsId - The ID for the subscription to renew.
Fun - Pointer to a callback function to be invoked when the renewal is complete.
Cookie - Pointer to user data passed to the callback function when invoked.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_SID: The SubsId is not a valid subscription ID.
  • UPNP_E_INVALID_PARAM: Either Fun is not a valid callback function pointer or Timeout is less than zero but is not UPNP_INFINITE.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.
  • UPNP_E_NETWORK_ERROR: A network error occured (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_WRITE: An error or timeout occurred writing to a socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_READ: An error or timeout occurred reading from a socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_BIND: An error occurred binding the socket (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SOCKET_CONNECT: An error occurred connecting to PublisherUrl (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_OUTOF_SOCKET: An error occurred creating socket ( returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_BAD_RESPONSE: An error occurred in response from the publisher (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).
  • UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused the subscription request (returned in the Upnp_Event_Subscribe.ErrCode field as part of the callback).

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpMakeAction.html0000644000175000017500000000311611021325544021241 00000000000000 EXPORT_SPEC IXML_Document* UpnpMakeAction

EXPORT_SPEC IXML_Document* UpnpMakeAction

( IN const char* ActionName,
  IN const char* ServType,
  IN int NumArg,
  IN const char* Arg,
  IN ... )

UpnpMakeAction creates an action request packet based on its input parameters (status variable name and value pair).

Documentation

UpnpMakeAction creates an action request packet based on its input parameters (status variable name and value pair). Any number of input parameters can be passed to this function but every input variable name should have a matching value argument.

Parameters:
- ActionName The action name.
ServType - The service type.
NumArg - Number of argument pairs to be passed.
Arg - Status variable name and value pair.
Returns:
[IXML_Document*] The action node of Upnp_Document type or NULL if the operation failed.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpAcceptSubscription.html0000644000175000017500000000513611021325543023035 00000000000000 EXPORT_SPEC int UpnpAcceptSubscription

EXPORT_SPEC int UpnpAcceptSubscription

( IN UpnpDevice_Handle Hnd,
  IN const char* DevID,
  IN const char* ServID,
  IN const char** VarName,
  IN const char** NewVal,
  IN int cVariables,
  IN Upnp_SID SubsId )

UpnpAcceptSubscription accepts a subscription request and sends out the current state of the eventable variables for a service.

Documentation

UpnpAcceptSubscription accepts a subscription request and sends out the current state of the eventable variables for a service. The device application should call this function when it receives a UPNP_EVENT_SUBSCRIPTION_REQUEST callback. This function is synchronous and generates no callbacks.

UpnpAcceptSubscription can be called during the execution of a callback function.

Parameters:
Hnd - The handle of the device.
DevID - The device ID of the subdevice of the service generating the event.
ServID - The unique service identifier of the service generating the event.
VarName - Pointer to an array of event variables.
NewVal - Pointer to an array of values for the event variables.
cVariables - The number of event variables in VarName.
SubsId - The subscription ID of the newly registered control point.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid device handle.
  • UPNP_E_INVALID_SERVICE: The DevId/ServId pair refers to an invalid service.
  • UPNP_E_INVALID_SID: The specified subscription ID is not valid.
  • UPNP_E_INVALID_PARAM: Either VarName, NewVal, DevID, or ServID is not a valid pointer or cVariables is less than zero.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_DISCOVERY_SEARCH_TIMEOUT.html0000644000175000017500000000146011021325543023026 00000000000000 UPNP_DISCOVERY_SEARCH_TIMEOUT

UPNP_DISCOVERY_SEARCH_TIMEOUT

Received by a control point when the search timeout expires.

Documentation

Received by a control point when the search timeout expires. The SDK generates no more callbacks for this search after this event. The Event parameter is NULL.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_EVENT_RENEWAL_COMPLETE.html0000644000175000017500000000141711021325543022554 00000000000000 UPNP_EVENT_RENEWAL_COMPLETE

UPNP_EVENT_RENEWAL_COMPLETE

A UpnpRenewSubscriptionAsync call completed.

Documentation

A UpnpRenewSubscriptionAsync call completed. The status of the renewal is in the Event parameter as a Upnp_Event_Subscription structure.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/Upnp_Subscription_Request.html0000644000175000017500000000335611021325544023567 00000000000000 struct Upnp_Subscription_Request

struct Upnp_Subscription_Request

Returned along with a UPNP_EVENT_SUBSCRIPTION_REQUEST callback.

[more]char* ServiceId
The identifier for the service being subscribed to.
[more]Upnp_SID Sid
The assigned subscription ID for this subscription.
[more]char* UDN
Universal device name.


Documentation

Returned along with a UPNP_EVENT_SUBSCRIPTION_REQUEST callback.
ochar* ServiceId
The identifier for the service being subscribed to.

ochar* UDN
Universal device name.

oUpnp_SID Sid
The assigned subscription ID for this subscription.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpGetServiceVarStatus.html0000644000175000017500000000441211021325543023142 00000000000000 EXPORT_SPEC int UpnpGetServiceVarStatus

EXPORT_SPEC int UpnpGetServiceVarStatus

( IN UpnpClient_Handle Hnd,
  IN const char* ActionURL,
  IN const char* VarName,
  OUT DOMString* StVarVal )

UpnpGetServiceVarStatus queries the state of a state variable of a service on another device.

Documentation

UpnpGetServiceVarStatus queries the state of a state variable of a service on another device. This is a synchronous call. A positive return value indicates a SOAP error code, whereas a negative return code indicates an SDK error code. Note that the use of this function is deprecated by the UPnP Forum.

Parameters:
Hnd - The handle of the control point.
ActionURL - The URL of the service.
VarName - The name of the variable to query.
StVarVal - The pointer to store the value for VarName. The SDK allocates this string and the caller needs to free it using ixmlFreeDOMString.
Returns:
[int] An integer representing one of the following:
  • UPNP_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle.
  • UPNP_E_INVALID_URL: ActionUrl is not a valid URL.
  • UPNP_E_INVALID_DESC: The XML document was not found or it does not contain a valid XML description.
  • UPNP_E_INVALID_PARAM: StVarVal is not a valid pointer or VarName or ActionUrl is NULL.
  • UPNP_E_OUTOF_MEMORY: Insufficient resources exist to complete this operation.
  • UPNP_SOAP_E_INVALID_VAR: The given variable is invalid according to the device.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INVALID_ACTION-115.html0000644000175000017500000000133711021325544022123 00000000000000 UPNP_E_INVALID_ACTION [-115]

UPNP_E_INVALID_ACTION [-115]

UPNP_E_INVALID_ACTION signifies that the SOAP action message is invalid. This can be because the DOM document passed to the function was malformed or the action message is not correct for the given action.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_FILE_READ_ERROR-503.html0000644000175000017500000000112011021325544022252 00000000000000 UPNP_E_FILE_READ_ERROR [-503]

UPNP_E_FILE_READ_ERROR [-503]

UPNP_E_FILE_READ_ERROR signifies an error when reading a file.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UpnpEnableWebserver.html0000644000175000017500000000216211021325543022300 00000000000000 EXPORT_SPEC int UpnpEnableWebserver

EXPORT_SPEC int UpnpEnableWebserver

( IN int enable )

UpnpEnableWebServer enables or disables the webserver.

Documentation

UpnpEnableWebServer enables or disables the webserver. A value of TRUE enables the webserver, FALSE disables it.

Parameters:
enable - TRUE to enable, FALSE to disable.
Returns:
[int] An integer representing one of the following:
  • UPPN_E_SUCCESS: The operation completed successfully.
  • UPNP_E_INVALID_ARGUMENT: enable is not valid.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/html/upnp/UPNP_E_INVALID_HANDLE-100.html0000644000175000017500000000117411021325544022072 00000000000000 UPNP_E_INVALID_HANDLE [-100]

UPNP_E_INVALID_HANDLE [-100]

UPNP_E_INVALID_HANDLE signifies that the handle passed to a function is not a recognized as a valid handle.

Alphabetic index



This page was generated with the help of DOC++. libupnp-1.8.0~svn20100507/docs/dist/UPnP_Programming_Guide.pdf0000644000175000017500000132500311021325544020546 00000000000000%PDF-1.4 3 0 obj << /Length 108 /Filter /FlateDecode >> stream xÚs áŇw3´T02Ń3·0WIS°4P0±°Ô327UI‰ÖđÉÔ4ÔČÓ46Ô(­ĐÔ561×vń†0Ň€2ůEvhHYc¦á˘©k¨‘ZŇ™ś bCÄË "z&š±!^\®!\ëC‰endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 1 0 obj << /Font << /F19 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 10 0 obj << /Length 4037 /Filter /FlateDecode >> stream xÚíť[sŰ6Çßý)ô(MW(®¸oЬ´jŮ+Ë˝L·Ž­4žueÇ–ÓÍĚ~ř=2EN0m}™ĚÄş@G?˙?p‚Ä«ĹŢׯ9í1FJĄz‹w=Î8=­91şě-Îé\¬\÷ďţ; ^ôŹ÷żwŢ]ݸ'G«#|¤űűËŹgË[÷äă€ő‘_ßíM{¬Gáë•´§•&ĄP˝łß÷>ěýň+íťďŃŢw{”Ňôţ€Ç”°˛ěýľ'ąđŹ/÷Ž÷ţUĹBaĺţ Vö¸$ÚhüŚ)RRř!¬ ”3űCĆtµÖ_ĂŁĺ`ČúđŚ÷×·ČÇAôJR??䚲č #†*űy6rĘUę>us…żł~ÁÎ0Řú˘5c}OŤ~âŠÇţlĄ›şÎ%§„2Ţ‚䤴U®¶(Ł*¦1ĚI‹{i€üW· -ĹË'r”^„ů˝;őÂm9áő2zkŰ«»5ü5Ň6Q§——ŘšĽ==Ăfć?·Ř¤ĽÔęß§aę ݱŮ^‹÷K¬ŃaÍMáZŠ—*|Ň}‹ÁB˝ˇ(%ÚŢÔÁ\qŢź@psc3-!úgrpÓ?é ´ %sÇŞŕ/ţě?,[0TB%„¦D J¸(îKĉDJHŔAłŁű™6g†hnz•î̶9)Mą=ߡ†u,›sG çśč¨Â·!ă¤AÄKBK•…ȇJ N¨‘1ŃńÉxŚ–:>v†ú…ţ:JC_´üٲĺZŮaX$Ű2-[ŢM¶ŞäD•G·Q°6á†"Iĺf ŇMAyíĆPÓŮŁËŃÁtżÁµ@!ßČÂçc%ů´±ýYĚ÷íh¶0ńĆ‚ŞbĹč#±űRčá©~€DGJ”Čd*V« \‰´ 2Uh' ¨‰:9 \e€v¸ ˙îh¸Ń|ôĆ;rxŇWR=—ž€ăaŰč őPŠp%7ĆŔhŮŃ…!JgJa˘`­&đEŇ.ČUŮ |Až,_7ŔŠ’L\.TKs"DąŐŇpků\lA‡z§ ęž@u´*HÁĘL6¨µÚŔIŰ TeT°A•´A®`V°A„ő‡oçŘ!üŚn±$şAë4lPt´”¤(rőu°Vř"i䀪l€ 6 ¦łé˘!3e]ý2PÍ6ÎĄ¤„TďzÖő UŞi®f˝ÖŞg_$­çP•žPAĎT§4?_•ç'řB˘ńíŰ)¤qČóťßŕ% –>ŕyÚŁkň_ŰĂt´§D«\Í}¬ŐľHÚ9 *{$ ‚="¨NöČÁWŮ#ÁěńťĚę!°±ł?ęńMÉ˙)ai‡”Báo™«©µ:ÄI;$TĺTpHŐÉ!9ř*‡$ř‚C"ľcě@ćń‡éxRą…á„‘TâŃę<·ę™"čL Ŕn/Ȳ Ffš.Ť‚µy!Iz! TđB Ę{!†z5jZ@Ib8Ëĺc%±”†şÜ šOގʱ.Ź#µPőĚr' šçú!=ĽßÍŞÇLv¨µÚÁIŰ!Te‡T°CŐĄkČÂş†źďbľŃ€›ţxcŠ©uÇý=Sv”ń¤×O|fşÄxGSh¨8‘«Ź¨µšÂI›"TeŠT0Eőz:›b{ü­ŘbSľĚ˙ä™)ÚĄ\ŃQą„Öąšó:X«r}‘´rs@UĘM@ĺFPvęsKz٤ĚĂĺc%ą ˝Qŕ¤ëµëd¦éďoĚáeÚŽŠ_&g7R Eĺ†gřĎČŽž‘Ąí‰óx¦Öę_$í™P•gPÁ3TjD«$°ü ˘úv±8zťĐ7őh D›@>ôÜ–‘¶ v9But„Đ„:“#ę`­ŽđEŇŽČU9"AŤć0(íçžáDkžĎÇJâEtÁ6đć“o >§Ç‹ÉĽŮťpxĹ.±“ě±)śiÂuá. ŹfŠŽ ‡ÁĎĺQx¬UáľHZá9 *…' ‚Â#¨Ůdń#ęűĐN<‚nľo ˝ %~sPúXIJqđ»qč<ÝܲÎĐą[D*ĹÓÍ€á«zPkŻ;zC«\­}¬Ő ľHÚ 9 */$ ‚"¨c4ÁřűIsŕ q&śŹ•„Ói±÷ă|şÔşgOX÷É©PöĚ`:š2Âi®ŽˇÖj_$m†P•PÁ Ôn3䀫̀ fŕlVVyÁ.#ĺěŮ.ݏo ±Ăe7KčąĚÔ?DÁÚ,Š$-‘*X"ĺ-Cí´D¸`‰ś·D ÷j:ŰżwJ€S#¨ă“WÇaŞa>}Őd,)t2ŁŹ•d,¤…bńdć–Ź'G‹ĆęáN0ió7Ö3-‰ˇÚŰz•ďxfWA3Ýa* Ö¦çP$©ç,PAĎ)(Żçęd†r>y…ŇH ĆLž#bĄ`5„i}Ö {®T-Üi"-˙ZղҫâAŤpÇ3Ü0RäŇl«U˛®DZ±*Á¶˝ÖDłĂĹôusĹ–ć¤Đ, –•ÂŇ Ţ)c¬Jčlrن7Ja„;móo>čň`M„6’xÇ3’8 Z”ą4^ką/’Vy¨Jć ¨ óŞËEKYřÂEK)>ŃRĚ7˛cÂoNěĽĘěţ¬ŠrI†1Oő>*-{Ńń<#.ŠÎu“ł:V«č]‰´ć3U’o' ŠŻ‰^ă…Ť5ęŠč2 “‹”BRpµ‰‘ łi.™„CYň,H>TŠÉŕîlă0Ů©“Y•ý(›ýČB?‘3ű‰ő’ĽV<ȆOzâÂ{ťëľłQ°V#ú"i'怪¬€ ^Ś RfĚÜ  vڍěÚ°†!ń^„<–Ź•ä*™goTáý ReóV’ WRóÍău?_+ŮßúśH¦‹ÍLKáUÇLăuĎý^Dă«Őíút…Gk}űw¸Ž×7ŕ„»łőÝMµ)‘ëtuî,đź®!ŠîăćJ±g~;ŔĎŰ(TMTkEŞ˝â›;L¬¶4WŚĽXŹA.őĹ×DąPĂ:VĂ{–ŔΰÖűĘX:Em¨ÄÍ ţĎoŁ&ë …„FĂwÚ…\vŰ4Ąű7…â˙NoqNˇL˙ ź^á羔۰Ţ:őE–—«uTúôo>Öż|kźśý§ąŤÓšH©ý÷?´q Z±9c®ÓXÝţ+đşYp8(T f„~ńI!kkVˇ&Đ„VßgĎ߯8Un«8!SřîŔÍm}]»j»…JŔ-ca€ĽvűŕA•]ü›2±ôőŠű´âţŞľĐ'xáÚ}Ô˝rőÎý˝Řž˝_VqOý‡]=ŻÜ“·.Ľ­ÍmO: ;áĄűŽ›w¸měÍď6đąS nůz{±úÍ=sÔđŔmŤ+ÍoŤ ŹěÖ¸4Ľ0:š6őĹ9ä$üsô•˝ą1†HčĹQţ|+o\‚ɉˇşŇjŃQ«RĂÇL&­ÖÁZµę‹Ř7ăÁ,pCc'#ÜOŞORşµąˇDË Úă몙9C}JŚ&Yé`|ňEě3”%ţ=_˘0Ďn.®ÝÁřÚĹŞąE$SˇáËN®WČg݆_ţvq;t“Vl€bť®—7s·ńŐefâ’7Ť6D™Z\ŤĆM‚©‹żZ{Oô{dÓP{®óă2m'ÝŃNĽźć˛S¬ŐNľ=íwf}źL¤”*™Ź•$“đPČ ˛ůňĂťóú·X…¶~‹ąqĽ¬¸K‚4vzVäţÁµëWÖţéĆ~gź¨ţé–í^+żéW0ęÉŃ–!#V ę@uąý(Hč¶Ń™‹5Ś‚ŮŁ“áy{C¸P&ěŚ~8[ĚqoôĂ-4e—˙fAô±ŇĐ÷”´Ü@áfČăĹôpÖX‹$  ŁĚb%ń„(á˝MĽ1®Ů~sdת.&[:7Aku˛Éú—ź‡lÍ71cd*W“ŚíŤ‚ě"FíJ·C¦c;„«¸Š\íP¬µňElÇĽĆmł×ËfKD Z+š •$“‚¨b“쇍6¦qíĎCćc%Ń HĎĚŮÜŽŐ?ŕŕ˝j(ĄŘšáµ_ ˙öÔźÉx,öÓäĺíÚ˝nsb|pvg÷4(ŽC?˙ÍđúÇÓKKă䭹Л‰ŽÍóqüć˛ěŰő©ý¸Ďľ?˘đś‰¸8}{é‡}«čS¦»Ä÷C2"áçNC¤5|Ń·¤H¶ez´9’]™C LéŁÄŢÜ×g‰5Îz ,Őe ‰ęئMgXrŤ©ęÁ0/'|×+ R@K}¸*™Őcýůí­…’ýëÓßlěžý1•žFo»7W˨żs_ćbýŢ=ZżřOŞţű0CuyíŢtz’ýýĂńWřúWöQŕvő 0ď±iY_˙óëŻĎ1Ŧýłkl‰ýţ«»›łĺ»«/ű7ż-Éjąn节hhm©đ‡âżüä&Ƥź)ă”ÂŕÉ@şĐçˇ*ţFuÇendstream endobj 9 0 obj << /Type /Page /Contents 10 0 R /Resources 8 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 8 0 obj << /Font << /F20 13 0 R /F19 6 0 R /F23 16 0 R /F8 19 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 2004 /Filter /FlateDecode >> stream xÚíZmsŰDţî_ˇŹŇ€Ż÷ţÂ7â„!Ą4&¶aŇŽŁ4žş¶±•~<»w'[Žd'A d2ťO§Ős»űěí®}4ěĽřŠÓ„1â”J†W gśÄN¬qÉđňMúj:ϸIo~Éş‚ëtpüM\-Va0ęĎű82éq~;ťäëđá6c)#2{;|Ů9vXBáŹ%Ž&Fâ„J&:?wŢĽĄÉe‡&/;”g“Ź0¦„9—|čH.âxÖtľŰČč‚nEĘnĂ&Ž8-pLb,l BµňŰ„—u9“2-Ű|yÜ#‚˛Íc÷â‰Ö5#,eu+ÂîÂäĚŞ0@y ›¤DŮv Q‘IA”ŢEö}fE:^Ő€)G´ăí ‹˛BÓśh»¬·řuYŠFťĺ ş.÷ű‚sËíŁJçđeřĐy¦Xš/Wţ˛Îç¸-×4-®ó0€;Ě~ÍWpwlLnVđĆ `^„ąŰńě&˝ů’.ăŽP©`ůď]\=”MÇx1éş#vDŤłH?˘§ă‹Y–ĂSĺuý+ş0®ś\{¤ ˙ao_‡5D6že]EÓ ę¨’Ä <Źę đ´ćOႚe E¸„EµÇ/hPą#s%Q÷ÄR»ˇ>ŁřüýÜ×ÎůçZá~EŘ>î—KçÉmĆ-řţ/0JŐäĆG;^\ܬć9Ž.á)* X}1ÇŃ/¦°éâÚĎ ë™b+Ôe†™Ş«ŽúŻű5=ď Dm ±JÜŻ'A¤0{ôeu+ÂĽžŞČ€Ëđ¬ÚĽĐ+ vó=n ݇5ŚÚ%T;٬Ă ( ¨TĹx~ŇCt§śÇuKj ¶7Ń”[şBőţóä}ťą’®źo«ôĂ;°č]m v}Ůék,‘¶-ún…íĄo\‚8Ź§ë‰ŹÁČß@ĺ®ů0‚ě6¸—Ć\… ×ľÂ!(E»›x*Ŕ%Ť~¸>P ŠŞ©ŁŠGŹš]}śz`¬łLđ-[Ď3§ŇRúý´·”uŻ„ Ńę]űť—ŁWmX7$–@r´&A\ČŞ6|rĚýäöŹ(®ÁfTVż'@ń(ŕ=Óm¨­°˝*.©çµCN];٬Ą†GíŔfŻëÉjzqÓ¤>•·¶1 2DŢ źČ_”°Ť˘ś)U&C0ÖéÇ)fAaş) Rp0ه'Aśµ•m…íO‚âšÇ$Am`Ü$A‡0–IPă`t4t˝óSztR;Ą„óá´ Ą¬ …ôŐccď ~Ű…jžÔ=ŤIŐCyÖ.V nĂť$ŕ]÷üP¶%żŮ Űď7qÍcü¦ Śż9„±ô› ĆŃëÁĐ ŔsĽBm@,e„(4%Rď ĽĎkŕˇ_<:µ]°‡Őäx (€ˇ¬SęžcJ<đď˛N´tLm…í=¦â’ę)°i Ôbş×Ŕ(„XK`٬`!Éĺ;PĎsů3ŕ»Á¶'òťYŢX¶[#LíMř™´<Şüx§n‡Ö|bi Í=<ôŕ:ŃVčŮ ŰzâšÇ„ž60nBĎ!Śeč©`Ü=˛úĂÓł×µřŁ8m;8KYq -‰á»8ĎOľůbĄˇL"Ĺiűgú Z>¦:ń!H5 vâ‚÷ Ó‚Ě6É;!|bş*ôăŮńßCŐŹěěb<Átő=vgoâ$ŹÄŠ’XĂëĽÎ#[îl´śŕĄ÷C|/ľ´ 5˝ńl†ă 3É€sď}?µţRĽÂ•/]+„?醝s(*ˇhŢá$PÝ÷“ĂW&Ţ&‹y1žÎ×aĆw•±Ř_ú[Óy‘ŻÖa¦M?ţ‰29Ë»AÖ ż'ض v ]Z9ÜşşŮt‹ )ˇYĽ.Ű Áe~‹·Ľ”sĽ ;˘;[YÎ6ëĆ>,WşÍńChŠăżw¸v › 7ŠEěsă´W>řßb÷{tţĘăjhV[éťéi—Ρ÷ĺ WÜ!ŚŤ„±p‡¬Bq:F`ąÂyz:÷gÁtěµ˙›gHÔľŕ xt!ŕDz7wŚ·4PçąîoÇpó@—2X‡Ýµ#’`9-‡}ÁEćż-{‚ŠÚçvÎ˙ĘUTŁ«đč**şJoš3x-0’sńlÓŤi?×đCFGŻÁ40Ä<b{ŽU,%¤rĎ®óźöô=®ŁžMfOŔÁ˘Ź3‹éćkhúz8ě‡Ń—}¨‹¤ŃĎ<˙¤ÁŇCֵѺ?dV† p¬7đżM‰ĹÎ6d¬JŰâÖpę¸gĺ? 7ÜăŽ7tŠ$”T@uJ‰1ˇ‡€i… đl‰ĺ–Žf9ęÍ` XŢaáŐÖ<_ţĆ‹®MÖ»ÄÁ”‹›Úď,ś%Ęuó_ř©eÓÝ í)•Hâ,óßĹi˘%O$¬p,va0˙({ J¦Ë1¶5}_>}̰×YąnÎs¨[ó˸ĆS‡Łâ:‹OŞôş `łe¸~N'ÓăłŢg8˙YٰĘ0× Ë/^Ľ¸Dݦéd‰M'âßż¸YMň+(Ď\şz—“y^Դ͵&&„F]żÄf ţ,c¦ü<\9ĄŽY%t*JSü÷‘űăendstream endobj 27 0 obj << /Type /Page /Contents 28 0 R /Resources 26 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 26 0 obj << /Font << /F20 13 0 R /F8 19 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 546 /Filter /FlateDecode >> stream xÚĄSKoÚ@ľűWěq­ÔËÎ>l/·HJŐś\Ň,`‰Ř.1Ióď;ë±€¶ÇĘ’ýÍ{ľ™ńu n”dÂYËŠ S „fY¦Dž9V¬ů¬¬b•ńăŻ8Ń*ĺ‹ń›ú@ŕţ®ş (ăc˙Z®ü Ż1p&~*¦Ń¤€I|€9É2› §-[=G?ŁÇ'ÉÖ‘dÓH írö†X pŽ=GFéďŁEôý”#Á$ÉE–뎆fN¸TŕR KYškˇŔžxhEÎf>żýô‹!Ç‚"ćT,ÂkŚCÓĚ€2ýŁĎąqaweO㑤€s·EŚĂ8˘‹§ŠŇmzÜź8¤„¤Ú|®DĎŕ\%ۤëŞč¨˙}$ZhĚ:a­ůź;ˇ<É9ťŠeF¸²đRRŁAÝŠ]`Ćön o–Ű y’Ţb-ůňÂLĆĘă6üş÷)ۡv×ĎÉZŢCŕű†Śő†ľăoŁ« żę¶‚·Ýź6łk1¨m†ÁşFgÉWMŃŐŻŹ‡•ßÔ±rü°ő˘ňí?·¨ŇTdL iL—oö¶§ —űĘ­Nůéý Çyďäendstream endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 29 0 obj << /Font << /F20 13 0 R /F23 16 0 R /F8 19 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 34 0 obj << /Length 1124 /Filter /FlateDecode >> stream xÚĄVŰnŰF}×Wě#™„ë˝qIćÍ© n‹¸±HóŔP”ĹF"U’˛›żď\–şD¶¦0ě˝ gçĚ93ë7óŮĹŰ\˛đVĚ—B›\ZU,S2Ď˝/>E:N´ÓÎGďÚŘäŃŘÇ:ę⦋L+8ŽĆ7Űřóüzöó|¦…‚- %˛4“…MEµ™ý=űôY‰ĹL‰ë™’¶ČĹĚ•ÔE!63glŻg·łß÷>”H¬‘i–źąÁ/ą¶óBˢ°˘ŻĹňÄEq$™IĄM3ôňQëLäŰ3l' &Śú;,Úzé”G~žŠĆf^*€÷T8Ž=%63÷ś'öěÇĺó\`oŹ«>KS¦ť4ÎL™«śŤÂz¤¨„ĺbWáNÓÁź3S­d Ş8şęv†=%l÷Ś#g€težĄÔç^šŁG:†Sď­ô€<_5*p˛r«Ý¦f5óö]sŹ«,KLôóÔÔËđy= IŐ7ŰU’§ý.ścW5ůk7Ńî>ş˝ú…'K,•žçoZXÝđ⊮żG¨¨ę]ŢŔÖ;É‹[“]u¸]óPu±É"ŇH"Ď$Hø⏭Σu3ŐnÝaËą]Lô¸™E+\ŻpÇ›šŹî`vŃ~Ű cß`Övc˝€ ťÍŁŰú¤KĐdž‡±\Ť)éč üP˛¨ŰŤáô(âŞ\ŻŃoI±|eLć®Ý·!’p;đŮn ‹G2Ń`ćŠ4Ú AIš‡¬}ĂM!µe?Ľ"j żç—7DĚŢâŤ-Dă·8·Ń+¸[Ůh8án˛lż¨Ç˛Y3`Sd'^IZÔ^ˇwýÄCŁfČÓ’hb×§~Ę‘M«ŽpmIşC=Ĺ_ź$‚›;!Ámh…ž¤±]›P5ykYÉ9)—(AbćKT2N>˘HŰ^\M±ßT†¤X·—'%mµ4@°–{Ó&Üs(Ę-A«ˇ §—ťu8hAßňě!+­·´ię~üߡ$řIŽčń1@çšr奇GßEˇC)#ݡ›ŘP—wT•Ľz­Âȯ€Ł„&lšqĹł}SNÓhOÄzˇ”4ŻŢ˙ô÷_NM'0 Á¬PXăöőĹľĆpsµE$ÝßíúŞ^v(Řţ®–m=žIÁx/3aAŽü]Ł ×4÷ŠGٔʓ<µ>J'*ţžm’żendstream endobj 33 0 obj << /Type /Page /Contents 34 0 R /Resources 32 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 32 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F14 40 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 43 0 obj << /Length 2029 /Filter /FlateDecode >> stream xÚ­X[sâĆ~çW¨ň$*F;şK9O„Ń–Ś$văJňŔ‚lë "äuíżOßÄ%­TΩ­őôĚt÷ôĺëžâ÷ahˇz¶VÇÓL# m­)µç °cŕ[®a»>j˘{¦ŻŕźÇţ9†î »÷_LŰ3ĺhgzţÎŰ÷ îýť9kŘ>°9ßÓÄ„ď¶_^¤éčW¨™ ćşäé–ciľ˛Ś@äYZőM}UbÎn¤Ě5•áBŞĎÔţKă‹5 ď;Š ¬¬ď¦Ď <Ă:eďśDćŮ®á36Gőľoú·<­^^‘nű۶őß”«VđÇÄ©Ł[J©ü±y7ŮkąáécTŁ’}D.ŰŞŢń~´ů†5ťuŕí¦¸Hw*Ń3ä»Á)3®/™⹦Öeć…W×r2XiŮ– /]ď$˝fđ®Ţ¶%wή9Ó’ŞďC-˛5ą#V¶Ë¶lŞĺćdáű×uń_Ś;Ő±'”ç`ęĘĺŘF)˙'@ÍJ8™Âˇ2[*8KjÄĽ¸?`:Şn„uÓĹ_LK)[´¸dđ.uVtť(óX€xÝ6ě_ÝČ>I/ `Ľđ…’SňäíplĄxnÍ#żt·ÉÍrp˛ÂÍÚÖ­„\Ú5u0ŞVÚěş$wč?¶„gVŔLT3•HjÜkű®w”˘»EŢŹ—Ç+Ýpr­g÷̪‰‹čhZŐţŢTmŰ?:,ÎpłeĐÎťnĺ_ÜĹ4ÉŃUSĎłIńąoš–Íc\˛ônëTĚщ ťř”ŚcX3Ďđ‰Çb3ó(Cö§9źÜ9-cšĄ$8ĎyÍNZF٬'C”Yp\§ë‡älß«~`"šŤ‘đ€xâ•ř6ÔŕIąHds‘|xLa9éöEĽózÍ ˛šdďDf6Jădv/s±‘%gp ť&f'E Ç8­Ůť*ă ö$bn !¦’Ä93eŢ|ľxŽ MŃPXІäJšOĚCAbŇąYĚş@ ® ŠC4®{k ʇL€9ŁE SŮÇçŹčrŽŔĹJHAbśäŁ4JČ×čüÓ(ăOČaFŤů4JSažqĘ«§I€Ĺ­^B¤ôˇ /M˘a*4{ËÚpN0AbśĚăQqÇ“d†SŕÝ»ôAÚÉ˙±Ř‹ÁME"‡ĄG’ # ş­ř\ż „Ç4"S@Ób)đ—A€nRPĆÇű(e†1z=D8Ü# ěŔŁçľ—.0ŢNŕ?&łL@&Ł'„B$ KŮ-SG‹yLpĂDYvHÄ1_ ó")EĚó{Śn6Î…k.\ŚTÄň§dăô?Ľ“f9ńGŤ‹<–§6LĆŘc"üîRŻX%Ţ1ogéx$°"„!§8_ňć‹Ń”©Ëâínዟ’löLÍ ×uţýŻIŃ38)˘ßŕ~`ŇĎ3<ÇŇŕ€ďtj˘ô§GľTáq±|éŢţ0{ďŰđč?ŰćÍ] Ďľr-<üdęřdu]ýř&Ţěy“źőŽ>ÎF?âúŹ]Zä9 ĆĽâ;¦Ý˙ôáĂš^qújż§áůđą*źküâk^JcW¶WďYËó _ł ¸¨ď#>Ş6ß8ÎŹ–R^¸¶§{]*ţp˘°#endstream endobj 42 0 obj << /Type /Page /Contents 43 0 R /Resources 41 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 41 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 1179 /Filter /FlateDecode >> stream xÚťVK“›8ľűWč¶P @AnÉĚîav«6[ă=ĄrŔ€m6ŘxAÎŚ÷×o?Ćcg©ÔÄ-©őu÷×ńią¸ű-ąĚS%–kĹ™Ta.Ś e–ĄbY}ń”D*Ö±÷qĺ±ńşŁőĄ”w_´íĘŹĽ˘ôaűŰŕ]>.~]."ÂżHäˇ0‰‘ąJDą[ü»řň5Ő"Ź‹PŞ<Ď ‡2Ęs±[čX9ą]<-ţš0B¨X&&»‚˙ŔAtZ§"’y®D_‹őD~&N¤J ˘|Â##2:ĺ µÔłSá_Ĺ©TęP‹ÎŹĽQ&•!„÷#w4#Ę€š~ ‰śŢí¸Ň,“1änŠ+\K ,Ň'LË,Ě(2L˘ŠĽňFy4‰wŹ9l[ř©„ĂëT&Q(¨‹™ąźtZÇŚ°Ţ@:†Ä‡ń›iMłTĆç¬Î+9Ô2×Z¤:‘&Ž)ö嶆óĚűŁŮűqî_piĽ§‡ßYXw= Ţźyń·"ď{;%JőŔ(´č)ó,RŘěÝÁÉÝŹę¶éPvgv[X†Ý,‘Đ#„unťšk BO0Ýqn˝Ŕ¬µ6pâŰ 1o@-‡Ś•€ˇű™‚¤#ýac4;Đ Ë'>¶Č’ŽŹhˇac%Cj7ěóÁú{űĂŢĂL»Łvůzv°ĹžőP®_čBy´ăÝŠńGŠŃ]ä¦.ĆSôäů‚ŮŠX /řXˇÚ‰ëô×{‘Şö;ÔíZúAbB¨ťŰJdáe4ŢRu€ŇőšI¤żŰ˙20ČM.ń`ĆĄó ×,Ł÷ýh9PF_fýâş|čnĐ09™dŁ“S™ŹNâ©„9Ý„Rô’ v©”ę]ןś˛_±| QŐŐýwôĘ]š[§Ŕ°˙ , /¨ŕ¶eq_×Ő€Ů×ÉhçŔő[NwRçýţ"\~ĘŠX€ń§Ľ#" ä–ew©ü*Ţź•©]ő"zöß+ž@qG™ŔšÝ2G•ëýHÓ®ł?ő>Ů?’->©¨Í ^4.‰›ľ±\±™ö€­`,Ý ŰÍ\®ŮÔźęaęőUÓ2—„r] ÝšKµšÓ9ĎÔ¤°†~V™áˇŚycD Ö´łn ’V®őyĹuŤ±vŚL :+ç~˙«A7Nób¸ŕÎőpÁ]jĄvŇu»S˙Î*?¸ÁOc[‘*çÄuÖ —’Ff<ËkVmwĄăß©YŰ7ç'b¬ <šZ<ç)IËÍühd 6¦”ÜqÎŮNßs˙4ŘzçT{ţ-čtAuvć?]{Ő\7H™ż)ěuQrxňęsPIçD.“D˙üaŕp‚3˝ýq"ŕŮË"|üóT¦đÝŁA#ŹÜÓŹ|c8$ AŠ $^=űŠ”é÷5YWN§‚H:Ď­Ä›8k|HŤżŢżĂýw#oîÓśŮ"cöđáî®Â<Â[JDK˛ßű˛^w~SË}mŕâŰ&NSi„’!<ň÷ĄÝžř«\żçß8 S?Č•zfLĹ˙AŹ×}endstream endobj 45 0 obj << /Type /Page /Contents 46 0 R /Resources 44 0 R /MediaBox [0 0 595.276 841.89] /Parent 47 0 R >> endobj 44 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 50 0 obj << /Length 2435 /Filter /FlateDecode >> stream xÚí\ŰrŰ8}×Wđ‘Ş"¸_öM±•‰2Ží•”IMĄňൕÄ[Ží••™Ę~ý6CŇX¨©(ë¸bĘbłuĐ}şŃ P|ľ={ˇ3ŚdŮňCF¨F ›L)Ś´–Ůňę]ÎÇáʰ|ůi5.ăůä|LňŮřýňŐhş‘ ĂÉ Î”PČ0‘]~ýgôî=ήF8{5Âťý Ż1"ĆdźGś2˙úf´ýłÖł‚Q$”î¨Čţ ˙K™ĹČeF1,[ݞ-ŕ( eµ<·C$*Ó0FéĆȇ!z7ÄoĆBDó,Đ3„†)‰0 owš ¦@ŚÇ49 ^®\RkDÁUő¸LFŕ2!ĘŽ(§™Âi¬Ë‘9ź)™OŔeçź ‚‘z‰ŽS§©prEś‚‡1ŤúOj‰hă>`KMQ8-%ARšr€§źWvX- 0†áÜą'ę!X %@ŇJL×`žőÝlĄY~yGš_Á{`=’wő°:pČ]Ś@FҧCx Šđ\[»e% x ‘S÷Ý④;°ţíĂćâv ®Ř<ü<.”Tůbłţ'.­[6_¬×VŐ©‹Ű+羥˝âë}éĂnMŕcÉy”b’é­©•´Đśl‹9g·×kłë‹›k{üďŦ<ŢÝ:›ŐĆ›Ż>^;Îí kăF¸cL!aÂ?d$PBdΉ7»¤Cžm›ťo1űńő$ŕáö×jýő)“üuňC&$’JÄN©¤L#ˇďnžń8GĐ#ä¶YÖE¸‚9W\ß~|ňĂŁü cˇţy~nß˝»®NÚ·^.—çnnXiWD¶]ĆŔ÷”ţżúŚbhŽ4öáĐí(ę=B˝GôŹĽ™ŻţĺĚĽX­ýtáÍŢgň§(Ů!J íiRąâKÚmRŤ‘ľIĺĐĎ}ů>ÓýyÓmRECMf%âXqF:ť&‡ŘrwTL*¤‡` §¬`<¬¬Ľ2÷ĘK÷ ‘Ů µ›Q‘qAËzÔ·QEŐG)áú(’_5MT»÷$p!ŚĽţŚÇcĺÔé*Üe[ŤXő Ăľ…F×H>ÔrŔÎÔ («Đ­-č›óÓóoMD©)Ó:3qŞ¶Ż«0Ŕ{WVŠJW(ë Ť2†Ńő–Ní â`lĆŇ ňşâ¨ FŚjZĽ9‚h:šÂŻĹÂĄÉw–eř}ÇŠ"ĆôSŞ “Ł€yÝř ‹*čŕ4đU›DÍWş_„´ˇ‰řÚ(ć«—‰ó5ŞšŻ1TžŻ¨ŮéocBU>9™wđ0Od5Ż+ŽĎhÄ•i|99=>™úH*î $­ŕŐwHTÁ±"6B*Ů!6ۇŘÜ/R%âFŮ0±˝LśŘ)PŐÄŽˇňÄ@íDěřjbÇđUÄžŰŇşě\ć“×ÁL'=“…AŠŇdA 59©š»Ś3¤Ł|˝ř˝u™*Jyđ9ˇ,ĺeĂ”÷2qʧ@US>†ĘS>uöfyuÇ‹6 -ÔŚI°y]qltbŇ÷m§=y\"éA­C7Üp\!ŠY'­‹}8N%’Z'âxŁlă^&Îń¨jŽÇPyŽ ¶r<¶šă1lÇpŻmŮ˙úln3űďn‘ę]as:ÁĽKwµ¬V‡@÷6Ď·ĐÝş\îĂsl eO•ËeĂ<÷2qž§@Uó<†Ęó<5;ť-ŰEč2HRÄ {ę [ŇŮ ÄÍ’4´S„¨=kA“†¸˛AâV2Qâ&AU7ŠĘ7µKÝť_UwGńůş;x\®ÍµKőLäŕ7)Áş‰%5Ľ“şő> 8DOŤ˛áđ2ńHŞŽ€*¨ť" ľ:břŞľ™źTu¸+Ntűˇ81?Ęíţ夾aZiĹ;Ó€Ů'´."Q Ôş†CŔ‰Ä# ¤:"<˙D;Ń?¸šýpůt ›ýç%Ŕßf–ývą~Ú Bz—ţΗ© ÉÁ:Jw× ŚďCtf ©Ţ(¦ş—‰s=Şšě1Tží¨ç“.Ë$O!ÓŔňşâ° ąKĂZ¸ćÓĹůŮ颤6­ęÂzÚP]îP\¦§Äđ†ďš•Öëăű>ś0q śhýĄŃ5Ěv''{H5×#<ŐD;%öŕęÄW%öÝÄŢ™r´śťť¶*{ŇÓ6WЇ±đ‚UÓˇRgÝEtËń}6E)†ěÁe"’7ʆYîeâ4OŞćy •'zęĹět¶xŮ. dĎžŚý.ŔÓňK°ÝS1•Á¤ĹYo6Ţg—“Ř%vBŇ05P6ČÔJ&ĘÔ$¨*¦FQ9¦† ĘeÂľňC'ÂĺuĹqAůˇ(i{S…Î'ł[oWká„ô,´(…ůAďÔÇJç„6węsÖ_“ďłJʆ6Qţ” G…—‰GE TuTÄPů¨@Ejň$°Şš< Ë×ä!.{Çňë¸ű—Öć1=U9 Ѝ HĽ!ľ2H’ŢşeźÍQ"(b<ŃÍ\˛aŢ{™8ďS ŞyCĺy€šśĚ-ˇlĘ…€zř÷oQ2 }ĄIPVş˘(–HÓ‚9źţ2[,§óéq«Ä˘pżď˝ŁÜÎ.c(P,MÍ^F5L˝Y{ź-OűÝݱ(fŻ—‰ł7Şš˝1Tž˝¨SËŰĺ[ËŰł’ÇżvŮ«¦* ĘJW%îQÉ۶›ĎÇŚägĺ:˘Kăe«IűnMTióť¶” Ú°•DsąĎ)±úT˘ťý@Ů0Í˝Lść)PŐ4ʎň4@-Îě’óŻU˘î–ď’Ęr^Wٱ;ťmË˝ťĎ–Óp!…öŢ”(ˇÄˇ‡¸t(YSťh†éÍďűě‹(Ě-ʆ‰ďeâÄOŞ&~ •'~jgâ§ŔX?†±"~r>ťÔÝ*í»IQjdÄÁ/ú@…sÂ:ßB«A©% ÔlüńOK)Ľž˘QäŚ/2`…ý:(48; ä a$°ÂÇż`‚ç÷í_+÷ןc†ó‹ŕ´;y»Z_lVW^ćzóÉ˝Ú|ű+Eţ©z^ĆÍ˝;y÷ÁŹĎŽ~˛ď˙Tf ¸ť—̧Ť}ÎŔý?ž=»˛_ĂůĺýýŘÝZ”?Ü}Y_®>ÜŤ©É×WčvµéĐ„J‰TĆöŹúxeźqóŐ>§†ĺügw„’AŽ -t©ĆşâĘťKŞendstream endobj 49 0 obj << /Type /Page /Contents 50 0 R /Resources 48 0 R /MediaBox [0 0 595.276 841.89] /Parent 47 0 R >> endobj 48 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 2951 /Filter /FlateDecode >> stream xÚÝ\ŰrŰ8}÷W葪!¸Ř7_wśqŻ-oÍV6Š,ŰŞ8’W’'“ýúíŔ›I®j'NĄĘ˘„fó q}@9ě˝9É–X-“›ă9Ôڎ$Ďő`rý!“ÓƊlr7Ž„Ůţůe§ĂŹ“·{Ç“=6 đŹ ,ej0ű˛÷ź˝éŕzŹŢîQ"l>ř Ç”0k_ö$ář~ďr累8ŐĽ<Á‡×ŕ‚P­<4Â,±Ľ9§UO¨"FS´»:ź?…Ëą….˛Ňßł‘ÂtŁ.|ŤjÎô:".,otฅJ2˘„H*řŠŁ’’XÓuůţbú+ ;ŕc٤…ŃBGRE.řŠc´šäO"wp:>6ć"ű€@GśŠŹž5şhCŕě4…śsť1˝€ =€1Q•ep)şK€ˇ,QTÎúÓ ŘÄÓ Ş2 b¨BÔ@˝8 R`,Ó †±HČĂ÷m<>>t!dörA¶sÁJ˘˙>s3.K† Ę PŕŞAp¶ÁužCäu‚לőĽ°‰< Ş‚ŕQTžŕuPďŻ&Čž“¶x¦elÁW›ź”5Ŕµ˛Ż1׫6żsA´y…s=g¬6»C/¬‘ťł;ß…ü çŚć‰Č_9ë'°‰“?Ş’ü1Tü5Pg§—$Ö¸I,Ý&–±€Çľv±łQŞb©DhŰ9E‹]XŞ€<Ü$bi嬟ĄÁ&ÎҨJ–ĆP–Ö@MNß!IŹ`Ş<!Q95mž2¨›Ć™¨ś3šá‚O"*MLŹV»Q(’ŰTÓe嬟Á&NĨJ"ĆP"Ö@˝T 'ÁXá(Ć †‘»¸ –ˇ¨ąZ8LëyÇ´nŻpZçÔšŚ ݵéÔ j—`9‘*O”•łţ6ńHŞL€Ş5P‡űcĚ€ă377DŁ=“qţcĎĹÔV<ĉXuÎĂzB)ś™††•ł~›8 S *iChXuyup A=Ľ8Eî´0 Ć řN‚±đĹ(‚uW3rWăýˇŕ١KóI+c`­×‘1lV«Ô)ĂY^M—Ş{ô‚٧ –m*O4]Öśőň´°‰ň4 Ş‚§QTž§uPWăË+ęÁ%0µĄ‚YŇÄ­đE( n8“7!V,ÝG^v2•w1ŐÉţ Qa­źWdÔśä:ď¬Ýů.dÔš0%‘±rÖOĆ`'c T%c¨k Ćď'§'ŐµU+‘ÔiŔ_qpV’\‰şľŮď䊮] ś)%ű+¤+g´ä/„Ţ9™î˛!§dN t/ +gýü 6qţ¦@Uň7†*đ·ętüĎ!ă&Ű?;=jSX*E-řŠăłŔ>c÷ÝşëďWďÂăĆ˝ZŐYë)Đźýő·*8ă"c*đ™I˘,oÍÇbÇť5% 'ňDĚ5gý|6q>§@Uň9†*đąęäô ‰Ň‚fŃܦ|šŕ»Ö lP+Zj¤-Żua'µ|Eq *‰6b†5ďl\5÷˝U—B19ˇě5,>ýćGH@n91R¶ ŠŘqçO1A’ĺ_é«?ýĽI<ű@*“/)ä^…čąÔK€«ĚĽ®"ń*`Ĺ­ĹýŁvţY"8O®p‡Ë^Łlc{n,Ş.yÉǤţ^7ÚŤ© ĄÄRŐ™o»l6J«Aź&J¸šłŢŚ+l˘)—U‘sQT>é ~kß0×ĐAfŇŔ ľâ° ČuXrÔqu;naq›Ë4¸‚Ż(.XbËY×oďÎęŰ]ŞëyX= Á_ýł]ŚńŞÂ´Č•čT »ě«J’lžčŮ®šłţ„ 6ń„LŞLČŞ5P]ćşĹÓ€ržâŚ$Z4ŐŻđLçî•aę‡Ü_ŕ4ŻiBLs%:kÔ.;ĽRqd˘§ÁjÎúS"ŘÄS"Ş2%b¨BJÔ@ťŽ'Çăýł¶ú2D™< ¶ÂW›` V/Ş1` őeë|Z‡˛ďtăŤs-ę‹â8 ‹<ßM÷„=W<»z?.áĎ {ş…Ĺjąńm ř¶ÄCh(ěqOččW˙ăţů©?MŮzľ}\WgMý9ż•Φkt7÷WáyöÍ›¬nüç|˝^­·|ćŮő<ŔŘ®üďîhvŽ>9›ę~XŻ>Áßűů´ gΗłŐŁ¶[wíuâÚ‡Bľ3b•Ď÷k4vî—·0ţ’{Ó?ŠsfŹ[l\-!ÄŇ0"Ćk¦"Űx“-Ä,‹Í6´mďĽ <=E óĐ[4ÖÓĺµo@´«!7B¸ĐuiŕÁ}rhç7ţ´ÎŠ.Pß´ &_ď¦ŰĐŻé ÝŢ5‚ŕ©QŚ„µ-|CĽ«}™O—Ś€Ů…ëôM pŽ°Îł®Ń‰ńţ0Ćnć~X¦T°Ľ)®íü!ĘPú¦&U;Ďš†ëŐ©ňŕ‡›]  ý+އ‹|™'ľămV”|ÄwRDŔ>Ĺ$ÁŻ‹Ą˙ÜúŘÂŃlřöÇ–tĽş"”v›ť­éM–Ó—8˝á2¸Ľs_;Ţ^©9rSčrÜŘÔţő ţĘkůb†w7{ ‰)Ĺ49.ˇ,QVvÓŢŚÓëËťIÁ—?ňĆ]]äŚ@˘U]´b`pw‚ąu†€Óçˇă“–çí>âý­Ľ4}ţµ!1Uwi)|ŤjÎ:Ŕ)ëŃתĆLCqT‰`_ĎŔŇ@Ű„uy…B‡Ç——Ŕ_ٞľ~|ŠU1N(…hWCň§‡VrďkäĎz–qhŻ(ʤ§ 2jĎ Ć›\¸Ý€Ź‘öi5d’Ď…Ý ”MÝ=Áר欅‰1Pĺąikł:Ą¤J*řŠŁâP‰* ‡cĆSő#a,Ę—<6‹ŰĺâߔɢŕܨY1'şŁP?@ź¬\1(Ëń4”LŤĄßÍ®®’oCťv-›ÇŮĚ»Ţçńţţ~ÂúŞ‘‚)÷d’ÍW8cę żů‚ájŠüşzÜx$ťeół—MFÜŞF%Ř–őŇdµĽ˙†G ˘«Uč(´…ŽC[ŮqŁ]·|ÝýŚbľőĆ·óĺ|=ÝVÂÄťř)$ďd®B·.bŤ_Ńp.Ľ)*¬ëŃĚ—ÁÍ ţr_ŔÝ® ¨PŰí<\±pWkWÁĺÜÉ6wµŐú3D\SŢÔĚ (żňŇ÷[˙“+¶°Â*C‡A÷ĺCą?÷QÎöä‹“>`é:šç>–ë­·ńW2ÎgČť7E†Üň2âłoŔAwÁJP‚˲®ęÍ!‘„JP˝kŽúŞwaR«ŢĽŻzż×˙±zł\•?S˝™Í‰/ŞŢ…i’ę]sÖ_˝ëŕz«wXEőŽĂ Ő»ËoŮëî-{«`É“ ,|ĹrŐŘPGřË>ŽęŃŮq#†ö*Śmľ… hŢ«0d>«đśÂ(ě’(Śšł^…QÖ«0’ *FUPuT@ŕ.î2 ’Ž‹4Ř‚Ż86HAŞyŰ/űŽ·OĹŹŔ×be—řę$±¸uEră«· Öö÷ľ˘ť«bľFcvÖ+˙9ő=‹^lZlüçrĺ.¤‹SÖs_3oń´ĹÝrő:X|S/qµD[ݨóţfÍýâÚ/ff'ČÚő߂ąŠň’gÚú˙/ďgT9ňŁŁŇß´†ÓDĂě#±x±p »W¨M%ł‡é­ë«˙öu((F¤löŤNj9Ĺ6‹íť?*5ŠRŮ]ˇÄî|Ł“đyôţđ'üý§BB;”ۇż˝ysíî}dł‡§ đú«Çől~łr›­oç•ÔSFq­‰BĄßŚyë„Ô7?ňg˙É)ŐĂQ®„öŹ˝áPü ’endstream endobj 52 0 obj << /Type /Page /Contents 53 0 R /Resources 51 0 R /MediaBox [0 0 595.276 841.89] /Parent 47 0 R >> endobj 51 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F17 37 0 R /F19 6 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 59 0 obj << /Length 2264 /Filter /FlateDecode >> stream xÚÍš[oŰ6Çßý)ô(cË»¤˝eKЦ[Ú.M ]4[N„ů6ImĐ~úťĂ‹LÇ–l¬BQ¨)ńđđOŠŇďđ0?ßMž=ϢśäZDw‹ńŚšGiJI–éčnţ>–Ó„É4ńÝC9M„ńĹ›)‹Ż§î^N®î&,˘đŹE9ŤR•’\¨h¶šü;y˙Fó Ť^N(y=B™–çŃj"ąpĺĺäíä÷ÎŤÁ‰JłC˛sÁ%ş@ĄR»Ë}/ HIR®P):úGÉŇ(aj;L ţ"obFI`LڧŁbŠ“śfQŕnX—P9Qą<.L[g‰$í÷eZRđeKÖřČuN‰Ę‚!ćc$WĘŚŠ\É(Ą‚h‘™AľĂ÷ęÍáÁ4Ë:ÓÓŹŹPxĘÇ`â}%ł#âĚ&¬PÜŐ,-Á~$YÎ× Y–Hľ/ëúŐSĆu|ńŰőĺS…ś§DI>ŠBďkX! ^ŹtOá›iď$<ŮŰ‹xASżO\RüďĂSÍŠqB©Ś‚ĹóżˇäÖWb[ť|7Đ^QŢ˙Ң(šĺÝŘyşű6A˝†§(3ĺÖň‘… ĄŔł·;ů<a0‰ÇWŚó•Î41&‰†I …®c3-Ő8ŞśŻaUG&öTÁ2>¶‚™¦$çbmÎ×°6¨Łšďi{s+”í±ĂwZRcŇT÷ëę/Ę$,é˛U.iÜ>ŔEŃ"“ňxłĆ[±©ń^Ż6uéjö×4q÷¶E]¬Ę®X\Ămçu‹NĽŮ”s×jă~ˇęÁµ^|„‹ő¬­ cÓYŐŘŠő¦ĹˇŔtŔ+Ş`-'ţí…a|š*ËjŤÉ4QJÄ·FŔÂęB%‰Đ®Ë”îş„ňîń4žˇöľÂBąžň,n 4´Z őbăÜ—Ĺ M\ŐžîĐÖÍtTá\â}×GŃVP4  Ö7ěćîíĆeŞę=Ü›Ţ×jaf…îMÇîqH|8óvPmY7äH€ˇ)#đůúč pÔx“ :}ŃÁŮşľat ´&Zńáč@Ą9–śxÓQ˘ŔYtŠëŤF‘ĺŁaY.:e˝~w÷úůAXŔ2!ó(ŇĽŻaiŔĘ2¶'톯.»ÂPÇďá ľIđ?ďŤ ‚%óýÄ(ŠÁRí‰ ”"ž śŮ(ÁÎWo@¨ęŤĆäĂ!I.$]µLÁĂŃbYÎŐ ,˛( e˝¸0Ëői ËŚţ €Eڱ<ă»@€g .J[x{ů«- lťYě ŁM•itü„˙•¶¶0Hýl-,±db»»źX( f>GiČVĽZş> çËŇ8 68ČS’fr†n{-¬p,Ëe'}fAlb eł-fś:ŘG›—ź][űł(­•é§bé}Tk×Á;/ť ěۡ‰ŞŚî˛öS„MWĄá´iůyš‰ř¬e–)Ů×Ă:pÔkoŔZőÁúl]gĂZç_Mk©ŕĂ‘ž µÔ°lřY´ö¦ŁĐ:pÖOëP\/­G‘ĺi=,ËŃ:”5Hë1¤u´”ćiJ»ąÂęćő-nć˙tŰřٲŮÁşů~Ť˘XÚ‹l /ĽK» !Ű™Ť‚읯^dŞz‘=†$Źě!I٤AdŹ!Ë#{H–Cv ëć –ěźÇťĂ÷ę8˛áł ”6w•YcÁě‘7›Ź÷öVíwĹÍć#–-xť‹ÂlWˇ03uµkĎÁą ´whW*.PŔ˛ř{YÚC9l»Yy¬/M.ŔŠ+ĄaśđĘZJŰlřfk6á]Ö @ÚĂV>ĎňřfÓŔXSÖ †Tű}ycď×ĺż+'V1 ăZąŇ˘kiMWćÂŹĎö›­ť÷z¤ đNkăt#ÚÚˇŠ‡˛r6Ź8›úźc¨ZÁ­żŐŁ>T{“ŐşŐgëú†űj!(I…&µĽł˛îŢtRÎúIŠë%ő(˛<©‡e9R‡˛®_]ßíĺ˛ŐP.;x$ßQňřO ((`GČ“ôvŁ`0pÖËÁPX/GQĺI8¨Ęˇ0TeÇAş>.üX¶Ř'!ë¨ĂvyUĹă·P6[.…›5gZ,벛퍹ţŰ~Đdŕ¦IínŻXV_Ę90–ŰĹ)·ýÄ‚IL›vs—e†>-¬[CĽiň®•qč…Ď-„•Těma«gŐIŽŮoÜ JéëO¦ŮV»M¤Ý6 5<ľđ]4+ćsŰűAS,íÝ}I_öłÁ¦YŰ–BŰĆŠh*`óŰq­ĹĚsmš0_ŽőIëŤüXÁ†Ţ”L4p$oĽń‰c›/‡Ýjµ´n,›űđô…)ĚÚŁ™d.ń m„ÍiਏxŢ$ ^ÚGĽłu}CâqŞIFŮ0ń8ËI¦ř9Äó¦Ł/pÖOĽP\/ńF‘ĺ‰7,Ë/”uÎ9ó »sćA…ţś9Txi¶¨oA.KĎĺtËÁÂů~¸Ś˘DHÂe–Q˘aÚNqŮŰŤÂĺŔY/—Ca˝\E•çň *ÇĺPŐ‰3ćQ´ů3ćAmîŚ9Ôvy ÷ fć´¤/łL]ŔŔÓÝi'Ţív_ÍĚĂ«ÚvTD롣Zk±-šĆŢúßXu0¶ť> endobj 57 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F27 56 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 62 0 obj << /Length 2426 /Filter /FlateDecode >> stream xÚÍZ]s۶}ׯŕ#5Ť|’ŕ}s§u¦u|c7/i‰˛5#‰ŞL'×˙ţîb ú Ą©9ťŚg,\.€%ÎÁ‚oîŻßۤ`E¦’»i"¤eŠIžsfm–ÜMľ¤z8:/Tz÷P GJéôâf(Ň«á׻˻H8ü‰¤ŕInrV(“Śż_ľňd2ŕɇgްÉ(s&Š"Y ´Tľ<Üţ»ńÁ“‘’ĚäöЅ޸] RťůË]/#€2ĘĄaĘäčč öR䉅nfÔM ţ’`âzÉ O‚Ůý^ #YÁmąëĆĄLÁLˇŹËČŮHi–·űrOrđE%2>ŇŬŕĚب‹E"+Śq}„˘4:Éąb™˛®“âÄ]ßöL­Ýžž>Ća–ŹMŕ(řEÎŽ€30š1¸ËX™űž`y_'`e"Ĺ.¬«ëĎC!łôâ÷«wűĄĚ™Ń˛„ÁW7B©Ľůî¬~úŢËܤ_`vG‚ĂűuŞ’q®“(fţqěiIľFôÔÉWí —íď*‚â¶ŘtYćŰ% îg0yÚÂGâĆÇ€ç`wr0vÇĹűEÎ0 ˇY; _ #­M?¨ĽŻnTbÂŞT˝ÇWdśRőÍűęĆ÷x&w§âpíPfŕď?Îî—3濸ĐŐ#RO‘6PQ6xaÓ’ę(ţáz…÷ŔP¤Źţź`užÎ–CiÓ¦&#硢'§P|ZÂż1š7łzéźđ­aëîáďC“Ąĺ|6 6iS6ôđ6>§*WSbŤCă Á+t"SJ 5z«ˇ«S´]Ž˙Üj8’yęş2žá(¤ŻĐH¦ßđ©†Ęł%ýŢWËj]νŶł* 64<ó)µµŔ ěęý(ď·ô¬$čťH§őzQM¨ö/nxĹîq@´NJ©íSł˝±s•c¬{(×8\4rŐš†ď uH9` ´$č˛^ÓoÄö°vĂŐĐťĹ,ę‡rýČSoě†y]AĂPçBéŰśFçőPĐd\0X˝^®F"Gmj$Dj¤hS#găúŐÉ2–Ů­FL^0ŕ®sÔH0íEŤDÎÚŐH ®UŤô+¨‘nX^ŤÄ°ÎQ#} ܨ‘N„AŤÄo/?Bť~Ć=ÂŰKŻLF˙µ*“(~~e‚ Äm‹21xů´0ńf˝č’­ŻVYˇjU%}@ ˘¤ ’×$¤’¤`A‘tó‚$‘ű#v_“€E’…D J-Št]5OČaK$C¬¨QGĚźéâĐ3y WWcďéĎ>±ş®›ŇĎôů aX»sĚ_zË!4M›·Ë˙5óśYq¡ŢuxáÔǸZ5#R/Ęd°Ö;\}űôíµÉz¶˘ća0ö۲Á%"´=’°ďrrŘĐČVGšş„ë#ť€-‰ęOZAšeß3]oô$]TTTßgcW–éŐ»×$—p¶ăj2ušs¶¦±‘JąÍŤ ĄO&őVĹ=’$YÖ^›¬«iôLMż% • š†^Ĺ*Ż$×ßgAVÇ‹†)Ö6{ą`‰µ –` \ŕů!ˇ[&…:„°vŃ"ZČ™-YńbŐ˘5ÄĄ8‘CŃ ňě¬J0íEµDÎÚUK ®Uµô+¨–nX^µÄ°Ţ\Ŕ®řEÁ¬ĚúÁć}uc“\1›‰lź.ńeşĹYýx}»«WT—^‰"§˝Rô W”¶MŻhKč“‚%Řő˘X"g­’%ÖŞYzADK'*ŻZbTo.”‡Ůč—÷ŐŤK˝ëÓĺ퍋ŰŐ’1.tK*EKűcűđ†‹»¨‚´‰˛NÖ„,Ý%ö™ŃNß©›N×őÂ{ň)˛u‰şńUĐęŁËˇřűő”~Kr2öŇU•ĎČ –€đ.ś:ŮÉ`WrO¨:—Ţ2µ‡éë§6Ŕ‚Łx|d…F5É‚t\ĎŮpd3<ă€ęŕ¶\!»ĎgnÄrí©¦[?ż˘ú¸ľxEW·¸Šŕ¸\Ü ­N}mą$Çňoww7e>c}ŚÚ•qaÄË©=rÔFíÁdŹÚEµźŤíljy>B ňYt3»‚¬Uňf¦˝0{䬝Ůcp­ĚŢ ¬Ŕěݰ<łÇ°ÎÉGôp“ŹčDň1‹ˇ’éŰ»«Ź×ń! FłiĄö(t~žT‚’VµQ»,$Ëňâ$µ»^¨=rÖJí1°VjďU öNTžÚcT'2˝` )‰Nl>'c» ĐÝgweÜYÄîţ|Ŕ”8‚r§$HyžÚŐ?ą›e8s€ň‚x˙±Ľ÷Öî$ßĎă#—[šLlŮ­ÇĄ÷łÍ¸çQúv­ĺ줗 Žd.vČ|sVa Ř+Î?°lÓ ±.’äÓÂ98…KďĂÝUů¸=ě±9íŁmtĚĺ)ťńřž‚ŃL˙ăIŢ]”ó©“ N«TŢŹ;gŘóSîzöő~Ě,=RqéřťěĆőzĆÍ‘ăŽéć`#L—Ňé=z '*ŘoJPOŽ«) І=$"Gm*!ě©٦ÎĆö/ŞQhfuÖ­$Ď™-ňsTB0íE%DÎÚUB ®U%ô+¨„nX^%İŢ_]_Ýţ† ‚[묕|ŁůyČA)ÝşŻĆNçúôľ:ŘőBľ‘łVňŤµ’o/¨ův˘ňäŁň±q@pŠĺܶś„µŃÜAňŘd,/änňřj9Ł­ŕÁŮ2cCJúˇôŽĂ˛-ýá1,ľaőĹŞq9źWL`:Ť–î4şnZńm\Š]@ďg„ه‰rÁřćŕÁŇ€ŔĘůş*'Ď[džW«eČĚ ÷âÄ´BhÝ =¬ZŽ5[¤v{oX>¶|#7öąúč“„GŞ©ŁďÜń}ă{ źI4łů‘|>‡!?{N ¦óÍ OcJ60qćxĆ‚pĆőb5ŻšŞeì`qx„bŚţç$ŽĽźŃÖEµI`1„-ľ˙Ë`k˘ńl‡¶Ě¤‹BĆßhP)÷áC¸ú1Ts›Űt?Ühśţ@›(WÚ(c҇ !ć+şéf~ß}|ű Ö˙¤…P !śáfőź×Żń(Z»´sí×Oëq5­QP­ď+¶¬gDB@ć6šŚűWöĂ“?ęB5˘_ŃŻä<ެQžóúŮř?đ0(hendstream endobj 61 0 obj << /Type /Page /Contents 62 0 R /Resources 60 0 R /MediaBox [0 0 595.276 841.89] /Parent 47 0 R >> endobj 60 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F27 56 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 65 0 obj << /Length 2768 /Filter /FlateDecode >> stream xÚÍZMsŰ8˝űWđHŐDńIboÎXÉz2›xmOe§290-«"K^JNĘ˙~»Ń€J$íť°R)WY Đh> ľG4_]źĽ|]$–Y#“뛄‹‚ÉĚ&yž±˘0ÉőěcŞFc®r+ÓëŰj4–RĄ§#žžŹ>]˙v2ą>áI<±Y’ëśY©“éÝÉO>~Ę’ŮI–üv’1i‹ä”3Ć­MîN”ľĽ<ą:ů÷ÎG–ŚĄ`:/Ž]¨ť ˇĐ"UĆ_6˝ŚĘ8šIťŁŁW8Jž' ÓĐ0řK‚‰%1qĆáż<×\&‘Ë~lR+& ŰÎł±T,ďöĺzfŕ‹JdÜ2Lc3¦‹h6áśY­Ý8ˇ(´JňL2# 7Đ?pńŢ]ŹL‹bgúô˛ VşmÇÁ×8rÖNĂlBÄŕ&G°Śű`y_OŔ‚ő±¶ ëüÝůő2k™jÂĽŻ~dó {=âB§§çżOÎ`oć:ý8Ćć9üűtYsÁ˛L%QĚüíŘS‚|Ť©×“[íu&ş÷+‚Ę`Ď„ˇ‹|˙X‚v‹§ íC¸%~až4xvO.‡dć°}9ĽŻqäěç Ö,o;_3­ô0¨ĽŻ~TbŁ T­Ń«4R Ěűę¦ŕyťó°×·­ABR3•ÁNq6›Ĺ|µř+ă şÚŚĆĐ’noá˘ÜRGŘ»žđÁ’PĎ?îW`vľZĄŰŁŰhĹ‚{ăiąBëőď Ň)vYßÝCŐ˛rÝ+6mŃd;Eú g].±^¦uUn\ď]/6dS.–`üP‡ţkD”ŚE\ˇFmt@S.—ëŃX䄣Ü:Ţ•©óűN`> –§‹j…0¶Ô^Wtg4©§÷†µĐ´áÖ"˙~ŽŤuql09ŕXŐűĎĆö9ô3Ů«-gF?‹cé 9ëćŘ\'Ç+pl?,ϱ1¬W§0ggm,[3 6﫲laxŰ?ŻŻq3áŞţëęMhmŃFóó-‚âY'ŃjŤýź&Ú`7ŃFÎ:‰6ÖI´  DŰ‹ĘmŚęŐéqü*P5°ŕňľúq)đ ° z/0lŹxÖ2!Šž)ާ·Ŕłp!€t+,H玪îpSTG:ĺÜ7O×DIĺ uC• W÷uZ.3ßťčjłëz[•łŞĘ‚ çÄ´X]Ő5RsM|i“¦8 ËočľtŚ >ĄŔ…7ŕŠĘ@µô‹şˇ˘ňnKĂ( Afę-a\3,ŐŢi¨%r]|Ĺ;V3ňqăPŢ…[UÇÝzëË·ëͧpp{(nËT¬¨˘Üݧô#řv[nŔńgŤ‘»ˇÂ*HQ2étTBíë;,ĂBŔož^AŐ{DzA¤x\˝z˝¤ú03 4Ď隼ý•é¬bsv¬ÄPŐkšRěŞZÍN§[7u%‡ńXh–« ČŔ5w±&}3A6=Ą[n>SXÁ"Ô8g÷[ôĺ±îŠ´ĽS(™ű)3Áqf¤Ä ?|ŢŔŻ›śF§%?âঠ7LéĂä"}'n˙nţ(p‚vĂęŐz» e§¦% §Xçn†VÔ¨ľs~űz7ŹÇ˛×˛Üc,±ßڰě÷^áS .WÚOSűŽ%¬»U˛¤ÓŮz$!’WËu9űŹ‹ůĺ™Ű0»‡ 9Ě6«ŚfZňď×±‘Ł.Lt¬îұĎĆöu¬’Ë ď×± ¤ŕâ9:6˘c#gÝ:6שctl?,ŻccX§ż_N@ŔâĎC€BćŔÍz€ÁW?@ˇ L‹ľË n˝7çW×®pIG&ýK Ňţgťz6  źGĎ"( ]zV!iű¤ž včŮČY§žŤuęŮAP=Ű‹ĘëŮ…ňźÇű,cVČa°y_ýŘ`3fF4°]N\_¶śiO^ëZO¬îüHÝů\h5îgşÜźĄŕ5Č͸y8řëîŔ§˘wľ†Ëşrbń‘®ëjľŘl« \›Ać"Ű @Äběě-IѬmSßNęť ŔhÓíň%Hę"Gíë®—‹»Ĺ–Šë˙»Ş¨P»ţs/ńH«vŇšâÁ;o^ <·˙¬úşVÔ÷Ţ\ůq»V<#«˝8ő ­ŤÍĄ–LëŘěRG‡xÔ°ósę ĺí`µ/ČĆi¸YíŽ5ń^nIˇŢMúŚlă•A˙wăt˝ňG¨ó4— ÜÝg™Ŕ´ťčm<, ŕ/n·~.Ź“ŕ9YóÝ‚iď§K/y‹ą”wÉĄç{¶Z2ö»ĺ/+ěr‰[ͬz–\ ¦ČĄČY·\ŠÁuĘĄA`ąÔËËĄÖŐű_aŇŢş“…Ło„Đ,·Ă@ ľú! aA&5!~¸> endobj 63 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F27 56 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 68 0 obj << /Length 2536 /Filter /FlateDecode >> stream xÚí›[oŰ8Çßý)ô(cÖ,ď”ö-M2¶‹¤;qş}đŘJl4±Ľ¶3EöÓď9ĽČ”u±g˘-ú0(ŕPÔŃáźäůÓ‘úv:zós–ä$×"™Ţ'ŚgDĐ<1†’,ÓÉtń9•ă “&étYŚ'BČôâăĄďĆ_¦ďG×ÓK(ücINŁ É…JćOŁ˙Ś>ˇÉbD“÷#JDž%ß L Ëóäi$ąđĺÇŃÝčź•šL'ĘdM˛rÁ%ş@ĄRűĂş— H™®P˝Ĺ^2“dĐMíş)Á_Ll/ ô‰żŮqĎĘg"‰\ökJžĺíâ´s6’n_öJ ľ\É·tS用,ęfž0FrĄl?ˇČ•L D‹ĚvôNŢÍÇfÁ4Ë*ÓÓSH(ĚtŰ$N‚ŻIä¬Eś‚Ń„8Ĺ]7di öÉňľNČ‚ůÉ󺬻ŰK´×p'¤Óc‰˘ÂäĂH ľú%rž“LÔ%ţjĹ]€Ě+¸IŤJ?O8Püůr,Y1N(•I<:%wľ&÷Ú+Ę»o\Eáć ]çć°>Áy ł(3ĺcą%aśxv'§CcŘ1Ţ×$rÖĐÄ$1ÖŚc#-Ő0ŞĽŻ~Ub#5UĆ®§Í;_ť‹a¤y_ýŇ`9Í«Iűőúâ …Őv#¸(.ńÖb·zXŻ ˙M™,vă‰d*ť­ńŻH ŚýíΖ[¬‘é¶-ĐzýŕŽďˇĽ-źÜÁĚýŮáUĺxÂłt>†źŻřc]íÉ–i ;úđŤyËůóvç®_­;hŻ}ńm=cĹ|ż*˝Ľýr¶ÇÎA| ’Á-4 ÷2ôëivh -Óu±ÇŞocn°C ”Ůúyą^Öďîox“3×ln޶Kg6ón^<ś-ŃßďU;Ű´0–ŠÚ Üü›X’3»¬ä™ź‚O›5ŘmîŠŮv><]^ě^ÖóĆ´ĺŠp(ąk@Ă+¬>Šű\/.żŁ×b;q%„&ś˛ÚhíWnśXZşŁ8NqLÝ  ^ón‰°ĆđęőŻJś‘oëÇr¶ř—ťŁG¨żi3R˝–f‘hŇB•*gD«0rÔ…„Áä ó.$<[ŰŮH¨óW3ˇRč=ďgBĄaä9Hč-!ÂŻn Ś”uňŕšöjň4i: ĐW±`źľ€‚‘ľ·ďnęô3'śÂŻč¤Ŕ(\†ˇŔ| DQ˘• °Úé“ěŔČY'ĆÂ:!pU{UyŚUőCŕ ŇöJóKČm@7Ĺ; PdĘŃ”$” W¸»úŕ ËŮÂfîĎĆîűż="<ൿÁáj˝°żnOĆZoÜÇľ˝2r®RôŕO;zË€~ľ:“•Űů+¶T01ń6{?›ČťT!wÚΙ :çm}=˛§BťđÄűg”ŕÁ­öpčGÇT i=d=juj›łTĽimpĐvJJ[°Ąxi‹ŐÎ]`NË›p I"4Ű ’‚HyE~´Bu<\kˡVEŃŔ…mDšÁ˝˘Y?‘ć™îAŇýjWě“,DdФČí'}PżßĹc›W*öŐäÜţd…<Ć#Oh°t1i° éꬱÍÝŰď ˇ°ZĎ˧UČ€Ŕ&*Ą©%@Žx°µt.Ă;^ľ^´ąż­«)×Řô‹;XÎ6 \EŘ–đ}µĺ.lŘÚŘţ­ö«™•ü_‹O>ĺá p'[‘j/kIÇ L{”ńx·^ąŢ72 VĐţ] ¨—3Ü •’ţ?LĽźÉÁ‘ <•Ŕ˛ʇ޴4< J°đa7ĹĐX…/*•L7ł îčŰX N»“ëb °Ľđ6«ýŇ•Bř ĄŇeÁÇŤ;YŢ»żW·—?aýO6`MńCb–8űÍß߼Y ™m0ŃKlűĺóv^Ü—Hiۇ‚`Ö´ń„fİ,„ú…÷=fJ}xHź ăV^`uˇS&Âlü˘Ťý?endstream endobj 67 0 obj << /Type /Page /Contents 68 0 R /Resources 66 0 R /MediaBox [0 0 595.276 841.89] /Parent 69 0 R >> endobj 66 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F27 56 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 72 0 obj << /Length 2252 /Filter /FlateDecode >> stream xÚÍšKsŰ8Çďú ţ˝óAł‘ŕDćŘ…Üąŕ] R©}vßË¤Ś ®P:z‹­dEf ™Ú5S‚ż,ŘVh#ţ‹Ă–1eg"‹\vkJnĘvqÚ9 IŠ´/{'_.ĺŚ[š©KJ”‰šYfŚ‘R)ŰNHr%ł‚ ˘…± ýŚwýń¸Ť`jĚÎôô #Ý6Łŕk9k§ 7aÄ⮎di ö=ÉňľNČ‚ń)Ë}Yă÷˙‚‡ żzwóy Ź@ˇň/#ś)´€_5+Ć Ą2‹†ć˙bÉťŻ‘»ëäĚC{Eyú±@Q¦fh;/š§Ę5ô‘4ĘĎ”–iĄŔs°;9‚0čÄöńđľF‘ł#MŚI˘ˇcaÇł„COKŐŹ*ď«[‡ÉaÄž*$n‚€¸˝—ŞT`#ŤVŰĹ·ŐâĘ$Ěśj “Iy}™IŤť×ëá›|írË!¤ź¦C^ä÷xEĺőbYą˛ çäĂänŢb˛šąëwŕ Č«ůză ­˙ĘŐµqI–‚ÔbnZ y™?Ůęjă ÖsWďý¨ć硵©°µđD•„‡Ô=FŘP[Ë Í°eŘ$ôµlŞ©•»řŰúą«k̸+Ţnâ~¶®ClüeËk2I‰@Z¸¶ Aᮍ«MÁýdĺ2ľ7śŃ®ő5¶~łr•ß8_íj—1ůüi†ÖaŤýµ^9ŁfČ óŞ`¶čřĺÖ•¬Şť=Łö5–ýeű‹îőÔúŕţI ŐlI _5ľjůópŚĄŕLŕ(Sp<[Ű ÂQđ —˛ŽĘhđ˘Îc0펑ł4cqI8ö"+Ŕ±[–‡c,ëÓÍ%tÚďW8}LJ9„LEŮŹÄŕ«["ç%1â çnQÜíPđüć®ó/ yÄ)ü7I€GÓçő\śčR§®dAhÉO<ŘőđČYŕ±°$Ŕ{Qީʿ…Nűtyűţí‘BÁoaT/ Żn…ş×đýA˝}CÁr„ŰĺŐDZC›_= $K˘-šCŻmBŰV&Č&¬™™>I¶`× Ů"gI˛ĹÂ’dëEU [§*O¶XLćö™Ě F„‘ý¨óľşŐâpľ?×—~ţ’Ţ@¸˝0«‘ľv§7×Ň Y‡?<ß>Ý…eĘt7Ô$Ňčă‚‚ s}Á®ôEÎ’č‹…%Ń׋ހľNU}{Ýuť†źpŁ/}ŢW·>Ď摾.řE™‚ź˘üd鎥q»€–p¸˛»ŰNwű«ÍaŁ˘G­ ÁSD‰çˇşQB¸2·[ K—Ů0v9ň0TĐL˝đjQi—’),2<aüçą9J1ѤČx¶¶D#rHJŢÍF¤‚„÷ýl ¦˝°1r–fc,.ÉĆ^d6vËňlŚe]ߌß˙öźăóCŐł^´_ÝÚ8/äz<ĎXŠ$ ŁéózpoŽRĘ~ęvz‹Ó›őĂĆW’…‘Ş$ űHŘ%É0’Ô>Ă™_şÂńa—.z`÷âO%×~E´SÉ˘Ď +2{ôWű<­›EźĘg‹™KŘ@LL,ă¦Őc‹;0ÂŞç?\v[íľ‚\CĂć.G?Ž`{ô{đG›a›tVý˝¶P^Ń’¨söÂSß«ŽĽźQăČŤĘ0aöiŇDĂÓ/Á˘tńµŰ{ĆްQ†Ě'ßěQ.÷<Ú»bW¸Ş6! Í˘ľw©&âeÄÖż~ÚL«ůŹD7ß*‚ç‡SkF f2A¨tóí†;?\˙˸_N©ŽŚ:g»oţ«vendstream endobj 71 0 obj << /Type /Page /Contents 72 0 R /Resources 70 0 R /MediaBox [0 0 595.276 841.89] /Parent 69 0 R >> endobj 70 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 75 0 obj << /Length 2399 /Filter /FlateDecode >> stream xÚÍZ]oŰF}÷Ż úDˇ«É|“łoîÚ)$vÖµ‹Ů<(m°%U’“ößď˝ó!%Ą6 0`‘ś;‡gľxÎ\ň—›“WŻëÂŁEqsW0^AMQU”Ôµ.nfK93YQŢ<4ٱ˛<}?bĺĹčÓÍ›“ó›VPřc…ˇEĄ*b„*¦O'ś|üD‹Ů -ŢśP"L]|…cJ1ĹÓ‰äÂ?žüvňß--Ć‚UŐűr Á%B S©ýie TĆWD¨ ~ÁV˛Ş¨ˇ™Ú5S^Bl+ ´‰˙ÍnËŞ g˘ ‡ą % ŻM?9íŔĆB’*ŤekRŔrG.¸§™ÚP˘ę¨™¦`ŚĄl;á+YTT-jŰĐ[ĽË÷űm„кކBBa¤űq°ĆX9˝ ó &wľGKKĎDËc ăcL—ÖĹĺď#Ćuyúöâl—!çQ’ga°†rÁ`‰T†§×#ÁË_a©–·0ľďÎńčňÖkĄĘŹpe¬(NđO»ôă„RYDóčĎGÉÖŘŐ:¸L0^Qž^ĂHŠÂ: ÝŔ«—G”kPY+?­{ć4ô™äwphaĐźý“ÇcŤ#°=NŚI˘ˇcbűSšCOK•‡•ÇfĹažÔ˘Ă ftßdfšĂEnk”QÍ;ÜNŻ˝}w“ČuÔIjBaýRµnďçí˙(“0­›ő&ź,7“ ‰r1ÇËîębĺ®=-VŤ/˝sż›a9YM Â®šfÓŕĎ Î=ě'kĽ¸¶E3ĽĚËÍÂOĆD=ăm§łi‚ k×Ř7VŚăLr ÚĐÎGĽ.żŚ”.'ŹPłť¨cxyÝÜ5ŔZHcď"-7PnŽ[8žĎđ˙—v†·…Ú6řîK¦îćxać{X­Zl‡-˛-C »E¸Ëë/Ľ8™Ú4ËÍä3\}ô—±C&óű&T…ÓP»ď©Űo¬$=ASELĹľ]Ý# ”ş‡HÝü§)u?šŰŃę®Í7Ë»Ş@Já9(ďŞBJ#ď!4‹ĽG`iyŹÉ%ĺ= ­ ďĂ´ĽĽÇ´^_ĽÝcĆ)ܤâY¬afśB!­:Ě.ŻnöÁ\1đ¤ĚBĚc & ˇĽŰc#ÁĘ+t—gŢcŚ..ôĎIŹMć<Ădđ ¶:ŕ¤RÔ•P¸Ń!Źâ˛xŚ,é1bbIŹ‘…Uđ¬ĽÇYő-+ĺ\đ<Ä<Ö01 JOőXϪ‡‡®3 ŁÇćĄ+Róî0ľľş˝<Űs=(…•Ś]¬14>¨ÄÜşTć žxKńŘĚA—Ýůr˛¶˛ÜĚ|ŕÂý§„Hč‹8:›2kľ´S_¸jîŰőf5ŮŕýŃ_đ­é™n]…s:TĂ:g«óťš(L ĚĆÄ’ú…UĐÇAV^cVv*_îĎaśI 9Čy¬arÚ¸EwYzą&µ*Ůn÷«~ÇyżÝ€młËí•‘–ÍĘć™qiÇí>g^ÁŞ—OŇÇ}Z;D»Ď}t]5»»ký·pţţN%1dá>ÉŽ€UC(řŚ»ŰżüVčúűtrŕţíwMW;Zé¸6‰/ă,XÆ(%˙ů×ócŹ3~r㤠ü·Ů妉–ĽaÜűęômŘ+Y.'÷>-€g_G‚˘Ů»Âyłšl°olL F½|G¨Ę‡0ŹKWü=»úĎĎxýgŰađ|đsČ<`†`łü÷«W¸O‡;O—J öţ‹çŐ´ą[ŕ@¬î2o6ű“K3đ`u!•.}ňĘă_n/˙ĺ~9Ąz4GŁK¦ÂhüERendstream endobj 74 0 obj << /Type /Page /Contents 75 0 R /Resources 73 0 R /MediaBox [0 0 595.276 841.89] /Parent 69 0 R >> endobj 73 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F27 56 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 78 0 obj << /Length 2821 /Filter /FlateDecode >> stream xÚí[]oŰ8}÷ŻĐŁŚ±ü¦¸om’ŦŰi3¶S`Ńíc+Ť1Žíú#E˙ýŢKR˛dYr¦V°Ý"DQÔŐ!yîá˝”üfÔ{ő÷4˛ÄjŤî#ĆS"¨ŤŚˇ$Mu4š~Še?aŇXʞ~"„Ś_ßôY|Ý˙"ćŐ]°×`aż ÷Őu•yĘĺ n]Ťç±ţiâÜŻćŮ6űqJUđ'(ř+î-Ęw_S8SąŮd·vďUľuŕQ»~ČU<ÉEXFˇŹŕüÁQ6ó§ŻÂŠŮ"4wG ±ŰwďgŔőçĘKw˛Äçm|ŰĘš\w0đYYĂ˙'ăs×ri¶ a-‡,‹×7Ţ 9Ĺ;,ëT¨©ëh©d¬YB· Čžún iż˙śÍ¤Ę;%.)p‰{5®ě^ů„ęs n9ˇiG™EÉXcj‘·qCóńĘ%5p H’ÚnŔ[íŕRá>Ł(\á;׫ëŹ8móČîtĘĎ_¸Ćíůţ…ĆÝđŞP6‡ô‚ąĐ–ţź©çÂĆ‚m‚p„câŔşÄĄéFJĆĹ!oăöâf›ÉĹÁ+ÄúűźV-S‘GŠ®|ž@ NĐ‘ěŤ5ËAhăăz.÷‡˘đşI˙Şĺö?“ťŕÍmµâ•0€F˛ ŢÁŐđö]ßšxt,µg¸ĎÄ~¦öm©˝ŕőÔţĐĺů ¸<çDŞŽň‘’±f—mÚâĂĎ_dÚ Noަ¦Ä2S9ÜÝáîúd=»kz&)Q°X¶ďŹľXäÂlJ”TÝHUÉXŁTĺmžąt.Ź\ZÁ…ČĄ nxűfč.×oĽŠЧň_u2·Ő Rb†¬Däé˝Q%UUzűţ.§˘řrîa$x€‰XŞÉą_6xKÉŢÔ‘ďŔ•hń´V®@°É;Lµ"łŔuČîKČnß#O€-H•:M€Fč.đĺ¦ÚđÉTfDź‹Z9’r˘M•#?ŮĂEV[dye‘Ý/˛ g”čf‘-k\dó6ŐŐ ?âI܇•‡8-(—‘Ýŕ ¶ÚqZI4cś§^AâLŮ˙Ú +pmého d¬y… mžµÂv®XaŰŔĺ+l Ü~…u_ąŚ®ÝKŇš€BęĆT7Ps[­PĄAé¬B\ý~‹#9<š¤E¨Ő?őłU?Íé$Eţ¸~şLw¶ŢîĆóK'U¸ů}1ž»Żýďpëz‚ďŢ˙čůé‹Ĺ>°HYŻäŹ˙ * v’˝!Ď-Ib±«÷‘ŐDKIhaYřŘżóźá$BÉx5ţâdáÎľő…ű¦˛¸ě/.˛őx›MCŻTPÚ>ôĂť*~Č?ßťŻüEÜáÇă凋_°ţ—ü-@Xü4C´]ýíŐ«)~DăÉjĺľ=Ăç/wëIvżÄ_&¬żdd‘mëďČ4ä÷,Ť ć ż´y‹9Ç÷ˇÉ_ý‘SŞűIŞ„Ž™Îgă?äBendstream endobj 77 0 obj << /Type /Page /Contents 78 0 R /Resources 76 0 R /MediaBox [0 0 595.276 841.89] /Parent 69 0 R >> endobj 76 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 81 0 obj << /Length 2191 /Filter /FlateDecode >> stream xÚÍYOsŰĆżëSđHµáf˙“űn©ăN“Iוߥí–čX™R%ĘžôÓ?`±¤H‘’ĺÚ}ÓńŚąäb±X,€ý0˝ý1‹sVE“ŰHČŚ)î˘4ĺ,Ël4™ýëq"tęT<ą+ƉR:~w9ń‡ń“ŹŁóÉHDţDäx”š”9e˘éýčĎŃođh6âŃÇgĘeŃ#Ś9ÎE÷#-U/FżŽ~ix$Ŕ$iqůĺ“z' â‚™(•ŠqkĽx(HdjG&%łŔś{ŠëU ň®ţ ççëj›/ŢĎqĽ†ŻgůbăçÓ±ńWmÇÖĆBi&DษÖ[ ›&H%ÂX–Ö!3$Vµ]ŹŤŚAc&•ńtlDĽ,+Ü*źĂŇGś±˙z(Wž˛!©Šő8ʸZŇów.đRâL íłČ«—ÎĽHĽ#‹ß=‡sZsăß§_á6ĄŽo·őfÓ ÷]â°ÜĐdNŹYń0ź†ó„Ď Ń2›÷jľ,iŽŢË9Ö8S ›/ó ž,Q&ó§ÂçnţUĐ×ë«O¤*3ş•=sµ\‡[a@hĺë=¤ä2VݱŇ`ݰU"R¦ťG3Éfp‰Ă‹”Yüm+ST^† Á-:ŽŚç%RT}{ܰԄsüÎ ˙ŚvµďalШČZÇR{‚—)4öłŔ*iń"_k;‘?´YłĘöăŘŮx‹ţtéÍ­ä˝«Ń ÖŘÖ‰P*ţpA!äz…F×;ˇ’°ĄÓ§Q2—ąá#ÖĽzglI©˛sÄ󼤂®jŇ˝Rý$'ď(tŁ"Ę´ˇ|CFŁ S©îř)@‡ĺ|ö˝v6}3™í!Ň3đüđuNÖ…2í® ł ËśôŰ.üöďĆŇÄ 8ţWĆ 0{»-§čÚzÝÜĺuXS–Ç•Güžß‡ŃĘĎ/“÷Ż–Ő7Ţ@=I*L<[âŰt{_”uđň>ďE(Pĺ#ęxČń ăćźrüÚ˙…p±8gRÇ2“őÍS7ć)µ7O€SmĂëÔµyÓi”Á-ťQżf/ 8 Ś9{" ~ŔłÓĺ‚›b|cP0KĚDéOy9ó(ľ/ž’wşűű— %1Kp™{Ú:ŢpyÄlA*iô`†&ŕ*,Ú˘ĚjĺŹyĺÚç9l¬Ë¶·?Ţ%ŤrzÔÉ’O–>LĄu^„)”'…䣛yŔÇšŕ#äăXŐ ”ßj^Ý $‹Ú2Ąl7[Ľňk)Oń¶äłG4&ŮxűÔśŠEöV˘ڵŻBĄ`|ĺÁc».ëTÁk…7Z¤“K‡5i„穢!"_­ĽéOĹđxŤ éä†Č¨Iš>_ŮaM$ÚĄńYť®Î‹¶¬w9n0[›důíÓnňš—„{ËrńŤF7m8ŢŇő‚„3šő'óŁ[Ô,î0őg÷É­G2X4h;u4kL˘÷äôîN`ßůS+Ď©Ä\oQ°´ĐdŘLż-ZڎEMŇB y-N–ë˙ŠĘY8v-4wĚŞW‹÷…/>¦˝0,1ŤÍ~/‰Ŕ*Ůń”Ą:mźďIh)ě_(φ€©ÂśJ%Ó›ĎGPŽRú ŕŻ|=Ú/G÷Aˇ:  ŔłNWXŻBŠ[y«IjłŮoúń:.×ý}ő‰Q˛ěNŰNíÖ•ľüh.‚Ęq”ăCîJYň/ Íä7«ŕŕ˘uMMgŘĺ…K»ý9únŽóŐúşÁY°ˇ5´Kčâ¨T°.ô<ˇ˙Öţ™e2Ëvg ĘBú©/”D"6ôÉ«ĐcTMŰ`tCQŚę«í¦I ŕí5ďa ^¨kăkł`ŃV´@ (ö@Í3¨WçôĽTŻŚp ¶6j°®× Ať4ŕř“+´´Ďźz":†e^GÄŔë¸Î€SÉŽď°‚:›|ř|Ńë•”Ż#^Íë¨x *zk»âyxÄnç/×ř˙×I?íH4d“¶›Ă\5ÖM)ÚüˇÉĺ˛,ľůFĎśťL.kR˝ĚŐí_N¨µ¸ ‰]C ßiśo°üß›ýľ,/CßÇTÓŐ>ŇÄ?a]5Đr„$Ä?ÜrîCr—ĹÂ…,bŹŘS†¬Ée]g•/qVúsö•śuÇě°łšg8ëkŘ8ë1kgm‰x‚łľ‚x;g="^ă¬űüůňzę众šĘ%Ŕ*$9FżäçYâ“ě‘p&耋áB>TĚO‰đ -ÖeáOetĽĘż4h¨ăDZâôb¦ÉŇ'®ł@C™« }żŇÄwu*şXŃäň–žď?ź}ŹßżŻcCPf±XďT«˙Ľ};ĂÄžÇSß/c~˙ĺv=-n—ŘŰY)XYôŰ[ŇB•Ö«|˝?b&^·¦ôzJČCĆIf”ŤEZßĆ˙ę¨Bendstream endobj 80 0 obj << /Type /Page /Contents 81 0 R /Resources 79 0 R /MediaBox [0 0 595.276 841.89] /Parent 69 0 R >> endobj 79 0 obj << /Font << /F8 19 0 R /F24 22 0 R /F23 16 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 84 0 obj << /Length 2785 /Filter /FlateDecode >> stream xÚí›[sŰ6Çßý)ô(NW®±oŽŁvťIlG’łŰéöA‘čHł˛¤J˛Ý|ű=^Ě‹•;;m3MMŠ˙ń;8_OÎ^ýô 1±čMîzŚ'DPÓÓš’$‰{“ů/} ÔFô'‹4!űç7ë_FżNŢž 'g¬Gá?Ö3´§•&F¨Ţěţě·ł_~Ą˝ůí˝=ŁD¤÷ű”0cz÷g’ żż:ź}Čl ŔČ `ĺ5ęă2((#ާą 4VVŢ9ę€B˘đ’$Z‚A<»]Úí8]ĎĎgx–ţrł>ßYĎü…˛řř‚$Fű+g‘býé*ŔţjiܡÍý/í HÖ š1b”“ł]Ą‡K͉ł_¨]ˇ ÓÜ[' %ćę g’ö™q•ĹeBbxz8I44Ű´'Ţü©ľDŞVá%Ţ\ÝâĄűŞĎb’!:pZśK•9¬ňD48yŠ3PĐШěČäĆšť/óΠ ‰™3h“śAAb›3č@Wî ZteΠ ëEgĐ…¸Ě´‰óÎŕůk}óÂdx”C¨ J8#L”c’źRäď0ö¨âŹYú12ŕvăĂôđ°Ż Q¤‚‡¨ŤP\LCÁ˝8/µąßZď`# đNĽ.@QZUüç P8§Ď‚8&ž°Öď¨Sü‡fTG~'7Öěw|öćr|p  ÁűĹ–:ŠŚę˙\á‰r˘”ěDo°ŐŞWPlݬ¤÷üMUéärŚűď‡W%©!,áťh¶Z5K83SÖüîŇ ®ňĎ6ĺŹ x’Ř·SÜ„´b}pÝ1°ąYąó[{b‰g°\*.^§Ongžjâ‚b ű›]Sx űË˝;7}ś.ŃW`śPp)bňżuśBľ™ "& ܱÚřh•ćĐt7ĐŚ5BĘ|#´]čÍ mÓ -ęýFh»ĐśAۦ9@[Ôüúç!ü;™Xá‰:Übwv»r ´âĎśÖěBcŁ˙(ܢ„«ë¬ -Óą_<< óÍÓşLCü‡8g´Ď©‡–%PĂ ľ>ZÁÔIGĐćĆšˇőeľÚôćжčÍ -čµxžŁĐJľřGE%„|Z&ݨô¶ÚU*h‰*© Ç·ď"ŁűµŮ6´j($©B8Ra;u•URá\‘T(óä(…˝©;?=Ěu˝)$ŮžÁÇöĐsty8aoťîÝM×ó†,[kÝE–M BĂÁj-É JCAn7ć¶ ôEľŔÄfüµ řÄM_|m={‰“Ë÷(ňúödô¸éân¤ Ö‡µpÂă7^Ű ŘuňX÷8Ó€‡öÖúÔ^<[ÔđxXŢŰdÖŽŽ=DÖ"—ţľ]Ú«ęĆ´´&Bý˛\NˇNÔůűRiSfڜ´˘„Ƭ#¨scÍTű2(lřqh‡Î*â´$±2Ýó¶ÚĹéÄĹŤo_ŹAÝĹčň[ŮäŇóUXŽ5@µ©ÁV«Tst˛,µuÜ:6DČřŘká®…¸Ď®Eŕ÷|ýçýĚ1oËÍş×éΞ~¬Łş@Ăţ“c%Ëśfč˘%«ďˇ=gČ™ ˙ďçÜX3ÎľĚQ8w!.ĂąM\Ŕą n4Äbx™…oެp¸1•ÇťJą SYT„˛=ôI®sŰeýźJúŢĎÎDcxp—<-ěČěÚŰY»Łéc ľÔ ;$vH"NH,;šQ*k)”9¤NÄZĹyŠâFĂ+T÷O7uS™ďBĹ»©Ŕ`«UŁř(Wŕ‹s7©’'obąTyöfäxMź°ż…žĎf~>ŐÎĺl]8Ú¶ŕdŕ o˙lŮ f”圦ĺ%’nţxŕsĆXÎq" ĺ¦d~ Č—ĹśkŮ—9 ä.Äe ·‰ ÄĺîëlŠŁ< «ăND[­"q¦6ˇ˘$ňE’%duôĹiXăäŮÚ°:z?z@›Mßńlý‚10§©Ş_0ĆhL++Ɖµřľb¬mĹXć ÚVڱS–ŚńDÎ;C.ktˇĚ1® qÁ´Šó® (îö =řtUG ¤îDb°Ő*<Q‰,I|ŃÄŠĐD–fUę‡(™—Áí\ě@»Dţ9đß´RT“„‹zđŽV•ą‡ĐD őťűÓą?eu—ĐśéűÜX3÷ľĚQÜw!.ăľM\ŕľ î¨o'×…>qC×Ő¸^3¡ wˇ7ŘjŐ+đˇ /éýŃ Ľ|7¬ÉŢ\‹á%ÚěâuÉÓ‡–on„Ř. püJN]f~çöq`‹Ěx/1·&^çş›bjżjÄ;&ço™’¦Tý”EX &¬Ł!삱fĽ}™ŁđîB\†w›¸€wAÜ× aw!5Ân“†°KőĘţ…"o.G-#tuŁŮçnîg¶Břҵź zN«=¸îó‰˘ů)Ú\™’†|]f͡N˛&ŹaŚ™Q_g©:Î@ U!Ş>FBôíŃ5îŞ~žť†]¶vu÷ôŢ-*Mw ÁP·Ĺ:#ś{36Żá­âŹ9VËż)ö˘]şŽŔ«Ü•ótŠ˘(ĽÄżźÝ•X‘Xę°pkÎńŘ.ĹZÍĎÝmvŐB3ďkAѧé ď÷‚ÓÔąč ĘŢuź§dŰCdRö®Fľu]öąvţk Íęţqgčď“=ť°• ű_˛'Äą˙yjŐCěąjJÜáć#íb‚ŤłáMíÝŃMd;ŚP˛ć­űASţZ±×Áż5ݎhx٤ć“+ĆŚ]L]aUf¬r‰¬â—]Ŕ‹űYóŐUÁĺ”é^˘bíJ°—ÝËylśös],f„ĹÇkđ:…dőâ´µ5’P7Ú˛WR°ĺö|éšçL Wů°ĂÇrmÓy GŔË$Őkßß §¬t9 ó$ %_ţŕŤPluž2ä¶j”)E¶©\™˙Ú [^PóĹ.´‡ë;LµŠäŦ¨Ń†•ĐÝTúž@ţĄE'ÚĽ©vmARšĹŤ†Xw0ßµ{ăJß­ I¤ŕ`ó6óímâHkkŕ.{‘ ,Ż(Że˘ çę¸o"šż¶ô†”±Ë[˛.Ző Ă ęÍÄ$–Ľ'ˇ„aľă Cd{?ź5ýě>*°żž"A݇Eţôg?Nľ›Ňą/ł<,Ü^čpÎkÜţjëNnîÜöÍőĹxü‡i{o bŘ-¶őjq;Üy¶ĹawbďżyŘÍŇ»MÁçîsJÖiŐÝrđTÇj ő3o1?Xů5dňonËá…Fŕ:DÜgIh%˙o—endstream endobj 83 0 obj << /Type /Page /Contents 84 0 R /Resources 82 0 R /MediaBox [0 0 595.276 841.89] /Parent 69 0 R >> endobj 82 0 obj << /Font << /F8 19 0 R /F24 22 0 R /F23 16 0 R /F17 37 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 87 0 obj << /Length 2519 /Filter /FlateDecode >> stream xÚÍZ[oă¶~÷ŻĐŁ„sĹ»xŢŇlN‘ĹvłMÜŠ˘ŠŁl 8¶×räßw†¤dĘşÄŰč,Š‘ÄËřrČůřI?Ď&ďţ—E†ĹŁŮ}DYFxj"­S’e*šÝý‹dJ…6<ž=É”sź}Nh|™ü5ű0ąMh”ÂŤLi©‰á2š?NľMţü+Ťî&iôa’n˛čîSBŤ‰'‚qżśÜL~«mLÁČ4°ň3âcâ1E¤’‘fś¤pE€×‰¤q˙ćön±·wVęřöŻYś»Ë]±_$UKWôüP¬mlĺzµÇăm"YĽ^:[[Ĺh`óEY>ÁcQvŮÚ«7°­ˇ~s]v‡±1SĘťŹĐp7×ţč\KXŰpŹ©,ľĹ‚wźăĹ@ uMĽ§Sű5ÎÓ ©­\ŻfâÝAbÝ.YĽ¶.˘őťk‹n˘ŹL§®{v莍`¬śnzßŕĆv˘1x:ŚĹ3|x° ¬ç µë<ÍBťľŘ'ś;;+ĽŰµ†ŠS˘˛Şů&GůŁí°+¶ŢC/·î”hV¤„qCM‰‘.ŠpÚLjť×ŕĽë…V°t·v׼ŤYÁ$Ő~߬ŕg6ÇKfśLDJK˘OXś®»Hejz°ĺI‰fšF«źC`gsÍ Ť#lŚQ" [ejc’¤Ľíşř1Ňž]! ü«‘-wۧůÍ—­ˇG3»Ŕ˙ęgËnT8]6@wŘ`˝‚řST„ńgÍäś±%ü[ŘÖąoî,”»ő¶đQCµ±ŁFÍ®˛ŰâÖ:b\îJW¶ľÇ+ó  źďÖ8´[aöv÷€ľ“[/čjŕ2ŤIÇŽ«8#šuL›¨§Ť ś6ÜŘ…ňŹ›n`ČÎŐQˇ\V`Żţ-›Ŕb„ĂÂZá®(ˇętl\RG»Áik –,ISŐkËöLÁ–»ó­;ü”&#ššź&ަ…[&aťÂUk·˘1×}úÜr ł,«Zľžđ čeĎŠö¦¦[Č$l3°ŽdçW̆óu!vő±˝´9QĐ•©AŚi˘Lń ťĎ.Ż>µ°eŚÍGÁćM c=1MłĆÂř]ýŠă‡süńÂĺĹ1PItQ8˙<!ZcS×íŐ•íeĘú—-˘‚m·“+qš%d$aߢ~:Z鋦0vÍěuS¬îůâ¬|YÍ}żŔ8Ąpk|GËurHţpńLÇŃźG»±;GČ:¸—†¨´Áuş@Â(A6Ř,ä#!*ůŇ"9±nüKÄfŮîŻS“)Ks[Ś!ŚŇŠ@ă=Fö 7ŘtÍM…ÜÄá¨2ŘĘmţX»K›‡`)ňר…Řd}\Azęă#ҨHŇŮ ‰·5 ڵ Ć=®ŞÍ0%ˇR–ŽĎۆ‡Q(xŢ9/FÇńÄb˛Ň!-©Höť@^5h¦ţš—O¸*š7¨„c ] _¦)lC#$üŔP_ÂŻš'|Ţ“đOĆö#ľPŠčô•„ç[˘Ő) ß·%álő'üŮé uÂé~€ń— „7k#=—ł4 KáË×—„2 ©‡î›(Ř(༩atF@ĘŐ!şk;jżşßíÝÍ¬Ź…Ńü/b! Óc§b“B !€€™˙Ź`çGÜ\}Ç{<żm J{ÔúşôJŰ|ż8Őń>wrd¤üv™Ô?–o·Řy_”]R uν*ŐT×RŤH-.ĽÔÎ9Ť‹žó©=bWßýô*'ce-LYGë˘b»ŻO·ľ|źHž§–aˇ‰-GŮzÜĄ;qN•Ęşň>=]«á$…r˛Ś (d0-ŽËÇĘO†‡ÉĎǡęcĺIŘ"ď"Ľ°t_lť‰ďÓoUEĽ­i`¬Ca–ÇWmŰÍ.wôŁLX»rdŢÖ02É€=-Dö%1Ăĺ¦n6Ҩy[ĂŘ´ R5GíÚ†ą;D%řÍNI ĂĺHĎ„sËÉŐV #pU…/> łQ÷ŕí//Ý,Ť˘MŃquçH"ôx‚BÔ]´ŹŤŐ#°ľť>Ňç[s>ŃĂůNö#)‡Ĺ¤áÜ7Hů8lŮÚČS8_ŐtŇëg}!¸Óiß8kŢ7Óżć0óš§~ĂČ<÷ ˇť@ţFÁW±ża€žţ5¦ř»”¨ Ľ˙EQ1ˇş•¨”‘ 7‹”æ.żC‹úĄ°"ÁŤ'lŽZAúÁíóăSŮ!MÁČfô‡iS(đ†:ÔŞ¸"TކVĹ!§Ě˝ qg__u ‡•ťNĹ1µŐ–¦ěË• â{µĹŞtxrW_˝#lR/¬qŻĘh·DĄ9äkö=“8™ă(T[˝•oŇKż¨Č ^ŹË›„ä “U«‡{Q ‹‡ŹĚ›Ě‹ë°ó5ĚŁVűu3Őý:Ź‹ˇőë<¨ …1Ǭ–O‡’{{Ô;ŇĎ*†‘}»ědT čŽogT;}ŚĘ·8fT˛‡Qť ěG2* ©MóWÝ˝RO_aTUÓQU`¬źQ…ŕŢ_Ţ©*őĺâ:şţG‹Ŕf,(fek&0)B7`ž˝O8Eň_8ňGŤŮĺŤ}řőâS‹jqČSc€ö¦†1süôÁ4çýěăĄÜĂ]‚@‰»¸ ˘b}_Qf·iŠKŠ~÷GŰXŮô|M”ů݉ŐgD-UkU<$°P˙râ–F«ĄŤ-JW—ďóĹŇ Y]Âs^˝.\qs®„ýň/ŐnŤÜýÁ˛ć++WöÜP˛Ŕ–ďo}‚+YŤŞpĄVŮ‚fÖCWZ×°2Gűn‡GíŘ‘Vbřă"! «™Ú…{·Â˙ťb7üíb•Üz,űÄ*!ťX…×N±*#”‹WÄ*Gp›+ݲ7~Ŕă,MkSmÉ…CO•ůł»é˘śŻ«aŕn_Ú™źĂÂăCoĚp€Ü3; >h°ÔŽ$ćxĎ-źçŘ!»u<íěŞÎľçQdUę'Ô¬ýRŕÍ‚VŠŚ[Ą›™:»>»ŕ`°Ą"ĄxË·ŽÎÎô`ČŤ¶Śŕ„¤ ˝" _M+µ"ľŽŤ=QŘ…. :żz×đé9ávŤÖŐ®rUlĚŢů6îŐ¤ •”Éyąq•ö˝$\ß_ť˙„ĺ?ŮAÝŇĎ+€y@•l·ůď»wwČúa[ŘlÜ‹třýőÓv^ÜŻ1Ü·_ ˛*ÚË ëšf'©p+čýzęĹ1:ńwe’i&ąŠ©©făo_Lp[endstream endobj 86 0 obj << /Type /Page /Contents 87 0 R /Resources 85 0 R /MediaBox [0 0 595.276 841.89] /Parent 88 0 R >> endobj 85 0 obj << /Font << /F8 19 0 R /F24 22 0 R /F23 16 0 R /F17 37 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 91 0 obj << /Length 2413 /Filter /FlateDecode >> stream xÚÍZ[oŰĆ~÷Żŕ#‰–îŤË=oąřŕ8'MR[PôôA–hK8˛¤Rr\˙űÎeIQ"%+µLr/łßĚÎÎ|;Ę›ÁŮ«‘>×Ńŕ6’Ş:ó‘s™(Š<ŚŹM’J㼎“2Iµ6ńëωŚ/’?ďĎÎg2Ę༦|9ë„×6ÝźýyöűY4>ˢ÷g™Đľá=ŇűčţĚ(ŢggWgż62˛(ŐJXWtEF„2(‘š<|nKIJę”Ú:ôµ”.*@ÍśŐ4 /އ–tRBĂ_‘ďŞ&s)dµDƦ­p˛ś#Y©6"Ëň˝˛hf˛ř-ŚîŃ3÷°–•=}$ĄđÖ’˘đެ‰\ gŠ4˝ĆÝűřąŁ#`VEŃ }~E[Ý·‹i-+m ëgÁśŕmpď.®Ţ~J´Šżś_&ŕsżíÂT:Fę“Ŕ¬e†© lŠq[0_żK´Śż€!ĎátÄŐÄ‹+úřĺüă`µŇůI@Q‡1ëLë·÷ýÍo5Üđ¶ŃJ>f˘–CýsĎ4Š…Ą<íŮă-Ý{śsÉęF]e6QKi-daŁ<‡đăů<_&VĆ%ţŃŰô+}Ś!‚Yß<᳇üICs´ÍşJ¬Š3î_RÇtľćĎÇI9oM,âqůuĘňYТâöUY‰Ű}Đ-\â^Ö« `ńMs»±Š!č˛V©ö"˝$­J=mUÄô)ß$ĘǨ•RšF ŚZW¤ 4,“T9T‡šą-¨oCžňţîń¶É´[ŰF›€´‘+:¸Ű°!ś ·Uĺź劏k?•0&2Ł_N&Z‚öщzČ.ˇ(öŠŁ±}OJˇx¸v‡)…. r¸#(E=ô$”˘%l?Ąh;šRśfC)¬)EćQ”â$kJqbM)Úżŕ9;˙„¤b/źhyĎÄ'´3ÂjßĎ' ŕxĆňďJ(8˛Q…G+^* ÔŹłpú=ő/‚„šţZNťčc9«Ä,Â`JoXđşACSűÖŤ5Âîݢ¶=Nj’0çɤöđ]o°±mMúP$'}T]"řk‰ŮĄB}R#%¨qĆŐ»˙ň°»°HXŤŇ?_íW?'Č›"˝ÎÝŽ#«G,·ńd gU9?q+ßčËp"řâž#ŇíaF\ Z®Ë±čş¨fe±íCŻ Ä¦ěٸť˙×ŕ„Ďjó˛˙óüÓ<ůlj’?Ěk ł é-Âآaş2ţ_&MĹänhM±epjŮg絨j8Ż-y?]Ă8Čj»ŐXN9SÖÓ!ŢtĆł×ÄgµĆ·›1qI,ź13ë çüŇ(Šégşy?&?©Ň!‰­é[ڏŹKµ^Á+2ośqWÎË °ó?ËM”c/ ýOgAvČvÇ–Č^í|Ć…śŐN٧ŽČČł‡Kś7›Ž†›ą¨ÎŞ'TÁ™4.™ŁY¸5îeÇč$pGßüó˙%“9éF‡á ‰@|.rŁ"#Bqo@§˝6—5îę ,|=&dýM7wň.ŽĂézÂoŤ_Z7)o¶äÎĹ-?ß}zű¶˙Tďi0€™ŕYY/˙őęŐ=#‹G´M‚Ö_> endobj 89 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 94 0 obj << /Length 1852 /Filter /FlateDecode >> stream xÚÍYŰRŰH}÷WčQ®¬&sżě¶*©Ý$Lö!•cLpŻ- řűížŃ‘uÁ-•˘ ŤĄžÖéąô9=:śŚŢţa3GśŮä"cÜA]f %Öęlrţ-—ă‚IăD>ąśŹ !d~đyĚň÷ăăÉeţXćhf”!N¨lv=úwôí;ÍÎG4ű0˘D8›ÝC›ć\v=’\Tí«ŃÉčď­š‚elÓ…Üşŕ] R©«źu/@) WD(Ž1Jf2 aę¦Y4ńQ‰˙ Ł»±1­‰Ô*KśöŁh„Šx&8+„$”ęNgľ+gˇUY·„ŞTě1T—1FśR>Vhr%3C!fĘ}°§8?7˘T`jíÖôéi„UëDŃW‘8k§`¶ż*Nřźô下y“eô 1Ż’ŚăÚ™˛#°‘™%LYzĐLÚŚgę9ű Ĺ|9ż‡'·g›1 4€\´ŔĆ %6 ˝l–łĘmňv¦,QNWŽ=ĎOŐ–şý­›ëŐćÁ2€bĘMUJĚAТ°ő ¤Ž~gÓ+Ä.U>CÜúÉŘ8 ă*™8Ř”SO›`zs®Ű|íu•ćáĆýHaęÝuT}ËŞX´Ňm§đf&Ö\2÷č¶ŽśZ^ă|î4r~ Hýá8 ”ăŔ3ţ0Í<ýoBąź;jC˙đö,(űQřŤU§Ĺň±SKď@Ç>§ľGş§5ÂGűMqXÁDmZäV±Őô€hÓFÝš'ôL µ°i0€5/Ó•Ż"qÖÔ6 gŰúqÂS/ ęCU ű‡Ů ´ňŐÔ)˘•¬Ý[¨DÄEŢŁ¸é&äËŐAâ¨KD“†:]ę`otŻŞ¸” hlż:ŕĘĺ×ę š˘gÝę ׫†€¶U˝Đ˘:¨Ťž€D8An“‚b…Ď}őĂ O ę0wO úEB˛z~!‘ŔĄ şý^pTÁ9°łĎЧ˓Ŕj¶_!Ív pE¬qŻu$Ŕü9Xk.µ—‰©ÂÖ =íăĎéXŻöÇ[ČţŔý˝MŤýO`4ZTťËŘÉ4lniĺĎ–ţę˙/ýs&†)ýgťĄ´Ů»ôá¶ôďCK˙á#ÇW °1eä­ć{ţŕ´lü ňÓ_É‹ĘOńč(„eq–ůO;X[ńL‚Eő Ĺźy-‚’†-)aUýđ'ná×ýXPü8¶}üŁ:Ž[OaűT6áë ´¶§cJĺU˛Â*<ôGhp}÷éč ŢăĹ+äłjČĚ%n˝rőűŰ·ç7`LóŮjÄ9Ľ˙ćv=›_Üŕ÷•őŹ9YΛۄkF ¤=A¨ ÚĺŽůŐCŘň·pĺĄÇ…UBç|űä? /> endobj 92 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 2101 /Filter /FlateDecode >> stream xÚÍY]oă¸}÷ŻĐŁŚ­8ü&Ő·™M¶Čt1“NśÝłó ŘJlŔ±˝¶Ótţ}Ď%)[ţ“NŚ˘P"yy.ďĺ=‡Ę‡AďÝ/>+YiU6¸Ď„ôLń2sŽ3ďm6}ÍużÚ•*Śë~ˇ”Îß_÷E~Ő˙6řŘ»ôDĆń#˛’gÎ8V*“ {öľ~ă٨dzŹ=ÎTéłg´9e™=ö´T©=íÝôţ±±ÁłBIfś?4ˇ7&¤&„TŰô¸kĄ”ÂIĂ”qdčy)\ćᦍnjŘËš!ÁKź$SřÍ„Ţ÷MXË´5YËčit€Ć¸ę€ç˘±BiĆąí4¦r‹­4ú«¶@%¶®–™¬4&řЦ4:s>sś˝Ą~ş>đŇ`¨÷›ˇ/‡>šŁ,[EËŘpű‰\h»üíňÓ`šäŠyˇÎ­±ušäŽyív ˝ď+™ß>ąÄ™Č?aCă÷ľ&˙ë>h%ăÖťtcë4h%člţ%˘»úőňb 9ĄłVýx&jŤqÚ‹G„Ć`ě<Á¶D2jă©ÔŰBĄŕ S>łÖaşŽĆúd\^=­çŲoD^ĎęçjJo}>żO˝ńq8ťôiŔ:>®žîVĂ%ŢLëÉ|_ŢW4fZ“©ŁÝŰ©–…EˇJ Ý‚ÜZ Ŕ\B ú OCŹ HBŁJCĄžőĄĎשcEiEóŠš ý&la ŔMÉęQŮęŇj¤8W­ý˛L(ÚŢpÄţE‰Ś%•Â’űnÁ+Mş¨híę1,ł®—ińÉŞńňp-Ô5Ăś±()1©ä,f°ł8(9Â3SÚĚ Ă´˛/…a®Łä$[EËXLŐf8d©Ň›ĂvYÜrr»+űµŃ©óŕŚ¦NĂDa8îm7HQ .'wHOB»92ŚS#·Z/)Bţ¬©µ¤ă!yţÖëŘ]-dmľYY­ëé÷ľ×”Zót iÎÓúĂL@¦ŕ§“ŘCĂfsr˘g™/ĹNŇLç”4u<Đ q2Hşpvă‰Ü“ Ćj0Š{»~hęŇÍý`şôĂ«ŃýOőQČ_ů‚~0Z1…´}…~h†žE?´Śuë‡6¸“úáĐ6úá$´F?´ˇÝÜ~ŔĆÝüüĺęzpőůÓˇ^L‹óě_cë4H…C§ÍŢţýóúęK·Vh%Ë˙‘V0 ,;´‚őŚ;™p Ť’{µW«Ř¨˙˝ ŃQXtJ‹’@4‹ÉRî°<='y am2&î]Q[m–ŻGTi*-M˘“UýL/‚b™Ćó)„ďé!őá°Yu_OîéŻH˘©­Učíüţër2­Ű¬?š¬Ş»=MBµťďőŁúşŐHű:yB©ęöäIä'’'ZůH«ň8±%˘™Ý!J¤–Ěb6¤˘ßFöŤ­˘eě€í%U{ÔŘfLł ę”"‘ŽTÖy@FS§1:ěśw;_ˇH$+EK “A ;›ÄEŞK,„hƱ^í  hŁyévR­ ›TÜ •\–gřŘĐ2Ô%š!-±př™¶‹ű×ăR¦„äŐÇŮhŚd‚s˙E˝Ćŕ#.R5rë˘ämŮ)#3ĺqŽ]ś\SůΞzTŁ–XŁ HŃ1®ú)t{”äŔűBlčáéAĹoÖz•'[EËŘ*K ăvĽ»ąşřŞá‚ţÖE”­ űáŤ?;O.nĘůt;ă?3t~ńůçźčýOÍE;eq$‘Âzń×wďFsâš|ľŰ˛°ţüi9¬ďç}Y桚ÍęĂ{¶´‚9á3ŸŽŐđăÓ†T®˙˙J“~፲ą”M4ţiٰ“endstream endobj 96 0 obj << /Type /Page /Contents 97 0 R /Resources 95 0 R /MediaBox [0 0 595.276 841.89] /Parent 88 0 R >> endobj 95 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F20 13 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 100 0 obj << /Length 1768 /Filter /FlateDecode >> stream xÚÝYßoŰ6~÷_ˇG ­Xţ”Ä˝Ąm´Ö®qűŇőA“•Fcy¶Ú ˙ýîHQ˘lÉqcoŠEOywŹç—óŮ‹_ł@ť`~0žAu¦”dYĚźCĹL¦Z„óŰ2Š…áĹű…o˘/ó·łËůŚţX iŞ”hˇ‚ânö÷ěó,f4x;ŁDč,¸‡6%Lëŕn&ąhŰËŮőě÷NG JbOËKIJ@ü„&Ę`ű-ż+·d° ĐÁ$ŃRZü„€ ł‚ľ:FIL@ÁŹď{ż»(Î5l RšĆŮă+DŠt|mNWě)Ű[ ‚–uD`×{¨$|8=ŞV×aTRŚQ]\]µ*{A0]˘y»ˇ×e¤XođqĹ’˛đ¦ŢŘFľŚbEĂĄ}[”ß«ĺŔśvxµ°Ťmą1CĽŞÁ!Ă•m7ŕ“Âś­¬[¬Ęć…ęÍ_dĎ;dB8u %ü'{pĆDČ…ŮIRX/ ď„?!$’Tž©ó„„§l2$śĚÁ8 *Qµ!áŁú ľŤ}7˙ÁĐBŘĐ@~íCß6čű5 ÖŤí άWv q }0Ŕľr.?eśCśÉ>†XJ¸!qJ)J¤Ôg ˇ^Ůtµ2‡C診:„Ę…‡ęő%lę'ôÝ7Ż uůq¤¸˛q„ŤÜ>ÖV¤©Šo q™·Ł}Ů÷ćaí˝ő:öŹ—…BĄ…Bea«m“›ăĘě#lFĂü«Çç˘wf!‘đĹQo–§x3g$aâLŢÜ+›öćVć°7źUç͇P9oöQˇ7OĂOoĐžâÓBóöl€$<·ďc.Ý^˛dĹťS?ŹâTK;­Ţ”xŕ×6ÓßV.a覦Ú*5_„×ţ‹ ňÍ~şŃ顣ó{Đ<@ÇÚë¨Ge÷ăŞÂh™Ś© Őň§ĚŰ8O a“ía“P˘`ˇ± XXËĽ›HĄÂí„SÜWŘĆęŤU­ľâţł#ŰŇJ/Ş?(ĺ¦\E< Űů=R f`D“PCWSŹD}ŞH&Üv\ŻĐ¦×eľ)"ÁĂŰ‹íj×D<cČĚ—“(‡‰·- ˘¶H6őŇb¶Ë©« d?ë5ştUäM…>}Eľr›“‰‘čąÍ@+¦Cn'0Ú&ęö űę›9łsŕŐčź ęr2xßÔw]^Ć\V¶p›ýUa÷˝ÍÂj;×+ ËÍ Űi _Ú&}˘ ]4 ĐđČÝZ] šîóěxŚKä1ĽÂˤ}ą^{Š ‡±4ČŔ€‰=Ť$čëľeŹX öq±„–ŹM(ŕŘ8¸Ô芅$”ŞI]f&]¶e¤“±uĘŚ(ŢŻSÎi`ˇĐäJ©("”hĎ6XăţńĆ3ϲNôńâˇBŤ$NWě)§`‚Ńw˝żő‚$°ĽłŔju= bĂۇuq{vµ‹M1VÝíMđt[Jn•Ĺ8M?îc(Żđ‚?2cpP{‡¸ws-I UĹÇĎcČíLäBŰ»®ÁŰŕ۶XĚŔ† ňÝQsĐÂÓŢŢ ŃßŢ@täsjQÂO2Ő‰ 7ß o“Âc­öɑ׎pżąKQćzÉ˝ëĄ#ż?xŹ˙ÜMs‡µŕŘ' ţdÖňM±–Ůe->ÁZGc;šµ’ÓYKH a-pIđ1¬ĺDĎÂZž˛iÖňÁM˛ÖY`9Ö: «e-–­ÓŘ"ÍoyF8oegŕ-!%I29Ę[îMŇ5—šŠ'đÖN™©e˛Ç‰j´Äsańü0Cmj“4ŮR—#¬ ó6€ĐrPęóĺ q ¶Hôé4ä)š˘!'˛KCb‚†ŽĆö_ҧ€‡ił1&ʎ!'zň”MÓn’†ÎËŃĐaX- ů°^_âú L{u9ĹEž%ţG\ÄiJT˘Ćs(®€§TŔ2«—Çq‘}´EŔĘŇBľwŵľZg©-Á Ő jO-ĐĹLŘĺGeö±Ž\u¦[—}™K"Î~^Kwt¸}@x}•őtwO›KĆş­ŠrźÄř•&JÉS~˘µzâ^‘őH˘±žxč„$Ż&Di»as¤ěĘĺ”xóĎż:Üđv Shę†íŕŞÜäMąheŞćÖ¶:ţW*ěŠ˵4—{xľ~÷ęö?s…¦Ö˘ćkÍú—/xU§aaJÄ|żţ¶)Ę›:â:Ü|- ž/».Á¸SąˇíoĚoŤ}¬yäsűäQśA˘ŢÖ^Ń˙µ6ĎÍendstream endobj 99 0 obj << /Type /Page /Contents 100 0 R /Resources 98 0 R /MediaBox [0 0 595.276 841.89] /Parent 88 0 R >> endobj 98 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 37 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 103 0 obj << /Length 1819 /Filter /FlateDecode >> stream xÚŐYßoŰ6~÷_ˇG­XţÉ˝µM:´č˛,I‡]áŮůgFś)ď˛ohs&ĽĎnFZŞÔľťŽţh1xV(ÉŚu}ÝBHM$©.Óë6JQ + SĆĐÚĄ°™Ă6˸M Ľ¬vɰ',Ť˙LďnM”‚‰2ë@Ţ/›2‰aálŔ*”fś—{±ÂL¬ŘJŁöYz¬eÄfź>‚ycÂFŃ”Fg–cĂ\†ť~˘Ó;:îí2KçÚˇź!ă8ęˇS,¬˘6 ś:a]áNűŞW¬ÄÇg+a= ViY©ě¶X‡'cMţ'ţŰĂ]!Ť8ťuÎâűUËVÄiŤ7sŻ'”ÎlT»[©;/ŕFVf%6-a±ałŐŘ|˛˘˙Ó+¸Ľqů6ľXĹö$>–c#©-ň>Öłéíő8L _×ő~ťM ĄŠ}őş–ˇăe‹Üőýł®ď¨Óć‹ůî:[Ď0kÄl~^uÁm^“$›âÜĹŕ`—Öś&ĐĘaćdż3:Ű-N,dTQˇ<Ô44YMÇŇĺĐŽĽŐµ'ń±ś´Z!‰5÷X ëT«Ż´Ůihǡ5!Ý-Ç…´Ô%r(GKźÇŇNAęÁ4ŇÍ âţµÂ†ľŘĹIŘÍ0žĎćëZŘ!vcK8´z:+w€ö±r3¤ĂĘeź¬$óÜ=^.e<3^ VF°gŁdŁ%“vz$ďŇ ·ŕ™™Ŕ~.lłšŹq6·7Ńö¶ŘH¦5‚e¤îĺ|ŮST @ń Ţ“2a°‚tu~kUăMÓł±âÉĚaq{Č˛ŁĄ,ŤĚZ?H–R*f˝ĹBxĚNÝWÎţćBWëDvW}ÖK¤tźçUĐ×j¶¬g çEb f€Č¸ˇiŘ»BVÔšAžąś­ëju˛Ę^ÔđhęźV2ÁtŮ^a6ˇ°ţ2ŕ´µˇs*ćG“şËŠP•Đ«“ź’“"u˛sìiD?>:>9üu×&$L‰#ďÔH´”ł±b!zЬ˘ʞ#”4~U¶ ŮN>öär´xąÖýrą’ąŇmÉupÍžľ8NŤD©qMŚ 9şô%,‹Ě$„7j‘ŤIoóŮ:©ŻR˘—OÁš>¦/Ô^tÚ}Ô‚Ä V°Y|cĆç‹ŕ`4A䄺X-¨ÍéÖ‘žÉű!‘Jç2Ttś%óA nŰ äÝ@rVFz7Ř€íw4†d{÷ţ#¶pxôú·^ž«$j,řň5X÷ʧ«·äŰëč™[ťL˛Üř–6YnbZ-#Ó®csÄŢ”ÂVńuŢ‹­fJ}•:hÔ‚¬zČ B9ąĆHXKŔ¬b{Md}C݆ĆÉ2Ż'łůl~‡ĹU0 LÉb”şżRHÚPCé…”=™,ĺřNţD·ă~ä%Mr?ëurŘýÔÓÜO•ŽqažÇý:`{ÝŻC˛˝ůôn( )nźG®„uż\ŕ6‹ĐŢ•ëľ(dám˝(¤ĄÚ5áĐ7[Çç$>b 8›#‰‰ő˘ó]ŁĄJ4UšÓń°Ď…ÉĘRťĘÖÉ]| ž°ŘřőµŤ^ţúí#5ä}ΙäQ!ÍŔ…ţi=lŹŰ9żq»n„ ´k9vÝf<˙:6%řď¶ZÇ÷PęBĄD ĐÝjqű݉‚šż x+ϵůž|·{›©JVźPfÁĂRš‹ĺŞŞ“D =ŃT^­yĐěÖD¶ĎEA{ö±$DuŐŇpxŽyzQÝÚWT7C¶Šę&_¸ę|´l˙çU§$®×ţţ«N)=s[ť"?9¤cčń=˛V¦OŞ›#PŃ" Í:(´#Ţ@ą.ĺâJ@÷ ·.¶č h)RüPÁŢQ˙T°“T˛s˙˝U°—TbLx»ň›Řď×ýÚ{·xoˢлčĺ[ŰáíŃĄO!l”¬s©~^ A30„ ×zYĹŔIĎş¸NۿƖ~¨Ů ŤÖBż$‘Uäĺ>=!K8zĎ |ę»Ď)N±Їd2ŤęI.Q§¦ČŻ—ńcĚ u~đűŰÔ˙˘ üé¤ Ě­zůË«W¤5¬<]ұ°°ţâv5­.XV—›Wuď¨%Ő —©ŕm„řá6]ĺŇqé—ń)á+ăÂU¦ “Nă?Ö ¤endstream endobj 102 0 obj << /Type /Page /Contents 103 0 R /Resources 101 0 R /MediaBox [0 0 595.276 841.89] /Parent 88 0 R >> endobj 101 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F20 13 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 106 0 obj << /Length 2284 /Filter /FlateDecode >> stream xÚÝZ[oŰĆ~ׯŕ#uZn¸÷Ýľ9¶S8í4v€˘9y %Ú"KŽDĄČżďĚ^x)_bá´= ®Éĺě\ľývf×—ŁWoLb‰U<ąĽN(3„ç6Ń:'ƨärú)㌠myzy[Ž3ÎEzđ~LÓ“ńçË·ŁăËMrřG›'ZjbąL&wŁŻŁOźód:Ę“·Łśpk’?aśjmr7ڇń|t1ú­–‘'gDjÓ!jL ÔT¨đgWJŞdšIÂĄFAŻŃJŞf*o¦yIśâ¬$`# ~ Ű6Ť*J¨JZ"ÖŤK ĘŃaĺ´“•qAň\í”ĺŢĚA–…Ův* kIÚŘiJ‰•Ň C&E˘s08gÎŇŹ˝3üůp ˇMíYkr˘YýÎăÁ$9Ä|(śY•µd (iŃ0l+ůćäťSî Ô<8=ŢV‘IËíGÇ(ëa%™b„1ÝQňČ©xq¸­ť¤ ˘%’Vh~<Ć‚ya™íQěá| îÜĘÂŢ–Ľ6“‰ÖţĎ1\Ą`w)ë¬ôŰ^ętZ®'«Ů}5[.đ†IgśµţňßśŠ9Ü-ýź‹t×ÜoV·áĆ|9–4ťŚ%KÝÜą_ĘÉ Ë®żŻ«ňÎŹ'8{ą¨pjË/pä7Q2Ţéh Oďńf…Ł%Žţ±_űq­Ń´ü6sË”ăڡnjz÷dܬEË=ÂşĹP _Đ/¶đŹfk-ü­§óđ⢸ Ł8Ś6äéÜ+ÍLę¤č!±ĺéÜ;É;ŰI€(xĄ*f ä~n˘ěÇő]^űEšą~%š~Ăiî5ďž­@Â~—J˝ś˝[‚v±wś˛ÍŢ|{?Y·˙%{Kˇ@©‡É[JKĄĎ"ďřÎ>Č»%k7y·•|ýô{ÓălʉĄb/ŞEYëĆ(¤#”–nŹqveŁRąbĂ”MÁC@Ő’qHśôł)űŢQjÍĄUą „¸ěL›Ü+śYL x˛‚—üÍď»čyÖđrŕ×ßOßE˘Ťä\EŹZNý©°ą+Ő 3o±ga޲ت†©ą!űµČ fDXílłOŕĘŕdMg!Lu>€k73ť"5«ÂIŻâb+?ˇX­ đ=ÎĎܲĚ:"®Ź)”ĆŢ#]Ý!hc<±ĽŇ=âŽt‰Sq}—Dkńröm ÚĹľqJ‹}uŹ‹$#67O׋ĂF•V +¦Ľ0¤^šËgěP:L˝"§DŚęM•·i-׺±DPV®«ŐfRy4vh†k˘ (í ú~qßó6DY…˝“¨¬‘5ÄÉ ŢÖý`‚Pť-·yŘÇp±í˘¨µcL~o©÷ˇüşńŔGĐď˘ćVŔ~<ň{çfÔŠj:ĚÍyŞ`ÔB9ýÁĺ–Žň6Čź‹oLĄ®=‘:R."U!yľŽŚě0ĚW/dáŔý‚ď!AŘ2”"ÖęZ“GŁĚ‰ŕzG”¬¬%Ě›ŢŇY DÇôĂsL^.?Ś9MĎßm«Č%'Né}¨e=¨"8šPa:*Ś9K/OÎ϶ŐPřaV¸ő˘¬Ő@AZwÁs~ŕ(…M)4ŞF$•îýS¨şŔW€:––«uď ôă¦&śx@N±aD9VxRőWú†ś1hyě˛C_ĺŔBÓ˛oVç…:ąq©GąĆ]4ďlťşíçą2Ďí(8×±ĐÄcµźV`ďKmúUĽ¤Řţ.Ś™2…«âtKÁCb íşŹ=Ë}ŢkŚÔü)«§řŹ)›®}–őÉé<]l—Üst&Ţw©Bzçkâ“7aŮLDűîa=&t<üşZ®ú®—915}íŰóď…ĺFÔqÇ&ň4ă@˛wâŢĘ2ź´u.ŞUϡpS’OďNÎ:h@°Ń™4O8ö!ű‚“lGÍËĘZÂ^ou–Ńt÷Ë-Äj{Ă—+‡Ąe¨P !«Ë–k O}ë˛Ë î}–!J™çłČo"ËThv8°âŮĹt K˘ĺâ {CŰĘÂZ´îŮÁ)ěÇRJ™‹łúeń ˛˛–°^|­…t‹Öë=_ŘÖvX˘ňÁXćH.­rđĚŐ“w 9#-ţ™ÄÁ(Ë|@–(@SŃ|6@ŽĘoŹ0™ęyD GŘcŕĐ0KŔfä€i^Ž +k ë Ëy˝ž‡ű†Ý…jT:€DuA˛YĚľnš¶rÓłőźŔŁŁMžĂ&Ąôď ĂS’é €‚¤tęٸ(Wß°ĆC—NĘ“Łţ! ›®¦¸ťČ€Hq×<‡÷^Ś +k ë#Cĺaśň0m@şD ćŤ5Řď›Ó- €@+ÂŘż(ՀıÁ 3Úµd‡Ž s‚ý¤^'ĆΠ ×třëę3Âee-aŰaĄč@]§8ÎÚnaý§ŹhŽEë¸9 ]—`ý´ôVłô«ÍS?n7Ă÷ ű “Ő쪝GŕÓ* )&ťć$¸ążŻăőFă˙Żv_ĚGEb€/Ă(6OA1#Śó=ˇ¸¶ĹaĘžPĽŢĚźběPťźúAD0řČlmZčWľĎncźÝ6Őń<¶Ô¶Ę˛ŘMŞóŤő´sĄ‰Râ_[Ł1x@ČY¨Ăő· Ä~oüŘ ţVJayŃkírÂŤĆDT—UQQTÖČęRcźOĹŐPíb:u_a¶ż€,Fě§Kńă˙' r˛FďSÉD€%4ô(#°uOzc"âÚ™"˝/nęŻň"ýsĚsßÜ ŹýĂEą*ŞrćĚđC>Žšoá2˝ŤHć÷ţˇ±€mrřŢ˙)=¸ ”ąĹÎwu˙Ë«Wř VžÜă§âÖ_nV“ňz‰_hV7%YÄćI§pĄ®ĹĹI.|’öÖuśđç©řŮ_!śÍH®R&c4ţďÓendstream endobj 105 0 obj << /Type /Page /Contents 106 0 R /Resources 104 0 R /MediaBox [0 0 595.276 841.89] /Parent 107 0 R >> endobj 104 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F20 13 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 110 0 obj << /Length 1655 /Filter /FlateDecode >> stream xÚŐXŰnŰF}×Wđ‘lĘÍŢ/}Su_«@Q#ŚD[B$Q‘hýűÎě.eJ¤l96ЬĄ8;3»3çěY˝ ŢţjGśÉč6aÜA]b %Öęd4ąIe–3iśHGÓ2Ë…éđ*céYöyôap:°„ÂKMŚ2Ä •Śo›Ď4™ hňa@‰p6ůcJsÉb ąăůŕzđűÖGNň–—wŘ>$č1*1\Ş•Ďď¤^C:sČ2˝ŞĎ®2§Ó!>L&kLćËÖ|ęçS?ŚsÉhZ ©biąŮŔÔĄÎż ăzŠe°gЇ·KÚŚçÁr…>ŞŮ˛¶Á%ţűvźˇóz¶ĽĂŚ zÎq*ä_OgV(›ăzV-IČşUe‰v&&M ˘ć˙ßÎŚKąń‘s]``? ‘B†~#śŘ0Âh–;&Ňł?Ď?î7SŽîíŃF?Ýqś8ëú{®ń•·ś˝Ű†ćD0»Ť‡‰ľ‡âs›Žďĺ2AýSě·Vż ëâ±ŢaÚuU¬~+‹IůT{ĽI‘ľż< v[…-5Ć–‚¸5ľŘ—đźXZĚŕŐ{ÍżŞ™Î–·"%ďéÁEťşđl|ďV‹đEđĐ\_f\# ř§©or\P·u™F Ę'z—s-SnCO#‰‚)ą „GúTâĘjČě~˝Ě<î†<-6•V®®Őm|Ů-‰3DŘfŹ˙¸ş¸Úď-ÎQL'Z8Ä÷toaŤMo5ľň–ł©q.ˇbĐłÚ%,ćbô),˝ě´?·‚pń:WŹ'h5ŃÚě$8Ě`{OFg—űÉ hzű:Ű]=šś†pgş»w~őń>F§ť®Ô–XŢ´Ŕ¸ĎżcDđWŇs¨i*2¬»ą]—žbŕě”:>öśk-G~Ě$2Ňáŕ•ŕo+đ $ßPa‡˙4#آÇć&äXrĆű’ĘU}ů™|…‘·Ö}ëT ˇh”Ă›H5Čp?ĹáLă ăW:ú4€\_&ćÚÖdHçkDýúh@1)÷÷D1N(•I+ţŹ/Dňŕ,ÓžÜ`´W”®ľŇXlű°+-Ús€M‘†ŔiÔbe˘ŽŘ áĎëŔ¸žÝnlHcçĄ× Ą—&EżZ Ára •¦Ltí™us?o¨TD*‘ý‘[WŔآ„CÚł5Ň­Ŕţ˝5-G‡PÓ죆@ÍŃąý›¨‘@_ÔąÇQ#‡yh®ZĆČÖ_ń0)ëC¸ieđJ¸qŻ€ mŞ{QĂ ŕ2Lăxhd¨{#Ř› –ľ–9ËűĹ—‘š>$E5ĺeľ×6ăuTW{ZČc-Ę|ĐřUŹĘ™ ™öBnDť—’ţÂQďx/.˝ŢĂŠ ŕóT4N cŹĘe9öNPúěѤ ¨¤ëu٧â5ĹOňJ±×Brbá¸~1®[Žáş1Ůǵ8€ëŁs;×Ć< `Ü·J ×ćqT ‰ .^Ť`Ť§Ĺş×\míîax]7·¶c #ĆŁĺÍÇł‹ÓŽ€„ĐĚŠmč#DšBŹ˝ 2úĘ[Îş‹ĺŚÂ-Ví,öúě/\ĹéçC”ÔÚľ.Ă«źäÖ Ł˙$‡SRŕîqšíäĺ:\«"ől굿©áÜ…Żf‘d<›r÷´÷óî} ĂŤŹĆîLŕ ´ÝPrŔz†LqŔG>ń´˘ooRŁ$e¶Ź‚G“BËŃ!RhLöIA …Łs;–´{1+0cO(dć(ˇÖ<‹†c¬ę¬Âľş(žŮ»ôŃ•k¦Ü\ Ď»ô (0©Řćđ"zľň–łzPv_í¬úIzhíă‡ŃD‰~ˇ/‡i6a°ZĂ÷„ţ0SĄFs^ô/<eźŚ—ÁUݦĆŁżŠĆ^@QÔŻ @ȉrD)ů’ßmźüÁQX»J$q–ůß]4Ń$,X¸†±Yý…—‹?áÜmµ›Lżg‚¦EëuxąÄ‹G9‰63ü}Gő4‹3U:m$Í|^ •éűË“7řý›ć7°¸źĚ‘SŻ~yűv‚" *±ZyşĂřŐýz\ŢVwéú®$˲î„Ý8×T#\E>ř+Űߡ"ňçđÉ)ŐYn•Đ)×M5ţG‹5endstream endobj 109 0 obj << /Type /Page /Contents 110 0 R /Resources 108 0 R /MediaBox [0 0 595.276 841.89] /Parent 107 0 R >> endobj 108 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 113 0 obj << /Length 1344 /Filter /FlateDecode >> stream xÚÍX[o"7~çWĚăĐí8ľ_ú–]R‰¨Ů¦ •ŞFy 0 HČ0ěŞ˙ľçŘ3`ČL`CEHŕ±Ď|>źm>:gżÚħE2¸O·DP—C‰µ:ŚoSŮÍ4N¤IŢÍ„éůu—ĄýîÝŕ˛s1谄‡%Ž&Fâ„JFŹť§ÎíMĆš\v(Î&ߡM s.yěH.Şö¬sÓůcA“Lp˘Ś}!7\"z*uő¸‹’+™áŠeč3FÉLb!L”€—Ô&>J1qbŕ›¨ýĐf„é$‚|Ů7ˇ8Çšť3+’v(˙"¨Đ Ć QjG‰˛Ű(9Ś0â”ňaRţňÄPA´°>ÎQ—›t2,0DHŠ‹Ě!:m-`Ł]jÍŇoŽżz_ń¶˛DS]ß~=żşŘOŚXąťýŕ˘D1޸,˛+‹ŔžÇËÖGîÄ{Ó˙ą¸Űwć"”Ę$Ęŕ«+!yŔĘÂ[×Ú+ĘŰ/:E­Ű†)·•LCęY˘µ%@0Ę@MeŇő|ú´†˘ůG›ŽóoÓQWmžű0Ô#ˇśít3†(®#L!^{ZWŹłR‚~Ű“ĺ4¨9ťĂP‡k“}ëí۱Öîd+pMµ-ęšÄĘHX§î‡H|“žĹXżQŢď5đ¦ććeĂĽTmć?ŤĆ+‹Ŕšhl …RǤq”ĂŹCct đY,•ÇSÂŁÄ.‹WyáyË7Ľm$­ Ť¤]aş<Ě‹T•Ú®Ţ`»Ť€Ú¨Z›ěSŐ´PőhßŢo»•p:‘öS±´PVg˙ď«ßž…%§NlěNaTŤ•E` žIň®v<ë-ş¨ČhýĎQNJ(ĹO ‚˘9áşVóšMđ5˙Óźž ąö­´Ę6zF‰ű8ô”pŞpÍ›,n %pśŘĄgď÷«Đ/poő),ë w5*Pn˙ťÎBW9©H<•ÓĹĽČ\„ɉ&Ă}·*ć·řGĎp¨LQďĚ+?Z`ŤŔřy#e}t> ëÄ@€đręN¨M j“}1°-bp´oď'Ž™˛•r•8­ÉĂZP™˝‰l±Ú• r덄鿞µ @”¬Ź#‚râ`­4)‡µ"mÂ-#îž“âÄłî8¨h¸Ż…ßŘWë™Lßµ¸?V+őn˝Tá•Ýx ˝ŢSÁŹT`,aę %jS”Úd_Q\‹˘íŰ‘ŠÂ¨úŐÍŕňÜ'3ŠP%_Öf­ź #]•Ÿi%RÜwćϢ…S˘Y¨_:Ib*¬,kpS9?»9Źo+“•¦|AIń\o×řÔżî:™žC«zżIZ˘ś˝>ůo®- o/J7k Ř8¬ŤM­v‡ëŠů©U¬ ¨Ë™úâ/ő@;č*˝ůb¬—~ ¬„lŁ/‡ŕż*7Ă14ö®ÉŹ žÇúă=ĺޱNEľ Űď r±Q4 ç÷NCçŇËŐb+T‘×dXTÔˇb­jŹ ‚ĂqPůú˙#ł 'Ű…bÂÉ8Ë0'N-áÔ Ččcť%ÓĺđałmČô{WĐt ‡Áy^ Ë|\ŮL!Pßňű7U:©2[†Á°6$(˙—OŘ˙ ó€˙˘Vg&ČŁrůËŮî 0óhąôĂůëb”ß/°ĹCNćyů¬äÔŇ0›¸É†mđë2ű/ÔCţ~9Ąş›Y%tĘ7ş˙X~Ňendstream endobj 112 0 obj << /Type /Page /Contents 113 0 R /Resources 111 0 R /MediaBox [0 0 595.276 841.89] /Parent 107 0 R >> endobj 111 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 116 0 obj << /Length 2117 /Filter /FlateDecode >> stream xÚÝYYoŰF~ׯŕ#Ů”›˝Źľ%¶‹:¨“4r‚˘A‰¶…Ř’BQúď;ł»¤(‘˛âŘiĐ€Ĺcv8×~sěóóŃÓ_mâÓ"9żH·DP—C‰µ:9źľOe–3iśHĎŻĘ,B¦Ď^g,=Í>śżťśŹXBáŹ%Ž&Fâ„J&7ŁĎŁ÷h2ŃäĹálň®)aÎ%7#ÉEĽľŤG´YZíę‚JeŇ1Ô7\ňŔ+«ĆŇ+Ę÷‡) E­ŰŘHvvŁe°D˘µ!T;Żm؄ʤǯÎÂĹt‘)lVă›NđÁb^łůl~žŐaťMgó °×˘ş)ęŮbž]T™âéâf‡´˝żĘ¸Ćmďďŕ)đ/¦hě˛Â \ÔÁ‘ÜÉs®ěFrn5HkÎÂőeÁKŻrÇ;pĽ;á*tţßexS_Áuä·«· 5b^ˇ]âş‘b Ď^!wT —\aUdÖ”uÄb=“:ŚöaRCŇÁ$Ű۬ŠGí×Ë%”#ĘÉaÁt`†hD©ľÇî@ę!%•"†Ŕ#Ą-1:ĆŞ®Ö“z`› CŚ•q›ż]Η=CK´S-·Ăy@YíA­Č+ď0 NęŠÄ,ä±%ţ¸.ŔMuą+g’0)E¸†×ÝÂqf 3nKşw™“iŃĂD.v”xá"ŻÂI`aí–poĘĎkżéWhÁ}¸Ý ¨oŹĚGn”Šł=Ŕ­$¤GŠ4×Ał\VţgX˝ÚYŹÁZÁ(«ĺŮ"¬Żá¦ ¨ż-®áá:˛X\„”P„ŰU]Ô¤ĂÓۢšŻłřSAř-ÂűUYÝÎ&AЎőţ:2ŕłÁ|”Î%Xĺ^éłň&<ý €kµę% 0$„¶ĺ±Ô$vXaÍÉJřß˙Ł*BĂ ‚}uR |hZĆrĎ‚6‰Fo aŻëmzmşŢ,=±w“Ď4ý´‡ĺłx_!°HóÇűí­R5D&fX¦ˇRgŰćă÷2ß8Xm‚žú„˙ĘúkěǵKWˇöřTbÂ64ťŻo>F+ů÷hL|˛.\ÄŇdîă|ó5,6„¨ĆE„ř^pŢoŤEŐ7˝‚†ĹďdůűĂ©•)wÁďҵE!_)Ô¶ßEôű‹g,zđÜ:ăşęT(Ř–Mň}˙űéË“^Ş‚2•HŽ‹§¨3 ĐN!‘Uľáő|§5EĹŔ#…ÜÓżN@üýh…˛SŃÎn/x<5XwĚ2,8s_VâŁ}«XőëˇN?Źřî^áǹظU@ }wđŞÜöŞĽ·WŹËŰ·Ç@ř˛'§„+ĂŻľ|vT}Ç ‚jCBVüžŤĽňłžkˇ¨rB´ßóľő#đĚ>C­Ł´‰0ˇ·˝žĎ>Ż7ynZúĽÖޟ«ăRđc?C8"` бáP÷‰1$wěˇĐ¤“ňô¸ €+mďŤ đ”,V&‘WŢaÖŹ EY ÉÝ»R!´Ě[™Ł _ÜŔ˛­8Ł ç˙ˇ4EÁ&f¸…މç}˙ňŻ„ţAéK\pŠÁ“©DŽ€Íe…´"<őC"§á•wíFŽ ĐSÓ~ďîČÉ-áÔ GŽĎ {6!t*w(¬qkAi\Ő„Ě·n˙FHl Đ|hDޡ ŃÄhŔŢŰ\k§ôŰlA„[rI{ëVů†×®çÄ“0şůŠ]LqN4ŻHĺ–ߎjtĆ5*ôş>}ť9ť>Ă›é´:PŐq.±¸÷“­ičÇV+|(ĽÓń%tnS¬nńş)K±cĂđXŐ~܆ä>6đ{¨í’6Ä"6c™o§b‡Ç­X˙Żb¶…-®SA#l)Hu ď`¤Ú©8ďdéŘ{Í|7v…^ąśc?SżĂ(€Nů+»ÂÉ:zÝ.{Ýt‚›ż#™RDÚű•śIŐšëBg=ćdŢ”ˇË•‡äĐćá@AÄĐĂcš*@D§¬âGš _ű¦¶¶ň͢'¸ÍZĚk-Bôăo8‡ n1?Dü‹ $ľ’nVŔ6Ăb_‚Lš™BóÇ íÂşeË;ĂXÎŔekĆvíĆ6$[ĂX?žčťČ믗M(±=ÇCžÎcŮ˝ć±lx‹§űOaâ<–9Iâ Ă,˝ôç±PVŘv ť#¶áđ€Ĺ‘ËĐô®óůo×ăѧw(“Ă;áP0‰˛’÷wÁ¶ %Ý#ŘUŤ®Żłvă6±Ý䋥?2+«př1´g ă‚x ä·Íć‘OľaL§é! Ôq*ŽM¦rŤáš¦ĂŹ;eş,.Ű‘˘Lżd‚"D´ŻĂË9ŞSN#ͬľ WÍ9ŽČąj0âz^7HČGOđů“&éFc0W3őň—§O§µ4ť,—ŢbřýĹşš” <}Ş.K2o†`[#jXB#(Ľđđwđ‰ü9ürJˇŘ¶Jč8­Coüß}endstream endobj 115 0 obj << /Type /Page /Contents 116 0 R /Resources 114 0 R /MediaBox [0 0 595.276 841.89] /Parent 107 0 R >> endobj 114 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj << /Length 1344 /Filter /FlateDecode >> stream xÚÍX]OăF}ϯ𣭭‡ůţčŰnC%V-mEÚ‡"B0$‚$ŕVý÷˝wfś0& Ő*RlŹŻĎÜsgΙ±żŚGżÚ̧E6şÎ·DP—C‰µ:]ťç˛(™4NäŁiU”BČüóźËOŠ‹Ń×ÁńhŔ2 ?–9še*›Ěó š] höu@‰p6űç”0ç˛ů@rĎďgżÖ4+'ĘŘ—r Á%B`¦RÇËM”R) WD(@_%3™š:Đ”€—µ!ž%NśXř'|›ÓŚ0ťu _ĎM(ɱtrĆc•BFu/–’V8‹Ń žÚ1Â[óäp‡§”'J dĚ3C%Ś+÷Lg‹‚›ĽAŽP׍60č 1ěl ÍňI!x~[ŔYŐl—E1N(•Y'…÷s‘<€•ᱝ5Ćx”z'€v”%ž #źç97ŽHČAk8ę0ĎG0ôSë9ÎreňŐ˛PŔ˙xõÍŹóKl©ępyŽ >3ŤM0bąŔ¦Eĺźofx‰Í2C°ÍëBńÜG=ń ł"ń!ËŃ‘-ś× pŘGĺÓ¨ˇ„;(§‰3üpiw€ú¤Ý†lK[ôH{ďÜö”¶1oP§XjN8ĺŻ [ŇžçÇx:®ĘăŇÖFe×~ś51rXÂă1ňü·“ÓăíŠqčšY±îz§Ů ˘1a÷e‹UvŔ^’ĺŚíÔŮł“‘ĹńEź)uĘ÷îařpOR0ŰŔ‹“ž$´Ĺ”\f:B[©ęÚK´žUSŁ4˝ÍÜ„¦Y4o@ăUtÖŁüó ÷”Ăpăű Ł7 &x ÚwÝZz@=C§¸ Fŕ{?ń¶z‡ÖÖ] ÷^S¶ üLˇÔg mȶ)ČSŘ;·}MA»]A AXźPZWRĂÜ—or…ˇë'¨ÇßĂÓ„1(K4¬CŃN?˙ţŇ#V>÷~1D¬˛–02ąÁw§1t*ř1Ćŕ>Ŕ$l{µJdJĎŕłLŰMgx\ĚÂâU=ÍĽÄë¸5L^đ€™T=`~O.=f”ôÉ0%b!,±F.âPźŰm«ďťŰ÷[ŮĹđ ŘŤ3ő6 źU~iÂá›T'Ă„Śˇ(ÜĽ®b SU­ű?Lū쀥Tl …‘î2Ţ©âN śĺ]PŞRiKĺąĺD°-ŻŞÚë–Żu›­ IŃú…ŮĂĽ*UN±ü¤Úę“j˛-UÝ#Ő˝sűŽë-='훹­V™µ0ŐŰ´Š›¨qSýS8™ŹëÓńÜ»řKĹ  3ęUÉjA8[gqbTŮÁJVkbř&íť‚íňÇ,3`PJ§K)QđÖ{Âa&ĄľřxąÎ†»óŽ˙4Ćťďl|yWĄÍBIE/Ćó­Ťt3Ť=AŰSˇ4Ě@†¶ľˇuAڤr@Pľ˙‹\qĘg P)•Iâ,Cđî¬qߎEH‹łÂ2Čü~|ł.›Ěż‚ćăÎípsQŐ «3¶ţlÍZ©|Ú~q¸»7CÁe>üă—OŘţ ë€ßc‘!™)*­ą˙ůčč żaĐ|rďßF°˙ĺc=©®—wy}S‘EŐĽ%Ž/mŕŘ‚PV§Ż¸ăşű/ Šü)9Ąş(­:箍˙p/‘xendstream endobj 118 0 obj << /Type /Page /Contents 119 0 R /Resources 117 0 R /MediaBox [0 0 595.276 841.89] /Parent 107 0 R >> endobj 117 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 122 0 obj << /Length 1939 /Filter /FlateDecode >> stream xÚÍY[oŰ6~÷ŻĐŁŚM,ď¤ö¶fĐnÝş&Ý€u}pĺ8¶+Ë-ňď÷’’eKN˛ĄŠ•Lžűůóü|ňěGꕬ´*;żĚ„ôLń2sŽ3ďmv~ń.×ÓBhWŞüüşšJéüű×S‘żľ?99=źŚăźČJž9ăX©L6żť|śĽ{Ďł‹ Ď^N8SĄĎ>ăť3Q–ŮíDK•Ţ“łÉožJ2ăü…îXHM,HRmÓĎ}.D)ś4LGŚž“–ÂejÚ¨¦ż¬% Z2č$™Ç˙ĚŞ&¬`Âf=–÷Ë¦Ś€pb\8xJ3ÁíQ^a'Żř–¨Gô´Ą`ŇNO‰/‚•ĆEąÄ2s\ĂŻ2hşięíĽ™Ö¨üę.ÚĂL©şMzS1#ä¨?‹–WŃc6"¦)ˇžŮsvqQ“dđ\Ů#•PHh0'š“ň×Ď|—×ôëĹëi‰Ĺ[Úß× b2Îuֳٿ7ľ–‘Y·=Do¸<±¶ä̵3‘Ţ%¦,-Ó*ł¶dÖč <4-”ńŃPFćŐfV—ôtů¦Z’i.Ş:ţ•Č+"ý¸­6ÍÍň*Ň7!Żń˛ifMzý4«)6f‹^čU‰Bň Mˇŕ ĺwŇ(iČôuµˇŁ7q-„gX«–DdÂR]ŃÚG¬lă–&„äUü%kw&éđóÓÔŘÎ>€xX°‘rdJǬ7OŻ%=FÇjIKrXKü‘ZňhŮ]KĚÓk‰±He)1Î2«DPô‡_ˇâ+2˙YČD ©aĘ‚©÷ľMŮm]Ç0*¸»~§„ť-ŽĺęN¦Ż(UI(îĺhŞ*kY }Ť†Ľ ZźCĎë vLĹ9YrvŮ´ů¶Ř¦o1}{iů@.şx\?c§v*źÓ™[rM= ‡Są—ŕMź%ĺ‘!ÓSöĹ ápG™éé=R$ܢĺædEë”čNwúXQާĹfŮ|BÖ–çl±Ŕ2$™#©/ZYćwíů­ ¬ętŘ×;-‚qˇ—A€ë–ËçČ+–1QĚMóm[S’f2gxý᧸~YWŐ&.7×7Aü`k •ÎŘ(Â^ç)ř_M)đáś ČŻŢA_ăľíVc%Jϸ)ź^˘zŚŽ•¨–¤W˘ĘaďÇ"÷Ź—KAESęqÁldöŰ`#Şî/P‰@ÉŢĂ:Ăš×9ćíząÂyfKÓq{Ň2ä;‚Ż˘Ç,:©/’đ’9µ'ţY3›Đő„“&Ňú‹×ňş_8)<®Ü“.îČ’š#tÔ—.ńz@8 (}áN`¸Őí:”«ˇŰćŇ ¨Ż¨»TÚŃî"ĐUŚ„#¸D´ÇÚö&»uÄw@}Íć Ä^ł^ÜĹsąJ°ˇĘu}Ľ'µČşkM´Đĺě>ĚâtAjűÜÜ-ç×AŇŐrµÝ¤Łé7úPaâylXzń)č](Ď|áÇ«ęvŞ$5ü_Ő»šÝ«ŔÔPý´HeŹj4Ô @©ÎžOâ”x×!¤ÂYUÚ Źl8oŤš|B-xŃěĂó=ăË®qp¬ąY-‡Ýžćs‡"Ń6”BXůĺHr“+ş'j6âGˇzë›}óÉdľů-ťę¬~Ŕ„' ŮpAjľ%c.şábŇŮÁţŕŕí|Ŕ×®Ő"Ҩ rǦ,É= €}ú”ŐctlĘjIö¦¬€8Ć/‚-Ű˙y©,śĆY÷ĎYÂă™Á(—Ź Zč*ľ´NĂŐO}B(J$5ËwÇE¨\ x}äΧ$dźťV˙)DÇÆ7>Ý…ęfKIÔě_ż6íßoVëxS‡¦c—§Š))čúÂ<¦íűsN‘ř;FŃt«Ń©EşS±°Ş¦k‘tˇ:ĐŢťŻgWÝÝ™Î?OĎg˝Ďńă’Ô —@DC—@á­«d(0ÝíŃb?F7h4´“ohý›¶+$cCkş˘lÖß={vAQËóůz,F篶őĽş\Ń˝U}U±eŐ Ľ%‘ĺÂ0®# xá.úD§[)ÉąťŢ(›8yăoŹ3endstream endobj 121 0 obj << /Type /Page /Contents 122 0 R /Resources 120 0 R /MediaBox [0 0 595.276 841.89] /Parent 107 0 R >> endobj 120 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 125 0 obj << /Length 1869 /Filter /FlateDecode >> stream xÚíYMoŰF˝ëWđ(5ĺfż—ě-.ŕ´vÓXŠ9Đ2m ‘%…’äß÷Í.IQ"%+¶QôP—ËĺěĚěĽ73ĚëaďĺŻI”˛ÔŞhx ™0ĹÓČ9Î’ÄFĂëO}=…v©ęÇů VJ÷_˝ţéŕóđ]ďdŘÇ?Ą-¬8Ľő`lĐzĂĺţŔ%Ąx’nĚÔ|*ŕŇđ$˛@Ăëdĺ'5&; ťĆᄍčĎg+š*FöçSzô/?ü7ó",őkĆĺ{ËĽ¸źŚč…ś…3oC,“°s¬€;ü[‚–1m9 bęř1vcÜĐd&WŐ[KŻ46ĹC/!ě»Ă)&UŚ[÷tBhÚGŐ’]BP{áhÝţ=B0&a2}€Ś#u~Ś.VđD¶Ę?RÝĎŠóěn@!×&‡AăĚAv°ŠIQkń$r˘â†¬n°–9ąmöÜĐpä‡ ¬K»ąAs 45‘Q86ÓÍ 3—'ç©`~®”ÜgŕIv5íb%ÂŇmeweŕĄz¨—;aî~`,â’17턺¶N´O‡zCĐ>¨WKvˇ®÷@ýhÝŽ„şŕćBKpŰi§´Ě:qěZĄ>úÉŇ·ŔĆ3 çb2»íŔ=0•l uQřš JĽ`ş8 ĄoÝł#‡´Nu"GJxŃ\3®T#Ş)ť’ý”)Ł„L×ĺł.ôP6#ô”ř*3m„„ۤżôi’Ľďo'łpő©;[îHĎimáłzŃIˇ‚öťôyuMďyČĎa> 1‚Ű `óúąé×T°Aq•ÄaO5„-dł··ŢÚ9[VÄS3‚¤[˛Ą-; pÂ<ť6rö@ą˘_Ţ‚?ĄˇŽVLÍ$Ş·NÍlEřçÜţBx7ţejĐú0ţO9Ą8«őhŐy…Ľ’T%ýĺb¶hůÁ%ĚBJ%íáP2ÝI»’7„…cjŞ$Éئú'÷ÄAíំSďÝgç™jôL¶›ą/’Žd„”ôྯÖĹ,§Ńu`‚Ś8÷Iü6pÄ7üB)&ł˛*S›-Ň}}U”]ľ?żë=E¤/m­ÄE™V®ű|+YqCX0şˇ‘B ęmË꓏'0ĺ|¸«śF X®žEąJÖAĺ4Ĺ’Ţ>‘“7¤ÜéG_6bô¶ôră ­f wĄ—™ŁÂ…ÎíĘߏľ°ö逺-K´#íÂż–ß ŔW8SrŔ˛Eţ,Aq•–âŃúki¬HE Î Ę”mŤî/˛Űú”FýŞ8âhó8<Ö˛U~]® ‡Qý= Í鸊Đé"< í˛ ĽyAó/*—^2c îŐâ——/ŻÁSŘy´  ‰ůýçëb”ßĚ2í·9›ĺ«–ŰĄĚńŠĂ@Ěď(_Lż<čźĂU˘ˇĉQ uQťĆ?˙–ęjendstream endobj 124 0 obj << /Type /Page /Contents 125 0 R /Resources 123 0 R /MediaBox [0 0 595.276 841.89] /Parent 126 0 R >> endobj 123 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 129 0 obj << /Length 1876 /Filter /FlateDecode >> stream xÚÍYÉrŰF˝ó+p’`<ű’›m)UrĽĹ’]IhYC¤lý}şg HµTěr =˝˝×=đłłÁ“ßlâÓ"9;O·DP—C‰µ:9Le–3iśHĎ&E– !Ó§o3–ždźÎ^ ŽĎ,ˇđŹ%Ž&Fâ„JFłÁ—ÁÇO4hňb@‰p6ů ÷”0ç’Ů@rď/§?j4É'Ęض Y«ŕU ĄRÇ?·µä`Jn¸"BTô ˝d&±ŕ¦nJĐ—T"ŢK>qÂŕ ŰőŤiM¤VICé~ëŔ4BEŹy&(Ë…$Śę^eţU ĘÂ]”îpU;F¸bµ«ž0â”ňľR&óÄP ©ĺŢŮ÷Ëů˛ĺ˘ĐDWËÝšCAăťYĚ+]yCY‡e f7-;=9BĂ ]®!Éa/mA·™ŽwmCĄ2iâţ•<(ËĂk·¦ĺĺý•¨%F‰MäpB€“Ň$ZÂdAŔ™2éŐúóŐ¨„Šś.WÓĹm ňĎe¸Y>ÓÉÄ®‚ľŤĘđ m <ç2ěšÇ lvµ°t `sĽ-Q5h‚_ox€Îq­ k«Úx,ź.aĄ6a‡+”µ„‰GzCQĐ+‘ĐyжîP Ó;ťv])¨XÁ÷]a)YáťťÎ3Ž҆3@đ2Bęř:,-ćř»ú"S`âoú`Ö0ăţţ<:Ě”D Ů 3€ ĐJ(Ű(+®‹ů*"§ČKż¬‹ůoа:G0Ě>ű•˛M‚zĺť`ňĽÎ¸ĹčÂ缾âËş őńę×~@ÖĄëľń9Ëńí˛ CR1B!­ĆPCQ†*‘†D†¶îP s‡’á.G™ö{$ą#ˇHNţ|ő˛Ý(ˇND©‡µÉ )ŻUuŘ$9ŃT5l:Z@Et´žÝ,ý©áš®MDřsš` áf~QŚ?dN¦Ăr:ü|YáUŢA»wđî’)説î\*:ŘC‘Ę€Č*őGo^5Úg™)ž ̇…eé—®€ ¦ó‹đd5‰"ŁÉ{îE1/ü;CŻoęŁ\˝ĐŘ6’ K;x„©`u'‘{±Ď–E$‰˛J¶Ů˛śXfŠ„rİ>ŞÉ}„OÁn|sî×˝ůĂUm¶ďç}ÖĹD‚ h úáLÔPÔÇD•ȵ‡ve gâpŰô5n]·q:({´ˇťżŘODę—ÚP W«r=ęęäÂSwňÎÉŢX˘ťŞµÝ~:ĂTeE]yCYČÓÖpa91bËüŁéŐh‘ •$x¨©˛wŔŘÄćă9¸®šĂW“p r¤đÇĂď? ›Çđ׻̩ôŻ]{%WËG17ŞÚk­’ˇĐ‚¶Ňq|úţeć 4‚ďFö¤Ĺ†Âíżáe–Ă;Łű†ŁI;Mą°šXŞĘ7şZ‰·@…Đé˘ÄţĽĂřg”ޢ•:ű»é^Ý 1ú…vrˇyéľ_7¸ EPť )ÂÁ !]O˝¨»ÖËiQ^ă×cDÁ­u#‰Őű)2IáPâˇîe4嵪VŐ@ (0XŘ-š­ł§ xE9˘”Ľ˙<ĺQOľQĆJ•Ŕ¤†góÄi`UžHpŐéĽ Ż˙ Óĺđ˘>ěËôk&(Ě÷›Çáˇ?jă(3Ĺďx·šTܦŇIu´ż\†‡ľSĂőčÍóźqýg_00HĆ1<诖ż>y2Ɖ¦ŁĺŇ3îżX—Łâ|źË‹‚Ě‹U{‚ŇŚfyśL_ř ń&|ż„+§TgąUʶţ|ţ}&°endstream endobj 128 0 obj << /Type /Page /Contents 129 0 R /Resources 127 0 R /MediaBox [0 0 595.276 841.89] /Parent 126 0 R >> endobj 127 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 132 0 obj << /Length 1954 /Filter /FlateDecode >> stream xÚÍYmSŰFţî_ˇŹr[]îýĄßĐŇ(/™iS>8–Ŕž‚ěH6 ˙ľ»w'[ Ů@H3LfâÓé´·{űěł»ÇŰłÁ›ßlâÓ"9»L·DP—C‰µ:9Ë?¦r1iśHĎ&Ĺ0B¦;ÇC– /ÎŢ öĎ,ˇđŹ%Ž&Fâ„JĆ7ĎŹ4É4y7 D8›|1%Ěąäf ąăëÁéŕĎ•Ś „d-)oQ?.× ĘJ „jĺŐ Z)“ÖEu;ĹĆCĹR?gÓĹÝÜ?TöžĄV&8lŠ2¨ůkűá\ëTHT=ɸSDÂ3D ľ?8Üčtn)ˇN'†˘zěqĎsâ¬ë÷}#+k {ű Ü‚ç­Zíçm9ř{lą&·ĐÂ,‘LÁ™1âÔŕr[T5ÎÍJ<—.hś!Zę×Î]ᢖ0Đ-ŕC=Ŕ‡y.>ŢĎŕDx:-¦pĎAj˘ŰŠ í•"ŃF._‹(+k ëŕÂpb!<š%žĄŔ‘›ŕd§µŤfx`H.Óó“÷8Péb&«7Ç(­<OyQŹ«é|áă_Äů"jĽ„éĚű†ŢŕMQ.Ú.gU€âbń—·ÓńÂě n^öŕwŤ=K,čÖŹ=ű\ěŐă™&Rš­€Á&źÄŞ.ĘĘZÂ:€“śh°ąY˛ťm¤)îjB‚‚Ď*@Ľ•Wđ"»ľÉzkđőMőXÁÁ+áaX‡a…Ř+űŔW‚ô.´'T‰Wť ˙ ,WůU ˘ŕú1ěž‹á˝Ń˘čś3‡¶b+Š% „hÔBżĹQVÖÖA±«µ\í·Ĺë2ݶг֗IŃ2V]řÜäYë˘ö0ź•uóͨ«˘,"ň üÉ»đdöĄ-|ręd*T$ë¤bCaÄ(ňł<·˙V-şľcD¨­®“’( BÄđ"×EYYKX—€ QP5K! #őßť•˙P&«<ﬦčQBĂŕ\ynáé;‡afâ}4ĘÁeţş±Ë2ËÔţ3ĚŤ*ţ—D|ş‹0i§˝U%Öăćň‡đä5±†– ÄŔĆýśŔX€Öé<îţľł·wrpřÓFtµhݍ;y^őT¬m(†ZŐŇtâ3EÝBŃŤ"ęŻzB”Ë Hoúý:Ç;ßj„E Ţë…XśŢôG§źaôŢbőp|SK¸K}AÇŮv$>9čZ‚6]ł¤tbSĐ=Y»§ťyjŤéł”Aâ4Ĺ2ÇW)6ôµMS{/ę 2µmŇž÷•żňyd޶tl¶_±ALˇşlöBőQ˝ˇú‹˛˛–°®Ĺś«”»g1ô¸ľD˝ŘÄ ­3üf_|wÔąąJ°đΊ„)˝®šŘ_–ÓĎËáę/÷Ú9xFîČýŤrŕěë}qQő§qîÂ^˝{ÁWź—ńŃďi`š7O‰\ŕ ÷*Şnä "8¸ĂëäKţädkAáä <&Î2źű5ŃjNXáX´Ąů«–ż_’é|tµ*¶dúe(h âř:Ľ, ŕÄ"Źk¦Ř@ăhĹJĄ“ĆţëyxZ¦{G»?ăüĎM”™ŕ1-ćżľy“cmKÓń|îÝ‚űĎ–Ő¸¸ś!{VW)‹ž;'Í ˛‰€P íĎ;_&Ţ˙Č_Â/§T3«„NĹŠîţHí{öendstream endobj 131 0 obj << /Type /Page /Contents 132 0 R /Resources 130 0 R /MediaBox [0 0 595.276 841.89] /Parent 126 0 R >> endobj 130 0 obj << /Font << /F8 19 0 R /F24 22 0 R /F23 16 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 135 0 obj << /Length 1298 /Filter /FlateDecode >> stream xÚÍX]OăF}ĎŻG[[óýŃ·n—J ÔM—Ї"P0$Ř©Xńď{ŻÇqśdś„!)ţźąçÎś3wüu48ůĂO˝‘dtO¸pT2O¬eÔ9CFw׉J3®¬—Éh’§™”*ůmňä,˝ťNGNü8ńŚXm©—šŚź˙®oą0r>`TzG~Â9ŁÜ{ň4PB6çŹËÁ_-#™T[· ˇZˇ#U¦ą\GÉ ”Ě MĄ¶ôYrKĐ4¦<˛lRł¤ŔIP˙śŞMnÜŞŚ&ĐÝŃAh”Éžđlˤ˘¶«~“V8 Ť#DŤgT»QO8őZ×L™…€±LR#]Muś ›Ln+$ yńťć@Ď8ŘŘî 7O^ #Óq>J%O^g0x’‡7×:˛ú1Í›×gžnćPHGŤ°m({'‰¤š‹č4É–XYl›ĽP0 ŇŻ‘ż<űYťŢl†}QĆé¤ó‹+ oíť-Ř^3Ń?™1(ćüЦZiVK+91ĆQ'ĂlÁ M'*VŰä.™ŽSÝ\»dń fő łcĐ" fŇB¨< ńËŐÁ"®ž0ˇęÉB#¦ =LwuĽ W8}znZlÉY÷ÉůĐĐVłńGËYNŤĺ»ĺ¬-Ľ.Ä›ä|™Wµž§“ZĎ, ł,7.i ÍĺNI+N…Sm8GIşÁĘ:`1IĂCoÖ°WŇť”ľŹ¤ý;HâVÄ%-=ŐĘ G/ş-ĎóŞłX‰ą_É*E•<Ż ˘ę‘sLĘĘXŞĹ;hąÔ'će“-5›>5Ý.Î Ę«Őn5+Ą©cú5˙ťzC1äĆp·{]ćPëů6ŠăÖ倕uŔ""–š*Ć×xďq'“źg]Ć ”=QăxYIÇNcër­eÁÎÚü’WsĽW1AËz _PĐWi|q–XH1{Ľ˘;@}Š^6ŮR´íSôÁŃ} ˘%“XfíT´ä¦ÖÁ[}QÖĹőřvw EDĎ«ŚťrP*Bń¶ á(97XY,"gjťô^9wŇřyäŚAI/ł…ÂĘá Sg××ä+$űă˘YŹËć8i}5ÄÇĹ0\Ýĺóq…ź-đvzó¨D??ĺĹ"Üą/«ĐC ¶*ĺ#öŔM2ŘĂş;\ýŔî.ÂE#'i0p‹«!şÄpYćĎÇŘľ‰tZ‡…"„©Ô1˘»,Bóç`Ř*ÄlG0OŤçÇŰN¨Ďv–M¶lÇőŮÎÁŃ} íp(x±Üi;ÜYęí۶ßç—ážJ¶łjŕNQm}Űĺ16łÄĘ:`’ÎQćůÉ˝6ÓIŰç± ż€ĹlF‚™2ŘFr-a{°Qú—ˇĐŻđ˙v1-‚%Ěq7_äOľÓXE»QÎLő\đrÄ?„ ˝GË‹rVK?Ż k\ť:UÇkÓ=î"¶ ś×˝Cűę_.Ķ9€ĂxiŘ·ÄŠ˝C?$f N¶ ©†mőŽ#[ŘüX¶p‹ÔRĹĄůÔ™RÉěöˇ­ÖTň÷Ě·ťÇáaÉďš6Sŕ_źµyĐ:iNyň8 Ëűpüöý÷/x˙ ć?6cÁL°XĚ~=9AĎ…žÇłY]Ĺa˙ĺs5ÎďËTř¤zČi‘/¶SŔZ`ˇô‡m>Šścć_Ă0¨_ÂQ0fŇĚiiŮ~÷üWsľ-endstream endobj 134 0 obj << /Type /Page /Contents 135 0 R /Resources 133 0 R /MediaBox [0 0 595.276 841.89] /Parent 126 0 R >> endobj 133 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 138 0 obj << /Length 2309 /Filter /FlateDecode >> stream xÚŐZMsŰČ˝ëWŕfń|°7IVŞěزcQ{׊„EÖJ¤BArüďóz>H)Ů⦒r Ťž×3Ýo^}2xV(ÉŚ+».ôĘ…Ôä‚jo7˝€R8i2ŽťP”Âe%´!L Y2ńQ2Ä$™Ŕ§`ŐvlÂZ¦­ÉZN÷Ł4ĆŐx.8+”fn·/˙&‡ŻpŚ{µg¦\*ń!ă#ĺ€eć¸bV•>Ôń@ş|:ZR—ŞeŽđlYÂ7Ů˝5u°Ůp‰ÂD›ĎďŢśźuf«Â Čž4č“é ˛7!Šä«h9ë†)9ňNŰa^Ľů'27?ű˛ c1ÎuÖš¸ź^-Ż"Ľőd^˝árwÚ(^Vë0őş:•ÖŚăҢ:­QëE*”)óoÓz®ŠŰ«qůr`D^ßßŃ×b~źŚG÷áâşž×Ţ„üŕkÂÂ’·Hˇ&Ś‹uş=®Rů7?ꦦ ‚ dŢ$®X¦@P ď"<ůFičaŔÉu|9Ó[~Â%ëዥVZľś(ZŽvE2é…ŕťÜw‚ŇäŮč”ćĚ)ŃŻôľÄĆ–`Vąź' †´RýOśý»éˇ pSî§ 0¬VcľŚ&‚Ż˘ĺ¬'ĘJ±R‹Ť(ź¤‰ÖĽýďĐâ(Ĺ>šŇLft 2¬|”§‹ůď\čĺ-ĹŰĚÄmÂ5ńnIâ=LŽéŃy¸źz†M@žZ|ĺ'"y€ńŹî›…§O&áŃŐ÷`ßLé…ČK“úq6öÜÔĂ8B…ăvfy;jf;Ł™z®H7‘”Ţꇋińz¦j1Α áőłA“~*ăç$Ř\ pý˝5N¤®Iâ©GšĹ±ŹŞŹŁ4ňLI÷rŽj9ÚĹQɤËQbG=Ýs9ĘV/&) ÝdLąź¤´©ĺ!±/>śţýřőëO¤HĎ˙ŇCUfú!Jš°Á¸9¦ĺź,wU} ČaŞľ:@Ő(núĹ„(p”Ň‚ŰÂ&=L"`şXĹJr4ń{+v~ qKxń5Ői$€uŤ†űhµÄd6żŽŚ±ŘbŽűŔŢ~<í+đ2 mř0ďtqß„BQĄMÖâ>üŮݮɺUŚ»´Ç„L65'ˇ0{ÁŮŕŚĘYpóŮ/¸í 2@ň'šĄ0Ş ŞýľY>Ś›ž:ĆŽŕJëřňn~×e5lw•Yy{ş E‡fvȉč«h9 Ő†$J ^Ü€ö8PHş9}6ŰĄpŕ”Ă Lľö#”R0đEáĹĂŐýx9»BĘSuě żÖşý|\ő(”†ăýüG‹!K‘)ä.h»Ož»š‡ĺĽnÉ‘ŃM”>"żn ™Y`GęeüGQÔŞőJŚŻrđăůÇíéSÂ0'ě Ä3$­V®…“Ż˘ĺ,DÝB¤DĹ„ŃQź!߼¦ĹĹů°ŃŇĚëĂ`Śľöc´ŠUjse..O.€îôÓzŇé ´Č?yÉ×^)Lbą ň?Ľ˙řŽćqxÓˇ•r¶B[śZśĹ˛›/…´˛C§’Ü‘7ŠŚ;›I4(J”/ 7ů*ZÎ:áJ§ŃL©Ő€>o~Ű‘0HÄҨ€Kľö‚٤F/×Ćvy~q p'Čžláű­8Âäk/BŤťËąM?”-^U |]ůűń¬'‰Tiѵ’ƶ¬2z˙}};P2'‡"Cł­°Ŕ–‚HąŠ"Ş|•PŘ@Iu÷P! dĄ™ÚgL¤d•—}{hôU´śťlź7›ĘËždâ©Á.^wçjq-.f“î,Cµ0—N'Wú÷‚ü˝Oż| ý4EĹ;‹4rŘ!qqפŤa1ďŠXˇÓt áÇb0µň§ľ¤T.W– i9DXőRl-ź Ë7›SgÚt'h#ü3ŔËÓ+ňdR?wľâˇ!őô7ÍVsĐ>\ôsčŰÚk}ß—÷Ěô°©ľx¦ú§O”f=}čU‰ż!áPăfkúTľ•Č-źÂŹW7łÔ;Më%‘Đň¦ u¬©Éü|~L''–’IŘ2®Âf _T\ÉWŃr¶]\ŠŁÇ˘bŽ&ń´‹řéK7`+ŐĆF˛ˇ´yýXĎ›pyů‰&ă]¸ń¤Uű–*‰)¬Ä˝/üqž'ĺ…|Ç…ďĹ2|‡4iáŹo »xl«6*Yoż¸í&†ÔúOĘŻ˙Ú—V­™vh‡úY˙ g·ľ+ţđ0+ă˝ -ÇnÔ<Đ%MŐZÓ»pň&m> endobj 136 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 141 0 obj << /Length 1560 /Filter /FlateDecode >> stream xÚÍXKoŰ8ľűWč(ˇË7Ĺ˝µi ¤Řmłkç˛mŽ-'lË+Ë)úďw†¤d%’ňh˘0`Đäpřqfľ™ˇßÍ&o>d‘%V‹h¶ŠĎ 62†’,ÓŃlů%–Iʤ±"žÝäI*„Śßž',>K.g'§ł ‹(|Xdid”!V¨h±™ü7ůrIŁĺ„F'”›Eß`L ł6ÚL$aĽžL'·:h” N”Éú*d«‚KTHĄ?ďjIJj¸"BTôoÉL”Á5µż¦}Q#ânIŕNś°đ}ďnLk"µŠ:JFĐ#đŚW– IŐŁĘÜV Ęü(H\U[F¸bíU9¬0b•rwĄ óČP ®ĺí®wEˇ‰¶•{Ô‡‚(Ć˝6şŇޞdÂ’ `w‘MĎŢ#0p—íHr8Kg Ű‰ËűءTFCü¸E%÷ĘRżíQWŁĽ˘|<µĄÄ(q4‚<NdpIŁ#­ aŇŰ`1x¤‹‘nĘÄSźÁä{üťĹ+–8Wůőú¦Řű•=¬®ö‹Ş€Á®.Ę-ńÖěP<ĺÖ™ó»#‘ÚZ1g7X•‰;ÇţíńجŔ!‹ 8ÁYŕx›Ĺ’LĆeő„ű×Ij€łî ÓđcýÝow{`†Ű¸žŰcî%oĄăůu-ďÁÇąU>÷F€śÓZÜŇ„—ç¬G –eÁ9 X/ôS(!…ˇDĐ•v”ůhÝô ˇ'd{ b;d·‰ŕ ,Ţ&BÄ5ަÁ¨Uq·eRĺÎ˙k\­{~gL¸”îIô•2™ŻÁjR›#Kť‘˝ŐĚQ‡áÄf /Î?ťß·ŔȏϰٰĹ]}‹u ©ÁŞ{롲 IĽ*ŻëaTR‚ewPM/NNN§Óž_$¤,#‚MŃ…/ëÚ»aTç8ó,Ëd‡d(ňŰýá* | ŘÁ8ĹĂđŕy-ďD<ć†Fú5Vuq$!–ř†C†áŕTűI'z€©kRź”`7&ĄŞÜřĹoNŐ"á™SŽ9-líuhś\áWP Âö»;őÚKZÜݬ‚ű®śˇň%čL”–„óh+:ŠĆÚŠF¤×Vđ±¶âÉč~i[ˇ€€‘n+”˛@üâeÁMŕ±z €3ąG† ?­śËN °!÷/ó±jŢ9˙7ŞćŠ[˘ˇ„Vs‹Ŕ(ÜÄı´b™®(Fůľá6Öër*8¤‘sĄ}ç„a Źç#u\PXŻŽ#K*Ç›=¬nĘćxxXî<ĂŞyČCđ܀ýěϧŁhŚ8ŤHŹ8bŚ8OF÷TâóŚpá‹ LöaÚHŞ÷7őir^ ő˝Šč¶Ţž®Ö>CűX ]TëP¤»g¨P¦ŮőĺÓŰżz‘+N “ ŠźiőUéQW˙Ö\iČoŞ{ëéŮżx…ÓË1öwĚřĂîxqň 蝍däç™ :ˇ3rźűůmľ śżŔk˙ó§˙qĺh^lŻúwż†_KżZ—!kTÝ„˛)oŹB&^ąY(ÄÎwsłă`Îp1u‹e?÷ĹßO_8°Ç‚ěŃÂÂţĐ´źMťF ĐŠ: Â·'.5˝Ë¦D˝ţŽü ‡ˇÜĂ3 @˙|îé(Ë=ŤH/÷ȱÜódtż´hsĄ}¤fsPjřsjö¬Ř4Nü|¨Ç8{<ü7*Ř\I˘şmL—ł+-_B«a|~ĎuÓmÎ×§íŰË˝ł]‹ę´¨Ĺ&÷ŁŻTQ÷\ŻÝčű^¬˙ŰőwŘÇFśyÄ ž»f¸nˇ"Iz‡†ŔĂÂŢ;ľżËćQžë]Äwh,ŕ!–(%üŹÁ4čIŹŠĽ3ˇ¨Ŕ›”ˇm¬&ZBiµîíĺ P[ŰĘx7żn= Ď”DPü/ˇ]ö‹[ěňe)ę?j_?JĹ7 Ö;żč;9ż˙|ň ç_ą§D_đ€ąA»Ő»?ŢĽYb~¤ńb·sĂóËCµČW%>Á«ëślóţžk¨=,‹ Ké4~<„JĐW2<ă8ĄžJčXčĆ˙Ç>ĚLendstream endobj 140 0 obj << /Type /Page /Contents 141 0 R /Resources 139 0 R /MediaBox [0 0 595.276 841.89] /Parent 126 0 R >> endobj 139 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 144 0 obj << /Length 1778 /Filter /FlateDecode >> stream xÚÝYMsŰF˝óWŕ&‹ń|ě-Ž”*ąjŢö’Ía‰‰dHĘ®ý÷űzf‚HÉ–*•M©ŠAăMwżî×ĐŰÉčÍOľ,XUL>Bz¦x(śăĚ{[Lfż–z\ í‚*'wő¸RJ—?\ŽEy1ţmňnt>‰‚ăOÎ8”)nFŚ~ýŤł/ŢŤ8SÁ_pĚ™ˇxi©ňńýčjôKk•’Ě8ß7ˇ[R“ BŞmţąoĄ”ĘIĂ”qdč-íR¸Âc›6mSĂ^Ń,‰»dŘ“dźępgÂx&…*:&OcSF3éĂ08›ŚUJ3ÁíQcńVcé(Żب ‚I#ÚŤJ\,wĘ ËÂqŤŔʸŐÍvýxłĄMÂ+ˇłX9漆eZu˝Z¬zŽpžŮ`ZkOÇ™q¤ĂP¤«ĆVŐ1–Ő…$ĽdNíÁżzü¸ąYĎW[„jľÄÇâ¦DŠW™,ť†(­`B™=Śę?AQn€o{ĎÉ8×E'rßžZ&cUşíÉܤő0ŹÇÎśQ»|Ňťú C-(¬uĚ›Ľ×±e˝ĄÝ>b·ëEM'f(Ć—Ó{śZ.čâ-ťqĺ:žG·ŕŕ./KŮŞĐ>*xÓ4Éxůţ˛egY¦Ĺňdś]ą#qÎ¶ŞŽ±´ů"éyäRwóç˙>ÇVŢOÁ))ÝňUŔ5¶N‚S¨M¨*]lW×oŻîÇ—äęÉĹĎő©¨…úu6¶N"Ő×ü~ ť˙r lçW“śť”3Tµ]ÎJ-äT…/ʬŹń÷Íײַ?•ň–yí˘âý˙ŞĆJâ68µ¬×›t[§"˙±źiŚ*ž:>« ž/rĎ\פŕĚÉPŻęőgŞPäú›úbÖßŮŢňŘ\Ť˛‘3ş©^lç˙áB×ëtá1)'îä;6X!ĘĎóčś|.:¦ž/nó’ÇŹXR†¸Ĺ\Ľ¨ ”6Žěw»d=ç «‰/+˙¦ _”.ú¦’Ö0k¨;!ËÍAČŻN‚ëł÷OÄýz1˙ŚD¤ś¦ę8«wq¤ß±rNđ°ş!x¬Z~D¤ľTŮg ESń śNSÉi×+ęÔ}EaPxť+ üîś}şúH˘°RŮVŐ1ööPŕšE`ł$25ŞYřů¬Me:’čjţ,+­Ëé†:˙üv× qr• ť_mçÔéäĹYúnčMÇŰ»ů¦˝ĺ8q[KTEăWâďĹŐ–˛2´ąGâ+(j’Đ3y`ů•ÉĂÇőb©C é‘%ŐDBůeľ˝KGÓ!#Ÿ8%?0CH% #3Ď™yNÉŹl«ęëË鵡}ŕ)ů!m@Ď Ż.Ű: Ρ`ë‚Űé Ŕ%ôGO|(„Ď™×ÁŮŘ:‰S÷(ů{8I}őá÷ÄdD#>¦÷÷ÄĆilIs ŔÚŁ}Ř—Ż;;Çf׼âptĹça…µ–i´´çB.ĚCG°ąd‹fWçľbnÁâˇ]˘Jˇź\µU,h™Ő5Ţ)Ő˝ď†ĆWÁŚ;ůEY÷™ÄM#ż†f°†oŢĘ«O`„I98)ŽiÓ7Ş˘Óu ćł®h$×v’ti™ď F:—#5éŰĽ ÝŠś·ž7âP¶â\; Q›şJ&tśRÜXâć°©Ëët±Ĺ‰ăí]şHŻš6Q ŻSăqZSIŕŇďÔ'ăę]Yϲ˝ĺUµHç^ÎŐŽˇcdm–ôŘ*ʱőŮčţDş*ĄĂÝiľ*¸Ë˙Ő|ÍJy˘ťçţu8J $Ő.ˇeLq˙bť6ěĐ öĂD¨ĚŁśţń ČúYðîč’4Ńô!^"†¤ťőrbt #Fł¤G uŚĎF÷\b@żżü¬đ¨{Ţź¦†¤ňÂń·«Ę2…ëÍşg!PäČ,”mUcČOŢ=dWg\%ądýţ4ÄŐŽ#ţBŻ4…çĚs•8ęČé†^~'LĆńĹdKN sÝI.öFzg’ßť¬¶Í+Í8ÓárśézÝ7Ît0w0µQž@ µŃidy4ę}4gçé×"ęŻmsĄ˝E$tgóŇ€š"B âVúµ´”u`Ćčo˙O•íT;C)*ШîE|ůk™…čÓXŃjśćeZô˘.WÓŰ6Dşü2VsÜîrş¸¨×Ómô­‰µ Ăň®©“÷«tqů)}źýüă÷tţűfřÎń;ňâvőĎ7ofK,ćĺÍŠÜÎâó—Źë›úÓrŚ)u}[łE˝í¦V'|ˇ×)Ľď( ÷˙MaŃ˙Hß’s;®<˝ŔKó.E㝨ôóendstream endobj 143 0 obj << /Type /Page /Contents 144 0 R /Resources 142 0 R /MediaBox [0 0 595.276 841.89] /Parent 145 0 R >> endobj 142 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 148 0 obj << /Length 2411 /Filter /FlateDecode >> stream xÚŐYÝs۸÷_ÁG*"řxoMŇL“išôÎiîî–h›IT(ÚžôŻď. (‰˛ĎN2ÓŽgLűńŰ,^žź˝xăł’•Veç—™ž)^fÎqć˝ÍÎżĺzVíJ•ź_׳B)ť˙ĺăLäogśż;űëů™Č8ü‰¬ä™3Ž•ĘdóŐŮ—łßţŕŮâŚgďÎ8SĄĎî`Ě™(Ëlu¦ĄŠăĺŮŻg˙hđ¬P’çŹIč„ÔH9Ő6ţܧR+…“†)ăĐK”R¸Ě–ÄÔ@/KK‚” d’LŔ}(™0žIˇ˛ÉűySF3éËić,+”f‚ۓħŃ(®žÔ–‚I#A%Ľ¬4&Hʰ,3Ç5VQ·}w3ďQHĐJ9Z¬s^e\őiłŢü ´ŃtýMµ„Áë¦{Ë‹j>S2˙Ľ=T”’q®łKO—MK"VĐg*×ń$"lÉ™3j§(=ľ Đdť`VšîAG€Őať,[żS¨´T$5˝npÜÁ,¨j‰ă ŁşDţFŰHń`gçI´ ¬óŔ·8ęfFäčwĆçó™‘y»ĆW}Ő¬·8ëň°ô:.Ů„%!řxŢŐ]Ř9Ľď[zţÎ…^ÖŰÁ˛ęk,F;± ćĆŐü3ň°-™U`•`ú]ϸ-±٫⢾mć,aT·A<Ń|Ő7ř]Ü~Dzx»j¶=ČBBG9nQď¨âeóźHůRţĺď[vl˝BĹJ'A ËLIńí}˝B4_Ŕ×°QM4 Ў71NÄ ˙‹R¨ĽYĎ$čőx3Á Ŕ-Úőwnřł«ş?ô‰ 7<^2.ÄĂ‘S1­Üdě,­bDŚ€>0Ä0]ęaCd®Y_˘ÎZ`RI/ASŕ4;10¨üí?(ĚŰő¶§©ůLşüŤŃ=ŁBŮşZŐĎxón:>ťÓŇm@5"cSzÓ,ëC})éÄdJd}P_’•!Oč+Ń*FÄ^$DĄ8¤#=ě‡<żu¶ž‘‚ź… ú˝SâŘË ęŽ˛NjŚçËäy˛tůĹWzöčŃ8¸ .|A?¶Á—oŃ Â˘–ž_nę.|gŃ–m·B#Aĺ|OÝ;KĎjŘ‘ő!Y%Ű3`ÄĘ˙§‡äĄÉ•§¸%]É<(ĂBa#\Y’+Ú -7˙žy –Ű€ú˙Va _`°ŞO::éŮîÜ˝ÝPHYOú•†ŐŢ˙(ż"2*쇅QrE´Łśđď°Äă*\î=‚ öŚb5¬OčĆÉú>а÷÷cÁ†Aißť n ᆙpYÔw¤hˇw0 (|<–eŠśááóë CÖ7’vč0“čAçaV‚ňź«LCW ÷MA6’*F´c¬t R‘¶ ŠĽ@Ô‚L°}@ţđŕ, ˝|x>Ď'ŕů<€G¨ó±¶đˇ–Ââ)Ćv*ëVôŞJ_ÁÔTś…€Ľîdqk8,©Î‚f/Ăt»ŠőĐz ę'1®-(Ű}Cd–đůÎ)ŕÜfÜ´SčG;ĹŞ*”Â}=ü“Zţ8ç˘hôŤ7É1žîPrŔ©Â\.ľŃ-V1"vě–•`•´ä ~ˇÁTô ů?çw]Ó×ű‘ţ‘n °ß ľ["ÁŻrÍŁShČ*e }ŕćŃN±­ëϧ2—ţ:ÎDl/[|sE? ŕ*ŐÂGýdư{ľ‘äĄď»ć yąV‚«»űcł–6`ź8ÄAÂ`xŰŇsŐŢÖ{ë$Uh¸ hj›5śA)Nŕť0ŚzŘÖ}|Ëž†F[‚ú%‡ípyAÍŤÉk ®yh6´[”˙TąéÔŹ(Gîµ=9a÷,qd{Łu°=>-Ť6d{śI¶o[zÎ—í¶¦aEËď3}˛Ý¸˝mŞýŢÉ‘†-ś’UJPC!?aáY¦uÔ·]“ö~¨qr mT=ß1n ľ·&s8şĘŘĂťěe‰q…úä^Ö^8ćlPuC O˛N‚z˘łxÁőĄđwa@’6BŰ1ôĎN¤ľUV‹HŘ‹¬Á§źiaęI5í:ńŠí:śăČV€C*˘ĽÚ #,›yęI©Č|#]GgŁQK &CĐ€çaK ˝+µŁúĺR{ČěćŰ›Ý#B§šÝiÉał›‰Łv·µpD2ž;` jüě9"†ínçцĹS‚ Ĺ7÷7»Ą´đ´±·… ęvCäő~/"Âę*Y¶?ľ!ËöĂW 3]üERĹYmŹ= ßJł/Lč5Ťút{â+Á„;ń C¤ŽLQGa82 ůUj„ĆBaŤŠ§LLÂtiĆSŤ9-€Mńý(f„śÖO˘u¤ =q5Ć/%öô´%ÂFX’ÍS7#<=—ßý˘Bsž»É‹ mL€Ô˘TĚZű›,ŘD„ůřŮ®ŹĽˇIĹţzT6Ťű1TálHÄÇ)Żž8‡ĹLůÄřŁ8H.đżŇ¸żŽÍ'ŤýOlP]Đ *Tű¸<ţ˘oZz~ąI.ś¤Ń (@·JćŇł˘Ç^i9Uűtă©mŚţËÔ‡4şnqżebH ”řâ|ĂíÍ<Đ«·tM2QłÄ”RĘ) Ąü3×µÝÄ5B‡3ű·U>Ťéôç¸ÜŤÓ6ŔÍ•1p\6ÔY<2 QPV¤cJĽ VyXJL^ĆŕůúĂ«źpţ§¤´hQ`ćŐÚo~~ńbHáů> endobj 146 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 151 0 obj << /Length 2124 /Filter /FlateDecode >> stream xÚÍY[ŹŰ¶~÷ŻĐŁśV Ż’ض š Íć´NűćA¶ĺ]ăŘ’#Ë1Ú_fx‘)KŢ56EQ,°âe8Îpř ýýlňüUi˘SÍVă9TGYFIž§Ńlů1–Ó„ÉL‹xv_N!d|ó~Ęâ×ÓOł7“—ł ‹(ü±HÓ(SŃBE‹íäóäă'-'4z3ˇDč<:B›¦u´ťH.\{3ůuňߎŤÁ‰Ęň! ٱŕY ¦2uÝ>—TI2®P2ú­dY”™©5SżČ“+ ŘÄ ˙’đsŰXš™Ş(`ú°v ˇâ‚z™e–¨”\_df–R`f[ŽzÄÔ4EËňÎT3ŚhĄŚ­4•y”QNrÉŚ±vŐî÷iÎcp(‹çŻÖ›ň§,Ż–›M‡ÝŇ! ĚP\üUô×;— 0»Ş'XjÂÓ,X4Md*ă×ďěwQWűÖ5§<‹ď‹ćvĐ2ą)«b[~;M4Ď!Ô@K·¬¬ř°µ=0$AŃ8śĆ­}»[Đ ČĘ Műą6ť%F/|{Ý4öÚ‡îVŚJelěÓ=$ąe–ŘeʆŇ+Ę/G6j%OÍĺéü )†S‘JIrĄÍfüPl¦‰˘1¸V±x V«<ž˙‰ß,nÍ™†c9·Ť}Ů|)Á˝Ťí¶µý‚·:Űö ű±ž"ÖůAI¸˛z$BĚë±)Ťř4žOÁ­ť ­´í#:×j’Ć{t;h´eăk;‡Á‡Ă•ívÖčcą±€ŐLş¬“ ,pz3/Čôvb_pÔéÖ”íˇéóý2Ĺ6.]/íę\TK\ćŘŻWvIëĺˇ2ÁĽ_ůhőç6fncŐćÖzç{p˝)(Ě‘RĆ·Ŕż9®÷fü[\#â5L·vyh Ě4žC‹ŁMĺŽidüL)„;¦ď>Ľ};đ&$K.ąŁ0ÎĆ9(ř®Ë™q& •ýˇ(˝©ňOÂtFŇ r §DsnXżź  śű¶lö/Ft…»!ďňĐjm“Ä@_˝ ΔĄr—– ©Ýâ•éĆ‚ČÁ®·˛ 32Ô&qrBWţ\/ŻŇâr[ÖK'FÖ¸wLÄÇ{ÜW›íQ‡ť‚öžWj$"Ź›ć"W u|(÷#X4ĺČf§$ŢëŢż{ž$A0śí<ŞP’5§;„TM8XY{• °&¸Î˘2Aí­Ž“dâŐk@f† ™Ľ„€Ł>lś$C ĚŤĺäŻč´öç+$¤I×YXÝz“ö̬ ŰzĐ Oˇ‹ŁÂĺú´8Ѣ…qNşEqîFvxł1 Hä·©V|<Šé>®«öÓĐĆî ź oÂ\[Giw&ŢΡűĐÝŐťtŐ äŤáŔUm „wâč!nuçgÁaĢĄD$ ¦+—»Y6´ŢAt ţ:a!ţě‚‹ b6*Öh„s.6kŰÜÖŤsٲh ŰÂëä%ÜľÂTI†f$LAćÎŽôJ;ţ34„A2LK„¦ń :wµÂÁ`Zh,¬wö+S¨ …ż™ăÇ­SpŤM\Ú DŇ-ž&W+5}b÷Ü&N•⮫ˇŻĹ‘ˇX8\^ŽmÄ{žę+ťî‹Şď.lVßë7#•“‹YŁĐbqhšSAŘ/ď ,#LXÜą欶 ÖH1–3"±Z‡›S«'c€C†žUÝ#PŘgŐsxaěBřűÄ„±2VŽ9Q˝Ęú°şRŁ9ry®K/ć{VŚ Ńé±ĂLQ.‡›ŽĆÁ)Ľ^ŃÍHrŃUĄ÷_^6 š ÔA€ëĐ(S0ČMFX¬S8AÝ~ĂR{ҶřnoĽ&äÍĎŽYż† ˝ÓĄšłŇ„Âă,ýúŇ$`t©4ń$ŇD^*M®Öî}ŰejrţHiÂđ‰˛§Ô&ÇfmđÂ…Ú)ôŮ#®b§Yh_¨OpĘŐ'ţ- ËMݰb˝w_čÚESŃc%Š ó eŠ·ýo©Sf— •p·»JE@ü=µR |ü/ŞTP+Á/U*ř\‘FZA‰•?ő™ăîë •Łż,×mŮgôhyŇËM,h˘”|úŻW‰ă“śŮťS€Ĺś`’TrüqDićň:ęďńş’ń®¸ó‰zÇ)ÔE0m'«˛)Zűś4ëö޶NŹé*ľ÷č`łł“&ŹĂ÷ÇŰľÁńo|w~eî1´»Ďź/q#iĽŘíěă3ČŻ͢\Ő¨›»’Te;ň<ĹLDB#Ç7ćąçaé^¬9Ąé4É•Hcˇ˝7ţM„‚endstream endobj 150 0 obj << /Type /Page /Contents 151 0 R /Resources 149 0 R /MediaBox [0 0 595.276 841.89] /Parent 145 0 R >> endobj 149 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F27 56 0 R /F23 16 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 154 0 obj << /Length 2832 /Filter /FlateDecode >> stream xÚÍZKs7ľëWđ8ÜhŕÁ{[âŘ{«ĽŮŤR{HrQC‰eŠŁ ))Ţ_żý† g(k-×VJU"ŤFŁŃřúA~qöęm= "8=»XΤޅ®ÂĚűJÔµ›]\ýZy)Ťş¸¸içĄÖ¦řî§ą,ŢÍżxöćâLÎ*ř“łPÍĽő"h;[ÜžýqöëďŐě꬚˝?«„őěÚ•!Ěnόұ˝>űů쟏”—ďŹäĂ=¤R’dŻ›őş˝™T]\Îáß'l‡bwňµÜ~ś+_´—L´…Łm˙€´m‰;ž»›—4ş„µ]Ë“ l[\řĚÜ·\Ľ[5k^öŘŻví!§fĂýYÂć±ű[% pX·b^“Ô  8Ćeł@ľă~7Ý=’^ĺ{€ş_˝˝ ĘU.‚µ¤ŚË{ŘŔÂfD—éLa@ýS‘šv¬‰ ŃuU¬řP÷őŐr/4wQ9}w›čZn\˘°@©Y˝p>[0čí"?tű´? rߣ‚|Řó]ŕ® 5Ă ·xź—¬X¤ęym·Ś˘Lžď‘)e±ÚíÚÍ9ŞhVF˝ä:|ĽYŃ5Ü ťëâvu}CŠáî°+ľu»MŔÔî¦ŮŚ/HJ6.“ꟸ J«HµÚDŽ mzo‹† —gč¨đŮđGv¶HŢö=ٰK/Ů #ĄÂGI;ţ4תhúć¶Ýµýö۸ČgÇĐJÔ>D—«uűăćjt S ë|$ M©ęhB0’ÄĎ[tÉńh`÷é&ĹX®2nyř –Ď”ěMŤ–€ )rŁ»›t©ń5ŮU»ý®'Ś`ZH0űPÜßÎ ŕĘ„Z™Dء{Gńđţą łb˛m¨Eeä˛ÍŮĘ dŁg0.v'P;cD¨-ý¬†Ă9v+řÖ†˝Č« žü7 &ťĆŮçK˘Á#:!žgfĄuB×á$3ZZ3nEꩣ)śUĂQĚÄ †łV^h´Ţ «lzÔ€;ľtrj~ÖÄk˙­˛čăo۶ým *çn¬đTÁ3Ö~ŕö/w›»ĎkĹVyůßkl7WřľT¨éąŃ#>¤¶x÷Ç×’]s§‹ÎĐ•¨ł˝ŇÁ¨Óő«kÄ!2nôN <µ’ITy|É౪Ě,Sç—ß‹Q̬äeź5¤·•zžA*iÍţ’M†>ŠÂ EUĄS0ú©Ĭ,ĐŃŮš@ć7Ů»A㑢hl[ÄézŇ6ş_řĽí’ô1:„‘Đ_GP˛˛ŔNÝj¸}ÎD]äŐŃ͵»sî"l[Çt ¶7q ¶‰E*6Ún#F0UÖ|rpşäÚň0LѰ>q›NŚŤGŠ·ČqŔŹâ0ŹŻčř8ú—(Oˇ’h±ÍáUŇňšt€›t)"a=ŕT$etDŞág Ő˘ZTÔ÷zŹíĄ‘pyäSµń™—ÇG°šđńRo#Í]—ÂPÇ#ľđ2wWč“oWô;#Á›$Qßâ'µá'©tGŚw[ĐBęz:_HĽĘŚ?×L$ů®DCFűËżF—$ˇe’F;ôŃŁöS@€í,d1jl‹ńJD[A\iß®›>Čdâ:T1ôůýĆg“+ ˘áoŁ):)§MQ* ÚHîA`Nč=˛ÇJX©OŮ#ɲ <ű¸:DłbMDÂxö-Ď ČŹ†NęđMăše×*4ýůđ4ŢEž›¤‡ë&çHZ•ś <ŚŞ&vńŽŕ+_|<Úm"X«µp•{Âne°ŕěĚŕ7/łŰī̍ěVBôć“hP°7~˛[°ÁĚn÷ZŕĐŰhv{ĺX¶9üĽ‰ýŘyAźbLoöŚŢą€ €c9¶«]vG‡V©¤ç÷L«„ #aű'äjWŰ$$DJ% $/‡÷„ÖJ˘„ĘŮbÓ^7§…s5đz†h üŢar¦-Ş: µÁśˇś%IřôŐĄŠ·äŁÁ“RÄPëâ|"Ă×Uý´:¦Á‡ ćÔË 5ň*3fchu^x@śDĂ‚]ŚM˛‡!ÇÔE•$ż MňË ąćrŰ­ďcX㫎ĂM@9Č­‚’é*ËäŞ\“-’¤w9Â,¦¬ű|g+%‚”Ď3—0…JxíŽwŘ+tĆ'cű"-ŕýţT!Gś×Ť@~ZŚ„Ý=•Z`h_jÁťűxĐŠ?şŘm˛ĺHF,řnhë>÷ëHEăíÇĆâh/ŁÚ]Ś*›AĄÄU˙|[L !¦°ű‚ę±BŢG«˝7ě'+—2ężz-ăČ9é«0•1l§@ Á€C‰},ö¬ňB·\n'ěp|"#ëéň‚‘ž†źăňŽRĚ)ŹCuÁg¤‹A¦¬`ÎDŢ"y™RĹě{/ĄŚLAç=á¬QÇéŚPÁűtŮáZĽ,hT‡.ŕóls™Ř˘Ó3KQD,á~č¸ć¦°HUB™a ďź|*†j™TÍéŮŻ2ç Ă«eĆíłµßSI‡‚\-]:4~ •¨ä“ţ`_m´¨Ľ|™;aVeĆkěM4¸ _űťô&V¸!ăšzň-žŁŁńðľžv30öʇv#‡Žě:°)aŐ»Żf䎬üŹÄ?ĽÜ©{QP°V!ÝË.&ń*3fŁ›Aď*µ6<•B'‹"śđ2ĎDVxµ×WŕťśR-h/’[ęűří łBOF‘ŇX0w„%ä{&b)fŐS¦/!ž€ [Wr*÷2ŰŹĽĘŚŮŘřQµµ6<í×»\Ĺş ÇîFú6U‹ň¸ż Ă’!(’UŃn(\¨ŮŁU\»!Ą:'lĺOÇÚç±ÝŹU o°Rú)+CřŁ Rö…đy•ł±Š$Ré‰ć$ľŕĄrëĹ:™äj«{C´˘V ˛ęTý]Y<ćW¨żgŚNŐßɨţîNŐßź-ÝłęďÚďź[ćeâ©"ú+ůtő]şś×_R}_P|ŰžŞŔŁVýA^+G5t0ݬúN•wĽř¬ú®‡şŰŹôâ”{˛2žő‹UöŐ ă(”„w=UWRĂ2Čé9|ŤÄXtTřżÇ<Ý6R7Y˝şUł)†¦ďM÷>¬šýŽăJ…+ĘbXĆ$}ł›źÓ @,?U˙o/©żř8Q=×µ59¬Uχp›ëáYŐ{řĂtńÜĹs°ÝôU±bý ĄěvŞŇAŮ/P„ľÝÝ÷óˇ_Eˇ7ŮŃG jü>_YŘŇ¸Ł ď˙ž‰ţŐŃÁDĆŢH Ť_jaů{Ż/ý ó)÷Ś'ěĚPKúŹ`ÂEôGTßXĄ‚Ą5Ĺ]sť~ô˝Çą®Eâ4OnÚľŮŃO€fEßÜ[łmŕJ‡ŠúúŽ'IWđůĂ?^ăߤ|/j„ąA=îîľ}őꊂĄbqwÇ_‡ŔţÝ}żh—Ć­ýu+6SU'…‡`bLcă{2ň,4©Şró˛¶Ú¦J·ń_@˝¸endstream endobj 153 0 obj << /Type /Page /Contents 154 0 R /Resources 152 0 R /MediaBox [0 0 595.276 841.89] /Parent 145 0 R >> endobj 152 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Length 2693 /Filter /FlateDecode >> stream xÚíZYoÜČ~ׯŕŰrĽf»O˛™<ů;WYË@€ÝE@ĎPB#rBrdk}ęhr83”˝2ü¶MźŐUŐu|Őô‹ËłgŻ}”‹<5ŃĺU¤´FćQ–Iá}]®~‰í"Q6ËM|ą.‰16~~±Pń›Ĺo—oĎÎ/ĎT$៊re.ąqŃňöěżgżü&ŁŐ™ŚŢžIar}‚¶*ĎŁŰ3«MhoÎŢźýk¤!ŁÄhá2JÂŽ$´EČ©MC÷J¬$™v¸ ˝@)Uy3e1-Đ‹†%$Ą™´Pđ×K¦śZ™hBňËĽg…öůč+źqąpŇÁ™¸˙WéäŘţa[oŹUĄ•&Săy_·!Á`ćl!h%b|•SÖ´J…•鄯ąŤwőE\¶`ľČ˛b±´ă”0ZOÄ=¤:~óŽç„ő"WţŹ h„Sz^ŔÖ‰€LÂÍkä;żĂ‹*ůş.§× ŁČ»ˇ%;*®±–…5O%r ¨VOP`0N/ŕ@Ľˇô̡OŮbôé°wÓđˆŽAŠ7UÉK†+*4#¤´ŃÄ„żÝ¬fb oűŞ“âz'őĂą˛ű˘í>NjŘk}”Z+ĽËI=ĎÚĹ›Eâ$ţ5ÎÇË…Sq†>RgyĂSW ™]˝ě«¦îx¤[íÂiş>čöëĐčŠŰĐÚŇ|Óă•6=_8Ф»„éU˝ĺî&ĘšV•8˛Âé,¦óËMóI°L‚~˘ I“¤áË~ľľµMA„„P B±ÄkľÁ‰,ľÚÁ‹ŤŽ;\˝†~Ń–EécźDZZŕ‡»XDĆŞU96Ý KşĽ8Ř3¶gíŮÁdP¸c ˇQëý«pcÖ~Â16eşă•o7Ő°ˇę7ěúH Î)W!ęl  Źą/>绫0 :đ/ŃF Śżţ\3^ŔAÄ ˙şçwx/ď·%ŹÝ§Üżă9Nťżlš›ŕ¨ŘĹ”ů×™pŤx`×Äާu ń–1“,ĺEęło }ŤéŰ Ő..±Źˇ×ŕĺźHŃ屢Ô*d%ÜŹŤ­xG÷:mu} |­&s´]{ÚÓSÖU=Î?_ŕiFx†D8ć’–ţă‚8laŕŘ-ű]»çä€ăU‰&Ń12Ň Zuy Ş`sBą#@éeő«Tv‰¨ĘR­Ń`›ö6¸+"3á6ç)lťhÓz&Á#V3 XP¦ĂÍ"Ú‚;ln*N°'ŠAÜÁUscŕKŮqHCe`kUô·¶E7„ ęĄŐëA‹éĽS“µt…w)˛ÁIŰňşę8:Źa}5¦eEnŃ),+ í~_–sÖ.ÎHĐ褆“"ó*˛6nžâvk˛yÜ>ĐJ&Ä"NyÂDÖ|›Ú|(O®Đf´wńÂ`†÷Y°3ěLű4ć_P‹ĘÁDČZ»˛c‚C&Âą‹ŕx×XF±”}Aˇ; "rt6#ř›Ęe|ţoPĆĹO?/Ľ {l3™Äp Í-űzjĐ"§Ç˝ąÔŔ¤’ ­Ço¬řAšŹÇQVĂŐó—ěgUŔsiÎřòš fDZ9˝¦ĽpÁônhŔó¶ŃőątÂ#o6˝ąXxH‹Śđ™=ŕ€IFĺ´ˇş®÷áćôţY iĂiŻhşë/čᨠ…LL^ę&ď-|#gá‚űď3ѦúOí8řBĺÇěü“2äń>ó •Ř ÄŠŤő¶;v§5Ü]EŹ:8݉9ęŐ€Ę ¨T˙~´2YlÍ€řŔí@ XĄdŮč‡ú1~±Ţ›ďă†#©˝W|٦S'|]±v­OŚ#ČîĚÄç-Ý‘ć ].2|vA`WŐ–&#‡Ś,O ąVB†ŤŤ\.xţ˙Ćýxă¶§Ćí˝­Ű<Âş•ÇOţ»÷„ÖCö=,91đIĽ& Ku:ŚÄęG¤ ż•‹ß“ąrťÓ^ŕĎHgĘťµĺSoľ ,Ô)@ѧ·Ěs…ORiüě‘?p;ţ"´ćÇoě4pq€^Î)ápŤŢsË/äm SĎČ.ěńJ‚ŘäĂSÖjĚČý©şäގÂWŇĺČř03h!˙NIţĂK2öřKBXÄ|ňÄ(&?Y0őw8ń^Ćümˇo«ňŽ^;óD`ŞXR­Tđ“:Ěů‰zhAř„Á•~ü´€”¨ŮS=Ť,CĺpPl¦ţ„%S“€6#ŹÖěa«}L@‘Śôw ({Z”°ä$ Čă2b¤VôŮŮo˙ďI “ě qˇŕ"€ýˇP€şĎjľą ŹX qf†JÎĆŰâ: Cě}Z@R,&Ó&á%اü«ĄL‰wĘěřŮő«Ĺ»˛endstream endobj 156 0 obj << /Type /Page /Contents 157 0 R /Resources 155 0 R /MediaBox [0 0 595.276 841.89] /Parent 145 0 R >> endobj 155 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F27 56 0 R /F23 16 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 160 0 obj << /Length 2409 /Filter /FlateDecode >> stream xÚĹZÝsŰ6×_ÁG˛ |Dß;˝8uăž-ĎÜLݞDŰšĘ$O˘ě¦ýí ŠTbYn:ž1ApąX,vűA˝ŹŢţ”G†LDăŰńśj"­)Éó,Ď~‹e’2©ŤÇ÷E’ !ăMX|–ü>ţ8z?±Â‹ Ť´ŇÄMF˙ýö;Ťf#}Q"L=ÁfLô0’\řńbt5ú÷†G LŇ€Ë;”h·E´Š4„fĘĘw]— NýŻ˘Aă«b wʉŕq±<«śÍ–Ĺ fV(nwŻxŔ©ĺň_ŞčcÂó¸šĎ€n™{Ëí+)×D,J#FąĺĎn=ťXSb¸ňś?]źź÷YqIŚ4ždľJRIeĽFA‹D±x†*žř Ş'΀âW˙ ¶–(ŘćĘÍKżL¨/˛V”ë:E?ăpľ¦ł‘˛>+çM_RÁŐąçđtL•AĘ$UŚÁĄWŚĆ·ërÚĚ«ŇÝMqOt7…{°nwh%ńÜCAš Ě,ËăĄ}©YÎaĎĹcá&›{ŕLÁjšţaQA縅Ď>9Č»®EYďŞIHŘ›ŕQ&3˘9JO-Ż4`¶«(!AQŰĺPÖź’€ŁDm5K'ôÉd±¸A&\ÇĽqö€ěA·ěúä^˘nŞŇÂ$Ś7ŔáwN 'ŕ™8÷G‚Ş|3ŕ:×c÷˛?…“ŞĽ=»Žę´!™ÔQĆ9É葪óĽŇ€YOu9<ěnIPÚ“w·(üţ> Ě3· ö–ćŚ0e\«hq†µáǡ"Śc€řb8b–0ŇÁ«=c;ÄsXîącp1»FN`ˇ©I]/,śYLnZtCŽřř©ť°OîÄą±Ç»+Ľ9ýHpŚQ…sśpKĺa Ł˙¶6¨•€Z ŽŽűUP+ŕµµZ’×F­KŚpÖÍ)DÍŠ$† űqkZ•«¦ur{„…ĺwnć´@®«éőrá|Y’«!„đâőťđ“HYŕćG:±ă•ĚzN¬!g“›ĺĂ?ěEÇM^„đďyŕ‡çćÎ,Ô™„ěP0)!‰ĘŘQ:kyĄł]ťIˇŤf›ő<đ!Ň| 6šÓŻ"ß^Łí`ŠběĂÄ `m}‚–‡7O*z7|s€0ć1nľ·y㓸ơY_ťţ<c J)^cśişĹ/H­…˝´K`ŇŔâuŇ®€×>kIľ€ń Ű3/ů ĚP"řęăÓä•̆Ň Zö´°p1#Ě|¶řéQ±7ßš+ 5X6ĚëĆĹŕ1ęřsm‘Ĺň´|©úĐ>ó˘Ůâ©¶ŢđeĆ–|ţW­ ¦"ŕRÚ”ó8“lyĄł>ÂSÂĄÚ¬g B'âÍÚćLX[žĄGv(ä÷{kŔ;ş&ň®·Sa\FGĺÇíÔóJf˝ť4±Yĺľ™¬ŠëËsż/r„‡ĹcE š–6ÇG:…e•Ľúg•ŤřáI‚pŚ׆ăíT‰żM%Âé@Ďw]”°]„^hVJŁ)€ćŤ824;^iŔ¬šs’Ă«-IŻ&ń?”—™Ů—‹ŤyA\ćCP‡m)%yĽš? Ś,&Ë6$;ŞĐăšj J@Ú.ňMďé…ąĎ!ĺca˙ɸřÓµvjg%N,ÉH¦»M­ć˦2÷×ÉŰU{=©xQ=­Ü„Íp€PÝ´miá\…ąĹa(°¸‡ÂŐ[ÂŐN•ßlňŮÚ§:ŔeîqČ"ěŹYIŰňCÚ‰» ÉÂż^-G2~ŔľŘCµü< ËͲXöó·\d߲+őĎ^8‘Ú™—€X¶|ď&gůÉ™°hÇ^%9 xíKÎZ’&gYč|×ĺ%¸ž-úÚjß¶ËOvros ` ˇĺk)še´ŻÝ“gP>Ŕ*–LŞăB“ç•Ěúůš!€-E§čy~ł''Ü eą‡(˛ fp¦-××ĺ@ŰG[w€ć©ClyS•Ť-š*„/IĂvŹ’l·Ýř…°É G\—+DŻ›•K oćĺÝx´¨č‹«i3ô•SçíşÓHrŞj*gů?8śAě’¦í† Â˛ĽçůćĎçŃ#[•­çĽöy~KňeŮ>˝l#U†‡zLŠËç¸` $WšHĐ<vţ—\9^iŔ¬—\qJ¤2›ő:É•“|ĎW>Ä;Łvż\nb7řjG‰6MĘ0,ăĹy¦ý׸ß®°_˘6žľŽż™™9۵čť/}q˰›äiŰ wçY-ěŇŇĽ›¸µŘďćîőłMk(ădśpľÍGzĆÇÁöţćŹh:«öĹdF¸î÷ol‰â+†= ,ňűW‹€×>°hI^,®Šć¤r!ĚG2¨µďZĚwÂËŽK µź/XÎĚŽ¬Y=Ż4`Ö/»ô©Ú¬·73đĹŞĆđ5Üě.pZñžű1řşíCv“ŤÎo (ńí˘ö/ŢÁköÓË Îqđ~ŚG›@ -ă_ÜĹ8÷áâgEü»¬Ń‹ˇšLşůZł=đtŰmĄöëË6yüeňç‰ ň{,˘űY‹ˇŰ`1/•l2ë»¶ÄĄř1ߍ¸f[żd2Jě~7B·e‡¸-7ŕOŻÓz xíu[Oň%·íüČ?SłH˘žB÷˙ÎĆńI·ŚÜOmT$a_ E4dÎ<’@a ޱĹč‘ŢV őä®ý5Ü=%‚ş_YřÇîaY,'Má«Ű¶Ź?iIü›*öC̵{XÝşëéĹÉ÷8˙}›Ąz‚0÷ F›ú‡·ogdh<­k›€âúŐz9-n+ôŔĺ]Aʢ_ÔđŚ ކ”śţ?br»řěô/߸+§4KŇ\‰,–Ľ=Ť˙:Biendstream endobj 159 0 obj << /Type /Page /Contents 160 0 R /Resources 158 0 R /MediaBox [0 0 595.276 841.89] /Parent 145 0 R >> endobj 158 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 163 0 obj << /Length 2881 /Filter /FlateDecode >> stream xÚĹZŰrŰ8}÷W¨će©ť! ÉĽ%¶§FÇÖÚňÖneňŔH”Ĺ™ÔÔ$Î×ow AS’S»ŞląĘ°q€>č Ŕwół×żÄŁÄOÍW#Ć>’Q~«Ń|ůŃă Q½ů:O8ŢŰŮyÓń§ůűłËůđÇFI0Šdä'\ŽŹgž}üŚ–gÁčýYŕó$}rŕł$=ž‰›ňćěîě­Ś ™8RŢ!>čŰL¤ÉQr?P’đÝo €ł˝Ëšé×s(–Ň^°˝LŻĆX| GkÄÝź´> b€â~d€ÓäŢôZO·ÎżeĎ'ËŁŘ—‰hĽ8ăĐOâd˙ś­¬‰#ěÝ3Ĺđů2潉7ćgsŻÉ°¬‹W¦ĚĽ‡f­{ÂÔž}(:Ń“8đ=aĚO¤ ‹YĂ;Jče$ĹCĺ1ýšŔÇÝŁ®/Ć2ġˇK“Íd‹Ľ6/®ńqÚŘ-!L¸7ĚĹoă‰P‘÷%ߌ'’y¬*o[ŤˇRâżţËęZ7ŕXBĹ^Zč÷ň‚ÚËG„U<č‡w8đÍ8THÔá $;Cäć)cݬđ72­ő–ÄuVűCľ L© _|M…˙ŹźńȲ÷ˇâĘŁ!)EKĘP)a· eŞ{vb'‡řȢQ ‹ ´Ą ÎŽDvÂpź=ÇĂ$,lŻďĹeBŰa/*ĄeM¤ň9ě§CÂčŐ„é’é˝g†2JŔбÎÖ@‹ˇ *:ňą GŠq0:‚fyůŻŮÍí8˝ůpž`¶dÔö~Ń$p_˛pżI°˛&ް=řóa7ôđÝÍ.ĎÉ!îŤ1üo4}Y⼠Q7ü󹝸L×Ţ2ÓöMchÓżÚöŕŢ«ű]§ŐßuőWl¬›él3ďŐx˘ÖľĽ+ęüˇČ–şVŻËޱŰ5d>, Žy[t†2a22yP¶†Ě]~XK?ÄČŃčO jaýÚ‹śĹţ×éĐNBTŚl«GÇs0HÓ”­6`i±nňo迌ˇjČCá*/v_µŃ"‹‡¶++kĘîńé¬éîŮ_ą1¦C“6 CŤś‘ŻÂĐĹ‘#](3:®ČâŽĂŘ#BĘî1T P!ä–ÂD#ćkhÎŤěŐű.š­<ö$ńÄ,¨}‹{fřEşŮsLCä‘Üş˙ĘôIÉ>éJŮŕPYĄk]óĚ9ô0)a Sh‡Ň“lňş°%l–_Ň e±nOşˇD/M[)#‘Ě»C!źë <­±‘N}@ î)ýjSš_»X1łŁr•5(«2łHÍŹ:Ý÷ŕ~v=X6h—Ŕk‘(˛7ßaŮŹX6#kâÓ;ÂÄđUµ’á  $OĘČ:Ž b/{ŘE5˝žÎ» \c(¬}ÍŞŠ6Fj%Ńa‰DDMŇ>Dc±a 0ěĺôŇÍ–vôý4ŽZOžH­idxĚ˝»m7ů"5›&6 ¸%ČÍ®"ďO{˙źc°Jéf—˝úĆC?Žc ?ćEói`-9†‘éňÖĚ=wňهĚŘĎ*Űv«ćP$· ¤É唫ˇ>W%-G‰S˙ŇŃ×gÂő@´ż ‡%°)NP‚®“&I“ !Őâ˙““˛˛&ް“âłČ„µîuťNř$¨Ś¬ă¨ Ä•ŕĐ]Tw÷çç—wwC>(_1›rĽÁ”>ÔGOBńÖüVĆăaă˘|Ün˛&ÓĆqAžČž‰¬w ×öQgĽŞ?ÔýD—N§{ ż">‘î;a‡uoú×ý)Pµş?†ĘęŢAus?żůe€Lpź+udFÖqdA–ç"űpůáćößCR2HßR†\A~Tő#Ö$QĽŽ=L4E)Aeü¨&i"LĚב4űš[OŮ MîŚv‘76|îyĐC±IĚNÁbČĄ OÄâNŘa›>ÇY| T-‹Źˇ˛,vPíţ? YÇÉconŕ 뉎+°Á¸d|–nŞ,]>™çy~H˝M„ UA?B&20 ž~€ “ŘW2:ŤúaŐoűU˙IPYőEeÔęďĂh†«Ó3˛ŽĚ#ŃöËŰéŐĺĹ‹6 Ą+’*ŕőśß(4$Ś?’}ŁeňNZWi®OdŔ*écĹNčýGˇc/ó¬ŤćŇş,~‰!6Ô‰l#ě0‰Mźă$>Ş–ÄÇPY;¨înλŇXŕ•TthFÖqh’ů—=hď¦×/š×X JbÉ»¤śN\°ĹÉ{”łTNÝçłÎo(ă*(!µIEŞ´'7ňŕßcťť3ňÖ?‚Ľr)iNCŢNŘaňš>ÇÉ{ T-yʎ˛äuP]Mďć—×/:.BťX öŚ#řÄśr¸Yęw6ą=ćh˛Âśtq”¤KŘž!,÷ł%Ă?‡-?‚*ąGěDT鄦Šésś*§@ŐRĺ*KŐŃŚă$ČlĆq™É8\dť>Jâl:J+ăa±fh6´o{’Ś™Í÷™¶ćGd,Žü ’§aŞ#ě SmźŁL= *ËÔŁ¨ S]TÓëůĺíőŰ«8™řŚNÎČ:N…đ®ě/ŮííÍíĐ)+źI÷ČF&ÄUüÍuBśUú.Źl‚ŽŔúř?°Tý/Pú¤^î=žLđc<źžÚ#Ěđ{ź´J3±~ńDňגĎGr?JěAúł'Áíť ”č$Wđáť <#G ¸=±Ąď(é \Šö&U_,?¦Í«îîÔ=ĺWćt ĹS.X>čňNť©ż¸ýţoŠ(4ëůü* 4ÍíVĽľżşjOú~™tˇ(„†/đĆw¬ż˙Áqéś»ő‰öîF€ˇę§¦é2Ĺ‹)PA˙ě›n™śowbÖŢG߯^Ň“RÝýZÝP2c/Ç”|~Mť^Ç(}ąŠoUú›CĽčĆîJ?XB…Ű9ĽˇéôńV7'ő§•9Đ_µë‘8áď}ÜNÂ_üDć{>19üťť–3ééí/Gč3™pĺ+ŽDBvSŻ0NÓrÂëmúĐ^ž ďËčRÚfÝXŕa-…TŘ'§ďäčÎ奴G#°ś[ÝH‡÷đ{qsţ3>˙Ů®ŞQ=€Y#1›í›×Ż—¨¦Ŕ[l·ăřĺ®Zd«oއĚ/˛fŹÍ‚ŚĹ#îBÇ\ďéXبEë 0eĘÜjă?uËK˙endstream endobj 162 0 obj << /Type /Page /Contents 163 0 R /Resources 161 0 R /MediaBox [0 0 595.276 841.89] /Parent 164 0 R >> endobj 161 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 167 0 obj << /Length 2409 /Filter /FlateDecode >> stream xÚÍYmsŰ6ţî_ÁoĄÚ Á;|Kórç4“új§Ó™\>(esF¦TŠr®÷ëo P”EÉj˘ąédb‚¸Xě.ž}úéćâŮ›"óĚ[•ÝĚ3! ¦¸Ďśă¬(lv3űëŃXhçU~sWŽĆJéüĹŐHä—ŁO7o/^ß\ŚĂ?‘yž9ăW&›Ţ_üqńńĎf<{{Á™ňEöÚś ďłű -Ul/.®/ţŐÉŕŮXIf\±/Bw"¤F¨©¶ńuWĘT;i2ý„».+`›–¶©A^–¦„]2Ř“bňń®„‘Ěó"ë‰;®—2ž݇ł$l¬4s‡e…/9ȢMآőś™b»E #‚ycÂą…eć¸bVa“Żżúĺ×Q!ó›ým‚ç`{iö“TĚ9čĂq’5î ĐĎ ¦m±ŁßőŐë—bŇĺU=‚ż-Ş ®ó˝ďŔÖAô„>¬ęŐ› ٬¤E0 60$·´Ö‹«Ëă‚aNč™,i›ł*VB !HřyŮ"jŞ<ČG,7‹vÉ M‘—4ľ//t/qőĹźéeZâćµ 6Ű| ’[ţ±IßËĆ5§ oM ŤîXĆ&jQ­wŔ<´›$ŁEiMMB&ń`ą­ďĄ÷Ś‹"ťÂ«÷WŹO•pš¬Ë, wö@€€’dŤ{Âč4ôTŇB1ÇM·`Ŕ»}­0dŐ™´"Yǵ‚î¸ŘŃęÍĺűËëîť'žŔŞlšp$чË%łä›x!nŹ˘˛ŽiÄ S â×čIt*zćo#o Ä6ĺó}— HĽ…óqýŹUÝ~ÚW±`Vâ”1<đ(űĽ «Ý–Qé¦\uÁ´Na łŞú¶Ö‘O,çÔ—űćK<‹%óü> ümT\ô`0˘=¤i—^¸ý RăpÄ*¤Ŕ¨ĚaŚů¦ŘH˛Ć=a{±ˇ C/ş#VAXkČ gŃ*Ę:®•°! öµşţđňĺëëëýx°Ě" “ž.YI,Q[đđŠ°¶™´b&N—÷«EŮ–ł€“@ô&˘%-µŢLĐŻçD €żB§Ŕďű~L­óůŢŔ!´gr}'ë°çiĘqÇźAĄÎďGTJnߪt§SEĎéĘE§+§şLŽť!Ă@ßdŃAÁQěOęîř°…1Ĺ5ŚŰÝx@´; 1B BK`QQÄf˝l;XĐh« âHőßÝý¨nŃ…aňr˙TŃŃt¨čHSzE‡:Ttś¬×ÉE‡őß\uh9¦8^u0Łü‰UGš}–ŞŁ'ěpŐŃ×o[ulęuu[—h@/‰°-‘ "N•ĺľW‰üŁlŻ1Šüa쎚WŘ\& »Ę9P~b}ň€énYÍŽŐ)=űź§Nńg¨S^?P§ o\‚Íáô*.çTn|ÇżŁFŔ xn€,:ęPLbo”ŰŇ ±˘`ąŹŚ“i»p° öÂű"0~µ‹!ÝZ¶]&ń!ŮĆ’đŐĎCežó¬Ŕď—yč?-Ł˙°öĐ’vGPŤ˝“Ř›¶WÍ.BoěˇRŢď±ćŹZCcő xÔj&ěńhqءěT >B]»˘—%·F—â(gńĄ+"ăŽgq—TaałIn$0 "Żg‰í$ś EĂN… Fü‰ĽŠeŘb± =¤K[Ć|\Řs,$ÁŤ!Ď…|ž°"«?Őz>\ČŃä»X)ď¤ÚŽłuIv›Ż%ę+3süŚDef9Şi$‡6@×ůjšŢo˛'M[ߡÉEţ źÍŞŘÖCsŻ‘ăÝőß‹ăHŁ“fă@,“I…ŚÎ¦ąHřÉď?Ľ{·Ď>đŕ)ł=A‹úÉű2ŢŮNІÜqIjż#Š›s§3˘1XĘŔq˘ŞnËf>ˇűkę‚ňóR_ÇËń¤#ů5gĺC5ŠĽ)®š¶×ljŔäŰž$<őXřďň¤ˇčĘçmô$IĂDĎ˙ZňŔŽ(q ×>2+ŢcVUn‰D¤“â@$@!G$ŮW’0ÜE̶·”kęá M?ŻŁŚYřő!Ę‹S›´ÇĄĂÍĽ¤\RĚń(·‰rMâí¬H” ´ VÚ$óNK2ZŞ\ű~?lŹF fÂmC0Y Č\íPdpÜ 28~Fę6…Lőýţ…´†ŠŇ&âFLÍ{:ŢöÜ‹c!}8íÁz©gGŞřJşť 7P Ű#oľxLŢL$o)”Oăpiµ>•K}O0:Ĺ”HaŤŃ_˙Ëű8ĘoQ’3™†Ę^„[T Ŕ&CtzMŽ;âŚ2:_Mn»ś¤ó/#Ĺ öă0 Öx'¶‰sŞöŽZÝőż1yŔ‹ †ßŕůę——?`˙Éč1đ  ĎÚŐógĎf?x>]­¨‚ő—›fZΗHʛےŐĺţ©“Ŕ—ś(2¨H—Éo7˝ßŢôŹô”śŰѸ0Ęćş#ł˙ ŤťNendstream endobj 166 0 obj << /Type /Page /Contents 167 0 R /Resources 165 0 R /MediaBox [0 0 595.276 841.89] /Parent 164 0 R >> endobj 165 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F27 56 0 R /F23 16 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 170 0 obj << /Length 2517 /Filter /FlateDecode >> stream xÚ­]SÜ8ňť_áGO6V$Y’íĽ±TČm dë®rypf ¸Ćs—űő۲Ç{.LĄŠ‘ĄV«żŐ­Îď—oާA&2—WŇ©e$‰ię‚ËŮ×ĐL"e’,/oŠIÇ&<<›¨đdňíňăÁ»ËHř§‚L‰MDŰ`zwđźŻßd0;ÁÇ)â, a,…ʲŕîŔčŘŹçv8dĹZŘ$˘0 mRjś˙ÜÄ)Q˘­m‚~G.U¤Ŕ¦c6 ŕ ZâRO±°?sĄ¬™LşÝtĹ663ă„9F%V8»픀‹G <¢3™HäšE +JdÖŹ2‚uH-RŁÉw˙<ű|>Iux9d4ěµĐOjDĄô¨ŁWÔC6BźS¸tľ‹łwG`b: ËĹţ6H&¨.ëí}¸¬‡6|Y.–çĹu ş[5đ T…őцe±ÄŞE±y´VBy ˙–VN˘DŮđä”çĎâîEš¸˝§Ĺµ[<ătS<ďQu÷‹3dą­™ŕŁ|>˙žOQ`·0ű‰ăH¸m!Żš÷#‡&QáTşˇŃĚn®ĘŮ+ü”áQ5‰pâ¶,^O˘Ěčđó2tP• íT'ţŁ9JşUÖ¦Đ,80zcłĘŚPE=\C‘ˇ`]¬ş‘Âůb6/^ˇQąđĂbĆPşú™Z8[Hi‚žSý˛s͸"ŢődĚ@x+őö`†DiŮă;îĹěLÁŔ6D( ˝b@˝ËsT4¸ÇŞ)ę#ă79†îĂô0IPpĂžQO,:”Ő!#Xělćř“‚ ÁjµhČᨚóÂ’Đ#qgr„Y.É)i[ޔՂ×Ëć†G Ý.0¸8ţ‡đ´ő¸Ś´4`wmA¤Výźl¦›\jíZ.yłQ Ä“đĂŽÖť…MM ęŚtę9śŔ¨ń[–Hʧi09ˇÍ´ |Â× ËŞp ܇ŕŹClĹ‘ >ŐĐ©č˘ë#c8Ďś—{|ËXÔş°7meÇ0^ ¸Ş†oń»üqů;='.0dʨyxxvâwS¨ÄůŠ·Üw(ç S6üë…Z÷W¤<˙šaš›rĹŁ+B4EBGŻŚČ ¸’ÂÔ"~™ÚŤk/:ŰmĆ&aę~ĘP?uEÂş÷€S˛ ›SÁu±(ęĽ)<Ģâi/(”Eĺ4Ľ%ô c“&­‘Öޡ§M ĆŔŃ—¦¦÷µW®J…°ÔWnî廪Ř$˝žŰi˛¸µ­eâ|guŃ řëĹjDöÝNdZÓqçä%Í}MzŹâ4˙šdx˝/ŢúÍIOŕÉĄIćţµ\4ßJ‰SyŠ9ô$•ěptÚuk‡u±¬Ű ~EŞ\x{"uyc®®Z[Ď]U$÷ ĄţH–‚l\{ÂU? ˛„!ŹËóI‚J† ňŔ'"g§gű"–±q`!“F?çTqşĺô¸˘2ľ zŰf3ŐH)߀*~·Ě^¨ň¸vSĄś°i˛AŐĹ—ŁŁwC{pÂa@@oÁaść˛<7¬8˘Ď‘ůââ´ş[΋¦±—@٢3»á$«ű)Y}AN¸˘`3ź˙¤&CÝG<Ú›îˇp˘4l/şď!ŰŞűf§î÷BU«űťTyÝ÷©zrzrńa¨zůnOőqâU'qxJ‹’&)˘Á\>ďB>›(ş»`z]ܵŁłBşM«Ŕ`‘s™ůřáMéł‹Şé"Ä‹¦¤Đ]ţŹĚiF×önRű° «„¶jO´F¶Ý‚<Ěn ÚUťí˘Şµ U'§ţqr< ÍĆ"ŐÉ~hó¸vÓf ímg‡ç‡źĆ­ťP¶gÜÚJ-ÚÔMg®Ăë7»ŤŰ]m•ÉÍíż±¤_†¬FPE*•Â˙}'Ŕzh@)ś©’~–öß9BÎŽń0±ŽsÁŇ{ĎfzZÔcžC&—î1´ęX€öäkdŰĂĂěvŚ}PŐ9Ć.ŞZÇčQUúç÷Ę @á´Ę<®Ý”  Şß>eźŢ}ú|ţŻ'ľŽ]x˛XÝe¸i›¤µŮŐ=Qó]^Qâ:ĺ”#}†&¦7ŚĽřoąjÖ qĹĂîęŕňˇ+IÖÁXű Ě|¬LU>ńA˝˘É7Ţ:m^çwÖDO¦ĘŢÓ‡^1)]IŹtł őA$Šť äŇ)rWřą ^úßŐĄ~‰n>×˲|@ǦĽq¬~đÖu]TqA׾ődýŕ+ĘN_ľđCž#ĎM˙Q…ONżĆ·‘Y«`Łäşć,üÚ,oruş÷•\ĺ4Ďo-Ę:~ß1[đlC®{ő+[ÉăÍÚj»ś‚¨%ůT\wĎž)”±(ý,‰XĹ–`Yţpŕ®6˙>/x˛…Y5UÝNÝřÁ˘xäÁĎîĐ»řŕ…żÉŃvfóVb¤i “D8żüĹż‡hŰ‹ Ň{ńwŰ^üźM׳^ü•´BK÷ÜgE}őW‰†ýÄ«ż¶pʧÉ3_ý[轼ú÷mőďÓ·§W˙s zôĽµMQ›cp L§=—dá n;ĺńć+ąKĄŹ9ŤW sĚ7QÔş}ú†ŇôK= ‹ Izx·VʶŚ5"qjHŹ\ü"´¨˘5®‘Ć‚M…QŞ=oĽŻŔ—)nôĆ?_Míup üYí= ú”ĄĹh`Fűľ副ş!”ĚÇ{ßg ~ îŚif¨Ý“’ÄŽ[G#-ŻŕŤŚ'MÁs“@ĄŞÎv<®¨‡l¬ő …Bő@żÖzčyö bÄŢ›*QdVăÍČŕ H*“ ťnm>ojđÍă⡤wÍb¤ýŮ “îYí‡ŕ™2÷^Ţ_1RgOő¶r’n2’ej{‡!c>ŕgÖÚ6Ç*:W\÷¸ß˝ŕĂśçFÝË&ŕX·ŕă×I>~}kg‚–=±›]®S€)ĐşS`(•đ‰Ć^­ú5,ĄOţ˙pú´Ń6 Ě¬K ±m€3Ř6 Äl )‚_Q.Jy=găäĎ)-˝ţ Ęqü;~}"7"Úµęş$(PĂhpQ¸â­ůő˙Řy<Ńű’ °dQTř:á ŢšŚŞMÔĂ%J¶äúlׄËüş5řzśÄ’»k~™ą+1ó0Ţz]'kĂNcó%/Ň‹9ü>ú çkC­7j ćUÖ,ßľy3C‰‘… :żş‡BěŞÂô°ľ.ĢhFŢ@”HTÄB®˙?Ň[¬ď9™×ü«Ątp X¨óL÷ż1ţńéwendstream endobj 169 0 obj << /Type /Page /Contents 170 0 R /Resources 168 0 R /MediaBox [0 0 595.276 841.89] /Parent 164 0 R >> endobj 168 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 173 0 obj << /Length 2504 /Filter /FlateDecode >> stream xÚ˝Z[o۸~÷ŻđŁŚ=fE‘şő-M\lzIrg‹nT[I„:–Ź,7Čţú33Ľ¶ląč Aš!©áÇá7Ă’ďf7ď“aĘŇH g÷C$Lřé0Ž}–$Ńp¶řâÉŃË8Ţě1Ť…ŢŮÍ{—ŁŻłÉlŔ‡>üăĂÔĆaĚRçO˙ ľ|ő‡‹?ü0đ™H“á3”}ĆÓtř4Đĺĺŕvđ_+c BĆŽ”w{řpŚ@0? Z¶Ü”Łq„^•?›đqŻÂéeŐ2Çşr5 RŻ®ĘĄŞ\ĂOě•…Ş¦ž‘÷·ú0± ~ç8˝7ďgŁ™0 @qě»ő :Ż§Ô›ŻÎˇb‰ůj$ŻV2\ýúKDŞEÔüC^«B¦!#Üŕ‚ĽˇEMń1C‹e®şqŞk^Ý—(ŕ A ÇAȇٌ9gi¨ÔgÇÁA„­A°îdlqRd]”P\eˢĆ>/𨍳CÚb©”0.fpLeSŔ š*ë‹üGőóĽ­4ÁYjť°<"ŢćEaĽŹP¨ĘUąU‹‡­J1XĽ©ĹËu¶”µjz Â`Ťf÷2$‘A¤Žóląü†­4ŕ÷ ŤĂ{ç{ŐJŐ\F,JĄVµ2˘9#u*0sR&®T5˛M‹ČWŞeXí6Ő8ĎB˙ŃZę€ÔŰjeX|`YŔľźĄ'XSš7|‚‹ áý1JËmţV»+ôŤ }ż«úkkµD¸ë.gzÚĐh´‡\ĎąĘוQýFŻö*VZWzepÂ彪#-čş{ŕ-X\‰ őLv‡ÓxĐŔąt€+ŇŹy¤$dű]^´€…‚%AÜ 0-ŞXA1t]LnĎ[ŚÖ[§et`X¬č‰ĺ…rIóŞXŹĚ¶$:‰Őf­śB|Ćá2xKá2Ń Ŕž1¶PA€hř›©źŁwkä°&ý)č}rawYŘ)˘ó>ů,ŠeOTo„çşîÓMö>PY¶wˇ2twPťâ{Ř,á»°Ć;ŘÚÁw±¬ĂxŔa/Ň”ľˇJŚHÉáBąv:XňiŢ')ó»ĽßĚMô]¬k$Ż }uč>ß>íX„ ‚m(żgŻáĂ!Ž!î‡ŮŤ°ăĚÖ}ş™Ý*Ëě.T†ŮŞSĚî›ev6ĂlŰÍŮôěsŰ›GڇN|„>čĂ‚Ç&%lePBaľ˘ Ň?H˝ľ·äËÖWő,ó¬ćďZĂď«E)ŚÉÝ Xög*űŰß ĘčČč)żC 2É×!8ÜÇXÝp\ä›ů|GézŰ1@ŇD¦–)Áä [Lv´«»OźşwŐCĆ+đ4Jö¸1É4€!“~Ě×vÔ|MźNóí•1ßNTÚ|]TW“Ůź×ÓŹÇĚ·lĆ|;±ióÝŃŘtz==mľ‘ďťáp=ŻŐˇ’żú®*óŞŇ{ţՎȸ©&ß;"ŰV6%yĄô@bn#DOÜl„ç¦îÓÍÍ>PYnvˇ2ÜtPÝ^źśĚZĐ$ëiÜ4-«řĽX„;Đţś^Î&‡©éFMq˘ÎÂâ¸9j¬(\Š6AK]PY†wˇ2 wPť`xĐ,Ă» †;Ц“ł‹“‰pč§Dpü?‹Ś}Ĺl¬:Äě‰ŔIfďY‚ß“5=©¬Ŕ°Ü2<Ö Ż_#ĺ•~ĘôÄíFŘqnë>ÝÜî•ĺv*ĂmŐ n÷Ír» šá¶íÝĺŐin'ˇ$n'ˇŘsŢŘâÄsşG©4aŹ‘ü1w‡żűŽ9viűŠŽY$ś ŮÓѤ#ě(yMźNňö‚Ę·•&Ż‹Ş›Ľ˝@3ä턦ÉëB;żľşšśĎN޸@ůfaŘÔвË_ÇáęrXŮş6¶W¦óšŇś+J}čř ţ·CŠ!Þܯ#ě8uźn÷Ę2¸ •a°ęúnvýľM`ÁDőLËęF&™/w5¶Őymá‘ă(1w祪ˇňŚnŚ_°&u·ÓnŇę1«rĺxť€C4.őíĆú’™dŰ ¦×ńÇAČBŰ›aÇ٬űtłąT–Í]¨ ›TÝlî™es2ĂfŮçÉçëé_'٧/A‘zXĚLˇXm¶ôš†GÝ·DóÂy+ˇ(Ú<Ł()±·ăä”KóÜÂ}"Ey!t}4‡ét6˘ ¬nn’ć9;tl‰g30ýqđ|µÝŕhVeOyťW›“ŹGčt±Z¶Ź‹a±|-sďđRcIŕK,Ňł)¬ŮÔ•ŮŚ°ÖĽnĘčű¦·©\u9x1FŠ÷wT®.90Ń0WĘ;ŹqŽ©Nµö9NťŮ;V­î©ž»;˛>_ţţkzŠ|•üG~ł7G~¸˙śIuŘ{R„óĂ{ÓTVŞlą6§˙‹:mk-ŰĽ¬Č?Vô’§Üę“kúđyh…wółÚ(ËďEţkş†Ş…’Ü÷¶öĄźn[du¦Jv†5m «|ˇęźń^Ŕʡ', h_—®”c ÷)«ąy¤%Ľg{˝°j(ZRJ©6ŻĹO*ĺĐ}ÁOi$ő›AeBřŁ.č&.ű¶Ô÷Úq¤»E`be•ë/u›ŤźUá>¶©ŠăäX,Íg¬ő0ä_a ®Uţ›·¤Jθ¤ü8¤€ŕT9mÄ*C*(SÚýÝmŇKD$+äwëěÁ\ĄĂ_Ď#ᣲlłj\á &ä ő!ž`ÉĆĂ U»ć˵j¤mđ{q}ţÖ˙f´¤WŔ<"ŃęőŰ7ođ&FžŻ×yhW?ĎďKÜއśá‘wű˛ž óĄŠG>Đ[©E;ůőř~DémäÉȬĆ˙6üŕ˙endstream endobj 172 0 obj << /Type /Page /Contents 173 0 R /Resources 171 0 R /MediaBox [0 0 595.276 841.89] /Parent 164 0 R >> endobj 171 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 176 0 obj << /Length 2280 /Filter /FlateDecode >> stream xÚ­Y[oŰF~ׯŕ#ŐšΕd€}hle› qĽ¶Ś] - Z˘d˘©R’÷×ďą )ę7‰‹áp8sć\ľóť3ň›ńŕŐŰ4ČDćt0žRĄBÇY$±HSڧż„fI“d:ßĂHkţt5”á»áoă÷Ńx ţÉ ‹Ä&"Ó6,~ů-¦8x?…ÎŇŕƱY,Fi?^ n˙édÄA¤•°Iz,Ât"”A¨©qţu_JŞD‰˛BŰ˝A+e¤`¦c3 Č Ú%dĄ›´H­’V‰,Nž¸çőŇ663§s,,’‰.6_”F{cĆŁvů 3­IEbug¦‚/RdÖ’ťqJ« ‰•HŤ$CG˙»út=LU8>6˘&¶«˙6ŠZX©NĆ1jeE=a'ôsR—îéws5:©$,«!üżA5!|YoÄÄ%€ Úp»ŞV×ĹĽ„ř­7đ€T†Íu BdXăĚM=Ŕ¨śŠĺč g[żĆ6F©v€qŘwÉc<ćĐcĆHˇő?ă±VÖó3ĆŔÇlĎcĹz2FW=­†< Tĺ6E Pe9•§°’Ľ®XmĘşâ}đŠ[Ó°8Ď©‚ěľ$!0™ ĺř I]‡ať '¸ď>‡ŤÍ<˛ “ŐY·=Ő3Ú2!®&\—Gž„uNëŔAhĄł/ó¤—ő„ťđ¤4BŰťnPAŢmŤĄ.šŘ9“´îtů$÷¬jQ ~3şöšů)¤ŘŘž ž/E ĘŠzÂN!ĹŠX¦Ý‰¨ë]ľ.nŻ?@€Î:Ś(eŽŁ$Óě4ŕ-Ŕ4r‰)y™^VÔv › #ew"Şřék[]!”1ż6&ŐÂË÷ëW"ŞU˘Č6§mHI@8E<;Čî‡! ż.§?śŔíyMiU˙YCT‚ň\"ĂO0s;îř!:‘3«‹âXçďVdPćl‹Ä˝^VÔv ď™0iÖťĘýśWÓE śeiřs5e?ŸĚîY”(M}D E©W^PËŚbiîËţľĚâz«/×TKYłs†îµ9P]ŞˇŽ€©F·eiđă Őd˝)¸†(¨!CśßUÓ¦ˇČBÓĂĹŁ\Ă›É-±"-ň†ß7µßŮSĂ:sŻŚ}Ĺů'އF(6ĘK9ăÓŠĎ“ˇ9+d4›† jJzCĹü0_¬kŽ:$řXĄ… HËĂÄ,`}ýĽqČv!uđ2%Ť×°Ćóާ5Ş0هeQµŠÔüĽ#őxĽ^ń ®FŐ@émęu\ű'?đóÂź]7{ź–Xţ—uóÄ_[Ç®Ź2 Y٧V~;Ň}©úpŽŔŃwötô-Ńß·G?= ľě?ŃÜ}žĐcĺC !SŢçV¨ô“9ĆvÍtHňEäKť’Ô;öń°¨‘&ŃB`żÍ=w[8†ęO*6ŔI !$ɰk˛]’FP.3R)aň®yxç[zYűndR¦,+÷çćüÚáĆ„\Â+–Ĺ’LÂ>ç©•/Ă‘µú_qĎ„¶wÜď‘PEo ÍçUÇňýDYŁZ“ič/JľómÓŠźňÂÖvX†JäčYŞB~ď†o[Ú+ÜŢ“6‹aţÝ?Ăq | G+7,#G›¦ÝÉkŠeCÝOf°ň㍍đňÓxK_#“X,ťšjdĂďm´MâŽěĘ9ŕ&1”฼‹'®źˇóŕ¬?ű4_ś!»Ä=É–ş)`‰˘ÁŐH?8ůčÝB(ÁCČŽ˘awyý>b-ľťnĂUS¬[čĄäwvAÔů`Čwh†˛ŢsD”`(j  ¤ŕ×}…Ô …`ŃÇŰŘ>ć—ťB ’n˛)†Ä6~Ç;ǶME<¶š3†Â’¤µG7ĹćżĂ̵ęČđő8ô¤lŽ©ĂŔý w告JŠZÝřŰ„Náě,ŮsÖ$_,JTbŽpĂ*CäŁÚRMčnhö˛ö÷€hµđ‰ / ďŠÜŤ±aꀏ÷ES´‚ýŕ{íâŽ_8¨ż‡.Č:é2•^z) •ân˝OC0ÇZga9ă Ýq'Xí8÷§ÜŇ‘Tě k”ˇ,_spW;3˝đBîçśÂŘ®ď§yU÷yˇňsŽG7>qj€4ţÄOeSřjĄhOmkc˛C†ŽŤHd[™ ×gĺń}F9‘¨,Đ™Re_ÓżJť~ˇő˛˘ž0nŮzJ…°ß®é_g" Ŕý?â# ŰDXmĽ5˘ídÚť*¸%'{|řýý€™tý~@B?đTM÷ ]<ę­źĎ ú<ŢUË­ę ćEU@x‹nŔ÷‰_0 1ńsş”˙±Ćt4źĂ4ĚŢůi"¦=+ĹAŁ7á\Ńm­îŔÜôAişNŻCŐţ'bńt‡„ß‚˛)6[˘öç+Ńč3šłlEáĹÖ3>sÇ”űr^IľĄ…D1˝_;Äžîvś¤źÍőőëăT‹€JÁ3fÓ$S-Bő˘űŤâ‰ő :žY‰‰ 7ň,Nçü¤Ó †Ć,ÝoĚv?ľTă§Uá3§ÄíŐĺŐ5(;ú÷ď ă÷‹ŃÍů);Ô¦ôÇzNě»ŰÎfôSÉAҸf^A™¶‰ąÖן/˘ę»˝2+Ĺ‹Ýňö݇ŃĺOGß웞UN·ŹŢC,D·‡–ţF„cVĺĹţzsűöŘUîyW­ę˛Ú`oDb˘{VËŻđ¤× ś?úˇ1ć2ÉŰ]÷EîýÉB ¸ćř‹˝5ß˙W‹Čˉv‚¸~ٸ-•Č™né˙8Ŕ×Í1fw«6á*źťđŰăPÓ}¦űĚą LýšÍĆQw‹Í}Kc‹$~çŧóqţÇÖµž§@™{ŚČfőúŐ+¤88y˛Zqçç×ŰfRĚj$Ňf^ŞŘŐ<ĺŕ>-Ó@ĂuÔÄ÷ČŹ‹'ćMsĆOÇnĄV»Đtjů?&ĺQĎendstream endobj 175 0 obj << /Type /Page /Contents 176 0 R /Resources 174 0 R /MediaBox [0 0 595.276 841.89] /Parent 164 0 R >> endobj 174 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 179 0 obj << /Length 2620 /Filter /FlateDecode >> stream xÚ˝[[wÚ:~ĎŻŕѬ3¨˛.¶ÔyĘ…ÎI›B‡öĚęôIĽJ€§9ť_?ÚşŘrŚEgF+««ÁH›íëű¶¶¶ÄŮôäÍ;Ń“Hf´7˝ëĄD Še/Ď1"ëM_Ö¤,—4™>,űJYrú©ź&—ýoÓ÷'ĂéIÚĂę_Ú“¸—óIĘ{óÇ“ť|ý†{‹Ü{‚•˘÷¬®1JĄě=ž0Bíőęäúär2đĽś>e[„›ŠpĆ5¶‰B”&ĺÓNZ+p‚&źű’'łŐÓň-TźÎ˝ŻG ąT·‚-Öĺ7cä=*PŠskr N)MŠuźČ¤Ôw»_îLăną…űęĆ˝ţk¬Šő˝1جM7<łÍťi+ę¶»ÍJ˝YmúD$ĎđůľĆ˝ž2xŠ$ç˝AĘ‘dŮ?qš·ż ą0Řo>Ť>˝#ŠbśörśŁ”üÂ@Q”Rqx¨śŻçĚŚ—Ş>.Óę†lŘB•RÄŚĘú ŁJ3ÄEŢ@u}s~>Ľľnó!CYJě3}۰Ś%°LŤđ¶? y˛ÜÍĘBŤ¶îśo·«eą\€+Ŕ„ˇ3C^öOó9 ÷rŻ©s÷,Xýě – öŘĚU´±Ďr‰”¤˘ }í«sä­Ipŕc@ră‚d‡Ýôîrtyý{{ĐSD…7č4·Nsš\«áşř`‹˝i›­ŞP0[¨«ź¦ątŤ»Çb`řq˝|>@™ŕ˛°‘Æ{,Ö›˛ŠE*R”Ĺ ‚GńoM$¸ĺ1ę¤1¸ĂŐˇ,yjgÝě±6aúÄ@Uń'„ĘČCu9ú|zuyŃÂĆ)$ŹÍú c㙺ä lĂëó· F’¤5·‰€©Ý®&,ÍwĹV5š¸FIëtä˛\– I%źËË5'×0­9Î:«^Çă™iúŃç™’0Ý’±üQĚí©Ŕ肺Šm V›őkI•d0*#˝vÖMtk&z TŃC¨Ń=TÇ[Eô6GtۧÓÉéÇ6Ó3”r/ŠŽŐł…ŕůPĹeKęűGşOťĎV«ŰŮĽOIň˝ĺźq=ľĆrsŔŐ eęűű ů}˝h#U÷t’4Zˇm­Đ ä¶đ¦ň‘ltâ¨őć’ÓCpR ą ł÷ąPŇşQź›Ŕs¸jARa„d¦–”Ô—SŮ´hNeŁ›««pÄ9$^ « qžâ‚*ţŠ8ňőśuĘ×Ůĺ•“o••ŻŹj4ś~O>tÉ7 6'ß 6+ßĆ›LĆ“ăňÍpr /ŠëËŇ,š€ü»ď¦qąYR'xמ­R¬Rń”6ř:ÚU‰ŰŻ$Q1¸ÉąŠ ‘pĎY77­M›1PUÜ ˇrÜôP]ŹĎ? §-hL(üyhÖWšŠy9ĺ h_&—Óáaj¦ţú@ZAž»yEý×Y|.L6ŻzĘâQwn I*;S¨ŤŽéf‰–>CulŢ:3su†răÍ4Ńé›uůLˇä•Nr”ËXŃ·vÖÍpkfx TĂC¨Ă=TGZĹđ4ÇpÚdxzqt‘Ŕ±Ô‡WgŃfCÓ!f ‰rţ_2»ą®~§Őôh–ŽĺĂsËđň5VŔL*KLâpŰsÖÉmgävTŽŰAT–Ű>Ş0·Ł@sÜBłÜöˇť]ŽŽs[p¦ą-8}ĽˇÇË#ćşÎĽł„í"ů­fnż/sîÓö3Ë Â8ŹDŢÚY7y­MĽ1PUä ˇräőP!o hyCĐy=hçăŃhx>=Z‘¦ÄÄfęŘT'ާÉ_/ŕÚśX­aŮ‹śxł^;ły©ËŤ÷&ôú›˙CüŤÁ`ĆPšĆ żµłn[›0c ŞBĺěˇßLÇďÚ¦fYdÖWSČ0k «µ,®gR$Óľ 6=Ř]DśéµźĐ"=Ć5rÚýDÚě\ÎvKx˝„Ă–%W¶Fů„݄Ӿ«2üëÄc5ś$Í"±ąvÖÍfkfs T›C¨›=Ta6Ç@V±9„̱ŮCöqřq<ůÇQ6ç2…­" \ÎÜE±Ţa˛p}^x{Ɇ˘ő6óF§ ŐîˇĘ·}_ěK;uˇ2}pĄw]1+ý:ű+Đś ¨Ę¸˘ĐÜsÖIsg¤yTŽćAT–ć>Ş›ÉU %*oÍâಾ¸T"k๮Çí !Q‚!qpY_a\ś+ń5Gńěňo-ĺĄPĄń‹0™H®¬vTʢ’ݤO^¨×*yɤ~üú˘°ł‡ş˘ťÇßß7.fëöIŽÂnvą]˝Ł»2v·VöT‹v÷‹TšaÄbďđśu ÎÚ„U%¸*'8ջ˫608ëCł8Ŕ¬Ż00–"’ł°Ń¸˝úŕđT# ŁőĆĄúrÚĆwă›Ckç5y‰íą0¸¨wŽă·zçŘ.2(’ąl¨KśAŢe4ß<­í}Ż[=aŮ,îNW—Ö‹×±Tüä‘JôµŻnů“°z"@ŞÄ€ä´SC J'ŞJ9TN85*W¶l Ę$ÎđYWAT™˘[Öľ_ÚÉJqj–ě)&ŘŰ·Ňom\ID° l\,ž^·/Ş\˛}°Âři®śŐkM˝f4ÖlU;ë–›µ ë-ŞJp!TNqŞ#g-˘`s›µAlvłÖÇfS×`*ƸTKzEK<–a“sÁ,XŔ |°=%ŠŞfńŐIÖ…]¸?=hŐK'Pč[şă‚¨†–ÎpúóqŐžN"ĚM§Ë?Ëĺz_>H•%Žxnž( Kܵłnq[›°¸c ŞÄBĺÄíˇµ $GYÎăŔ˛ľÂ°ŕüXJ°ľ ĎÚUÄ\ÝÄÁe}…qq¬˛Ö¬ëáäóprĽ$.2ŁîL䉸o Uč}® ŕ·¶’(PÎDsҬv~ô뽡‘JŤł˝ą°+,«mÝ?`(V^r Ťfg˙ŻjVĹÜĚÜD’ę(Ľţ-Ř»@[gÜaUGÍmőŹc rÜ?ŮMUč*J=–«;xź%w:5~„7u®˝4¶qPYůđ‚Ö!$/O(ŁÖ™¨.;q‰8g˙Ďo™ŚźAíČ0„÷ č›ę¸“ˇLE2&µŘuľcˇżzÖś%ŰŮ˝kŢ=÷)†íäŞŰt®á(Ë…µ)té‹{y?çIuäuµ5ťş.¦^/ĆçżAűoîYYV*0PŃ*·o߼4KÝyľÝęť[Šž/ď60ěî—Žäµ×=)ĘSŃŁzęŹďőo]~š$ŤýĹĽŚ3˝ýž%L¸ŃřsĹŢřendstream endobj 178 0 obj << /Type /Page /Contents 179 0 R /Resources 177 0 R /MediaBox [0 0 595.276 841.89] /Parent 164 0 R >> endobj 177 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 182 0 obj << /Length 2515 /Filter /FlateDecode >> stream xÚ­YÝr۸ľĎSřRž­XţKę]›t§ívş9M˛sfş˝PlŮŃÔ‘Ľ˛ťLÎÓ€ eÚro›ÉLDQ  đ~wyňú÷|T°ÂŞŃĺl$dÎ/FYĆYžŰŃĺô[˘Ç©ĐYˇ’Ë›jś*Ą“·çc‘|żütňţňDŚ8ü‰QÁG™ÉXˇĚhr{ňĎÉ·ď|4=áŁO'ś©"ÝĂ3QŁŰ-•/N.NţÓóHIqy‡ňm/ n"ăÖ8ŮÎÇJ&eWŢVëŞ[˝A‘€>‹¤$Ëł#ů´ZMşzą®ŰćňaYysgZxZZ•¬Ç2KŕÄËq*óÄ϶3˙5oPT‚ü·đóđÖş•“Ím…$ÍXÉš …Mi˙TVł/ńÓŇŽs•tU஦ăTkž”+˙„‡*’«Ż¸ógĺÍ˙Í…^Ŕk…Ż(“HĘ[˙Ňv´Ä˝m»zżŢ,T8]u(lż+.*)Kü9E2­ń˙Üë¬yZU é<Öôq*şŢĚfU÷ąjž7§%ůC“xóő ÎJgN|ŢşŁŃ‘ń}˙Čn˛öÄ(}éŽ˛Ş›9Í•ôŘ=bz@UŰc×cĆ Kz\opËŞ{ĺőRzˇ;Üăą-üťÄ÷őv¸ňĂ9ž˛íŞéqşś´Í¬žďßli4Dbd­b˛xţv+&T~ř~Vé–ÝńH.irĆa“8—«ęęëç…ŤaŇJoâŹ3ďË-úd±öŐđŕFÂŞÜŻ¶ď€ű€µŚ‹ŕ=­g˝5+z)™ĐÍ?rÉń+řËĘŮ?-ŕ<‹Há6(oâÖo:Ľ»ŇÚ¤lü Ř]ÚĚE‚ŕpdžȀż#!čîđ^›U¸Há˝`Ńşw3ä~÷«kzYőnHŰ„·ăüë÷ÍÓ·ôy¶5)ĎóN-‡ĐĐâS÷±Ü$“r±¸F9'(ŕ"ˇ&Qz§,<3RřÔv4îÂI'î}‡„Íü€fĘŐC3A±n:çWífEšp I ¤ĽŐq:8mŰuőďŐ yáΚЂ'›>řoÓr]Ҩ«Öřµk\2€‰űă\`€‘9ěëoxö˛i&ŰPułŤžQěiť"ÚäzĎ)‚|˙¸ůżÖ‚ĚŚs|–ô¸»{Q^űđ.3ëÉl˛ZCô+oü·&śăž>L«»zâżÝ”Í#1{Ú'vý‘3Łä0>ę>>JŤńA–¶ţőŠąŕ(˛Q ˛„Đ4đë÷rŤTŠĺű" sĎŹ—K™‚™BĚłÔX¦ňüQfn)f4rÔ©ˇĐz›ŕ‹×4ś’gL9Ň……(śącľ˙ďůź_Ç[/‡Ŕh˛žúe„<ś Ż4bv@>+†Ëwqţţ.\%tYµäܢÖEl¦BćY6Ë+Ľ?_ťKa€HA o´HNa¸¨·÷ ®gą+ŠĘťaçßÜp ç:€ËľřÜëtQ‡Ô”«X‰r©‹˝„ݧ•¨Áݸ;JüąoA Çy  A0!E3@Ç*öŹň0Îő(r­ź÷Q-‰YJËž˝tźś`ń$o2Žpkď=]µě_Eu˘křI_Ňo[LŰąYë Ú˘Íű>@3÷‚‹ťřďB)VhŹ D6< ü=>˙rľmŔiŕ$3R˙RőxĄłAůᄁßĐażT14äŮ‘ĘózZ*a™Éł©.®NOß_\ ýÁ2+BĄŮ^Ľ€ńeV0+ó—1~ÄěQăš'Ť˙"Ră?)•7~,ŐÇ/˝ýüńl ›H"ł—‘ÍózZ6€Ż…5;˛}xűĺěóűˇ_ ş‘_*Ë·ˇÝЇŘ{×ň3ˇ•h©]Ú®27 4µŰ'ŮĎŹ'b€„ű ZĽďˇś* ¬=ŠCí[pű3ť˙C˝™9<ő‡5W{JŔ×üă’š8ŃjLXç˘sĺřÁ‚şĎJë˛oIyŘś@šÍ°×@ÜĂť‡P-ěŻ7"FŹ5IÔp(k8-×Q ť±LĘc‹9G-0J‘=Óp Q‘ŰpÔ/Ňp=Ţp壆řË  ęč›Ď4ľ"LCĐ 3gÔ;Đn€0#ŤŢi7Ŕ'‡$ îq†!Ĺ#CĹăjóÂP. ¬wT ·`@.íŻ©ÔóJ#fT áPsŃďŐĎv"_úy§|ńJĄłč¸1Ä& LĄ˛˙őôŞˇč5v “•ŻűéáčZ×đ ×4ʼn*˘Z ý딾»6ô°”Ě@˛,Ű-%ÝĎ•;ç—°µsJßł¶;Ŕš–‡hŢv‡Ň¸öAă¬uÜvňĐ~ŠőBłb ŽáÍč_ů9śř¤[FdX3‚L áljě”:ÜD© /6Ő™ wť,ËyřĄŢîÇĘ•ŹýgúHőŕÔÓ¸ pÔpÇűć˙bI]…Ďł?OĂůßBójan°>[/߼~=E˝BYęş!ĚíßnşI5k tóŠ5Ő°ú•ř2‘ŹăšP÷'‡}NhߤPsŹÓÜ(›č>/ýĘ$˘iendstream endobj 181 0 obj << /Type /Page /Contents 182 0 R /Resources 180 0 R /MediaBox [0 0 595.276 841.89] /Parent 183 0 R >> endobj 180 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 186 0 obj << /Length 2823 /Filter /FlateDecode >> stream xÚíZKsŰFľëWđV‚1óDŞrP$zí¬"i-9»UI0 Q¨%†ýČŻß~ @P„mĚö\% çŃÓŻéŻ{Ć?Üź˝zíG™Č¬Ý?Śdę…J˛‘s‰đŢŽîgżDzKí2Ý?ăX)ťßŽeôvüŰýŹg“ű39JŕźeÉČ'2eFÓĺŮďgżü–ŚfgÉčÇłD¨ĚŹ>A;2ËFË3ťŞĐ^śÝťýŁŁ‘¸Gĺ‡'üáR )‰ł÷Ő¦d4/ˇµÁVS¬á«´Šrü¤ŃşÇ©‹ę†{g¸äc9-řçş—›†htÄfĽđSŮ<˘Ż^·;y)’ŘgV¬Z˝ĂeLiýöS)ěw Ű`?lETúzVRh“"őz`›T¤™yÁ.1®A[ gF1h'3†V]’éÁć*Jů@ZŚc«dtţ4bf˘ć1čRe.šć‹Ĺ·ăXKP,ô>‡śfF(c÷9Ý˝ď%©·"Ů,ŇĽŔQ”ĐĘ » SŠ{¤Č[ú¬ĄP„őíäđM^ÍĹR¬–AŠ’¤·ĘRssQăŹypRÔDZ±Qľ(ŃŁ‚_Ź˝BsŇ8¨.4fÇ©ŹŠuSnŠ%±ÂŽföKaóĚů=ăëÉ(ořŔQW0î¬ČŁ•ŠľPgřA ~^Á‚r]ĚľĺÎ`:ZvíËżs˙†y™{ĂhÎłö„@×F«°; \.ňеĂKÚqC¤ňyÁëómS/ó¦D÷ů2öôsčáZdZĐxÚUß{ŢWďŔˉěý™ÄĂIţß?]C'K[áŤéŇ >›/H:†pđëŞŢŮatJ"Ń,h˘šqc^TĹ:o šµó \“Q9Qü÷śŔ¨,şA…‘ö`:©ľ †–V žÜ7ô”wTŠš-rUmZł ŮěSŮÎo9 O˝4Ä?Ş6¦­sTe $E+~@ć=0Ď#MÝnÍ É'VčN 0fSŇ>Ć„°ť&ÂČŚdzG[i€ŠźÇt"¶Ĺwa±ëGĂTx—›ýRVÍo‡çÓ ™¸0ĺĽb.K8FYÄŃ{Nń‹Ô¸ę"ů&(g•Őś'ÔŐN¶úáPއš4SŁ^>ázڇŐ<0.uŹq6c, ¸2qök"ݡ€ÜňöúöiPT‰8P# :ôđ}AX”Á‡ÂbK+îăŔŘcH%NLv"c“®$D_ťť†«@ë8WŇ ăÝWwď/.&ww‡ţ`…•-€~eSNP´ ŻňńآÇŇŕ´^®ESĚř(B‚řÚ?‰›í”FA±ló€ˇa?|őmsëd¶7Y śřÓŘľGěYŰ·sŽÚţ$\µ¶?ĘU°}ź«·×?ź_˝˝<ŕÍ(áSwŢ­ăĽČ4¬ŮăíÍůőĺŐäĐ-ĄPľç–Ę&ŕ–!¶XÉHN€»=m˛e9X¨3T$”¦‚r&Ŕy—w0V·ÁîcIŕw¬żŮ@ĚŽ%Ę“Cî%ĽÇí°#_çËé? րثď%zÎ^şK2űUF ¤â­ĄÎĂ9ôÝ~GR=­()dBQcŁÇžY” Ŕ`Z vT`%áą’€»$É1DlšĽj;Hm´EŁB‘Áiz˛pú…‡(§tćEŞÝˇît§»TŁî°jÓ6ü¨¨z„HqŇŤ@[Örˇ1#ëö˘ŠOC`ř›†R¨ŘťŁ U‡Pú¦˘Ú(•$~[ýÂŹ’…đ+„Vőިć¬5:ȸšlő$źę„ מKţußÖ)‹qYöç‡ç›$=`‚ł˝4¬—٤ Dx0‰˝IËúşůáËš+TĆäZP”ńŃO“ű77—ÜF¸3.Ún. čÂĂëý[đÓźňĎT!ě4ˇ4ĆćŞÔŤ]­Łö3oŤ·]˝^a$5€v3qîˇüŔÚ쯜đĘíÉ3ąA4Ô'­ ŘĆt’ľg±„Ç˙µ ŹĄŞM˛N†Ý ŠűĚF˙Ää3_ăP‰ĘIČŕ›˛řÁĂQ˛ű9mľžc»ěy1X)ńŃŠń śü#ź3î,Ö`IƵ3|CVBímË#_-Čp…PóZĆJV@*¬hÚ4,$8Ą)mľť”aWSÎŃq´Ýrľ¨©®^đĎć)ý®†6ƨďy|“/ŰěňÍ`™ÚSÎ_sCżď…2ń»h)‡`\%SłŻGńťç@<Ěx‚áň9 )c/‚pí„KĺKĂ\= e ś´ŮqO}*¤K_áíě“@xŹŘóŢçŹ!Üůcn@¸?€đźčžźźsôĚ]|Üă„Ŕ0ŰrçmôI^s›ÎnůGqáV¤©<‰ŢZZÇő†î”ÚÓ[ĂLN9Ŕ€ôíM7ä; ˉŐX[°jŻv€-#Śą€ćö(<÷ÜíŻűí<űŔs ‰Źurž%Ŕ3śČQŞ4¤5|őî˛ać ŤeţCír»dXž">ÖUnMĽ ČF7g¤'ZKÎ}*wfˇń©„`l’hÁ?>L f1’ ›°?…rřćá[VĽń’!,P˝YÎqó[î!ráżo‹ ăÂĂČHY'Rî~-Ľć]1~ł`áşţ Ą.Ł;Nl_gŢď®Ç=«m‰8Izó.ř_›1%Á‡î+‚©* Üaô‡;\h­veĺ´»HÇé¤G‡/ĄÓšŽÚsîGUz|‘Ł_ÝĹçď­|‘ŐJ”™ě«‘çđ}YÝĄ Ü IVÄŐ/.ž!;>ż}ËŤ|nI7śCď®"pvw™†C¤ă<¤×á=ĂíŢ3 “s”e˝ţŇĺŕ›fťSe^K:J57‹ĎÄÖ‡’ź hU0W¤÷,Ře?0ëß¶‚ńëFYo×CU:¤.JN»´Úţ#dŘY?đ·59¶Á÷Áč™;Ń:›aÇ2Ü7Ňă‰Ö¤bW(f›§4őž–+TŞÖę©ňĂü):ă3Cçj„+]uvvŽßwĹź@ŰEx`Ú? řPłf‚ăg»ôQn. ¶ů6ľśĽ>uřJ© ¤W^hů•wGD)î‘:Ľ:ňQ°ľťCÁáć|ংżw'a«Ąu”1%‘Ąvʱ‹›ëűÉőÂLÁZí$ĽZÇy\Wäőy»š\˙íţÍᝨ®{0˙ž˝HÚđśőťćKSl†.(ÓĚ®ş˙ż-ťŕ}AAwš÷…±gßÚ9GßNÂUűľp”«đľĐçęčmiŻdTŔm)±4ď+ţ/ Ó‰w„X+f„wL’ś$ŐéHsvÄ÷áüö9ŽVůĽ-Şá×§±Jđ˘ćA~!ź…9%'”zçůĆDŹíąY¬xŽ|/o.ľÁţoZđ vf˘šŐwŻ^Íč šŇS´ ý­§ĹCŤço=/DU4†Lń˝]ú‘‰ć3ô#)ţ LŢŮÓ$±ăŘe#Ó]x˙Ý0Š(endstream endobj 185 0 obj << /Type /Page /Contents 186 0 R /Resources 184 0 R /MediaBox [0 0 595.276 841.89] /Parent 183 0 R >> endobj 184 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 189 0 obj << /Length 2712 /Filter /FlateDecode >> stream xÚ­Z]sÓČ}ĎŻđŁĚ˘Aó%ix !·€ !—„­­byĐÚ"Q­-űÚr˙~OOŹd9Vś,¤¨JFŁ™VOś>ÓáŐĺŃ‹˙ä#'\ŞG—ßFRĺB'n”e‰Čótt9ý™q,Mćtty]Žc­Mt|>–ŃŰń×ËwG§—Gr”ŕźąd”ŮL8mG“ůŃ˙Źľ|MFÓŁdôî(ÚĺŁ[Ś!ťÍŹŚŇa<;ş8ú_'#†¸'ĺ釵ť‚ôĄE’ZŻŰůX«¨Xó˛)Wë—¤Ög˝i%ňĚA8-ź,ꦬ›÷e}Ő\óâŢá3ŚL»4VEóâ{5«<ÚĚyb9ŽUá­ŚV°Ăśk¬«ż0ś…˝šZÔ´»Á´ßžđžÖyEüřŰbĹŞĆŇ´*±”ÂY´çoŃű+Z«Ł‹Ź$ ţđOŤ©u«ĘsžÄrŻË_´ňGSúwbŔyiš ?í9Ďą48ĎŕőübĤáqŔ=AŢ2ĺ°qĘf°­ű–Ź/ŤÍ]…¤1"µéăµŇi&ňűÔ˛,,ÖVČDÝ+ĚoM ŚGaőеDô¦Ű#şQë(śQ*ˇě(Ĺ 2Ă®{]­' ŠŐúÁ±óăî‘-DŘGŢ ˙y-Ťba1mË6źQ ëŐŻjNŘ{˛2M ˛ŇůÓž!×{éEÁ ç'U„™$]ťţ8˙řiśdö!łBç#›;‘BĐТ„ËÝ0¸QqOÖ«»!¸qŚv ©zApwzŇĄ“Ď_FÝß Ůr'a?/)—e±šßŻŹ×?ęÉžaśÁŽ,ŕÎź‰MřKoĎm?/!¤¦'łŞÜ~ľo$ťj„¬”e"Kň_˛R++î »k&MY‰dk—ćoŠzÚaź‰ŢĐ٧!ç\w˛žcô3Ń,řţÜ]śIŰěXŹ÷čD¬5í,@ř“ĹęĎ\Rř««˛y>ž‡ĄÝUé˙Ś•;Yx_ü]…óŔ1rßë©p2÷˘äyČéĘôĽnE®Óŕőu9¶t”±EѸ&ŚF>Fß ŞŤ§ĺ ™ ­ăäBZ˛ţ1çE3ą®j*qâ‹W´÷¦¬ůiű5ĽKůă°^WvĂŇGtĐW`QŞůK%ÖEl<Ž.9x)˛¬őo @ja3ů4P°•u/„%OőôxĘE`ŐTërźŕˇŮ··r"‘Ź…×ŚIą’4”OX2ý5@˛âž°»Ć2 ¨ĽűŢ@ŕ|‡ËÝpľW[†¤ŁÓďd6g ˛THm†sđ µűŮ(QE•żŽő9͢ŦaŤŰ}•}~Y Ú´Z·Éą¸)QÚ1›GE]/(›6ä+Î\hЬyO›Ý4.fřťD3Ţ7ĄMĺ=,Ţö’Á(uÉĚ!ŻW; á'™WÚ,*ř™€dB©^$ąQ"Óęg’üNĘËÄDV °LC<Á¤éR×g™ô8ŔGz‚îc™í’-ËrS,ěŃzië„Eč*–˛0\aDjÜ˝ÂüVfp4˘ŐvčŚF0I¶ĺ\Iźf&€«F€a ăÓé;ŐvŇĄ ,Ł]ý ô¤ş<¬¸'l@żT “ć;ú]ś{đDaĄ,ĎÚLܡĎpH𵅙ܖRIĄNÜVÓťŻa¨óĽTxI©tĆc’uBĎLٞ}e’EéiŚÔĘ:l$CwoßH„›š¤ó›š(”És‚GŹC9ę&¬ŠRń†Ö–±ŃYô”*Î3ëńÔčś.˝ëđŽIS±bšC3 Mž Čh‡79ˇRąEeěÂő Öq&•vśé?¶„ Ë3áˇEěÝ[ŽIbF˝ŘţéˇK ÉŠi—{8w·—ś{@JűşäHX^J(ž€ô…ŢČż {Ş«ćűdo§@·ž1§k» Ôn‡×)ÂyęLxá=nç=,ę§tČiqxŇŕőÇß\r—oʇXâ8óú#FÚBG1e¶sńÂK:Ňu×ÖÍ>ĺĎGďý!`ď+<Ý„öń‰dŚ -ĽüĆŘ7GüÄŞlhjU·DšĎŃ/łŐ|î…©Š¦śˇ¦k§B±u283Ż˙Ë3ţjQĚfˇ2;Ť5Üőˇń´m‘9ŠÍ¬áÝl –QáOó7OŇ’M="ňű˘&H2ßsňr®ş¦SS®Ę)勞lV] `†ôÜsşĆ}+ŰB,ůú“'Wq é~ÁŽAÖřĚ ń9Š÷ńV‹$±- ĂQ*S!ĽS•Eç7<±űů&Ç×L®J€- ?nc&ČęLyC»ĽŤĘđŞýŠ· ѡ hNl—4Óú#µQ±$ö<«&E Úµô.'Őź‰4>~±2Xü—ĎÖ·ĘP8‚Ş6ľŮÖu ‰ţr˙-Ľf=öÜ’k€\×»”ďł{FÖ)¸J»nYP(®đ‘|„&ËS7•;g‹&¤Ds]4í¨µf,JşZ4$ KënI˙˘=eçt23ś ľ!`CÂ#n8µ7Ő:$ëí5űm›ľ“Yµ×%’ŕkNSÔ“]˝đcă#^1­ĹŻĄ÷ASM63ŚŘF8c»‹ B'«’”@4)çřdОtŰyÁs›ę5?ř;3 8č2ůd~ĺn~Ży–ÍOŁé‚׋0±Í°’u"-«Ę'}M×…N Rş‚ß«‚'ßÚťĺŔőaĐĆDÇłőâyťeč'ßMĚÝV8?ęŚĹąé; ©9Ţç$ťPvÖTËŢ5đ.ŕq áEh€ë>Bŕi?ĂşöD?upJ~–ĘOś ÚEŠç:ú}ěôłMůŕ_ ľTuóu?çrĆ–×Ű»*„ń¸ úŻĘeg›uÓXĹř†ľýĚAŢęAB°ŐŮ‚¬y»-üAqŮż¶˛cÁČęúĘl˙€<x~vľ×.XPWFZ+2§C|%±íÁvA÷„1™ę)¤qy±Nvô——=­¤DíI´ ˛k%SaólG«‹Ď''§CśĘ¶Đ˝DĄqĐż ™C/'‹ůrV6Ŕ-„:»››› 3†8O[f ąi#ľďűGě{ůÎů͇ţVđSÎß »ßůaÍaç?…VťóiŐ:ż§Ő۳ߏ߿}˝§›Ő"WŮÓčdÖ ÔĂáţÓ×íÍńŮë÷§űqI÷ŕ^\ę”Ę[Ë{ősi÷ÇK0-Ú†Wba4˝ˇEŰ.· &łjzęáOś«E( ý‹ťn˙»EóSs’ŕj¨ž(·Âîć°ćp0?…V]0ŇŞ ćžVóSčÖó!ÝÚ`îév~üéřĂ^,«ţeâĺĐ__’<˙—tąZÔ("[Agźßżß×$NÉ®1z·Ż©…Ć[ę Zó+˙űĺÄ[Al<;•ÍĄŹ”ŁFĆů ă˙©@°˝R[*|Ĺ d˙t;ż-zŻůeMµÉshZSů˙…€QGC¬Ťş‹ÁlÉ/=WÁď×O~ŁůßZ~Ěe®‰ú7Ë—/^±Ĺ—'žC ˙ýĹf5Ë&P€źD=ŕ*•âŢ Wh‘†wľ †‹“ U%I:Žs«ÓhŰaúM4ú9endstream endobj 188 0 obj << /Type /Page /Contents 189 0 R /Resources 187 0 R /MediaBox [0 0 595.276 841.89] /Parent 183 0 R >> endobj 187 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F20 13 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 192 0 obj << /Length 2548 /Filter /FlateDecode >> stream xÚ˝ZßsŰ8~Ď_ˇGy¶bů[bßŇÔ;Mg›äšt§7Ý>čl%ńÔ‘}–’´˙ý%K‘ěć6ž›ÎÄ”DřőíŐŃëßłČ1gUtu ™1Ĺ]”¦śe™Ť®ć_c=I„NťŠŻn‹I˘”ŽŹ/&">ť|»úp4˝:‡"r˝F\˘ ¶ĆŤ!Í-*ú˝Ů9,<†™ îŰ É¤Ôa{Źż<ő8ĺ4KŤ‹¬sLg¸ťbBeăŽ×ČJ:ÂČű:”KYćŇvAÄu9=ţtňţ)4-á%žZ#k/4­ŕThÓvuúq:đitÍhĚ$bŻ0ˇ“ ‚Ŕ¸-yÚŘ’[˛%Ü©Ššn€ L °ŕZJĐYĘäËĚ$%­¨ˇń¬ă©°ŘnÓÁŞ nuPAŇPšK0›č€7gNŠ HFú†sż†b‹7Ú†¬h,KµíYí%3 !ÍŢpĺm;vř ˵¦;=h +ęȦŕOú…g/ČJ:†ćSĚgÚ÷ĐBţŕć0Đ‚¬ýĐRFT=hăf'MGŽ"ŘŃŰÄź156ósFĆ…m\?7Śť=ž˘]mÄ‚#ž×Ł#Ý‹´ÔJ¶˛J’;MłÚëA´Ë0¨żV#j,ô=‡!}‹k÷ ”í flˇĐ ‚U9]囲Ú/˛6ä`ăiA´Ŕß«I€ç0AqĎ·ů‹ ă˛ÓĚóŇeÁŹŕĆç d tń®xXĚŠ‘L}V\ÔŤŕY}żˇ12–Ř‘ ó3ś´‚Y^/VĺóYĚÉjő}QÔž:Ü9nŃsĽüłúŽ‹9á˝R‹2j謺uV©ŃY‘^C\¦ËęŰä=U¤¤ké¬*mbŃ_ÜpĚ˙@ÄĎđWyéxÜA?ŞĹ€śĂ ščZkdíך˙âVô´öJ¬e ,N1«ÁŤö)šZ ęk”ß—’¶U®żâÎ~L|Q‚š5§űĐŚCL&‡3/ó\-IX‚Żą_)śo¸ÜsÖ•†Ł=ZćBVlŁ3ŕWÁ‹Ř „˛űšT–Â`ŽÎRÍ&‚ęC±ů‰wˇ,KÔňŠ˘%>ÄŐę ĺ«C?m9IŕŮ’®ćhüÜ*<öÎ<§—*ôîÍvZ_Ş”q%{1x+<lĄ6y¦Ł-`i J¬&|ń?č+ë«KŮV[tEě•fiˇ¦±/Y Ďý±ĄŇşMm#5i3ŻITd9óŤG’zAtSjű™Ë% üŽ‹0#÷ú»U+٧sOä+ôč‡:„ÄťÓOË:ˇk ­ăişľË±-Ii˛ă]>ß’„ÇE}Űt:¶w«ś^§«âÇUµ€ŇË0?4+FĚ*4s¶Ô?7*o §zĐGőł$ęłńxVmřöŽďŇ,±4ćoÂ3-Ôe(ü“ßQ'Ü[¦â?'΀”űâ—Ť©Ż‹˛ţ6Ż2é0L9 Ă(čW»)‚…7ĹzÓX·q]śµ(CĘS´^3«oŞë•߬÷ŕdžߕ7¸čFr0H—`ťD:Ü Bľ»8»đ|t˘VXęe4?HJZQC–¬Â8óśb€G(¦!RO´ʰĚdiĎĺç““éĺĺĐ,ł˘Éőo°a'C§Ď‚UCŰqC$Ü?ś­îÖˢ.ćRČ?ÎôĘ’ę~F‡źž /—?'™nNa×Ţ Ťgo…±ZČâ[a»mćě·ú!Pµv߇ޱ|Őéٟǜľ`3@–dzlAÖ~lŔ|'u±˝?>{÷ǰ†bWe·T–[†xbELmĄ¶…n) T4ôŮĄéfpJS˝ÄâóĂÄXź‹ůîôEÁ«»Ř˙Ă*·yđVŘnsö{đ!PµĽUăÁT矯Î âîAYű‘i@~ŰEöqúńüÓżéż©V7 óf°(«{ętXt¸$”+ŔL˛>ať-:ië_MV÷Ďá¬ńýqřŐˇˇ„ŻűÝ׸.‰Żĺs˘›zѶ?’^›‚Âř]gÁj…ňý|‡U‹ČÜ꣙Lˇ^ł˝ŹfÚí:ˇđäI8€;DN5°Ť[šč'ÜAEá”§T·č¦nŃČ‹'ŤQú=ś2-}ş=ÖŁ [éjv Lő;Föé«Đ†×âńZĐďMń*¶@á&Ó+fEµĹ+zđäűb‡‚·ŠŰeë™/I¶^đ¤?%Ň”ĄbxťłábőÚiOáĺHÉş•ł«;f´Í)3čŘhÍŕ4<2¤l&C˛ »QŢ-ĚżJő=Žül9ş?-™í—^ÇŽ4~[†Z'TČ(jŢř.Î }|ŘŔ€›ŢĘ˙ç@µ$a ÷Ťë_jpŰŘeU-<ÇÜń˝]@Ţ䂢éŤjp6Ľ _«‘Ý6đRáx<ý‚hlŢ©‘ć]j G‚sĆÓg|¦H–ą˝;•td˝}ú_RpnëÚĺ¨qđ|ď.V•˝ă‰J> endobj 190 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 1853 /Filter /FlateDecode >> stream xÚíZßsÓ8~Ď_áG°ĐoY÷VÚr…–#)Ă Ç›&Cš„Ä-Ç»’ěÚqÚśą›f-­?iW»űI›>öž>O#K¬ŃđSÄxJµ‘1”¤©Ž†ă±ě'L+âá$ď'BČřŕMźĹ/ú‡/{ÇĂ‹(üc‘Ą‘Q†Xˇ˘ŃUďKďĂGŤ{4zŮŁDŘ4ú Ď”0kŁ«žä"<ĎzŢF I ĺ®doh1*2\Ş•[ßůrËYţž°ĐxŻŕífŠĎŁü]ßę8[ Ь¸^ă‚›Ú E”Ń03âüIEýDüâÔëyľ¨9ţw8›ćó>OăbSkIIŁ\ŃŞsbS»]ů+©=ŰŘ!I5IuÓ'Z`< Űs‚«?Á•#ÄĆU^Ü«'âÚhź®ń©({ą‰'Đ™­ůž‘fńt1?űĘ#ÓNďú©€7č:Í®P2߆zv>ôâGgŻAtP¬¦¨Űe#ĆŁÁĐĚ[¶’ůÝ®ű ăđe?â:\6}GčŇwľ\»o§9h-Ź gţRĚkĺj ¸U”Ć‹Oý„[ kwMmäĆgš]ŕ®âئhľşAcŚú ŚĐćAdžl1ćµA•ĆăĽö-iĹ…7LYPŤ€94˙NÁJú}ŕöt‚AbŚĎkDbĚŇřř=ăÍŮ[ôŁáf3÷-XEĘŇN ’Öf€3)XŰj:\ęîńˇ÷úém"ÚČŤ&¨x»çßíŕëosç­©5áS¤Ski—˛D·°’X+E C”´Ő|!EŽ1?䵬(¦:q9ô ؆B(=ĎŇx‚ɬf>şFĹ?ť&KÔ°ŰmŠ’Ä‚=8—Ľ#Ey¬¤Ö¦(äď´š—řőőý¸XůŐ†.č T%9ˇJě`Ż܆Ĺ7ö‘wÇĂ´‰ź§ů˝L %„Š \Ŕ»„Jťš»Ňŕî9D•塓:¶™¤ŹyŮ'ý-ăkÄĽď÷6W¸Ěç0+ŚfĹt~ŮOdę>–©đŮ>†TČ“,ľpďŁĎ^č+j:v˛n­Ř˝Ŕîe_ń¸‚…mhĎ;E%•ń“,®–łĽŘB,Ę’TŠ_ťX*~Ń2VŞäF„›ü"vŕi-aj/ôr u»‰$]ŹA>CŇCG ľŃ1µ„Y'Ç‚EóH¦´–ťLTb%5°M# Şš®ÉţČâ.2Ůý˝GŇ€Üu‰ÇÉçC˙ćx!ăćűá(ż9?:˝éĹűׯZŰ(`G¨~¶DŽŰ°’XkáĽO-«ćĂő-śF×WÁךwĚľ‹yÉG’H޶_H¶ę'‘ŔŤ’"™í¦_ŔJj`-ýp8‚Čvý‚‚osTp˝<ő 9ľźŠ‘Á·đă¶hŻs eÄ@0řp_0x’¦ IHS_ĺëuv™ű‡˛đĆßŐŤ=šdsĹKć›’:á±äJĸ(CúÝ ±ůQăŞD¶q%IíC´ÄiJcĄýj…Ѱ›­t/wH÷Âeľ—|_Ăş+á—"űĎřÇĐőWۨ”¸ÂtËű†‚jhá m§€ XI ¬PF Î\Šüźř÷”řĄ ÂD¸DŐqVRk'F Ł«ůîKü'./f¸ÇîiU»Ź`ţ×»kÉ Ŕ‰g?Zނݩeů!zkV¦î§7Ą…!¨RPOa+©µôS)ˇŚWóí‘Ţ”& ·”ďLmŤÚ“IŐ$9·Ě7ÉáK®üčgg8łŤáXEqjŠăZnöS1«aÝEqĄČ>*fM?Ŕ+˙–ŇłÄČnµ1‘‚“WpäÝjc%VRkśł(Đr)ň]÷óý|0¨ţ_d:üţ=ţ.ŃN•p4©‰¸K]w5`%5°ö…U@ęjľ=PÁ5ELÎü?)i:’ÇJj`m á>9¸Ů©¦(»×ˇďł+ćÝË+ORó0­ÔŇIV8.’5iE)wwRĘŃJ¸$HÖŐ ŚŁ 2ŽkKvÁçĚ7]đŮ%»ůsvLçMŃťkŤÜýçšV qa˝‘ĆłŰb#oyYlćĹŇÍU+4şî©Ű˘vĄ˝Ş5âJťm·•ÁĺŘĄä¸Á×LłXĄˇ ˘YëFŞw k†Iµź d ë.ş.EîŁëĆß`,†5d†.bŕq’[ ˙W*’ sE 8YKI°>އHî×Wč–ń2»tçßľöőţ†ý ÄÄŰ8ČL‹‰*&ýđĄŠ'ĺĹc¶ô®äíŃŮácě\z~0 ,f‚dZ,{útĽŔ_~ăŃOÄÍż¸^ŤňO‹>·ńę2'óĽhĹúŠai$ŕ¸ŕËb/ŻńđÍŰ_>ń-§Ü'UBÇJ”»ń7ľ4µěendstream endobj 194 0 obj << /Type /Page /Contents 195 0 R /Resources 193 0 R /MediaBox [0 0 595.276 841.89] /Parent 183 0 R >> endobj 193 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 198 0 obj << /Length 1704 /Filter /FlateDecode >> stream xÚĹXŮrÓH}÷WčQÔôŞeŢBH2ġ¨bx¶»p$#Ëařű9·EŽÍަ¨BíîŰçîKçÉdôři¬HU4ąŚ„Ě™âE”eśĺyMfďb=N„Î OćŐ8QJÇgc?żźĽOF"âř'˘‚G™ÉXˇL4˝}˝{ĎŁŮG/Fś©"Ź>cÍ™(Ščz¤Ąňëĺč|ôwŹ‘$  Ó- }ŘŐN2Ž|IŤ`HŽ{Şç°’Ř®~š€ $$âÓq®ăMMő˛kť´~kŕ;@őC¶j\Ţ’!ł¸ů¸đ…őL¸Š7,ž‰LkW ?]=Ą”OŤň‚áęç×ID‘©¸tj‚ˇ^×ŐšKBľ‚¨Fč¸kčkâ鼬Ă^é¶Ö]ŮUnySR´/ĘKO˛¨énšŻQbz:6‚JJ"x‘‚a]µ´Sv‹ú ·a±Ň},aą$Äx‰›ěďéGwú™ÄťWµűŐˇ YşXlV–WŔ‡Ďeňxá\GKËŁą^~ŐUl·!qĹLˇĽE¦ň˙řH'¦|O{7*cFd»™¤űL’Úf¦ťúź{:üČf–9Ěş™^ôĽěÂ`3ĂÄ]‘„AĘňüÇĺR¦€‰ő~ÁR†ŔU,“ůWŃě]4· ä{ÔTŽňŰb(q⣔ÜMĺPFn”—ŚÇoĎN_ŹsOvUĹLd˛žú»Ĺ ±$äţb°’ŘůR‹4ß’ďüěřŃŚ,@úQ.¸ Ĺŕ|’f!ŠQ]VVz>ĺKĘę͸@޶çČnllÖľ¸l17“oOgIl+Ł,2BNBJřĆçáĘOkŮži đ˘H#]hf~¤łĂ„+€íšP Í2žőĂÄF5 ćM1Ż…aŤŠĄ ľ‚ÉTôM@p™ú.@ăčşë·h豏ý}0íŤ!8Ř»ţŠ:D·ěŕdžąa¸…Q۰áň-űŔÂuť™ř EfŮž”Řş¦˛Zź^L¶.K×ŮOAóŠś“Ź[\€äš»ß@˘.€~µÜ#BčbC/Â%G rëYŞĄCKÜ˝ď˘7\~˝˛‘X˛{ß.8Wi¦8lĽČk¦Š ŤÁk›!©Ď>=†˝W źź6öFٵmPváŰ'-›K÷-wNĐX©«ş™r©ĚőROR{’ş±cÉśŇ[iĎěL? g{† =lĹr#~Ĺů¶-t–÷¶Njʍ0¨Ę›EŢ*/˝®RY]ńqCVz36ÄŘĎŢBwo‘…?hHjOR7ÝüV$»×Ďďgó3“Wf8ĚLć Č…·AľĄűXiééT÷O ÖΊÍĆZěrI˘ŁŻkŚQî`ĺĆE‹°°Ď;;SVtšZU¬€Ył­i×ZĂĐŚ„Š]yyěŰsá¸Đ„Ě=ňü”€ÎFo©¶i˝î ĐŰU5ÄŹ\C_ş·Ď6x]]aÖň˘ďŽmŐ+€–ęÝ€ťRĽW˘ěĄ§ÝŇß9ÇŮŃ_nŻj­ÔĘĂě‹o‘k&TŚOMYwAĄ’Ćřśű€ÄÉfí6°tľ˛dy|IëM=őS%·§łjŐV$ý̇g?4ć±’p i€'ČD9ĂËÄţx:FKmÚÍőŢ©”÷ůĹv¦Bú# Ş2ć*Łďów‡“Üąňi"<ŞP,¨|¦,ŐÍ#śđ©A® Ć0:^•W®Ů_źÇäÉÁ±;Ä+ŔšËŃ,źvňT!ĚűČ[®Üˇő ľG§‡i˙a7o'3§<ęV<~> endobj 196 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 201 0 obj << /Length 2601 /Filter /FlateDecode >> stream xÚ˝ZKsŰ8ľűWčHfB„x’ĚÍc;;Îúµ–íš­LŠD۬‘EE˘śÉżßn4@Q&E§6¬TŞbl4>4ú ý~sđîC:ĘXfäčć~ÄEĘdśŤ’$fijF7łO #®’L7ŹyI©‚Ă«§á盏'7|Ă?>ĘâQ˘–I=š>|=řô9ÍâŃÇÉ,}çń,=(!Ýóü`|đźšGL˘—ßĐÖq!Yl´Ĺv xPmVhŕRÜ…™&óMţÂ줱=)Xšd°NţT,ŞĎDÔLŹGrLĄ ŠE(˛ ˛«=ä+\ĺK\×®í˙DU, \Đg”YyOcŐăvěľśĂËĽ E|ĂůnăÁ窜łLëQÄ5Ë”EöWĚ“öé°ß^]\˝<#+¦´%q¸ř’ŚË´ű¨<ݍÁŚÎ«HÂ7ťńzAvŇBĹ%S*•ăŐŹŠ¦ÓdŐřöččdCV‰ ŹŽŽą¬7Ó)wľ¶ŞsżA-S°öŮGô4ŘŮ›$c`Rý–×Ţ“w$˝?$î}ܱ7 ť^Üžť·€iÉR‘ ̱ę¦ <ę&°?/ŽĎNÚÚČ™LÚ(M Úč\Šá>N3T(7‚>eMŹčŽĘŠÔ’Çä%wôrB.ę9Ôk©2č‚Éx­Ę¤ ŤPI€1>O+ËĹ-†Üy‹™ÖvD]€ľk!‚(;<€f:ťřś›ťˇěôW¸`Ha”ĚŇŢ-łýÚëhúµwTµööˇňÚŰ@őšö­ÖŢ>l^{ŘŽOĆG-Ť1Ëoxâ8 nPI˝7ŽłŕĎó3ú0+Ág¦Átó”“3%…ĚËŔ›7őń~ž ĂćŠD ™"ć‹˝•+ú‹®˝"JôĽ´Fţr®M5JrÖ“bAúÚŹÉ2L.(]‰wŔ~0‹YťçZnhŲÂőËĹŻp÷:• 1é0Ó`¶×`îŃWTǡ¦ąŠ®ĹOe,Nł†ĎÇňŹÔ>[źŻˇ’Uű|ľ0Ş™Ď e:M_ŃG°µ6Đ”é:4mq^Lžň.(˘íb¸4Oë8gëŮž8¬4Ű=·,*â)¤»ÇĹíŮYżë2b;É ő´’,‘Cń–Ů~#v4ýF<ŞÚűPy#n şĽ˝ąüĐBôkdŽW?2ČbµěüäüňúżŻÖBšŕt±Ţ€f©oař^Z“ĄXQĄkŘjJdoĚ˙)֮ި(ŞáŁŻŞÝ ˛Öä±µ˛[„ó_QDk`”ŞŞčłýşěh¬sĽ†˝xM‹FŇË:n’dŰäľĺ–Uí–…B·ŚVʸ׎ˤ#ë’y2JmcÉŢv—ĚęµěeÜš‰— pç•ţ8. z­!ŐčfYd€Yśîef§ĆŔŚžu×&9˘â۸ű#+l8.ŁtU˘QşřÚĘ4·4ĆÓ´Sbô<…±°żË”h Ő>rç OÂE&Ö9ˇŕ•˘_\X   "AéÖ­>~ôרĘe^({ż˙Î#Ŕ>\’úVÝEiU„\ůe'č˛Ä- _6k—…g$úhOFî7 đż®—oGü—™űŠË-ý<€¦ ľ`Ýőť:Ą´nŞ‚[|…~ _ Ťĺ[mž:’6ÉâdŇ&™Óy­ŐĎüřD[FäYô[EÜ6i ň+­UěŚPŢŤ*č4Pj,'µ1áQC=i|¦ŹVň™Ł)Đţ𩮆 Śxôg<_ŇGň*8ľ<ú ÇóI¶“€yÄčP-ßż{‡×>°ňtą´])\żÜ¬¦ů}‰·1«‡ś-ňŞŁOÎYŮ1[QŻęŁý…ČwJÝŐ[ú+âŘ„QŞĄ ´ö§ń?[†endstream endobj 200 0 obj << /Type /Page /Contents 201 0 R /Resources 199 0 R /MediaBox [0 0 595.276 841.89] /Parent 202 0 R >> endobj 199 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 205 0 obj << /Length 2392 /Filter /FlateDecode >> stream xÚ˝Y[SŰJ~çWčQΉ&sŐ%o>@*d °`Rg+›Ĺ Š±},6˙~»§g$É&µqmQ…Ąąô|ÓýuO÷čĎÉŃ»i±,VÁä.2eŠgA’p–¦q0™} ő(:ÉT8y(F‘R:_ŤDx6ú6ůtt:9‡?dTžÉTŻQůŘ.ďĂćÉÜÁv{}ŢŁ2p!ÎDKeČ9<•‰Ş+“Ɇc<1ŕŢâů;ďI†ü!ő'xY9ľ§pô§ŰqŘů%đ0÷÷˙#"CFŁUv 2·Âv“ŮŤŮOćC jČĽ•'sŐkd>¶†Ěű°y2w°]ŤŻÇź{¤“1¦ŤĚ= Ű…qÝ”Ł"y/ňǢ'J'LIźĄľ•xżů0ĘâpłčŁ,U~ĐrÝ—ÁÁ˙Ň-‡Ok›†îö,ĹŚ­kY×iÝH‘iďFĐá=©shŔYR¬‡Ü*§úp~e2ĂŚ>Đ!Ѷӯü˝~uTŢŻö˘r~ŐEuy;ąüĐC¦Sq|dNÖ~dq˝…ěóéçË뽚đH‡g‹j̧ľfňĹWŠéŽXSj˝ÄĚz=Ą ŤÎLł äë©Ŕ-ţSVĘôčÓxד'ü‹¬_ř¬}Űż2É2Řc$aEN+]Ť”żź¨^-P?.f}Ě—©ŕ*r>trľ¦Ř”€şđ›q9ƥŕ‘#Ż:ÖÇąĺ^ 'ú0¶ŰkT˙ą+‰Ę`ŞťÚSI¶úE$_ňő`üƱŔˇ;kqŠXë2˙ŢŃc˝¤o<É%jęudń±y ŢŐȡsż°»Ô®-!»Ďń5 §ů|ŽĐňé¨÷ď atZwA]v:ü~·V.č…˘ď“]ňţ‡"ŐvkÎ]±?ŁŚňKşeĆ<Ű߬‹öĂĽnÜ×±FŚËËóíäugB(¤4ü^“ś¨DˇÓxé ěŐUĚb8…tf>EĹ{‚ µĘ˝U&˝=Ź”­›nę\ŕĺVovL ˛OMUcLŘT'óuÚ˛~O.Ź˙Ŕö?|ţá `nőęý»w3['…ÓŐĘŢoŕúËÍzZÜ-Ń‹×÷[őŔ%¨`ĄŠqw­óÉ~ÜüIVĐoéWrŹ˘Ô€Ř[ăż0±eŘendstream endobj 204 0 obj << /Type /Page /Contents 205 0 R /Resources 203 0 R /MediaBox [0 0 595.276 841.89] /Parent 202 0 R >> endobj 203 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 208 0 obj << /Length 2710 /Filter /FlateDecode >> stream xÚ˝Z[o۸~ĎŻđŁÜ­XŢ%ő-›dŃôäv§čA·Ş­¤ŰGVŇÍżßŢDG¶ FQ V(rô‘óqřÍHŽ>ü• Rh1Ý ω Ĺ Ë(És=Mľ%r2™"ý¬†©29Ľ˛ätř}ôůŕdtŔţ±AA™ĘH!Ô`üpđ˙oßé`r@ź(E>ř×”°˘<H.ÜőěŕćŕżÁF FŇČĘźú€ř.ŐĘ`»D,ik4pąHľ •”łÇę#„ŃY4=ÁIžđ(üm:oľŰNŃś0šą.‡hTd:ň"iĚÓî«Ú6ÖŐźkWćŰk:ż·s{×lqgŰšźmŰÝbĚCž'żpü§qď€3g¤Pj2E iýMYÖť ˝°ŘoŻ.®^úHPI¤Śf„ńW8J&ňÍ®ň¶ŇČőWHŔ=U°đ@vŇAĹ‘˛Ř*g«ÓDĺŮŞ›ŰŁŁ“››.4ŃŚ»5ý8LĄćv'H ^Sž%U]6Sđ¶ą9^<,gUSMĐâ Ľ@×Y˘•ŐăxŚî®V†:wŹČ‚Ůó0— éú>µW{ó˝Î [j/®ommőĽëŇëř}@ň~ďäÜA:˝řrxvzܦÉy¶`ÎT/0ĄáRĹŔ>^źťtŮČČ#6 MŤ.¤h–ŕe9ź ˇ\ Ć”•˝Äp´h,-U°^bŤ—Ą QOCĄ!‚N'öĎ1TSC´2 –ó m(‹ź»‹Ăl$V°Bî‰Ĺ­±í4v}úyĽTČ}¨<“#T»¨ĽlË}Ř<™#l·×g*tÁ•-˘ŁD€Öţ7ć|\ĚońČťuŚ)eća{OďŠódd‡ `¦ă<ŔgLŻqţŮčďÁ a¤(öÄŢÖŘvöş>ýěÝŞŔŢ>Tž˝Ş]ěݶŔŢ>lž˝¶ĂŁŃéĺĹîX¬ňd„4Ĺ`ŞHʱUxÓ·íŠĂ-'ŮďŞPDÉ=ĹŇČŘV6ú>˝lÜ *ĎĆ^TŽŤ1ŞlÜ 6ĎĆ^lŽŤ1¶ă“/§G;•Á†p*‚Ś=®žnŹ\]NCĚf VŰ8*Šó@V-HвşG3L|^ô„ňĂŠÝßÁdť-ó=1ą5¶ťÉ®O?“÷*0ą•gr„j“÷-0ą›gr„íęđúđĽCA® S=DV„r/nŞú -l\Ť†‚'Ď Oá§ęŘŐ ¶÷~“Y.T©#|Ć ĄĹZtnĚÓ ¦wMA2Á¶?&Nĺ« ¤ŤÁT*s•,ę®I΢Ÿ®VË‹…™ý¤Ú¤ňbmc++đ"$ŕľěHëâßěńú7S<#Y±ŻÍÝŰľą]źţÍ˝Tas÷ˇň›;Buy;şü«L "@9ՏL2`vŚěüäüňú;%:9ťŻzě+`ľ”–cr‰=j[(Y`ť¤Űz›%l!IöbľV˙LW.)mPgŮK_”q7‚BĂĘÜz 'p9Ţg)+8)`Ž)‡'Ň̆/ 7e]>€ÝzµłÜři>éƤ‚Ȱ+m}µĐ/“xh1ŐĂBp×°ž”Ăťh_šuĂ6łj•1dk’±…ŇĹ8ú"¸­-A4™ÔaŤ{q»)ąŰ01Ąń±İx8r˝: ĎöUćU.OSëôť¨t8`ÄčyY˝W3„µ{†'á*ć‰kmK¶®Á®gÝŐ4»ÖÉč­‹]`|Ąćľ,qŢĺyHă Ξ±Ó{“AÔ•‹ÉČsń€Î´ôÉ7™./3ŘěÚgË·g]˙qJŠp°lš%×”¨,ß@‡W®ůńĺąÓŠ C]ł ¸Ăí¤ʎÇݢîŇĂ%VŻćŞ='Ż˘„V\Ll4ăLJ¨ĘoďZhZµu}­“ö­€Ű•ó•»Ó,ş˝wlÄTɢM+Í"ąAőţ{]šę±X6.<Â-XżŔ)č7igúXňÎĆ~ʸśÍ<畱?i©j¦„N łvÂG7dĂ["IF.x÷`’á`â&|jÄţąáEQdČJ,ä¦hdŢdÁI_„g™YA¶ý¨MéůëqAAn¦­1“+i%¶Z3c)XłWľű†i˛<',‹ĘÔżÂy‚X —/ ÁłđäëŐĺő0ç@›ÎT3…ŢŻĐ łĆMÚŔŰJ#cđě–kb|7W'G(S3ó^-K'‹hřDgA.çË8ČP5ŁhĆ×d'˙¸}żö4[ŇŹú›* ۇĸŔßĚŘ9šM«ö©ńâH Ś€${‹ămő/ŽŔé/Î'Řxě#n ďťĐ„çyŕgśąĚnć°oA `ÄĎ5ĆP×ϲ~g˙ôÇ3,×Ůű°± Âuk!k-dëđOź_ŮÓndŽI'—¶TTAô9.±KĄ·‹îťm±g"ä6 ,ąÁÜ×s4qÖQ¸ZĂr‰‡$I2ţ&Gy[id¬ë(źâĘđDs¨»sËĆSŕÓ;T«0—O& â\'Uíü' ˝ÄĽăĹbéB$§Řűëyw–9¦!Ů€hfŠ˝m–ÎVŰ0ËnB¶ë;mś%Lëťnéĺ&é˝ůÚ!;1±ŐŹ’Âs2XU€oŰoÎTÚÚÚ°Ý űÓąöĎŰ:˝wöµ?ĐŇđ&—1¬~6Rv¸M¸aܤ˛ b{9MM(äQÉ ąµ–Úq;+ěŻ(ß~Š2ŕ†ÎŮĆĎ-†”*ţjĘ}0FĄěă±­bś@“Čńw 4΀V0deKáĄýyŔ%^­ĘűĘţmÄüŽ–sßćş®Łmđň©¬Q\”?f®aę>˙z™®"™ľ–Ńĺ”hÎ1@Č^5µ¸ŘCÁ;T‡™Ya[K+·żů±ŠŃÍPBĘ3”‚ş€h={+ qĹK[{©§ĺ— bătn-řî.)iĂ4hĆLdöµđÔÁ™®ĂZ=Ď}…ËÍ#N ¶ÚhĐĹŁ“z(ŁŻXJ—f· ąrM]É|"ă·Pcrw÷5ÍăĐç÷ÓY÷«đĆ$d<Â&Â{Ö§é8ł ?˛üĽXžĐ,BIµ!´9Eľš6Ó§ˇËő yPăj_Ź5‚|<Ťuvkűî]˘ŃĂ«Ô|´hść6Y:Ĺ"i®í0;+?z«!ö^[˘€aăŇzNKÁx›Y‹¶0kŕע•î“j5öYôtŮŕŽđKkÚËy›*fŢíZa•_'”ýVęj…©:Ú,ÔµM¸ÄzŔ˝Ď¬ŕŻ_C»ýĂm{sŽ%,SŔ>S`ą {K)źBB0YÚ›¦ĆżÇ—G`ű^†9źH·fůńĂĚ 1t-—63…ç/ëqu·ŔڏľŻČĽj6ÔóÉd„ş7XźÍOĎÖ ň˝ýĺ”j­ ö€ĘĽ7ţk].|endstream endobj 207 0 obj << /Type /Page /Contents 208 0 R /Resources 206 0 R /MediaBox [0 0 595.276 841.89] /Parent 202 0 R >> endobj 206 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 211 0 obj << /Length 2589 /Filter /FlateDecode >> stream xÚ˝Z[o۸~ĎŻđŁÜ­Xń*±oŢ$EÓ“ŰIśbş}ĐÚJb¬c{m%Ýüű3Ă›éH‘T(Ä2E ?Î|~Ců÷ńÁ‡OĹ@­ř`|; ¬ <Ó<ĎHQ¨Áxú-Ă”Š\ód|_ SÎE2şŇädř}üĺŕx|@üŃι̉ćr0y8řçŕŰ÷l0=Č_2Âu1řסZăîz~p}đß`##idĺwÄ}@„q’)i°]"šÔŹk´pOľµLĘůcőÂÓy4=ÎH‘k ţ6[Ôßm§ČĽ 4Ë]—ĺ<™-†L'µí®ZŰĆuµÂqMăĆü·˝f‹;Űaą°·ŃgË[ŰVßoŰn—sř2_Y‘üŔçg8Ť;śŠ8%ZĘAJ%Ń ű3Łys‚öÂbżą<ż|#ž "$äYN({C 8ˇĽh•·•FĆlĽ"@îIMĂ€츊r"„ՍŠ*"‹|ŐőÍááńőu“Š(ĘśO?Sˇ] BA„WĂ”ĺIµ.ëDŰÜś,V󪮦h q¦1t6„heó8™`¸«ŤˇÎí#˛`ţ<,DBš±OíUo±Wą&°¤z ýÖÖ«‘w]:ß$÷.H.줓óŻŁÓ“Ł0ÉIÁň^€9SťŔ¤‚Kű<:?:=n˛‘^Dlä*6ş”˘h‚—ĺbŠ„r-S6öÓѲ¶´¤™ń^–6E= Ą‚ :›ÚŻ 6$¨z ŮĘ4XÎ/]N´©,w‡i$–ŕ.zbńÖŘë4v}şyÜŞ@ä.TžÉŞ}Tî[ŕr6OćŰÍŐiĘŔĄi ˛ĄB´ŐPĘďĂ“ÚěŹËĹ nąó†1)Ͱövaó썰ŤÇ'çűs±,’1Ň“!rKť”« đ¦oŰ—‡·ś¤żBH-‰=ĺŇČŘ«lô}:ŮŘ *ĎĆNTŽŤ1Ş=lě›gc'6ÇĆŰŃńדýʠ%ťň cŹŞ§›# W“Ół)¨Őm@ĹE «â$hYŐˇ¦ľ.zBůaĹîŻ`˛Ę‰EOLŢ{ťÉ®O7“ű@Ü…Ę39BµŹÉ}` LîÂć™a»]ŤÎdŠPŮAdI2ćeĂuµ~Âd‹›Tă!gÉ3ČSř¨v…%äž{ßf–qäFęź3’ez';×f4Čé AŁIÎéë#ŔÄ3ńfAec0•ŠB&ËuÓ$Ł‘3®ŞÍę|if?­ÚRˇw¶´ /‚@î‹N´+ţÍ_˙˘mŠĺ$×}-î­±×·ëÓ˝¸ű@w*ż¸#T7ă‹O d‚ĘądÎV72Č€Ů1˛łăł‹«˙í•LŚ«äd±yf¨‰?óGi—ŘcmJ–xN˛žŘó6KX-{1_«gW”Ö¨łěĄ?”q7‚BĂ“ąÝ3śŔĺxťĄT3˘aŽ)łÜ¦/L7ĺş|»ëÍŢăĆĎ‹i3'i"ÂŞ´ç«Z˝,âˇĹśj Ŕ]ĂnQw˘uiü†mĆk•1dĎ$c ĄËqŮ‹ä¶ă‚h2©Ă÷qŰVܵL ’Gibě18źÜ=…±ý)ó&$—§™ ú^T*l đÄřyU˝W=ß=ĂHčĹ"q­Ű#[×`ýąnjš}~2zë|Rs_•8ďňÁ RűgĎŘŮť© Ö•ËÉČsń€Á´ôçÉ_n2M^ć°Ř•Ż–ĎoN›ńcŃaci›%S‘y±3ÍĎU9­Öoń9•ÉŃĹ™˝ÚU P'ŹŃ1ş˝{»\Ű‹ppNUr —8×ŃĄ˝yďÓF”§Ý•R¨áěŮlÓB÷‡ŇF>ř+oó—„ Őé.AđymÖrÔß ĐuułŰ7 ˙`®›A„Ű|ŹoiŠŤń]_b…›WšyR;Ý®Łç $*Š|µX]†Ŕ‚ë|C9ÚŔ˙çĹÄ-ţť1l Ô?üg&łaŞ e(~2cîp>«¶Ç>‚Rj4Ý‹ŹĽ­n  S¦čŽŹ>òśWţx¨śˇ§)ˇŚz!%Ë(3Ó˘Y†z cBmš$$Uâ}ą~–5ě©Rď'xčmA@ť­Ľ°ŮŘÚ«Ăł–‡ŢŰ…ďŔ©’Ácö2§fÁ*ŐěäĽÍÄMCUÉ"”đ•:ĄC­ŢţěÉgď´Qv ÂŁ@9h,4&tŢTşµŐŚ/´Q⮏‘Yn7łYř“Â.oŁ?ßŰ Â~ΰŚ‚Î*7ül°2ÜÄ$Ô÷á Ŕ˙)V:[id¬…•™$9ĎĂđf•ÇĹĄĄ‘šaë^`Ä ď»Ą’’¬ŕm1çLAIŹ#.çé;Űrh=·ü{VŮXąôĄ`R$(JŠ?‘^łÖRűÜŢÄŹýeĆ^ß‘h°Ö_Ťp’3@" Ë ź×PďűÔfĎbF›mVŰůő\z•˛'6ö<ż´¸ůn6ĺ]eż›]>'÷ĺÂ·ą®›ÚĽ|*׸K—Í]ĂĚý†%ęj IÍŠĆĆ»j‚@BĺYo2âĂŕSäÉw‹bcˇ„RQâY©‹ß'Űç~ÜWn`Đ!ND@B‚ÂÇ]›ľ/ßbäÖ¦+«ŰJf—3,PIßäőťź"ÁęĚdđşU ĚŮU†>ÂŹ÷# ă}l@ďă§Ml¦’ö·đt6K—µŐLfaϸ0ŁÎ Űv|Č çK@ějK@<ťË5†%{c+î—ú‹Îđő‘RüĚŹ¤¬ťtkČ2^đ8„Ć+˘`1mN˛¬şöĄ&~XcŢ…`‹äÇ…ŰöćŹELť‰}fČĽ ZFµ×|eošş>Ź.Ăößü.âb `îŃCőę㇨ŚaäÉje7Śż|\OŞŰ%*ýő]EUÝrFLI)“Ě˝ůb~Dă*9ńŢ~2Řš‡i!ąJdáŁń’nĚ+endstream endobj 210 0 obj << /Type /Page /Contents 211 0 R /Resources 209 0 R /MediaBox [0 0 595.276 841.89] /Parent 202 0 R >> endobj 209 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 214 0 obj << /Length 2116 /Filter /FlateDecode >> stream xÚ˝YIsŰ8ľëWđHUŹ,Hä¦öRí”·±ĺTMĄs`(ÚQE5Zśńżź÷°P )QînVĘCŔĂăŕ{đűdđá<‹4ŃJD“ÇńŚŞŁ4Ą$ËT4™~‰“á%©ńä{9 ‘ÄăŰ!‹/†_'źg“‹(ü±HÓ(•)ŃBFĹóŕż/_i4ĐčÓ€ˇłč'´)aZGĎ„ מî˙®uŚ@É(Đňű|ř .UŇ@ˇŁDň¸„q>Póoy1äYüĂüü^.lkóFKl‹¸ZG<Ĺ_,^Awľ™UNl?×VިžQ`‰ZËŤ&ĂQFi|_–¸öç°gš¤Ve€=,0oy_.¦ăbsńfRc5„'ŇMy¬VřafWS=?›O.p5›*Ô.ˇZĎ6ł1˘śѰ×#Ć–v“Vĺf V0SŇ4~J›µ-×nIZ)f‰g~xř#۲‡ßÇŮ‹Älh?gżSvřěťL÷Ů÷Ş>ű.TţěTןǗ§-lRڧý`sşş±IMŮŔöÇřúô˛íC#" h)Z:ç˘XŚÍ|15I“íq)6Ń1UËOF%lšh4·ÎĘ%ł©ýYTÖAŻŔo™—ť8ďhťZřÝ_Af §Iűrd;e‡ÉědşÉÜŞšĚ]¨<™TÇČܶšĚ]Ř<™lw—-&”f5“[‘?%<őÉÂ.‡ŔŘ;o)“ Iëđ=[Ű=÷EĹbä8ŮV*<çmuő†ě€ôĐW¦Q€·úĘŇ×ËtŇ·Tžľť¨}CTGčŰ 6OßNlŽľ!¶ÓłĎ'G}q‹Á¨Ŕ3ř´|y8ę^·©ËI’É€ş2SH]ËX;%xĂK[ż Ľ•¶ćöÔť–/łâW8_))I!7ꇽ;e‡ŮëdşŮŰŞš˝]¨<{TÇŘ۶š˝]Ř<{l·ă»ńU‹v\AÁć·PDť!›|©‚w3-J MTęÉz>Ô*޶ŻU¸ ©ŤşuâˇTÚ­Ä#ˇŤÄů|ţ óŠbůĆŰů[LdL*˝ÁěĆdŕ0Tí̸„8âÁÜ—>^f8µ('CÁăWČfŕ_ŮZ…b`yľhü׾Ę4S$; Ł ŞV Ë§;E¶FÜä4Ż#ž]Ţá'ä|·ÉíŞ—Ę2'pýpŮŽŔ®˘¶űü(!{ô*S¬'ϱSvŘs8™nĎŃŞÚstˇňž#@uĚsô­ö]ŘĽç°í.™şk™Ĺ¤+z´w!5­-ŤqĐ÷«?vöĎ~EEśd$U?l ”dŁ—édc/¨<;Q96†¨n&7ç-d‰ zAćtu#K°tHȮήnîţs”‹\¨řb±Ţ3Tá/×Â[F#±˛W0•ąF/Ü­ąˇĄNΚůVůżŮÚUąxIY٦żîq5őńŇŻy;tŕ^SĂÚ`Ť#_tyć-¤|•?ŢŐúčMć‹i;jiČ&˝€}0‚ ýćVzĚŤ–ć~Ţt4«| Ş|łoŘçŢP‘˝î 5ä…-łš·űo¶ XĚČa ĄÇĆkě+÷, âh^‡IüÍMˇŮĽx…oűgłuý℉˛}}y*HpĆäuYľ×3–W|‚2O$®wwě:ě~‚rźĎ”G©]9q} Śżúµ/ÍsPnžÔ]î‚ۍΞŚk^•®”@®Ć3ţÖŇ_ÄßÜbÚĽLÁŘŐ_N6«äŠ(şöĐá{Î•Š±ĽşąÂ¶Ś§îijű\?ea·yăÆOrq^ŢĚ$Ípe‡Ľ!ă<›a:- ·4ŔÔűśżr°VĎůöČroq9Uř2K‚ k0cŕE”´ť<ăŘä‡ütĆć‡5~óRSý0ď5S;`věBŮô‚bŽvč¬tďÓîúťűsRU?fĺß٢”Ů5¦öNóMnű ü|ă~8áo~<`Fk;wÚÔh,ÁSxÓZ»Ý=Źă>Řçq˙ŇôfŁIë}"'XÔDĘäź<ń[=Łť"€e„±Ź™ J•đ(Ń&m±V†čž—…D‡ňä¬ń×ϡ ČĽzŘ.0§‚2XZšVM)ăşÚś/í q’đ˙ôćä7ě˙ÍoŁ;lóŮ´Y~üđíľ\,—&ĆGé-DôÇ őT’EąŮSű2¨ŽłHšŘDň“y‹yµ‡‘¸"ŤSކŁLB µ?Ť˙F=źŔendstream endobj 213 0 obj << /Type /Page /Contents 214 0 R /Resources 212 0 R /MediaBox [0 0 595.276 841.89] /Parent 202 0 R >> endobj 212 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 217 0 obj << /Length 2540 /Filter /FlateDecode >> stream xÚ˝Z[SŰČ~çWčQĘF“ąK“7/ZRÜÔžĘÉc PĹH>¶äßo÷\dŮbwŁJĄ*’ćŇóőô×—óűřŕ݇<2ÄhŤo#Ćs"¨‰˛Ś’<×Ńxö9–IĘdfD<ľ/’TŹ.ź$_ĆŽÇ,˘đŹE†F™Ę*š>ü˙ŕóÍhôń€aňčŢ)aĆD’ ˙>?¸>řO#F©ŕDeyW„lDp‰"©Ôţs[J PŇŚ+"T†‚~G-Yĺ ¦vjJ…!VK:)˘_jĹ'†ćQK\?.ˇ QF°”SIrÁ÷Jłs)Hsoař5§Dqըɡ‡Ł”Ő“fšGĺ$—Ě*züçĺĹU’óxÜU¬*†ŃŻZQĹřN;¦AVÚ¶źfDę| ßőĺń!ĐŚgqY%đ˙a‚ůLkŘDgŔ ;áfQ-®‹j6š®Á„e ˙UÇßG«ř2uł·WUšHég˙Ź* Ë1źśăS[y‡ó˛Ř¬ŢŢ$©QČť6)Čęß$ „˘šmmŇ“j6/[”ć9‘H)F÷˝Őě-8­ W˙Jčť&ŠŮ'¤‰ďŔPÄ2Q<ž¬ËęΚÖ&ě ó'’Ě©‹bTî¦OćŔăb_í÷ô›ë}ľGř¶¶UĽÔ »ŕŇŽĂ@îšĘŞ%˛~XXěN%â·­µű)—Ôúu* HöOMĐ./…$,—Ťp, BCHNQUÉÂJ±ĆŔt¤Ú˝B*Č!ŕ¬Đ;q“Ń,…{}J ^Řt±± ŽDËHfšÎŢ:©łŽ„ Ö)–“µMu<°—ŔF$±éd>˙š MĐażąFg|[ß{0ŁöůׄulŮ⇕+/Í&k°M±٤Ú`"-şÖá@jôOşß.3äĆVˇnĘmmŁT{ŃoŘ鵇ŕ9ŕµÝą2„n.H&·8».źp621ń˛X?â"Č@zÎ:h–GghĐOŮó…Ű!f™q5X{UľĆő‰ąt𓜱ťR®ĄôepFáÖi[­—Ź ľi˛ZŐšmDúXꑝÄçdzŮÁfŮf˙é•n.Ď/;Ą8ôce(i[+˙N.c"ßSŠ{YiK ±-HŚI˘ó¬YĐf–‹óńŐĹi÷Řy6 6/«”ÉT«-lŁĂńÉĹy¤Yš©a yYýĐ $4&^lŰŮĺéńř¸ăvR¦Cđ+ˇŁ%čÝŕË`–Č2<2ÂNą”ĺÉŹě®#?%É˙XĽďŇŤÁ‘:ĎŚ_řsY­żt°‰ś@îńCF(TXá&vĚľDb—ĹbŮöS‹Fa łęĘ»śę[×Ö¸´ÝÖčŁóµ~ţSÝyଝ°ť“K‘ţ´Ć˛®‚î…îő&5Ś„â2+ɡ űZYiKX‡Ҹ2¬YĐž»;¨”#ŕ— ň˛úQ1MřxŐőÍááńőu—šh˛Ę{ýš»ű( šôµôevN}®šąś_µ•VŹS—d]rżĹ :ź˙H ę’®íS÷6śíĄ &ϲýFŘ~Űű1ý¶Ucű>TÁö-T'çźF§'Gl * ž ÍËęǦ4ĽŞ-lŚÎŹN»!T0YuCKˇiS6Íb|ťT3d–o ĺ®v•f˝ö5śUĄ[‰xâbÔBi9sźÓÚĹç%„-ŰŕK ]LkŻű+Č Ö¤†D捰ýdöcúÉ<ކĚ}¨™[¨^#óŘ2÷a dna»ą:í…ц5Lî$ţŚđ,Ô ›RţSďĽ#LI’5ŮŰž đTYągY…s [™Řćü ˛Ň×čËŕ/ϡÜ0zţ¶„íĺoÓËßAPţö˘ňümŁz…ż` üíĹćůŰĆvtüéäđŐ`ܡpN4 ¶÷µ Ţßu¸Ë‰ĚU‹»*×Č]GY ;§ŰGoĽ›Ó^ŕî¬x*§ż"úr ŰNŮ@ěÝŰĎ^?¦ź˝C jŘۇ*°·…ę5ö­ao¶Ŕ޶ËŃŐč¬C;® SíQxU®›[e—ŇÂť˛~HŚŽ»×+xbÚŚFŮUSyh'íNĺ!éVĺźÝ %hĽĹűŤŞąŹŔňĆ–ŕĐUď̸‚DŔ\?žJś:-Ɖŕö§x-4Ď ‡Ć·»N¦ą&9ŰľĂLŐÉt9át#ČťwA…q†7)Ď©·?ĺ ˘8ßlr÷ÔK eá’ëüć´›‚ý‰ÚŤŘ7ŔjČÄkJ5PähdínHÜR6z …¨±ôZĐX3z€…±¶ą\ę?|¨<#M1b”öNÝ€ł¶®Ú}ŰkŹŤßł_qf†ĄbaKŘ^†1˝<U b/*ĎÄ6Ş‹›ńŇ28Ź ­‡Aćeő#“€ J¦6˛łăł‹«˙ľĘE.t|R­şą”nß.ÚKw÷RŰkó©»Âs´4ŽŢŰuVń˝\ůă­˙ýEŘßýÝ=Źďh¨Ź—}Ű×BžË["›˙BFÉ˙WB©—“ną˝TŞÁ¬3h˘%ʤ± D}ě=Aét·”ńbr~ĆŻçDŘ šn×i*f~Ś»×Wrsˇ UhS0Ě®ÓŢzÂóčâđ7l˙-ülëÍ`îqK׋÷ďŢÍpci<],ěŽáúő#ç¶Ć2wyWŞXď(_ŕ,éMꯝ?Úű´.żJźg9Ą:Is¶×4Xă/YMtľendstream endobj 216 0 obj << /Type /Page /Contents 217 0 R /Resources 215 0 R /MediaBox [0 0 595.276 841.89] /Parent 202 0 R >> endobj 215 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 220 0 obj << /Length 1973 /Filter /FlateDecode >> stream xÚÝYKSŰHľűWč(o˘ÉĽĄÉ- ¤B*6ŔVŞ˛9[€ Űrd’żÝ=#!,˛—UÖűşgI˘ŽV3:gđaG> łgeĺ5F­µń4PWH4ćŔdă¦U‘'Z9Ř#`yËÝ}z™ĺţä[{Ą›ěĄ ÚŢk.ͤ–bŇúMŽlŁ€ţPoN}^†“«Š+Nx“í1Qfiş!·°˝´6ŢAű}Ć6˙ĆöMîŔa˛;6-p]żxbó0]ú)źŠ × pDô­§p¤rkŤÇŐűŐę˘:”Á›“K“y™Ť‹s”’ÇŁ|:=Ĺpˇ3\úą3XÍ™nT†©fy_Ôń‰÷жĽÄ_ Nś¸ľ(î´BpŽ2ŹDĚ1† © ĎSXP-đJ,·´Ď»˛ĽśO1Q*ĽŽ©„dŇçuîÇIüĽť@Üü*HaKżv|›#eSlaó)j–lÍS<Ž Źí@VôńŇ74Ű€Śâ gÖGÎŮ€4ŕ‚ŮA7u7‚#"Ť2°ĄőEòv/, ˛ë ­™Ŷ–JŮ”ew‰e<łó—w2ŁĄůV Ţ ˘v†)\­Š.jüt’Iž.Bw݆ ţRd¸XSŘĂmÔaýtµôĚżěAăi)^Ţ}¦Úi@…wa< ¶Oť÷Â}@wË^ ˇ§jć´Gn™źŽÇ»_Á‡_†@Öž¤hŚH€…F> T%s©› j`•tx˝]‡Ó)x¶uívŤ<ďľëFR˛‰ę®ŢâV29Y`.\ĽÁŤŠE}´:]bv¬& pDÄŠŐ)Ó ąá~ă˝}ź÷N0­ÍńbĽ5{)ç@ ­á>ŕŇgŮ+°J:ĽÖíĄąd)Ú+˘ÉQíń4$ęÔ{IŮ*Iˇć;}ËJ^1ĺSi‚Śu3 Ů‘ňfő—µ÷v^n¨Źe„w«úón˙ ÷Ýôĺ†ýh¶űT®»†Ľź¤7·†ż_TMňSŞ„´Ó}‚żö< BŰhř8ŔöyĺY%^ëĄgéÚí(áü‘!Ŕ8m¬¶<‰č$–w.}y7\<2"Ąî^I-ăB‡„káŔ0@A¸+­÷kŢĄ—ŘďĹf)€XT “«/8Hwl,áşôÍr&ôj´B—«Hš9ľ´1jTP@x˘¤ń·2ń·2(®HN§SÁôů/ř 9 Ň!2í; ŕpY„‹&íÎz©Ě€opÝއaĺźň‘BËŘjčŇ –q> endobj 218 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 224 0 obj << /Length 2068 /Filter /FlateDecode >> stream xÚÍYßsŰ6 ~÷_ˇGy«Xţ¦¸·µé®é­M·¸»Ýµ{pl%ÖŐ–=[NÓ˙~I)’%»Iěn»ÜE”D~řż ž˙’F–X-˘ŃuÄxJµ‘1”¤©ŽFÓŹ±&L+âŃ,&BČřç÷Cź˙˝Ľ XDáŹE–FFb…Š&‹ÁߏŃh: Ń›%¦ŃS¬ŤÉEĎ—ßj IR^ ~0÷^A«Q‘á‚P­ś~V¨łz·,sĐ4ľţŠŠµ¬Ň‚pmaśţ‰*Šfřüť7çĂ ľ/đßY†na”O˛]ű`ŞÓ¸Zű›FrbSŰof%+i{±łBÂRÓ˛őő¸‚vóě(J) 6x‚Š/Ń•ŐSnâ<ŻđOβŰółgh¬- ·"J#VyůŹw™­o],Ŕ¤3xÉô‰2Đ?†©€[xönĽŔ©ŮIľ˾ŕ.ăń|×y1äiýuP!GWólăB‡ůŕj†¤H‰¦Úé¦(;’\6bŔ„ÜdĹÖ’ÇKü`;t†H JţšÝfEé§LfcśTÜd~(ďf Xůer2T`A‰ÓŃpS"ŚËĄż:9óa˘(ţÇ'đAС(×őŘ˝ń Ą-ó˘ÜřÉÔój3q~şÂ—ţ›öě–[QĄ¸"^ś¤ńşÄ'Ű9l6<6ŕ‡ő­{äd‘ÎAfÔĄ+ŻPMóő­•÷»`&:^c©¦üë8óóćk1é:]ZJ6’ÇA†tüšĺÉJVҶëJÉ-Ń’×ëµÁfľĽv˝…oŤ4xFËC´rŇXC(jć` »^VŇÖńĄ„Šzą@WB= ÄSŚÖBUcNcTCŘŁŞ¨á/صŘx\ʵW6<Şé˙!Ăú ‹[ÜůeŽQńö—ž•/áÉç<;ÔőHTş¦˘ŕü‡˛Ď\ Ó•¬¤!¬ŠiˇšŇŹ}xńb nslAŇS@o> endobj 222 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 227 0 obj << /Length 2202 /Filter /FlateDecode >> stream xÚÝYËră¶Ýë+¸¤&C ŢŹě敊g1ă\Ë·¦*ÉB–h›˝.EŰ5źn¤H‘ň#ôâVĘU&Hh qN7ôa6y÷‹MqZ$łë„qKu‰1”X«“Ůň÷TN3&Ťéě6źfBČôýů”ĄgÓ?g_&źg–Přc‰Ł‰Q†8ˇ’ĹzňżÉďŇd9ˇÉ— %ÂŮäĘ”0ç’őDrË«ÉĹä·#¬…ňçmtŠ•.ŐĘĎďr·éě.î®öđ\ŔlÓ ®`Â,ÍqŞ;Ť#Ćŕ đU éŮ×`ŕĺ6řďăŞČ7SnÓęŘ\!-ˇ†7SyŇfNśuĂV×XY ěĂŃÖĹ ŞcůŻóÍ渊Űň+®Ăň-NŃZ&cÄ©ĐÎË7áËůĽ]­p-}C¬Ěëĺ˝,Wa$z4Ć·ËYč^„u‹`łbíű~ľwŐPצcÜĐŢ‚sG,5‰¶†đqË‘˛Ş·Ř‚ăT gwqö)Ěî ¸Şďlľ‚±ŕemoç#`ĐLEŮËܕˎżZŘÍŕŻĺTa#ĹÓ›b_ĺ%LDHžÎńű¨pw+ßj» u;˙RlŞč.¬~8ĺŐZ‚”›cs”÷č]\§ů=„č.đęËŰŞř2é[Ϋb»Ů‡ĘkʞĹ&ëđeľŮVއňr`ë—ů}†#˝Ł* ě•‹¦ŔĐü_ýŕÔčÔđ°Q\:ĎÇP „čhÂŔa(öp,ýü^Îżýgjáźf6ŃBĘě¨Cˇ˛Öń©aÔC»f8nP+>ěPB˙ 0جăĎ8'ﱌµ?6‹žß0F‰çĹń` íIWŚ#ť•µŔz´c1R5ă=‹äŐk|Q7|śäugŚz;»Ź€Ő°6<Îďŕë ŚWŔąĚ™‘‚°˛X_P9aB6ăá™Z™ŢáôÎ@ýlźâ˘KN¨z‰˛Ţă*m ÜĹ7a?5ⷿСăĆžPK”}©~ôĎE[Ks`@üxeČËkh˝-×8mćtZÝćÁŘşq{ű÷sÜiˇˇGěŤlďů?|žďű†€g;Ř:B5iŢN!TâéŐ]4¦€y\÷$™¬ĐK&exZ¬ámíĺmYĚ«|őżĂŚáŚůAĘ@5á±Ú‡Ę(\ˇÁAA|,pô*Ż%†Av]\^—›‹¨.ĘOH„ś„^ă4R Â!¤§Q9޶#VÖëѶք ׌7":%DBŤ#Ŕ¦áHŁ,ŠXY ¬źlh˘ąmĆ‘n(ü\śô…6Ă‚ë9i:Yňĺö>‡Á­P°°ż» Ä—Ĺ>íĺ…1Ěwµ t{žóđč§(şť˘ř6סr*cÇ}^ŢÓ:5`Ľ]µo´˝Ű#Óţäą÷qN0żfđeäUŻÚˇŚ­öĹćfŕś ĚżeOÁâ:ÔŐˇ\tTmpÍÁ?(«Ĺx[ŚË‰UćůÂů„řS85B5lߏš‰µę 1ŕÔ˛Ôč`¸]Ö‘, ÉÂČŚň×aŮÖIšŤM^#E8[ď÷) W@#éÖ 9&P'äČ(9be-°99MxPÝdDJrŠnµ$Gđ„>ňf'be-°ľ€ŔN2ŃŚ÷(ÝĹüúEVyRׯdŐě¤U±I+›A÷ţ?Éf Ż5Ę=S Z‡¨CaŇřĽmP¦ÇmŁ@A´1-yš˛JoBŞ”6şnÚS)¬k©¶é\tőĺ,5Dzĺż+Őü¬QX=ł{™:¤Řočđy·ĎrňAÍâxľĹ¤ Ď”ŹÉ”¬yž*ŞŞíóźţđÎ`‡¤ŹYH/oÂEd“v‚ĺ™ŐĆŻ¶¶­T‹¦«&ĎňÓ‰píŮ<Üz¬©÷ˇě!ŰĂĚ©Î´Ž“\h÷ĽäŠIMS#˛+δJŤřµ…KX\:@-˛ˇ.=µ€ćI_~piyZa&±`€š%Ż+Č;¬*ü±’+ŕ0jź?/©§‚~pb:€Aj˘®N‚ů®ŔB)´fCVZ_u0’Ó¤v ĹÎ,búü݇,| dÁ¨ &«[?Éí|€źY"VÖźfDjŰ™ßĹąŹY¸ń1‹©cćZý`G´iŔî=ý…ż¨ŰUPF6đdGrëOA8„ťŃK0z;n‘@Vgó5”ü^ăçÇ«%aKşĐ+¬VŤőřjIđ+ŞYgµ0fYĹK-‡*ÄŇĄX˝Y"˝(­˝üTŰÍľŠEm:Ç›¤7 ÷:Âuč vź}Âîxu_/ж†đĹÇ!.@"<†‘1Ä˨Đ]Vw‡ľ(»u ‡|ńżč¨óňë<Üoe¨ď`ź±Í|µ."ö‡ŻáT]iš~Íč -cśúiaMËÝŽf±€@·hd1żZĺ{čŞ8ó=9ôD'éąDŚÎpŘ>‘Łç+k ¸„HŇĘfÄ:Śž€lTwsŕřĚĚ®›¶ 0 <™fUIŔ˛ĐďIĹöŠňA6$¦TŽůU>!_«Ă­ W‰őgţî@-y"‘ŃĂŞÍnk™÷J)ÓÝü&h­{ Š’ÝT‡ĘM^Ϋ|ŰŐm(Uńw ˇÔá'ŠŐ.Túëx~úöń'üţSíšQ†a2·HpŐîçwď–éÓt±Ă<‹řń·wĺ"żŢNąKË›ślňާăŕ Ä0 +Je¸sú‚‘$†mË·áÉA÷ QB§ZÔnň7„`‡Şendstream endobj 226 0 obj << /Type /Page /Contents 227 0 R /Resources 225 0 R /MediaBox [0 0 595.276 841.89] /Parent 221 0 R >> endobj 225 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 230 0 obj << /Length 3028 /Filter /FlateDecode >> stream xÚµZ[s۶~÷ŻĐ#Ő–q%Ř7'Q§Î4Ž9™žéé#Ń'˛¨R’“ôן],@A"-»‰ÎxĆ„@pńa±——ç×gĎ~±Ł‚FŽ®oF\X&łb”çłÖŚ®ç&jśr•2ąţXŤS)Ur~5ćÉĹřŻëWg“ë3>ĘବŠl”ëśRŹfwgźýůW6šźeŁWg“…}†rĆxQŚîΔľĽ8›žýŢÉHAHIyŽř m;’eF;lďVK€˛:ÉlV­6Óí‡5ÔĚÚzµ©±¶Y"N˘öGYzDĺl¬á üÖ0De“’ëí¶&q ĘU¶c-’ Ű˙˝­Ö˙Árî?©–s/¤Ůú—§9(̶-Čk]_K˙r˝)čĆ7inđ™'¬„ďýkÁ¬(F)ç¬Đ4ôę$”ř™¶É}‰’k¬ŔŢužÜ4-Jj±®ÚűzFĘĽZ"ݦÂrčFŹR™˙Kí’¶Sî Ű‘bE! >ĽbťdeŇŻ(@=ęŐé„*śn±ŕ*Ażô©›l¶cßL€–ˇ\Q˝Wtµ ޢ7QÉŃ'¨ă4ßW2~_a·^ !ťó"ąk“”-(ŞIď"Knŕ‡S=´(é±vŃ}=se6N•,ĽKA‹yEoP@‰ęX-h® mąÁ˘ł>”őŃŤy1§źłr± bűXŻéÇ ¶YÎĽŃr›|v愣őrę =[RôĺţcW»AŻťj˛=ť”ŢrňČ+‡¤wuyu¸ČXÎŐČ茉ǣd h(>Ii'ŠBD dV ßBšĽź\^÷0Ák#ů)0yIÇ0iÉň<‚4}÷|úâíĹŐőĹ›ËCd‚ç ĎS ’Ž  P{;ůýÝdzÝskz/£ѡÍCčyň Ś9ĎsMŽ©w^°]î,X}×kz®ż.ghiŰ6[__âŻ9•o«eŐ‚Űz©®ťwלł Ŧy€k=ä¸b…Rř9äů}aÎjŢ)˝JĘäÄç;řĽüÓ{ŘśŞ1|ąđT/o©&D.L®ŐňĆíÎëˇ…Ë đ,÷$cřP:%~˘ŻÔŽť4ˡXĎ•tšâük?÷®çŤĂ†ýZ™Ľ:ÚV?÷˝žKČJyáUđg˝ÜüŐS“´ŚgąorîSC,-\Âă0Á-U¶ŐŞ EëqˇU§$g$^IA±ân§Źµń9„˛ĺ­ÎăüOŽ ¶ŕý7ăůPXĂÂĂaMfŠ)-GÚ*–}ź§QéNVĎUe–3]đĐť‹l=H\2ĄŠ“@ň˘ŽBâ†i›Ç¦ď^ĽL§}K0Ěpáµů3¸ł”ţ”ą]ßä şşËXřrÖÜ­Ő¦š“ż#îľŢzváxÁÚĺĽĹâëŘŞ„őg=ĄŇéf]Ć…>Ń´ď„=<ďľÍń‰?Şn握 Sˇş¸|ţŰĹË6Č~Vä§ÁćeÇď `$1¶_Ď/_ţ6é›%gŇFf)Mf飊!ĘT:Ćąđ5>ÉaŃĄŁŤĎG™ĄÉŞä˘ńÄEĹŕî;ŠçCXÜŮcĚOaÂĬ+NcÂ;a›°osÜ„OŞ3ác¨‚ G¨3áS`ëLř¶`¶éäíű‹“áĐ*w6,2Ł‚÷2żÚÔń–—UşcSąŘŻ÷ó>í1,×aĺü¬/Ř• §°ŕtŽúôĄ`B…eâŞD¦L ŔIuSµk*oz"żÂ§Ëéáw>ĺđ d‡E×˙=)(k™ĚOäQ‘°=*´9ęQ'A<ę(*ďQ1ŞG<ę$Ř‚GĹć=*Ć6%\ű&®™)řΛ@0,8¦áÉŠ‹Ü5Ř‹Šľ†!ůŕ˝Ëŕ5bß:gÁ:Ý"cÇô‘Ë!Í@qŮlÉăĆ|Šü LĆ”•'˛ćť°‡­Ů·9nͧ@ŐYó1TÁš#TŹYó)°uÖ| [°ćŰŐůŰó×={ŔôńžÔaĺ„6Ř‹â˛`"źĐ-ő˛Ľ«úql`Ň«ńl›ˇ@ÂyůÔž0/ Ü#;U$Ů {8’ř6Ç#É)Pu‘äŞI"ToŢ]żůĄ‡LI&Ť9 2/ë82´´Lí!{=yýćí]* i’‹ĺz –afaĂ%Ţ+w-ZZť»Mëví*§’Ĺý¬X}©Ý ÚŞŰęsŰqí-ú`ă K‹ű¨¬€1¦zĚčlăj,¸D4đĂőŁ»[ż.ű Ö(&tp¸îpě`ÁoVŤÝŽ«Ű­q0´d}©ď#ÖŃpÔë:ěc” ť@]wd˘é¬ u9Ľ<ĹÖýŻ—Ô°'5 ̰V<ć>Í@•|ëArčĚ€–;Z’…“%đ8<—âE ”¦bňÇŐ›·c+’Ă\hĄó®őh“ĆĂáă\’•FÂđΔ±{ř¦W“c 5ĆťpábÖEôťÉĄwŚyµ\ťŹÝ©ŁŰWŔđ‹^áNÝŮf« ľűâ…íČ ·k—y†®3ě^Ă"•` ün‹OfŔßÜ: ćŃźřą„Ő;¬Ď™µ€Ů[*Ô÷éŇËJ#aşf©2Ţőčp($PšgHľ`Ç3ÁÝȰjÖ,‘(ş"ŞúcŮţ@?_ĆĚĘsžěwš —L"13Ľ$âôeF˘.I•ŕR~Đ$Úřăőo=MÂ::+$L“`9đÎďҤ—•FÂ4©3™îzt|±qqk¶˝«ĽUňäŚ|r©ç&ÍjZm`¤FK§"|‰ĆÓ_ÎíŔşô# ˛ŽŹHf}ĹަđŤóÂĹś~đCČĐ? 5Š˘Í·‡-%HXJź=O±˝ÎÄĂQqmşëk;PéÓocMĆQ¤PűÉĽ;|­ý±5˛€»ÉJŮұM3°ăb`ŮE¬oşp‡ĆëET_Â];‚AÝJ˙Ë]KB$ĺ§p‘­ôN'a…šďo¨Ľ|óšÚĚw‰ÝprnŤrşŰX:đ‚ÁËrDCeĽY×IČé¶^ ßvRĂÔ6éž­»č®ń}ĄŹAoÚzy»\•B<.¸ýW·íâůµűÓ›wé~Ť&˛Tď&ë'8˝Ú=Áv~sc˘ Ný»>Ý’Ř˙¨CeůÉÔuŹFI ’ŕ¶@D´úž›¤$'Ý "ÓţŚ Ě0ŁÄHnÇčfŘcsvˇ’UyÎgá×ç±ĚhšýkzIW”ćľ n­şRw9Eë¤Űm]¬č% ~ń#Ö˙¨§W*€ů‘złúůŮł9Z&¤¨ŐĘíp`˙ͶťU7 RŃö¶bËj3°ńËY&!YQR}ĺnHřeśú‰ž"ËĚ8µZšÄ¨0˙ÚÔ#śendstream endobj 229 0 obj << /Type /Page /Contents 230 0 R /Resources 228 0 R /MediaBox [0 0 595.276 841.89] /Parent 221 0 R >> endobj 228 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 233 0 obj << /Length 2799 /Filter /FlateDecode >> stream xÚ˝ZÝsś8÷_1ŹĚnPĐň捝ŠSŰ;©˝ĘćaĚ`‡Ú1ĚăÄ˙ýv«%F3ŕ±ëŽ»r•Ń©őŁŐßŇo×GŻßĄłŚeZήog\¤LFŮ,I"–¦zv˝ü¨yČU’Éŕú{1ĄTÁńĺśgóo׎NŻŹř,‚?>ˢY',“ń,ż?úűčë·h¶<ŠfŽ"&łtöÚăY6»?RBÚöęčęč_=Ť„•ßöđáB˛HÇÚb*%“‹ŹÔX®zŠ4Čt°ź÷¶Ş9ôu4č5Ôîđ“”RÁĂ<ÖÁ˘WĺâfU´ÔŰŐ4¬xŔůJ8|$zb‹ŠZýG4 śňH=ő-=Ű®)+xy×"Q6“DËÖbDčUŢ•µĄ/€ÝŔŁs–Ĺôůíc>Iđ©«ç´´C ¤˝Ä¶ î,nN@ MłĄUMOóŠޯn9‚ţ«e¸ěëw°][Q,S €ŕ. äóÉŻŹ‘@žëîjsÓBOŢ”ë®ÄŢş:…ß?;"çKśŇ iđaH'GĆ!”ł‰Ĺ®•űű]¸ŮłcŐőtßirŔŚüé¦ä€(h î>܇• ~šŃáZu5Â’kÎRLK’Ä|Ě'łrg âş© ľĚłÚo,ŤÄc„,M2ˉŻeŐ}0K¦ŚG‰rl?äHdíčĘ"v6Ĺşqß:Á…Q=ŻęjË+Çź·µ„ąńç#˙Ş; ś+8 dČc ěĎ'äa˙|y~ąo?d¤ŠĺLÇš)Íź7"’q™Ž›G+ô[â’QÂâŚ÷ "°Ó*.™RŮ4¨,­Ă¨¸fqšě şúüöíéŐŐP4Ó\XžľKˇYiĄa‡× DIP4 kFŕe^߯WEW,Ť5 ÁĘ‹,޵)›Ü{a Sk Ńjő8OUŔ†{R‹öžO±ůŕ€bO´ů[bOoľsxó§@Őoţ!Tnó=Tgç_Ž?;`‹%śdl–Öal Ľó±˝?>?ůýt(—śÉÔ“K©#Kk\47kQˇ_ŮžŇú.MžŞîH@yÓ䎄ZŁM{UzŢŔŘą‡ŇŮkkÉüĹžá)$8ŠN&ŕžÖÓňKC‹ďzé=É ďŇs˛;°^ts’»vuúéËŮŰÓq‹*·’+"­śčÜ>8ý(ćvđIZ™M8KÄ®U}8[#Í’XŰŮŻ‡Ô!ĚJń«˘y01· ö))Á„r1Ôza „Ď ¸-š–ÚĚâc,|‡Žî}«Iż–°đžSč#LJ2/(býßű‚XCÂłiTÉ#ö¤.ą1•iTN›˘˛ęäŁzFź&Áćę 6«Q>¶+µ+ă1Óߪ¦&°AŠ1Ř%Č‹ň˘üTh„AČŤUŻ4µ»â™;ń4éĆ6ÎDĆ”Ų̋ײç?ž—ć)„Âű 2„i„yKěia¶c ó¨za>„Ę ł‡ę9až[/̇°9aö°]:ţ8gˇŹ÷âíÓŇĄM(‚+.3&7…ň?ÔóĹ}1´ă “Âe€ŻĆŇĚ’e®v„˙ĽřdQ”ÇŇEîź$§™čýĎIń0˘ľR2ÁSbÄEŤPŠYÜg*Ż@U‚EaqcK;첩×WČÚaŐ@)Ć]lK#ŔH ÷—Ť%©&27’ý©ý$şů˙X•I%YŹŘ“ÁŤ9h&Aĺ,ÂATÖ"ř¨.>__Ľ S’I­§AfiF¦Y¤v}<ýxńéßĎ&:Bęŕ¬j7 :wU“ťş!Žh(ą6»&·Ą8#Ă}ÎąQůµřY¶V‚;*obÓ%ňöZ Ňz¸˝Ľż—ĺ]K’­‹°`+F´Ňĺ\ °N`™:ź-Q˝ŻF"QT_§}˝x/Ýó+NĐçFm38üĘŕŘDh×đŐ|Üz Á8 –Ĺ°Ř¶Ć ÚÚ@Â>gÍEśíćĆđr<ąÄŃĂY6®kŘ/ł­Ŕ†;U\»Á¸Q¦ĽÝeÇ“ÝÂ3¨2ŤńË8’¦&şŞĘż±Öi{öă}ě+—É0˛5,5ŠÔ˛ M{ÜO©C‡#Eíé™aüČV âŔăţ–ŰÍl(:7gf(2eµąŃ´"ŔA˛r§*hFN¬N›Ă©ĆTđż—]_ü§<ŮŮ5ť,ä&×Č÷MäsjµąiĎ^dő`+ĐxŘĂsĂ ë›ÄĆ;Ňä&őęńcőHŻšâ®4DŔ(#ץ;ÝŞ«'¤¦kęŐXpĂFNě@1YŤTUďT…B§ŠJŰź#‡v!ăP!<č\­9U„(%ë×2‡Š Ŕk‘=H^?J_ŽKĆ7j&bĆ­rţ$135bÔ˛ŁG>’CDd^ÔąÓüJł$dBC–Ú*—źć©®‡šŔĤý‚¨ĆĐcQŤŁzÄFđiΔNwđ]]žľE‘JĚ)¸1öfŢ<ŘťôíşZźSP :|űhőĆ_'Q¬?Łú3Š#ÔiŠÎ鉬şîÇy0‘‹tŽ8Z‡9"“„iµĂ÷`aVĹ+4Î˘Ç ć-©q@vqŃüŇ#dlˇŕ°ßĆ"@ Ž"«ž@,=ć'9ęŃáN±!´Ç@n.°ţ/y eŠ1Űů˘?ęZZ-É3 …ćşµž§ŚP2YŹŻ"@5NRĚc‰,ďđ% öžďď1l‹ ěôé?×H%XHÓž58>ŽÄÓ6 Q‰Lo…ĹOLEÂ" z‘aîźzź×tÄÝ+—3jH7be•ˇ-Ş%ňËzüĐpAžŰtřBta· zňď‹ Ă&lW°ŚńYóđÉ•@?–uń‰Îެ®UW]cž¶sm~”UgQ´ý)ý ľ)đß’†vĆĂ8Ś(rî$Űő‡†ŕ˘éĘÜ.šĐbđkĺŘ‹áýôCŞ ČsdzŁqÓsł`ÍQ2#Ż$m®9Ŕ×Ŕ†R:…Z¦RSăĆç d¤îţÚ±gSĄŔU éF@_KÄ9ČgCzµ˛Dj QîkŰGŃEm.%—-őo«^­Ň^rXîŃw”gW¦ekóÄ‚‘Ú<%M¶6o.ŻĐm vn“+ö…őHĽ‹$ Ľř"I_WťčÉ!€ĚŢí?D¦.ž¦ë"‰;ďËa‡Šť;"tuÁ»ňA0<[˙Ëňi÷ş‡_IîlŢŤ:l/PXqóz2´Yî]`ŔU`Ř«˙ć¦Ń ·„ČfĹöŕ+QÜ›©Ě”(8E1qwŔŐ¬wî¨~ýËL’}M/+LQ Kq Ö;M«Oyâ8čűŐš^šČž'oĹţ_ť±» `ľc ѭ߼~Ťy¬śŻ×†c¸~˝iňâ¶FĄmî VŤäo  ,áéL˛HQ•ć1CV(Ô+zŠ(Ňó0Ť!1ӱۍ1kňSendstream endobj 232 0 obj << /Type /Page /Contents 233 0 R /Resources 231 0 R /MediaBox [0 0 595.276 841.89] /Parent 221 0 R >> endobj 231 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 236 0 obj << /Length 2501 /Filter /FlateDecode >> stream xÚ˝ZKsŰ8ľűWčHí„Ţ$sóÄšZ§Ű;©™ĘäŔH´ĂŠ,jôpâůőŰŤ(H¤dĎFµ•*F7úőu3żŢśĽü-¬°jps;2gŠ,ă,Ďíŕfň)ŃĂTč¬PÉÍ×j*Ą“Ó«ˇH·źoŢśŚnNÄ€Ă?1(ř 3+”ŚďOţ:ůô™&'|đć„3Uäď0ćLĹŕţDKĺÇÓ“ë“˙´4R ’FT~Eţ`mË "ăÖ8ŢŢG"Y­ŔĐ ËUňqX¤ś®«WČ ěÎ"ń”dyVŔQ¸ůS=[}¦EѨś žů%§HT©¤ž e‘¬ÜiwŐ‚&ŐĎu“K÷—VŐł;ZĐĚč5ŢYsKs«Ż›ąŰf ?¦ÍPćÉwÜ_Łwžqˇ#Ć+Ś¤Â°B;Îţä"ë HâýĂŐĹŐ®Ž×L5ČxĆ„|†˘*ďWU •FÄH_C Ţ™B´"cŁWB1­‹ăpĺićJXfňl‹«ëŻ_ʮݻö`™Ňßé«aŞ­$OĐ4<¦2KŞEąŞAŰî帹źO«U5ARČ“ŞŽTT–ëńŐ]-ťéÜ®Ń ¦ŹĂ\'¬«ű”FGÓ˝Í .uŐohíŐĽ_rPńÇ`)čýK^íKçOßžźu3Šĺ2; cžÔAĆŚ…ˇ‰ű÷éĹŮŰQ×SydŤĘr°FR¬HpXÎ&hP~cĘ’†Žš™ĄŕîKmŮeI!ęah,DĐzB?'!Ć= )2\Š_ńaO®8†ĺ^é#™î†Ř~Űőkď1¸j­÷WÁ|#®ž˛ßcđÖđ!Ţ‚GĽ]ŹŢ<=ꏨjcĂ’[Śl#JřV0n„_|VĄŢz3Á2ąUÎ'ťŁŕĆ2cýî—]ęšy ~]-®ďRŇ’IťűĄóÖ Q ¸­KŻz–3zş„Žé}ăSŽ«ŕ໤ŕ| ĹC=vă˙G.t~,ŹÚŰďQ~ÍaŹ:W­Gâ*xTÄŐSu ŢZŹ:Ä[𨷫Ó÷§ď:¦)-fˇŚę4Ѧ:vŻ Ďda !f´Ľ‹ňľęZ~Ć” ůE—V*rËr°ŇŘš/Şď@Mľ`ÚKΰ,7­ż?&¶ (&ņB đ*iz„`rJöx÷YOh´´^ÍäJ7(é±ăĂřŔ2%›ŕ`S;ź_…BˇŹ9 –§C™1ި FË/SŔ†»Lđł,ŹDÚS*?–”‘W”’éŐß.U/šľ8"‡”19ÉV WFÄö†’°ć`(9 W!”äʇ’«Ë7—żu8ÓŠ)kŹĂ™§u345®·8{7zwůţŹ'ŃĄT69ź-×`v ÔPé‚ÓŠŐ1 –1 J]Kr‘ó«ÜňęG˝\ycE8JĂP3EV\{“Ţ)±Ú´¸‚ É 1•p"§ľĹŐPIđ)iŕË'»ćł9ÄĚ˝;“™ř60Jł ‚ćĎ(Ě“J#Z}É $@Ť°ĆUł§=ˇÔŻBiŰ3;5^hÓm>LŞžM Ŕ?Ô‰»*P€šŻH˙¬{©iQ0  ťŰaÜ/Ś—&slŤýŘk[×?Áą ‚49ÔŃ_śmôW(¸ş»+K–7ÇܵbşäŰ‹†‡/ď6Vnş˘ËŘ´~žĽÓ&ŁçÝĘ’5^˙µö¨<©'‘bĂ üSc˛ÁĺNdx>qĽ-˛ŠEnQgI}+·µĹâ»w±%oţly?–‹^h±%đRlâNH”eÜY/>1ŻąçÂń‹ËqF8™ń eh—F!…¶˝9ZDąqE+ż–„Ęť8]AÇC0+ňŁ»jňL3GĚÓwžRď˘đtÉźAČ …Ä×A„g«µďô„Ɔ'Ě®1+řuŰŞ(Cł >nYÔ{¬=ľ¶g*w Ú­űK× 5çě×!}¨˘prátÄQsłől_Ę€‰t?c–ąl,Ä^bn+b4ň«{„”$D úÓ(% 3ŐBÓˇłßŻ.ßs™ÜtÍ`cÖ®~Fn5ŘŚíË­VëáĎB9eó-ţ®ŻFŻÁÁŐĐ11t`.˘} ›©+\P3 đöţŽĐe~ŔŔoŢ:´0LĘŕrĂa1‡„z~áúřĐB;´{Ś ´ßřDmÝᏮWc)/_„>bÎ2A‚QX73„xŘ˙ 8ę"ňżhĆa $rU8ůiâGtěĺŞő\(Q­˘q "­ń ČĹśtlýţîmç ±`Ý)OžýÜzZiD¬ç •uUlXä@Pă°Ęx}_y#CičeĆŕÖ˝Ět‰W‹f~]a”MFěJ,2±!ňĆ˙Ý­µ$b)m{2ŢŕzĂĺţ@(3Îl±ď“…Hť1î`˙pó Śá ÄŰÇŃŹŕGQŐšcy˘ăá\}ŹqZ.č7$ŇnOÁ‚Ž#çÝ>«{\mÂAŐŹńĐ@NśŁ2u®ľ–~T‡™ňeŢܵЉłËw4eĂţ1f1Đ˝ßăS´[!;C•ó€ Đ(rjMĆ ldJ@ă[; 0ä›'ş -}¤u.Żë—}%”Ě!ašPËŤxB-ů–V8±V$wZ!•`WÔz]­@4jű8{´ťi,‘RŇ <"€;üQ‡Éň[‹W=_%˝!ý<™ WćÁ+ “Ŕ{ŇN [ŃŢNůă˝·Č™†ĘKU%m\„ *ôdÚ§ÓRŔ°®Iä?Ł–\౤pŞ5vÇĂgülŚ–4ÓG÷uzóÎmztď„]8ŘÓ¬ýŠŇŐw´ń®šaySůW3_&ŽËéô ާŁń­Ď\ “[~ř©^ý#cÁ±î7âë„*9_W!Uôůi˝ëŃrłfżx.éÝ-®ž…*Đ!ÂpKˇ&4<óä]×bµE>“ą˘**÷‚G‚1Ŕ/Łć˙=ťtC¦ńź(0lZfµčÂĺpBÔˇa¸$¸?/ďÚ`˘ˇ>PÎŕŰ×ô’T>ńk°OĽ)|‘Đ¶Ž§óíÚăěňő/8˙KČŇ^±ŔĚWôňŐüŐË—čSpňx>w7†ç7ëŸşm°ęYÜUlV­zşŘ‚eăš’Â÷]Ü»‡~AOÉą¦ąQ6±6hăżżęómendstream endobj 235 0 obj << /Type /Page /Contents 236 0 R /Resources 234 0 R /MediaBox [0 0 595.276 841.89] /Parent 221 0 R >> endobj 234 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 239 0 obj << /Length 2339 /Filter /FlateDecode >> stream xÚ˝Y[o۸~ĎŻđŁ|¶by—Ř·l’Ŧh.'qŠ=čöÁµ•T€cy}I¶çן)É–â§Ć"@D™äđ›ű őëččýoůŔ1gŐ`t?2gŠ»A–q–çv0š~Iô0:s*}/†©R:9ľŠä|řuôńčlt$ţÄŔńAf2ć”LŹţ:úň•¦G|đń3ĺňÁ3Ś9Î Ź´Ta<;ş=úwM#"i‹ĘŻÖÖń©·Ćc»D"Yo–hŕr•|:“Śg›â„ÝY‹=%Yž98 7)ç믴¨%•3Áł°ä‰*•”óˇtÉÚźöP,éÇe±ŔsýŹ+˙źV•óZPÍieVÝÓoëďÍo÷Ő ^fŐPćÉ3î/‘Ť‡\čpÁś1Tć´Gö'Y—Aö»ëËë])®™6jńŚ ůE)&TŢŻŞH+m#}µ)3NÔ"°ł*ˇÖî0¨­ý¨„e&϶PÝŢťśśÝŢvíÁ2+dé‡aŞ­$OĐ4Ľ¦2KŠĺx]‚¶ýä¤z\ĚŠu1ERI‡Ş#"•Őf2Au+o:÷´‚ŮŹa®ÖŐ}JŁéŢfŽKDő ­5–ěUü! E˝ďÔŢ‚t~ůůřÓůiQ,—ŮA€R{ CÓöűńĺé§ł®5 ¦ň–5*ËÁCH±"Ááx>E ż`LYŃĂQµ&łÜ€ĽÔ–]Ž)D= Ť…ZNéucÜ’"ĂĄřŐ>ě5ǰ\Ü+} Óm˝l»aÍ~ă=ŞÚz÷ˇŠćŰBőšý[mŔű°E na»=»ů|~rÖQUcĂ’[ŤlŁ•đ­`ܰř´Hőf‚er;Ş>ťO;GÄ2cĂî÷]ęšą<ż-–Oľ®ďRŇ’Iť‡Ą‹1,,ˇ pÂAp_,W4^WôĎéé:¦÷Ƨ<~«ŕ໤ŕ} ЧrâÇ˙D.:?”G5Ä^ö¨°fżGUíQűPEŹjˇzÍŁ­ö¨}آGµ°]ß_tLSZ&ĚN…rVĆBmŞc÷ ňL·PĹŚ–w9~,ş–ź1%cÍü®K+ąe9XiŰš/‹g ‹&ßW`C=ô"9Ëdí±§Ĺib›€bRě§ eŹS÷P2ĚÔµÝ;Hj:KŞq‰śŐ®—ŐâE»îJJ3;‡r"U-ÇŽ«‡<śi1çiÚ9_©¬¬J;ÖŤ"ýd/B\ó(”IŁŇ7ŽżÍŠU.r˘ÁëńĚęŽ&2`%x® PK¸¦ĚOőÁ}E°¬ţpeŚc6Ë®ZÄ^ WqÍŢpuT1\íEÂUŐŐÝčę·2­˛ö0Č­ýČ4 ăz ŮĹŮĹŐÍ^­`Ą˛Éů|µ˰“ŘÇnŤßŻXRŻTa«´¤ôěÓa—[ţUü]®ÖT˘˘ďT4Ś}Y@FŁ÷ÍůvW§Ţí0ç$sŔc*áDžQ0* ~as 5Ŕ«7w‹ůbć÷ŤÉĚ@  Ë…ý)…Ri‹VG_2 ĺL\ă;(ĺg=áÔŻbT«Ż€vú hս໾!^”@ŤE·qWAę4Póéźu…š:Ç4·[:ďOaa Ľ4™‡5 ă`lý ţY&‡^ý›·Ťţ.WwweÉŠbbsĚCÍ6U°|Ű`Ńđpňˇ±Ú(é‚„Ń\/˝Q ůŢ&•%<Ľük8PyRN[n—Zŕźoľpągž'Ž·YVm–ëĘvLwc~k]ďďĘb‹ß·€ĎË=IąË°‚xr §_]ŕŘ$ÓĘkŘë%đč9‰ŃWÜWK4Ćm!GS1rD׸ë-X€=ŐF$×aé®ömĐ~ÜĄsdM/S _0;Ů<¶´±ÂiD 3›UX<©ć÷¸~ůHďč‘ţéo«`đÇŧŻ&Cŕŕ{ńĄ€3 TőĽŇ+µ0~HĐ&tŐ…?h“ŠĆhřô§áŕnŽ[m.é"B„špĹ5o˙K ěÁR¨;abe o§!>€µ6Q…'ÇKď”Čş@7Ëa˝ÄÝŇÖÄ[tôe°LÝśőÜj+–ܸnPÖuP–2^žk^{.¶[„|D†bÂ0äVóe‰«Ďňď(]Č«» Ř‡”ż—‚¬l ëf‰X EĽĺů‹ÄüVÄhäW÷2)ô+б×i‡ÇŰk_¦B3˝Š2PyëĐţq}u3Ěe2ę2šÁƬ^ý†¬čËůľ¬iĄ-b=ř,€·ůľŰëł4ľĚŔ Gu®kíŤŘLµ˛üM1/žo7ßV“eąŔ0YVŢŹ(”m©ËxĽYř“îă 1]Ň©ťĚʢ9»-"íş(ŇÚ/" ĆÄ­ŘQS:€ čΠ“‚ I·~żĎ§Đ\Y'©+ĂÝ[-ĺů/|3ɨ¤ׄHg’+\mP†@$çą—ŚćÚK¦#(W2&ˇž¶?)Ź@+më‘ôÇäy“Äë!‚„«Ę(˙:oKbYťOÉ®@éb—@Ĺ8T›-wú˙ýRK"–ҶW®7\ľɤCݨŢOt"‡á@Zđôpë Ší-n(ŻĎđ‚®coݦ.|Ĺ ŠžŇţ&ÁEěW—CCİ„‡:mL$J^‡'®c? §!ű`Oońj·CzŐ&ĚřbžĹßCź4 ťŮ×HŔ– ě–ËÍO2ťoóś›ŘÖ/k~ń+}yŇ*F¤Uł’Ş3âUR«Ďń7_NřF*Lł’Ңg¸¬żkBc8‡ĐśŇ·…HćŢWŚ“ć°8áˇüŔXŻj 튇2µ/Šü]ČfŐÍ»ŕ/>0sý3”‰NÚ"5áî+Dđ-Úů–źĘĨĎ•Nă‡XmŔŰók”ÖôCP2”ńX6ů5xçGuÍhLRßÉÍ4é? Ăóôęäüý—ü‚ ď¨ÇőâĂű÷X¨Âɓŷ¨x~µnřľÂ˘půP°yO á†eră!\ôPĂĄßŃSrn!ľ(\mµń?˦CĎendstream endobj 238 0 obj << /Type /Page /Contents 239 0 R /Resources 237 0 R /MediaBox [0 0 595.276 841.89] /Parent 240 0 R >> endobj 237 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 243 0 obj << /Length 2845 /Filter /FlateDecode >> stream xÚ˝[]sŰ6}÷ŻĐ#µŤ|Ě›­(S·Ťí•ävw˛yeÚÖD–TJŞ›ß{ńA˘Dy6OfL /€‹ äb|öţSÚÉH¦EgüĐa<%‚fc(ISÝßId·Ç¤ÉD2~Ę»=!dr~ÓeÉe÷ëř—łÁřŚu(ücťŚvŚ2$Ş3}>űóěËWÚą?Łť_Î(YÚywJX–užĎ$ţ}~6:űwiŁFz‘• ÄeK€X „je± K6Ű-\*’ß»™J&ómţÂ×&jžŕ$5T…™-6_]ˇ¨ DJ5ľČ9"™-ş}ĘÚ˝˘;Zn-UĐ_˘ÂˉsQu•:»w?§@lpP›Ľ•Mpś_zźč\Y\ď)ł6H¬ #„l‰Ĺ;cÇiěË4ó¸ T%‘›P&G¨NQą l%—›°2GŘn·çźkdćš0µ#ł#C´ŘÂŤňŮăŮłu™Ëí¦fGBiXŐg@vŐ@vű>ńśW0ŕ™©p~ŹěUnŰE×ř·pË k¤ČZbôÎŘqFű2ÍŚnUÉč&TŃŞSŚn[Éč&lѶ‘ĂUUĎŠčŚíś39:F yÍaÇďlĆťSVö!W]ţ éz')˝ŠH3b`ŞÄĚÝ,Üś9EiYĎyňďŰĹÔ«NËŚr:Ŕ—¨ßĹZl†­ŐČÝzZĚŠ5„hĄîËŹoáäU*€i;S"2vtJ„2ŤS˘TaJ4˘ňS"Fu5˙q=üőŘ”h[ŤŘü”¨ôŘpx=<ĺä{Ë9>@Źä·ő?Ëâ›KĚ t¸ËÂýZÚYbŐr/Ô¬*\¦Ű"ż­Îđ–´sdě8!}™fB¶Ş$dŞ@ČŐčş˙ë`\&SŔoÚćm5C±a„Ş@űcx9ćc䤅IÝ6ßxoŚô+ăžüŕłÍ\˘wô:“$K«>éš&nw‡%‹2@ŕőĹK1ł^5„ЉăÓKo뀽śßđŹ‹qĽŤ QÜ“µĺrwĆŽ3Ü—ifx¨J†7ˇ ŹPť`xĐJ†7A Ź  çuÂ)ÉxDpE3Kp|‚sEF+ęŤI‡}@mśdvů{‚»Ŕ’ŕv6=»]b`yÉpăľy 9!3(Iy;ÜŽŚĺv(ÓČíVPn7˘ňÜŽQ5s»hŰŤĐ<·ch—W§ąť*iąťÂ&ŻęĽ1'S".NHę;ËÜ ÷ł‰iű†ŽY›\ÓywĆŽ“×—i&o¨Jň6ˇ äŤPť oĐJň6A 䍠őŻŻ®ýńÉ`˛ŕÎ7‹Ŕ¦ťř€ś*#‡{4‚7].ˇlýľ]/ŤZ|EÇi›Ülď`+űNřč)/n±ľy­C(Ús÷ Ú(eÚ"óĄ$ڵĺ¶wĆŽ3ß—if~¨Jć7ˇ ĚŹP]ߎŻ?Ő‰/ĐşdŢV32 Ȩ¬ ŰÍÉưµ6Ž÷ÚěósšývEv»#Ęi‘O6ŻsŮ›·đŐ0dśé–»3vś±ľL3cŰ@U2¶ U`l„ęâĽĆ{Ý.o«x&*e×p0şąľŐ·‰’‘TĆžš2ç©)Ý÷ÔmÄŘ{÷ÍlqtłXäë•ýΞ[şć^4{ĹŚÇĹ>iµEq2ź­Á5ż…EšJ« GĆŽR8”i¤p+¨…Qy ǨF·Łţđň˘ŽÖDž¦í ó¶šŃiC$×t·Wçýţŕf<¨‹fʼn "rľŇTÂŇZ¦@/Śú†L””WϬçłŔѧ 0Ęk6輎7ń-‡µe®ý4*W7ŤĄjyy‹ť Đ:°Ąë‘±ăěöešŮÝŞ’ÝM¨»#TŤ’˘dAR4"ó’"Föyđůzřß“’‚ ť\.Ö[`†ž†Ë4áVNŠçÔX˘pw.l°Łş«;Gtţ÷líĎ·q—·tŻá~‡Ď§/ö’Oő:Hą1ŚEwŹe¸VÉNŹK»fYńÝ<™“g°[¬OŢ\úyq__°`«˘Ă˝%wUKŇäi‚WŠîç~:Jć/"e») Ąlůc~»¬Í]zí¤Ň6O“Ťł`[ )EľČ_P}ĹçD®]?.…t¶Âú ŻH˝É=ߢxDĆłçüúĐ pÜř{žP=Âí)lŰź D|¸óŻb6ąó×%0±ě řv2[¸Y.+4F şs\˘ďs¤ W~čŢeźęaZORVÝx_E“[ßŃ>·ČýŤ¶wđ›e–ÉxtGů>ĽµKőČę•O¦›ídü4 vMHŘxUߏ !—Żâ 6žr†đ߲ŘÓ25&`Wü†/­{·9“D›Yz'.Ń;áĺF©ýĎ#CÖ31ÓIˇ™ÚÝŚÄŤoY—˝Ilč÷!1…<}=.ˇ2X%äa`ÚëA!ĺQcöS ĆÜ›/} ‘L) QŚ™†Ű…ŘJXŻ„â룔?wúĎÍő°›ňd\o¨R¦,ýŠĺAaôăĐňlő"cđiF¤N+řF7>pjcŻišÄ»–Ecd«Ĺjłaäç¦sB8ăÎ×ßń1őS˘R7¬ ę¦^€(ęk˝Ľň/`×+(Á2BA8Č9Zőçł|°Ň‘RŮ K)ŃZ˙XGz[˝ČŘŽ”Čě˛B»¨L`ť@9\`Ŕ÷0‘iŰ:ťĄ¶oí2Š?‚fÉ~1ěŰšŚČl¦L+Í ¶š›'2ŕżĘ*íł7/˘sd¸J.ŃŻ\ąaă™ áĹĂv¨A(a:‚G1ŮŹŤ—·Ő‹Ś/‘‘T±˛FDö 'ĺvq˘Đ6jhBň;\Z„Áµ_8ŰVŇ@ążÜ2y˙/W ďB%XäŰ,wE€älżíĐč#ىüČ˙ď$wĆzîł“žË+ĘŹ»pĽâ•ŠWÇ…}ŚĺČY—žˇÝ{ăňČ,;౓(ř˛r+°•*ŕ"J˙_ŃV+‘Ѣ«śEÔH*µ1)x¬ËË5vĹ 2Ő®z ë8 mÜŻps?żC{x÷Í•[şgţ÷jf+{‡i&y„ZmBŮڑަ{ńb[ô€ÂX/@łż§ßÜg/OyXîj•‹ő…Jx+•q6˝F®/×ÂîXqÁSňGţź€łÓŰră­:(ă™Ý ÂŇ,yGfvćÔIO U&«ÉcŮ.™ĽtAŘM˘ěGO ó6śefŘřVJ[Ąv[âůĘeZ‘ ĎŹ×ýź0ý§ Í<]ĚNŮÍęĂű÷÷8š ÂW+»cŔú—[Řś<,QćŹ9Á‹2ő{ Ś ±°1-´ř‹˝GţÝ 'ůÎ=9ĄÚžŹéD§a4ţx.Xendstream endobj 242 0 obj << /Type /Page /Contents 243 0 R /Resources 241 0 R /MediaBox [0 0 595.276 841.89] /Parent 240 0 R >> endobj 241 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 246 0 obj << /Length 1000 /Filter /FlateDecode >> stream xÚ­VKs›Hľó+ć•0ž7Ln‰×[˛ŢµrĘć€ŃH˘"(Z˙űtĎF’×I*.U‰fzřú›~λEtńgN,µF’ĹŠp‘SÉ,É2FóÜĹňS¬’”«ĚĘx±qI*ĄŠßŢ$<~ź|^\GW‹?N,#™Î¨•š”÷Ń×čÓgF–#ףŇćä2ŁÜZr)!yÝFO)€¤3”wČöNŃ”íą}ÜŐ@e÷PŚ]íđr»żëŕQâR B…„…Ş©ßvu‰äŹO®-Ę Äm¬KR%T\ŕCĆÝţ@:)ŰĘęDÜoŠ>ěŞÂ˙Ý]’Š,nöŞUD‡(˙!FŐş×°¦tĽö‹x7R/ú ß×áŁ9“t$šrN­n(‹íŮeż`”d|ظ:H}śŚ›PĘc×2˛ôUâZ6÷»­ë˝}ę­qE­R` #"Ľ­ŤßŔ¬ŽíĹű˘NůaxmV^Čiż4ťŞmÚa©l<ťĄCŻrĆâ’j'tôĎ\µŻÇŔNôý΢Ť´®ßŁŤÚ-‡•Şž1ńAź§S:ťić9ušŢśçT[CLΩâÇ9.©’ŮÓY>bĄ3°łTçBP&Ődą]ło‰ń,Ü3˘šÓLľ Ďő˝pĎ ?­ËP’¸ĐŽ…@k_—!ţŮ# !Őxúů›7§ŢTFQˇÉť@ţiwŽXçţśQR&L~öSV™„&`_†Ő€ő<«ĚP™çÇQţxyyu{{ŰTćaóĽE5T¤ŇĚ·AŚšŇĐŻ°îÚĆ˙Wľă šănßMÍ"l8T[ĐnĂKč´+~fč¬ćłĘŠ=WěR`ä6Đl!ą§F¬tvVERr*35üŮb—†SöB<Ôó4!őĚޓŎőëÉ·ŔËĆŻ.Ď{€µ”s9â_Ć•Ű9ň٦rÖŁ» ®ztÓ‘-¨s)˙żĺ„ů‡ŮLç]ľÄeîMPŹ™ëGĺńÄĄg—!IĄŕfµÖęwîC'} 1ŃWν 5J; mŕ›ńŢ]ĂÁеo›áíH†·šI˝®Op-Ŕąé÷T0~˝äǰ˙RÇ›±©nwA‰sźüuů ×_ů[ÜáÇ™ ş­ß˝ą¸X˘ˇwčgź$]łoK·jŁ{íhíÎ#' -3ž¸ôÁ FÄkŚŮö!Ü]ÔëđŚ™$͵4±±c4ľŕ˛~]endstream endobj 245 0 obj << /Type /Page /Contents 246 0 R /Resources 244 0 R /MediaBox [0 0 595.276 841.89] /Parent 240 0 R >> endobj 244 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 249 0 obj << /Length 2679 /Filter /FlateDecode >> stream xÚí[]sŰ6}÷ŻĐ#5]!ńÉĽŮŽ2ë´±˝¶ÜÎN6Š$;šČ’JIÍvýŢ‹ 4EČŮ žéN'3^]ç‚đŮčäŐ[Ý+I)Yotߣ…&,/{JĺDkŮM?dĽ? \•,}žőŚńěôşOł‹ţÇŃ»“áč„örřG{eŢSB‘’‰ŢäńäדóŢô$ď˝;É +uď+ç„–eďń„Ě/NnOţQç@’Aĺ ńAl /R0’Ka°Ý"šmwZ8ͲźűĄČĆ‹Ýě5„_«ŕöXA´*áRřăóĺöŁ Ó„ćĘ…śbRƲů˛_”ŮÖ\íaVŮĆj¶ĆëšĆŤůßFÍ—6`µ´§ń™­îmŰöóľí~µ€/‹UżĐŮWüýoăÁ§<NI)Do@)ąAöŻśŞö Ú‹ýîúňúi±ś.XOĺŠĐâĹeúpWů\ ™íŻs˘¤őذ…Š2Ây™•ËGE%Z5PÝŢťźooŰ|DŇÂ=Ó×ý—… \BŻűBełjĽťCo›““Őăz1ŰΦ q˘Ä®ł]Y6»É»{¶1Ôąß! ż÷5ĎH»ďö(YßKURIş~ź«łç]H´ăS@ňýäş=€tqůóéOoZŔ#şPI€ąTQ`B¡ýýôňÍOĂ6)a:`#“9°ŃIФŽ—S$”kAMŮŘC”ŁŐÖŇ’ćžkđrl%ę·ľ  ó©ý:b@m+P+Ó`9żršhĄ,Ľî1Ó$đ OÄâ}˛n»8ŹS Ş‰Cĺ™ :FĺŘj.ǰy2Řn-®¦×D–4 rIł ˘ĄłĄF0őŠ(OŤŰݧ zéˇé»(¤ ›#ńËÂߏ˙… *× ţ?!ţf÷ ÇŽ‘ę ‡ŃÚŠĆ<čßú`ogË>®Uµ…Ť –> >—+Žk’+Ú@čĽ˙¤šů¬»a˝|ľ2­ÓY»ŕČ‘.Ž- |¶pk4T*RŐ,†ť8­ŃlTÎSZĹs K_ă töB_˘ 9 'ĹiDlź¬[Ä\L\ÄR ŞE,†Ę‹X€ęöęüÇá¨M\ řUh.W@1Ń€öËÍ!g4,(%Řs\v–BxYÂC˙ąť?ŮtNżf’ľ‚ălk™3<óÇĘ|;Gz°MŰ•ýŰŹŤű±­ ŕhć’˘ ˘bľĄ[ćlŠŰÜ­ĹC‰s Ž/a(ű §KÁÜ‚˙ĺ ~ĄÔwęŚI5rNtźŹńBČĽ:(† dIŇ劣TPÍIÚ@ů?‹ˇaŽhJj˘źÖnděJ°ő¸˛´jĽĚ€&˙RhE$–_®D |'ÇEa Ç$"$ëAÁ$¨ĽFQ9 QĹE0 4/‚QhNCh7ĂÓöR`‘“˛4PäĄŃ@üt(rłÂ`šĽ:Ą3B¨AU„Bűâ˛-~g\€‘O˝ .ł{ X=Ú/cűaëSź4•Oľ š€KIŁ„ű\ÝJčbľM S€¬•0†Ň+a€ň/%ěq¬l”L¤„űdÝJčbâJU­„1T^ TG”0´Z cĐĽĐÎ..Ź+ˇÜ(ˇn"÷Ś âŻKĐ>1{ *'omI´ĽFZÎÍk:łIć*ŻkřB›>ćµÎlµ0%1¶šŞ7Čň=U/SŇ,u%¨zTťUŻŹyvŐ›źŻzŁ]Ő"üĂ«^ů"Uo•çĂŐĽű\ťçB˘—’W¸$'p¤¸ľĄŔĺĺ-†Ë©[€ëüęňrx>:ş›†Öé1”š†ľá™¦ľö­s Ădµ¬Wć&uu[ĘÂ-E·ô í< čz÷i1·‹Ű8ťWwfŃş ř O?¤Úp@ń©Éň±‚¬ŕ;‰ܧę4‚.ä›|` „ŢĆ :@üł›Ŕ‹‚E cL&Ú$ëTH•Č$¨ĽFFQ9‘ QEßŇ%AćßŇE‘ą·t!˛˝~GßŇQ^ Ł“p ±$F1«Ü×@%»W›ú9PP˝N ţ­%Rq?íĚź}őo˘[ţQÓđ3ű+Tv•§pAŞN÷çcžíţ’ŕóî/ŠĐążá˙É;ŹęŹP‹D{˘‚dÝęćbâę–U­n1T^ÝTg§íýP¬ e.Óŕrąâ¸ŔŘĺś7pÝ oŻŻ.oŹě\ÁWĘš@©žš@</rHŠ’Đ7-¬Ť ™=f!o†gJł·©2 }đĹóŹ×hăĐşx_g•M[đ“I]^+\'±yA®NźçcľÉč%éť^Ąłz!Ężüz´d$‰6±É:ĹĐÇDĹ0 */†QTN CT·wg·ç7gmt’“Bë4č\®8:©€Ř˛îîňôü|x=¶WţDAXÎjQ´s4¨Ş.šćŮV0 >oŁť ţ™¬`ăϡB*hO”D<ÇEw˙… Í3Ř'˛ŹMôĐ P#źP_żŕĄŃ,;hÖvegŔÜÖřÁůüöµĎr|áWź¶'—¸#nbćp×樾{!öa±¶'Í#‚Ď7Wç?`ű~¤ą~0źqîŘ®_żz5ĹÎĘłÉzmć ĽţjWMf÷+üÓšęaFp[{Ç%Šę3Ž 3ľ3Aö»íţ7űYäą4/d¦rß˙Öfżˇendstream endobj 248 0 obj << /Type /Page /Contents 249 0 R /Resources 247 0 R /MediaBox [0 0 595.276 841.89] /Parent 240 0 R >> endobj 247 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 252 0 obj << /Length 2439 /Filter /FlateDecode >> stream xÚ­Y[s۶~÷ŻĐ#5 âF€yKmwâ´q|j·sfŇ<Đmi"‰ EŮÉżď^@О(YM<ž±pY,v‹ÝË_oN^˙ć™ČR=¸ąHĺ…N˛s‰đ>ÜŚ?EfKă2ÝLŠa¬µ‰Ţ^ et1ü|óţäüćDř“,8ëD¦í`4?ůzňés2ź$÷'‰Đ™Ş×ů¬OCXT‚D±Jeô0´i”ĎÖwŃ@*U GŤzW ”''Ĺ‚[Ťl”Ďf·ůOá ĎŢá˛Ĺ(îÝĹÖZGSVMŚŠń‘¶Ľ^ß®.Žň#ŕ|qĆ›ÝÁfeĹíš'őîÉĂÉ©¶äߊ,Ľ`ĄÁĎĘĘw÷·őâ° WhµĆQ vŻXYO«4‰rěflcŘÍěČĚ0J­Q&’ž-Ű®…ů[řńtJĐ™Ň5y ýľŕ:T C=|č¦ŕĆů,śÝŠůΗłĆ0uqä)ž–ĺ—ińĆŃĘň©€8ëćN4‘Fc4Qťsg™ŻxrĚ}^•†ó‡IźŁě˙ʼnŁü÷qŇ(Ýqč]#‹ž8mS/¤T»qÚ´qZŚÓLş=ˇşĂBµt¦L9—ŕ×îE©D€©pOE’V‰,ńÇËĄm&lfúK™YěŚČĽÝËŚ–&ŔŚ[şGI“i!ÁźÚ|3á@@ËÄ mŐŔ 9Róü˙W˙zÝě* ©Íş–úŮD©…{ô¦Ę†WÜaÖ#_*…Iý–|×Wç§ěŔčŰ. yAfťup"©Óá"üµ\,Ż L9Čeˇń Ăŕ¨Ân7j­ÂíŰ!óú'± \|m@X}:¸ÇYŃşĽ‚s˛,îĂtT<5¤Î¬0Ú€VHóSvlXĹ^»f~"›hLä€ŕţĄŇFďšč<~- äâ’4‰á$ŕ]±Ěd&ZŘ=V™‰>lŚŮIîS´$ÍąäSĺA‘$fĐqĚ÷pŁYĚËž˝zHoµ?& \GeýđÍ côŔĽ”Ň5ľ…ţîő!'; b CĹ]Ź2]PçŔÁźVEŤÉÓĹUhĚ1 ăęohÍ9Ó9Ď,ÖóۡUݎO śoĹÎܱ=ÎBL¶Üŕ_±„żcžYŇXŐĂtŘ6ů§Ł5ŕg+\˘Á×<Üů_ôöŰjŰT·zSľCQ}Ł»Ď˘yţmJú†ô4çaĘ ëfâ–đi›Ń`} SwÜÜ7›űM49ÍŚĂr(CvDăxGč׳uoó€\h[ŚÔŮ©¨†Ň’)-DŚ‘Ż1GÖ<Ó`Ĺ€˙4bć»DcĐý&¨;tHőď<’ŠŐ÷U]Ěą]1Ô- j˛J JÍ%® ×$‡­;f1±‘ą×ĆÓ•~Ô·LĂď?ňW[8€‘Ý]I@M2@SŤ™a…K# ż÷U‘wŔ˘ç|Ń´‚­ ó+‚şúGŞźżBPč;«tt Íłß™śÄĆ%Âć‹2ü¶Ř5Ü˙˘`ăĂ<ë§HĄ'ŕí–ĎVŻzŕŃ$śăNÉP¨¨^5Č{)ąq|\˛Ë†çîTÖz6»ÎËZ­g]#ĺćP{ńýÖMę ś÷\ÂâOľáÄ!ž×ŃßĂĚŇA<űÔý4]ÔźwBÄ,äm;÷ľ¨šDzU}ěŹTř^%‚r±±%żŤ·í{W>ą=Oďŕ˛ÎůřĐ@Š•$H·«!7$ąşĽÚ N«ˇ…·ţT µß Ż¸ĂŚÓYG ŕĎf˛ÝŔߎTRCŇË^FŞŔë°T2Ö»-©®˙:==żľŢuT¤Śč Ä7xOS6)ń2İś_89Â×V‘‚8$r•Ů­+¸Z‡xL·Ělö}čM$v?ćţKś˝NňeÎ~Ăl˙ŮšĂg˙RµgHŞćě;R]\ţýöŹ‹ł٬^ą—‘-đ:,›Mˇi·d{÷öňěŹó]·”BűŽ[ę4iËJ:…”‹¨` aFšjN*›đÍ #±„8»šs° Im:9 ‰vËĹm$ënÖ‹î2|pÂúYâ^Ş0 Ď’ÔtëIĘŰh˛ŃZů´m8S7$ă" żC‚ŠÇ)O†Á­žŕ¨Ů,c°Äyw3ěA$‰yrzF‚e;%¸P+šâá݇ÂgQ÷sŘ.]‘€fô܇śwL©ő>…a*ĺT·žŁ¦·0 kX9{Ľ .ŰŮŤypŕd_Mgö´Ź\¶˛íKŁĹŃO*;J&äV?]Ůé0ÚWŮiH:•żŻ˛s´\GUvŚNÉcß˝şGI™BLëfѾʎô™é‘…ť@ü"uť ŻýeťŽpˇŞŁ}(µî©ędĘ?[Őiďé ˝%7ź¶dP ŕ i·ę:Z;,}Đo·˘ŮËÁBžŔ}…©śđdv©PIös– ĽâłSB˛1ą˘nm‹±›áůÂS‡ U3ůĐůđÄnh4´żX‘âP §ă?îĘ/^‘pŃŇ´ż‚ăDbŔĎ XÜřŁ*[ź¶ę8˽ُrđóQŚ.Šź×j襌ušśű«”Z/çÇ z©´€BýVl®#ÖŚđ›XجáČ“řm˘)ä÷ám$Ř*ýOŐź}ěĐdF*y*QîZĎĂLř@łµĽ;\żay6Řsˇť¤…Ĺ(nÍĎ|f>ń†»˘`S’+ÂŰla2ÂáśŰQ´PÁŃÖDËüľrĐ{ę„ý)Lóä8ô‘i¦đĄVűµ6j?µĚ–<É…Cť}<ýÇiŇzÖBŰ FÖzůćők,/`ígąňWŇhU®«Qč pFu_E±{Ô BĽ“~ áÂńËč==ĄBÁÁ„š†J’t{ õać_¦wšendstream endobj 251 0 obj << /Type /Page /Contents 252 0 R /Resources 250 0 R /MediaBox [0 0 595.276 841.89] /Parent 240 0 R >> endobj 250 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 255 0 obj << /Length 1907 /Filter /FlateDecode >> stream xÚ­XKsŰ6ľëWđH¶!‚'Iä–:îÄi›¸µÜéLš-Q–f$Qˇ(;ů÷ÝHђ줭Ç3,»ßb_řiŤßŤÎÇ#IřS‘—Qîrፋ&«ŃçŃÇO2šŽdôn$…ńEtc)”÷Ńjdµ ăĺčjô{Ď#&é€ËOňáÚ™9­©>ď@KĹŰ„Ëd\7üŰTëę>Ńy\.E’:í@~¦5™Š§Ő¬Ä­Ë°ë.qPîöĺąNŞM»ĺ‰Öća±]ŔÇ Ş´Ţ[ú7‰.âŻnűÓŞšŘ®`]HňĎ0訦°ű˝eŠe`L(Ô|[ŐP2­S¸ý@{Z¤ŚYĄśA©G™ŃV Ěx¨O¨gÁłÂď#ŠěęÔ‚°q:˛y!dÁůăüŻË$ä±c5ˇuqyOýĎar<ń:^é€Ů ů2%lV<ďęňü <nÖ]yî˛ň}`Ź,ďÓÝf˝AŔ°Ôt…Ô ˛«ŕDĂ3=HťŮ°÷oé$ÔÄVCŕ_äv¶\Tűł$Ź‚ĎQÇëi¬Tp™üŢB¸Ĺ‡ňBh„Ş\I,ëßsP ŹńV Ąű\˝ĆÓAĽ™ bó˛ů?/w7ËĹv^5×Í’e}¸÷žë…ÎK0ě„™B ¶(í lúLŚ×h€1 ”‡Z Çd‘5ąČĄţ_vĽŇłZpx[ô'ŇtO"½IC&´ , ÷ď$ĺÜ ¨Ą;ü*­۸ĹňŕĂJĄoďů•…:|ś?ęđył1îî;TÎą„’UĽĚőM wŻk> endobj 253 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 258 0 obj << /Length 2774 /Filter /FlateDecode >> stream xÚ˝šmsÚ¸ÇßçSđŇěUϲú.!tšn›äŮ˝wş}AI` ´·ßţžŁ#b0Ů˝žLfbcËÇK?Içlxňö}޲ÄjŃŢ·ω ¶e %y®[Ă»/™lw4VdĂÇI»#„ĚNŻŰ,»h~<é OX‹ÂkYÚ2Ę+Tkütň×É—Ż´uwB[O(6oý€sJµ­§ÉE8źť NţUÚ耑Nbĺ őAŮR ľ„ BµrÚú eëM‚ć .Ůďm«˛Ńl3y‡ái“|žŕ$7^…™Î×_}ˇ¤ DN5ˇČ)"›ÎŰÜfk÷¶‡Iá/“%ľ×]\ą˙ľÔtţŕ ,ćţ6ÖŮâŢ_[?nŻÝ/fđc¶hó<űĎOń3‚p&áŚXĄZ¦•NŮź”™ęúŻýćúňúy *‰T˘e¨!Śż ˇa"ßßTŃV'1ćŰ+$ྲ¬|! ëUT1A¤´Í¨ ¶ęU1MTnvT nşÝŢ`PĺAÍx¨ÓwíŽÔÜ÷©ˇ…—í7٤­§ĐÚîćxń´śMÖ“;4…:·Řtľ ŃĘj3csOVťű R0űŮÎeFŞmßńgŤµ˝6–@—j¤é·¶¶|(RŰđMHŠí^')4{"éâň÷ÓOçaJś›F„SµÂ”†S• űpzyţ©WĄ‘‘'4 MĆŕR4Ëđt4żC Âô)+Šîh±öX2Ş ľÄ—#·•:˝ó?Ç68¨uŢĘ]đĚ/‚Oô®,}ď1†Y+¨!˘xkě0ơL=ÇM¨*A®SINTCą m%ËuÚ"̉¶›ţ§ ĘŔ‚¶¬DŮŁ őđ…ŕďüíëÍílęś%ö8)nŕPĚ*&5D/<öŽ)R.u^"Ż%Ń:ň ÷512R؆Ţ;Ěp(SĎpŞJ†ëTE†UÇnB[Épť¶Čp˘íú´úą‚ׄ)~bC¸Qáöpúä†ýĹf]±# ˇÔ&čB«F‡íÎGb nÍÄ ˝’«Ô?ŰĆhUrť-Š=âÔ\?ŘÜbﺸŰ+Câ}v ą7‡ú*ÉŐľÚŔ‹Pc¤_^ Ú)ˇ,Ć/o>U= §ÄňčIöu\ (opřQąvófşnbě`׍ej»n#Şb×­UşnŞę˛7üăŞ˙ۡ®Ű¶Řukµ…®»ScýţU˙X×ípĄNń‘Ňdí'eđoQ|ó'’ ü»_ ×Ë\߉!„úl7¤oŠÉÝ+Ś%JáhÚPTź; d(SdŞJ ëTE U«îo˝aEšgfM3Ň‚­ziˇv¤ýŃżööóČ’ŘŢä~¿ȀřČŢńG“­§Oîćg‘!ұ’؜晟wbɢ\ş1ĎŹg ŰĹ‹őÂC„䦪ÁöŠořĎŻľŔcŻA87Äئ\îÖŘaÂC™z›PU^§*ž¨:BxŇJÂë¤EÂiýŢéyý8 €+jŕxçŠD+ęÉĆKűČÎ-1ęo’]ţáü´üŢő¦'?Ť”—„›@řú5fłŇZ 4Âvbě ۱L-ŰŤ¨Šlת l§ŞęŮnDZd»VZ`;•vvqyśí\IÇvˇű®óĆ;Iđ0v‹×Eöä·ŽÜ~ź;f“bűŠŽYSÓĽ[c‡á eęámBU oťŞo˘ęĽMH+á­“áM¤uŻ./{ÝáŃenÁ˝o‘¦mđwvůMîÁµĹńb>ŹĹĆeŔůw˝hT×~ŕÁÜţ˝ ĄĆ‰±®™2řF)óÉ—’0Ö”ŰŢ;L~(SO~ŞJňëTEňUW7Ă«÷UđZ7Ł,ŘŞW&A•;ʶ}˛vA]Ď˝6ĎąÇ;ő~{'ěö›§ăb2ZżĚeŻ_ĂWC“q¦"vkě0±ˇL=±M¨*‰­S‰MTťťV—‡Á^7Ł+تמ‰JąŁ«ß\_]ŞÓDÉH.SOM™÷Ô”>÷Ôp%´ ±wţđÁ‡&‹ĹdµtĎąl‡ë$Í!bĆŤěpiąÁŕd6]k~„EŽ‹ü¬„cŽejnDUD¸VU@8U5¸9tűgUu0&ň1c(Ç=t,Qř|·ÜQŚ=r]ôäżÓUŘ{ÇyŢÂźĆÜ“pYwŰ €´›ŞRN Ó°»Ă,ŽV˛ŐáŇŤZ.ün žŤŠŃŘ-VGłŞ>Ě«HFĂba8“D…2CŠÇEnđű’Ü–\˘”»IŞz:áuićć+7y˝PŢM[ŕSHĺÚ“ľµ*GŰďÓń¤śĚlC<çąVăXjzë[ –<*]Ĺ]ĂÉŐžĂŐ×n§"MSĂE4¬ -†žxđ[…Ĺt„Ұćń˘S¸đĎŽ¦sź…ćoĹďU‚&.˝Ş‡5¦9Ńg NđŮ©G•”•Ëyüş˘ŮMئ w‹IČâ{ż™u=w>).Ď»lIËƨľ4^oF@ŚjK,×hß˝:žW&] *0H ĺ"ˇ+*C “4~gŹâ…͋ۮw˙ uaŚő¸Á'yŇş·±_ÁE_Ćn›Ď»¬€ďa­HXęĽČcx$­ł¤ÓďôÝęâÜăţ'UtpqFöä…2K‰Ń{&~˛ôŃ\˘ŹĆôS©ĂĎ=©ˇ‰!çź™iĺPcÚç®â@ů.—şJ@ş& ţÓç˛ĘÝnÝ‹µ …Ý/N{c cŞÎsŹR0ćĎBé=ja´˛I~ Ť) nCܡx‹áKe[ýűúŞßÎy6¬~§MYúă¤Â… }ăd´ŐIŚíѧ‘đY©ľÁuŻ‹KGĆĄŇš,¸3 |űDÚ”!Ňrľ  ă"ňz‹&˛É)^ý9‡¶ónn‰21m±Äěeał‹Ëp‚†»łéd+#­-©QHQµmŐ×–T–PÍvj댌łIy!˛Ä>ŃጰRĂ n’Á÷¸ďRłNç(ĂüšÂăűű/ţ&Ś~[/EáÍ6DÎaDtĆ0FÁŠF:Ϧ14Á.(Çq=˙úÍ[¨C[íŞ·ŞAüBW®ŮşçÁ: ¦:‰­j• ěWbűBÔ÷;Çf~Ć /7\Ć –ăW¸JÇD†ś[Â5‹ .ŕâÝ& \8ŽÜýâŻtýjÎâŰtâ/ '|^ đQ„BpµíŰ˙ÜGHîmuücGť–W”ďu^ÂMŐŔŹ&ů˙“» ĐJ%ľKµ0|en¤‰†wHëf>ÜÂzô±n\l¶=ÄőřőŁ Ç(ąíoÎ1Śu Xf ł;+Ł3Ą¶“ÁŮŇßt!ĎŻşżâő_#ĹaĚ1ŹHĆzůîíŰ;4i6^.]¤Śď_l (ż_ŕ\> endobj 256 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 262 0 obj << /Length 1191 /Filter /FlateDecode >> stream xÚ­WKsŰ8 ľűWč(M+†oŠ{kÓt¦9tÓ‰sęö Űr˘©-yey3ů÷ ”,YNÚN2™‰řŹŔţ8ź]|Î"K¬Ń|1žAmd %Y¦Łůę{,“”IcE<(’T¸IXü%ů1żž]Íg,˘đÇ"K#Ł ±BEËíěßŮ÷4ZÍht=ŁDŘ,z„1%ĚÚh;“\„ńfv;űÖëHAI:Đňńě `İ,2\Ş•x·«Ďîö°ŘĂw pă%€ĹĹăîSµDÜ T”2J ŘGe»D|łŮşŮîá¸2q‹ÇÝía˛Ď·n”ĹuNŹsiKCśdŢtF0PhŁBş•˛ ™Rľżŕ1h@§Őś±Ś(«#Í-‘Ěüş¤ "…9_Ô;]é@Ů´˛sN¨˝AÄvČţKďâŤŃžUđ"·ÁéU˝ S)´Áě’Ż)1ăř™ŚS]µŢ·ÍˇŹŞK2 ^ĘDfă/:íĘC˝/pŚÉ]Ž{HRĽvôB™QVŕBÓ%EČÜäřô# .8Q˘{ęînľŢśzSjI¸ú#wřóîětMý9€$µťě$ě§¨Ś \Ú·At˝Ś J¤Č˛q”ď./Żno'±MEć…}Vů¦ÉŐ?©(đŐw?¬8»¦v˙KWžÂθZŕąľXxÇ«čĆO]‘Ă füŔĐ$ç9µŇŠľ”ě‚cÁRCᓚ˝*‰:]é@Ů$‹´qÂČŢŕď&»ĐŚĐ7ÂéU˝ ¬öÎ&;ćŻß`/k·şšÖk c"âĘd± ůUSśŐ|T¶ŻĽ«ŽnŮ‚<âů’ăźAdŁ/0űđĽĂ2ŹŰ:ĽŐąîĹ?ÍdŇű hX¤,QJľ¦ý÷zŇŁ"ÁĂ•1çFM´ä‘ ë#2č×ÂĹňű®Ż‚Ůc"h׌»żYaŁĺZ”)áůuŁľ›P*î;ŤÍÎoâ;ŹßO_ľĂőw®k€ź,ÁńćÝÖîţş¸Xˇ!‘wčgG’}}h–ĹşN8<Ý÷©Šiä¸ö?pŕç <Ô¨ńcÖőUň˝˙rJu’fJčŘČ.˙(ľ7Xendstream endobj 261 0 obj << /Type /Page /Contents 262 0 R /Resources 260 0 R /MediaBox [0 0 595.276 841.89] /Parent 259 0 R >> endobj 260 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 265 0 obj << /Length 2543 /Filter /FlateDecode >> stream xÚí[]sŰ6}÷Żŕ#5]!Ä'ÉĽŮŽ2ë4±˝˛ÜN'›E¦MdI•¨¦ý÷{/>(°!§A<ÓťŽgLŠĽĽ<"ΡłÉÉ‹×ER’RńdrźPVž•Ižg¤(T2ą{źŠÁŠĽäéäS5r.ŇÓëM/&oNF“šdđG“2Kr™“’ËdöxňëÉűYrw’%oN2ÂË"ůűˇe™<žĆíţâäćä?MŽ!$zYÎÄ6ń&Ś“LIŤm hZď6h ŕ žţ4(e:]쪗®Î˝ŻÇ)ňn…żź/ë&Č{Ľ 4ËmČ)&ĺ<ť/¬Lk}·‡jcnŞ5ŢWÜę˙&jľ|0«Ą9ŤĎluoŽŐźöÇîW ř°X X‘~Áëçř5,p*<ŕ””R&C*I)4˛˙f4ď~Ałc°ß^_^˙ąŤx&<ÉłśPö„†â„ňâpSą\C/™i/‡s˛¤Í بŠr"D•ÍFE‘EŢBus{~>şąéňAE™}¦/Cˇé BA ŻC–§ŐfZϡµőÉŮęq˝¨ęęS!ÂJl:Ó„e»›Í°ą«­¦ÎýY°řcP”tŰ~hö˘µ˝ĘK]*JÓďső¶Ľ 6| H®ÝClł{..:}{ńŞLrR°< 0›*L*Ř•>°ź^ľz;겑^xlä*6ZIQ4ĹÝéň eŹ ¦lÍ.ĘŃŞ6´¤™„çĹ[Ľś‰úm (čüÎ|ś±A ę ¨•>`8ż˛šh¤Ěżď1Ó$–đ ¸Äâ}˛~Ű0Źc jBĺěˇ:FĺŘ.‡°92{ŘnÇo;T.¨’î©ĚJŞ…ŐpÂó™$9w¤¸Ţ}\̵l×>U›[‚ťä*'Â^1ßZĆ0řm%¶=BSř0űůsh2xÁËHtŢ'ë§łŤ Ó9ކÎ!TŽÎŞctŽ­ˇs›Łł‡íút|ú®Ă9¦•ž6«˛LG(ż5đ´KkÁIŮđ2ÔŽŕ ˝@ÝI \–‰yW’RA ę÷zPŞt·ě¤¤ŇÍŇéq°Ůt{řÁÔľĎ %řđ%v.Ü™šÍľs™.‰HTŢúVŢčNµyŽŃDřWÄé~^˛Ţîçb‚Ý/ *×ý‚¨l÷óQ]ÝN®^wgąRqŮ\adí}dďFď®ĆżuFŚ«ôbąÝ3ÔĚW®J+Đ·`ÄĆxđv»ÍĚ”r†›%PňůÔ¬~źoí`QăŔavťß·'Đ !ýuŃ×.čsŘ{)q\Ťäď˝dý\¶1a.Ç@Őp9„ĘqŮCu9šü|5ţ±o(‰‚Í %Alv(i=±ńřj|t(a §]ô–§ËŞ63¨“h>;KĄ&m[újłđ>™ć+\fJOÍw(Qń ĆÉL¨w›Ąë&wö2Pbłc§.:ŁEÖşăí3¬»D ľ9ôŇĽxŇŁ<ďŁfz©:łD°®w1úA˙6ŕ,­–ś„é › Ľj|6Wˇ(H–Ó›ÝGbg›ůGŔJ°FŘ0ŘĘç+}ô®ę:é ébŮę!Ş…`sPEÚ`§VśÖX˛mj;Uu`zJeާ¨>NgHąĎ@ú,rÝ zqŰ'ë1±¨ ˇr"桺ą:˙q4é·üyh6W ç˛íçńĹdtXĂĽúNőĂůT%Ą“%ÜuŰzţ¨egŘ;ü®Ś7 Ć»Z¦Ĺ Ď|Áľ2Żç¨BćP˝2Ű©ŮlíĹ¨źź‘Ö•MŠ2ů–vţ®-ns;É\¬SKčĘnrąO%¬LDWĺů7ęŚN5ôrArh>ă„;'tP sč8% H›+Ś2ĎIˇh ĺ_CÍŮ–<ÔD7¬-laod§ëéĆĐŞ5KŻK+ÓĹâ#jĄ! Jŕó89!É DA/YŻş FAĺD0ĘŠ Ź*,‚Q 9 Bł"čCŹN_u50#%ó4PfĄÖ@ÜZ ”Y‘šmŮhઙH†¨ŠtBhŢČuĹĎólRH0rÓ;'€R¨ôVŹćĂÔlLÝŁë“¶âÉgTBVp)q”pź«_ mĚ×)a Ť†P:%ôPţŁ„‰ŔĘ&W‘”pź¬_ mLX c j”0„Ę)ˇ‡ęĆ€Ö(ašSBÚŮĹĺq%,¤ĐJXHŰ‘{ZńŚÓ%8>Ó/÷7VŢş’hxŤ´śë÷Oúí;Íň¬©eŕ=lútÓ:˝†@—ÄxTW˝^–o©zy®ôTW„Ş×KŐ[őş'W˝QđąŞ7ĐV˝>Âď^őŞg©z#¨>©ćÝçęŐ8”¸śÂ… Yó …ő-.'o!\VÝ<\çW——ŁóÉŃe"ś§ÇQjZú†gÚúćŮ·ŢwółŐ˛™™›5Őm©ťŠîčÚ x_÷GčîéşT×)>5U~+Č™€ÜQśŕ>UŻ´!_ĺc t60Ńş@âßÝĆd%ô1i͇—¬W!]LP"Ł rDeEŇG|K™{KDfßŇůČöú|K§r#“*˙łLâ™° <0E8Ę·¶IĎ2Őç!쀄ŁĆîł|‹d9Ë*b8@/UŻt1Ov€Qđ9Dh Źđ˙ä˝G …GXČHË€Ľdý gc UŁp!TNáĐĆ;qL7&ehŇOEuz gDĹęyąz˝ž‹ů*ł¤s{A”Öîů(˙™ôKhÉI&#-dń’őЎ‹ ŠaTN ¨¬ú¨nnĎnÎÇg]tJVqĐŮ\at¸Ŕ–©şŰËÓóóŃődÔťý“ŚđŚ7˘hĆhPŐ‚µ×ăęVĐ\H=Jďw‹ů—OšŁ› Őm·m¨äBh52§·úŠá×Ű™“ŢůşFÄ_kPÁKHůë®Âe]úScu±}gŹÎ]đ1+¨Ž[A*sB‹<†ôRőZAód+źł‚A„Ö ú˙NV°őŰ7¨’MdIäS\t˙ĎßLžá>‘yl2A'@µ|BŤţB”ZłL§AZ›Ůť!—đµ¦Öŕ§/žáKżć´9ąÄU‰Čp3‡o­÷šo/ĺŢ ,Öć¤~D°}uuţ˙Áő4ŰćŽőúĺ‹wŘXY:[Żőx÷_í6łę~…żŮ> endobj 263 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 268 0 obj << /Length 1489 /Filter /FlateDecode >> stream xÚ­WYoŰ8~÷ŻĐŁ„F O‰ě[›¦h‚Ĺ6Ű:ŔÝ>¸¶ ±%W’Sôßď̲ĺĘMĽČ€Ĺc8śă›o§“ó÷6rĚe*šŢEBZ¦¸‹ňś3kłhşřë$:w*ž.‹$UJÇon_%_§×“ËéDD~"r<ĘMÎś2Ń|=ů>ůň•G‹ Ź®'ś)gŁ0ćL8­'ZŞ0^M>OţÚńHI:ŕňĺÚť€x‰TŚg†d»I”ŚgÍl]tEÓľF‘€>(¤$łąćHţˇZx’Ęąfąč ‚Š.^‚†3 ń*¬Ôwřµqk=ŐĽ® KM˝ň››$•y\—°ě€’:âŐy‚˛ő‹íö¬ÂDÄó¦ÄqŠ’©ĚŻđń=«•©‡Ä7Űo«˛]Ímł:IKß~BţđŻ ňňO·4°đXÎĂZW{:~ [ßÚyOš v”'Š>-×ĹÇmw‚ÔZqşäúľíGmW,`Ś~TŞMWÂśE$܆[,Is4BpZŘmŠn‹‡ŞłcA7Jëŕ|ônYˇ_e¶7ŚgDŐˇ0ł•_:t; A2Ľyz± E€˝¦*Gd¸Céęu0ńŘYʍńxÚ;Ô©š{…i÷Ś–Ą7 +µKc4ĹĐő'‚좮ĘâiEßŔ•6'ü“ ĎfńbÖÍüč11&ža^ŘžxеwŔÂbĐwčĆFݡQĆzţX•¶’°öH~xŔ˙s;’M–1eÔ8ë]–s0¦zť…é‘4<`DiX䑣eľNhŕ·»‹Ę2&ŕ_ü*–0–IˇN—MͤuÇ…Ë<3) ů3:Ę™ęcŠrŢ×Ř >My"ËČhŬ˛¤ęĺß7?%VĆÓ±˘PşLľŁ~¶*f„<^ {^é€Ůů2Átfäű|sy™$'ŘäqH¬€ňý9#Y–«űŰMµąE ~¦ČCc8B*‡9Ľ†jwün8ŔYëřęO˙E†«˛Ř_?´’ć–ĺpú˙°RĎëi+i!OúŔJ ľcqGyˇ18ôQ `¦6¶Q*RěŚô«&SĂXSBÉ_¤IĎ+0k˘ ”8†R "_˝ó…݇λZř98f‹p?ăLA¨7/ -=łŹąçăé —O$JCŽ9Öű É™Ó:ŇÖ02$8«č-"“¶/Đö¨ŐŢŃ€ŮuŔl“„¶×őcĹŰXźŞqІ˘)űú ‹Ô™’?MçČ ®:bDýźÁZ€“˛ę< ”j#}­†Y8ءźňĐÚ†‹Ç˛Ţ¶X[~-łN„v %ť†S‹ |íżŰC·BÜ lh5sÜíĂŤG¨ńľ]ÂÁaě¬h9௷"”ďŃ€/kěéWĽˇŇ ‹?«ůř:Ěżž_—jcm €\,N‚…=@…Év¨(Ö5¦,*´ g,`0ě-0čpÚŁĂr2|_°?xXz6@ ˇc0´ľ‰Ł±_ÇŰę/h p !Î{©ü" ŕĆ[>$uß>řf?4ó€zkŚí›K¦2ű_3l°dRń4`$×/Śý=^R é}şôď.Ţ_š¬Ýża~Vt¸gIÁ)Ć!b×6nłSPŚcĆč—Ľv=źtĎČ'=AZAđĚX¦e¤Â‰đęíAi  5»ďł <‘fmżYÍŚIDSB·NŁÝűşÚeßRŻ6~Óg<żűxń ×_ő-j°6łÄ@·y}~ľ@$ńxľŮPcŠ÷×Űf^ÜŐřjhî VăôţPĆlOzČěČńzë ůGźůŻä> endobj 266 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 271 0 obj << /Length 2814 /Filter /FlateDecode >> stream xÚ˝Z]Są}çWřq|7Vô9šÉ§Bv¸ŘěŢ[Ů<3€+ĆöŽm˛ů÷·[-ŤeƸ•)Š*<RĎ‘tú¨[ŇÉččýǬ“ł[ÜŃłőĂöŮÝb7łEWfÉw¬?ĹfÜ{ŕBGŔËŤéô„aąvČţâÂÖH„ýúňüňů)®™6ŞcąeBľb *Ű?TÁV/2FăRđÎä˘ú ÔP Ĺ´ÎŰAĺm5Ł)3™ÝA5Ľî÷Ăať)K…ô}úˇŰÓ©$OĐ)Śđ˛Ű“6)Ęńz Łí^NŹËY±.nŃâ`2ǡŁ!D+«Íd‚Ă]¬uî6Ȃُn¦Vű]µ6ö©Í¸T+Cżµupä}‘ĆoR÷&H~Ř#Hgç˙vvZfˤm7Ő̤pib`źŽĎOÔŮ(Ę"6Ş”˝¤¤"ÁËńü ĺź ¦¬čĺh±&Z n żÔ/Ç$QO]“‚‚NoévÄZ— Vîq~á5‘¤,ţîKmŘ@G(Ý‹·ĆÓŘ—ićq¨*"7ˇ LŽP˝Dĺ6°U\nÂČa®ÝXð4•s‘ŚP‰ÎDŤhę—–Ů@Ťáćf…1Číľé[ĘÔ›"ńsď®Çž˙Ć0Ëłţ?#ţjsľă¤şD7Z’Č+%“łÓ·Pjt´Ę["ůÖŘa’ű2Í$oUEň&TäŞóÁčĎ‹«_’Ľ lÉ›°’Ç=vuuqU#¤L™0‘bKPěcü=.ÖúÁżEůŤ%•‹’îNk{A¸! »Â=Ů”ĹíŇä†Ý’ęFĆ2”i$d+¨!QyBƨ†ý_Ł4ť~Ű4o«­…ś)†öçŐŮh°źŹ±ěÚŚŇk)•Aú•Č?|Cż’šG÷r±Ş!rÍrE”+"]ł„˘[,YV ’×ÔďNH·)ŇzAż>ôp±7‚^ń ˙QŽŐŢ‚á©e©ÎZbřÖŘa†ű2Í oUĹđ&TáŞŢ´ŠáMĐĂ#hWăz\!9ËeDpĂsGpüqEFNĚĆGűťĺĚą#±/2»şc\üÎyÓ#EÉĺĂ­gřú-¨­°U-%~‘±ĂÔöeš©ÝŞŠÚM¨µ#T/P» hµ› jGĐNÎÎ_¦vf´ŁvfÔ3íĆ7Qě0q+dĄçë!Žß8âîĐ÷ą.۵ŻŐĺ6>83c[bďÖŘaöú2ÍěmUĹŢ&T˝ŞŘŰ´Š˝MĐ{#hý‹óóAôâbš’¤Í*Đi|Ŕ›]G‚{pc˛ĎC± Dp}OŇ F-ŁLˇbV/77ł©[ŹJEyŤß›ŐZ…ň_î#ľ€6jťµ§Ű:SPR¶ĂüČŘAć‡2ŤĚoU`~#*ĎüŐĹőčâcťřŠ©4m™·ŐŚL2®wm}˛qŮňKn·x>ĽóˇA]Żw˘mĎö˛Ż_'Őo`hȉyÚ’DGĆŐ—i&j¨*˘6ˇ DŤPť××ă”d9OŰÁĺm5ăAâƸ®ĂË‹óa=;Ô á:h.H 9.Đđ$ıQ„qKu@z±¶,VKWĎmŹ9ş>Vö2î’ůGK·7›®@‘ß"ĚĐ2cŠ–8Ľ5vĂľL3‡Ű@Uq¸ Uŕp„ęú|x}2ě_ťťÔńYÍ,Ěu­ŕó¶šńYëöĄwń÷űËŃ /É`0˘µ7©ŤŰĽŁB[&ÁXLÎ%°  W۵hÇűž19×íÖkë&ĺŐ–®I)5śű…cçĺô†¶©,IúßřÚýŁŚ“ď€ř‹ŚZn’ÉlZĐ Ţk źŻB>ťÍčͦr)ră×®±D…Â%¬XvŚeýő|±ĆĚ9č}hţN’;)Â~őS• ¬(Ň*č ^A[ÄĚ=ʦnÂnĹo#cý6”iôŰVPżmDĺý6FŐ$µ‚,IŤČ|#ű}đűĹŐ_ ’¤J“3p&`F: t ç,ś3`‰’üČ-ß”OÄCë“Ĺ?Ó•ß±DżYĐeر÷/Ľ÷»c»üU®§=‘ă4¬;=©Ýtě҉®’ɸ?‚ÝrőâY”OóúVvŻ 'QFaF|¶w«s%2Ě:ŮT7ŮŻŘͅǬ´çqÄŇ€űogŻAltžśťâo#ĺę8áÔţĚËĂvPÝĂJMˇ¦őí3;ŔXŔç–Ąv÷vtچ"ÚÁŰí‹°řźÉ!e/ź°4Ň`{:É’<»gŐSWî#5şž§Ň©żÝsÖ)2ä\GŘN˝™Ňa,Ě5«oąłX `ĄLŔů–0™Űz56e4Ěů~pićw™ Ë–<=hÍŐĺ`Ť®¨¸Ů×Té¶´Q*Ĺñ&l+ČŞ2˛#u”{ţçň⪛ÉdToŞ…Š¶*ý 3¸ě°OĹ‚­^dl>ŻÓlßđrĐÇ… 뎇YšĘaó¨D iµk}˝ś/Ż‘¶č>“2HRy8F×ý1źx/ÜAŃĘV1DčöŇ\'gçô‹Ćűhcö\&źuž6¸E”·ŇyÁVsçi“Cć!v:ďČŘĚb9L©0Éô$°Ę/ ľ„XY×>-r׾ZSŔ /—~ąůą¦x[˝ČŘž¦Ŕ(pä/780¬~“6ĂnÁC_*’ë‚^B‹DZ†MĘ…Ůß$pĘ ĐI!Á„ýÉŃ![˝ČŘľŃɢú"‚ýn·™_†łô•BôŤK[9“~}IjšőMsÓ N´xéÂÁĹôö_•4cmŠÝű´P±ř†SnA΄ăó^&23l¤!?ˇFZ’µŐ{Q(±Ľáň°Š‹”3kőţ«™Ű˙Ę2‘Ş xšäuŔť0qILâĹqäüńńOi VČĽď—]ţńË?Ędnń~V>ě§ă*nô¦çĐůXcéúŽ®}­ \Ě×ΰ‹ ŕÝŇÝLçk*s/eâňóčsÎçOSg ő\ş…‹§©‹ĘVł>áRšqµ;7G=ŕl@=śťŤźťávł˘©ŹŢÖŻ łFąXl·?´M~đ"¨l­s-\™‡-Ęú'€{˙?>qV‘÷Ź%ž9UĆ›{Gm˝/ć…ëý°žg$ő±¤ÁcěËŃřĽź|Ł·Bsş[Óťëm”3řîΦÓęCî,Śb8!X1˘aśBÖ{Bđ$Ë©Ô?sĚ›ěô¶†ČoLcváü&e) ¬Î]şEečh‡V'Ëń}X=‚»ď]űӪ×ôrޱ»‹ř°Ěb=wUĹ|ĆlCĐŮ’^ş ~O/úżŕó_‚tůQ0(‹ëĺ‡÷ďo‘§<™,—.=Ŕď/6‰Ü-0n-ď †ç|ęÇ0ł"ë(·6‡?»cŔ?($ŐďčWržşý˝4±6ŚĆ˙Ü쉷endstream endobj 270 0 obj << /Type /Page /Contents 271 0 R /Resources 269 0 R /MediaBox [0 0 595.276 841.89] /Parent 259 0 R >> endobj 269 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 274 0 obj << /Length 1093 /Filter /FlateDecode >> stream xÚ­V]s›:}çWđÓ˘čI}KsÓ™ćˇM'ÎSoŤmćÚ@7“ß] 06ąi;Íd&ČúŘ=:{vµďÁĹZbS.Ö!ă†jC­)1& «Ż‘Ś&µŃb›Ç‰2şĽŤYô1ţ¶¸ ® )ü±ĐŇP+M¬Pár|ľ~Łá* áM@‰°&|„1%ĚÚpH.úń.¸ ľŚ60’L¬ĽG|°wN#Ś9h÷u HęűňîđvŮ‘GůeűT.áŮőRÂŤWxşÉ÷UĚuô#ć&Ę[8hm”ůO{x@k5X튪ÄIUëÉ-Öŕtűšjç—ë8«U+VÜÜşŐţԞϛ°R8[ůpŚĺ8á–ŞC»{«„É€? ¬Rî=ŇçÔťZÁШ¨«ü÷ĐĺĆS1eŇ(beÚSŃ 4¶đu`pd±ť“©-ávŕ˛jć¤ě÷=\âWź Ő„(Ľµ·p5«˘M^ćMÖhz·M‘[ü,łÝ%‘-1Â˙y&ŃÁ6fž¦˛§ÉO8~ą‘„ü§üVő‘YDśőz"*Z˙őBŘ×»Át—gIŕX‚9´pć>Unˇçn›uýpź9=ő?Qh0]m‡ÍŁ˙¨öSKŕh…ŇeŚŇhŤkFëHďtéPĚwEě”ëwfÍŕ¤É»ú(óU?S”$ł'ăŹ|ő>ŻŚ˘l¦Ü‚ń_—A¤ĐωÁV216«ŚsB…"¶ës ëÄ®›U(Ű×ÁéM˝ S)ÂR}sH’±šÍ˛A ‰ĐvÍaŚęÁcalôB—JŚ\Őć8Ĺdľć´?Díä…{Öx´\ziăD3JŮŶ}üőś(1Ô€űŰO·çlĘT®ţN˙<ť­9źH2…5ËÎÂ~ŽJ ÂĄ}T˝­—Qé”cNŁ|uu}w7‹m"Śß<ÍŞ¬„Ś”Šş—Ł&”"|)ę¦r˙ W›ú•ÓjçĆbá7<X¬vţÇřvŕĚř‰ŁYÎsj ¤})ŮÇ‚˘–ŠĄ˙*‰[ÉÄŘ,‹„`Dh9:üÝd)#ô•pzS/Ă«‰żg“ó×o0€W•›]Ík€µĐ‰>˙R&ó]Ż‘_…0 Ů”źěÚSu¤éÄäą˙_r|[jô¦ú6±ÁĺAą8>{žÉ¬—Dp*K”’ÓNz;ÉŃŹ‰ áá2ĚŃ’TňPÂë»ĘĹvhLđ}Wp±l3´gđë1ŰŚqŮ/şNßM·§€ç׍úöĆęŘzějżčJřţóůę Îżq]´Ŕ=ńf‹´uő»‹‹ň‰\#ĎN$muh–ůşÂ>łŮä¤Ěç‘ă KÍL(…‡-Ţ`Ě Łt­‹|ëżśŇ4NŚi¤ÍŤź,Ísendstream endobj 273 0 obj << /Type /Page /Contents 274 0 R /Resources 272 0 R /MediaBox [0 0 595.276 841.89] /Parent 259 0 R >> endobj 272 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 277 0 obj << /Length 2532 /Filter /FlateDecode >> stream xÚí›]oŰ8†ďý+|)cÖ¬(~Hě]âşŘt¦IÖvf°čö±•Ĩc{ü1Ýů÷{?d*˛tË °‹˘@%KÔńkńŐŁ—”r>éĽy_tQ’u'w]š„ĄŞ›ç)) ŮťĚ?%Ľ×§c<9»îŃä˘÷yňˇ3śth7…´«Ňn.r˘čÎ;żw>}N»óNÚýĐI SE÷+¬§„*Ő}ěđŚŮőegÜůGUŁEú^•sÔm+ř%#©ZŰŃdŘ‚ +XňkO‰dş<”oQ ť{?Źe¤Č|üi±Ú6ŤĽSŔ BÓÜ69âŚ%‹U/SÉ^Ű}ą5·ĺżWoÜé˙M«ĹęŢ4XŻĚnŃôX–”«Î~4ÁƉ„Eź­VČ ’洦ЦÉŮvq ř­»a˝> endobj 275 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 281 0 obj << /Length 1634 /Filter /FlateDecode >> stream xÚíXÝoŰ8 Ď_áGç6kú¶µ·k·Ý: koK¶=x‰ŰKbźă¬ë?R”]§Iúµî8D¦(’"¤t0<{•EŽ9«˘ŃY$dĆwQšr–e6M>Ćzť:ʦĹ0QJÇżź E|4ü~ćŃdŔŁ7Δˢ čs&ś‹-UčĎv<`’ô¸ |@Ű ›HŸ5^¶“ˇ’q^狢)ęŐs čÓžBJ˛,uŔÉ_/'DŇSY+¦T‚Š*žć@*âyи<ĂVĆMk‚Őú |^iâq=î—a"ł¸Đňqą°©Ë9MTđ9ŤËMłmA“ G"s†´ű°ţ˛:ş‹ÄF»řč¶Y\Íş–( N\ S)°ł¤É&LŕĘ1ÎŁŔ.ڕקDŐHf˘%˝” č »ňlvآ)C¶ôćCÚ˘ţ†Ô~]qG“ĽZ/o¶ÇÉĐ‹MÚxŤkŘŇ8Ăň8§fśĎç¨J>ÂÁ|ĄÉ3€ ‚L tf`˙É/6A·ŔÉrô“ą×¦.¦Ĺr‡uúĘ—ä $\~µ Řh¶"’qą¨ćŕÓw´ĘaY~ť1 —^MTŽ«xÝútľMň&T%µUľZq;Ó©sŢŞhŇĚ›ľž!ĎĺxÓcXšN틾{z;´n÷ÍKýučý‰í€Ë%“ÂmCŽs6@ŽđY Ů´ èÓcäQG¤Q†´‹–u{yTd bz] ˇ5ł ŢťĄR6eŮ>± 1żc‚Ë˝ĚüR̨¨w¨h`3zu*ş¨u"ĐQ€Č&2gÖŇ=.( …ÚĂ:;śQj{@xŐńëŃéNh´;SŘŐpőäy¸bZł„–Ýjq-%ĐËýŽ`¬eBŠ}éÇ(Ç $č$žŐVء—kć´ŽJBŔ Çă—9NŽß3Ȧ[ľ“¦˛Č€Ż™LÝžC%s™ŰťE«¤Çëŕz¦O!¬ë¶óůOëĺaÁű@Şżx‹ ü9­4«%şÄĹr^ć“Óš<Žż)[63 îFŘô‰N»˝kpąjB.E€F€Čëßhf]ĎařÔCŠ‚ôn6„9>m/ +Ëus°>ëó۶3!Ef>T…ŃÉ/;PGńA!±mąD8¦HXôŔ{XNęľé ÓFÓMJźß—sŹâdžŕ0Ę(ČM¨fŇ.ékű‰ íË [U¸˛Ŕżń ?ř.f4“,öÝśšSÜáý[¶}Ş•ŃłEŃfâuŰ 7śĄě„6âv×ŘŔđ -[Ś9/¬ůlJĹłőŘ2ĚCĺg{"7!„đ'°ëń¬Ź)é~L1 .éż)ż¦¤Rdiś}AżSę0Ą”eF=NÍĐ㵦Z’_S't3A˙†éď—۰ĄSÜţJŘj1 „ć^nÉ Óߡsyýp´TĚ)¨¬­üąÓiy%=f׏GK8nşýü­Ľ©IŰÄfşJÉţ,L›˙aúv.oĆçD:ü]ĺŕÝ‚b°•†s€mŤCtĹĆ{ŢN„Çzăý¦_i‹ńŇń) vĄ vslD Ű4h¦$',(×çÓv˛ 7eMB\Á—ôńvBđŃNţ·ÂÍÉ‚gqfB˛Đ)Ühĺődˇď‘,$Çľy”dŃăµ/Y´$7%‹Ť7ĹÜľ ܲáĆň/ÉÄ'ąbD·yÁÝrŢć-łZF(BŃ=B|ź… ”2:®ňs ?ş*˙€Ř}¦ŹË˘Î˙43 ěucĆ\˝żÎ+úč_”ˇ}q|řçź´q ÂLËšęůłg˙ÔŹ«ĘGî_®ëqqVâk^}^°ĺŽ_ZÁRŐăá-â âŘü’쯟R d‡If”Ť3ŢžĆŢůmµendstream endobj 280 0 obj << /Type /Page /Contents 281 0 R /Resources 279 0 R /MediaBox [0 0 595.276 841.89] /Parent 278 0 R >> endobj 279 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 284 0 obj << /Length 2014 /Filter /FlateDecode >> stream xÚĺ™ÝŹŰ6ŔßýWčQJk†ź’Ř·Kšk·{‰hű µµ¶q¶ěXrrŰżţf8¤,ŮÖ~¤îˇE°ŔJ¤Čá×ĚŹ3ă“Ńóć‘e6UŃä62gŠŰ(Ë8Ëó4šĚ~‰u2:ł*ž,Ęd¬”Ž˙qťřuňŰäÍčŐd$""˛<ĘLƬ2Ńt=ú8úĺ7ÍFłg^¢Ŕ‰ÎV% á÷ ˘€EŁ’7?¬lJzLđ˙,¦ '#âGÉĹ)Q˙ga©ĐŐK†oNR[zë‹"ž7‹/“żp…f őŮĂł~h¶K?WXm°đů]QÍaëĆ‚s~ľáÇž/|Ă®ôtXzł\»5n ďŢ×jŇž®îŤ…d™N¤áâ1Ę'u×¶8Ë@wIűće»`u×ŰÄŕ¶ĂżéňW.´{ťąůŹC§î&UűőMb`´ŞăÍ-=oî`*MYSév‡m6k*ô@ń«’ŢŰqe\÷¶Č=°ůÓcúđwě-;±0%™Ń~… Ú¤ňkxH‘š8OéĤ֌#R88RÍ2f°™ĺń«źá®ŻŢ%9őˇ"3L呱– #ƨd6·çAęEŤ;˛^Ă>ا¶§úŃţęeßNN,Ad [ôU‚ Á)FYĚĽś(Ĺ73Hŕ.5O Ů·|ś€j%ŐÜěo“Ŕ—G ‰TŐËyč7;,ß¶sĚZţ^> ]-\pŚ{á‚D@‹|pG{\áśÉ,ëqEBŰ7|†Ś=a|÷îZn\O‡áń"/ž-±Ex¶b‹plÁą®h•”÷!Fú‹Â˝ôřđî- 8Ĺ Üůý3üzŘň Iˇă<ó•B-„ҧ@¶[psd BČ7ą„ŔTPŹĐ\®w›9’ˇ¬ë3î ěŰÁč-äa´PÚWÁÍń\™őVăĺ­Ę ÜŞä (Łţ˙Ř'Xm­@AĂÝ‘ô­ ‚¨Ś#w3čȲĐä"†°ÚÔĺ˙.8\ÓZ^Jů5Kyţ¸Iôő]2ĄB1Ŷx—ŔMŕô Ő^Ejż©*Š­[—úvőްţ&™QďŁ]ś»! v]®Ý=uGĹfQ4ôö»ľŢņśawç‘ 6ťŘľź›¸Ý »m˛ó†©SńgZZ¦ěźkiR¨<Îm0±ôVű§ö)ĆÁÇę2v5haľÉ%,¬—-şNŕuSź35ÍŚ5éleČz˙tp:mŽě%$­Ë`f1f­0‰™ÇŹOÚ Č;ĘVŽ­µívň’Cˇąľˇ3aLűő˛Ź«”É<ďşř˘Â|GĂUüăd‚ E­»ű}}őNJKŢáŃÇ˝sÓ>}ŻKtëÂĄHsŕȆb益ďuHt0 .ťwš ‰ Î§Ůřg@+jG’O”#Čé}}5«}űĐö;^aúwB~ çţ¸w+ÁĎ”×AĆ?•ŽË”§tÉ 8Í­Čü"ť.Đ"ĂjtOੲˇôħ>Ŕé©q‹§-ľËö߬>…h–˛<7ŁpB Lx"Ë8—›c" ŘŽ=¬x•E~™´Ą—3Dcü| ˙”Ř4Ţ-én|€Ć)yz‰Ěĺ)oPĎn˘őţl’ňřçJ@íďnQ÷ţ`ňřôäX3u6=ůŔö1Wh–¶Q ‘BPúO(źO ´9®á7°WOEęÜÝd®vëX¤Mę,«‰Ű;_KNa¨®š˛j(iŕ>»D<˝Hw !)ď4ťá#Ž˘Ť— /ô›Čk,h7Ąźu\cźňN5âZi‚/w|ŰOÖ7ęNëţ0śq¤’GzpSĎ$HRtŐߊh<‹-?Mëô$ŚC¤‰' Í*ŘÝËPí jlľĹ}lëýć®’"2–Ł˙ČĎî$g|DżĽĐ, ąč? -,mć¶ôF¤ŚŽ·Ĺ<ÜÂPúś(Né˙™>Vĺ ™ołÄ‹ß\Ôő4ń"0nµĄŹ”„Đń÷W/żÁúo‚AúýĂ ­n¶ß=>Ă<ťíÖ)5ŽżŮď¦ĺí}ÄÝĽdŐ™ŔV¦Ľ<+×GżA¬îh˙ő·ô”ś§č_©4ÎE8Ť˙đ‰Śîendstream endobj 283 0 obj << /Type /Page /Contents 284 0 R /Resources 282 0 R /MediaBox [0 0 595.276 841.89] /Parent 278 0 R >> endobj 282 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 287 0 obj << /Length 1602 /Filter /FlateDecode >> stream xÚĹXÝoŰF ÷_ˇG©­®÷-ÝŢ–6ĂÚuMÖŘ@€¶Ş%'dÉłäfůďGO¶;K»D÷AňHů#ĎgÓÉË_ňČ1gU4]DBćLqegynŁiů1ÖI*tćT<˝­’T)˙|™řMňyúvr>ťĂźŹ2“1§L4_Mţś|üĚŁrÂŁ·Δˣ;s&ś‹V-Uד«É;)IGRÎP? Ý+č ËL”IŸ5^żŮşuÖŻę¶«~íűőe˘dÜv=ęwh×Ěj !Ű'n8šŁâ7ďɬ݉Ěăv ÂĘg´s[ č˛®^ °H±ÎN…`ÎĐŮÄŞâ‹Ů”d wrúA„źôkXżę‹~ ß“D~RÚ’$Ф_®Şv& ´ »ĆNI%ˬó˘ ßŕ©˝"ą ^骦ýdîâ˘)i°IŚ+ü7÷#´ńkŐyŇ}lGŃÜ'©6YĽöô Ú[zĎÜŕz—E_ĽHR§y’ç6v‚.T úa[–e„,c ”ČáD|~ “Ë‹I đDfĘ#« ă" $są; AT:’uö°2,ýŐ˝Bx:uKGI#2-n6$Íë“宩ۢĽ^atÔ°”ÂÚüř ĄdRćŹbĘĽmş»óDf›€ ŰMť HpŚ-S@ÖőďďzYe€eÂF˙17˛Ň‘°‡~VYĆ,7»óPAt řvľ]Uň‚]­ęaďa+ł ËÜ’ßuĹ@!ŤĘöéźż>˙JścĘK `+đŚŽn¦tö|`W2 ^!T·ŢCáňz ý~XĐg†¬ŢťH|«±ň‰Ä—Rč–ę¬Q¤ýŃ­ëÝ­Kío˛CŰ0=QjG‚üŤ‹,ĘAIKnŐ owŘXđ0ç „DĹ7륌cĆéÓŠY}”k÷¨0ĎĘAŤÚś˛* „—Ý·°.!`ŔČȇy#ĎŻ=´ÉІŤ‰Éâ's.YČG -J÷˛N(gÔ‡|¬ÜŐĄ6@¶l6áFlp6 :$Ô>›0%Šrć‹aJ%îMERęŕh-™‡°&%Á|ç-»G6śyd+°>Ł_k¨ÂĐoĹ0žM‡J*@¤•tĎŚŇş;źˇvŰđĺeĆzT˙Ů®0;&m×—`ЦC6ŵű5JŔetÝGă»…›bśëh-˙:ę´$Y)q=™ HŹřhš˘R|Ěc•Půl&# ą§ś} EgţFĐ-Ł?QŚ5÷$" xC¬«˙{Y ٱ,9–›ď1'?´Ć˝ł#a˙h…%+¬őV ¬ŠV»µ/\ŐeŁâŢ’h— }ë -đ#zűpĽţ-PŐuëĂÎË‚Ž1ÜßR„âxĺ#uŐnDŠŹÝE»9ŃľX¦!LÉ@ČšłíâČ ŕA®  ^X;źÔ0ó¸ŔwÉş^Î ßdűý%=Qp{Sů· %t2Ë/ÁS¸‰jyß\WŢ%^Ô í{3—AŇÎNßgCߎĂ7ĺű¶Ż‚Z·E?ŚÂ ¨IOŚAµđč0†Áô xŻ‹®ó¤%µEľÔ‡u¤Y^°hÇnVUCóĎđżóhtČ–[]€„hQ»Ĺ0 §4mhîľěđhűŤ7ztNµŮTaŰ .ň„‹p‚”[ÜôáŇŁńmĂŽŞ?d9Ŕ'ÖOŁäˇMrŇ˝ BAű}1„ŹłPuX°TÂN˝ľ;$ĐŕőśU4»KG‡ď¶ił©6üe ńŻ6íŇŢg·f×kÚlô}}ńę9®?đ>7(s‹ÜŻzů˛ÄÖĘĂzM ç·ŰÍĽZ@ŢĂóő¦bMuüs” –Á“AA’Pq}‹ŻóúžnJż ŻäÜ&in”Ťs9ÜĆß,÷Áendstream endobj 286 0 obj << /Type /Page /Contents 287 0 R /Resources 285 0 R /MediaBox [0 0 595.276 841.89] /Parent 278 0 R >> endobj 285 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 290 0 obj << /Length 2556 /Filter /FlateDecode >> stream xÚ˝Z[wŰ6~÷ŻĐ#•V®‘7Çq·ÎĹňĘr»»Ů<(2mëT–TŠjÖűëw 4)*ŰňřřXÉáŕđÍ`0ŔŰéÉ럲!&éÝ€ńŚjZS’eé`zű9‘Ă“ÚdúGBČäôjČ’‹á—éű“óé PřcCZib„ĚO~?ůü…nOčŕý %ÂdoP¦„3x<‘\řňňäúä(EZŢ">­b%\š*‹mXRî ´p™H~•Ě–»ü „ŻuÔ<ÁI¦ T…^¬Ę/N(ę‘Fµ9EĄB$‹Ő›¤´µÝç…{Xä¬×>ÜÚ_'µXÝ;őĘ˝Ć>[ßągĺĂţŮÝz 7ËőgÉ7ü~͸÷Ŕ™Ś€3b”Ś"FZd˙¦L7č űÍŐĺŐó1T©Ä@SM˙Ž„‰¬}¨‚®Q¤ĚŤWHŔ;eXU!;o b‚HiúAĺuuŁb)Q™®ˇşľ9;;żľnň!%)ăľOß G2ĺÎd #ĽޏNňbV.`´íËůúqłĚËüU! ťBÔ˛ÝÍç8ÜůÖRçn‡,X> 3™ćŘŹ\©·±Oµ!`R˝ ý^×Á‘÷"ťß¤0î]ü°G..9ýxń®L ’qÝ 0ŻŞJˇ¨b`W§“ÓO 2ň”0‘‘+˝ Ž#¸–ž"VO¨ _Y_ąlhf’p@ŕd~lęPĐ»Á+®wĺŰÝ]C0*bşĆőu Ć §Ň+›ÝľŐ]¦řűf—ĽQEš8ľŘ:ŹşZ—®0s^őʎJaŔ^ąu/ś‘®Ń‰gPQŃfd¸}Ł˝•±>ĚL1pz˛ł˝˛Ă†ćeş-­T•©uˇ ¶ˇ:fl}`«¬­ [0·ŰÍäcÓ&I Ű[›` \ż5´§Ń2Ť>bcšHĘbú‚BŚ,ˇűp>mşŰ đë~ y]ÝĐ NĐ0ÇĐ~ť\LĎŰ©G :s9­Ct˙HE|ă®:)ŹyĺnË~™›%néhsÄPëVżčĚ÷ů‡rĆ"q.Ý)Aů \ĺ…. ŃŞ§Ąg¤ě0Ă˝L7Ăű@U1Ľ U`x„ęĂű€V1Ľ Z`xmr~ú®IpJ Ź®¨±Ç+řYd´˘ŽŮř¨ŤŮVń2»şźˇ3®~g­éŃĹĺõgxyŚÚ},÷4'Sş'nď•ć¶—éćv¨*nwˇ ÜŽPávĐ*nwA ÜŽ ˝˝¸<ÎíLIËíL‰gÎßDqÄÜ®÷ OŘC$˙j™[ăďsǬcÚľ c–™IŢy#eÉd:ÉŰ Ş@ŢNTžĽ1Şnňö-·š'o íl|yy~6=š©ÜůfŘ´>ŕMťż‘Ăő11&üDŤŔóőjÄće@ůľîz[y\ľań@ÓžĽo¤ě0˝L7ű@U¸ U p„Ş3SŃ ˛©čDć31˛˝iuf*R“%Óa&|t°vOm`7Úžđ‰‰&üZH{8_1+rÇ×(ŢČ]öłĆOžÓ~oÎęž•ĎW‚qîoÄ 'Z9âPu­ĽÂDö¬=će^lŹnFîŠfľ05DfA”nWŃď$ÎÂŢd™ű(Äű>ő˘“o!íBšŐŹĽöZ֞دáx‹©#áý‰[fě“>Űr:· »ĹAőĎ.\ěÇďÄ Ţ¨ĚWĺôi“wţy:˝ޤ ÉC-Š MŔ7>ăşsŹĄ`v[Âî„´ŠŮä“ßósrüνÝTAŔÖE†#pŢÉ…‹|i-ð}°AńŇwŔ× ÔrĎďh,ÚmŮě’ŚÂR4XËNj˦ć+efńW“’^×(RÖ4u«cĎ‚Ś5ő‹µ,’%áôݶKËjÝuŔÂďç‡Iď˙k·LI˱ř‚pŢ’Ł’UąÄ&âé™úŰ–“‘"Ű<¦ NݦL¦ŞËžŚ KţSč˛ďÇ%”YE¶Kť2ŕŽ$LóÚě·´ąRoi&‡H—Ş(ŕ á€¶f8/<ŇÔg‡ţq5ž 3žL›MŐ𡮤że c”6–]ŁHY ľ”™f5|×WçgŐh{PC'Ţ^‰ľ1IuKlV›1n2ŁV?#űĘÍßň`fµę‹Ň¨ŹRc§xüŘxéĘŕ+0n‹XýìxĺnÁ«˙Ë*’ +Ë“1Ôu3 ţ€3¸[~ţ_®í®ĺ«WŘzV·Ë¤R[‚Kś×]ÁW…N>Ćž˛jcŐöE-ż?ĹgÁ…j™)«,Ň©Ć¢úň•{şF-UXď‚«:î±+@Ż‚ą:ô‡YÚ醂×ýĘÝ=XPĺ¦Műu‰Ť+w[ě%|ěÇnR›aŔ^Űů{!öś¤Ŕ8BazŽx˙,Hr§mäľ;jÜ(Ż(?ěu8´Y)Ůzމ3ĄRÁH™ňBąĺoLŢřÔĹýÍÔs÷>/Ń»ŞĚ†ëpÁŤ—Ą?Ť·ŰÍPá üĚřÎqzR¶ĎăOo&8´Űb!sL8iŔrű8଎ě­ŽWh·ĽH÷EîÖN žČn'Ë ěă ĺp TŘ}S[ň‡ŮŇäú|ňÁ•gËe´,‚ oëž—AŘFźůăşxr÷wncˇąśeDgáłăćy ‘A™ňZX˘-& š˙©ś¤©Žu4Ž Í6µ,s€ÉĆbŰpľ-ębpq‹ŻUďËĐr—†+ň|źtŽ÷ö\öĎöW8ÜT›»!Rŕ¸Iř˙gO :=#őĚ`Ý Ń?ł+ÉÔĆKŇŘĺö†ÝÉ_„ CÉd3»·Ăëîľ !¤›EŻÝËžőĘo˝ ž»±ĄŞO•Ú‡™ËŤ{i#v¸ľźý€ĎÎÎRÄÍAo^żľĹPš&s;0ÄÖżŢóünŤkžâ>'«ÓźI4z śĽ·Ńĺ“釞SšÚ„Všd"ŚĆ˙*N@endstream endobj 289 0 obj << /Type /Page /Contents 290 0 R /Resources 288 0 R /MediaBox [0 0 595.276 841.89] /Parent 278 0 R >> endobj 288 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 293 0 obj << /Length 2739 /Filter /FlateDecode >> stream xÚ˝Z[sŰ6~÷ŻĐ#•Fq#ŔĽ9Žşë6±Ľ˛ŇîNšƦ-MmQĄ¨8ţ÷= )ĘÝp<ž1!<ř|řÎÁĺÝěäÍĎz’4áŮí€2Mxś”ЉÖÉ`vó9Ă*ĺŃlžGś‹čôrHŁóá—Ů/'ăŮ ÄđGio3Ż ł›§$ľúkCśÎÚÇ ˙?ÁGÓrŠÓ˙Ďň‡|yJĽoş_§ŢdŃҡ#Şc’@{ÂfĎŤÉjuUeŐfÝ0 cËëAX¬­X•MdÖ|ĘĽŚĐâĆľ°ĘR çŃ€»lS†LóÄIíCx `ÓžÄakě°:¸2ÝňĐŞZşPyPS>°ŐŃ…ÍkD€íÓôCsÂI (ÝJ§ü• :tF9IŐ}€yÓľ`Ă`HgöáĽpnŹrNř®Ű´/áŢ FˇEOŢ;LaW¦›Â} Ş)Ü…ĘS8@5ů4›üÜ@&`€@ř{Aćlu#€,;Č>Ž?N¦˙kĆ\”p¸9Ć“č|ąŢ3’k(űÔŃ–(m€fye)˙ŠňO›™—(Ç_…  ő}üĂş‚îĆ_×›˛^"“_‚›ÝMO«‰ŔŘanş2ÝÜěUÍÍ.Tž›Ş«ÉŮŻăYSn5ŕWý@s¶şˇIJxŕÚďÓóٸťšaÄ ´ÝřPĘr IU"ńŤ}ިZ<äµÜVu™«#»Ţ5Â0ÔČęciÖ/ő¦IU1ʬ¤[#8AţÄv×ç…ΔYÁôĂđ­±Ă weşŢŞšá]¨<ĂTGŢ´šá]Đ<ĂhÓńéű&Ác’˛€ŕ2N Áń :‹Ś–±e6fµ1[§DÉČěúw†b\üÖ̦Gx–× WŽáŐ1j÷±Ü)”ŚY?ÜŚä¶/ÓÉí^Pynw˘rÜQus»hžŰťĐ·ChďÎ/Žs[Ka¸­%ßo|Ä×f˝W:Â"ůWĂÜţî ł iű‚Â,#q¬z"ďÖŘaňş2ÝäíUMŢ.TžĽŞ#äíZMŢ.hžĽ´łÉĹĹřlvt{ť3«ÍÜłi|Ŕ›]ţ‚ëbb ý¶ËĄ/v Q¤ďvĄ·•ÇŐKXBi_ę»5vŔ®L7ű@U¸ •'p€Şs§˘d~§˘™Ű©‘m§VçNE’ęh6ÔÜE…Íy0Q€9|Âś4př;!mŰ~…=…ÍĘÜň57r»ű»ĆOŽÓî@ŃŘÎŞ—\ NF“žŘĽ5vÍ®L7›ű@Ułą •gs€ęÝisŰ3đçI?¸ś­n\ °±;¸¦ă«ËÉĹUs%((Ń"ăÔlRpťF_Í6$Ü.›;žXâÁ7{DíĚď·•ąÝ‘[|3lżi‰…ĂŁń2(*—^×~ŕŰ0ô ¤í|&Ĺ>Îő\âůLVfy•—ëŁ×6ĺ}ŰÁP*|únżŰ~w¸źůë¸p08vµwvš“&†‘«bç`)[¶©í€Á=$čţýÓ"›‹Őâs](&kî`P˘}óó¶đß@î·9ń‡sŤa™›t…M+–Ďl8ß*_Vł§ŐńV`÷|E]âćtĽÜí;C;hČ–$!aj­[d~[şâih©ŞŁ|w¨ŞąËX¸úgM:|€Řh”­ľ0w;ęŃŮ6LřŃ P‰č~»Á  Ô´~ŰpŔ˙\ěóÇ”M‚3ë¶Ë3¤ÄĆ1˘ŽąLfą ÖĽLkäŠů2în逹™{Yßšq}VL]®^;k»ŐďřÁufçĐ3›ŚkůbS=gBËزűÁÁ ·aCŠ\Ň:ŘŤ{^ú±9Ź 3TPş"Č-óż6u“]ÉÓ}®sÂfZÜŹó…‰ Ŕ“Ôtśd¨˝m=oĚ„…gţÝÝH±ń.ę,~kDSvţCÉVU}ŤŰÍ*şÍŘÎQ °0‚~4'"&jĆÔë]Ü‹ŢqŞąĂ“züťj•ŐŢÎ ®:3Ťďh@=k7ë]7°wŤ'‹ă÷*j÷ĘşWĽď†—ĚĎ–»h!ăZ©hŕPb/ËA´’Öu™»r)Â÷!Q‰nI?—)9˘XbŤAč&IŰm;gĚ|1›˛Ąi[+µ$‰ â‡Ř_83÷? =’ Ő`Řî:Ť˙{9™5‹f͆*řPŐĄźßH\ţµĹ7ŢÖ(0Ö‚/ˇD$zßŐĺř ŚĘ\ÜS‘›˙4 ľIękźVËŐ/š—˙F:V«ĺŢs,íúBďONsvŞ7ÇDţšÉ±Ś‡#BxŽź]Ř4ř śö&i&KVľ˛?!Öxí'Ł„2ęîŕÄđî~osęďY’F«˛ŔŚďf°7B ’$r@S@őC#áMŤ¶¶š!”&T)_źëŞ|í–揫Đaɶ‘0`¸ćł‰oCÂ`Tňę•ÍšgŘx¤Đ¨î©=#tŮÁĶhôĘeŽ;gĆ[q‹ˇö>Ĺ Ë=99“‰¶cˇE4ϱL;Vá hŚR›MĽr„…?ÔŐß™űZ`ÎŚ}ĄożŮÄmeBIZ×ëĘťg6⛂Ľ›NUIČű=sŢ#ÂôHŻtź7ŔĐ(1؊¨‹`ÖŘČ~wT÷°ĽŚY«îÁĘ)ÄW,~䎱3„+» r€Ëj˝ I`!$RłŇ´1ú:{§X%˘UvW ŕ ‡> endobj 291 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 296 0 obj << /Length 2648 /Filter /FlateDecode >> stream xÚ˝ZmsŁ8ţž_ᏸv­$šo™Ś÷.ó’äg·®ććăص6x1ž$˙ţşŐÁĆąZ.•Ş $ąyÔý¨»őňazöî·d Šř`:a¸Żqěł$‰ÓŮ7O G÷¦‹l8â\xç7ĂŔ»~ź~:OĎ‚Á@ůXĆLq9¸_źýuöí»?ťůOg>ă*ŚR˛j dâĄôřŹü<Ł×íf(ńţÝ/±MgŘ{ËĽńÓ» ~ü ˝T‹r(CŻŘ=,lĹ!‘đ%”Š?̰˙ŚúlJl.~ŕ13GŁ ŽEڏbI§>nPtK®ńąĎ@µ®:B%pLřĐŕo•Ń+`…‰—]̰–k=ŕ3ĄG­|©đó’Ô ßáuńRö·Ş°B7:Ś˝'(<š #±ËíÇĎ8PŤaLIRGşZĐ+ö´đ´Ęp\±"3`ať­±Ą(µt]5ę÷–ş_1!-ei>}ĽÔ#P4‰…é]IXƦÇ}‘ŁAŞŚSü˙ll×’…,öí÷EĄ9I7h÷ęĎŚuY AâDëÇťřš6kĄÇ^‘o—? ѱ݌]˙l^fŮ2 —j±Ü’–Ă0bI¤j^k™ë˘‰CT…™úL…ˇî>ŃÝ«˘ÁÉFý}¨$Xk—˝7?Ž]n† T;đoËĽúŢÖ{Âßjő…rÍČT¤żö•TYf›˝ôꥇŠŠÜL|đvĹśę4MÝĽ@…Ż€´Ź–łů¸>†44 $SB#jÇíR°ßÝ\ÝĽô®ÜŔ<™ü´‹ĺ,ŕÉa'keŤaäi@ÜŹ™TAýA6nˇ 84Ş~PYݨ‚É$n ş˝»¸ß޶ů±(ŤNßÇBň" ůłŇLlĽ/Ö›UVe3b9ÄŔP5}ÉvwŻgú Î|‡,XąŚwm?˘Ů>čÁřR &EÜŹńaGŤoűtżTÖřť¨Śń]T—WżźąüŘÂ&ąv±˝`3˛ş±ÉОíć|rţµEKđťth‰ÄŁ˙?~ ä©Ř’C»ËU;r FQ„-ćÁ>jŤL°ŚbČxᇏA]ÇĹ,Qáě’ü%ËŔ'żC¤¬ČC1|$>‹`<î°Zdµą­Ňj·m ăňÚË-„Ľ¨¨RPř9”Ä/°ĐrF &Ŕb ‚𙕇|D˘yÔ_€RŔčúň{aÇ}„éÓí#ú@Uű.TÖG8¨Nů>°Ő>˘ ›ő¶»É—ö|“Đě=$.ť}´ŘŚŢDĹ'ÜLs?pŮ 1ĂцrJCŕĺĚćŇśńfü´oç0żÄýpx/ě8‡Mźn÷Şćp*ËaŐőÝôú·2Çß 2#«™dľh ű:ţz=ůw;ű‚µuℹGŢeľÝ3˘z™gsođŽÔŁ¤ĚŞŔÄŞĽ§ťŘqU<—ŤŮÓr[‘ď­ôQg´Z4‰y®óôtćäđäżťí)J÷Ŕhˇ¦ü¨F;ÂŽ2Úöédt/¨,Ł;QF»¨®ĆÓ?®'źŹyĺ^°YŻÜ‰Íxĺ†Ć&“ëÉÉĚ-Ś|ď@ł¬"ĘÁż˘ü“*ł˛´kéHÓÓnBŘüˇFĐĚżîwe˝4ťí÷|ţŻÜŚťöĂÍ˝°ăÜ4}şąŮŞš›]¨,7T·×źÇÓ¶»MÜ4#«š X !Ř…öÇär:>LM7eÚ‰câR©7ßJjˇgěUKÚµŃî¶:ŕgi6zsŽVľÚ1; Őnő±Ôë—zű¤*śÄ{äŇIN?ńí˙ĽĂ!¶ě‰á{aÇnút3ĽT5Ă»PY†;¨N0Ľh5Ă» Y†;Đ&ăóŹm‚ăÖˇCpé+Mp|‚źEFKźŤU‡ť(Ëfq’Ůő{ŠÎ¸&ř\Ϧ5ĺ–ĺ5ĂcĂđę-¨ ‚°'fײŽ›ştóşH5­; YVď!ť u¸jNwಔŢăúpyušŃ‰šŃ‰ä/\6¶8ŮĂ˝^敆¦Ç¨ýCóµÁÚ—î8vÉúZwÜÇúŽ'1ăˇč‡µŽ°Ł´µ}:yŰ *KÜNT†ą.ŞnęöÍr·š!Ż íâúęj|1=ążÎCrÉÜŇiźs@K“ŔŽź5©°ÔűůŤT¸ČsŰí’ (?4=îA"ż…×ĺR1ŞžĽvśŔ¦O7ű@U¸ •%°Şs˘dv˘™Ů p‘í§VçE¤oЇËÇ ŞŃGĂ©>|ĆĺÄůF&{|›"-3â«“fd´é±˘#gÍis˘¨e§Ő[.9¨BňľÜń^Řq6›>ÝlîUÍć.T–ÍŞçííbęý^pYݸŔÁúB4pMĆ·7×W·í X"\g¬ôŢO”÷Cď~AÁl®ŐÇţu{Dß™ço™ŃFÜň§fűě@ 잍—Ůş¨Ly[ÇźC7*ĽÉ˘P'b0 ‚oNĐđX&-ÓuVeĺö佀]ą:t¤„íP_aÂmw:é7§ű©˝/€ëşĘĐ\Ë>Đ4gm #ó Wg›˛ 6.BˇX$“A„,ţŢ•5r„µJhSQýA}„]•íă-źů<<©#×Ęm~4ꓹ‘ó*˝ą2Ó0n©-_žQ-šźŰŞ(3Sµ0¨f+ó:/ěođ¦ŃrK/Ú ëű9]7ŞĐäE~r‘MJŞ,Ż¦Ď›ÓŁ@ťýŘŃm&®Ż ”MNééXĺ^­®Š×u X¦v—T7ÁĚu©—ć1KCŕWÚÄ éřyjkPôůB_z©­ł°Öi Zev??s”XţµŔÇlŰłoJ‘ľSäĂÎСNDue™;ë˙0I<}J»ÎÚšÖ¦¦±qŁ*!vmé&źî@–ÜҶŻßĽQ’’cyĺq_ŁŘUŻńrŇ'jŻ ¬0Ű!K)<í“”uěL«{Šj—ÚTBíMµeö×®˛é9Óę3Ęióq±Ô Ţý“Vś 1 Ň´čŮ ĎěÉÜÓˇE€ľżźëČ%šüĐó`¨ÁrQěÍÓ%Žł©šĎî˛âQźéĄ–~mF†Kśgć ©¶żqYeőb ×â©Y˘4@=9vŰfll\¬…Ľ7Ä»8LJńwîÖ’śŃ^ 9Ŕ茖tE@lÁ4Ť¸„:ˇs8048ţôˇ&¨lČ}´fÝLŤ9ޫҙö!IÇ»óVG« 5jgϏ׿`ý/ÖZ†äzÂ#}7ďß˝›ˇÁ™o6ZcřýbWŢgóŮ[>d Odڻ䰺 ’×yJü¤op=“„±xčű‘އ‰ĽDZkü `(^endstream endobj 295 0 obj << /Type /Page /Contents 296 0 R /Resources 294 0 R /MediaBox [0 0 595.276 841.89] /Parent 297 0 R >> endobj 294 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 300 0 obj << /Length 2742 /Filter /FlateDecode >> stream xÚ˝Z[wâ8~ĎŻđŁé»-K˛ĺ~K§™Ýô%dĚěžž~ ŕÎfŚéLţýT•$#b0˝»>99ÁIĺOU_]$űýřâí/ĘËÂ,áŢřÁc± y”yi…J%ŢxöŐ˝€‰4ăţxž÷Î…yŰcţuďŰřăE|ÁĽţ—E^*Ó0ăŇ›®.ţĽřú-ňf‘÷ń" y¦Ľ'8ŹB–eŢęBÄÜś//F˙ŞeD^ŔăP¦Ş)BÔ"b"©HĚ塔 i,C.SôgÉROÁ4=Mň<Ű…fÂśŇPĽś“qEĘsĵăâ2 e&ŽK´0P¨ťÄ'ĄŃؤé3ŰýČ4ĄŠ`V˛žf -,̤¤yF)€Ž˝4ŠC%M´˙ďŰÁ°§bÜś*X¦h{źµ"%‹ŹÚ1°˛GŘ| E˘đŤnűW@ł8őëüVĚ—9ăŔ&I ˘w›őf°!ĚĎ×˙¬ŔŚŐćyŐ˙K<| ˇŚíČß#ő‚„q sŔü}>-ÖŰ O…?Es8)ßčĆ]ąüúĆp˙ú€”ŤYČbŤ~p7îiűß{±ň‹ĹěÍĽfţ|˛ž-s+…pƲ,Śg¬Š2óŘI Ćát«XŁŔ*×:ăď3L ´) Äó ĹâąŃ缊@"4é;Fčç|ýÚ›ź¨˘˝@8·$UáuµU´ŰÂ|ĄĚÜé[eFíč@Hć/ Ľx˘®×ʍ§,âôP!ăĂ®óĹă<8‚pĎÔc©Çň8ŮŹĹ‹j±Ę‹ťąół—>„ŁHxŽ[ý*b--ĐăÎĆě/ŁřtPCX"Ů5 ˛»Ó˘•'e*¤»ö PŠvŹÜ|Ůއë"‘ÂD1ă Źyµ…‘RůŰMTźăĎt#Ź «™n_ďV÷ÔŁÄëÔ/ôńţąĘŤVbźbĄoLt…€–=|Ŕɧa¸Ű'‚]éXÍÍ »!vůš99š 0GI É%Ő´iĆF 7'2&dí˝Jç’Üź:]BfŘŁWeţn…{ŹžBZÁÔŠ€8uŹMZ3xűˇD•ŕŮDhľ ‘\_nńŤ§iu‘P&ę;Ł;ÎÍŔ»!¨Î0wŁËv6 Š0' -;·BWąß?Ť©¤6& lű`´«3GŇĚuŻ SÍ1Ś»ÇąľžčÎhlíňúzZět8RäŞpg‚ö™ š#´ Az6Ýź¨Ńl=¨ĚuÓ épkFí·^šĐSG–˝~Čl2ÁůgÖl@\$tQę&b!ž”ůź»|[ÚĂ’I+ »ŹŕôĂ'Ýk˛„€‡jž" I-˛6ôYăé·@pĎúö\4Ń8L Cu¦iЧ`÷Řô.G„DP¸HÓ˛)ׇ1ţ>giȆ˛&Ť¬‡@üŞž ‘ND,”P¬iĄę˛r˛A»,ÓIµ(Đ—ÁĄĐ„[]c–ąĂúb­€ĺ÷Ć/°Ź5}(--ó¤1şWˇöFŕę@•ŠűGćrű&—I\µ+‰™@î˙ÚË€8Ë]ţÎ Nť8•«J­ľ.ÖŐ·¦T5™érig­yLO{ĚÍ|Ę|SĎHÓV÷Ş'G:1Š µ¶Ę)ĐÇ0Ż*t2FĘ]?ŕě äÓ!J†P·ęÂĄÍ ęStÝŢܾ̝<‚ŞZrO@2ŚŹ•đÍú‘quĽ~´˛GÎx ĺ­„deűPyŰ@Ĺx( ŕu‚ĘČjGĹ’PŞôŐčîęŞ?5ů„ łNů'ѡNŔÂ&ä—ĆC°qZ¬6ËĽĘgÚ±`™gňŔݶ»)í?ŰŚ«Ë%0^XĆ»¶ôYw¶‡Éswdű˝°Ó¶7}ÚmߪÚöm¨¬íT×7ż^~ľţĐŔ&y¨â´lFV;6¨ ±¤u±Ý^/ż4X'THÖ¬L„ňű ZäG’Ź€Em˝ŁhąlQŕ IRg† XDŚí3X`Ş•–äÄĎ}6>–Ü@| ę:-žAňK:Hm˙•d\PAH~)2…"4ł"Źeó€a:ĎÔÁ´ç$’ÖV°°jăňÚ:çq]Túd˘sÂ÷ŐgşÁä×…Y]–ÇBD˘yŇ]Śŕ)8 ď(F8ÂNĆۧ5Ft‚ĘĆVT&F¸¨ÎÄN°ŮŃŠÍÄ,"šţ‹z•ř÷^¤­u›e%D“,=ŔÍ#ć˛bCfzCŕ…IŚóË7ˇ%O{šc]pX¨0§č†Ă{a§9lú´s¸ T5‡ŰPY;¨wăÁ/ d,żdFV;2Č"q€ěK˙Ë`řźfńĹ(Ö$Žyâ_Ż·;`F2µł-˝i]Š=Ě„֫ĺÔ,„‰Ť™3ç˛1˙k±­tě­hĹK§3˝ř5uůšĘôÉěČšĄŢx…ĘŤĂĘ'ý±]ß`ô^ŘiF›>íŚîUÍč6T–ŃŞ›ţř·ÁđÓɨܶ:*·ałQŮŐŘp8ž­Üâ$ň/ń4Ë+M9Ü—.˙Đ7ó˛4khĽr¶$lýÁÖ_Ó]Yî÷žŘk¬*â ßtma'ąiű´rłT–›­¨ 7]TŁÁŐ§ţ¸nŕO»fdµC“,L!»Đ~^ŹűÇ©é– ©Ň; i˝Ů˙´ť“*˝­-¸a_‡ŰęHśŐŹ,hëQ/|)0; Ą°úTŇúeż5T8…1×{KF:ČřŁ·^‰á LJvDđZÖi~ë.íôîRÍîH–Ü{Hg¸Ý®šÚ-¸,ł÷¸†ýËM^ë Ăš×2Ę×x„đŠD–‘&4Ţ:Fh•…©<,Îşľž` ®yM/Yč ”–Ü5±SCěę5ÍÓ0’]Qz/ě4§MźvRwŞfu*KkŐ^w­&v4ËlÚűë›óÔVRµ•ä/B6¶8ŐĂ”–yĄáë)Žßqčű2§.k4w±ľ‹Ł ŇUÖ{÷ÂNł×ôigo¨jö¶ˇ˛ěuPťaoĐjö¶Ałěu ] nnúWăłŰë<Ö±™[:íkh9$°pM),Ao/Jáb˝¶Ý¦P\ŕëÉĂĐ{”ČŻ~™b!¤®ně;I`ۧ•Ŕť ˛nEeě˘jÝ č™Ý hEf6(\d{×jÝ H2ĺŹńŐĄNč…ľCŻ5'ôvđďdNÂ?¨dOoSčWĺŔW§ŢČő¦ÇRży&N›Š${R˝ćIÔlGáŘvšÍ¦O;›»@Ułą •ełęýes»ăç…I7¸Ś¬v\`#!p űŁŰÁͨą Vn0Îho‚«Ěż§Ý/8yńÖ_|c·'Śť“íÉĺ_™ëŤ¸}u—ĎŽÔÂî«ń2_•9ßÖyŕ{ĎÍ aăóV"Cřu§˙ű®‘ěiµJçĹČ+úTCdDEś í­/ěG7Plm&Źú(şzęńSNݬ×řę´}Ő\źŐŞŇźŰôµÜčFýá–đ? ®~Âű?ŮďaŚńM”ţĆňÝŰ·3\EGţ”>ĺéůĹ®śćFŁň1qשąś)ŹwPâGzIý¬Í&~ÖÇ8ŠŞ5_%ÖôbëÍendstream endobj 299 0 obj << /Type /Page /Contents 300 0 R /Resources 298 0 R /MediaBox [0 0 595.276 841.89] /Parent 297 0 R >> endobj 298 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 303 0 obj << /Length 2576 /Filter /FlateDecode >> stream xÚĺËrŰFň®ŻŕLLóÂĂ7YÖ:r)˛V˘R[ĺř‘ … Đ h­öë·3 (€”’ĄsŮr•9éééw÷ôčýřäí?âAâ'ˇŚg!c_É Š?ŽĂÁxúĹÓĂ‘ĐQ˘ĽńC6)Ą˝Óëˇđ.†_ÇźNÎÇ'bŔ?1H‚Ad"?Qf0Yž|;ůň5LO‚Á§“ŔWI€mÄC¤ňĐm×C%˝´J—YťUëwHŔG-†”ôă(äľ© Ňb9‚‘v ‹w7—8P^9ăßúx¶‹yť-yTĂdÉĂyVűÝóGýH?1LôCZLŮaBN‡#™Ţ ~"ŻĚ‹ˇŚ=`‘gë’×uYevęÁ9Đ„řésVş=0űŻůc*őJ,2×92RĽ’IYÔYQŹźV/s˛»ßöߡđ(d‚ZňďšÎ2ń¶E˝Ěpy yęD˘x‚ ”MĚpm5Ů Đî\ţ9–.łbÇ˙`¦|J‹péă¸?GűC]Żnë´Ţ¬_aÜ2N,u)šÄĆZ„ĄTťlŞÂ}NqGڶB;«lBÓůwÔH1çŮÔ.şMkV ťeĎee®GH&ĐÔćaťÎ-˙3DS.»R«Đé`©ŢN1ňę;šDV˝(.Žg‹ňń&-ć/™.p¬MäY×s¬ÍQÓ8˙}hŚ—.PZÎÄ[öW0¨2¦Ťwç(‰99–pĽ(qů‘?˛bʨŃ$đ7í‘SEîídĺĚ­Ęę*ĎX Ż5š|ţđZ1†ÄX»dŔ$Č ‚đU€]d鏂*x–ą‡qż?”ű:_fĺ¦~ŃŃu$–G¸Žq«ÉHzkbś…Ä0Ź9ş8!ŔĐkQT÷ŤĚ†Ýç§ävÖ©şŚ?>ää0J#ČáŚD÷y¬P ‡ßěßśAčÔIťMy˙¬BĂç ă@ XôőÖÂČ›Ą9ú®ß˛39Ţ>Iˇ@gDŞ}ĂÚ•Ńoż*m°D"ɱ·vCŮ®Ş[чB-|§„÷ŹÝ0ŰDűÍ–|ż§.1*ňM,»u‰nꩱ.ÁňG‡öł§4i!˘ŇDDl'äÚIľć,*ť| >ź“$Śô“ ~=]Ę$ľIt?a!#şÉÍ^\´3\ĐG)ë÷w«bu“ĄÓ_ĐëŐÇĚîŘ=IDľ”vÇď †#5ňĹ˙’•ůô'ü”¶äŹ" Ď€˙něĽJ _°Ů° Ąh͸_…PlĚps‘ć ýЧ-4KoS¬ó9UtÓĆO_†Âů)˛ţ "ôÖůĐ0ÁN6çč·’ŕ?ń\ą )?ô e/Ůî´d\#Ţő˘; Ľ ä~?E˘´Ň˝Wˇ?ŇŃ@kéK°(«r¬(o(„˘ćŰj×­˝ ľĆj‡’CänĂcü7Éą.Ôô5ĺőbłĽ' }6ĹăďýSťY3 ŤCµL¤ ‚¨¬…-{^qZ^´0Ä|—±qWŕU 4ŔůZĽ,‹VŞLpdv%%™-ËéZŃg9ŮŘf‰˙ßoóRµ[Âßcµry^¦ ‚8Y«Ôngąś$¶›A›‡ě5âfĹË>ąXćF2đĹ)ř†ËcJŇ*VŢoĂÄPýóâĹóK^Ô_;"T±.ÝŞ´Ôç•—8«muÝ*5¨'áŰŞ¸ďĘ:+Ń~šz“USĚ-á˘mââŔ4 ˛ŃMD]y`#ćőŐőóř H‡F ¶Bóšŕ/TÜü®Q űu‹ ąÉ$˘9rS‡*ˇ| 1ă(TY\‡©!¤řh‡ŞŰ»łłóŰŰ®=„~(\Ny…a(ůҦCаµń*­sĽŽáâ¤\®Ym#ţŽ‰Ů˝Wm&ä‰\l®gX˛.OĂX»xĐÖýGÇÓ=„Ř$:’ę\ű5Ď ‡’˝ É©}KŇĹŐo§—:„ĺÇ2: aŐAÂLHˇ­EŘőéÍéŻc”ˇeęÖĄ2 U.¬`ŕîDNĄýH…vמF—R~¸ú¦‹Ăř t» …Og˙HD ŞP±cče1PˇČÖ<]&…Żš$ćî#JËz'[Ř M›QěĹ‹nl¶9×çPJZ(ŽŘŁÄ1\ +ŰHɧ¶Čö;•…9ěUÇ Şq«CT9żjQőţ´ëT ďDáq貸Ó±;Đz‡®›óŰëĎW·ç«ÓÂŹu˵TPW1NĽűtĘŰ?±Wâ“>‚=bź®9Ţ'ÚObąŰ!Ů6č° łĆJµĺžžZY»fZ_`(ţŽßQ&q[őW#ßa»$đ.°ňV!ä ż¨g żUÖÜńłéŹŻßp˝ŢôţUda°ł‰7Ś”Ţ7ČƧŘmŻR ĺ)ż¤đ`ĐůřëđË(ČőşyÂ5ë8lżÂ'?eŕĹ`c÷.S~dŁeşy–}Ź6ßóé6•¤8žćö%1]4·YAŹÂŁ×›Ô®7·ÖÎMµ%C\jdŘŰľ€OŁŽ!šůWž„÷Ô¨:öMµÎHXďýŃdGş…!UYZ;Qăw0ě×üŮ:u«Ut…á¶ ‰]Ď+ěŔyYÁň9 ¶öuh°Â7އľ‡‘D€‡č\}ővW¨'lĘođýs÷íSÓ«tűÝ3s-ŚtÚ<Í.Ű ©6Iö¬ť+l_áŢOîíl)nuťÜSBÓŹbL§Ż¤nßKR>Čú—.uÁD‰rĚG:yö¤«»ŻJ8ĂŻJÝpłF›ö…üŃ/Jüw˙ź/Jpý”b€o2F˙/ěÂxF[Dś8Í {Aő”UpUĐ %u¶%” i­!ĐĎ‘ U€Úl–y±Ŕľ]†ŤČ´î`yMz]¬x‘›ÔÚűđůěgś˙ŮiË9ýé=‘Ľ{űvŠ ĽÉjEĂóËM5Éf%Zo5Ďü˘'DÉPř$[Eu&büDŞ'V‚¶—AB‚Ç'Ź8rÚř/*Šendstream endobj 302 0 obj << /Type /Page /Contents 303 0 R /Resources 301 0 R /MediaBox [0 0 595.276 841.89] /Parent 297 0 R >> endobj 301 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 306 0 obj << /Length 2054 /Filter /FlateDecode >> stream xÚĺY[oŰĆ~ׯŕ#نî}™7×MO´‰OěHóŔH”%”ud:˙}göB­LJ\áŕ…ń6;űÍÎěĚ7äO7“—ż¤$ĄâÉÍ<ˇĚ^”‰Ö1F%7łĎ©Čr*tÉÓ›Eťĺś‹ôâ*ŁéŰěËÍ»Éë› M řѤ,-5)ąL¦«É'źżÉlR$ď&áĄIľĂyAhY&«‰`Üź7“ëÉż{E’sF¤6C˘WÁŞ@¤BůË}-9@É5“„KŤŠ~B+©N ©ś™ô%AÄZIŔ&MÔc«¨d¤,L©;Ž‹Ë’ČRŚSNY®%Qň .;˛]îĚ Ź¨DIt±3‘ÁJJ)­Ť…Ŕ,Ń#FPkäë˙\}ř–Ţ ÍĎyAúIr")őat呲|ŠˇĚľë«×—bL§Ëu˙ÂוŃ8đ‡Ň=vŔ§Ízó×uđ·ůDjZăéŐ¶˝…ĂÖ޸»sjö§çšôüQČ"Ë™ÔéŰ÷îř-c&m—łđRĄ‹j=kęY.)O?|şqB÷ëUcŘ2J(sVÜ-o×ő $ vüசzŤ°ş(’zEđ RDKÂÔľ"ÎT¤ŻşŐTŤ»ôô±CÁ;¤(DĹČłcM0§+wŁžÜ(/ vxo"(i¦ Ą U#y˘`ĂIPěÝŚţ}nÎŃĎu‡Ţf±sE¤‚‚o…ôľÝfŁ˘Ű.Qţć0iŇŤ˝Ýâ(’Ěj˛OPl=o·«Ş[¶kwŻťăQ§•»\tÝ‘ä z govVcµľ›×Śx\‘iŕ[MŘ”s´‘žj›Ů7ŤáŇ:ÓĐ,\Ö8Ö†¬MŃĚó:đµ ňögËŕ…÷+Ü*ÎFbm„cĺ Ô†v˘™y°tŰ őÜáÍyâ ĹoÎ RúýńŃŽčîq Îmxú{VĘ´jîëW^‡ŽL†Š`téMţĽ\w_Ë |çE.ĽA¸eĘ´«ú­»ą­7»u±˙Nj ;Ó-ĂÚ=Ć KŇ-v÷ćmM‹ËóÇŰxąőŔé^Údů”>ÁýQP=´ĐťřŚvőţęń^ć”+ŘR¨Ęň”äLąOÎAW)s{0ġvČ’öÚÚ1@E9ě˛ň<¨Ľ®ă¨¨"Ňč=Tן./___BEĂ6yŮV1Ç_„Ăć…dZoýLJÓvµięŇ-ća(]°QŃwľ``6ľźN]=±±3żÇ0h2#BäÇÎĎÝ™sţ9|ʍ<“ë{]‡=ďDŽ;ţ zżÜľôöýďżľýyLrb> 0Żę(0©ŕTĆŔ®.>^ü6F¦ĐČ]0BRÔ°¬:BbÁ:HžA!6Ć9'Xĺd^Ś%`ŁŔŚ#iĚ<Đ%RAW;(ŕşůÇ©şßwK_w0ٶ]T]Ô* UUąsć+–Ý“-&m¨;őv¬š0Ą0P?ż—…#îWgiµ­V°y·wOÖŹë(8á<›(XQ@‘j˙´EuíŻ§Űşę,·Ă«ŻX9‚¨w%\@6©š¦'t»…Ú60 r™T;:‹\ŕĂyĚ ¤ Á-Đ­©D†&CÆç'y}h9zĂzá~…˙_Á&X‚í>KřŠŹ…şRŞ+^Lëeŕ"č^: ŃĎ»żěÚ ń*”—»ľ­ZřŽmęÚ+{¨׏§’Őí~ŹfgZÔ#ĺ«Ŕ-:VbČU¨`;§kěV™ĹŤču;\ă`>Öß_‡¸Ăť…ťRXŰ+ Ű›˙l#ćHiăDú‰Rµ6˛e4Ó!‚—†5ŰTh9”Z ę@Ť–ÂľŔpűçv|g ý öś”gjř"ei9ĘűĎ‚*˙ٍ<óŹQýc>Ć%ä’3ąľ×uŘóNä¸ăĎ©÷űHÁí;HO4|çľcŔ|Ă;©á$É’(¦žČ»pÖ÷ŘH)SöŤ”2)·ČôőŁŔ ÍŐ°ł Éq{€S Š‹żĎŹ#E‡řq‰ř±9ÄŹOĆő?äÇ”`%Žóc ڍ¤ňD~¤ĎÂŹ#e‡ůqŚďŮü¸ÁŻwőq†L QŇś‰!Gk˙˙ĂŹSGĽăÁW†CXp˘ĄŘ#†M‹KŻŰ)¦„›¦ ›ą‚4¤Ćíz]ăqÚŽľ^MĚÝ{ Çs÷=Ä}ňpĎWőĘ~xj+Ď˝żW^ż4Á(äAö“‰ăâťťoćDđ»ÂqţÍ $ Îźŕß9TĆË˝„ö ßËbśp µ¤xţ—čÜëÉwŠśSe"Hi¨u*pÁQÚ ę^Oŕ[˝đBD `Ě·Ş»úžń߀őŹÝĂ5űˇeđĄ =ë9¨”i˙ž°Ů¸‡®ŰéĎ.Äű?†×M~!q…Ý~|őňĺ¬á"ťn6vĹpţö~;­ç-–„ímMÖ#ť°x˘)tu¤.dßY ôŕĘŠxᎬ(T–ÉUjúţ;.Oďendstream endobj 305 0 obj << /Type /Page /Contents 306 0 R /Resources 304 0 R /MediaBox [0 0 595.276 841.89] /Parent 297 0 R >> endobj 304 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 309 0 obj << /Length 2593 /Filter /FlateDecode >> stream xÚĺZQsŰ6~÷ŻĐ#•–A·Ôq/I“صĺönŇ<°mkN¦ŠNÎ˙ţv±™•éńňŇŃŚ’‹ĺě·‹]?ÍNž˙l&9Ë31™ÝLxjHň‰Ö 3&›Ě#9ŤąÔąfwĺ4BF//¦ź|ü”L'ÉäíIÂDn&_ˇť0žç“ű™ ×^ť\ťüÚęAIhů ńl Â9ăÜB»ŢT€dsşZoË×MłůGŮ Şý!% Ëe ę±ÇDau€ Ăx˘ťČKT*D´¬¦iđi·eMërÓÎîÖţ“Ô˛ş%µłRp}C×ZűÁµ›ő N`’aŇżb˙%ăÖç2NssÔ *ý‘pÝ!5üőŇ‹§ś‰d&/ËR&2~śř‚qaú©ďuĹ2âH$š©ś·D`gT\0)óqP9]èxĆ”Ń{¨®®OOĎ®®ş„ČXĆ˝;ľĆ2K)˛Č LĽ±RÖůŢśŻď7«ÝTAtHXš«=žoćsď“Ŕť›¤ÁęqjdĺƏ©EĆĂöŽY6’íwĘŰŢÉ Ű~ T­í‡PyۨŢ|říĺ»7Ż:Ř”`&Őă`sş†±© šjŰĹËË—ď;¬L3ĆŐŽ•ť8™ł,=‚´”—Y3“G˛Ö ¶a! s™3ý„Á_¦*(»\PT#/X‡aC#ëYrUZLĎ’+ŰąL%Î%®ě2s§=«n ČÎ#×\v2J `ţňöY6+`Öé§`a2ߎK¨X-űe¤,Î%Ë9?¨ĚvM@µśtĎ e¦Y˘ĺŽ,‰_ l¦ ™(°¤ĚrňŻ^ś_N „¨î@aôJ·Ňß@f…qŻŹĚ^W(ëÁS*3ł‡ďęâě8lA˛čČĺ?<úE2ÝF˛Mµ9ß`¶•ŐëŚŘl.¦"Ť /âľűţcÓ”iáű˙‘¨dkmŔÉéiÓ¶qM„pW€˘ú^ŃŃC˝úč«€Ţ ŹüÇŚ¸”V‰óë`É4x€eüât~F—ČĎ »¶7\ħá˘n}ăőńśĄnŐqjŇd@x418`Űšá˙Ł[i@=˛YPřzŕLčŕ»Ç=Ďiś®w>c$ÝşL B›f­QěIłĽ/×îć‘?Ąđ%‰ś,ýët—))‹©ŰQ?Dy•¤‡P¦tÖ›–sXL%?)Ô*LÎ-ŮRK¶–ižfaJ+ Á`oűŢ˙¶ ¶Ň5cJFˇýŰ3Đ:»Ŕ &ş8żšŃ­zŞĐđ÷—˙)‰÷ĺv[ܢ™Q ň «¶tł Ă/Bňo»űĚ®7kw¤¬Ü†ˇ]îAËɶD®}±I,j¬ÔŘ–Őb»ëţŤhĂ':5µÓ ~CÇö¦Çmsź©‚T©ńiogxúé=Ą;ŮQc÷˛EµŘöÔ Ďr^1ÄĹżŃĆfßÄ<×;Ł›Qşľ–K¬´ŕ(˘×3´/¶°Đ´“†'uůůˇtžo/Pací‹ ´qÂŰ’xłSN‡ž"UaxX“„/)°MµbýĹ"­Ýú톮ßÖěÜzŰ>­/Sg-l´cÁ“¶Ňů ŤÝ¨¤‹Të'}Im‹Ă> éŕ彜MmťT•¶Ýx2XÉ5őÜ©Ý]CBÚľs*t‘ ±N•ËŇAäęüŇFĹ`ž–¸8÷:§băIµŚ—\ůŰaO`•Sů‘śKA*ť ˇ«ĆŘ4ŃU˙0@N Ţxá˙ŁănG7ä:ńĎnĄ&H±AŢŻ–~®\˝’Â"¸tś3ÉÎĘ[—ŃUŰĺź+G/¸ďKěvS—Ą-uń¤ąҲ-…ĚÔŔbN3ńţ~]‡%N_U/˙ľUý…ť€őž›qęşť®eť¬ęƀ䋺!H®¦ ýmĘů4ç,5jłĘÚÝË ~TŢň¨śéCTGĘůQ°ůr~›+çClßTÎATt¶´zŮłÖ‰ąđĎĆÉU7{Ü/ËÚĺ ŁV˘ěŘ&-‡H#÷Č޵/ei"˙Ң•±D{M+Ü€ŔFAŐm6Ŕ({öL°QĽçfƸ¬g,?Ë T0ůH~¶SvŘĎśĚ°źŤŞőł!TŢĎTÇül l­ź aó~`»ľ|×u Ųś^Ć1I´Kw÷%Fäţ‡\L3™đ˝ Đď a» Ăn·Śr0÷—@ű=– H?e.G˘đNŮa ;™a ŹŞĄđ*OáŐůőěüç2Ü€ŕ8 2§k™d@CdďĎŢź_ţ«›żp x°R¤¸×Tm€Ůܧ›>oĄ]!¨)7YcjRĎ] ë·rł˙®üĎŇÖ÷z]m‡Í…mú¤¶˛9n±ň_ ß9*ńnyŚŃcĽČJ-ÓFJze‡)íd†)=Ş–ŇC¨<ĄTWç§żśÍşś6 ˇÇćt CSśis{vyy~ŮźüaYaĎ0âÖXkâé&˘,ŰRßEă ,ŕăDžT¶©ÄnËáÜŔŐüđG{: Ţ4í›sěő{Ç‚BŤŰ×5ĄFOö:ŘŰňŇ9Ďźč;ŐÂţĂß-yQA7·®{€ő;,<ÓLË‘Ľ*PvĐ«ĽĚ WŤ‚Ę{Ő *çU!ŞaŻš÷ŞAhΫBhż_ľ™ťő*ˇ í|č'”µwč¨ížËűć g%ő×ÚV/í®‰Ý×ő)˝ŘąˇĄ¶‰v[«Ťořf¸ČíW$ă0|§ě0ĂťĚ0ĂÇ@Ő2|•gx€ęĂÇ€Ö2|šgxíôüÇłÓŮŃÍ‘ćÄqϦÇáN°Ő;ë¶É!÷’bŻÖ}˛ůŢžű—“ďA` SŹD໲Ăv2ĂUKŕ!TžŔŞÁ\~d>—DćrůŮεsů,7Ńlj„‹Śkşbß@vúŻäAR°9gôE]_€]R}°rß"§ÝƵŐ]4Î9ú>ă€iHů?„Pňůx’ôÄ;E4›j‚CŕÖŔĂe:‘ąĺ ŽĹěK—Ź %ŁMqK/íŮשH謻M7+ÜÓµ_0˘Ě Űj7Ż6tÓîîĂńŐůéxýźÝ9âĆ}đâůó.pI4ßlěŚáó×8ެŃpőmÉŞžŹ=Ó ‚7ÁIQá­Ý=~$sÉé&I6Ť fĽ¦ý‚忉Ż endstream endobj 308 0 obj << /Type /Page /Contents 309 0 R /Resources 307 0 R /MediaBox [0 0 595.276 841.89] /Parent 297 0 R >> endobj 307 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 312 0 obj << /Length 2427 /Filter /FlateDecode >> stream xÚµY[sŰ6~ׯĐ#•Fq#ŔĽą®;M6Ť][nw&Í,ѶfeRˇčz˝żľçR¤DÉެv_f‡ŃźŚĆ\ŤĆ€˛äĘJZłÄAŢţ>a_gOŘ[Ěb]›őV° pŹËđy[¦DłX#:€Ň†=+ň<›U‹"#P® /€¶nĽďđĎEč.kĚß‘o™Í±ß…ő°ýŐ}Vö¬XđöĂže4ĹĹ×,ý·úЦnµXł¦l˝4a†ŹWަVY^MžW/ëH/Ý üK]ëFĄŠ¤ŹAúجĄŹí$Íć(żiĹ­<7Ʈ▩? VV%ĘE~×#¸Ú‘üĹ]'í]Ęň;ú˛g)'Ł%ŹĐöč“đşxłQč›!˘kľÍ×[ ńlÇ8ď†DP±3…±Ö6‰äŁb]eóWŞłZí—03H•"±{yŃĚxq‹‰{¶iŇX¸xłM#A•°ĎŘ`5´F Ż=môěźç—#Ż˘Éî6!w[×PżX haĄęŻj^ăł|‰&ń|Wg§`<`-]Y¦­yV‰ÄéŕĘ׫|őÇ(c[4Öő ú0~­ ĘŔTO^ČᣠÁ˘§?c›8}řŚżóŤŁŮ‹ůá\۱cLŃŢÔĄ¤Jß›Ç[`=óU)„|˝¸ň<řtĆő~ßđąúâ?ÍÄ’ >?7Ţš •0óZJ ˛„c†™ŠE;’Űjť‰86Ă–ĺ|·BH!^cžő˘c ˝ŤŐ~ŻEP*îŻeŚ"ŕŕ†65µňQË ˙„ôŹ±í—ŞZQqY4:7m.‰0ŞÎë,źc¬˛.ţ”#‹Íb“qčö”ݳʿ¨ ±$y®%ˇ=ĂiĹę9LâăC7ĄŰ°fÎż.'ĘîbÍüëK\Šv°]+´ôÝěżÂó C703ś(`+sćAµp`Ę2iI6qŕ†éĆźP¤ç+4ˇ(Ë_§!×ĺą´SHcřY¶*°ÖZc[!ě@§Â[ů_¨Ńwµčc×h±©áQŔŔdĘ?Ýj4Tí8dYĘJT)ĄÄPÓmHl¨iVT­„‘:ŐĂĚýOŔBʆISţi)ë“6ďÇëKÖő¸Ţĺ–˛±ŕ<^k;›wO<ß®˘1šW+ÚwőŚNô<].űt+ä şU±H•"ÚK’HE•Â"ď÷Šců˝xęű˛Č«Ż;`´˛QţIŢě«2Zí®>#”ŮŞ±víFő%+ňÍiʵuĽ-ĐŽ—*ô©y~€Ë¶'°Ž ő‰ś@3nwÜ*¸ř|±ź5HÚ@•ˇ`ääkҰDěKĂ5Żq‹ÇŐ U‚Meł U ;¨¤böQP^‡QIňŢuP]]źžž]]íÚC"¬Dč=ääDq…oÝ*K:Mňŕ¬xX-3¬•ÉĎ$ťÔvÝěqĆ•2ĹŚ5ťZ—Ëç‘7uPkë~Ě­ăé,|ţýäÓ‡źv°Y(•;¶Ŕë06›@Óv°]ś\žüşc•*Ҷ¬Ri ˛…RÇL4;1Tát]‘îą9ŇZÄiťsßîň€!®C5ź;ó)Nk+»—/=` TT §5TŁ»›”<4PÔÇ>Ś©EĹÁtĘ]p”†\»\lîٱ–ÎĂ|ÝQöy ¬VÁµä1|K‚ňý‘\«áµßłä°cRăW Őnµtu~úŹłť“ 6°»Łŕ ¬â˛l޶qýqůarÖďQrăQÚyN˙Îm_BŔ˙::QŤĆ7;ńS#RŻşöOöČQ)ËrsWÁ×Č%Zď¦t ň°¶pͶŔíů_M9Ym*á˙gŇPĽŐŰăXv‹Ů^Ó®iÚöQPŐĆ}U°î6ŞóëÉůĎ»Ö Á/IŽ,đ:ŚĚ2ŁmdÇëFv§ľ•3’ÔG“‘×Á° îˇűĘ)U˛ĎŘ“Fë~Ă[ďµöi™±Ů¶ě=Ü7cÁűnřBńKĽ§U÷ćn»öO•Hń.@ÁjPťÇĎžt‡!$qÝg~zz¸~Ź[ő»ěy ’Y™5ŰˇŽ› Lž_O†cNĎ)8~_¦”Î}ßÉJ ĺę$ŰwÉ-%â­3_Zď““i=W”í¸eę«vţ´ë]·‘„:…r_UĐŹ„HÇáúXóIŠ›­—€pŰp*!ö§ŠpĄIŃZzüxÍ[A˙Éhlµß¤‘pż†}ˇŞÁ×üäëůúŐ{řu€¦Ł´:Ą×ş[ÂŹ˝ĎÉöł€˛üzd÷= ŕÖ`řŰó,€óůY[dĺHąnRgëźc‡oĆ=^đŇű€ďúďl•ÚTXkţ——jć3Ţ0âm‡(%™)Ťš”2›1î‘Nx•.3˝kŢŤ@#ÓÖ0ćxî¤ë¤á·"kZoE6jNËňí ‰~:?ýű¨Ąě#% ŞZ˝÷nŽŢ mµ"‰áúĹc9Ën Śhĺ]&ň¬ę©¤ ä‚ õÇG:á>ł~LĐ Šăd4öV'QÚ<‹ü ¶‡wendstream endobj 311 0 obj << /Type /Page /Contents 312 0 R /Resources 310 0 R /MediaBox [0 0 595.276 841.89] /Parent 297 0 R >> endobj 310 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 315 0 obj << /Length 2534 /Filter /FlateDecode >> stream xÚ˝YIoŰHľűWđHĄÍ k'ssŰnLş“Ř;Ť™‰˛‰‘D5%Ĺť?o)R”)ËFZ0Kµ<~o©·ń×ۓ׿eQ.r§ŁŰi$U&tšGާ"Ë\t;ů›Q"ŤĎu|{_Ž­M|v=’ńŰŃ×ŰßO.oOd”ÂźŚň4ňÖ‹\Űh’0 e"5.üÜĄ’”Ä++´őHčWäRú(6łi€^Ôn!.đä…„˙ň1gŇfBIőHƦ­*Ë÷sL,ńV8ű$-:™-ńć=l:“ źnŮT°"En-ń™z¬"ź*‘IŚ^~ľľú8ĘT|;d´ěµ»źŐ˘VŞ˝zLZZIŹŘ|N ă˛|7×—ç`fĘÇŐb˙×Ô—÷ÎY%ś ˘ź–‹ĺ9¨mVĂżUůŻ5<ÖËë‘Vq˝Â1Ř}±RÂç&PřOjÓQbĄŤß~ŕçw|3Ň«&ŻxćľXLfĺ)Ü…T§Ýľ«O$E´[%…TĚB'ŤŐń=s nÖ>7+ “§‘1ÖĐ öĐŹu5/“–ŞĚ…rLµŢ¬Q.áL!ŇÔD=sřił2Ši%|ęYkÇý6UO_EĄŔ«t6 {GZ°9¸[Ť‚–çłŐŮé˛U¤éťN ř©,čqU.&+‘ÍbĐš‘Uq9˛2㿲ú^Ň Ëxń,iq1©w|nR¬‹SŽg€ Ňkr8ŹgęĹ‚©Ż«zÁóŐú~»é€‹· Ь Pý^6§ŹOaş!4ô/€ť—óş X‹_L¨:ĆŠ5íD&¤Ţ1C˝ta+žOă™ňěiě-ľźę_ÔčPÔŹ*&źá1Çńú+ě!îi’C$70ě7Éešr—Ł xhždĂ/Đš_…©M3;ÝÓǦy’Cűůý»Ç"6Ę ú€ú-7ćI8Jz´†6rg˝}!D™3ăÍĽ\´ÍűWŻBOC‡ę ŽYN\ţžĎč¶WI-‡ô=küył>z‡^AĆíµÝߡ÷ŕ R0~Čf$,ô"vgThQ”‚‘$`nĽ§W VsšÔÔö[t]l¨!¸ŹK-îĐJGá†6wşA#Üî¤Č «eč•Ă;+ «ý6xČLőžűřn_ަRY—ŢÓ÷~–Çl—Ĺ\ËŽEęn¶WX3©!Öđ‰7ąĂńd·IŚuŢFTţ.”†Ś˘ĎŞE´ůnŞü,đ'ä–FÜ·Á ^ú?xĽÄfzł 9îtvŇ…6ó0™"ś|7Nsć‰ăârčJŻx­Zó> endobj 313 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 319 0 obj << /Length 2381 /Filter /FlateDecode >> stream xÚŐZ]sŰ6}ׯŕ#µ]"Ä'‰Ľ9¶:ă4±˝˛Ňt'Í"Ѷ¦–¨Ąč¸ů÷˝$JTÚrÜŮńŚ ĐĹ!qîÁĹŢLŻ~Ě#M´âŃä.˘,'<ŐQ–Ą$ĎU4™ŠĹ0ˇ"Ó<ž<Ă„sźÝ i|9ü>Ż ü: ^Ź3’gşÂZ¬ę϶Qđ xNhšą&gh”óx±2צ·ű˘˛«bŤýš‡óß¶Z¬îmre«ń›•wöYý°}vW>ÂÍc9dyüŚż_ŕkÜ;ŕTŔ)ŃRF •D ě×”fí´‹ýĂÍŐÍţńT!y”Ąˇě;ŠĘóĂCĺm%1;^ uRÓ¦C6jˇ˘śˇűAĺluŁ˘ŠČ<ŰAuűáü|t{Űć"Š2÷M_ˇőˇ`„×Ă„eqQMëڶ©ś•ËőcQs4…8Ó8tvŃĘći6Ăá.6†:wOČ‚ÇoĂ\Ĥ=ö‰-ő6ö*Ó\Ş—ˇßÚ::ň®IçŔ÷ÉŹ{$7ě¤Ë«źĎŢ]^´€INr–őĚ™ę&eěćl|öľEF¦•ąHăѢţ<€*YJđîćÜËťÉÇ–Iš%sצ<`„2Â2ĺüľ|DÎ&–ŰTn&Br_” Ľ Ťť&ĽťĹĆĘ᪬maj%ńëP*Po@şŰ ëa%*p \ň¦aÖ˛.BűđI ŔéÉI¶ĆŽ{‰kÓí&} jü¤ •w”Ő)Oé[ă*]ŘĽŻŘ.F·çmľĄD3řJšÇ$ŻźS˙ňţť­k_ł§ea‰f ®đ›íđű«§H_*})‡©E|5·weeŻ8ź×¶ĺжŹb˙·f.(mě0]¬ěĂ©˝€?ČĆRşĆâ/™7±†®ľX×Řąz‰90‰Ľ/Ů;î/®M·żôŞń—.TŢ_T§üĄlŤżtaóţ`ű0~מ$Q:t*!Î1´jM 8 éěäĽ"RĘ=Ä€ŘŇ^Z†KŻřŽŢ -ç»á } ËśĂćýP80v”ÂľM'…{Aĺ)܉ĘQ8Duýarýc ™€RŞdÎV72ČR±ěýčýőřżíX¦„<Ź2M1VŻ [śúÂbµAą¨ š9 öłE°®Cľ¦°ę3Q»Ńűjf5×ÖÔĄ˝Z©‡ ĺye–wÓą«÷”­pcăŇÄ7FµŃdr@ĺ——đ•Ś÷ĺ [cÇ=Áµéö„>P5žĐ…Ę{B€ęj4ůx=ţé÷‚Í‹y'6'ć;_l<ľź\)0•Ćgx"µÍ8Ŕż˛úÍ>,*”q \đ. ĄőSXÇRľëOU“AŇż7ÁP.zZ˝ĆŽsÓµéćf¨nvˇňÜ PÝ^ź˙4š´e:üY?Đś­nhŹg0s‡Đ>Ž/'ŁĂÔ #Ť,·‰¶,ł\BRU&†ÎrKCM˝°2h„÷Pxnł•.Žoô4d¨‰”ź+•7I:ŁÚ~Ęc+îÖ:ČořĎf_†á"ĎŔPÖĂcGîŰt2ĽTžáť¨ĂCTÝ ďšgx'4ÇđÚxtvqrĺ)aĄ‰Ç+č,2Z¦–ŮřčłsM2ą‹śdvs?E1n~gĽiió+žĺ Ă3Çđ—,„JI oŐµ·ĆŽS۵é¦v¨jwˇňÔPť vĐjwAóÔ ˝ąĽ:Mí\ Cí\ň=íĆš Ś™ebĺřzŚă_ qw軯ËYČÚďŐĺ>r‚‚3·TOěÝ;Î^צ›˝} jŘŰ…Ęł7@u‚˝}@kŘŰÍł7€v~}u5:źśÜÎáĚj3÷tÚPłKŕ@p]L,á»íĹÄĺjĺ›Í Ę€ň˝•ŢpçďŇ_¸Btß·ĆŽ3صéfp¨wˇň Pu¦8zAćSťČ\Š#D¶ő­Î‡ŇŐÎą Jűdi“1ř†OtŔ¸ťvs4őa’%¨ĽAŔárăŽţćâ ·mlOëýĄ`4L¨fDĂ[& zKmüt3ä şš.‹ş¨6'·ěźŞv˘?0÷ÉHĚlÚ˝÷fżÝ˝Ć6Uľźę'í^g4ü ż//ĘYw÷gŰ=+ łťď¶­šsvň°0#ń°»1“\]V[ˇEc÷ ‚ś‘íđeöŽeđTĐ·6ʵVŽÇ˝ŕéܢ3·Nf† ‡iĺđ”Ý&aĐM_ćäpů> *Q ŇßŤŠ« V”G`Ik,á’Đ”5f~š‚1[r­Ľ"Ë(al;ĎPí_cŚ0±\,łóĚǡÖ—ľŕ:UĆ·EőuČ1ˇ‚÷ (Aă›Öa FeŞ˘ »żŽ[0k,±?;ůAcĐžg†‡ř±8 (ݏőß+đÜMË'0} >.„ŁAN(0–ę4ý‚źăzŚŠŐ h&AÜ"4Tú;R 'ą>,»ÎTŘzłÖ)¶+ÝtgDO6ŤÎ·‡~ÜNŕŢŽx¶éîĹgúőmQ!T\|±4`@±Ý/ë‹EŐŢ%Aůh’!ż¦2µ}_^Yź‡pbS{źG9V˙r >§ůőĚNbŔ= ľ<#*ýYx ¦+Ńlĺo E%„ŃZąabDKbµ­2{"ą‚€Kbd/íÎ>™C§`€~łŹď\‚Ë ‹‰FĽ±:‹‹Ę§ŹéĎ:©ĚsőŐ´%­‘pz9'`I±˙ß ¸‹5·‚Nťâ”¦@ĽÇdÂ1©‡Eö/8f`ëcú&]Žą3Ó+ÁÚTj"Ąř;g­ťdkČŞ ,0ཨQAXE mÂ\h¶J~7Öľë齣(Ţ=yŠK٦ÚV®đäX1wmČj,5łľ”ţ´DYk[i"¸^\ź˙€ĎđDwŔ<๸^ż~ő Cčy¶^˛c˙ĺS5+îJŚ «ű‚ŕn@;C * Ó Iť†ż5gÔľŮď/ţmŻ,M•Yú«X3?Űç?(endstream endobj 318 0 obj << /Type /Page /Contents 319 0 R /Resources 317 0 R /MediaBox [0 0 595.276 841.89] /Parent 316 0 R >> endobj 317 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 322 0 obj << /Length 2209 /Filter /FlateDecode >> stream xÚŐYmsŰ6ţ®_Áé'* ⍠zź’ÔťI.“ćl§×™^?Đ"es*‹:‘±'˙ţvEŠTÜÄž›v¨ŢĹ@=G×)5ąeFpŻcE«ŃC¤ALźeÝ&ž˘~ňađ »ÁM*÷ĺžÚ`!ô]wŐ~J ¨áć/F‘Ő#]¦“ âŇŐW ]Ă)Ą4O‚ô¬SHSžéoÚ€ň%řéÁ~†Řu8E—:ľ”Lq>€ţ $ Ů—·˘xćůAč*gđ¬9KsżŻsË8÷Ű—ĚGnöp÷ËóŹgS± ¦éX˝^&YÖÄ´÷ä äî+ňşuÍŠÂęKńLő“m‘]S}ü6C~ýôňÝĹśBŔDž BÎŐčHtŻ6·M7ežÎí0$RľVűc SJóP Ń`*{dťäˇźň<|I+ˇ9“M—j0•:sVͶőá†ŇÁ¤Óţ™ë))Ůy_Ü?~2ÝŇěŰ”±´µ6DȢ,µ@›?¬Oľ|˘Ýe‘_7$Ę|ćXp‹§Üaîő”9Çô˙o™ xž !!Ł<&FöÄPĆ0pÔOÁ‹¨S´đ3ž‚ç„ŃŰĂ‚‹ #ŔÍ0^vą|,3Ş/ľž áżőíꎸ!á±`Ě(”!Ž›;Ě·xšzž ~ćpŰ!u,ľQh7 „ž&řhjöźÝčm±sÄŔY׎ݬ°á­†ĚnęFěűFú Ć…ěY7Í"ŕ˙WR ÁaGŠ “»ňś÷ô2_C/LŐ!Ĺx~dť$ź2aج©ËÇQŚ®wł™­Ě•?$ę}L¸Ü‘ Ę'Sc\~ŻÓ3˙Iľöŕf wďË”Zy>á.®ăK9K)(µ˝ngP­8ÓÔ?¬"‹m6S.“B°TÍĽ:TŹ:ˇuHSÜ×™ŠŮ@AC9ś#sUĽ~/Ç0'`Äă}đC‹H¦ŔYaégżëĹ ë±Â¨M?űAÚK¦ą8A{/+›Ń/ăLeůHż‹ĂŔjB`ĺv°n$çŔ4¬ďÁĺÁ›Kú7W2*ś7 8“ńj¬ D?q\î>ŔBTm0ÂP™˛s#.ÎHˇg®gŹą vń‰^ŤŐ’*n%ăîč›{G2Ľ°&KS îôŰÁˇ„–¸e˘çëTś¦“0|ľť‚ů˛HhXÍłŁĘëá)ěßÁt 5ź;€ç%ú ®č®čĹJ~«!w…®ě¶Úúg#ů1hşŕŢöT=ňmk* aĹÇpÝësK_鵾 žĆ®áKe}!hś73 †––ĺúˇłC˙ąŻŢŽM0r˛pĘô ÔaiWK¬Sąş0´K*%Ŕ ľ‡Ý¸‡i|ć4őľZ‘ D2ÖKzk8ÉKgl‡ś6ÔN¶>lŕŘ=ˇeđK;¨­`wř^ń<ľDmë>Pąc •‹AAłđęAň·‡Ě¶.«}Uşţp~ŰNIyîđ”t°Ď}ĐNkVˇNJĹß˝řŽČGCÍ:őOĆ{¤5Ý;|i&ÜŃÜĺĂĺ0«0ÚâĎ1®,{yă‹Âdńú«W˘¦ÂľŃ`ľ¶q3ŠUWß-54:˛—_H÷Ë`őá w5DĂ=ô¨~î&ěŰ­ż„U˛N4ý¦.‡č kCAtűŻÜ˝Ë)´ŠŹňľé> endobj 320 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 325 0 obj << /Length 2155 /Filter /FlateDecode >> stream xÚíZ[s۶~ׯĐ#Ů–q#€ĽąŽ{&™Öő‰ť´3ihŠv4Q$‰˛'˙ţěâBA&E; ŰéL;™±xvßî'ĺǫɳźôÔSđéŐÍ”2Mxn¦JĺDëbz5{—4ŁBž\}¨ÓŚs‘ś\¤4y™ľżz59»šĐi˙čÔäS%1\N«O“˙M޽ϧłI>}5É 7zz×9ˇĆL?Măţz1ąśü·µ‘‘,˛ň#â±-@\„q’Ňb{ hŇě6h ŕ4OަF&ĺbW?G€0[EŰăŚhe`)śünľlŢ»A‘ ¸&4W~Č ĺ<™/Sf’Ć®v[oÜĂM˝ĆuíĂ­ýëFÍ—·nŔjé^ŁĎV7îYóa˙ěfµ€›Ĺ*e:ąÇůsÜĆ­NEś#ĺ4Ł’a‘ý‘SŐÝ »pŘß\\ś?ŚĎ’OU®eO'”ëţP[YdĚĹ+Äáť4´]ťuPQN„0ă ň¶†QŃ‚H­P]ľ9==»ĽěćCA ĘĽOź§™(; ˘€ŻÓŚ©¤Ţ”͢m_V«OëEÝÔ34…83:B´˛ÝU†»ŢÚÔąŮa,>§Z$¤űĚ]}aěĎ/ŽĹľP†Ŕ‘%ô{[G#ď‡ ~ H!îC|Ř#H/ĎßžüüňEäD35 0oj,ŕRĆŔN^˙çÍ/gçWť|”hÁŰ|ti1$ĐŁţőfDC“UyöbľécÄ:śC6J®“ré—Šäô0sŢĄ)˛v>s¬6CćÚÔ6«›˛"d3ŮĂ˨5s1Í€OeÍ^¤ś%ĺ¦üÇfł}”¸7«UÓ»Md¨űYµşuTlé—ýzîEŚŕމö€[¨Â"ęŽćŢŁéúÚMłg¸ŢÜŮgŇS‹śJ{hM´YÄf_Qř۞²)DDŰ…«Üp$M»–-Üö  {‰JŚ€~:.. eѬpĆ2ˇ‚Ä;fĚNÍÁ»ňŁ{6)Ą€ă%öç$Őw ¤Â%›JŤgĐő'gż_üú:ŐŔĘÝŤB#!U;ú ÇX"Ő÷ă`+‹Śőŕ+(…>Ŕwyqv ©Â¤==*i<Ĺ›hDdĎÝëĺú˛n voç›fWbq€l?µnq]VxX>ný!9X]Ń`çŹ\渮€V RôÜ]o›Í®j\ Öł™;ň řGK Q A•Ôš9@ËĂM…Űř¸ý­IeW˙€ )\š> x–äpîŁř~}˘ćŚe8Í<žÁ8^ćěřŃ’ČҦżçĦXN%—„…0FomÓ†A˙ŕ5úÝ„×#·s°+-}ś¶un“Ú \T©¤H°™Ě!âö¦úč^ÝŔ »eĺÚ ;iĺ>í0? čHáÁěpPi-Ű?őÖ®Ş’Ň˝şł‰`+N‡Ő1%¨‘&®3(YbÍ#Q~îcy®!@Xý€äąř·ĹâDDí˝fk ě ĺ<Ç„¶É:#Łî­ó™M\ś<ŹŢłWîóÚ–‚ÚÝěśńŮá24m[·TéßáFśĂěýP)?ş=Äţt1aaŁu&Ö łViTÁcó5’„KWâ:q Ú±' Ŕ°÷q'ÚN‰ä…7włÂŤşµË/Ů•Ač>źŇÔŐÓľ”‚“K …ąĎ ŰúÇę?:‚HR©qT@dě¨ cuŔ(¨‚Dĺ•@Śę#Tb©ŮH±ß;{?f8öc jc?„*Ä>Bő [ĐŘĽڱ}µŠňŻJËď‹ăĺú2&Ő^ şzu\ëĂěEVs˘I8âç¨ Ý ݡXŬ‰Lů'ÉA߀ömÉśéX>Ŕç5·ĺ?Kü ¶Cn{ě6µ{QÁMiizŽn¸uo˘ýj;gëž;Ë4>z4?pĄoşv[glC#­ÓnĘ*”‹¨ő‹ëäąÉ±×CnF†ŽÉÍ0$’›üÜ|2®'ÉMh,UažŞ"p´ęŰ#Ó /D1¬6yžeÔŐf=ŠÚŚŚW›1ľ 6Ő#jSĹrólY^/B+ó[jDR_o±Íˇp˛9K|2ö(Nč–dŰ-ĹYźb°k\Ąv×C 1ŠÉWÇö@ ę"‚‚®żW 2hęÁý¬gČŤh[Ga÷×—5žç®Că>Źš ç0/ÓVž±đz6ßú€=TŽ÷6pwő1şe ·Áú„ŮS°ęC¨˛băzalÄ0‚Ő…D–­şcÚn®ď1Uüđ]ZVä"9qŻ}‰Ůůѭډʦ„ÓP®^ż9ë f,<öoŰÁEäżá¨? ĽŤśsÎÖwůC¨¦BT?ťü|ŮË@`u¶uü?oú" ĺđ_U4‚(˘ZĄGúU,2v´1căQP…Ćx•oŚcT‰(*ţ˘+®Öf¤Ř˝3ű1Pµ±BbˇzDŤ‚-˘Al^ĹŘľáç1Ő~!ć’Nnă?3*Y®šđ«4 Đtń­úůÓ4Nčť ęćý•­€´j‡»oyâů+I[čz*”€CÄż B󽥽«I8ጢ“R|Ë˙ qv˛˝!—* —‰ŃÔžv %čn„±GĚvXYćˇŔK‘¬Ë[Ë2îî>ĺVřµŻÝË%rW=ócćöWD}!+eň!řs±v/m-Ďżž~ŹĎżzĎűŔ|@mجź?{6CćIµ^ŰśÁőW»MU߬°Xnnk˛¬›n Ř+ ?É…#˝W–%?»pÜ'äH‘fZň"1"Dă˙UP1mendstream endobj 324 0 obj << /Type /Page /Contents 325 0 R /Resources 323 0 R /MediaBox [0 0 595.276 841.89] /Parent 316 0 R >> endobj 323 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 328 0 obj << /Length 2069 /Filter /FlateDecode >> stream xÚíYMsŰ8˝ëWđHî â‹rsĎ–S3Ż-{¦*›-Ňkő5e×üűí@Š4)EńŞ¦ć°•Š‘`óáuŁű5ôa:y÷“ 1)¦ŹešđÄJ%Dë4ćźCĹT(ĂĂé×"Š9áŮuDĂËčËôÓäb:ˇA˙h`’@IE —Ál1ůcňůKä“$ř4I7:xqB¨1Áb"÷ăůävňŻÖFÄś©ôĐ„hM0&©Hý׾• ÄŠIÂĄBCp•T–™şe °4Sě* ¬IńzUT2btĚĆĹĄ!Ňq`©3sAÔ~[öÉlą‘›<˛ÄÔ$DęÝܡÄHi×(Ě•p’rmyńűőŻ7‘fát¸Lđ,Ż™ýMr")őaÜŘŠ;ĆFđĄ”T÷đÝ^_śC1–ËţÖ\g:Ď?RŃc¸[/×—đÜohń°)*Öđ9â,tĂ‹eö0/rg¨@¦„™ĆŇż™ŔúšX%It¸~łĎs¶b÷Ô7C çË„íŹq•hł#w¶r˘IÂxšˇtCpŚ])Đu µl]ŕ= Yk \ęůŞ" Óŕ‰çoaP-7ţ!µ{xŕŞyfzsw1´‹{QK?Ą|˙KđĽÍ5R‡/Îú¸¨žŃ§x»Ü¸»zo!šüGwqU qPË•ËOg?ߎ!1DQő IY;«%ĽĆżuąŞ‰şCxĚ•$©00DKú6Ćuźp&yŕ´»]"lKŚ >‡Q5\ˇŠ Gž›ńŢajk˝‹‹·»M ô₇~ą6˘‹ś ÇE…đŹDĽ'tRBĺqźŃcx!¦†Ŕçĺ#ęK’â—&Cű¤I3Ą#Mä>ir4®żPš@‹ĂŇD %J)MšŮ'‘&cűĄIß›¤É8.Ďďq[1RĂ`›Í?ş #’„Oî$ ľ2 /ŻÜ«g«ĺ¦v—fâk†;ňîJ^VW٢p_I™Žoţ>RA č8Ƥ ŘÔ „ä«e·°žŮÍšĂđŢfËŞvüĆ;‚»93 ­µç7Ës_Đ3÷ńlý‚\éFťĘ‘,śYťłBľ˙tł1đâz]şZ…`¬J1›—Žę‚oĂ×}ôBú]}Ě\&{.ź_|ÇeUĚlěµŘáĆŻdk„ŕ ŚĹŤž XR°‹ă®ÚÍŃTĘ0©ŞufTĹ۶öŐ,ĺˇ}5=[göU%.üÉÝm+_*§˛gtéŚćÖ%öĘl·x4« 7¨Š,ws·Wfař¸Ĺ·Ěš=WÂľńxZ,Ë]Ş·Ź”ţŤŮ©€‚……ËďÔťGÜFĂól>o”T6‹8 ˙c]5xDi#}7uµťŐ[ż^ôj+%žĘM]TEŢxy#M‘˛“|ÝmQ pťÍ;ŇY•_’Ż˙—_Gj™»ëë«×I™ß ŻA–U„©ŁŞ…ny´ş5¶âŽ1—L»˝_ihűB[|¨(‡TcNĘŰ:ŚŠ¦¶˝î˘ş˝;?ż¸˝ĆCJRĘvâOŔ®µâOŔ_­Ł3U•Ő°ëÝÍŮj±žµk±đXú~éwł;ăÚlg6Y¶ńŮ<â.śĎ˙Ś´Ç„¬}§ďŻ®÷úžŘGćDľßŰď{?ç°ďOŞőý!TŤď;¨.ŻîĎ~ľü8Ŕ† €©Ó`ó¶cĂ3•=lg7˙Ľűĺâj:LA‰Ľ ĚaŽć$QMýnäÚk#€Ę´Ů®Ü¸ĄҤ–˝ „©lĺ[ĺçH¦b1[ĺc™šT÷©…µŽĎ_ă!DV¨-›oćć}x›´={hz0ŰN-dÚeńâŤFęŢ“lŤĘ¤MÚőĘ}:ĹCF:3†ÇLć‡ĆCű:łfJ§3K÷ufGă:Ş3PäÚ+Űýě‘ERĐŁIb÷f .iÍŽěÍšŮ'éÍ:Ćö÷f]|oęÍnŠĹ w€;‹Ă´5J ËŃMHBď5h‚Ű  –4 ^ę7hxĄłđ‡F eÍÁÍţn­ă­·»ýäí…vMR:~ň¬!…) řěĘŃ»´÷ÔéXĂ{.Qęő™óbő\śĽus.˛Ľ9y.!_ R©1Đ ó±Vŕ{[QîÔ5„ ȋѶń8"{żëĄ ˇE{” ŹBtşn ”¶ďÚ‰ ÍÝĄĽlEµĎŇxµÍŇ®ťCŔť›_Ćéc ô}Ő¦ ‹]ŐĂ Í!wÉ>Ô 0d˝~ĄW&Ŕl7L´cgeÇţB{;ńÎŰ2ö,cŞŔă-+¶\]Dެ¶Äŕá:{˛>tß^"ž¸€ô·ÝÍ%ŞXŰőáäÓŽÚ2*eřµńĚ|ínÚZ ź=˙Ż˙ФĎ€ůŠ-q˝~˙î]Ž•˛–ő$±ď_m«Yń¸Â¶©z*Ȳ¨G_)QT f„“żź¬^öĺ[řźX’¤Q¬%OCÓž]ţśöŠendstream endobj 327 0 obj << /Type /Page /Contents 328 0 R /Resources 326 0 R /MediaBox [0 0 595.276 841.89] /Parent 316 0 R >> endobj 326 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 331 0 obj << /Length 1258 /Filter /FlateDecode >> stream xÚ­WYOăH~ĎŻđŁ­Y7}Ľe€]1Úe˛ĐJ QbŔRŻă€ćßOU·í8Ř0ěŠä´ű¨ţęúŞüy::úÝFŽ8-˘é}ĸ%‚şČJ¬ŐŃtqË$eŇ8Oł$BĆăIÂâóänúet6±ÂŹEŽFFℊć«ŃżŁŰ;-F4ú2˘D8=Ăć\´I.ęńrt5ú»•‘‚´#ĺ3â˝-@Ľ„ BµňŘ.‹«] €ÖΊř&q*ž-wŮ1„Ó¦ŁžŕÄWááŰ|]Ý…MK5ő–1 "Î× wqĺo{ČĘ0YfŢë'·ţvĺ뇰ałËhłÍ}«÷s÷›%Ľ,7 ·ń3žĎQŤ‡8“ŕŚ8Ą˘”)â¤GöŤ2ÓW0 öëÉä⥏•D*jăďp” LŘaW5˛Ňް௠kʱöBvÖCĹ‘Ň} ŞZÖۨ&ĘšTW×''gWWýxĐD3^Űô8IĄć!¤IĘMś•ł*oűĹůfU,ł*[ (ÄA¸Cע”ín>Gwg[:÷;Ś‚ĺ÷ÄĘô}ź†ŃôýĹä5ßkă¤Ô‡¸~/ëUĎ×[ŢtüG@jüţ¤ÚíHç7ă?ĎO{Ŕ” –›V‹zŇ0T]`ăË?®˙:»öâQ2bĄhă1„črˇFÖ닼Ľ­˛žŔäZ’Ë·!R™v´‡ˇŠ ¶©]=%Jł"I-H˙â”9Re”réĄăůI"x<+C••ŰźRňkxĄ%J7xCö9Żq«!»JŕýŞYzĘ‘š«ÝlyKŐójS~ł+|ź°Rę ‡«Ť7=°D™­€¨ XŘ:#ŐOY©núŃ"Űhᣋ¬Ôőë@ěňˇÂLdÁ:ThH=×Ţĺ 4ě–—BŘ÷ăĘAĘĘa`:K…$ćuYţ$Ya6©(!ů^EN›‡:uĹ#…xŚ ÜńĎäëeb{űjB» L»űɪЇ’µ‘•v„ ŕÓŚHmđ]MÎN MB€x.É5™»ÎY ÷ަś\ëâă ’ä >@ÇľŔă˛ô –OۉmťI‡°,¤~“%ߨ˘Hă˝4X€PČŐŽţ·?%˛Ňpę§a†űĺoÄ?€˘Ü 6€ŕ4bˇ<*"™mĚ)|ékjךcśY.o|oUVÁ‚)špoÁn—%ŃĽáÖ2Q( đ +µP6F:Ů%ľ™’ÁŐEpĂGM4¸s5+ h ·C´ÉŚĄ€ ™bż¬‘=TëŇm§Ď|Úđ{ ^#čVű´‰ł«š2ăďaËA¸<ĺ”8Î> ]Úä‹~żŽ·}iČ·ŁoŞÖóĐ–yUБЭٺałëPܰ™ßĂ‚×Yř’§‚Ťv”7bHJţĘ7O“î…¨WÔQË|oM¨ä‘tľĄ š˘·M”Ś‹ŮŹ–đöśŠJ´ËaqŤť*t¦aO#~Ô~”€¶ŹŤĂ—EXô_.đúőäÎjŠcíóüTÇGG 01Ü> endobj 329 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 334 0 obj << /Length 1641 /Filter /FlateDecode >> stream xÚÝY[oÓH~ĎŻđŁ xűeßZ`%P¶„ËCš¸%Kš„Ä)âßď9sĆ©Ý\hŘěJ Şµ=>óÍą~sĆ=í÷˙îłŔ‚UY˙2Ň3ĹCćgŢ۬?ú›˘ŇXźźÍëBäăŮt0)JĄTŢ/ĽĘgE)]>‹C:?y"Ď—ĹÇţ‹Ţł~Od~DxćŚcA™lxÝűŇűđ‘gŁĎ^ô8SÁg_áž3BvÝÓRĄűIďmďŹ5ĎJ%™q~"ű~#D†úk› ‚ĘUvŮ(AŹŇIĂ”qrŠć —y°ß’ýši0?‰ůwlĘ2ÍuÖÂŮĄŤr–q0o—:šJĺ@LďC"„$·Ý.ë=“Ƶ]!0ÍhĐLj™9.™ç>ZÖÄţPHť†RĹ)¤ngHŤŕĚ@Ş´–ýAĺµ$¤’äöi ŔĺŢđZo™ĽŤ.$Ó:»áµµ‚Y˘ýŻ×U4«Sľ ZSô™€üýĎŢŢśťcÎ÷7rÂA.řĚB@!-ľźă’¶fy™ ĘÖéÝ*uĺ`D#‚ŠľĹ(={B…9žŇç5ŮÖö€p€Ť‹¤Ä€‰ďćS9?‡*ĎÁ"Ć]ä7…’yőîü冂bÎŁş8ű/n8­ůü51Ŕp6]Ö44,€>ä`ń (­uůé`Y!:ŕ>BŕL1ďtGÂÁÉ 7CÝ–x·Ňć¤řdŤČ;hgďú»t9ąh°ŃĘ(ÖM§yČ[Q1÷îď3©[ŽçśI Ż s®/ĆXz ¤ žçĽüߣ«Đ ˛™Ű‰Z\Ő60k:J7tYŕôj‚ĆÖ(†ËÜTô®3q<­gť™Ëńô ç%áÁEąĹ§ËŮd2uň "ŰHwÚ'“Yůó^$7:ž""ť`LbeZ™Äň¦0˛JčŁ0E kS4"Lńüý«—wU”Ę0ÎíQtl°ö))agPam%źb[áóáęş".{°Y—°qŔžfRnÚveľ|޵x2¤Ů 1É„ţ1Ôqd&ÜA˙X\ö¶ZÜôŃÜoóŘUµŔůVŕ†čăĂëŐőÉâęPH÷4dOWű`Ś‘jŰ©10§ě6jÜ€6'B´hřaH¤U‰\„ě®R”ť¦ëpÍeł8$‘ç` ˘¨2ˇµŤř˛ŠäÍ7ů<’ęđsU“gÖ$ #šá SşÓĚ2rő|•fRT ®1°›NÄ´ZÖzµ$¦Ľ äxp1‰Ôé í®Âő “ŁhäŘ4L Ž1"ߤZŤ¦±â–kĄ”!\Ł Eăú…ÔŐ2u[éX™â(lŐÂÚĹVŤČ1úšôđh·ĐÚš|†µ›Şq<ófwcsÔMč­´©,#L¦ˇ)ăŔF˙ĆW ŞlaÝő•‚-(¨°^n;iŢ%¬F‚JľtŠi«;z(eťDÁšN]>ä˙/Ţ[ăĹŐ1ő¸?±všCńv˘TŚË¦‡‡äg·‰”Ś«˝ŚiŤŠŚŻĆL­$!´#~ | S´č’%>ß’Ą@˛Ä!daĽ¶‰R Ýĺ-JC” ·­ťţ\bV†_â3đ%‚_âŔ4Ć ď±m5r YâS›,·4ĄěÎýł7¦˙ÉĹAđp§á<5Ľ@°ńŇîwő;TĚTGŮAZX»vFä ~÷:®űÝ=J6ýn[ÉĂű]łżÝ:Ż–Ŕ›0ý_¬ŤŤ–AŘ8~Éř(¤}4Ľů};aü†'’őßí…·§CőĘ3gö7Ç\# Ż'ń¶Í Ri¤Nťň2R#¬YŃh›äŤTwIEü\/Ó@<úoăqjŹťşe}™ÚcTÖÉ5˝Ł+ Šw»bëvĹNĹ®xs˝í-2Śě ţç=ő‹|ŤJT¬ŮŮqfÁ6ęďE˘gs=K)vö(ôÜÂÚEĎŤČľżóďĹ”BcôŹ˙ˇL8ĺ-}#†®ěń`Á•2Ó Č“}d†qs4P6«řÍŽžľŠSU¦×ôrZ-u5J2ăúÝŐźš”5yşůdN/g—t}zöä!Ž?l˛>9”ů„źěëůoŹŹč+ýp>Ź'B\¶Z «ËYGżĹUŦU˝QŇ ćŕ ýhúÂý‹hňŤüŻŃUÂV”Ţ(›×DăŕUݬendstream endobj 333 0 obj << /Type /Page /Contents 334 0 R /Resources 332 0 R /MediaBox [0 0 595.276 841.89] /Parent 335 0 R >> endobj 332 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 338 0 obj << /Length 2342 /Filter /FlateDecode >> stream xÚŐYmoŰ8ţî_ˇŹR·bER$Ąý–¶ąC»}É%΢ŔŢ~Pl%6ζ|’ś^î×߼PŠd;›&°(PIăáp8śyć!óv:yó·,ČEnu0˝¤Ę„NňŔąDd™ ¦óßBĹR›…_·m$Ăeµ)VQ¬µ§Q¦Ă*Š• +Ąáɨ|h˘ß§'§Ó‰ ř'< śq"×&­'˙žüö{Ě'Iđq’ťgÁwxO„Ěó`=I•öď«ÉĹ位ŚÄ+oŃwĐ˝w>7™Ŕ)-kČ÷ËíüŮžŔÂů^§QnÂędÖ.QTmÎËf žăkS˘×ăp¤`Ѣh쟉Ixáľđjż‚ĹË)żřöůÓţ˛SiD±óčŃĄ+‘gůńĹ{SńŔÖŰ˝ÍKe&˛4ŕ=nOÎvërÁKűę: v´HmÄRŠÜ°.F…"‚ˇŮň¶břč»|Mă’ŃŽgĚN·í¤`a¢~ĹÖZ~^V Ü|)Ö%~ľ„ዲľťâúîŘď3|R߼¤ź`îW,𮂠Ą$gÝ0‘ăTCőšÉ$ęŮ™¬ŇA*%ҬKĺYQ2ŕ[KŰŰpZtjĂEinĂ‚ňßMXăPśŃř IJźĹě_eË#®č»oiŞ9K;˶ń‚h´ń‘řnwJ§˝eň¶Ł-ëĺŠj˛iy ;?Şß‚*@Uqµ*YoS Ćš$š±Ű]‰’ĚĂ–JĹ*Ë›–Öć†?©.¸NĽ©5ůě,r_# ž–­?]Ŕ kŤżĚqŢf»*î1wÇG•˙ß`Ě}q)¤Ůa"”żß™.0fR†źzlÝý% Ä$żđŻ×‘Č/Ďp÷Ďřă=qµ[ć!|”¤łŠ“®XzÜE!Áoµö3Ä«–D\ŕkŘ›Ş0«—đ»vI<§Ą#>ŹínščŁ] Ŕ˘ęڏĽ\Qď:Fkĺj cŻqWţëž6ü^c ZĘü‚…JËYá=«Ëř¨Ůk!{"3/ÁÓEÇ‹˙óţrYÚ/?(‚…÷檻Ëč©Ö[tpEfç¬Ĺ§çń:ŞzŢM^Ź"Ŕ[ŽEH@»Q`Po# Ł·}o%ÍňżĚ@;0ˇg»¸×Ŕęě{ä9)ą$˝ŞÓ÷ÎOOŢF äO®xé}†śÁU’{âČ]˘Ę•0ą=Dř„ŚđŔcá˘Së?Ź\' ĽKdP¬–Ń*…aý\܇:ú9j;б,Dö‡˝ŇÖ‰ě!· ‹ß҇ŤŃĐŚń›×>¶D „jpa ?řR€%&ź,P6&Ó´ĆÓoÔ^Ő‘öj 6pşí´íŻZ©čŻŢV<0vÄ?«ŕĐiFţ]śQU”ěđż'O2Ś3 NsOVµ=/Ľs\Ý"㢻„ĎóOľGŤc’‹ µĐĚ2•„çŚ./{™O#éĆ h¤s*|[4ĺ%XÇ#, `°ŻB%…T|ť‰Ä@ÉĽ7ăSťCA!¬ŔÂkţ¦{śqşŻŢŐv.”e«'W N ˛};#.dkźĎĎŻT±­‡=šř©RÄí®G™‚Séńë}řÍťPfZçCrîűޤżC`3Âmľě÷wŔAr ęĘŚ(ČúŞg ĄżBÄS,?ü¦ďüYüuăX3·@“tlTĚöŃęm?%~0M×zöŐĎ娣t”˘¸jŞŐ®˝źWăe20*ÖłF>!$Ů8"}±ĚŞ5ćÖ‘$:Đ[MîÁ…EÓ5p4¬˘ËT~áG]® aö=e¨ę™h5Đ׼đ¨·ë× &˘č 4ő—±÷|ŘŰůâh]Őxα’zËAÜb5dm2¬—ý¨¤púH»<Ů”ĺĽáÉŮsŮÓ ^:żň§ĺ˘íş3ë1eÁ÷ľaÂnô«ľ™×¬Rŕćůˇ´;:;ěOHIVßřŻrSín~Žł Ä‹juoĚßđě'P"…3ăc˘#gěÁť7XuăoŃ÷˙'tźPç´şŐŃC§ëCMÉâGbÂwLÂŇ×üTIbŁ83Ú†yÖíĆ˙„ô`endstream endobj 337 0 obj << /Type /Page /Contents 338 0 R /Resources 336 0 R /MediaBox [0 0 595.276 841.89] /Parent 335 0 R >> endobj 336 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 341 0 obj << /Length 2558 /Filter /FlateDecode >> stream xÚ˝ZŰr۶}×Wč‘l+„¸‘@ŢśKg’Ib[ÎôLšZ¦mMt‹D%őßź}(ʤe·ŐśÉŚE‘ŕĆÂĆľ¬ĺŐxđâw7ôÂçz8ľJĺ„Îü°(2á\>_Il:’Ęć.9]Ő©L¦ËE9KGZëdś:ť,Ó‘*’%Ý2ÉÉ y·IżŽßŢŽrÁ?9ôٰ°…đÚ'óÁ÷Á—ŻŮđz ß2ˇ˝ţ„ëLHď‡óQ:\Ď˙46F`dÔ˛ň ±ĂŘ]~čšP™đJ†}Q+˝θ#Ćm®!“Ž·Ť­Çă–‡ŽŰ#@jâö¤·;HOĹí€5q{XŚŰ°ľpȽܕPĄ”PęťVšyŚđW妺„qçÉ]»€ŰĆ/ş¶ ˇí^2ڏ$Ëj±ôˇ&3‚<éź(6Ôöęý5j¨ůđAeßąäšIłĽĺl˙Ëšß,‘+ĚůAÉ÷~¤6Ş2 ť"ĚÔîŕÍ˙GGFeô±RkgěńÜ c'×1P5ŮuULŻŞÓËńéďdF ťçÇAlFfYfö}|űńôüżÝ0•B;ŐαŰxZŔÔSś‘=ńońěUůäžĂŘ’‚"jĆĽ’źńŃjŽev‚" ľÁZĐsň@ L~Ąđ†1WQ˛1‚Mă.|ČĄhSÚ"ˇłşĹ„OűČÄ–ĂV‘DZ÷î›BµóEŔßiśS@¬îΆŁÓL˛ą#z>»fĆ„hJtÂŽ4j¦Z&™—5J˘®đç¶=ÉÎÝgë[ňf[ôňs€OG=ęçí˝ýŮxŕ7n¨a¨ňĹżŇTŃÖ¨e¬Ł©üęqĂí™:sýK÷ç€ÜŐ0n>÷Ąş¸—žxkÁ-ţšFx Ę.{ĎDѰčP8úĂč\ů·üatŃďŹh«ëŹ(CĹĚ>đvĐ@Wŕ˘î˝ŕAd–RcüÄ^–żî…Łó–vBô.‚Ó4íůĺdąÚ¶¬YC-ĂO57řu:«®{ 8T\d›íüM±ÉŃĽęŹ÷Pě•MµP!«eŻ o·ťCDę~őÜ™60|:iäTkSžśŹÁ;8ŚAËWí ŕ_»Â>Q1»ÝÎ[ż1˘íLč+qâhWĘveř™NzńEť˛ĐSqì»r[bZ†ZëfŤĐ÷)PŚÎA€îě<¦?ĂF~ęÇäçs!=K}J “ëç˛d­zÜu…€Ĺ'T2¨rů3Ĺg}ńŮ2ö¸řlăcń‰j#Šš®¨†“mQw‚v=N˝&%…ś)#őÔy's‘É=ugŤ#•ź§đÚĺŻ}Ż6 š(€cř)Ú:ě'ŘyP&ůžźzp  @ ¬D”Tmú†Ďäđ=v°I­şđŤ¦ĄK–†ë(©‰qyęýbô‹Ě<ˢ ·ž0łÓ´Ôµ©`ˇ5D­y©˘5ş|éUl"lĂţcźS‡|Ź) iÝ&÷ţESęjˇҶ˘·´<˙˙Ś;Ä™mĘŘ!žaKb^ąČPO??pÓÄśkD(t§ň–Úű™ęŚhxĚx–MÇL’ĐUCM@¶Ü5g»+~H}>ßśľţď˙÷2t+s‡éPŻ^ľxż"Á̓Պ οܮ'ŐÍéú¶‹ŞîůYXŠI#h/>pzO’ážű–ůŤ?U–ĺéČY-ŢÇ ůń3endstream endobj 340 0 obj << /Type /Page /Contents 341 0 R /Resources 339 0 R /MediaBox [0 0 595.276 841.89] /Parent 335 0 R >> endobj 339 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 344 0 obj << /Length 2579 /Filter /FlateDecode >> stream xÚÝZKsŰ8ľëWčHeB„xđÜIĆ‹Q2~;J„¶Ĺř;´!­ŻFFi×^Ž.G˙čdÄ $¤üŠşĂŘ˝ňR “ŤsĄE’Ą¤űÇÍôŮśŔ˘ĹšÓ‰MŁúdŢVŘUŻQQböR¬‰MaEś?o&©ŚĘIŞ˘Y‹3Ę-ě3ÍŁŮ‹h6§îjB¨ËO‘Ńź» Îhą]łů×Ň=_Ńó–F.¸Ë‹@q$×­V­7») i„#V¸D[6[~ýG’&[?{ÖîČc™"«ĹR ›˛iľÍ\fvµ,yęz¶r­ŮÚéó <-Ł].Ť“XF g»Ŕ±*¬Hí8ÖV?ĺ0“Dc;”ł¶t¶0ÖĺŤŐ`IětÉ]MůçDŰÇŽ REô˙”A˙š=&łăŁź_µnŤŠtŢMÜ[GŁ“ Ź¬ŤÝdí¶3sěU?°ó$Í`n5»hk“čĺ“4| s›DąˇKŠ~EëVÎÜqöźŢ˘¶üúäâ”gV[ţĄÍočD’Şój¶Dţ^ŁřŞżď—ˇýŇËj±ďťń¤%žpÍ ?˘Ĺk7;ÝÁ-0Č­Cm\g5M®öú4d§ÄńĺŔŘെĚCçÍ…6tW$µ­ů‰ ±˙޶mµľá'|ŃbşNŻůÝÚτЫÝěďmÎşâzĽŹ$ŮűŐiF{[rÇÍ,oHý5ý˝á7í-ŰşťVý“’Ä;$wQSĘNS6Ît (i‡N-ŚÎ‡ÁÓËŠa}U pÂt ˘nŻŃl L´Űhô˙Ý›aĄtçµî*2ąe¶¬ţíĎćď‹Í“‡‰D9‘gß˝ë-ŞŚPĆŹŘŢÖčÁĄ“Ů®˝™m)˛K÷r¶ĺţ?Ţ=٨&sˇ’‰°JŇ’xÂCÝ ™đ"ßňĺŔ†´EîAísµnżô¶¤ !ar˛fý0ęmÄxS6ÜŮ”›ĆÇŘÖEŽâs  Ѥ7@}Í}>,±ďşĆÓ'Bř»O`맸4aRĄ(Ťe*¬á­˙‘ČĽżCn°ň/Î.îłNŚ0©§Q«§łÔĹp0{Yq Ś9PH'9DĽěDĹŢô´’šű(Z9Yk%3‘ůV—_˝zsyŮLdŇÇřK€ÖLţ#:gšđŁĽ™1śáËy˝Ú,2śŽ Sö0ëowóąŻc v®éŘ,L ‰ľócn±óŹá{Đ(„:Žď÷Âî÷˝ó°ďʎUçű‡´ňľ´:=űtňîôuO·T‹BĺÇŃÍÉzX·4fz ŰĹɇ“÷}äÍ„L¨ÔÎ>Jn× ˙®ęĆ÷IĘť]ť¤¤>Ě‹`şŮŁc!d„Y¬b˙‹5JäćXxµvĚş1Çě1´ębö!­|ĚZťśž˙ÖÓĚhˇłě8š9Ykf@łÄhöţÍűó˙쩺BVé,:]owŮܧ?źG©üĂ $•ÍÜÝA(~-T< / _Ş9L]…ŚMČîfŕĘöü–ŃPĺ!­öCącw*± Ł“‚§äŃZă„ĘÝ×őĽg• J¨´đĂ|9Dµ>•d _r´nGŰÖkíJaÝ]ŸŞ庪zµ/§aŘš»ŢÖ˘Żzět -Ë8CdxpÓ[gć®ŔUÖPž¸ÖeŮ|›ţŘráüŞF­î€Aůß}—\nř%9~_źżúűń9Đą”ąĹLÓn^ľx¬¬<ßl¨~Âőë]3/ŻkŚ™ć¦벏)TT’i‘¦cßŇ7—.ÍsţUI’Mâ"ŐY$“Ä»ă?„!=endstream endobj 343 0 obj << /Type /Page /Contents 344 0 R /Resources 342 0 R /MediaBox [0 0 595.276 841.89] /Parent 335 0 R >> endobj 342 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 347 0 obj << /Length 2847 /Filter /FlateDecode >> stream xÚ˝Z[oŰ8~ϯУܱ)RTß2mHŃ6Ů$-fŃíj+‰1Žě•夙_żçBĘr$»A, D4EžűůÔ?.Ź^ţé˘BVG—WQŞśĐ˛ň\ çlt9ű›I’*c]|şj'i<_Öĺb’h­ăˉÓńr’¨<^ŇTźÁ’“őäë廣·—Gi$á_2ĘM. m˘éíŃŹľ|•ŃěHFЅ‹îa,EZŃíQ¦´/Ž.ŽţŐŃQ˘•0ą’( ëId@ěöo‘Y˙s—J¬$ą2B› ýHóČ,‹ mQXBp)óřNi– klÔ#v+msáö±eX’kˇ µ—m•@ŚG~őČ­QBZÓ]QÁ›TĆĐ% ¶K-ŇŚîřöŻłÓó‰S ÔÇ÷4 ŁĂâęO “ŞQ &T˛Ą5ÂśU"Î{Ě]ś˝}ŤVËx^OŔÜZdôVôöĺF(P¤¤źVőę´6›]N 4Ň4>ž˛ůÂźú¨ĹŐzF›ŇËz]1É]VśJžć¤‘Č…-ⓏžťSŘű‰DÖ M·KHiĎÉ_Ţ G éŠČ $xţ’D=­¤GlD¤™V¦Ý‰ČŮvÜéć¶ň"Mă/&H1CYźźĂT…’BAˇ“×0±&Ńýîžŕ/F.U<]ÖëÖ‘âM Ë›-I\ę#ČÇňH°Ô@m†…¦űJ7Ëm HC&Ř ““¤0*ľ¨š»Kś}€9äĎWřj˙~Ďh'>FvŢ50.úDȸô,;bů¸ą†Wź'.Ťq FCX“>ÖľA+‘6ę9čĎ{z¦XÂŰ~‚2TŞý‘Ńš¸ę™‘î%ť©ČBxÍLü ĹOÂśÍ`îfâ%ÚN u^¶u±¬G3łBĘĚ{Ř´™Ô¨ $k©ŔÚ ¶ĆeŤO—ŕĂ0?ź =žâ-pńgĐ,ý,§W-˙ţÖŃ\“®áíŚß:óví'6´SXşâjU­ĐßЧ8/ňt<í©ö¤„cÝ–íĆßâ®lćĺ·.¨Á üĹjĎÎ]ąŘlđs¤‰¶$Ľ{JI”4©©Îü´RúE$¶l-č¤*[ŽŕdĆ’.čI1‚ÇÍ R "Üy5A= óü=Aĺ @›ľá«5ÍĚx†ÉÖMlZ$°ń;XCBCăhÖBĂIx>Xw˛/˛řn‚,ŁüŃ=QĽ «~° YđŇŦ❫ľü 7ąĽÁ(¶ćm\ńđxîuĂŠâ$KŁ˘Đ7/Q󋦺ŢĚŰ^ć”…ć3jÉŹĹ’"ŰrŬµK˙v6óÝ„Ŕ‘¶¨QÜhJ·(üoĚÇ<¨ÔdĽĽÂgŠ -˝ĺ_»Z 6­ĺ_Ç|ŔrňK F«ľĎCzhé2×~Í´›"_©¦/ť^Vůf$ĎľXî%2ó _đ=‘łÇ+Şďóu»ĺ›8moŞa±/÷ÄsMĽ×|ßąĐ-‡~g¬ČµÚV”„'z(I´r‘$ť;ő”Dźé|O˘÷´’±a„ÎťČ!§„5!ĎĂý9ĎĂ ř;”žE®2ô¨ęIs’~ą˙\Es?G+ąńĘ{ĽHěęÇOďßÎ…B[eaĹú†âî“í‚ÇŻĘ5ۇY®yľäźŹŁÂh”„üY@%áRŠkłsްAëFë€fć3JtýW#‚îĂĺˇü2ŻŰŻ+i'RjĐăšů›“Źr ˝®žlŞŐ6hŇ_^5g·Ńě^ě«ŕţ7Űą«%…“%Úű}HŠőµg<íçX P}‹"óÁ1͇ä·čłŹgŹÍYK茠T3PŁ ź`Ωvăćh%=blÎ=†´Ě…)Ňî@ęS\Ąŕ5а= WžÖa®R+ TŞ}®.>˝~ýöâbhVŘε^AtłĐ`A‚¦ ŽFŢ”śHńĺty»ZT-X:e6hĂUavBŐz3ťr÷B¦sE^YĹe±ę>áŃłéJađjó<şďŰ«ű°ć îź…« ű\yÝ÷ą:ůřůřýÉ›oFS]ö,ĽyZ‡y”T@đďóvv|~üax­HMĎ*1?b#[W<^6üĽ]6aĆgä=“T‚e¦z§âVgĄ›mĐâP9Ł,Qł˙‡Íf•ő3™lGkżĹň’Ăű ,uöz€Ą`®[–N?]žţ9`+ÓB[ű,lyRŮ‚¦Ď@Ó×cëĂۧç˙ĆĎTh׳TĄm|RŻ7`v’^ČžT÷á _^RAŃL}ďBf[@©ăv*Ů:ŰPof]ö/ş‚“ńnŘNă±z#-”(੠9…dXă Ë/rtŽVVm´KsF¤Î/=ĂË/© 1tuľUÝĄ¬¦z f~P8ăž%?ąG|ŚíU HÎ7€c4“‘Žä¶Wć°(}Ď*1”GÂwěÓ`ˇ |tP ”c©Tô}7 ĘwÜ[ť>Ť0¦‡ŐĎ⵹›OŮ HĽąüčDp¤§_ŽŐ=nhϲńň˝ksźzoŕâ3Äçge"tŐÁaĹČ7-•Đąýu€żGhŔ–tżÝđ?™«'ü…Ćę§Â~´:»˘‚ňÓőěŔŻň˘±~"ÂV? Äß#¶ăďóÇ ?¦ű1~Ł„ÍŐ~Ś˙¬Y2°…mŕňU;†íCňŃÎí`űÉż48őŔ> ;©ę}$=@őua„ S lkEVŇ#6"yîşGQý„ď"í`l†? Ľ@<żO’ÜńW „˘<ěMĂ1Ř{»źaoFóAHáËt™'¶p–ß.’oŤţ ěĽgű?ďD;Řyţ Řą‚8áR;ŽĚ¤™P3Ąęf™‚iŃŚčFÖ¬Ŕš[rż˝‡r>^=\KqݡŢ”Lńą|ßßTUĎŐ ¦ÂśéřĉPuĺˇyŘďálŞŚc¬Ľ!€˝^_Ŕoo(ňDbCi`ö+ÖmI%Ý-Ęúa€űme`{â°+ľ´’B¦ĆCâ…}vHĘ;ơÉC´žŰ-L…?6k¨ptł-KaÂ0fŽĎ6I‹ůÔKçęŞB‰âľvéźčoA¸ű.złŢfZ•çÔ—áűŰ’Ę·ßśyfű2}”“q?úVĚyŇôIÜJlśvŇßŰ{ÂOaÔěáÖ8Uňcá˙[ŔŠÜ¦ÚPěI†Żń\®Ó»”ßVßŰĆ“é_~ră*Ű~Gé^zdşwJčA…O0÷őHUş Đáă\¶IäÎCs-ČĹ»LĂ,©CĂD‰ę\y‡IČaB Ëf\Ű’éÂbŞv[żqѡ%ZŁ?"-l¸ó_Jh!żX5]۱ÉÍÓśuŐ4†˙m­Ť v!·Ą;ń˝c‡C©<‚c§! 1Çí¶Ł/wJľÍpĂŹiçĺź˙ôQÜűy;ăg|—˙7Ť‰Rő'î¶Ňw kŻ5€î1Căľ÷qS.9,Mˇ§…ôo aLöó˙%ńt’-!N&Âľ4%PĂ ą<+KŕJĄę ]„ĂŻ»ĐšĹ÷-Ă—Mšŕ—5ö§$j\˘¦QgŕH]Z¬ř%ˇ<đ|súú7ś˙-†=0sŞoWŻ^ľD㆓§dI‚Î_n ŰľZ˘Ń5ו¨G⨢ď&y¤…ĚŰy· _Ĺ@™˙ࢤ´hL ™OeWüş=‚Dendstream endobj 346 0 obj << /Type /Page /Contents 347 0 R /Resources 345 0 R /MediaBox [0 0 595.276 841.89] /Parent 335 0 R >> endobj 345 0 obj << /Font << /F8 19 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F27 56 0 R /F14 40 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 350 0 obj << /Length 2484 /Filter /FlateDecode >> stream xÚ­Y[s۶~ׯĐ#™–‰ ćÍuÜŽÓřrb'Ó3©‰–5•D•˘’úßw/EI´ě&šLL X,öľŔ_nݵĂ\ä©ŢŢi…Šóa–ĹÂÚtx;ţ0J¤ImpµlÂ$V‹bFJ©ŕ6´*¨ÂHfAEC:8ą’óUxwűnpv;H†1üK†y<ĚL&re†ŁůŕďÁç»x8ÄĂwX¨ÜżÁ{,’<ÎZ*÷>Ü ţ×ň€IÔáň Ę´­đ¸‰T"N ÉýˇÁf]D dýć&(fëň «łŽęJ ›ĺ°.ţ<]4wLÔ1ʞ"‰3Gr˛`+LˇĚ†v›”5Öĺ÷ĄÁýeŞébÂŐ‚§ŃhŐ=Ź5›±{°hĚŞPÚட˘'x˘;‚'"7f%Fäš$ű3N˛}ů…e˙x}y˝ë#kˇŤfq&ŔáĎ;J‰DŮ~Wy^Q‡ű«#‚9“'í†(ŘŮžT‰ZçÇ‘Ęń:,U’ cł-©n>žžžÝÜěÇC*ŇD:›ľ #ťĘŕöˇÄđđ’2٬‹r†'GŐ|9+›rڬP!st»ą¬ÖŁş»\QčÜŻ1 fʎŐŘ÷}ÄoGó}šĺRę(®ßđzŇóŽä ăŹ!’÷ű!‘śŰ;"ť_~:yţvO0Ł„•ŮQs¬ fRx5]Á®O>ś\ěŁLEb:Á¨” ®°h”ü^ŐüśWµˇş5B–â1‰! µK`QÔĹś«iYݏ>ő¦Vqü,®Ř"ĆĎ…jrŚX5‰€ÝʬfOG«Ł9®ÇŞŤ×CRů€íHuőńöę×=É´*MŹ#™ăuX2 ’ĹzK˛‹ł‹«˙ß/ @a;1+Uś/VkŚt仞oź6h˘ćâXam¬GÜc9€s-rŕ׍ßňźéŞá8EřRń«/ÄnďÔEöNÝN|ÝíBŤ(ÉĄČAÇHÂŽ1ĄërŠRÓäYq]WË›˛Ůł‰¶Â¤-Č™R H6¨!gŔDSą'vđL0ff´žw€ĎŽ*^^§)j7Ůa€ů’Áßl;k˛ŽeÝ G,䆲áăͶŢY8Ľŕá±w¤Ř·KäTîşí¤ž\bŃ9hęµčłUS4 Î…PŠRđÄ´ř‚ÝÓŃ ˛®Ś˝\†OPĐŽ'ÎÖ[¶ŘÁÉFćBCµŮKÓj‡*bĐ{Vцמ—FŠ ęŠ#áúOĄżyu‡—q\~|˙~/;r%őč]odÜŁs¦„ęj)@):šâP|YúüŁČŕt‰V®Eçâ(˛›S:ěI±Ťĺ&Ţ>Î.¸sŤËŢň 3Ó]Ú¦MüGTďşĘf„s“ÚÁŚŠ±<&ŻĄ¤˛ż>ô7‚E=!ͶŽ@8AI<ĺøę$a/˛ĺ˝wí E$ľ˙]SŠ,ĆĽzđ┼ůJ›RŻúaäŰaôňő$-ňµO!ßKő"ä« `"óR @ÔiŻŠ€~2•Fľt·řĎ#_O}äŰaö4ňíĘÇČ÷ţÚ9ŢŚuđĺoesFX˛®ę ×6čÁŹŚÚ‚ʏĄ‡Ťô٬ëŠî|Ń` ˇĽŽcľßĂ[(/;ĘĂ2ß='użšŔi¦°ôůën‡~+ ťˇ¨Qw şő"*ńv[|…â˝b`Fčž7ogĆ%˘šň ü3vPŽo;°üTŽ?V Öm7–!b‡#@C¬:« 4\aš6Ĺ—™¸'Ą¨UHIą]#ÇÓŐAEńŘ×*4·Äd}Hňy»ŮmłairfăűŹ[XE´ –š,¨Ą n` Ťďˇ5żŽ¶.Zpű2UąĺL¶jjďC ü.-ŹC ňMJ·Ę7Y´ź+űČ´cÂČ«˛mÄС4,üł‚/@ ²zÓg¸yĎ«úŃ@s©t­äžL9ďą°CÖ¨!2ˇiwÁˇcr ż®nyŮĆ:uIšŹűŻü<¨KŽęFPÓ^Ý=sóGZŘŕÝ}Š»ť“Ŕç8Śß˙i€;4ĘßŢçÁ|űő‘îóřÂÔaŁ˘A§TŽ?C ë.•ÝŽýŔ˝đ śÂ_« ›Ť÷Zűé<¶÷Ťs;öpÖÇp/:K,âuęĐYň=čŚŇeTŤ÷óĐä"–výp±RmžueÜčAő gčĂgpŢ^dô]ôŘ‚P‚]ŤŃ?ňMśůDF\ŕÍoÂ×%S ‡řś>b°z=ţ„j”Šţő-T1V‹vš'x#N~Eš)9ÔčŤCŤ |ĐÍ– śÝA´Oł|óú5^ ĂÎŁĺ’,Fµ®Gĺ}…Ƭ'ĄXôÁĄI©á*kţÖđŽľ™ş:˘ć'RŇ0˛FĄAKďŽâďš/endstream endobj 349 0 obj << /Type /Page /Contents 350 0 R /Resources 348 0 R /MediaBox [0 0 595.276 841.89] /Parent 335 0 R >> endobj 348 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 56 0 R /F14 40 0 R /F17 37 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 351 0 obj << /Type /Encoding /Differences [ 0 /Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/dieresis/visiblespace 129/.notdef 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 171/.notdef 173/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/dieresis 197/.notdef] >> endobj 55 0 obj << /Length1 1792 /Length2 11056 /Length3 532 /Length 12073 /Filter /FlateDecode >> stream xÚíUX\Ëş®q÷ŕÚXp÷ŕÁݝƵqw—ŕî.ÁB ¸$¸kp‚»K‚ł{ε÷LÖÚ—ç\ťçĽŐ¨ďíŞ şˇ&WVc5w4J9:¸2±1ł˝+¨«ł±ŘYYŨ©ĹA@WkG Wŕ;;@Ô `ç°±ľăd˙ QÄťĽ@Ö–V®Zqşż&ńDí k3€‚‰«ĐĽ†™‰@ÍŃĚčęĹ µł¨ţu… @čąÍ™‘ŘŘćÖf®S ĄµË_N˛Žž•ÍÝśţgČrKh˙Ö¤€%ÍěĽć@ $EGpěňCë?—rłłS4±˙kůżwꍛŘ[Űyý÷ G{'7W  ŕh9üçT-ŕżä€ćÖnö˙9*ëjbgm&ę`i°ţ«dí"eí 4W¶v5ł¸‚Ü€—ć˙éŢąż X4ÔĹ´”UţűP˙T6±vpU÷rúgŐżf˙ÍlżĽ= kO€+xŮŔÁß˙ó›Á„I:9š[;XŘą¸& ‰¸}ŔÄđaX;=@O°0 łŁ+řxOüŽ ¤żN”“Ŕâd:Ř-\˙úW•íż«˙:żĘěđŽZ»Řţ.rXĚííM~W¸ÁW'9š˙.ńXĽ Çß>‹Łđć{¸züç¸Z€Ěŕý+ÇÜv˙TŔk¸í­˙˝Ę ^Éčâň»^ čěn´*ŕ×aůםîŤj\Ńß~ bż‰Ŕ"ţ›Ŕ"ż ,!ůń€ĂĄ~8Yú7Se~€Eö7Óĺ~8]ţ7Ó~8]ń7Ó•ţ!^pşňo§«ü&pşęo§«ý&đŞ˙&°‹Ćo»hţ&°‹Öo»h˙&°‹Î?ÄvŃýM`S‰™-ĐőߍŹăźúż·X ܼ 3GĐď&?CX~78ßô7óÍţ!6V°€ůřWüŕí°řÁ– xC¬ţ@°Śő–°ýÁv XĂţ7‚ď{‡?¬ář‚5śţ@p.čçşüŕŁpýÁn XĂýkxüFv°†çÖđúÁŢă˙~’‰‰9zú0qŘ9¸Ŕ]Ëî2Vżź¦á`í씕ßŬ¬ĽěWÍÜ@ŕëß;ŔĎČ˙a kđôš!-}w4ăµIoŻô—,žŞ‚Ą‡łü’ ŘŘ3ۉ˛iW6"çLżţIűˇ:ë Úě™Ç‘Kt‡ŻĘ¸ÔysBĆüËž»ń^–w+‘öU–‚׮ůcôöćą›.HĄ™őŃĘť’ţÜ‹ăBeZ ő}řUr^=÷Ͻ١Ü<ÚRYvaźŢr«bd8WFrF¬y`¤$Á¬M†řŰD ´0¬\:v¸a=#$żAÜ›ÁĹł‹ĺ-~™´ŚČb"ŕ]Ó—°Ľ_‹5 @4–ułP›f×öfÖĆ̵9,µ˙ZîžÚTkkčő‚{ÚB4Ą'Ř”§…źâsŃ:…Ż–BU…9~'ů壆­ tML+{ąä ^Šp¶Ň)!D·$ť¦â3¦÷+‰ÜDiFs^ÚT—uđ Ŕ¨ŔĆWĆŹk’ÉW˝Š'hşľďű(“î!;Ä´^°ę8nşŹ^1'Ó±ľź8őőî\ÓSďpQ?’âöřÓŽqĺţ$łő=˛A ]3ŁQK-…®:DŘbâÍź¦'?°ÎôĘ  ŞL‘f.D«ő@´DěBŬšyĎşä€SJBzäÇŮř×[;B,lW:fzvđ8q. " 'îz}Sş˘ôĹĚ'ŐëŞ$ÜBç0t‘2L™ŮÂ<Ť!źˇ~ť··¸°˙DĹ+IK1zt!txTÁ÷ơg‰> Őł×v…ĺ˝ßc©ă÷şp§cn%Čő#Źu@?«olX‰ZÜŐU1Ą=©iC¬ d;ŁČŞĎ¬ł¶OĂ>GŹRPäárd î/qąĽ_^öĆ6íĹś{?/T¬§µ;Őô„,Řa§X‰šźEĂąocUŞđâcŢččŮ,#um,|z'…ż@%8X…:`@ŕJVúâŰmLŤ4F#)׍>"—RjJŤP=•3ôÚ 7vWÂ1 żČ{Čw»ş…ňŇőPŤhDXŻ+*haíOqČŞ91”«3:Ă‘»@'°NŇ.¶đk¤U~fŕŘ_˘HyĎëĚ2kýţҸ¸~čš'»„‡ak˙H¶ŞÍ­ö¬ms±ŰJF@ś+°ş•D},(-ťą´IŤäŽ<´úęőľ»ďZ-9)C_ľ‘ŞDgÔkSĎe´Ş„µťť!óVVm{ĆůB0îë4}RÉ,€ówůM‹ű‰PËfj†âÚłXĺP%5…çŃ=îůTlĚ»k2čYď4Ö<¨©µ-Żmµ„Ť UĎěUÎf¬„??ř>ô˝ĆÖąĹĐ[«‰§®Ogű5 ŃRÄlΙô őUŇ&<Rآż*Í~˘pH(_ô9‡N`q­|I®.Č€ô«qi·.ęŃĺ‘J`˙Śś›Pń5éëŢiU§ć~BÚ}PÓ7!’\öÖ®µftXaŔ{ĂJ‚ÚěDkVěOAh€ś¶W33#üŕĂQWpŤ”ĐmB¬đ-+wTiý†D@}ŃaÜŤ»kEµj\öŽŹři‡Ř(°ö0Z”™¬…~Ő¤­8ţ›Ń@2ń'‘pלW©í(T~AęRĹ †Cşí§ÄüBÄ9¸ş&/n‘"ś˝ĺˇÁÁ‡Ź4—Ң,"ŰçÝň–@µ‹€;L«ăĐÄ[Ë·k]-QhŁ…L‡ę×lŢ;eÎë©­şöŘ1&ˇ›-GÇŹ¨ŘIE^ď ŮCŚ@ŢâţţËk°Š3fC_ş]~Ýäq•Z‘ÓŐ±5Ű©¨z´RЬZnqvR:SN¶Ů§}üśWîý:»žĘQj0pŇŁkk‹sŤ2ßńZNPd±¸•ý!clx~S=ŮÝęúzΗL¦»­ v3C^őË6#ÍÚćĆ ĐŮĐŠë&ŠśĚüúôQ}S#ÖL6ńŃ…ŻşVÁŐě>ŢŹ’!ě ‘´ŽŘ&­Tú’ŁIĹl¬ “E~¬ě7hŇMU褍şqt0iÓŐáÜ÷ńĺÓâĎw…4bN®¸GPs%ÉäNŚČLŘ,Ŕ÷9˛˛Ă¬i¬h&jéE1ކV…ć#_¬ź5ĄÝ¨¤52”i éőgťGtJهµŤţĽćčf,’ŕAżÝj=Ó6­3ŤÎ ˝łw˝ŻŹ§ątu®ľ!ÇCíž$AÉŞH˙HÍI Pżiĺ§đąáOB‘^¸°ňĂúĐŤ_Ŕö32Oünc+ ܱ‹ÓÇíZ=dYË9®sÎl`‚†Tu•Š…p <…„™*¬‹ąĐVlNéŢ_ëe&Z÷쩳®ycă¦˙˛°¸8ĆąĎîs%é+±#` Ý»üľ ť&®Sóţr{/.üén Ţ= +±>E| m˘IP Aj|Ć“׍Ág8žNŃŮŰÝͶ))"Ö'tö]T_îp?\M%»~ŃJőą>sߊ÷c´–'łiíŰá3î‰ IQę¤ÇÝľÜA ä*yI—#ÁsĐîűÁÓŰ:JÎó0ńťˇ|Ş·ĎYć%eüÁăÎŐŕÓ8Ş!ˇăy˛ł‘î:Ť9 /ś\ßşżtŸ/Ń~Mţâ\doÔ¨Źł~¶Čąľ±OYňčÇ"*¬Ü„‘Ťż#ÜÎť{mÉë§M]xX.@"á-ď:· hgůÄůeŞÁ'ű}ÖuĆ«đŃ€“€ă^R€“űě.cĆ)ÇłŤĎąÔđJ]‹v`Rr‘e¦Ží#®VĎÓÖŹÁĚMdľO'9K†Ż<ĺ˙UG€yŁDÄ'Ř#ž)üfŔ{_ƇŮŐźKA8˛:¨’Xń𴦇ť6Đ&^”ô@¸#±OśĺeĐÄĎĹHjuďük:iu‚ż:Hž E±‘ůˇ>;öf虚CłXf7˝Ł0]Čţ2údĺ ÁR“-µ“Ä}Ű9ÝWŘ ůđ| ‰ďdçÇéHT•mŐühI~xn,íc5>ľź#A˝|E7dŃ~X'źJDP“ÎFˇÚ!Vî!¶@€µő6űkd)qÇ,ś#]jO¨ ŞD»­QŤ„7%űÎěžô—”äNh‘öÉ­şüŻá}5׏f)ۢ‰Éďk"«Šů-ÔGîJÄĆsa¸Íxá; ›!ÖékSTĺ´5ŻW߆ĥ-Ł~-MŤěﻑ÷&0XŚ„îůYżĐĘTŇ…6.’ŔŚşž˝Ť =Đţ±vÍF¦—ĐšůÂᕣĘEŽ»nÉőͦS\TÂëhóŕ€§sĽ‹Ĺ2Łg~ *|/ÁY±›;$¶T—‚6aU€Ye˙†INZËÓżX)AĎ‚%ĐDĺ`Çěéç Ç\Y*#fŁ]ŰuڰútâX ]㡌ÎËM őđ ›yiR-•QűÝmb©7s¤_¤4d/Ş–¶)¨±ď~4Ě%:•ŇŽ÷- eÇ[MřČ‘:“i 9¶•[tmĂČŻ¶Ł°Üű¨„âáKyď źú[Ą"ĽĚw‘‚.pűă5`~fČPxŠ('_bd ŃhúżÔ‹§Ö<ÝŇ·{¬ç%•ęr D/ŮĚ˙©óŚsÁ'ëZýřÁ{FmS)CwGÍ‘ź/č‘ÄsÜÉÄÉ„JÁ¶€éŐtC͸¬0–ż<>§§ĺá20şťü+a\vú:,^Z-aµć‹#D9eé…ŕŞÖ!ŽőżCk8މĚg^”Ş6.®±ˇLNÁ70|ąc ¨/U%}»őĄqĽ3ýŻŢ6ŚSýűü»íóTi34KITaYLËt§0ôˇ+g&ţŐŻŃHż 1 ÇŻ ß N.3J®â^â ręXÓ´ «·J(Ć,}`%‚ ­]ŕ׏&Ęő>{~ČvRz «.X蓪]Мγ%,úB÷y¶Ş“®/:¶Ť/|ÝĚßSjűţëËŞB ®d‹Úv”! Ě·ŞNSÇO(‘ąž?6ů怱óů(Ć2Úç–#ŮYS<# YGö:šP?/楹]híW5wtěSí?¬ťé“„¶4Ć<Ô6¦±exă6¶Şí9íÁu° Ü\7U—t[ďŔ|?Ą[g÷ĹóžŞ{ĐŽ^ěűě DÉ´0ĺĚ5á*Wt“/eXQ¤m;_ĂȨ.¤pĽłÚŹşî®[®Âůç”ćV­ßŃ*ŐMË{v ť¤…‡ç9»čž«ŢEbb•¤`Î/é:k)»#˝K>šËkJbµHDěd«\Mä>ŮÇSBŹ'ĎŻ"L;üÎîÖ ęç‡Ož8\;µťzcÂ4nĚĎĆľşp‡Lđ¸Í×yEy¸$ßďŁbče·ˇtůÚ/ZşnćŻňĆ핬°F*jJ Hsí1Ĺô†odź*G.\pâĄŘ°|¬¨@ÓKŁś&ď䧤`TŃ jŐÝSX…‰-Ţkű)7¶ˇí–C6¬9ćzm'ź´˘Cçn´SV+•ĘUě–ÔÍÖňĽIThĎa„îcýNč—ňŁ]¶‰V«—ü0>eÖĄÎźęŠ'*śb\‰5ó˘­¶Ý;:G“E1ËŮN¸ČžVł˛÷Í6k­ęâÓ@°<˙™"KgzjíŇ^SťÍOLĚosn OáźârU{KbŰŻŠF`_=zP6^ŕ¸"rą1¤ŐźË<ŇČS„1¸=|„f/đEĽ±íßDyüĘŹ}Ş_›Öx{whStľůâÇV\Ô'ĄE#:śŘârVżćë×Ü}ŘK_ľß–ŕ&ÔĚĄ|ŕeľĘUfMJőü8mÁÁüĂ1Jů–zTŔtFŮűËŻśçR Ý·×Üy{Ľ5Áńr›7ąˇ˛vżô ď…ß2(8ÁS! VŕťÍąÍ'wĹáCŇ5@GęA"'#y|ł‡äBµ:ŤrNµ%Ü>&\ůLE0’Lu|ň‘včĐ(ţľË…źŔ•űcş’PB3ăć˘<ĺ`B7Raë«ĚĆYáö1oÓň±ßő¬ňŹâ'uŚłý±ł /dîď|·?)őy0źČd8ŽYmśÁ™w~Ł€~"×ҰźŚ=;˙Ţc†YLH2 mb@řŐU_ÄđRŠß)c ŃÔxý(.ůĘ®—<6Đ~TÂUx{cç‹©Ő9Ä(އM((úňˇŘşÓě~ݦ“Ęż”µ ďż‹}śC3aSZ!}ŘĄb|˙&8’$éÍ•Ź_!ĆÖkł_—¤wІw´˛}71?ăcń=“áëŰÓńi޵ńÔ y•ɶ {ŽĹwň*ů€}1*ĽşPĚhńç(¨ÜF°óĹTń;Ą°(xՉمϛ§Ý}Ši ď~•Ť…$á–Z™Ň©Ăĺ}@`9Üf€ĐZ ń¸! U+ç×Č ĐfŃq—źź2$´T­•JH·]°tEĄăfUŁ›ŘúTĹ6ťý≋,ްqXŃP|˙iQZ€’ô´zőŇđ ŕąöçśđĆĹNŞşűT/ˇťźoíg¬ l:ŢÄTNţ÷ ©7 cĽâMâqúż<â§t®¤L˛Ö·Ö‘7 ÉŰÜgý”ůľˇţąvC9ЧjÓë1ž¦ŻóĚŚ‰ë.3ąKÔOJ”źéëňtÔ şsü­?ŕˇăf懥żŇ¸Ä¤öÚn@Ű@ŞPěź>ԉШîI٤‹Gę?ĺÚolăđ&››{Ży‹D±jČSÓ\j»¦TíLľ~PÓ®ť»ůˇŽĺWboĄ:Śłź{©Ťlcu@ÎňŇžU/ÉüŐ•8 K˨—Ä;ßżąXĂŇ"e.łË¬ NźŞÔŹ%s;Ź FŔ!fď™´IŤ(+lT?-LţíeŚ7ËYިsŇLŘ0}Üŕęn呌ĚŢu‹NfŤÉOvv¬Q1G&˘{iµ7Ď›Ô\ž„:ÁĆ͢úÝaĘM-˛â‰aHÓ) …Ń–U÷č ËKŮWLŇXî›ĺsď~ˇűuz˙0M%µ_ţ°2?nö“)`9CĐć5ĹăGľ/Ż®ů‡/µ—‘Ë5t z.Íx—Űj‡Ç…ăwX{ĺ^h¨ôłNqăá{]ľŔ¶ŃĂ5˙Â×»Ť%lžűĄńé0W˝ÝŚVGsĐńnnťď´®íĹܟ̝ZwŰ÷Ë>ýçĚ%R˝{~IČ_~{+­·\ĚjÔÉŽ‡Ţ ËčęK„P­§)Á2\ţ’ÇWÜ[uů+„j®Ń#Vucs˝µé€;5fČeÁ‹ů)Ąx6Ŕ¦xşŇ‘UŇQĚô$4ÜđŘâr%PĂŤ6LđyC.b*ŰÁ;ŁÜUż˘Ĺ­uĽf’íLW'z˝¬»˙ÝyŤľ¸9<Ł)«LĄĄŇŮŕ0ČQ¶ÇĆÂőŠwrŐ7cŢ wĹc‹ľż~ó”a&+EŮEO^t3ýÜJ%|ŇŤF#Rű×…ëý¸ě¨Ňţ ·ŰB'eřOę‡ĐᯱlčÎčéŞ8´3íđ=px<’ĄúľIzݷɰr°hÁŘţ—·8¤%·m )§ĄžoX\9h·Ú3Żŕ:‚Ť<–Ë—$ #DY_Ć`˝ĘŁÄ7ë‰DMÂöň+óµŹŢ÷:Őă?Čl»9ęšĂMzč¨ţ`BĽL&h6ÜćŢÎéë*db, Än˛hŮČ•ş)~P‹”™kIBđ9–— ÂÎ-łWyĄ{čóŽV^¨YÎ7+şčgojĐígÄ„ĘńA"§ë(Š9 Ć{&ηDgP|_Čaé6ň± —h†.ĹóĚT]ń{rűŃZŤŹe‘łâeqća˝Ž‰z‚1đ6ą”Ńďoć2h'‚ËÝeĽ[>Żäk…źtY˘$EŽTNq@Ed~z›mÔu!Ń´2´ ËčvěŇ[ĹČśýët"Ězř`8Ń·úË'«íaU·‚J˙ĐšCĂ„űU*b5+‘˘ÍĹÜx=üŻ˙łý” §ÇMďeż!ú©4Ák)ʨEM±Ĺ|ÖBýM­¦ă,ę5^'ŽX˙KöěĂuý=Źž8»g„©´ČJH±îŞ_ “k$ć|Ô»É9aäٲp~'^""5“‰Ž‚ ˘zSÁç5o)ÇůwćuŔ, ÖJEŢ}=j+1ý;]üŞ%ëęŘŻ”ô"ľo'ëş·¸ýĘÜů´ć,đn1ĽÖ¨í5{ ż¨ßn5w©Ľ®5H/­OT1¦µ$˛îöÎaÝFßŢčNLŤ@dČÚŐßř0đçű~< şB<źB¸&*~—¦ŕ:_Y Y›ßË“UĎí¦5W >˛ś•AüHžŢy¨Čµ~ÚMhP&ŻOÖ+śUćä(@÷‡lÚ¸Ćęç¦ç®l,+SĐ\Úb1|á±3Q‰›FĎ™…]ŔĂŕ0żß@$ĺčč(ź®ď–É čß#ěů\ŢçđEě7ŘueúĐ”.Ľ^÷Ř!V ó©†}Χô!Qĺy>5=ôuBż‡zÚ-xč©Ě类0c'Đ“ëúü€ťBĹ6;)éź÷`Rßn‡U®ĆÍţ}BŔ$ףnšL¬+ę@Śü*„)ńây-+Ab¨L™G§yŘ ĎťeťşôÍo9 ˝ě©×sşŽ™¬·@…§T¸'W‚W˘k-ëđn=©$ß>Ü –#>*% '•Ó’Ť]®[Żšq±{D{Şť‚ă{A“nĆäëC¬•eíĹ’X–óD'Qí*ÜťşŢ«mř…ť=ls Bٶ¦|˛°řSÂhô¶^ΫÁídűT¦jbr÷±Č~ť+=él 'ަČ="5WĺĎłX]a6ˇsá÷=𑛿@řNÂOĽĚí Žo—{“Đ—VyAz­ś}Ⰷƛ·˛>I ţü)č0ű‚)-á)¶ő9z…Nć{ź>ăśăť°$K‹I·Ž ¬N $ńţôBwŃh>”+Á¤:*ŻHEh’çţEbĹćK˙Šu~r·Ů›s{"éŠWi#řΩůđŞ®ĎŮ*^ß}âŕ\H]Ú2Ú ţ<«*ßř(Q°Zo$ާrM yżćôň„Kú Ę]Ćič/>+±µç“˛żDV É&,žÖ+ď\t[‰A0ă,ľ‹}=ďJü‘"YOĽťő4<jVËŐ{8ĺ Pď®PD@ÓÂľ”zëCNqĺ"= ŰWËńo¶#pĂaŃŘŘnO˛“ą—ő8ü“4^Ť» ž{,×SÔŐ›u±W_A–$ł;N@Är,ňG$÷$ÁŃ87îîc›ź\‹c˘Ú䥞޸@97yÉĆsÝč ÔÝ‹©Áa<šgĐt_űz깯 ˘2bXúŁfř7›Üő扙¶žAÝs6ţJLNŻŢ/!ç+ÇZ•ŕwÍÎéýFwZj\çRűoşť‘Ç ÄŃŇY^K7ŻçB‰°Ë‚ľŮĚ“QMńE3Ú‹µŤvŁ éć,Ą $Qý0SđĐcÉ NË5=Ö L‚I{$‡ŤâĆ9çÔ„özlHB:yŞÎşîT”D ŕ*1\"Ęš†0HšßłŢvľGÖľĺbÎę‡Q#’×đ ¶ —'ěŃß=Ă*± *ĺ”L.ő`đ)X˘QQĄ›»g˝ÎŁću"»Ě=T0-ţQ —Í}>˛C»áĺ'íő™Ň×ÜÎęÄýµČč3ި']†Toî¤Äľ}Ő|A-Ve÷ŢŮŘŕĽP•˝)đ Ţ€§“ şĂKÔqĆo”a­óžĎ±™'ľ#í›/ÔQ áŮÂăÎíĘ#zB1Ú{?íĺĄz3Ě8´‰6 űSž2sr>IžżĆ´îT=»',Wu"äŹÇĐŤ„Öqťź Ç7}b3¤fúăGďšg2ŰĽÎőZPŢÚ`/(iÓ$ąŹŔ\I_ŚůŇ~˝Öu3Ő:J ]á¬öBšŰŘ´łCi쯤zˇkgČáDĺŘ|ů©ÔőĆ? ”!ďqvřÚ\kńą}Š8§á&xÍ­7DëL0ÄóŚőb:|·żsSW·GŰĆ™ăĘ€›şQH;ć ÜÇ‚_­őÔŮ÷cöŽ6«0ťŢ]:ÜĎą˝»şź1’×p Ő÷ë \°Ws­qL¤}š5)Óýµ!®ˇH•}”IöymmźiÜfŸzM˛›F¨ż„`ˇ‘łÉđĺÓÄEH±­ôđŔHĽ(t×3Oé§Ě· Ŕ~ČH„Ž)\-Ă]öäP­+*ËÔłk(‰›ňě]™«‘~uo˛…áv!šßQE¤G ˛ěKx¶E,Ű<ĺhy &“^čë 8)+żmá×’6&ŘëbP$[%!ÎęűĎLö¶«… j{S˝wňÔĂ©ŕ0ĐF űЏăáÝš ]+Dxý ŤôT§hvĘ™VÁ4ÉS¶Hô¬a®°śŤm…ą7÷Uîq/˝:]`¨RcĂđJ&é+ü¸ĂCEĂÂŰ”3ňŕÉEĂxor.€1 ß =]í?^ C/:ľ–Sú]›Eł´h"ăuŻ·ô ‚KÜw‚•x”qN{HçA˛b 2©ú=“jŮ :e8Fv5ŚÇ,ćaéţ–!c›€ýŁfĆ\_ű[óĆ7-7ůvĺ·|d—Ü]<×&¤Ż¶żt:î[·~;Ň€?¸Žç¶ľçŹŞZĽĘőŔ7ŰţY_ăÎĂ …U9÷Ł&Hůvť¦›˝Ň{‰1íčűĘńP%ŽY=:^´R“+.qŹš+ĘĎčŻË¸ŕ č§N5IE†a¬[ń¸¶MuÍ›đóRѨřwÂfäEóť¨5PZ aĺĺŮŮmţ•"ůëůŢ^±5^‚ţÎůüp‘ wHM×x]Ůß<±ďŹĽ([Ă“ Ů v°Ö‰UµŰsMt5Ľ!ĆaL}DY<.N¸‹Ń“hG¬ďç@-ćÁ]$‰Ľő§B»sÖđÄr*ŔqĹR‡QĂaľ®ÓÎěëj ­˝qíôN†>١Ĺ,DÚe+ÔíŚ-ç8ICrpYL$±=Ľó,ĎĎ’Ké:\‡ÂÔ ~·fŐýĄ4Yđä[hżűMá~°)(Őß =pĚ/Ša> 16Řsj…F—e7÷é{ÍbĂôzbąŔ¨Ň a…¬ĹžI´§L´oźłłiúŐś„&äÂĐó O[Žüâh±ńCĄ•ˇJ3¤É=Hđ›ęč_M\™ 7A)púC®ßéDőPĂâ¬jĘ)ŐáXj·űjŠęŇ„oŹ& XÍż¶TĎ2het(’WaM|˙uWÇaÚËj˙6Uř2¦}^}¦hĂSO,YßVCîŔĽuÇĽ±5—¤žÚ÷1_@HI“îţ“Ŕ¦‘$*ŰNŕDýĎ1=´©˛5S$<A÷Uč°µö× r L|–¤Lqu‚ÓO+%¸ôĐV6[¶\ôXżĆ6zLuč>7–ľeWT<ĎęqŹvv&ÓáˇôÔ͉*HCŠáLsňvř:™ő›)T?KńJŠď¸ëG· <5ť.yĄ #+ţAÝý1Ë "⥄ (ĄbL őÉlîËO~BZźĎ~đEŽk ¬‡ÉŇí -çCPe´Żůđ}ĹmŞLśČË»näR+a™y4]G ů§DÄĺ- 'ń3ôR}ňp˛ę#«™3ŐŃč§}솳ÁÎÇ€)Â<ł4†:ŢźČăsngŞBʢGä<Ë©ŮĹ{.]ůÄşďëúŽoy3:ŞiŰŞüwŃ‘Q+śZ¨GމFqcf2+g‹ÎťLj”GwČö;ö ]„‚ÍAŤŰŚĂb LšÉŠX$Í”KżŚŹýc®ňŢĐ3´g}ěyařőü¦ý)¨S‰@łšŕ‡>ĺןżÔłä×*L˙uW§>ü:*8Ć©7ö[„©ýă ÂRŰr:ě2Y•Ž~Ůjy* ^ň5¬´%\Ç^^&™¦.@Ćş+ť¦PďeŹi7 Aő·+‘Hfe  ďëR…Ő;,Î_ć]Îä…[}­ČűďYXű]TűŇh¶=ŹĂŽ­f•×Ú†ę3ť \ušß›ů<ÚV4–.´7Uĺ}Ţl&Ę"u'8)2÷ huńOq™UQÝÎŽRC!ěZľůT.?$7iî„ÔjŇšSŐ#Qö҇MU„ąšąöüB)łŢ•!ÎÖVsą9›UA‹†xmŁlŘiĹ ßP„§„×¶%ŹçŁ‚“ţ«čŘN]Ő–‚{ŕťÁű†Ö ňu/NrÁwŔ˝€UŔ5#ßdÜ’ă †4ť]„“/żs ¨×TüćµßĆĂHĺű•Tüěň@$X,}x iΙ-s‹eĄÓĐňf3Ňv]7T8 #r@DPô%ýJ€ýä€Ď€ő‹†@ §däđ•d‹řd=¬Ö°*UHf„‹€WOĚ6E~ŤÄŰ!§ĎfĹa°ăĚzň-ĎŽß ]űűńâ˝ýµŃçîü‘o9’ĐAŢŰĂNlöp“»i{]ALň‹1DâlĄpÄfZ›DŮ-‚ ~rPŹśC#䑵™:í~˘äÍ|ŹA]ť×=7č±ó)¶…ŢüvßĹ–»ô ­×ś»žXL|¦n~Â[5éţ$ÎýŔÜ˝–Ň;ó†ßű¨Üů&®ĂĹňµřĚEűJWqřÓ}ĂbňĆrDj¤Ş™ůŘ*¤˘Ť]s!˝{MłpÍOß•‡(ˇT0KŁYj'KH]ž‹GߦÜŰđmWĎqłăÄĆ-¬†ˇaĺZ»®`ŤŽ.ůŚ˝ćŠ4>ô1CcF[Ź–uxř>Í%ňřĄ1Zh!®zşŘדü]Q+ÂH°[vIQŢíhĆ(Îé©ńî$ŐĹ“toÎ×&rlď‡ňÎ+ń,¸˛n#H×af0”Ň&;ĎsY« íÇi,|ň‘š*ŐBfźÜŤ s”~LçÉ”hÎ&G'ÉŞµxž©ÉUzC ‘„‡ă˘Ą“Ćý¶Í#Čj±¬‘MŚ„¦ä¬fхꛋŤ­E_?ëî™ě ĺZfr“(Vá híáíˇ…FÉĽŇHĎqůZéxČe–‡,źšbr) •Ô¬4°äçęŃGÄR­żîš$٤λFúµ¦´¶;—w '~|·29p`Z¦ (k<°8áÍ:2NÚţŘł ˙öŮ4ň¬Ö"9€MZ’Ď)÷łç0H#îĐxdţ‰ő˙đ é˙/đ˙Äfv@«Ł˝ ČéżaĂáendstream endobj 56 0 obj << /Type /Font /Subtype /Type1 /Encoding 351 0 R /FirstChar 40 /LastChar 122 /Widths 352 0 R /BaseFont /UTBWPQ+CMTT10 /FontDescriptor 54 0 R >> endobj 54 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /UTBWPQ+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/parenleft/parenright/asterisk/comma/period/zero/one/two/three/colon/semicolon/less/equal/greater/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 55 0 R >> endobj 352 0 obj [525 525 525 0 525 0 525 0 525 525 525 525 0 0 0 0 0 0 525 525 525 525 525 0 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 ] endobj 353 0 obj << /Type /Encoding /Differences [ 0 /minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/arrowright/arrowup/arrowdown/arrowboth/arrownortheast/arrowsoutheast/similarequal/arrowdblleft/arrowdblright/arrowdblup/arrowdbldown/arrowdblboth/arrownorthwest/arrowsouthwest/proportional/prime/infinity/element/owner/triangle/triangleinv/negationslash/mapsto/universal/existential/logicalnot/emptyset/Rfractur/Ifractur/latticetop/perpendicular/aleph/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/union/intersection/unionmulti/logicaland/logicalor/turnstileleft/turnstileright/floorleft/floorright/ceilingleft/ceilingright/braceleft/braceright/angbracketleft/angbracketright/bar/bardbl/arrowbothv/arrowdblbothv/backslash/wreathproduct/radical/coproduct/nabla/integral/unionsq/intersectionsq/subsetsqequal/supersetsqequal/section/dagger/daggerdbl/paragraph/club/diamond/heart/spade/arrowleft 129/.notdef 161/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus 171/.notdef 173/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/spade 197/.notdef] >> endobj 39 0 obj << /Length1 772 /Length2 576 /Length3 532 /Length 1127 /Filter /FlateDecode >> stream xÚSU ÖuLÉOJuËĎ+Ń5Ô3´Rpö Ž44P0Ô3ŕRUu.JM,ÉĚĎsI,IµR0´´4Tp,MW04U00·22°25çRUpÎ/¨,ĘLĎ(QĐpÖ)2WpĚM-ĘLNĚSđM,ÉHÍš‘śŁśźś™ZR©§ŕ“ŁŇQ¬”ZśZT–š˘Çeh¨’™\˘”šž™ÇĄr‘g^Zľ‚9D8Ą´&U–ZT t”‚Đ‘š @'¦äçĺT*¤¤¦qéűĺíJş„ŽB7Ü­4'Ç/1d<8”0äs3s*ˇ*ňs JKR‹|óSR‹ňĐ•†§B盚’Yš‹.ëY’“™ě—ž“Ş kh˘g`l ‘Č,vˬHM Č,IÎPHKĚ)N‹§ćĄ ;|`‡č;»zFhCă,™WRYŞ`€P ć"řŔP*ʬP6Đ300*B+Í2׼äü”ĚĽt#S3…Ģ˘ÄJ.` ňLŞ 2óRR+R+€.Ö×ËË/jQM­BZ~(ZÉI? ´©% q.LŹ89ĺWTëY*čZš 644S077­EUš—YXšęé˘`j```ańYriQQj^ 8 ĆOËljjEj2×ÍkůÉÖ-YÓ·µ­¬s]|a«>çĎk_Ţd?±ŁnvfJm°éĽ@Ĺô’%Ż>ÚÚwX<ű˘„W˛őTá˘-’˝~=q_ ŻŮÚµ`YÄ„Óýz7‚Ĺ+›»¦ńţÓVĺy¸0lĆśÖGŇVű‹ĎęTÖąůEąţĎĽ”NQ‹÷}żwŤ[H+h’–’”ůÍěwĹÄ+ď>ż,˙iGýôă¶ÉďÎŢňń /vëRżfÇťô%ńۮش˛‹µź9ĽňâQąDĘ˙žýŃod;”ÚU? ^Vńµ«Nşúú©vńKŻ{~­ńçäÚ/ëtôî…Ă-Çé÷7¸ď“ő‘9ńŘ8ă·Ô mżi"é÷Ś™6=Ű!y:ëIčĆő†í˙_°K-­ű±,1{Îö)˛.oŞ —ď¶ý*Ţ[«ç˝mFäű%»s_Ű-j(lĺ¦s˙Ďůś~gŘşŚ|K·~›¶#ŁďµľřÓ·&g®]p_ň¸!—GrnM`ěv®^˙D·l˝źŢë>Z`.x‹“Yh—ý.Ž#ÁÇ8Ź©ŻŘw6O~ˇ—5“{Ţ„U7¶đ807ě™ő…űkŤ4鹇Wń»5ţô öŚďĂąfŐź”ŰVĽ RĹ—÷mő‰_A˘ëX¦ĽOďjW;[Ă(Ď´˙ÇęĽuď,Ąn q(ď»°őĆŹŤA®ć…Ëü+Ě»·3z^›"_Őöű˙‘Ů“O:†~ýUűIŻH$P†kR¦˝ĎíĎ-‚©˘áúş×y'y=řŘ'sµńó‰Bˉę˙cŮWdtDÇ?ű:`‡‘µŞń˝w¦[K˝đ_°Č€BŔ5jŔ°0 9'5±¨$?7±(› ÇCxŠendstream endobj 40 0 obj << /Type /Font /Subtype /Type1 /Encoding 353 0 R /FirstChar 15 /LastChar 15 /Widths 354 0 R /BaseFont /CEISQX+CMSY10 /FontDescriptor 38 0 R >> endobj 38 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /CEISQX+CMSY10 /ItalicAngle -14 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/bullet) /FontFile 39 0 R >> endobj 354 0 obj [500 ] endobj 355 0 obj << /Type /Encoding /Differences [ 0 /Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 129/.notdef 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 171/.notdef 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis 197/.notdef] >> endobj 36 0 obj << /Length1 931 /Length2 2654 /Length3 532 /Length 3309 /Filter /FlateDecode >> stream xÚíRy<”mۦ(Ďd*Ĺ-;13»ĘľeěegŚĂ,ł˛gßbl‰P–J(ŠôX˛”d-[eËž¤dyÄ7Őű<˝ßóüů}˝ż÷ľţąŹă<®ó<®ó<%D-mäu<  !O’‡+Ŕ5=s]{u®HHčA CŔëŁH WW‡:do@ŔU4”T4 @ŹŕO#bĽ}H€´žĚw‘* ‰4 ŁH> Ž‘ŤÂ64$Ń,°ţ~#°@"ôT€Ŕá€'M<@o ýnČďETŇžd˙?CŔ0H3LĘ ‹ž<–x‚^(’Ŕ¨2śüú{rC2‹Dáľ§˙ޤ„Q8 –ö/çO&DŔśŕ ń—žzÓ%`˙QĹ„„ÂbĐ:xo,Ŕ~RCL či‰!ˇ}/6üÁxĎż[`t퇨ĺ9[}}[ąźÓüłDađ$[š˙_Yż‹`ř/Ěč 8Á`08CČ8ţąü­–MđÄŕë€PPD"Šaě!€‹p÷0aŞ€'WFG‚/ň}Ę*Ôź1‚çwţ'Ą@/€DÂ/B€đŕ_ $ęŻ8ÎŔ>Dđߊԋ@&ţ"”†ňo eŔxâ_ÁŔ Ä˙bÎ~Îç/F€â1˙2ňĎŽëę/Ę#ÔyE†C8\¨"`Á˙[h‡Çś'&úŚGŔ`Ş*Ş?X4™Hń¤ÎćźŘ Ă=‚hČ›!Z3Ň7«&úvAá‹RVYf]ď‡)ČűMý .˝NeĆ–tť—Ż˛ßşs•ŹsŽuN„ş-_dŐm¸~>ĺĘŕÎĹ}îę…GBö+WÍiłţÇ7.}ફX[D0[ôŤwŢNw(zzísۇë–Ňú¶ďöŹŠ25;Q4çDިÚ^ĹÚĹDUI*‰Zs_9;V9fŚĘťNgë˝âĂV+7˛L¨'ón˛¤í¸íőě>ëľaö)“Ć1í¸•ŇµÁ[ćr+~š\`ží\ľíá4*’ w®$ć H­ž 9gW4úW ä9nZ°V.5Š3Uĺ@»¤UFślu­…ű^ŹŢ+Ň•ýGP•p$Ó¬i©ú<ď粩@csŞŕű~t\ô~ęM!>çćd`2­+×·v,0Ň÷x.“ÎaKÍÜŚ›pň\Łß÷]VYH­•´<2rVť¨n˛ •KOϨ«}÷‡%°Ů¶y~OîYLÄ{9.ƲĽľÓV«Y#Q«{|išVsU ¶^"ŘB™EězKÉżśŹp>´_ěxµĺŐçîÂÎĹÇŻŞTĂý9ů|Vi*Îá7ý†0ˇńů•üm+<Ź:¶óRFď"ÝcJB4Vľ îá˝ö¸řëąąłqěâç˝]Y˝v ąĄż˛Ú(H!q!ÁŠżUšuŽ ‡śĽŞľ\Ź7±ĎEN‘3ÇÎJrpŻÉňölløR‰şńÍ€÷ZÓv˛ż®k‹KFđ.ťźş‹X“n4™eF†f—•4Т‡ŮP^¬®„ Ů[÷[8?ß\ä3Š0ŰŻÔŻ,¤ś đ.$CöŤ NSá…€ř9¨FEÍŐŃGŚŞd]¦ű)±"Yk`<ŞJń§ŽůV}aĘ˝0Çwť˘ŠGf¶ó,ŞM¬0µ 8ăüA®E~ذît“…DGr_Lż«dQGµoŕQôGŮ1ͦÖÓçt:qS‰A>óé&ŢMÇ»ěR.jou o}Së˙8|¤ĽfŞißbăVű«Cµ [áÚ—K»°›2r—…Nî+»lU\źµ»A}ÓDáęYC¬·çE{EŞZńvÉ,tjZôČŻ€ŠčJŤIź¤ť"_›8sł±ÂËäŇťőŇë´TED ­g/· ETm^¬¸!Źąý„¶żÚŽŤm3@śý‰ŤĎ{§•Ťiů‰ĄUv™FńâZ’«ŕ©,¤ć#ýŤkďćeŐ»#îeŹÎ:[…×&ĽÚ÷"EMbô´Şh4XňdBśďĽ^©=zŃ©Í-ÁŻ`áż“Ôxš­svů©Ýł+LtĹŔ'ÔÎÓč…íśsÜ4žIü·+Ťśű łŽCnśĎ’rw$nľJ><\{7rŽD}ţlňą&_ĹÎÄ‘őńAýHWč‚äťmÍ–üvBÔM$ó ÔIg/§@ş¬áLI¤ĺ«Ą—ÂŹď3»‰4Ł/ŢîÚĄkžÍ.çxËc{§˝Şm6¦?˘qbĆ’€#,—=«L*…7‘I{ˇ@@̨LÍEĚ•Oç“đ× \;ŇNŮ*J?ë=lľÄnź"śÄ,PŢE+µš±őyĽŮZŰŰz•¬ŻşěIÂí•8¨X2+™-N­€-Š´óvűý1ígJ:ň8Ţś‹U]ąľ—iÉÓ¬ě^čنܻkŻ—F,·X‘ËWŮ6‘-ݧ?âD Lî" a%·+şťJłËLďM\4 k'őWJ ń†…Éň ö^’ç?÷H˛kA—Ë/\x1ŠÎ9%«sAd”i_>Ş«­ëˇŐ˝J3:ŻŕtÜR>věÖËÄđ8G˝6źbKĹg;HĽy] WćNŢz.śkăB% ÎńEčVüHě˙+BgĽcFÄß»Ě_2;—`ŤR¸ŰĺôşŰččŔÚEhó¬G ÁWř0­Ëů´ÔbďbëeÜRąÚuë§!ĺŐŢfKî B´9ÍO˝timÚ”‰ÍCóMz¬ęFoW.U)EdôŇu^'"ű˝çT:ˇ×¬» :ÓLő2Ëz÷§˛ÝĹŽÂoűÜJMHpžj{ŰjXuŞŁđô%S·fő:rf˝ÎÇą«;n`ŕ1˛B©ŻÖ“čë[VÜé{ćEŤ˘ÎŮĎô쩢ÝŘíýK¨÷sĎĚ#ĆŇ AažĂR¦Â1GŤőB BäCvޞ.“ć¶· G`C „ő·ăxă"Ę^Ż[őĐÇ­ź>A xŤ=˛—Żń~,`LˇuęW5”ąüţE¬ÜřĚך‰öµňů(óÁZŇř!§¶‰Ć˛Đ˘@™íáE‘Ä;»‚ÂgÖ…iKě\_k¬‡®´>"Ź$óhřű.__ˇpŇLH3ÇóvňŢ/Y$ćÁD[żĹłłü¦(XyÖÄ+¶~cöÖš«(2šĎßÄ+hűŤÜ;ąšń.§Nç–Ѩ~y–„tWš0FŮ1/wÉ· ŢĄ´¤Atc!Gë[|š˝JŮ ?†ĽsÉS%ŻW×áNźŚę1~\ęĎď±×h~@\Ń’Ýč}zŃ2X#Ç\rďk#ö÷÷÷€ß]6¬âź×ľ‰Đ…ä´t†!ÂŞC)bÖÚ$ç·ţlľµ€h)Íü/LN®ü<H–6ß“~QŹ˙ľwˇ7,Ýsä÷Űt‰ršTß`qxťâ».¸çüč3I)ËńeĘŚÖ“YlµĘ·˝â–†R\OśÍ´55ŹŠ^÷xwv"(Çžü$ŤĹFzâčŔË„ĎŃřÔ)}6ýÂo2ezQ„¤ăž#ďN%n'™°śÜqs[ő¨Çp4ąĎÖˇjŞçOČü‘IşO§WaŔe™†T»Cv/&ö¶jt†ťgÎ6…÷öŠi ńT:žy¦&Đú)1Ä‹oű2^Ý|ŰH ŞoN ~{öţ,ůU%ůŔbC»/l÷€bśR÷óá:µÉŇkúŐ~cÍŻ\TŢíqso×B=ŤŠÍ”{dÔ#ŐÄ 5:>Ýt‹ˇ±(2ĂőŤ}mĄŹ_€đ‡çË]ÉšlözpO&=^0vŤ»PŇŤ5Ě"ĚG=`ý(˝®@‘ŁËÁ㡪®’6_±ĽŮî:.Ţ‚3«Ôé DUT ʆ•/ĆÜ9¸Q}¤öŽä>üÚg?÷"}­¬Ţ“z ď…ó¨RŰ]möPĂvi3­ÄËwŤÝy5úbůŹ=O,5p4¨ŕ^¦wÎNW™šş­žřćDć >ٱĚőćř3÷ŐWťĄ´ĄÜݦŕËÎ,9÷>{‰l–ŔÔj ß}*ăČů¤üIŐčô 6Ńšł¤3ČűŇ_kNq>Y‚4QW—xH‹ŃąUM·SŽ[ ź¬.ů6ŃS¶îÓNwMű²·Ś Ú±ł±íIaą©źUĽÍ2!čŔK˝«ąVXN’ŐZâ­Ň2 «8řaMîë“”Üěâ«ĹÔŹ6č5Ň­ľ‚Ľ "u~·đCĺI‘˛٦É+Ţ “¤A†wk'§uG—x«©yßcvĚďçńNąŃš#/ÁXÍLĽ^•.ę‚]Xšf©‘Ëöü ˙Mđ‘ŤQD‡"úAţ4«*endstream endobj 37 0 obj << /Type /Font /Subtype /Type1 /Encoding 355 0 R /FirstChar 46 /LastChar 57 /Widths 356 0 R /BaseFont /PWTDDT+CMBX9 /FontDescriptor 35 0 R >> endobj 35 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /PWTDDT+CMBX9 /ItalicAngle 0 /StemV 117 /XHeight 444 /FontBBox [-58 -250 1195 750] /Flags 4 /CharSet (/period/zero/one/two/three/four/five/six/seven/eight/nine) /FontFile 36 0 R >> endobj 356 0 obj [329 0 592 592 592 592 592 592 592 592 592 592 ] endobj 24 0 obj << /Length1 1125 /Length2 3572 /Length3 532 /Length 4306 /Filter /FlateDecode >> stream xÚí“y<Ô}´ÇmŁleé‘%ü˛%ŰĚŘ…ěĘ.ëX3fa3Ś™al%ŹH–¬‘5YʲdÉ’,ŮB$[ˇĹ–Ü©îÓă>÷Ď{˙şŻűűýó{źsľç|ľçśźŘi +m$Ţ e€Çe ˛Đs€®©•• •…0‹‰éPp"ŹÓQ稪*Đ&ąrŞ|N^áTŽY ĐĹűPw" ˇ{öG2 íŤ"`p` 'z Ľ©9p,`…G`PDŠ, ŤĹ–?Nř–(?ŚBĘ2Cˇ n(w ŽüC!Ť”™‘$źż]dÁŹ*  Š< P%"ń8,@˘ĐĚ`3<µŠŞäCÔż“°X3¸÷Źô?šôßÜpo –ňźxoELńH÷ďP;Ô/m¦($†äýoŻ!ŽĹ ´qîXůeÂř`PH á áX?ÔO; ‡ü·jß~JŰŘ™č\’ú5Ďź> 8G´¦řüÎú#ř'C˙ajwŔ" @©Ô÷ď/çŐŇÇ!đH ŽşŠJś@€S©›A%E  `pHT€   ËâđDę€Ú“Ť'0˙§‚<öÁ’ü~X”¨ęđČLĘŘ ÷óřmQTŔ<–:˙ż-JÔÝę×űMĘŞŘü7©(`ëßDÝ 0ü˘F"~ŔČCŔ¨C(€Ń‡z÷CH-ăq0ćRb˙A(µîR á!µĎ!¤f&BjfżCHíńRďG:„Ô ú˙Ä˙ľ1::ř€ %E@FN‘:B’ ¬ ůŻ68Ś/ e¨(B ČŻťAŽřóĄnăߌĆPw… @!'^ájz¦<ľţ T?ďe1H’VÇ˝ö–YUËpKřx-¶°ÇŘWrş¶[’Îul´(äżÇďÝ|©ĎŕSď­ÔŃď‹d×ĹôŔz~Řzş)eÁGx;|ĺxĂă‘ÍUEZóˇénŰçwÜýÜą’c!ˇg˝täŻÓ4­ŽäęÖŚ?•”aéX›ČJqůӖ쩾˘"§üŮo'2L „‡zF­“š\Ă7’8wóŽŢKúî´ů~HËń¤á5ňN’1—"üZÓ·$jçĺvOÔP?¶Ş|Ź›ßó|÷ţ+őÉXŁ2ŐÎtń‹\»”6—Ňä.ľzÔ—V##ľLJg ľHT. xrŇDŔtŁĽ™"$ÚZ©ďß‘Źóθ©ŤWž|§´Ő›ľý&žŞ?ękýͨÇŰűĚńuÁ8±ćČńŤńŁ´“«¨áDŻ?š5ŚI {Jh uúDo6%ĺµ^ażî74üÚž¨=÷ůpýŘV±ýs Oäř¶¦ż:?q¸ě˝KSf¦ě+µĂ(ŁG4îÓ$úÓu†­ę*ä6őR‹/ĂűŢ˝ŢS…Ҩő†Š5ˇ¸]Ęä{Őöxtä#†< ~ĘĘH­ˇHe”†;Dq¬©p±óÉx˛úö­O‡é úćŠoł‘ů^ivÜCź…(ü&îŃŇc‰üĎ÷˘‹ŮLJî9G ‹Ü-’fw{[Ľ|s…ťIËW:śą ëoîҸéj89Ţ“ü㪯N ×Őa.Ź‹ĐmâËľKžŰÁ»ÇTŢ­ÍÍ‹€ąJhĚžk7řľ˛BŃh€Ş‡f–'YT—îďĎĆäo1OÓv•Éż”´ňbäĄŐŔ”ć͵GgTúBŇř‰”"Đ‹l\ôhMpBŽrÇĚS˙Nľ‹ßs3A×§SvŽHóŰű5…G̉ '7Úż/JŠoűÖŐŽxh+Â]«Ćç|]pTąĹ„%mőZ‘ĆäT– Śo¨ĽTĆöqŃđ´Ť2ožˇ‰WaéöĄ0ď ľ}V$ĄŃż2â|!%î´Ů^µ•fÝ‚÷`=şě·ě_sÜhń0Ť.ú2h°Őc°¶ŤSd˝€BÁÖĽšű)%v‘Ur ťţ.cìl™âłşĄš¦×Y˘%˘]s]c6ŁkI%ęĺÓš2<Ś%ľëgł•ůËO6Ď‘Ý좲iŽÎJ¨Yl ç‚զ瓕bołľŻ"ů(w:čS«Ź“oaPĚUţaQ­R¦<ůęŤgL—h´ şy×âkŇ2Ć®cł-;Ş=$€ĺČóU ľźÜ7żËňÍźC, 9ä+E+Ś’ꎺşPTU}3ß3¸nWŞ·µ®1+áuNîýđw“[Ů~ˇ2ĐŮ©ŢÇo(-`e×nĄęăľ!Pž*?íeEáÇ;¤—ľŁRőµÍjýŠ-Jű\Č|{8ůcŕžHńD ­9Ě3˘fŘĹNč›Öů2š§«o8Ç{héĘ8÷ÉŤć§.ÍͱĆ%ťâŚ)żY~Łň^7cY35«JqÎîëŰýGďH°É K -ęÇUůŹE'˘Çľ7X®Mŕóá–#9§)•yť¸µßł ZĄČ`=OAý•őڹƇGúYÜl kkVŁWŞęĚé´€úę‚y. žâ˝â;îü ׎Ą),çKÎč ˳ɒGcőşICĎ:ĹEÉÁŤ¦ 9Ét‰ůĚ ]¬‡HMugĄf·×8í-íÁýĆÝ·…1>źţHLlŢÇóT衔ťđx&­żP-‚Ăٱ©7˛ÔZ:Ҧîi«ż)ůĽą˘/çaźM3¨dv}x,uăŠCC_Ő$ś7] »’ďOÁĽi=‚»•:‡Ůá¨Ăng?ľŰ7)AĽ‘öąę‚ëzćNq±BÚ3!B'>}Ü=ŕŤSwĹńëú"Ҹě%Íó(ÉL”}iśfí[Ő3Y6€ćŮTéµ*KMiÓ˝Gµ´ţ yLc|L*Öw«g3żl4)•<ÍýŘ+•VÜ– Üh·ú ?LÜcG˘Ô hŤ}¶Ľ;ťšKpKţp– ű†Y†žŁ˙äÝ1Ä3R˙ůÓňÜçár·Ľž'cŠÍ+.ĺŃMZŰ=÷˘ë $z«:VAŰ Ĺ©.ŐŐ:´;ŻÂčzŰ`á ËĎv‚Z6Fü5•ŔÖ~ŁĐ×A±÷tRjó d=2żîş?¸ĎŔYC©Ř¨t]¸˙î$÷|ëQUŕĂcMűI>ý:eЧŠÂqç€EuĂ1áµQ!,šÎÉj»ăţČ6ţ4ćÁĹÖÝe`# eŰk«şšÚşŚeLę[y\íń×Ô ×ĽAü†,‹qŃ^üŞłşÓıQ‰‰62_ ÷ 3íbĆ"cÚ‚gfb» †ň»yInlK ¨ë|ěäʆţ›6;[=AfĄ˛Z\[|Ý:Ďéz÷Ú˛¶Ţ°ž«ź 1E‚»˛;=vtBűĂ»@çÜOŹ«Îf˝ĺúóK(eĹŞĘ2¦PŽžüaë^ĽäfUüpy¦ÉŔ˘M ÄŤjaĺ®jrź‰9öé̶Ąx«Hű»Ë a«ŻCźż+kóő1>-LryuyJ„l>BKkŰzrĄÖĆ Č;~F•ą9YÓäŢ‚ÁÍf΀/B©ňJ7ŤĂľŃ)}Ö Jś]pFÉrE6é ¸îÄe¤łš ŻŇŻą9đ ĚŽîťTN*®UýöN^ŚWµ˝řö¸-ZŘ'*°7÷ ˛ÝQřřä«,ó©W\-Ej¦Pç˘U˙Ţ”@F)ZľzčąÚ' 3šŰfřűş==ŁéU9b\DSA±€J2‡:÷Ř äř0˙‚˙ Xś@Ä{Ă ^Ě˙•x¶ŕendstream endobj 25 0 obj << /Type /Font /Subtype /Type1 /Encoding 355 0 R /FirstChar 43 /LastChar 119 /Widths 357 0 R /BaseFont /UUNLBQ+CMSS8 /FontDescriptor 23 0 R >> endobj 23 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName /UUNLBQ+CMSS8 /ItalicAngle 0 /StemV 87 /XHeight 444 /FontBBox [-65 -250 1062 761] /Flags 4 /CharSet (/plus/period/slash/colon/C/D/O/T/a/c/d/e/f/g/h/i/l/n/o/p/r/s/t/u/w) /FontFile 24 0 R >> endobj 357 0 obj [826 0 0 295 531 0 0 0 0 0 0 0 0 0 0 295 0 0 0 0 0 0 0 0 679 767 0 0 0 0 0 0 0 0 0 0 785 0 0 0 0 726 0 0 0 0 0 0 0 0 0 0 0 0 510 0 472 549 472 325 531 549 253 0 0 253 0 549 531 549 0 363 407 384 549 0 726 ] endobj 358 0 obj << /Type /Encoding /Differences [ 0 /Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/sterling/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 129/.notdef 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 171/.notdef 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis 197/.notdef] >> endobj 21 0 obj << /Length1 1585 /Length2 12168 /Length3 532 /Length 13100 /Filter /FlateDecode >> stream xÚí¶UTśÍ¶°Kp‡@Ť»»»»Ü§q'@pww ÜÝÝ]‚;Á‚ĂĎúöŢ+ů׾<çęŚÓÝýĚŞšóéYUďh2"E:![# ¸-ȉމž‰ "§*ĹÄ`˘gd†'#q:YŘ‚D ť€Ü&..f€8ĐčýËű‡›Ťť›‰ž bkçî`afî ˇú×$€ ĐÁÂŘ3t2ÚĽç06´¨Ř[ťÜéBÖÖĺ­p(.@zx&&€‰…±Ŕhf‚gř—“ČÔŔń_ag»˙r:8ľK(˙ѤĽKšŘ‚¬Ý&@SxyŰ÷jŔw—˙7´ţ3ą¸łµµĽˇÍżŇ˙Ó©˙5nhcaíţß3lměśť€9[ č?§j˙KNhbálóźŁRN†ÖĆB 3k €Ž‰•ž‘őżâŽân@E 'cs€©ˇµ#đź8dňź&ďýűÇAHYXAQ‚ćż·öźAEC “Ş»Ŕřgö?Ěô‡ß›ä`áĐf|ď2ÓűÄ÷÷˙|ÓýŹbb c[ €™Ť`čŕ`č˙~މ ŕɰ™Ý@·wcz­ÓűŔ{gľLmŕ˙µŻď[Ď`úOěżů-ţ Ë;Z˙Y¸ öζďŤý§˙fe0Ř:AÖ@Óż˘L˙ýŹÉ¬c[Ă?6ą»ť9ô'Äţľö˝Š­Éź'€Áč`űďçżYŰţYĹţžHč˝çţC‘?ôľVô˝˙,±Ç{ $˙Đ{¤ţĐ{™?ô^Aö˝WűCďä˙Đ{…ç{ż˙Đ{=ĺ?ô^Oĺ˝7Kő˝WWűCď4˙MďWŚáOKąŢÇŚţĐ{uă?{Ęř^Ţä/|ß'ŕ_řŻđľűý…ďBćá»Ń_§…ń]Âę/|·°ţ ß5lţŕű…`ý…ď¶ỆÝ_ř®a˙ľk8ü…ďŽáűľ8ý…ďVÎổË_řnĺú×ů·rű ß­Ü˙Âw+Źđßxaa[7O:&v3ăżŮ\ě\_˙ď™j {g ”(€Ť‘‘‘“™óꍱłĂű=qúçaűţ8ů6µxn@cřĄ[cžË䆠bo±ü©(*GĽÔ˘€±ŽŔşTúău´9‡ĆIU ÁŐÇŔŹ–Ą¨I§2ĺ &¦l›Ř B^ž* ‹‘>Q妩Ŕśëčeô Řd†î/îÚ5Ňś/“Ün¸t@UĘ2qäaź†A˙\xąö¶ňß\BH1!ŮK‚×Ín•MŞlÄŚ>žHŘćŰ. aę¤Ý˘ż.a÷¬ÍX­"Ąr…gËA̧ň=Ă1Rą™nŤĂ3Ą[.ifqIľUŐíŁŃ»,(¦.Ę#qŮ÷˘â[ÎXBˇsDť°‹Ŕdťl—ŞÖąŇëŽřMÍ• Ţ0ÔĹ—@ćwJă.@źl1évdĽŚâ@@Ě0RŚs?F#Ě™ţ8A¶7™T«e~ścősŠśË%Ô3æńűśłřĘřpˇ}ńů¶~ ^&é Z5QˇE­ă°s)R\.ĹŁo†Łö1á#˝Ú„'‡_ľL=ߦÚRĺe–b”H“ćÉĎŹćOţźIg8zÓ’éś~ťH8xt!dHsĎ.ă·[zĂ/ߪ_QŹčÉŤË=™âC1ŠÉ!- ôĂ{p:ŚŢź¸Z\S řtw9´¬»&Ě"±QRcB‚ł´2–JáűX©•ýw5‹Čă”oTńZM”kłćĺXl°ă˘2¦KÉËýŹYôŠóL8ѡxt[ÁĹáĽ$‰ę݆ÉT?!ěhÓuާř¦E ?Ǣ¬g!‰yŮ•U©? Ęu´Î©mé‚|™đ•'«:żÂű\çúŔź¶Ń{VÔK˝â+ÁF`p¤l†ÖĎ/čáÉÓŃ n>’ŚŐč&ęČ-2ÁŰY1Ă×čD:ŃÚR%2«>Ş.WüBžs ţŠÝ6•VďRuűÍţ Áŕ'ŻĆťjĚńp§3îWf±ĚTNĂĆľŞĄaęŹw¶ňĎČ#gˇüÖ§*;f‘Ž,ĆtćŻ_ź4¸x–żs~ďMş7`.ö…;Ú"őüzŔĂłksň¦g]ČD!Bťä­0‡·f°°‹•¦ů¨şfŚu«÷ú\d<9ÜqBa!Ú~D¦z.O0ľu$r¶’¨†~Cż6ÉUˇLŤßłŞ, :‘ŮÖkď qdĐFŻŰ?hČÍ] Ş>â á—Ä=Ş$9]jMŘwC:+p-/ůśeZú5¦Î0ËýJxRůVR…“—˘× ĹQŘ'‡ą%Ě_´)URaÓj˘ů‰ßÚ­Ô”€pxşB0hhĹó6˝`:~ź‰%lšBĹÚý‘ş¨¤ś5üt.Uî·5vńŇhń(F]P;–°Ŕq'MÜuöš’Ś$xŢZ5\Đ]Ő^1výY»ŠżĐň%Ă* ť?üžŔĆz-Iž>/Ţ4Â<, äŮç;pâ<$jźŁóFĎÁ`¬TĎ^üB—ůý"0ĆĐÜé'ľÔ­¶›Ś6Ëř$íâ…!˛řfĹ"ŁńËĹžgŮÁT®äµşÓTz×ćk¬E–,šĚ¬ÔV«Ć ¨Ž—Ť§­yóăkąĆ ¸}ą)/łŁ+Ąô@ :Ф% ý–OŘÄĚšN—CÖ=ŢÉbjm„?,ÔĂTµ~c]P1ë ňekŻzë%ąç® Śv†ńĽxđ8ěar̶˝ł7âfŽë÷TŰľŞ%łç™‚‡ÍRk2ßŔćoąş:ˇÉFě4SmşlÄu اzsÜ Ę}’Dü :ó:Ń&C9¶Ů~łřNInOŇ_“‰´µk8ëX°°lëesđ kĽ‘ĂH˙ŹŞ˘ć™fŇÂFMáQˇXfźS8Š•1ęhů¤®jc¸âö̉@Ż,{‰§žç”{Č»ÚƨRʉ3+şő„âI¶„ťĄ­ş|Ä*š9?ÜđS©¤ę<đü°\ÉzGäď÷ťµé@ mTśâawŢúĂ“HAţ:łŔ3— ”ŔM]9ç÷g˛ľ¦ˇÖ4§v2&ţ±V{ˇ]Au#+အ˘@{ţj0µ…N¨"Íɡ=ňţěG-cBŮO Ś@†ţĚőČ^FrVtö€mé1­ů-0»“ŚĂź†4]ÉhiĐX‡¬éëqÍŘś“čďŹ$0ˇ,‚Ź0ů!źžWŘÁ 2·xˇSÇ»sĽćľĽÁ”Ń)‹lđJÚ/Úřh‡U“ĺđ’ň„vČúđ›áű›=[ĘĹĎo¨–@‰Çőč~ڰű‹)侨ó1+űôŚq´nda¶÷|› pZôł,ÁĽd…®Č’Vž ŰŰGČ„Łź\äž3ŇŤ/ł¶­żŔĽ©ˇdg´ĎÁ|…fÁ{eŤ8ĘCű.;zŰ”¦Ť¶®čÓ毢şžŢpÓjkTŰE›g¤f»xn=y —g§3–"1c+|¶Űö\?ąÁň#ă)uů7D›ĂÔ¤#žö펄;\‚´’ń MNDcN&9¸h=ŚP%%TŽĄ%^Ś›=SŘMű›j—ĆO5жMswä=Í ęÉž‹áb”'çnÂÍ>¤d©ŚÂüLţpWž{۪⡋„ă¨mTOŮçĂ&ňCŤĺű|!ńž*TĆŤőć<|©päܑf¬Q „- ÓŘžĂŘ“ ŇxËÚVµăŢó×ÚzŤ´‹xöÉA9Ů1ޢ[Ęo°]Ř{ĂË-‹vç8'4Ćű;÷ J<üN—`­$«ý0ŰÇŇ~×+9$ ˇ •xŞˇFsž˝Żľ¦-yŻRŤ9í·Ü % óT›‘°ź©tQE»>ënM8y˘đ`&6XŇÁŻgAőő"n’C†zno2J·î{Ín5C”˝ě(ĐâKV„äCŐ+Šk+#Q.ÝĺNţň•ŁĐÁ źń Ž{TÝ=üú_›ĐZËĂwä.qŮ#mµfR o#;fONŚü°wÄôíLż|(.B¤•éŽĐÁ ”ÁŇi«âđä|eŐa©,i¶Ě+:ý¸ŕŮ®ć`ů“Ĺjzçš›sůÚj,MÂşú΋m#”̆O@Ŕ9ý)—@cż‰Ňĺîbd~NÇş@µ¨MZŽ­Y“ÝŔw3Ŕč»h”ĂžD‰ŚŰ$'îč5úŢD=LĄzisÔ>eچ/—ôŐ6”ëçÓq“¦HLŃ’ţ˝tä3+@Äi”Ňü3Ă_!žíW˘Ô+—=LłąČŁL[: Dřű´±“’ÎۉÔő ČóşRÓ·ŃŔźĽ##ß0°¦fŹ_z©Ôč.řőÄ“Ib;ŻňÝöňĎÂŚŚĺxöŮ<Í5QŚű¦0Mnňú©4­NŤQýĆdó%~ËÁ0č˛nŠą8ŁC&ÚĽd.ŘűbgˇáĆęDx1i-(85F„Ó†ßAÎ(d Úź÷2ČŹ¬<•ôÔd š­µe+]ůD^aŻYµ‰Ý^Ĺő†o¬Ö_joŚC_ÓĆĺOµ\Ľ/)3^šÖN)g>ĺ‹Rç ýŠW †řżTň:fkÔ—o^ćŕBďŹUl¬?éď#ÉtWć?–:ŻöZŤśßrłá=ą‚4š©ź¤ßW…·ŔŢó“A—ö1ś7„DüĹ(Xµ ÂĆAßx¨J?‚ŠbĄ»Q˛†ědC>s+ç€]ŹČ¦ńEDžşm2.ď) µ}Íp×>ŕ‹OË—uyęöŹF˘< ŠRńŇ bń«ç‚Őő6S˛ß…‡%Łě §Tę–ćĹ2ŁńĹÝřťmrÉIúđ%BP/ÉŽËď8°»ÝK˘g,ŻJÔä–ÁžţäÄÝ‚W"čÔÍDĎ‚ ŕüSűIç&XŽ{żľ{JŘĆ/˘n+gĎçŻe-^ńČ]XüóĘ™Ďîęš{GUîŞ50ůćÂč·ľy~ßţÉ/VeA†;Pěôó'ÄÄńÉm¦Ôh*%wŮsWişâ§Ř2§)±ňăg(¬ů;hôDżţŞŮ“!˘‡CÇeލ8=úV­«ů…Źmqč˙ůĹtb+ił‹ń­Óý2ň–8éÓÎb$WŞşOË›Ůć©o=·‰(Â7¸ŢOE·ômíŇpÉěYÓr7%ŞôľpŕÉ–‡#ËRÉWľšVúr˛32/2ŻV˛ŐĆŹźÎ öĺ9ďž*ksżPĆÔ;ź9čmř•!Ţ>9Ër0d‡Á|?yî,ȱĹIď!:? Ą°â’Űîű¶pFŠÁW2ő;I¤}Ĺ­BýšçڱQQôĽq‰ć¨˝šU)bŰbnŐ‘¬+EšT„b‹&YřiQń~pî“7Yhľ[.¬LÔ*í*%Xf$ő¶Âévv2˘/9šţw(â2ZÄ /ˇj8aĘ«NĎ aVđć(şO,Ůppiü)8 ń‘`ţ@VxąŇž“ďĽ1ä¸Đś¤cůë­ÇÚň˝Î_Ń˝.–Ë”ÓcU--‘Q˘—DŰ?X|ă|Ë™w*b÷]Xé›ë`$é‡]ÜxtwÉâ,ăÝŚ˙V6ą(~Řbj$„éë›7“ŕŮŤ7¦Ż9 Ş4ńe–±âłÇ´¸ Ţ=Ó´7ZŢ؋ȉů4]±:ĘiZs›•ĚŃ^b¤4aÚQ‹ňóÓŔ V¸Ňgjk—ßá;ž:?)qÍż¸,Böć€ŐŹŹ˙­ź|żGdFîxţ)oĄéh’)äç UR­>+ş‡˙0XĺFT&oNJŔ®WčIé^>çŞMć?/3Ě`'‚L™ăŁjÂ6=쳵Υ*‡Ě„˙ <Ĺă¶ąTĹŢ^Ń č<°ú¶Í»ČşýHëđβŞBŘ ŞŹQ&(ţifľ†őg‰l‹ t·[¤)Ť©+uł”Ó~/}ÜMC?ňë7ăĘą%h­_»]&źäYôE3{˝J“d·ŰG ®]ďmźQëôJxŢ.-5”YE(@ĂO´nF„÷K(0ľzËě3čÄO:+÷š÷GŤ‰¶@Ëć14¬ ĘéRßw\;ŞőěýÜ‚a·K ´•¬ĚP‰ŕ†č1űŻŐ§đjÜ7ţäövÚĺóŚ4ZgN!˝Y)2*_©aÓ‹BKÚĹ$G™Şä^ÚÍÚUzŻĚ㊠%=‡ž§7÷ÚsŮŤçĘëËÎ 8ţűőŢł¤ ~(öPůÎÉŢŔ—éu·™22Ă(Ěŕňű8Ś.hhp$ńŁď·H…âüI÷,$®Jd–_˛Yë§Řýü7ˇ#Nö#39]SzL:ɦ,Mµ ¸4aƬ¨6˛¶5Ť+ż]Dë“–+Č~¨ŕKŘČŮ&X!g•Ѧ×YFňlúŐXŁ’ť*ô,Bů6S§®´xiŮŞęîHÔş$D.Ŕ0gaźŐŤďťůáĺ °‰z¸KH¬“_/đJßö äĄK^—qçć­;˛Â~î1v!hH>Z‘}ŇÉÝN¤đůmt÷Ślî ÔT»47ôä¦5 žVY‘ ćúv®&ú"sŕbG$bńEŁk´–őP_˘zWKD}Ň%ł?nĚUĐ(’őŕWĐĎŮr,Ę®%§0ŹToÄŚl5^”Úe˘3§šę t<ަ ¤(OMCĆąĘNĄĄ´0xXÝQBő0|OHŞ.o»Źb÷›,™&ئ…y ¨łFL1ü3ĎÁlR ŕ(Y׼>_Łš ©!Ą?ŁzˇIGjżyÇfŚ “4~–ĺΔü~éăÜĎĺťă˝)7őÝďGş€S%Â#u—_¶pÁ’d:Č^‹ŐŇRc˛"˘_ żűÇ ł*Ě“"ŕm".ćĄđyâ×tż& Xé5aĽA}šhéŮ+óĚÇV—úđäŤUŕo‰süݰ.ńřŞÝÔĚŽZ‰ Lóę[‘©dĄh.Žś™ŁŻĂ)™Â±”Ć\/ż4Nö‰wŠčőL›7Ćş„O32ćŁ8öżŹ>€]ł´BţţévWç¸'cČžÄő˙°:ży4˙“mŇpńZFër[ňbeűçÉ÷fjײI7Ť›ý¸•'µÉZäDnůi(%Ýě)ÚÎZtů–€Ë™NmôD>” -;ľÉM ˇőlÍ× óÉ ý*& Ó“ˇłčüČó÷Rő§\šgM?bŢé\ßćtĽv;{ žâďłyĹýŤꉓa¨·C¨ąQ#4ŰÔřNw CQ=ĎľŽbĘĺ¨!›DX?޸_kła´”[ŐŁ=Tí+ő «$ŕé°˙ Ňľw¤Č籲Zţ7Ä„”Éä8dă6†aâI]żPNźS¨3k_UÄP›ĚJűóüC„úŰNŢŮţ»;Ő‡ß_—¶g©ąKóĂ/>{ă«Ü‘rĚ ‚ďf‰ŇzĚ8¶µn”Ě©íwf Ę‹ßWăŚ÷1źDmáŻÉ®´ŻÜľ¦văpť|&öňąc5 äČč#Ń#öIŕ^VŞV>ďW7k7ÂÝ5nš{AÂĐ$„®‚tĹh“ …kţ ą"‘š %öÁ J4Ç`“ţC˙H˙TéÖsŃčdÓ‘Đ€Ł9ÄTÉičůRH‰T™™zůŘŘ$Iš/'0hlęŔ)¬›:#Ş~kA­¦úŘ.ƦL#Ző×ö‹(©§©—ř€0AÖnHUżĎKŤĘ˛Śâ‚Ý)!v?ÝDBŃńŔÜýłW$ŃăŇ"-š}^©cĘ­Îjhq±UġxĂtčg(ż#ĺ531˝#riE ŰĂ:ÍŞŔ¦ř$Á!“U/OČ&ŮÎŃŽ„5ÉN{žŚ[–© ßÂć ]+ˇyÂxşÜ­§Ău®ĆűOĆÄ–y=ë$eë;/Ĺ’ąž…śI ·ľť»Ő‰~cĽb]Âqůăâ]˛>ábĺü­ß÷>ŕ0Ä<Ęg‹<–—qáě÷ó\ÄĆ<•kMŹ:1,"5P_!u#_˘ŚY”ôëp¦[8›y@şS9|€.@<ŠdűĚiz®´:F–1.90d•="ŰFg6lÝ€í—~3żmîűuś§¨ˇ+{:Łňaó|$ťśí‘rs;©!·€D¶öl1’-·'z1]VŁęE.ͤ Ňzyâ‡AaÜFkD€ó/¦ËţAńüŔŠôˇͧŽ:ş”'M'¬Ú‹3ůrÍ+~& Š‚ë aF:Ľ(›lš;FČ »utyc@÷2ŕ;Ću­v"E>ý–GÜ´Ž/ÉĆP_‹%w¬°E›j]×řF%N&7ţ;j .5A€ă^Sp1Â]e…Wžőé˘ŇšŘ·\8Ö*ÇimođĺÓ-—§|ćJ† –ş˛p; f šŞIY­Ů]ó˛­F†ÄŢ”ŰZËď 7MŢ„çř;ô¶ľť€ČĄČ€AדVÉ”©¶§ Ť[~ěĂs„!ęę´ ‰;}c^ňy7mé®üÜÍćů dňB“×5SVH-A˝e^xnp*-V?˘j+Ů742¦WÍ3—PŰ4c%q.śĘÍ‚:ţ >—±X˝:©ÔW_|`µůÁmÁ­A‡ŮT .ěŚŔTe-a‚ŰΞ|ň!0đ2´ÚĂß–Š —ę-sÓÜŐ‰^˛ľĄţ1ŔăvtËZX%R ‚“ü`hCô0ŻÓô/…$°ms A|Ş4Q6’ŻÜ†qÜHć1/S˘şĺKđČ›v§<t_8E«Ę"™™Ą¦×”©%^§µiĆ(o 7čćRuŞČG°fˇ#*WFŁüw’÷Ż7ÝĽ:ÔëŇżwŻŰŮJőÚG#śőńÖpąçOüí«x^żČĹ=Ũ /¤Ź¦%‹Ö`í%–|E2OMÎ Lsá©[ŕ‡ÄAłdúłń}pÓő˘.§ź[Ůó04ŻľďÂPĄđqÉző-:·f–S@íä0 „oşüíŕ<>5`<‹s©ĘV/ 4]«»ÁÓU…ÎqiY±cl€ëh!žu¨â/g˛ŽNWÇÎ$eš1SîŁč‡'j®í _Ä}Üję_‹ű%Ö>•ĆŇ/öJ·""Ä–A’o7Cř#ÜÝ ¬šŤ×rV‚7R7˙TQ¦C^·9/9RLr™?_ԍɉoRÍ8»Ůú,^GĘ$Ń5 ‡$?—©üş¦ăÓĆ Őz3ĘKc ć^âożďś_U ÉCžźŘ‘Ŕ’pőć !ÝńŐ˶Ł8ô69¨äš«9„WľĄ‹ËgşGSź˛1…šŞčZs7 mr“»‡°&$łŮ`ń5Âąá¸$¤NÎL‘ěÄď°Ü|pF(ÖĺËd§z9&Ôjtzj1űME2L<şĺ˝^Py›\ÚÉŽnÁQŠÝ-.™lX…‹ć· XžŔ±îwŔ^@nżô2w>Űö(xő>~LîŻZ3Ę ß7…1ţ°_‹ż]ç‰öéy˙:ŽÁŞ÷1˛GWs[M „Ô©ÄZOś/‘Ó €«•`\źSÍMAĹ/Ýp=«€ĄI…ďGß΄ç]Ű˝x Ywf׆%ĤCôĆxŘ7vC4-„đ­#ě{ÄQµů˝Ţ“ tž ű#ß!áůmá n2¶ĺő·”[ ‚ŮÚČÚnÁĐł>™Uşźň8ăţÇëܱnu¦ tf?őě.;‘&*çŃ|ărŕ>…͵Tú§oĎ›ňf*ŐntÁWňü°îń„Xk}ݸJvTî_ŮsüÂ(cke€H¦¬X±ĺ"çY.Ţ­š1†du^Ţzş¸Ů´e«Ő3@’Ň»pţîţ­®%Ż$ŔkäćśËeŹdHµqPO8@˙)Ö„CžChşçwŚD/Â`iw⪠›.Us—bp×—¨č+âîÉ®+Ôľ˛ć|©s—5űő1cŞ(jŘhâ®1ÁäßK—sř+•ôž«őô´±¦aaÄFĆľ˘ąĘ‰äßÖ;c UR+‰ ˇşšË1>];~0, phc•Ö$¨oŤ°‹qu&^-Y(ŁóŃž®z!ÉAÂî@vJočgqɳܚŽ ~椶×÷Č{ľ.3–*6tA żâĺžz»°ŮN¸ÍjĘôÂż‹d·pşč§ÖWˇp°üČŃč¶…cć–8·€D‚Ţ®×11CŘ@…ýôŮLüj AŇß5yiBt˝>ÁŇŮý‡źŘuŮčŃA)[L&Ü!˛]GŠĂ´·ůuňÍ5€¤ŕM§”Š|‚U’ŇŢĚbzj´4’NĘ’FH[¨©—U\b<ě„űçWt«0© = …j Ţç Lđ’FÉ™Á­*řÇa^B<ĚőŤŤ@ŠH.¤z·ú›«üĹśkŠ3E’ͶΠŚpQ°íkŔ şôJß­GěL}G¶´ŔNý6xë·C+|ú ^ůKăNtśĐ‹Ô…z™Ś±=d¨sĺZb  8—Ľzdů]ăĐŹ/DŮ)KšôžŢ|ĚŻ•^éÁ‰6tzg¬Á-f}Ů– ?kŤ,,}0bSÜÇn Řô%ZKk–uúĺ’­„<]ź(Đţ§'í¸Ř ą °żNâX€ˇ/áěďĽág~<Ń0^aÖJÎÚ·Vf‹µ=”—lIô7HÇ{7AYůÂľ†xŢ ľdŐ•)ÔzUl5‰Ŕ«ýÂ$wę͡™,×+,Ó;€D ćtŮQ“ćŇ’ĺ†^şˇďÔ'tŠ)Ú+eGŠěěWxJŇ™•X§°©ąđŤÇlóB‰JÔĄ=Š]~üł‰ů`«Šc±6őVqt¤şů„{5>ÎZwčšĂ¸ČʤąŢ_Ý誹ŕť<ŘýN{ <éĆ$%´c“vŇźqŔ죌ɫú‡č^Ó-¸ďdިIĂä®y(ŇF©(ôó[µ™©g]@‰ţ­Ţ•(.b,îř‡s{8㎒꿢Ý2Ř6@µúTňĆz,ŚÍ—ĐŇrÝ`}B8ňÂsĺ|WF×÷!´çŘj‚G\IŇŢ4\Ó~¬E ]ÜŞ ř‰Ţĺg=oŰ ;ęŃ96©ľ!xtü7ăa)ĘŘ#™«s‹!6>$Ř:5˘ć˛2ŰpŢ Č IqxDÉĎňŹ\ŕŤţMV%@Y’ĘO`E e ű‚mЩϷüCÇEn”Ů<Âk‘ĺó©Ľ$ą]™ż[ĎđpĂŔńüMoöcšÍčS{DËOhĚ-gy®P'ýȦ0ˇÜgz¨xć%˝kR·«AĘܵ:;¤Î,X‹ urYřjO0VóÜO\§hIm‚ŻA>§î‘QFü˝»w•żů_ş}…#» ç4¸Đ­~§Ř3ĐŻĎĘŔN6mw ĘĐ`AęŢb|Ěphř,7ćĺ žĆ7ő´ÍŚZÜÖćĄÔh0(ÝřĽ=bˇy6ř’ÝĹďŞ8úűÄ:*đŠ”$ŢB¶Î Ą‚SÎB|ŕD˛‹M¨ÜŃaŤ«łzš:‘“ÚľŁ^) ň[!ňŞüĘĽ; ŤĐâ;xđ5$°Ĺˇž“G«ńJhÉYH†—óý$;’N8É4żéź 4âw- ®ęÓŁj­•9ßđµËKż4‘„‡.^-:fp-I˛/*tµöÍ7—ńHg;ßÉ]I“’Ým~)¶÷FR˘‰c í;EÜbK˝}ÄŁ źsýbńEż¸+'đ†±lU¬­#Íóë溪ˇW$ĚyĐĐH ł÷`fËąŞ×7DŤ>Kv,ąsż ´bő;ę Z.Źě€Ž‡§ă™$Jrń˦%ćě XÎk˛=Bb>žÉ,Ř—Ü솕°RV‹v1’Ŕ:V#×-)G]ó[^ x6šéś3Ôgđ‡č–6VŻoEŕ¦ćÄFĂ žXu×`𫏫n>!7.xć GĄÎŰěÚąSönçh±÷E?Ć=bĄ´_·B7T_ë¶•\«‹a { !brÇśgë3é?qˇÂ­ ŞĚ븰Ғ1ë`ś'ű(ˇdŕĹŮ%ótáąähí(Ç™Ś¨ Ý›™ (ŤQ˝;.ÇP€ĂůhŽ‚©ĚrFB>ýř-îż,˝bwt‘iŰř\*·]x%aÄ=ކ•)¦!Śg¦5VxPkךV?gĺk¶$†ş˛SYMIcµfNMM#‚3­‚}’ËşćŻ${_ÂlWŰU±¨~ë¤Ü=|ČŕňŞ6i~ÎYݬ÷¦`ťY«şřZó6ő•=öĺęS …1_´ĺ»ŚW‹ťbgꮳżěŤ,1đîżë9íęđ|Rĺˇ"Ť=L7€Aţ…Ő×…ŠÁý6gŮ4.Ů1šrÉFn:¨®UTż­w3B>Ącą·Í_Şă¦LČi.ĽŰÚ›ůkřąß8x˙ÇQ)ŃK/ ůTš Vb4BBÝ(BL+ÇôîTbc«Ăµc—üČŇaě(•ÓHĘŘť_2­±—RŘî±ÖgěfHĚ…46ŐAL~!q$A0Ä9â ŘrzźM'~)OťG"˙‘ÜŃT¶éŁx7 h7k­)¸űSÚůßi»¶±tľżč÷>NzęËhO–[ěŮj°8ÇK‘Ö°Ú?ęŔŔťşhʇNM0źyźAĘä ´Ň!yÉc€_  IÇ…ĽŤ:j$% ră­éϡrä(pS+€EŐ»ŤĐD&őo@—v48dąŘt$vOŔ8K?AU˝b-TCÜŃjdbAşßđEď Në˘#`Śăĺ:™E'BŰß&j›'š)Öl¤… vU>·¦6a•zkî¦ÎŐ6 ÷4®ĺIsb˙\×n“†<éaÄĎ®+yF†‹Ţý’·\·"éúbü$Cţˇ§\Ö–ĹX­~ŢŽŰŕA^’z¤`yú×wÜÜ%\ `…¬ô°*µ©.˘,ŘĹü­vgÎE٤›ÜąSËsšŁKŕťÎühP¤ĺ3ź;iw™Ó§†Pm¤)}(#—G™ú|îĽ>:ťÜńűŽß(:îŇv—L?ćWˇ˛3‚ OĐ…ŠkCŘ—†9ô¬µE•¸°,k©Ťë ,kč]=EăĎX~A‘ óFŽ şěVp5ĂëĎłTČeYÍôLnŻă«Şŕ5ěŰu=ŃâJů¦ôÉRđËňK düţ#"ß}e±űMČšiřf}WmŘfYµ`HgDŤÂůU@¤ěűŢ–¸LÚ”5Ăgq<8ś´‰¸zqkĹôU7]Ăć$§/°—4°řÓżîµgÝű–‹V{/DY[FŁ™¬CĐ[Ę>„đžYhkPP× źQN jꤻY_…G-“ăW‹žŰ§ü¶cµiwcy˙ëw sŐ“ šĽ[˛őNµ¤Z‚čb$ĺŰĐ/Y÷ Ťłg!±řEţÍ«śô˘ů¦ŕ ç)&Yâ§ťďp#źĎHHJ¤ G„D•©Eő™<[ńr˙‰B:‘äC<ĺ÷’šümŞôçŕ’‚í’ôö7ˇGmGJ,ë‡mýt: :i¨,ĹGÔşő¶Đ ©Ýź×0‰ř ĺÇľ©Qa«?-ic¤3Z92BĐ>Jç«¶?°Ź‘™ =o"S…ňFO!Ú&rý2ް8‚NÚx84ăHď?N©°RŐ»“LĄę(s`ĎkMÉ_—ČršATJíG¶Jô#Ô&SIeÖ^ć!uŐAýC¶ë^Ň)dÁ¨J'gŃóOf.•îŐRĚS0ׯłü Eóv ţ ©F€ă*ç:Ľ‰6˝tí”ŦHî#Ť­ÖÍá¸Ç¸j·ş6,çťs&Áu™fѤÂÁ>ĨŤ.ÎR­…ĺąQRĽ+—ˇFůyôxóŚR(   %ĽÔť%Ag.Ż–n#úhčŃŠ #ť' dŤ‡´(›ëÓ÷eŰXö ô1ť@z”]ÉÝÁľDú)poĎěNpł¸şK`8 Xă˝ő3 ¤ăCIGÎśvĐjŇ'}x¸–Ż"řú­8¦D{´žéÍęY“ż:(2Ú_<„Ô”Ä[×áWwäÄ!łP”¬˙y¶ů€UaŽĹÔ”B¸"oTgć‘ő$ĹÓq,Ĭ×<“{SOáq–wN˛CšÇS¨o*ŹÁ˙_BĂ`\3=bMáđA!üěŔ6rŠô©ł»:™›Ń<\áŢ“Ú"$ĹMgU‘NdňaÓJ}SĹß?˙NďU9-;{Őă$§ůé޶_˝$Š[<›éŢÁÍ>$Z¸é†óTě+@a{Euâj\ýŠ”°¨ęQ;řq|@r@˙ȡ?ÂŐ⌚ß/yó9˛*<đ 2*폱\[Ä3K\J±”4&žçnĽM=yĘ$â›¶ˇíÔ¸ě®t?¶@2ţ?|Á˙˙ ţ?‘ŔŘhčŕdkcč`˙îúüFendstream endobj 22 0 obj << /Type /Font /Subtype /Type1 /Encoding 358 0 R /FirstChar 11 /LastChar 122 /Widths 359 0 R /BaseFont /ARBOPG+CMTI10 /FontDescriptor 20 0 R >> endobj 20 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ARBOPG+CMTI10 /ItalicAngle -14 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/ff/fi/fl/quoteright/parenleft/parenright/comma/hyphen/period/zero/colon/A/B/C/D/E/H/I/K/L/M/N/O/P/R/S/T/U/X/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 21 0 R >> endobj 359 0 obj [613 562 588 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 307 409 409 0 0 307 358 307 0 511 0 0 0 0 0 0 0 0 0 307 0 0 0 0 0 0 743 704 716 755 678 0 0 743 386 0 769 627 897 743 767 678 0 729 562 716 743 0 0 743 0 0 0 0 0 0 0 0 511 460 460 511 460 307 460 511 307 0 460 256 818 562 511 511 460 422 409 332 537 460 664 464 486 409 ] endobj 18 0 obj << /Length1 2047 /Length2 15003 /Length3 532 /Length 16122 /Filter /FlateDecode >> stream xÚí¶ctĄÍş°»ŁŽŤŽm۶Ť۶ձ͎mŁŁŽmŁăt’ŽńÍw­˝W÷ŢßĎs~ťq’ŚŚyÝUOÝWŐ]UĎ$#VTˇ2µ7ŰŰąĐ1Ń3q‰Č)311Ń32 Ă‘‘‰8Ś\,ííDŤ\ÜDL\\ĚDâcŕŕ7+73‘˝§“Ąą… ĄŐ?ť8„lN–&FvDrF.[ŕ&F6D*ö&–Oz"!"ĺžp&R8śÜ¦ôpLLD¦–&.DĆsK;8†”¤ěĚě‰8ţ6uuřď&7€“3PŠň_šTD@IS{;O"S€Ľ=0čň˙†Ö˙\ÜŐĆFŢČöźá˙Y¨˙«ŮČÖŇĆóż:ŘŰ:¸şśäěMNv˙»«ŕßnrSKWŰ˙Ý*ĺbdci"dgn büwČŇYÜŇ`ŞhébbAdfdă řW`gúż%€+÷/EQY yš×ô_mŠF–v.Şž˙őźÎ˙b¦? \'K"Fŕň2;˙ű“Ţ˙Ę%fgbojigNÄĚĆNdäädä Ü=@b#ňf"˛´3x<€Â ôvö.ŔG€kâKdfď÷OA5g0űWěßČ DË?ČD›?ČúOç?Í,@vtµwŰü»Đ˙iáúŻ–˙fe$bp0rŘŮĚţŠ2ýWôuş9˙3„łőź 0Ą‰˝­­Ńź…§ŔîO8 đ9{Ó?!"g#g‹?N"/€“ýźĐŮŢđfĘş¸˙igjşX8ţęńĎjŮ»:ý üł^–nőę:+ůĘ:ÜţrVŤđ?ćÍTµłü[„óź9ŰŘ˙ő×?ĂŘZţĎ(;Pŕčjô§`ěŔtBJřÓü!`Ń?_ě?Ä\ń?Ě"ń‡€K ů‡€ó—úCŔÉK˙! ‹ĚşČţ! ‹ÜşČ˙! ‹Âč˘ř‡€.Jč˘ü‡€.*č˘ú‡€.jč˘ţ‡€.č˘ů‡€.Z˙!. ‹öş;™X\ţÇîćbůOüîoŕuČđgs˙!`"“?çŽÉô/ü§Đá?Űđ/&4˙ 3·ř S˙ë€3çnőť¬˙B Ô_ÇźheűWÝ_´˛˙ V!ĐĘń/Z9ý…˙ś‹żhĺň­\˙B •Ű_´r˙ëZyü…@+Ďżhĺő5¶¦˙}/üß׸°°˝‡73đě˙1ţS .".v.ß˙ŮSÍÎŇŃ % Ľ39€˙'jâęĽÓ\ţőîľ#ţ›Í,oŔ`·şdoÂb•ÖVî'V4SI *lŢ/ßŘ7ß Ľ’jS:.ăH˝Ő ů\™ůńňĐý×9ŞËGiRü*Đ1>}ńýČÍđ(Ó«Wó&SÎóĐä!ř ©łeáîś TanëGy˛Vń÷śëáłEJQŐcč b~·¦ţ¬vMńLµđĐrbeätÇňÖđMwääDÍé`?«p6šő_ö]®¨ĎE0ůIďşč_QLşY”÷¨Ń”ŹÎż‡##Ő ŤÖ f™«8A®Á(ŹKç~«ÍńÂ3˝Ćś‹s»˘mďŇ$~#c×Ű*=0`ˇ1°(–^)aĽN,˛ŻŠĄx‚ńz?%J}ä*ě’Iň˙˛pĺ”äR«®KĄ Iü©ÝŠSű{fÖ šâ]¶Ž‰@ň‡·«`¦žo©3śĺ>ňł•0Ő«ź‚1<ŇĐ0ŻâI.fn3¬Ě2¦AśŕŻ]á8OúÚ]mĹůeą×99U0ź^2ÔM{“-Aĺ˛j•ˇBżŔŔdŹ)63\)t‚\8ę0o#µ0GFľŁ¨oňbPnnGťMÔ™_ŞşřëĆ˝˝xŢż)\pMĽŘŞę4t ĺęc¤™BWć$«Ů,\Ă|ąŇȲiŮŕ® ˘tbŹăvŮ„gŻýj"ŢŹ+2â4ń…‡Vf4Ö± L63ů$©ä q·ăŠ,Q»L”~^ÚVc‚”Αzř MJi[Ç‚ąń­¨ŮU›łů8Ťş˛ź*'ăő+DZmý.E±ă4űW»OďČDŞTÜDR4&r‹Ŕ÷„´Tk=\Í NĘ™ňx˙iĐ+˘!$^T a§ ýňä fŇ$âö•çjeuT€Ä b ®N^˙gąĚţ&Bé©C"×,+YQł˝ć‘0ëj¨ĂmÖąač× ±ł…•xú87ĚÁšŞ>S L9Pî¶­;dđJń_S-Ý»cbˇßşďf4Eĺ}}ŕŃdđ˛ćčś=•ŤßOß™Fˬň-pËÓ>Áţ:U(P·NÝ#“+”^;7ąÇË› v›O•*xJÄúöÎ>ł†UśJ†ÄÓŢAČoö!Ä`Ĺ,"đŘMe±ś}@Á=ł3ত2ĐűXlE"úÄ%-5Ďő`ň»L‡—ŠĹšx˘“ÔAűwdť‡ ¸*Ę;{Ąž‹| GT$TÄť!”Őh˙łüŘcʸ# ¤S˘ď„U?>~é4*Îç¬ ô‘hsN0ÂuOŚ&”óP”8÷é±_€®Üř4Ś$q •·7[”ж x›Rń× –Šü¶źvç-Ň{ŔĺŁ4ĺ%#F"»őRLY:Ě®]Í™]˙äW-&űY\îţCo”ËÓë°FÜ!D ©”Ëî'Ö0»"tĂ›9ĄN0í»]ŮI* đËX /¸Í99—@c6!äÇW¦ą­[ďö¶`ĄST†Ýýׄ0٨SOŚ2ň§/µ+ Âč/žCřÓŻÁşńíűřT2m}şĆH–ŰL'8HqÄ>ëĎËC gýg\†T“GčEćŐNÁ2ĺj\󙜧EÓţ(¤ЉÓL:EŃ]-ŰßŕE“ÉnyŮS×–ň«‡ŚŕţŔ§:$=• üBż%$éěÉ/—ä˙yÚ竉blNýÉ ;Á%§ÖըФŻďFĐěĺVé–°óĆ\IčöETc‚:ą4ᮡjZľ3"ĽeËQYč¬}FIZÜé7+—w ŐU¸HODgBŕN±±uY çBvw§{Ąfĺ˛Î®^‹ÍĎ“64 5"çćĐm2xe¦!‰ďNňhÎđńĎl¸¤ŕöšăqŘWÚ¶ó,­q Ëŕô/o‚%…äYźŢň|X9×5źdýÚ™ź2éĺéĹÔ1uöv}+Đ6ňšÚ<ţ´:°zIŚ™Wďµúą©WĂ+^_É >C vţÉćý­‚ęÖ)jlL˝\Ć0sůŚşPţť4E>$ćč·@Ť«0‹dé‰ěýôí>ó2XAJÝĽ©űÚ¶ä}>¸¸@§í`ę¦Óúŕ5ô…ď]1sW'j7„¸'×'ܧŘ!ýńÎ .˙0˙oÓ\ńްڔϮ1I’W.ăéi¨ úř7*ž–ŤDŽć—žhx G‹ćŘYÇ$5>"ÔFß8QŞ$bżŞ-3¶[ăË4üţôűY>ăI]¤˝ Jٲżż eţ‰?”aęTÎ=śŇđe 3ăëá•`¶CŚZZîó®É]BGNę/†Ż\>ĽŇâě,ĺÓş—´jU·Aܨ0IójŞ[¸„ú],ŤŰJÉš§14ßu(u¸x@î­0qmÚ¬ăÉ%U5^ćE«ŔjlşĘ(™Ô|Lś$˛Ä ÚĽNžĽî5Ąű×^J-ß”KôŚ~µţjî°¨pYîěe™?}~Ö8Ţ…]K`~ËÔüŰGĐíý[ř´ËEëÚIŹNßžŽr>†ťŔ;ŐăęQÍ8XfÉÔŢĺî%§déëŠMQ**‚ŕExßĂ”+&ż¤ůöľÓÇ} LÓŃĺĘFă·TćäÔś'ść¤,'u ŰÜ-€źĹxË÷ &Şę*~ă{_ĘÇąigŠLř'Óö×řĐI“Ţžěń“öŘşSĆgŚ‘ż®(MťI^ô,ÍČi7A@Ý3żŮ4V9öbŢfšH–€Ď-SßEĂȶ†DiZ’n±öäÄ÷$ďÎý"ö˝ó_Ôă»3ĎZę4q·—›;s™Ó_®šńV6*4Co˛†‰řÄAď±ńL€ů˘Ń ŹRăđµ şŠ×Ô€îh'H§GŃg˛šľąÔ/ Gľ`€>ËJŽÜŚě^ź^J}ů+Ăďá_Ď2Ľ.Ű[o$Úú•m˙ďWńlž_É”ÎßŰśaůęŹ|é&Ă có í\(l¨Ó¸ř˝ćpż /«&ŕNXłă`mŔŹLEşŃÔO…5Ő oČŁęŐăŰ6Äřsôd8! 䧚ܦաżiuüÎ\aÂęíÉ/fÉh.r«Éĺd5÷˙äÂLhëń¤`göݶóú—9ńEôöÓÔÄńZÂąŔŞŘ[úĺB(b{ŞÝ‹1‹J eÉKšň »¬Ý †~án ýĐ;s'E˝ć8¶ť Ç»č+ěşPB' T)Ś’‰NeČqę>×Bň†ÚtâAŻđR×X%®™A.Ü•$’¤E?3'fnZ×ŇîâĄR:ÁŃ&›j%q‹™?]ŕrQcĆq7 ďÄćŠŮ*‰gÉ˝xwšBĎcz÷äş]!úeǒ貓ibĺűćc8|·şŻJíľ˛Ťf–Ei„kţý:ŕˇ{q™ÂÇa‚$‡˘oŻŮNbL÷kżK]t(˙Jů*~ůĚôÉ3DŽű蜨O\­ęČŮŹ"ßůŃiŤˇČ»±ďç¦ĺšž™s<^¶¤n·ŘţźDeä:yßČKÖ¦&L¦=ĎÖTîÖ¶ ‹{ÔŹ˛Üű™›•H@1¤~ż…wkBęŃyĂ^‰ö¨ y Şí:7€Ü­ .A¤;ńµÍ1Wn•÷•ţzkFÉí#‡ˇąő#?Ş%Ď˝Ť{´Âh7Ć7ęîŚSýlŽ*—'xŹeŘŢŠáYnFĹě÷­ň6lÔĺ<îdšţi.óčKĎš„› d#~>âęF7Ą®ČÂ8ě·eŰ Śďö€â0ýş_ô‚}Zý*BśJ#şßŠsh»üôoe4v? Î§„ÚüŇŮ˝Qád—aí™6Ű 'ŕÜVáŚcé =›^ĘżBč1e| ĽöIoĄ>ĚŢ©s«@ź*Č2ÍU}D¨,‡«Ló"kR~pyžtˇ]ŹçŽĺĐëZhŦ<ąŚÉôwŤĐYxŞhe¤ő^ĂýŕoŰĐÖtÚ,ÝťýŃŘ4ČV[Ă?Źţc¶Ţ$×Ţ ŮZPʵ´+HýŽ^ŕîŨ\­Îsęxዹ’DöŹ„ďĚüŚđ~bő Sfĺe{CĄUiźx»ł‚˛.’FUáPćRzUŇA0 xĺ>ÉĘňвá–öD=‰aw‡¨ÚP–ű*‘8dâ8 ýPÉCŐ“ĄćPĺŕ©‘ŽŹ)>q·,­zĽH˘ň˝fŮ6’ů ĆŻN "iÄüZ(şg2PLüsĺă.ę2/" ţEó˙ OľebΡőâ뀝ďÉ Ý›µĄűĹÄ 8jÝÁR~ĘEjX``=<ÖËľ©ÜđoąźęÝ8ČGđ9ĂĚUŁfýéş ˝^!u*O‘y>›#2÷Č!ąá..}Öѱa±ä ż’=±D?’ü!rSŠŕýćWseÎr í~~ő“UŠßbę˘2«"űô.^#-ŕęŰw˘Š#ó ĽËiÄ!˛¦iŢTšÉ ´°ĐÂ<â«öęśź;ú…žS ÷đŐŃăÜ?ǶT$˛Q6‚ÎtzŠňMµqy3°¨ňDî(PÍ{.@ôyŇ&'ł˘×‘(N\ő°prŢQ¬|îë2ôRŃDž!”‚©dž~-˙nŇďzŐWYđ}©«ŘT9ěś% ů`=1‚ Whóä^Ňá^ë {ě˝Ćpj…ń×U± –őv߇B7v…ů"‘1Ąďt/uÚ˛\ň€şÉé(oIŁâŞ“KĄüíÂ-=Uź}(±Đ–ýByięĘ8kéa ;:ä˘×€x‰ÖúçůT‘š•řáâOÖmM(_ô©ŕn°Ľf pm›ŢGĆßH|ŇÍ{„y\n_8—s/Ç"Ł-lĽ1Őŕä„ěC’·‹yŻŁ‡ăd~Sć˙‚žč!TT[ˇaUńAĚüł® jńÁČůbg1Ń&đŇÚČ‘$ŰďbS\» gYÖR€ScĆPGgÚ¸í:U}ď¤Ĺ€ßz;Ëćf®Î-Î&ň˝XŚ˘ŻŹ\LŃĹ|ďäVÝ—bÁĆ2¬6JM“ěé@ý¨ôÖ‚ť˘L”Iä‡Ň‘Đ čîD•/ Xo'Ű^~fË1ţtQĘ[U’rqLóZÝR)ögTšXşĆy± RÇměŕ'ÜĂu!5ţ?¦çAÄî×A?5Ĺ®ł»D’XŔÔ—\sç…Nţ9ĐkŇϡřm3XY´±ĺťC1_C)©ď•|€Ťcő˝ź-¬Ĺ¦y,čRă--k‰jUĂ{čĂń8Ąh¶ Ąíäç˘bkR~Ap/2Ţ^‹â˘ń]k eş7 ý>yŕŽÔţeo2cüËŘ8ů~eő8 čgĎG¤6D€–µ5\ÔW"Ěź*#ŽôTÓ Żáś1› JRÄ„e)Ă3¨mž:\|ßn†0x4tí=‹fŘççYbˇěS!ÝGÝqDÖ1໫LŚăňůýQ#qUk8ă”JěěŤ*™´Iuyâ°®}J¬66u06Ä‹2pI±±é·u¬Â‡ĺű¤Ŕçˇ`ÂäłüµŮ«„»ě3"Ox|Śa!] ĺĂuÔ@ÂĂóś§đ±‹]᏷ĚuC3Ps’ŹÂ%A6§ĐÁ|ť;Ĺů®ĺäřô­ɉëOÄÎE RS¦ăżöRŘ(¶”Uą\‘ÄôR‡1S‚Xëˇ\<_Ü2R8çoýÔW¶l\dĄÔá üë:ľÂN&bRr Ż$„"`×U Ő®YďůĹv‹ŕ6SyP,ăjIrçit'9ÝNMúÜ ›`IˇĄ ałaŤg˛jŐfDj–Ătmbëü©x”ĄhŻv"oé 7ͫϛŐa'!«]ôŢ5ŮVÝŽşzjŻ—…Ž™ Îjˇ ‡V2KĄZł»4§˙xMš˛fş-ś·}Ô0ôמuÁřĹ.4Ć'gV”:[Qţ'©ŇňWhfB_Ă Dč))łˇ›0€‚=Řײ`«VńŹO[8fPCX *ŚÚő¨„)ÖĂď™™yXĄ §o>Ą‹ˇpČ^jśß)[H~ĂłP/ă÷ŮŇÇ0P?°™ţ˛• I•>’-\úî\›x‡'źş…hż“L=[’)^ú˘ş5ş…X=sú62s¶#Ń%úđk–&°ŞZÝv@ĘÎp;Ž®ĺE}ŕUuˇŠ÷ɱŻcČ•Ź|«Ź;eÇ©âe.oµ2Ď<:źŇ/,çuŔéÍÁmYo•ÓĄČYbţč§ń=3Şő\‰µ–eI&ů|AěŃŇ6&´V‰Ą¸Ó{oŔ4!n˝Ż8ëônfĎAÜů(ţ[ ĚOĚÄy“ŹĽd™Ü,6î…x¤/ş÷ŃWMžZ?Tt»… ?D>Ü‚CIĽj–ĚAŐ]ŁŤeq2}4~ âű»Dg [Ŕi6ťŮÚeR™—‹…2 ¶ě$¦§ç$!¨(A§ŔÉuvĂîďă!Z&».vHž©DË ­ă¨)ľígáeÍŐëČV?.)ó'óŮI"> ŔŃä‰d*Ĺx®­řř™Tĺ\´ÚBÔrdá÷©ç‘ŐŚëŠ O9I•nNŤ°űŽŞM U÷U~cóî Ą˘óK#ţ…$–*“ËK,:ŁÜ‘Ý ]˛{{č/ČQĺťŢ伊uß®„2)ě7Űđ.ÎĺbĹľÇ]ġۖľÝ÷-±ő„ŕ7⺢»;“ňLĄĐ™T]ŠÖU”»”¶!ľź~T±+Łw%ŠŐż„$‰î˛ÎÚ7&J;I¤G…'é·Üěxť".")ˇÖ7xËZęvhp_4n/)»ęÉei—uµ|ů /ÇŤ-ěśmäüWd/׿ŇŔť‡š×ůźPD RÓ÷EFů{ŻŢ{‚ߨŔ‡ş»ĹI%0¨b3o×´ëžaÂskŐďo¤čpV»í⬸ČďĆĺÁ[vĂ™ĄĐ3†ďźáéqô~pôÜçÇM­ů"?i”ů9?aDţÚbY“…k6eą@áh y Ĺ’“38 P™›Ú\ ť1Z¶ŕ8c&qŔ¤0`<ĐÝşůń6h2¶Ä»—ą˘tî=žĺE°5¶ŃI—×jwť¤Ga‘;wöJ3ý 5 ń¨Ht™uNYJávÎqěëu˛iNŁVF2J*ŮĎ•,}˘´âä*ÍűžRuźŠ°¨čE˛xüáfTÁKaKÜw‚-©%łŰ7SăϵךĐC%«ă›§ˇâ8GSz{˝×3čÔ¦ôÜ27†ÄKöť¨ĐR˛n¦T¸—bľNŞŹW/ě󳞎F˛¨b5뵨ózź!&đôů­Î*ę©°Ö mâ%=Ä-^-5q©ÝH˘™Wʦ–0´ ë^Ş˛ĺ1hą%3©Aľá,`$“ˇiá •˝©„Ňvá„2޸z–|ÁĎßLŢ*Žgc`ŘŘť˙˘ďoÚéçÖîaÜUi`—j fi¨µsbâŕ„Ś?Śi0¬[Y6öČź'r0G˘éNDŔ°zh^»|ÍR±®¨Ş;ç×ÎĚáĘ;ʡD ^+mUŰSÁ®şű-닝€CĂĹJŃóEú\7x^ňE†j}ltHE—q§Îwâx^H˝Öš0H Îł^`ĺÖÔn<ťxß­7gÂú%îŤó0¸Y‘?ܲ-N;çŠŇVvâ*ł +žŮ×î~ݶ_ejŮŞBůČa† Ú™ŔŞ.É‘Ěѱd±r‘Ä$§ýťĆ_¤˝Ôv0 <ˇXo¬ú!u ™XşáL¸\/kř¬‘Ú2xo^¶ŻşŠËOŐ#Ä[i_D§ĂÓRJ•–/hč%O?sD˙N»}#xŽ˘‰V˙Ýa&&™höŔWóĂ-őçăˇWyĂŠ$!_Ĺ®Cľdâ@“"őA‰ĐÇkŻĐŐjÚ»ŹZ‹ĺ6é érl†Ý”Mëť÷RÎAÜ7čŚ>E7=g[ ĐŽ,˝­XßqžÍÍÝ­˛µ3]ěî®S]ĂA…Ţ9măvf duXuúęŻe+ŠăUňM5NJ,ÚAUoGóţ˘pđľ€u’ŔWfVËŢ!Ż—ŻŮLAäc1żWÚSŔúz^$Ć ˛ß 8? /ň7Ç’6öźů-7fż#{V‡g˸3%ńŘ6 @‘ÎNÄŹŚ·3Í+á86—µŕzൄ® ŹÝÖ˙âÓ’t"ą˛ňWBEŢią­cšťahoxů}Ĺô6řú;t™%›š0˛Ç¦ŹB‹^4ë~ŞŢ_mE<ńc%€˙{Ü×ÁÜŠa S€˛đ˛Ą#6–Ľ1HlÁ×clI xĚ6c™qéâNť„Âß±'ńkj9Ă :ęä4ŁnC%«”čDń~íh˝˛™‚†Ä4É >źłÚ"ńKşŚ$±ÄŇĂ,ÔŚ“°‘ž “»ó ĂRpĂţÁ T#ŠÜsç°}«ĘŞHNóżĽa7ď*UÉb[GWă H¸SgQŽĎ­Kažx—”¸é{äËzÎú9ˇř Ĺ÷Ý,§˘ż0eÔ .’bvHt+)JÁő&™°8 Ř!h˝ÜůY‘Ąę¸»p“łÜh2Ĺé¦s\ńi™˛Z,ďj @µŰ[Źx"ŇzJfŮOí#˝‘ŤwRŮ©R—­żŐU&C„Öđľ÷^ó śŤŘťň<|ŃŻnęŮ7·4Ů\ąoĐFQťUŢb1’.ďÁŹÖfÇčÍNSŢ¤ŕ’ˇżz…]^ol…ńí¨buŽálŇ‹T˘=±RçxńÉrk”µšŚ"®8·!Ő`´Vä?—T7“0d _-EűvÚ"°]¬×‚!ijÖ?  6yşDČMĄm8©á—!íË̵>iŃ%Ô˘…S÷ŹyŕŻ=IkHň˙V>‚Ţ8@_ĺ¶ôkl[nA×č&Çß´r/Ĺ„c‘Đł‘SsM›ˇ˝ßĹĽąŃ4öWý’—Kn˝”ĆŠîsP>đLrŚdŔ™ŁÁĂ]ď+ŢP˛B¸vűúř@Żz›˙*m»ČIB¶+°tµ,úŮęŕ*đ¦é°^Ć'x·Ë[©ĎU÷(Éö—ľwäfÇ”$‰Ý»ťBŻHá%ЦÉdxŠ§Đ­´ǢŤ×3{R~ď6ÝË/tÖ·şS90ťg"Ć=¦ěIŇK®wµ¤“ l{›í'-ś|¸ ¬1{ćÝŁř‰5ć„-+¸-ôlŠdâôVµ.Á˝3&äWě ŃrÓěłoj1s¨.µ¨(Žąi •xýS™ňlŚÓj.v^Ő°Đ-é +čŇ‹%~©;Sw…iţd^•M×ý;4M\1_2˘4XRCÍnH\6/‡=j™nVĽ_F¦’‘®®ŠnoذI÷Šň(˛Š›ó˘9 ő/|Z]njuĘ‚>ÚŃ÷¤Âü&ÂźQ˝îÎÓ†ĄGwĚbň—ö¤®1cř üjŃFŹ>] ]śeňBĽQ1Đw–1˛Ű®âe+ŃĽŰxě“&/P.âJ)F‘‰ÜöŘ80;ÖEł˛#/gŮhW«5t˝űeşPQ‡ô*0|˝ü!٨ˇéý.cźł5cŐç6ă×Ŕ—bď”±7öŠĎÍŽÖڱ>Í«˘Źô=,˛)»r‡ "o°4Ş˛×óý]igCž+źvó;±ýľ—H¤j*ĎÂÓJC…ł$H:jjĘ´ďsŠS "Ă!¦ËĘL™–·şąw†É„¶b÷ä[V„±Çäý„ăţC>4 ś_¤ŻŁľçŁXMőb(§Ł #dĽ~ge'¸L¤‘ďĹ«řxëɉšív]=żC\ž;śÉ^­Ý(Óčj;q’ŤN}ŽA™\ ŤbÚÉdîaqŞ”ľźňŰŚ …żZýIMPHKPi±†”ý?ćľÚł˘őźwÁš·âutĽŕŮý_čađ]„(Ö”îĂçąÍW·%«ĽäŤ°C5T/‚[+˝%‚NROćŐÂż×pÚ,śnQEŘx’šuý°ńÜ$Ť áů®–‰Î+IŞ‘ÇłĄ4 …‹9+Ť ŠQ˝˝•ĘňŹOŁ–&9eܧ`0 !ŐUżTóR]Kh˝ fęi Ńź, *hâ’[‰‘úDĄćÔĄÚ+ÚŞPçęĚ ŮŐZ™ ×n’<ćf5´rTȆ˝¶+ŁÄZę·¶`žčąü;ŘĐŞýúű·ŻP_)ŠAK§ě´>š,ŰĐH’mŻźfł÷ßZ¤K‰‘CAÔ:x~ĽéLŇűuŢ?ąCŃ>?3ht4ů—j›oŁćł]¶3ϵÔC–ŽłFř’Ůą~ÎéS ł-JÚ¶•á“č0ćmŽôNżîYŤ¦Ťĺîű®xĘ}]šćcZ]ö;–ĘD±,Yś´űŰ/’OˇÝ?A.·m·)×]xEwýňôî‹…ę(Ó)ܿ۽=K˙0ü ˝ď9µ×důţĚěűF_XD wŚîŠëÇ‚dgr⬠0yA»K¬ů©ÎOüó˝÷;Í@\cŮcţß{erM]6WA„AőŤx\R`/Âmł·hżŮÍ’Ôç›W|b>˘ÄSđ¨śř`s ÎÇ@»ůđÂ9DNżM\ůĄď˛đ0¶Ögô¨IÍÂ!¬°6‘˝Q<w†Ć€jg4D—ôŮř°]ó@‡Ę[}c>$Ş0&ťüA<f3á bâ¤ę;ĘǍ䙪ň`ĺTĚŞý8´ď>ÝŁą:j\ńě&ÂşËt8A*i8uűEF’® Ô ĎŤ9@]ٱéz6Ʀ|Áŕĺ]}çEîî–ŐT=vµó‹4Q§*!Í=ţ¦ Ž€ĽęŮűž> 2ZIŠ"ŃÉ‹±Ă…?.đ_ ŞP#…ŞĄrË`T`<”x[}ÚG»őŘ…Éě4ÓŢ{Ľˇ˙(1?•ж«3ËŐŹłşÝ޶Ŕú®M—üÉŔn^Ĺ«;¤íłĂçŞŕ–śžţ”ÔR]ÖŕE©–IąÍőÖĘ Čwĺµv*%H„h^ż¶űĎž(§4yp\M™ćŠ˝$3ř.2gzÜÓ&˙K ¨ëý•:ý´G+žĄ™çCJ˘ŘH–4Ýc ťŰy}í«Xů 7¨ě(pGţL.nURů‡6(b†UŻĚsÜÖŤđľGuřĎ!$ĂöąŮąđ…϶YJŢÚ¸UÁ+\Ůt_żĂ&ŁńűU!ŞqŹžLɤň®±]%HieĆbçzč, +ńg_ö±z¤’Ýţq$g‘3ŰŘ$nšJUăË~ä‚«ßsŻ–Uľ&+Іö>’Ö/Ýú'ă‚­_öĆ2ťţhĄkßú¶hÚ´ ;`§H<Ş“Śö‡Ż$şŘHG ‰´áA–śSŞľ µýBmy M”Ą˘>2ĂlţQ}‚ů«GÜwJ‘ĎĆXfņ#ÇP|ÔŁ¨i^=¸Â&Ä í›ćť ů¶ŕ»})™ég|˙ŔÓWâűÇůôD˘ä÷‰$i»—.ÂÖ1î"¨®ÎÜÉŇVáSŐeů‘AĎůňaI4¨(LŁíw“?Úxč~ÄĐŰmňŠł~ ŔňN©É(¶?ÜúzÓíX’ě«0€«Ęđ„’ĄëĂ6eäĆjÎ$M\DÖ>ň1.E7[µ~*ĂĹňiGŠvW$óX*‡ä¸dPŐU·=?,bôv+ĘŐÉű}pQÝ+¦0IęÜ®ő4: _IDImü1±đÖGŢći=‡ëýâĹ˘Ś­ěh¦#̧\wĎ[ČbźôGŘ/?†ÔŽĹfĹ"ÉŢÎżUŢ™%ŢđëWN—©Ěp؇Űĺý‚ĐĎRU%VµI¨ČfhŇÝ-ם~ha)GĘő/ŹŹśÚG¤®mOßv©žÎKDu+uW)P«Şç¬KfÝ(cGžŕ (×ř ö§t0Ť˛ZŤXaă|pµ ó®qć5˝_¤qŘ­›Ö_!™ŐŐX±gšQßN M&«âřqB1gďqUă Ł ¨…ČÁă%ťŚGgí`Yq3#ßt)Ib9h ÁĽ¸ô«ş4ËőĎBś$Ŕ‹äIÜQĽu#¶ęos¬HěśĐ)<_†Ë†8Ň:´í3LjĚöá䵍Ő#ę‚U`'竇 FEĘĂĎy¸ z™áŮŰA#ł~á·l¬ d@ŽCž¸.{®‡|ŹĐŹm2Ă r_@53W  |Ě€'–™LČA…-eţPĎ BÖŘC€Ć•]Ö±Őe˙ĽDâPoą-RţÚ©„SGÉĘ7ňą`A§6 ń8C·RŻŕłëŔ ΓcC¬yďé ÄkŮsó`΋ uŤ蔊PҨgöŽhĂ`Ž•¨gyâż,c›˛ž9®I "ůdňľ^‰tZgyŽ­mQSě‰1ĚŞ9v ÷17R[E”ŞŇ.wâş3•ý(űf9dúY6_˘őÂ0xBźŃňąý“ťM_ş˘ŤŽ[xÄ71_˝-Ę;9zxv•/Ge(«­2'>íxB>T JĄ¬Ýý+gć]j^ľ˘ŐÝľÜ"™ŘdAźÔK»FýŢ›ň§ą¸Ş ŇŐ‚®ČrĹţöe+üÓŹ]®¸fç°M0̱%ČýĆwqěďĚJÝ›// ˝‘ŕučc‡H«nę»ń)źęO{Ľĺĺ' ÉB˛ă©nÂlË„ä{ćÓh>˘ëjŘÎXR´Gđ†nŤú,^U~/âG}ö¸çXGbĺ sŽŃnP č!Č8J”ť*‡ ’>b–ŇâOvŕúţ­Yű5ĎR$/’¶‘âÝ,§±mvQ%`ŤJ{ěëŰ&)GŹ(ŇCŮ„Ť‚ŘÎ9šŃ†Ó'Ş|Č{ŻÎĐŽřŢYj7ČV°ošÎzÇö˝5LźNr]<Ďf{AŕőSö´® kdHśE:¸ź\{'ŃNPŕˇ<ü"ńř•ąŇZÖ9Łţ‹ű[ĄgŢżµ®ov¦8âş\‚ ą?|ÂlŰ Ňv-®Ţ<üńjM’t[×Ç@fl˝vűóĚŐ9HÉ|5¤¶™±­0m» Y™‡'e‘#ÖJZ# ă=žë¦H¸çš=G¸M :¦ R÷cMעířmyŃghĺžk äAîË"ó ęY÷,Rž­ÄýŹ”}z“ĺ&vÎ{Ľ{µq¶ÉU^2óVě~ÜÖđ¤k0Kϵ¶ŘÔ+G˛(_ŐŇőˇ/Çô79á"ö÷ńőżŔmůE‰z ™Ś±"/Ô™˝ç%ݵ…Óâ˛9ŮË>ŃÜE·ä,µ†ě´˝Ŕ~ý­‡L7Ž›ÖŮÇAşę rĎćK×f‘–L}jÎŤÉË%g)ějłcśćÂľÉs[Ú¦9}J Ś€ˇ?3u„źISߤô¶]ŢüŻË·+ŮmŢ/âHcŰůň˛´*R[,^J6ç8$ŃoŹd*ľeł U”~Bćš^GÍř;ó”Í ĺ–·h¦N÷5ëčt €áŔČI#˙ŚęĂ1Ş]ËAŰ×V·ĄD‚!˛T÷ľâáH!Z6Xš§©0žs49FµŢŤ’ú"J«4<ňjČß_›# ŽË®ÓY=<§vkpăíŕWUśd%ɵv7¶I áé…{. Ă79BŕˇKu„Żź&ŽcS†¶w†—‚F捯¨•|MŐVÍ­Ł_-ڬĐU‹`*`Ňî9Ůźč6dbëŐđrAÄ<ĤSPţúâq‰ű»đ„SP]lĆČżôí.‘(řŠč\]Ó¨…—Ě/ş;/ŤawPĘĐŢNĄů@Ř 5f=—©×Ýg5óe(aKŤîIMöK#–Vô~?ń8%îĺđđÇ5s˛¤!ýĐJqZĚËhW0 @Fş ˛ˇ Éî¤R1 át*.µ9îyĄě'ňÄ9ÄŰ3|e™ A¨—LzŞbpi‘™›]4ÁţĐR‰Yôíą%ëzrTM9ńżştNčű®eŤ¦¤) 7ęÖ0Ämş­‘…h7#8)Iń< lÖ—ćÖ%Ť—ąÖż-aŠűÓ ×OĽÂ«‰_ѳα'°yTţůc5tŹś›žY?OŠś“ŽŤ§GłÚO÷˝-g b¬Ůľ;ÄxNµAyËJíxů“ţôBőtÝĆśňH¸<… őJ°ý„QÄsš đ ĘFŽž Á{ i ÜŽ)U°ŤK×sÖ´Ő⥕ęÉĘiËu•J€l&žËč5Zj¶Ŕ{:¤cűçě÷A˘ŠËZ@mqÄ­&J®SĆÓ1 ŹJuśGqVL†›ßŘFg‡ö%řśŤ¸Á' K-6&n"f{éT® „°*éÇgP|Ő‰óńÁć˝ňĽ Ňtt} _ű‘Ç(„śdqVǵ@[ë DÔîZĽŤ®Ë&OŢżÚÍféPkČ &În[Ѣ·Ź÷ŔöńŢAÍuKp|FRÔĆWóů űđĆ„ˇ(5oCĐgkÚZ˝––b_±ü_%ôä‡C·ÁĎę<×\ľ$Ž ϰW‡‹ ‘HŽ ů%é ¤"MW{“Čö‡Ű°f2ą¤VkŤÇHŤ™’ÉŞd>í _p(śRšŻľÔPô¶ÓüôíŤEw…W6N‡šS»é/ď~ siŤfŔ‘ĂŃ˙`Ń ´<ěj\ßÚĐéHě¨VşC ~"ś TnvŮâ‚p@/##łGŞŃá¶/]÷·4ű¬/‡Ż×›’ą§CMUŰ| ©Š›%’śO¬RîéőđM»Âż©LŚS]Poc‹Ą@JýPPń+ßç*_é$éB[a‡/)ŮóVTŕFý„*2ýił–ÂŞÎ6‚EńłŤRHĄşZ9ł(â(SěĚá,ŃyżÄŘČV¸'˛M§·ŃŔ‡×\‹Ň–;Ř4˝±©ŚŤ@†¤;y ™VaîK;¨ś‚Ú.ű]µF-Ľůŕ‰Źł=Bß$3Nä)»‹ł˝jeŇĐfęp$â^ú íŕ‚Zd •}ňLC‰67ĐńÎŇ)§ÓaY%,ňŁ*Íç× Ň&R0WżCf#yuĚ$Ńcµ{iĎ_ˇÎďL‡`‡E:MŐž źc†Ýiö:g¬«-éaŮŁÉŰH˙~a}\Ď"‡ŮIŕ8€úÁ¶®9ěui,ś`ž“š¸îKď™MĆNÚö<(ÂQé¤řϤz¦ćřÍŇ4!§ˇ¤a]ڱ—ÔâNzPwMě+ŽŢĎ"JKČlî@”Č*˛‡µEä>Č®›łń-˝—óSšýĄeU(U5ň‹ádşĹ´™ý·Žnç·mV ‘ť¶ßŽŇ´aąď¤eŞé–Jn›dáç× d˝VΧa„ˇç1Šý-xäF–?ŚJ|S¦Ţ’4iúwŢ#‡‡’ľ>ÁÜBČÖ^pŃS–‚ásE*"iáąÂ‚_\‹«BĹdŐ‰ŕ±&ĚňŻ=<ĹÍ–^1÷ׯăĆŞ¨ßŹ$±qαi'ůiŇ76}Ć9Wý™ ßGëăJűH“®Tş{CÓjś‰?Ôĺ2ľsŤ6ÁĆB.$év“&ä†5ŹđţÖ#§™x§DwŞý#Uě.!A7»¦-żoŞmäţö W‹F獲cĂE‹ŹQ*•C^Ę7÷Qů ŞÎ­‚Ř(tÂY©ÚJn%9#Ěe~Ű2ˇÝ×s ÔŁ*ŞÍ)_ć-eĽç_G[ĽĘH‡]‹a•Ó"1>g°Gî?0 Ţ{+”ž¶6Đ·¤şűSeÁ‚ÇÁŃbӪׄň8m;a9Ý   㦠B\QŽ´—hY´h©¬pUÎŚbÔśQPŹkë7Rá>3±Tśa}”Ż­MÔŇ@*:†ěSwnT¤ô}HEI5˙ňčűNÉ."¬ĺIű¸’˛†şpT°ňťĺRŽősâWÔl§^mήvˇ¤.ę{ŁgÝF'š1Őŕĺß^IôÝš§Čz” 9©OXţ«jă6ŠňęxŞC„_+ąg«ß­^P7XK9ĎůŔ ąkő˝ćőQ˛`^‰?¬¶ÇíôŠěŠDLŮPtM…‰ô b”˛'gźU'­šńŘ5a†wV\s’‰Ńú’<Âç#~:%Xł5.Ť­ĽÔ%J'ňď$—™­ˇé­„žz¨ž4cŤÂ^ű’™2Š–rÚ*%±¤Âz}bIŢDwXD±µ8ÚkNĄťK(¦ń†E…Uč=Ž?Ń CgăP fwäçćŃľ ›)ă–s_ °( púáňŽÍ“y"vZÔjV«ŕAM”Ő˝«˝đ±ôzččmŽHÓ=r:`rĂY"mVH4.Ģ…ťlŘCéşµÓŢî˛CśŐŻ:Yb†wü‚{eňşěV_—F–$YĐ©Í&ÓiúŃkAĐ*źöÁ\5$xŻÜ:/ÜFŘ^góiqÉÎŘŚ2*|X5ŕĹ-şRą‡;D´0´ś÷ţ.řÓŚď­"¦veGČ+ńĚ]”NÎęGćw‚łÎ č^—ŕ7/SZ×rÄß—ű+qٱKůoët[ŁżěCd㉠˝ă̦Fqú{A!ůăŽ$ˇ´}…Ťľ!TőŮî]m¤c~:ěs´Ťitŕ;ł>ż SR(ŐFQ©tj=rű©Ă&sŐžV^,έ–F°¬˝ľ¸…w3ŐŔdކ*nżs|»źI?OśINč^CInCDŘ*~čy1Ů%ćTĎF†şĽľô‚`Ug~Ń*ŞŮŇ Ü•ęO±ąŠe~47­˙ýÔôő]Jo_˝2:pT?.ŠžÁ.3‰YÍíWwSGń-9Íł©ě‘^ÎyťI=Ř 7Ř"yXŇ0"ů±OJÎ%ÖC]ň‹‘´úó†~ňŽ\łݲ‚ÂLmt–—"ŕ,·0«˘nŰ4Ę8»ÚlAÉ˙ŰřöŮMŽZ®â/׼sĎLXÇěÓI)2ˇĎ}¬‡Ă2^˛ ČëĐK÷*üĚFMž*Ăô1ËQź9± ‰¬ś\S®·ç7†ŕ˝yŞťŹ17x×'s›ĚĄáÄÇá—cś¦&đ•×S‹ąŐŞľ+¦ ţ´ĐÇÄ€ÝX…őőA’DçP•.7(Źf€źV±ŘÜč!ŹÖG'·üţ€˝_Ë=„Îůqľ¬˛IkVŠÉjŮž!ičě§=eü–ŐŔS¦ ¦¨µnă,IĎř˙đî˙ŕ˙ŘŚś\ěmŤś¬áţÖčîendstream endobj 19 0 obj << /Type /Font /Subtype /Type1 /Encoding 355 0 R /FirstChar 11 /LastChar 124 /Widths 360 0 R /BaseFont /PDLWWN+CMR10 /FontDescriptor 17 0 R >> endobj 17 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /PDLWWN+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/quotedblright/quoteright/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) /FontFile 18 0 R >> endobj 360 0 obj [583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 278 389 389 500 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 0 0 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 611 278 0 278 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 0 1000 ] endobj 15 0 obj << /Length1 1847 /Length2 13050 /Length3 532 /Length 14087 /Filter /FlateDecode >> stream xÚí¶U\\_“ď ÁÝť@ăîÁ îîîи;®ŕ4¸»»Cp îîîrú˙ĚĚ“ĚĚĺű^ťĎéî‹ý­]«ęWµjŻŢ$Š* B¦öĆ@q{;F€ś°& 3€…‘™Yž‚BÄ häbio'jää°psłÄĆ  ĐŹ‡ý3<@ÄŢÁÓÉŇÜÂ@-BóŹ'@Ččdibd3r±Ú‚bŮTěM,.žŚ!€ň?+śĘ@g “Đ”ž…`jiâ0š[ÚÁ3ýŁIĘÎĚŔůfSW‡˙şĺtr‰P˙K& $ŇÔŢÎĆ` 4g’·e‚´ü˙!ëwµ±‘7˛ý'üż:őżîŮZÚxţ§‡˝­« Đ go t˛űź®Ŕ˙'loóżŇHąŮXšŮ™ŰĚ˙a˛t·ôš*ZşXĚŚlś˙˛íL˙§Păţ%€IDKSCIî?÷ô_7Ť,í\T=ţöď1ËuÇÉŇ Ă j/ ČôýŻ+˝˙‘LĚÎÄŢÔŇÎŔĘÎ0rr2ň„MŘ_X–v¦@Ф‰ŃÎŢ´j‰ŔĚŢ ţź í9“Ůżl˙l ´ů7~b099íl€f.¬,˙iýŹÍý·™Ŕdä j·Ąłőă'“‰˝­­Ń ;€ÉÂÓÁh÷ÇÄ ZgoúÇÄ`ň:Ů˙1pěí€˙fv4÷?÷ŮA˘\,ś€y€ôŮ»:ý1üSśĄŰ_ qΠ>˙›AŇśn)ő” řߪdç0ŮYţ-„ëź mě˙,â…úC Â´\äÖŠţ!P‰b˙&NPâTžÄ•&ů‡@uIý!Pv™?Ę.ű‡@Ůĺţ(»üeWř7q˛+ţ!PvĄ?Ę®ü‡@ŮUţ¨ĄŞ¤Eí´¨˙!Ť?Ңů‡@Z´ţMÜ ěĆNF&Ö@—˙6‡Ül˙¶˙÷I4LŽÚřB›ü™wfPť¦!(đ/üg„ţBPBóżT«Ĺ_*Öň/‰°ţ A*lţB Ű?:ěţB űż$Ăá/Épü A2śţ†ř/5Ýĺ/©rý AŞÜţB*÷?Č Rĺń‚Tyţ… U^˙Â˙}ü Ű{|a`µ“ô¤‚T|pâđůďžjv–Ž®@)QĐĂĚĚĚ zţ±š¸:Ž—ýĺ€ÎÖ˙b3KĐI zMŕçíMx¬’BŠ}Ĺň&K hÁ…Ícäk»fÚbÁm Fdi×j4źJÓ0÷ öÝ_ś#ÚĽ•ĆÄĎýcRćŢöÜ ÷ŇĽš 4ŻŇä†Ő÷µď 4+ÓćţĆpE M;‘5˘®Î Źč-ťzÂ)¸ŕ8*ţ ž}ĚÚ%»Ńr{rN.úiăútËŘÓÝŞë‘đ‡Ý‡€űŤ*a©źAhŹkďN8üi´5wôÂľ:+ŕȸ¦De1VúŹm$°Đ$ź /áÔI24%şCLĐM6ĐבRc‰úŕěýę2ňDe/i:K5Öˆ' ĹŻ[>bž0Ź>đkĐ\vąĚ^š©B —<-G”`'ŮŃ#ţ ć“…»+}‡č+Q;Z×*±ËŇL|şžy <ŘR…ÄQß_-:g[kÂe±Ż}ä]|†vŃ)Ű Léh”Ř DmÍË0ÝÂŐ u?śÉěÖ9żd3 }¸ŕPň1¦¸Aן÷ń "C’§ł)ÄxµćË—9VE‡ś‹do@‘ öĹp†ĽńłéłŽsä@ÝŁQŢůÁx•źT ŽzCy3¨]9}Ö<ç©<ܨýaĄLiţK‡Uc驌/… +éëWą“ٸ|öö÷ŔH®ÚZ5·şíň–j©ŮDÖ¬7Ć©kMßşNkot¸+Ďuůć=ŢÝ17Č­YŔŰ+R#ćľ’#ěŰ B·ď…´W I-]Cµ˝Ne öĂî‰NV«\óô¬|8đ%=}©@l_fČjťÔ@^](F€o€ka‰şúŘŰGsç°^ťV.ŚŮ2ˇ(şŢV1qi˵TˇJ…”áĎ«ţAŹ€Ł+ďâ¬ye˝â3¤˛öTv±węiíÓŠĄ¬ÁEŐŹęba>•N±ň5¸)©ŰÉĘUÚ$/°Ü©łOL:Źęő»‡VžžůgŃnäÁ„RvH1UŹ}FaVz_ŰŹno-jP%Ż)µëo« Ů–Vňđég]žĹVąŢ˘ŠĘćbŤ Á%úëőąźyÄŁ~¦§÷Ě5¤Vc}ŹîĹÜçJ‘+vÎ?¦Hm>e¶‹*)­˛{µ$xôA»dŤ•IËř ł!ą#Ű #ă”1Qí·Ŕ2(z±¦*Ůcä?Ľ±˘·rb`ý´âŹŢ3T?ÎxÚlĹBü,VAľIr)1jUFâ«(şA¬2)S8n‹„C‚WËI%š|żaŇŕ–býľÍŻPľ`Ѳi~Ľš„Ëu˝O“ź¬%ů7;ô»âýőů{ň 8˙ϵ­ÖţnŰĺKµľÂ_±±öúÔHO1°zkşÂb7w:Y»Ć¬<ÎOüHc5ů«ťá´2[ń"}y0Ö”.»…Ôňđ±Ô˘ëR)/B¬°ŕši•ĽÜlQŃpąNg­ÓÇÔÂ(đĽUt†Eő?ŰVWd1ŃńŇćŢxÁb×ýľĚÜ1˛NeÁŢŹfp1¤čLĎËÍÁź˛ń›ĎŠÖ˝Ć'[WwBR f^ÎÖ›—ÜUѲq.¨Ó",29ŠĐöşŚ:|ďŔ1Z93g%Ĺ^zśSç XvŘw·(˝ő]p@{—Ąs%&n®1Â!~Úi{ÔN|ŤÂsőý2÷ěýŐÂÇő¤8mŹî׳„Öâ ać˘wia' »¦idˇFúž¤W˝)9G"7Áܲ=ü%{ ¬w1‚Č8ôyĽ r¨*jíĆ üüłÉ;$Ô‹¤ÔEa)0ˇşąvśäÔóŐ° V§‰%Ŕ†‘˙dn°Ć|GdÚ>(}K_ŚŤŐwRâŮ]$č3=˝J\ň5Ţ],E-6Žřłţ›„T\ˇZĘŞue2·sźżßŻŹöĽyéO}đŮĘ™ÖZpč›25•±8ťN|ň2ĄnS™ŻĚ§b˛řPĚ^+ľ FŃÄdH (䱯 ×p÷jö«Y^ěßY¸ڵyXmŤ{/®[ďRdź3=­őééý#¤+Ö\®{”ó¦kL ˘h®ĚîĐŔN-}'×w>R7µ ·‹FËp“yyÚ*z„Ás2lß類˝} Ťy Đglt ¶ĆhÇ·:n§zĽ$·â¸–@§( | ř”í˘¬K„Čů‚bJf3SŘ@ĐŢ41Ç?.1h$& q˛ĹË´âRçqĺčI¨±T&Ě#ë!xzöp˙Ň„ŇA$ˇčŔ’ĺúť™§ýüc%žLDSŤ|űě´sËÝ× Ż®üYć„ŐRń«Y=äUë­ăă14¤ďĺU±„ĎfBőOÎ'G˘·‰˘[gŽ$^s8că_“ƨ®Ę]7Äá‡ĺŮ“ĚƲT5“XÁěů#Á”ÍŔt;©˘n.:ˇbŠ˝E.,eHĽÓW`ň(vŢ=%f^aXść­pX⩳äj˛6 "¸÷‰Áőp‡8Ěߨ‘%ě:#j±Đ‚iŽŮú&7ݵהłKČ™ůo*)ŠsCtoJе'·a¦fŽQkÖŢQńÚęâĽÝ†ĹE>ń¦á=Φ|kĚŞĽń!Ç©PŠođ“o"a‘ă 7Ľ®yŇ˙#ĆŢaҡ¶đQ±PíÇČ‹†µ‡m‘:š&ĆŮÜ(\Ď÷ČG)Ěcćq·ť˝ë\üß&mŽ<„3¤[ćcÔW4ëC!­ěĂł#őë´Ŕ{°U±ňއ8fWFc#Y)ş]ŃşËĺÎRm…9Ś»úöצűשĄąI{ˇqĎß¶ĐFáK‘ÚŔFŠŹ€©Ü˝ŕśI5”|ň‚`ęyČŞ•i_|Ýęą–°±™×O‰ŽKxŃ1lšQR=.—Ď`šB¤“`TŐŕÂ9Ż;xX^Ŕß\:晾ádG„_ß“‡}KC˙áÍ´°ú” €N‰O(ç˛i™ĺ0°ęâ†ZÚ¸ô×üř@-t^ţí‰Ä.TB®đ%:sh%iţaĄ|ÔÉé+±n.Í˝˝?Uz8_)Ôžpoľ0. r¤śýNě×ňŕ˵jňCi ůafű.«{vő~éË/]DâgÍýĆ˝Ş„ě_ż˛ÄcŠ íľĎľuťş?Ž"=řÁA«îť†§éjRş,Ä ÉmăŽWŢ€qÄ7Š'pŠśrL°ďy±ÖÇrX:, !Ü"…}â“4C˙řEŔ{ŢZ—kcÇ(ţWJ<± ¬=ă\/I÷c’Izë,üG“cůHJHťÝ÷lŐĘĚ«Á\"(-¶SHă “¨vĽWYÄä‚k) 7(Šź×†§8Š[łĺÉbŘ.vAS±hßĹPŤF\ĽR­çr„l(fÚU'CeBÜúůß#˛ŽóÂd•{+oăCÄ«R–‡\ßYq”śĚ4V)’a[§6ĘîBˇ:ÔWLGë©¶j{Ž‹-fąäĎc3ĂB¨HÂ&ŕ Hřź y˙íâ*ßwĆtśBéŕáłýˇ7Ýöc.˘C«ŇÁM;¨čÓ1]Ö[´¤ZµŮ?ö%-oý®Ľnńš+ŰFM‘¦îrß`Đíł şÂÔÁŽOK˛ÄĆŕş˝˘‚3j†kÂŃ\č<ín11庯PPßySÜÖĄ‘W>Ůb<ćĂĄŕ [©±o|xöÄ'g’üŃCž-89Ď‘ŕ }?Ą-¦Ţi©Ü "đőŢL&ĽKłWsŞQŞ‚wU!ă•N^¤)•JŇĚă‡pz3ŇđŐÜŃՇط Ź_;Đ`'M#]@xEò¶Ó¬Ž’çN…ňRcÝüÎÚ IQ­fŹo®í…Ú’îP¸ľZ©ŢÝHĂfZÔ_Af,^·t›xÎxĂN/o*F>%eËn/îÄ<ŢOkÎVÁ9–—’ M'4®ámëoÉŮăë‰f%hí„Ь˛K^?WjâĚ)Č“áëýňŰüÚŰÎçĺI$(EđnŔzݦQ~eßw?âz)±ĽŽŰŰŰí3|)Í uąFČLQשâh č7Wű<¦qÖŰ {`gý6v®q3±Řřx€•ňyEhĹél BĄˇL=M53ókív鸖ŤátŘŻ^†Ó µ×˙IńĘ8a˘Śu+ăé§ôâ.÷}ĹŹ5Łzů׸y`š­ö‚Á"öť»]­rşzt`d¶(„33÷ˇŁDÜĽTB‚_ň„tÓş'ň]RŽ"âZlSŠŞ\´˝Ą<¨îńíÖš  ďÖU^űŤÇ$ä[r˘ěž¸Xc-L –9ŇBŕLR}<ËÝa*č~húć®…°¨eË[?¤Dř8ÜÝČČÍŚŞ ŃsD°ß|®ß¸Ł/—Çd,­î>6ŔV†MźDí%-á`jÄÝúqBŢ]&eócż˘†OđSń3áQoRđRŽ*+¶ws^uę/öÚŽ%řŃí×™`ů×|ٶęń¶żs4ްB0ďô4ť˛*Â+±_,Bö*Áëä7ä6ÖvíźŰ´/őFô˛ü°1ŢNPëű,uŹň˘>RĐěëŘlr€ť:Ö9M?®|ŤU%EWi#%ň±ˇ ű!Ô)G¦Đ·˘á€áŕ}HźJm ĆöČý–o&"ŚÎ' /hL9;NTiŚŕÖó ¸ŢµŔ>Ě8~UH‡˝K˙ą·hî5ó“$ŇľöW5n€Fz˙©ďÉöl‡K#;ď jaŔ`i:`*ő™H¦·ăŰçu>A6d/—Śř0Ş ŹM®Ćlźb”źL @‡‰Gý[ÄWÔ$N!kVę`ĂŘĎ5Î"îIÓ-r‹SźC “01ř»a Á?Ćí‰%’É:Ńý‚›RJuOx$ě°TV‰Ë&ŠoĄË€”"ňW@Ć‚Ö6g§z#:AŐ4âšu%ŇĐŃś‰´p_3†TGâń[ĎWĂ5şđ8yQłčďľ3ń“my ÁÝ"Ĺť…¦*îÔF›;ŕ=şÄżS–K­|t…"§ŻQ*˝ţ´văë?­]ÖÖO'&MŁ˝‡Y#Ĺ÷xyYHIy~ő,˘}^58V{ –ÇĐK%&č·FŔ•Ĺ7‘‰/?ß,ŚúüYŁ?˙Ѷśc]w©ňwXqŽa!ÇaŹŔ¨ţs¤¸ńˇSÍ›‘Í|ô’’ľoôŽLŐ‡+Ě˝K’™ě'*%!Ą ¸ű§śŐU ś ǧM±ZU,‡pÂŚůŚß°<`­n»ž‹ ”âXüIüˇ±¶ż}’IIš(6ýża(KĚ嬏dIˇëń‡†e(RřŢN)łŠ­ę-b…бp| ±Ą0)†űHmčÂüKúĆ›[Gçv_±śx;íÓRłá›JqĂOî¶.ód3UÇmJŁ~b¨¶{ý×ć>ń-2-?‘Ňäb‹y‡eľ=·ŹXţčę±eHľo«É(Qç÷ç9žťWWęÖŔ‡á™b73¶Wâľ.­­ç37­­ŹÓšąJRÉ45ż´Đ5şH&=§šKÍ’´\4«ăÜ©áÚŕ._ ăÍśoÁ{X¦6źý´ÖŁsÚş”‘çaÔuôfŠPG~úúűÖŻÚ…ůµóąâçf ĘűQ™ú˝Ŕ °yđşěTC×LF,”ŚL!Áš­–Ňíg;ÂSćĂ»’ VeÇß® .G‹^?­#IÍĘČą5Ws«ŽDĐ3*ÎłT šŤňuř)ńßhŔŇú:;ëł%±\p´/*î™u ľ}„0(ŰŇ˙ĘŹfsbÂ6„]Âő…‘w± ü–“Šd˙cjG®·'ŽPp–6±ß¤ÜUzÎَŐÖë çş8;óĂóĎńëčđ*ql((XqŽăe–‡ »z)ÜĐ.Cý§! }¦łÚěÂ0Ťˇ Ţ“eéĐEŹŇ©Ę•źRZ_qF*ź YÄwĺÔ™M;Ł«H—ńLäŮÜďěU­şŚaÄŠŰ”hbqsuf>“ŹDPőUI Ní›3oéč‘Őu‡˝NÎ ~dqřą“GÎ|DĘÉ Ľ˙ÝJ+ýłĽü^1ŢTc]…._ţâŞ%,·ü‹­oGݡɓmsö8ýOŻ.”»’ă~‡ Ü€·8¬~·č­ţdW ÷.”iQ6¦q'ĂÁsw˘ÄŞh•‚P$d´<$ÂÉ\'†Ţňšbé­Š*ž®E±ßl«­)r:{ŤĹ×Z}”TEdúBS ĄSôŽĽ˘0Ź­ÍďÇ »E|ű]7-ËŐH˝čěy”x' ,Ç»‰|¦öN:×ÂćWÖŕ(®XÁT—čÂĄ„‹pŇ›€„ą7™trÄAć§Ąě9Ô´ü¶}W2T’]ťKÖ°OsÓfn Ă׾šŠµÄĂM9ËÁŔ\{Γ8LőgáDלJ ag-“Á·ôi¬]>ňD)ÝďžhěŃĽ±„zŚfšc© ąöăś×‡B(Ęt*ő|묙Ěoäá >d~ŢE€1‚g}™ÁËKŕ|Ó'2Ť]ÝâŰ=wĐC2·‰¤®ăŁSu|5Ůź›B´•çóŔĎŘbč,É˝ÝäŽŕ뼻;~JŁ1·ćNÖ·l'ůÁGXr×éß E$G6” éĂ»ËĆrP.n/…CňDE“? ĚFóejA¶czä{FŽâ”Zzž‘ #©iůçÇ3 ţµűd?:Ôă-“ÔśŤíݦŃ~´i‹ť@I1Ľ× ErgťžÂą´M%ŹłD‰öö|'{ȧ9'ťĹĂh€k iM“Ř>ĎvŞ]FH§łúŠ?Qş«n’•F‡eÔ]iíUYj˛ÍO~vÉm;˛ÚľźÎa‘zŹ›Ô(™[±äŽćţŔNvcD“B >ü.eÎB„ć5ł‡g+°c<¤|5W<Ą —–lĎ–¦≤3śdÜ€$VKÄM7ů)錯”Č…xĂš§#­ŇÜőĐaąq±Ł€AžĄő çČ‚ćŇŔ^UĂşřAuËd§k«ŇďË©_Ýé9GňŚ˛ą”ťďę#ű«ä1őY†ňjÄ1:u ±\ÁL'Kö°¸ë2rPŹż('…k ˝Í~|žŘ4K&Ď:mŹII&ţŚMÝ6sWią×bA›˙ȢěóĄëätŤŰîăÓ5|jŚ@‘Cł7 öŃJ!7‹ĐJ—öč;”yç~ľ›ěóÇőѲÎŮΙ1ÂűÁ Ä€Xßîʵ‚|±ĘŮľ^öôóô_Ő´h:Ö˘†Ć†\g±—ŇĽ´Z$»ç·ăúMŢSˇÄ§,ÍĘöfĹÂ'ćŇš áëE .ź=ä‚xW~Nž %'¶Ř(…sźŮ—âµgĘÇYWŰĽĹJc†5ĚŢ„n;‰5¦‚+řčćTę)ĄáČELďWó%†ˇE·"hÉ«ËYÔ‘ˇâÓ[qßČž6ČĘŽ&7ŃmqČ P:P }úń[É~멝ČĆJËâu4Ns‹ÇŹšŮ?\ÄŃş"Ő€/Óűú’td2v_Ř5\Đër4—Ř­ÚńUVQ™4Đ8…_ôęęžňbŢúo<ÁĘVĘó˝ßö¬Ö[ÔVdGáĘ?ŠMęęłYÚhO ĹgwŹçg¨\řUĆb>›Şşeľ±ôvč0Ž0[6˝jžž¨- ¤{E~LnŇqtćť“ľ`¶sŕaŢŁ6°č´‘ÖZč¨ń RRMi/MĽ”i dÜŤz¦/ó8cůőńĂZWýxą†ě“ŚŘ…:ř4ĽÖÔD“" Ý4Isç*Hhm-čĂŤ…ݱäNηÎM5—Ľ źvŚ1‚°~bÉüŰ/S6đXSěxŘýäÔ›d ljô¤±•Ž.µü4č'Z›r˘ăją.·Dă0äSpĂżćŹFićµălŹĽ›ĆÇÁť7~ą—~Y§a†2±!UJĆ‘âQ%fÚAz2ŚtÜ.WAfO>FţeqM´ľ+jČym}e)(c•%°ş¸A󦵜aŹú´ą.ą˝TéĂ擟«ŁGčąI+‚8"F˝§pĐ:Á¦„_l¨<ďŠđ»\Öä ¸†éwX‡mÄc¬0䚉ˇBoś[á†$QW„8˙í.YN˝ŐČę4ÖďÄń Ńń·¬biBnđ7á˛Z°‘^ę,»>j ¦ÚksĄ“—]îŁk;q9©ŻĐąö¨ˇĹ®Žç«s_acLVÔ#=¦ÝqzşnÝł%ŰŰ4Š ęŃ­Îżs©Ü%Ĺ·n!2“Ó*f»äíkążµ@aŻ:ň‚á>:÷JÄŞďµ–sý”|hĄI.O§+ťäŇD‹Ú˛¦ÜÜëď; ĺĚ^K~ž˛BMpżŇ|2\Ľ#;×’Ń^â’Ă(×§[ßEĽCŹQŇCW~µÎiú(Ďń‹»ž3 ýUÓ âtÝd'#ľUxHą“ÄQ…§/ÎNEź=‹Ăő8ŐÎ{+hôŘŕ›éçË黉ˇ˛XJĺC˛Şoë‘‘”ą‡cśÉ÷z8Ď\Ö·ëŇ)śvƲôN>'ĂpâĘAT˘ň’bĘÇŮG¸u7ÓuŐ:ëG€›Üeô›źăÇŮŇđýDco$Yőş#q·đ|`aÉ>^bś·Uţ¬Q!ŮPć‚^e<ăkľ u…¤ł7ČŇUĽĄ48 š+ˇj|ôŮD`ť1.@rý|ké ůÎ6YňfĹr‰Hłš†ĐÚŞ¸jC†]™Qëy:ĽŃv2/™ęî± MßśbIʧŔ±Ö]ş°×Ź>—Ż“űQMĘST޵’jFŕA©quňŇG-T–!X±NöËN!şP’Z,;­ÓÄgcŢ‹[VËOŕwÚ3Źw ß÷1E”)ÇÚsÍCcóF1EUĘ'“¶&tNB IęýâŐą€˘q¶•KĆŞ‚z¸sÝéuÇ‚ĹČ-KĐvŤ”©¤řrÓăťfĐ»+zĺÎQuś}JśŇŁŽ(‚÷…-Śň`ÝĂ› őÔ‘§µÇEE0rŁć‚ŠĎ$şÇ\nVŘw8âţŇŰň_Űg»€"çfgNĂűŠîČńŹ’˘’(Żôů0ëVž˝ĘPÄŢŻHnšŁVqV€w _äěż5QpÔ*/ű鍾ÉL-Í`­IÄ—'…írĚJj·N˛°´ JQg[ŽÖ¸gCµ#X±ŽTźn*ß-i즒űŚřI-U:ľżHăů|ú"<$‡Ł-/„%˙Išă" ł­Łäś§w‡6íN˝żşµQv‚ě+AăŇ–Ž­’ě+OxŰÝ;ÂçŕĎ<7X{.ć™ŕ›5žúËćݲڕ|ÚRü_ §âőB‘.Ąě“|źǸďĄÖ 5ł_ÖW¤”“)8Rhđč÷R'©%ĎDÁ=+ń»gcŘ·±d÷˱`\ŻóÖ¤efLÍńwňh0$łŚtçň*ŤĽYA“^JßŇčdů叾P{—sOmŔ[bńkĂŠ©ÚşYżĘfËÚđ¸űÚŁ¶Ź>>ăi =¤ěa¸Ý­Ü’^°â˛– xěámČÁ1ôł'Űĸň첟Xś°(_×'˘žäÇËO[ š H…“B™ňM};}Š} ćń—ĄYÍ\.-ÖXvpenO˝$BČ^y8Ŕ„ uW ňM¶f´8»®Iő.R€q­łÍ5ŹAîýĚŕ·—ϧBD°n?)Š I˛LýMÍBŞ´µJ`4yŻN¤Cvk¨ü†ř8SŞřH¶.\3žz¦N™-[ăľő,`›ŔdÂC˝b˝‘™ů™HqíósCgĘ»&á^_+’k‰Z«ÖŠüţů¨Ńsř‰pk·ęĹDj8A1¶„YęZ˝AĆßšz/ÂĽÂR˙\fýKn)Í@#ëC†•R0˘­—{Übu-‘¤7\—š9ăď‰(÷CJ˛xÍ‚:ů jrm ÉSĄL-ŹđZčia 1ŕ)ßáĽ:ŤípÖłž±*×D˘b§w¨*pn#Ńďx- ś`6‡5_ÖZéŘ>+”hܤüXYżC‹¸äą$S4*Đ+wbúł2,\ő0Ć弸ä§7JĹYźĹť˘(>,zö{‰éVŮy> 9ńŇú-+ŮÍč-gUć\Öň[tŇL˙ŻÜ}#i_}ü5hăťµ&×'‚Qą"ôXD®»ôU­ŹbŚŤaĐHĐę7>˙ŇŕśĎúža"˙ÎMř`XŁZWĘľăc4†Ó$™ŃfMfťUňę'îŮuŚ&¬ uYU|fî´^bőY¦Ř4Y® Ărĺ뙯'Ăö®ţaň…öî•.Öp@ˇąÁ^<|ăü”Pż¤‹$1—®˙®Z9ŰT‡GŐ+ą+ Äń©)R©i¨ň˘uâ–fo\ý2Ş»AŕÖ ŇşaŽoćő.SÖäjíĽ¨Ę-ZĎű]ăknÇb61îó~& Ż%Î>~Ě.Y·Ué&¸yy`~µM‡C>"äş˙¶‚4štç´s26óĘ<říŐwQć#‡áÎŞ‚`$B¬č,|Ľ#%š+^IßP 4©üÔ pď‡ač°ă8s„<ŠsÔTáü”d?ĎÝâŰ 6ˇµb&·®ŕ~‡ÚgJżl·Âş÷¦TŮśĘUžćźmÇ^¦“–&őíAţCßě;G–\ÇëĐň’kŢiE–ea‘˘THÄÂ(mZýEyŹdŃĽÄĐő‰Ş+¤ ÉÉaóĄńĄŁŻ°Bä é!+ŢĎľe#Öň]/ ÉP›Ô,ä¸c?:ő-hhóo‘ŠŞ5ěçĄ?|ĂÖŞ"ęDî­W› ¬cď3'@Ě´ĺ$K’GľŔď* ˛b8ŃçĎw†ćŮZW!Tĺ”Í›#tőŢűéŞ ™>#AÚô[-Üе*Dbl€’‡<=°ă Óp†‹*żFáݺΏĽ|¶ą°UÉí\dŻC%INČYUˇ@ŔNÜü¤mÄSX,ŕ,Š`ÜâŽ*1e©‡ÄŚËs§žpš×ĄoZ¬ĺ“RK¨é"D– µäí]/fŹŞgśÉXÓ­Ąţ &~…uŹôŕřy:d«x{fć#ˇX xíëśšt×ŠŐ …‡ŃÚŮŻŤ=בkJŐ‰ďäÁ żŢźđF|ËI[w÷XŞů)pȰ.‘Ú“<7Ü"Ť\o …Ú«š˝ŕܵ ¸o‘µ€~V¨†¬Řś{‚Ú뤪čBJEľ§;ZřEś“6mz;s‰ÚÇĐ<&µöä8ŁjuŹŐ Ëŕ»ţĹ ·9šâůСm7śŽň ĂĽşů^ž•M?qoŁ ť’-†x_~lCčßĚ:,şÖ” ».X_ůŐˇÇ6ĐšK·}µ¬ĺ—Ţ•Ž{ĽŁáż?{¸2_¤ůé7ĂžťĄ™äíúµFwŐŻ©uPLiű~ĆdN Ň…nŰ{Ě.ů4#DC¨~·şÉ/BŞĺ{±Ń6ÂĎÇń ×I…ă Mô ýĘL<ŮÚé7XÇźZă$¬úBŠ=!0ŠRŘ ÷id<ÄżU‰(‡M®ľ+-„Jźő„iRM‹É(\ęů‚±;/ÖžzžSEňŽľţĂď°nz3ÝÝÔ$ŞLn=Čkp”©– wĹA Ł3ä-ÍáÔÓ*«.×@Ůě0Ďű›–ÔuńěFžO¤C <%*N±†—ţő•wŽ™i˘ÄPir ‡Ż›śÖ&,Ü+>Nˇ3ů:Y2âŠ# 6WŽľké;GźPîďĺËqÁď÷ŞČÍČo˛Ą‚ %÷[áH;1}¤ŐB“éTUˇşĄ¶Ď|¦> iů•1§+âÝTl`˝măfZ`ß–öŚTBz`á/RYkoąý{š\ď0jÇđĐÜ|#!Ůn_š-ÚxvvkÓw9?@o¶~Ýđ–xő)˛:ž<śŰzúHĽĘ(mVzľĂ¤ř|é%ą÷ĽLŔEĆř̉7űŢńú˙ŢÚ9Ü]/ç`»ęďźČë€ qĆć1)Ëü˙ń˙˙ü_ônlääbokäd ˙M=íendstream endobj 16 0 obj << /Type /Font /Subtype /Type1 /Encoding 355 0 R /FirstChar 11 /LastChar 122 /Widths 361 0 R /BaseFont /CYXWQA+CMBX10 /FontDescriptor 14 0 R >> endobj 14 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /CYXWQA+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/ff/fl/parenleft/parenright/asterisk/comma/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 15 0 R >> endobj 361 0 obj [671 0 639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 447 447 575 0 319 383 319 0 575 575 575 575 575 575 575 575 575 575 319 0 0 0 0 0 0 869 818 831 882 756 724 904 900 436 0 901 692 1092 900 864 786 864 862 639 800 885 869 1189 869 869 0 319 0 319 0 0 0 559 639 511 639 527 351 575 639 319 0 607 319 958 639 575 639 607 474 454 447 639 607 831 607 607 511 ] endobj 12 0 obj << /Length1 1657 /Length2 10311 /Length3 532 /Length 11262 /Filter /FlateDecode >> stream xÚí–UTʶ®q‚CN @p÷ŕîînŤ»»»ww îîśŕ’ŕî§×ÚgŻäěóxďÓ·űĄżYUó˙kÎŞMJ$§HĂodc±±v¤a eŕJ+00héáIIíúŽf6ÖBúŽ@N€ßÉŔH``ĺdbç¤g'Úغٛ™:Č)ţšÄŕ·Ú›ę[¤őMV †ú–EC3 Ł-€ßŇ đ× €Đhď 4˘…g`™: €&fÖđt·6¶°ý+lädűď!g ˝Č€d’˛hdcmé0ĂÓÉŘ€´€ '˙7Lýgr'KK}«żŇ˙U¤˙5¬oeféößl¬lťöi# ˝őNUţË›4ĐČĚÉę?GĹő-Í ů­M,ú…ĚDĚ\Frfކ¦c}Kŕßq µŃšŐío tňJJ2ňT˙ęçßcrúfÖŽJn¶˙dýkňßĚđ›AŐ±7shŇÓŇÓ3€&‚ľ˙ţĄýZÂÖ†6FfÖ Á з·×wť ±<fÖF@WĐdŽÖÚĆ´މŔŘĆţŻv‚:Ngüwě_ČBłßČBË™@g«o´¶;ţŽ2üwô_˝ţ' JĄď*ż™Ĺď 3€ÎĐĆĘJ˙w„@gęfk ´ţb%­ł1úâĐŮX˙a–ż|Ú8Ů˙`Ąá˙M  ż‰ @'ř›ŘtBż ”XřbmPä7DÄ~¨âż ¤'ů›@zRż ¤'ý›@z2ż ¤'ű±ôä~HOá7ô¨pJż ¤®ü›@ę*ż ¤®ú›@ęj˙HOă7g`Żohtü ĺ`ú'ţ?[ şŔtż;ÇJmđ›@3ü}pčAJF H řţŐľ?$hň‚öjú‚6űÇ‘¤™°řA.,˙@ «ßȲaý‚lŘü ¶ H×ţé:ü *;ţ N Ȇó˛áňÇ­ŮpýA6Üţ@ ÷żń?#6®4LĚFPÉŮA'ŹŢëÎS¶6łsŠ XčééŮ8˙Ž:Ů®¤ăßď6č…ú7›Ţ3 Đhż´`cř%Đ<ą1¸Ô[8Ş š\Ŕ¤)V¦®{¶!ŕÇWpˢQI;ĘőZµÇň4tä]č]B—g<‡đvOů ‘3?»Ř”ů×]g˝Ý4÷<µË4i·[⻀#”¶ĆąëcpŮ™ő±Ňő‚ĚóÁŁ\9r!Ą=ŘU"°Mçúžô@V65‘4Kĺ Z2&"Ô»ŇPć5Ô„8¨µďŢć!ďš©V.lÚťŢ?ćżË‰Őş>áÓÄĚgŐ¶žś_4]°˛4ŐŹŁb&ŚĚŹNoi}~¬Ě ăťbj$‹M±žăÎ×gn&‰›ÝÂő¬Ďô¦ő_ť Ë‘ra¤­Ý-ÎtXĹ‘Qďä-·ĄßŃR_ެY7Č·Şů—/15xîççL[Ë/ŠË:ŔYÝ|Y5n»OjŮHdđŇŐG\z“"ţކdm“ţ®Öe-Z+-Ł*##ĽKnâ™Úř$î¨~ޞ 6rË@4—Ic–qąTn2±]ŠéÍţ0W3ĚŮÚPW¸żŰ´Ň{ß„#ŇŻÚłEšâ ÎKý-U:±TěçO‚¸ÄB+˘Mţ”wĚ\5[ąľ!<Aĺ6¶Kĺ…Z¶É¤K%“;”Ü,” WÝëXÓ„Śq·Ëű*Őů»ô–ď:'Ú)Ş-I^éIßćtď4ŰŚř°[·ŤÔíĂŮÓndÎńS®őGČX‘!1 ¨°§yk58UˇŢßĎ$í~}€gNü¸ĘbZ"5BbW‹Ę‰Ël+÷Rt|Ëk2ţŃST"V1Ř:#tWÇŚ±5¤5ř°<>ě^#®?…Ŕťţ$¶­©ë¦}p˝íÜÇ”ÎĐxŘVí*l×ĆćEŻź‡@Đ’Ô¬ç}Ün– |XbÜ yâ%Ëł2ŠCFy[@hňí{+ýŕ#ÔDJ¸á]o“Î75újqd$*&·Đ ąlÚ”,ąĽî+ç 1ŢŕékG×P^^sIç¨Â˛°ý C´5‰8¸őpYrUănëuĂô¸ń‰Ń›t|ŞćůĐQ'é÷Ş]wŠ)Ň×ń¶ńegn`™ŚyiROú^&čbÔb‹űü(`•Ö&¨*ŤĘĚ{ŮĐÓ2—2ńÄMAw*<ń{¦ aI;vćEÁäJ¬ĽĆz)pÄ…_Âvˇ›Ľ}Ď]‚"· ±?”ß]¨¶Ś•¨=v·OŠ!ŕFn×FÓĎ´p Ń°˘n­ďąq.·Ą.á ¦ MŞä4t"„ÝY„hß“+HĂź?ď^N·Őšĺ^Óü‹«wĆÝ‘ Í1 ťřąŔ76ţöפ˛‡e°*śGm/Ýd(ĄX€ĽĎV˘ÉŃ*¬íŃ&;0 ř¤ŘŹKAŤÄśz żřxâ9©ÚZüLŻ‹‰ËI•–<#ô bb]—b F_ Bëu>>vmÖż ´Đő®’ HtM¶Š7h‰ěoÁâZ˛V á6çdÚ=ŐQ^K'ŰëZ˝ČůśK0ě#’Şuę–2Ń3Ą×Jŕ`4KHíîLß AŚi`¨"zFŹjt<תý™Č˘>s(‹`~˝hUąoé0CDç7„ě‘öYV_,qâťU÷–±ˇ1}Ť-g*;{ŇňÖzÄ÷>a‰M•şu>6A”|vőPą»ňź?·@ˇ0ţ±¦őťghGŢu5µß€tö3 ń‰ěţůSÎĂg‘ŁöÄDDŹqbdľ÷Źč09IľP4„-¨ź[Ďźb·4…Yh<ńo>„ľ«RȆf”.!5€É[豤¦~ľýç2ěWD{¸ţß‹8ąZ%ëĂŮ7Y‚Jp€™fĽ)˘÷íxD’ [—Ířę_wľÚx…gŘi~ÎKlĘąCźµdŔ†Ą dx—đňqÄ;$PQ@&WxUëiS[[ĆnîŕP"MZyQČçŢw”z]<m{§>Ą;‘•:#ĺkĚĽ@Šč㓤ʬm$”6kW%%,ާRTXlę„ő»%'íOuýNÍg˘ťlú]X^)ş"…Ž´lTg^Ěfźsĺ$<>> ŁŹdíŔ|=żŰCÉ?,tĽЧ€c—^;§S7ɶÚ@ď*¶Ž gµ.Ł×ýB+F 7‘ćĄßţÂ^đ¤îÓńśŰ*˙č̡·ţµâPč鵦§p¸ň1›ăЦ>Ąî#ůŚ‘C®1ŇđÜł×@xAqřůwµ×wűÇýĆĘyť)OęÜAŽy‚'ÉÎő#ô…)łcţú›)zRŞřxf)Ä˝ôꮞ IPUŢNîëßf<2™PKi ÍOŐ3f#nyV—Ýeß|q¤|@f„WcžˇĂw^ŢŹţÂŤiÉ^ ݰüşkhűybŞŻőč?UĘ•G#7†Ň!Ą¬ĆgEÚi•…¦1:ˇÝXžĺW"¬Şvß®˙=D|ËÖ†i"âMÁÖ{ĹŃâëyţYP$ńN{O›UŹloż!ů^^4>wµžXň ,e‘ i˙ŽÖü RtüA9ÎçĺśŢ†-ZOC|xÁV* ‚ykąĄ@ łe1]ŁlÉk ;VĚ·=kO„ÓÇí V#‘Şl¤ Ą—Ň3÷wLu/áMÉyé_ă¦' đˇ\ŘűśS,ű_tßÖ‘eŻo‡{ń[ć,k±‰5!cŢ]Ýđëuö’žśG—ľ™çë-ŰĄ-CędQĺŘ•yűCw†¬îKŁä°)‹'Üú›ßlťŚŘ k­<˰ܓxq°Ůj`Ţ07L¬ś­ˇzÄëÖ‹§ńqN>ČÔ ÍřËÚÖ¤Łí)«~Ô÷¨¨Whţ¦ĽĄ'đAn˝ŮŤ#ýüˇ=ÜĹ‘\a†n=–´Ź/1…Ü“Śűc«Ó|ýĎ´eb&bsáć-xÇÂŁ4ĐčŰâőrŞÝ>uű÷–Kń/łvŻa?#V7óx™Á©˛tČß_)ŽżńE0)¤B§xőW}ŰŽŇ8đ&ťĄ[»\Ëľ—ĺ_ÚMý<ÂGúj:µK™męČhŮ^TxťÖ,c8ŚźĹr$2[WzGŠÎ.}2ŰKm8ňőQż¸Ë aA_š‡÷•1’íŐiyĹĘeoE”ßÄ{O|!sBź`¨îýΤťjUÄü.ÁĂ˝˘Â2ťKDuş:!Wí\bň`#ĎúEł©¸ęˇę™äÔš9'ő3Üe%m|*âc˛`še_¬Ç¢̅ËJŚUjž•ż`‰E…[ú)›ˇr r°›]LQǤĎ/í…Ňé@cŃ``i 3anŁíîž3žĘÎÉXťU—LT.Ł ,‡îe`ĄÓň{nĺ«ax#ß.fůĘEžĺĚ  ŠďÄ.˝âě'µČđZ&6"Ř—+č¤#LŘT}pŘŤ‘On=t»źŽĽ„ źęcżg/“Ţö×·Gąaĺ\qÁ=0= 5(S©™X±¶­Č_z¬áhśË1a"í'Eúî•ăĘtßČ­Oóuú=/Ě # hçv]ŁR=fžó•ăđ5ľ? rUD2­{še9ËFź×WWĺv7ĎV|e[ü †FÍ[×HSEn™dC7ůľě×  ŕöłűł°¬lIwíĎ|b«äf ĚŽí±`h:âË!NÜ'Úx¬g(X ™ g=u'×ęMřc‚VĹ h·¦čŹÝę­jp\ťÓŰnzÔí`Vćű攼26§Sv?“jµ¤0§\‡±ëŇ,ľ‰›ú}Ţ;đČ"č‘ňľçŹ#G%ůĆăüżĘÁÝ`ŠŠŮ ß·(çÜ-vHďęU4ŕŃ\ÔŞAŻÖŐÚÇ9@QCsIÔžK[ 3›„ĎC^ Î j;äťööLÍdř›áw™'gD„ß«pn¸ŠŇ¬ŮÍQ1·Z\(!˱ô5ŐňüµZĐĽ”š™Íużşpm8‹cXBČŮZ˘‰äMJQBî˛wÂ#VÚü~H 'ČÁÝűTŔçžäţ‡ĄBçô\˙ű9„w> 9sÚ ˇşXdŁćx¦‹Ń¸ŤNpç/:”U $~p"O¨(ăD"Ót@˘‚Ńho>í×™,`ćę\đ*Í ŰmQ=ľńSŇ(„™`w°#“B°}sšÎzA|<¸ÁÎSË;e1s)nÝŘS´ŚÔIĽßhL`ü!¶‘\)Ŕuś3¶Ěo>ô0U@ Ő˘’KK &5}…AwéLpŠoFTmd•飋†ĂŢťÖ"<)ÚµZs-ęäóZhâ‘ň×zWsšŽ`Sš¨GMg×*uJww<9k1 {$‚OŤż©çĽ—ŤűĘŹ™ŻŃ_{<,ËŚ´ű2„ijć ¦JEÂ#†@ęVlKř‡u‚‡łűoš‡˘stĎ IŽnmFU€ĺfË›ÓçÓgüëÄ*OČ`ĹíŕÄü§l}×·¶§ňeć ,in?2'¤ł:űiĆV†śšđČ‚_G…Ü©¦…ţ[ Ë!­$ýj7bmŽ·ľ¸FŁ"ÁOIĹX¬O¨Â'ąŔ9Ü *ř Éoéő7ś4„ÇŘ îÉĘ *Î śËvű’çuIş ‹gv$Męľ3ššüBůrÚgÚÇűÇF˝±Üs+á\6Î|Ňo5^u;:¸ęó=;ţYÖČĹH§†«tÁ,¨u‹y8Ýńâć—^4jĽ@†6^ł†K5ŤEŃŁ›Î$TĂĂřőČÁ¸P÷zşI˛‡äţ=3ír€ŞNns™ö$AćXäťď/}ăhgľ·YžťE~o?;¬łµhçz<äl{¦“ \7Ě•QýhZ^Rś@€rZ!ßs vĂKE ,;˛agҧ4>S§ÄAyĐĹ^đ҉ĘĘ,Z7cOy…$ëÖśĽGĎa|”Îű Ťł$?•Á§î Ş&Śz)¬™-IňßEË˙:¶Çę7©rôŮ(ÄK†E‘Řj†€ô®Lۇ’fp۪׊ßEgi¬č3»Iź jˇ~`RďŚňUâĘŰ\âg…ĺŕŤëü˝#ÉSŘ0ć‰a‡ Ú"Fćl#oeŠËw°1Ô5kYż ÚĹÄTĽŔÎ.Ń6˝Óm~ĘěEŤ(Ř– ‡Ş`µoŚ—|É8ÄÍ1nŇZ2/0óţ°#ŃŃ‹87äcäz´ąÓu’Qyx9d7đ}oľ¸#hh*Ă‚h·xűptcC»đ1Ě€B´ď?5+â’vK#ă‰U›SšąörpčśoVÎddŘcËÂc×íô/’—®:yő©“á¨Ň;¸I§äŁ_!)M`čźFś]kŔMn«ˇ o1"Cnł»Fk2.ŠŮ}šML_ h¶:Jžwťľűü Ó‹Ëś°ĺ¨9®…ᕍ¦bo§wĐu«l×Hbn ›ŰĂćńÍ“śˇ‡«Ú¨zek“ćP $ö¤úęs *şřçěžc>Úł[Ů&IŚ6—o#\C”®l¤Ž&¦%ÝuµTV?zßÂNź'ëŐ”!)˛ă\cŘ˝nöC“-˝Ň"ot^q7vrI+µŞýÖ‘úOšŚ,´ŐăĽëăĂy°ŻţuOО~¦şüjŕŰIDé$!× łV¤öú_š÷*űsžéđ*~"‰DłPě“÷Q a¦úĆw¦ÔvU.Řň=–Ý|5ěe3Řp`6übńĄ[W˛öśEg]ZO†:µ$uµäŇÔ物dťłć«ÚB¬#ú»“24…ź…Ú>—*©ť©á 5yYŐ寜Ppˇ©ZMŕ3ýwŁÚr;ř›ńáĎËSóláum4Éď™±‚SĹ|ĐMžđü¨ŠĆ©`şßGŇżóŮĂşrŐ˛îü°MpWeőăTmĐČď •é-]†Đc'Ę 9˘3bETBP3B,ah^¨”•‚›&JB]î@âvÚçůo<4éö˘UrXŹć«ŔG?¨ůK_x®@ÚeÔö=`xL‰gŚĎĂ|HoF×tŻ@s}=AhÜň¬ŢŤ±WŁÁ.ŁN=wůäĄzŚ‚‡ WˇC49nGź,ó#¶¶×=Ýî“(‘÷ŹĆŇT™&EöŐ`ô©LĚm6f´Ř6ĺF¬uhÓ˘µ™Pü¦ú‡×ÄyýdĂŞń ż!Ő˝‚RăO19ă§ŮJ÷*<&ž«}2]*ËŇ…00-"M›$—ŕˇ3ě;Ł]Í'/¬ęĘ ÔĽ–ćéCSaŔŮMŽĹDoäšVę <Ćń·3‡ Ëćw¤cÇcł"()Ń—źeĐ&=>žđ" fŤŤĎEÝĽ[Z'ÇđG)e”wô—áÝĽfR·Íd‡Š™,YĽĘę÷jĘ˙˘"fv?=^á·IĎívÖ奤€~deˇVCč§ÔcHţˇÜçv!JŽ5:gł0ęÍC%hłî ꇴ‰8çÄE·ąA<ňťx1ĚĽ×o¨gLłühă)HÍokAâë3Atš(ÔđâW´~Č—Sľ:ŚbzضXš"vl$uŃŚ ČÓ|APÍgŃŐI’Hç'Î1×Ů;ő§ š"âRűKꌉcĺs%¦%{)bň«uÇf›’ä\aŮ8•ßß,ń˝Hą¬[f•Ag*G38Ć-Ó`r6ľťž‰1<FÇř;řWEÇţ޶o…Ŕ|ĂjžDŻNţňŚ€o@!ěűěĎ \»Ąč xż&#W¬‘š˘śujĎC,/ăšB5AsŮ`4˝% Ű'uÎx^4áK%d»Ź|•.íä@§Ľ[n=<Ö÷^[ÎmşłCKíôFÍ™Cň ‚ŕ ĐOä Î ýNš«Č×ÁvîCă,óOź[•*łé ŠgwqÇlˇ¶/nmhҦÂÄ0mć”=ÄuX•O2Ň+Ż* ŁĄćz 85©%˘&ç`–PŘě ÓěÜ©/(DšËŞŚ“#źŐĐ.'.K%¸ä6´dëˇBjЦxś|>{µöŞ*/Ł1KjRüĽ˙qłßţ•ś!ó¶¶ÍÎő«ŐH`٨…gÁs˘(łp¬Ř.Ýşkń’#ŔWEŢ_¦Ś\ŚýđţŚgꕇ»Sč[őë°Đ0€»‹ŃĽ«ÉpČaö‡ÍÍ…¸Š ·ů+”gÄ5 l«¤Ee'wüg4m» t2ě,“8«Ü®pžW‹šKnVE÷:ć8`“ظJşöEŐý4R { )`ĂI’;¤f@÷u=őŹWŔdm~(l{Xü~oio‹ý)ľ ż«[?ćbXÝ)OHŚWă9‰/0ČşŚ!ŽîĺţdżçÝXľo ŮĄżű¬Đ1ťĐ-"A|P0•_K8l(›băČI>Ia苲ůwĺBŐŚ˝ăŢÎpz3pmĹŐÄĆ­úg㾌ڪőci-‰ţŤWH))ś˘-«©ö±ŐF†pĵ“}đ¬ě~n§›M-řń€‹îp†č Ů˝á˛Ş.Eö35’hi®çtŤ©€‘Ď‘6˘Oz:iz}‡+‘xĚý¨‘‚Ńř -ö`«÷Ť «Ŕ&|íŻD SĚŻnFĽÇ0V_»Ö <+î ł#ŐrÔ;XwąÔîv†9(ÚZ…őDb§­&ě&,Ô"RĘU÷RI¶p“ź®Đ¸(|@é#ľ®Á9í†ŔŰ“ăWcPÜŕřđáă·ůLć“~-ÎNyw0JŤ uĺÝ784Ł3ýć÷?ËŇJĄš°µ a‡q¸ştĹ<ăËŢëÁtý¤ŔŕKš€đ8… ha¶k¬J}׉‚¤ĺ 4 Ăb8óö@ÍGŁpÝńT÷:Q űboFívĘZŰ_třÚAHą¸­ţó=ĆWd#ËA^ďŁxf¤`g©Q3?¬}¶ r¤©&č~%.a0Á/ʝ͋$¦ţ\mäס˛Týmr¶*Ť,жIT@Ůé7/čq<'JÄłŞŮŘ—ń†ľ[”!Zú]|ˇ§\¤ü jĄ€Ľ'¤ Ň3 –Ë=‘ň‘e2ňĽWĽŇoý+x3bPöÇŮĄ˝«Žuî":YäbŹ©ŕ?5`Ű!&°°ńż›ł®“ŁĎ©íÝY¦ëe|‘ăcÁk:FkćŃá:×ó(Ůa†+ű‰o;3_}yŚ‚"®Él‘ć7cˇ`—™uŕvć3*Eô“ pgGhI7­Ľ#]î“}xŤWLćţdç)¤ #´ö§ź'±|ăŽ;˘”îrř"ýrÓx9LőžyW­%R˙uTŽp=i¸á–Ö¤Í,s†9QmAĐN“‡Ą‚t˘ÂżđF€~©SčúéÓSb"NŤ#ś=ćě×nE®<ŮÁ¬gkąBŢQé…?÷RŻ_~Aa÷¸şş‘öҤDtç9zĽ9Čöx|µJ~:´ĚÉúlŞŤŰ0#wÎëLΩy$oŮşŰÖŽéŁ zGo#ˇĂË~ZŚÖt PQĽ1b‡ľľŻ¸ ŮóŚĐ–¶TCs+m/ŕ»ő†łóŞP %ŔŐ=–Ŕ{ ĄA` ›â*ýč$š·[%ܶhĚQÔÍ›MCǬ쉴RŔm4Ď#–ÉľD÷<˙BsÁ… c\·aéč]ÝbIáU1§‚1nY´XF#ţ1F<ł1ńąOoő ©ô"¶<F„„n”Jw°±"íWßă+n€FźhŐÉpä#vŘ–ÍľÝlÄX*$÷K1fXŔL#T¤ 7޵ţĹÜJ¶,ścBÔŞŰŻtő,čNMßcQN†ŠŃčŮę-‚’– Í" ÉŻ‘éžěPaRçK'φeÇz÷ŕ†°< ˝Pěľ3Ůä›!Ľ…?Ć;đ˙űâ€í°µcç‚_%ž\·łOëŁsbäc¨ -3aëEéÉ)ÚA·Má‰ŕĎ:j˛Á%4UśKFîzŇČ?đAŻ[úF|>ÜŮ©8Lĺ‰ęĄű©O©G?B’rĎ®ô®¸]ŹľöeŰů5đŽľÓ“”ŔýůzQ €/Ůů˘6ĽÁLĎ& ÉÖÖŘ›Ń4ËŤîÇ”HÚátô¤¦<2z­uy™wJă‚Tѧ«¨—|ńÁ™e «¶*#oTl˛UpBó7~’¦ţ¦`îÔ·ž7Ó}ł÷ť}íDÖăuT5÷Q¤&msP·ô'`ĚżX!Ö!\‰ŁŢ9MđŰ=O«ś?pN!%*˘úÖˇŤÍć?—KŢć2ď^ąúâůwż l\\tą—ĚŹő~żĂ¶đz•vqu]Ä f3[Ă™Űýě‹4†ÜĂďüŮ ˝qÚ4T蛜ř ÓĚڹ̏Á–ąŚĎŔÁ(T{ü¬_ŤŞŻ‹ŔšÄŰ’€`9ĺ¶k(=$ńSŇăĐ«^ËńqCŠ®FŢ™˘€˘ľ>Ö)ĺpµ 8oÁ´ËX¶0ä†Ovuë˙ŮÚĎóŔţmUSĺ#Ź9¶lĎŐŢ'w­Ů[Űľ/ßoę477˛áŘ'ĂLŠŻŽüóHă¤ŇlśŐÚ­ŕŤ¦ó9§›QĚkF†YKôb÷H2%¸•ŻŐˇś)2€A (Ë4üoEń6§MfÖÂ:ąşFZJ!„^߲Ëý~ć†Öwë°%ÁaM‹˝w8ľÜz›-xe嚦°._{Đý$ôBň|GG 7†S&]§ĎPđˇ1!_H‹u˛x/äoľóf멡+ó‹®d`žĄçFĽpÖüőye­Á…g$TČ.ů§K:mˇČąz[ BI㍝ű‰Ţ·Í6éÚôű¬ěĘćikĎĹÚ‘eĽÔ– E–Ň}őŃú`…ěĐ»b‹íÍq5ÓXű°ţćén_‚ZŹ&3#ďÚąm›°Çô˛‡É»9aÎt¸ě_űzÄ_°¦˝vŕ3ó1ÚŘ›ůf^+L×ý=Éâö+Žąl÷,i6w" «ű Ş{ÂYZţŹĄľ ĺϲ|iŁäŘČöşX§S‹W[á–Ľi ’źÂ0őŇOŹxšÚrňŐ b¦ŢscßF4ź0Z/)\éP$ô&Î6ىRfĐ´J‹=­#Ł ŃdDŇ;Ou>CażFĘ2‘Ý~¦Ę| çĄ śçš.m—Ż€yśűÔU0jSgZ†Ńw˝ű*LŃĺnAQĆ{{ÖĂíćĚI©íČX€’îov]?ĺŔa!Ąhé[ˇ–B»Ę…ňˇ¬6V„·€iQŽ :‘¬r‹8ÇŞčÖŞŹťŔBsZk¬Uď)îÝ„“çK-çwY±eTC€ĽĽ)…qĐ2€5¸Ź|ŞˇÄHçguŞ@7ťŕăS‹ŮđOڬĘ/Íő)9¶ äIţŰ=âvß·M^MÜ™7űY/LňĄsçf4F>ńŐąŚЧ}ÉÔŠ8=í*i)!›ˇ>2fPĘ'Ç„kĚΊ"ÄbÝěÚ Ťł~Ż­XŽ(>sH|<č€\¨äáţ‰†ˇË-Ť#Áľz®#óÖ_?¶nő«ăűÁ§öŕŃ(/[ą™e“šđ® /,‡ é(÷öRH řE3'Ŕ«Č­×ĹŘCű*Ö˘ĄŹJŠŚeacayĽS•®Í 9ý˙áţ˙'ř"ˇ%PßŢŃĆJßŢţżřo„rendstream endobj 13 0 obj << /Type /Font /Subtype /Type1 /Encoding 355 0 R /FirstChar 11 /LastChar 122 /Widths 362 0 R /BaseFont /BQTTNQ+CMR12 /FontDescriptor 11 0 R >> endobj 11 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /BQTTNQ+CMR12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-34 -251 988 750] /Flags 4 /CharSet (/ff/fi/fl/parenleft/parenright/asterisk/comma/hyphen/period/one/four/A/B/C/D/E/F/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Z/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 12 0 R >> endobj 362 0 obj [571 544 544 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 381 381 490 0 272 326 272 0 0 490 0 0 490 0 0 0 0 0 0 0 0 0 0 0 0 734 693 707 748 666 639 0 734 353 0 761 612 897 734 762 666 0 721 544 707 734 734 1006 734 0 598 272 0 272 0 0 0 490 544 435 544 435 299 490 544 272 0 517 272 816 544 490 544 0 381 386 381 544 517 707 517 517 435 ] endobj 5 0 obj << /Length1 1794 /Length2 10992 /Length3 532 /Length 12003 /Filter /FlateDecode >> stream xÚí·UX]M—hŤ»CpŮxpîîîN°ŤĂĆ6Ü»kp‚»&xÁ=¸{đŔŮď×Ý_ŇÝ—˙už7ŚYłjŽY«V­ZJ5MqK9PääÎÂÁĘ!T–Đăxŕ`eGˇĄ•tšąŰ‚ś¤ĚÜ~~€8ŘđŽŔÁ#ŔÉ%ŔÍ…B 9{»ÚZ۸ŢJ2ü“Ä wşÚZ9”ÍÜm€Ž5,Ěš [ »7+@ÜÁ ńĎ 7€Đ čę´dEáŕXÚZ¸ĚÖ¶N(l˙É;YĽ˙¶;˙×ĐŐ "x ‘d@-ANŢK  › R 1ů˙Cę..vpP1sügůíŇ˙7s´uđţĎ Ł3Řč PY]ťţgŞ.đ?ä$@˙«ŚĽ»™­…¸“µŔţ![7[/ Ąš­»… ŔĘĚÁ řŻ8ĐÉň*@¶í_lÚşň : L˙ů<˙5¨ffëä®ĺíüďe˙ÉţsüaČî¸Úz ŮYŮŮ9 ‰ß˙úËř“v˛YÚ:A7ŔĚŐŐĚr2 Ä řŔ°u˛z€^c6V';d ˛%~++Ę?Ź“‹Ŕćlć trZą˙3ôQŽ˙ŚţÇăűwř€ÍĚ ˛ˇ¶nö‚\6 ŁŁŮź7€ÍĆŰŮčô'ÄY2dů'Ä`óş‚ţřl 'ŕż™˘ćîůgś"ĺnă ü+âc»ţ pB¶e@äÜ ;ůo†¨ą=ţ2ěđżuÉÍ `s˛ýK„2IüA&Hü!H˛ä‚ô$ő‡ I˙›x!íČü!H3˛ŇÜ‚t!˙‡ Ő˙¤şŇ‚TWţCę*R]őßÄ©®ö‡ ŐŐ˙¤şĆ‚T×üC ÔúCí?qŃůCÝ?qŃűCýäc3w5ł°ş˙·SÇĎůďř?w‹íĎńâ‡,mţ‡ K[ü›8Ř!}Zţ…RŔżđźóB Z˙…^mţBHł¶!DÂţ/„X8ü… Ç?ČŃpú ! ż˘áüB4\ţB†ë_řĎ‘ý !›îţB¬Ŕ!ÄĘă/„XyţAČ7Íë/„Xy˙…+źá˙ľÎ$$@^X ŻË;Čk1懜Kvż˙ž¨ídëĘKAŢ\vv^Čé˙'jv…Ü#î˙ú~@®Ę˙b+[ČĹ z-P–ćA‚ˇvé-áţŇES•đŚĐÖ­ *Ť=?şQCˇJG]×ô?gáběÁďQx>“¸EuůŞŹËśą$dĚ˝ěyîeů´“č]e){ď:SÝ…cv¶ĚŢśpC«Î¬ŹV¤čć^ Ş˝•ŇÚG\Ą„ę5ôhęÍĺáŐ“ÉrĐŽk ă¤ÔŔĘp©äŠXóÄJI‚[› ń·‹@jcZąuq‹ ’_ŢĂZŽëŢ)žĄyŁo<&ŚÝáÔ—Gm ”3őăŞźÍ W)r8 ®b˛g鯙ݍ2kľ8/×Ěć<¨"qUĘ~TŕE·Ťęč.¦Ô†ŞO¨Ą l]űÔecj rK>V4OjŁ(űÚé#xşŮô#®ă+ ŤšŽđŁöm6Í«§bŘRü|ôďꦀLr·„zŚ;™’ÚH«,*5šąÝpůőćĹ“ŃÔ%‰Aa›â)¬ ˇmSdiě(űžĆJéd,ȧb(FAöyÁ_éęOĐmËu•|ś4ÉĂ&E­6ýŻí1otöPkE:ě;#mc=ݨŹű,VE bŤźëé'%Đ8t#„ ”.Vh˸݋×YUYŚUâP%´&¸IVDč<{S•»fvqäY-a‘´ël#Hf'§ůď¸äłŁľčY]Ě/› šÓühEŞĘ·®Ú†6‰Î´fJG`5Uć•”ďÝŻ˝KđYfźŻ?»h$­ÄOpj“]~ŕ®m‹ďŕĚ*ď}o7YćŔ…ëB©p1±ń', \šZŞ+×DÁ‘m>¸VgĽôâ´â˛O'o˝ćÁź˛[±klu]3#†r  OŔ>e†Đ#úň/©uë›!9B_‡†·(.wŢŤűz‰ ’OÂiŇ˝?)ăÝtŤ\ë*â’ŽXJ&mZŃÄl¶ěZ°ŹđjMVÚ,fnőß?ěącŁ ů†%ŐCB“’}ť—ăŕVŹ&ô3ň›‰|S*ÓV^/k9QŢgůóŔ©¶`Sä—5wóřÎuóŚ ś¦ ŐäłůâÖ Ťöďč¤b"”kŐ¤¦ůHز>ż5KüČšíq{S6o†ŇqUĄ5.ÄŇŢ™ké ‡"ŘÓ—ľ˙˛Ţet9T¸" =YĄ–Ťű˝­,´TâJíÔţgă˛RQŐ¬çŹo°Ş ¤]ţÂŚ›ń_ŞŮHůÇľÍęąÂäŢďNv—č2k  Ć)†łMŰtĺy(1}ÄஸG˝@î×WN@D*ç¸30żija·:ĐZhA“w6 éß«0Á[&¦Ç˙Ä Ž™˙!-OAéě–yVn̄׶F$µŃ7Ęă çLE-/i+-d3ÄüĂßš•yČ2ĂÎľVpăÖ,OF4­Ťg( ëSř ”`o)e­ňy Oiî6NŹÎ“;ö,µĘÍîň×T.lE±“´ťŘ[2.F®­{űĺ»ĎiěżWűl\Ę9ęÓŹžžŢw·ţÉT)8{Iż„nČdݿߊd[#Śâ$ŕC*ÁC„ßN]÷Ş |)űYŁ6uĂúĄSŢ:›Ý挝T(ł™s™TÔ(ÝńöÎÇ'Ö%NźăN®»ĘÂřŐÉF>îŇ‘ěG=Ł›J#´ ܦƔŃöIă´Ś!‹ăç6\fwQ]ťŹ»4Q•µĄÇnâ›çvčĺb–Ëv4VPČéo=ěŠHöZ{ćĎ{ľXaŞŰˇˇěL`•L!ů‚[=EOfíĘ V°änD–¬źĐ˘Ą‰ g=‹LVF 4ö…‰„Aô)§ěĹĎbS“™ł‰ăf™¨~\ĘrÉ wLWrđ ©<»‚żg“΀Ţ@ţ·Ęúj)ƤĘŐ;<1j9N=âÇh†§Űhąßň˘ÚöqŚ*¶yć ľ™‰BÉ…Şßçľ{ŁhôŃť·oo ­Îu×ĺÄRv+8čĘźÉŘš7ú¦ŤśŻ6®¨Űš,4ńŐ$©ńţn;iµ­ŕę\KźT÷뵣ő9zäh .|ľ»Bé~ňěş¶Hq¨«‘Ú~ůj!E‘ŐĎѤÓÚ°xÇMřüTŮŐĘp‹ŐŤP_\LoQä.Śě‹‚{ íĂ–č´Ąh¤î.óÚľĄóş$šŃ«5â*?4ŹMČ4Óř1Ô muČ)"—?—XTg(e®hľEÔH©|"ę3=ćžĂ? ŠÖX×1" Xmäm@2í°ĘBů|‚ý4N,đR«/ěl^ٰYŽ2b¶Q%Jn®ß+ş–Vg};ŠŹŕáńÁnćä[gÍĘBIIôwY¦Ă†uÁĂ}Öf2áłČ&µ ?ę3r5řxf~['C˘ßNWď\uĆË–á‹ć†KeßIÝÄ MŰ{}ďƱ`ę~U›Ą¶Ś‰rP˙DĘů Ŕ‹Mx×Ç&šXFŚ'Ú\Ę«IČÖ©$’)$´y\ë{S ±aő[éwÚëťúÁŁĚŞ #ÓĎŁď>ü#ÉRcŃ ±bKgŇ-ëÎËËă´ČIDCÝ?#Ä´%¤-y¬ü;+ÓŽźą?8Uh/Dşk'ĘÎŃ„źOĚ 1źŽŕ1Ş;“ďBűŁŁ+©Ż?ŁÝ"„q"¤żŹŐ|̱C©ď·pęá*éÝä+p;y·ôľ®2µ?Í"ń©µůiÝ#M§Za·íÁÓęΉ5¦î<‰cÔ®óé™ŔééědśçúE0żTŐ€Ł©}µÔáÂ^ęýý!ÉÔ(ąß$łŁ™1S¶ž &Ś«áŤí iŢQĹyKkŞŢý ö.ݵ6ѢĘrpĐcJćѬ釦͞"C-÷_§/—’!I÷ň™’â

<űŰ!Ňp˝/ç˝öl…É×j˝ď°S µ®G¶]Yű÷Ý+ôIJ’ż—‚Đá×á(‚9‘Ŕ'î2ϱd. B{łś ‹`– {)—!‚R+/üű¸řŮíI6 wIK×˝đۢLuÖF¤§Ě\TjSńéÔ)#Ě5µßi-Öć2µ,31†UvŮëŰÎ"¨FµGU‡±6ágNĂ3¨/Rsp¤RÁVäHމ3B-¸ąÔ~`!­řćÉ{˛0ĹŮęî«ÇPÄAfpó}-'zż´N¬.&w©•Üđ0őŘ>„Ţ2óůŘżLň`8OI›`{fq©´°úŤä‡íćýŰ+g!“ËyŔ”ô˘>o ›×·.W‚~Á%<9CÇÄuAő*<ąµ(ĂţX $Yá[uÔ$»/Rf4–ËS4źń)ó|jChłtet‡ŻřnX ľ;öšduÂnW’ńݧ˘^1 unČţŇ®,@JB™íśŽ÷Sq’.›j‡Éřʉ$SJŚç•Ďý.3Ü&,ŽÜ"ćÎ[‹&qj2I۵:˙ŢňC ŘËńUĆKeäZ”k'®z|ă’Fń <™RëĎžť–«Š_ýŞ[śŇQ!a ­~1$ĄŠw)ćYU;„]čbÍ0uĚQ=˝Ľ=ĹyzŽ;Ät Ü?}6_R^c*¤B‡?!ZÁĘ˙r‘‚Ł.ČËŘj! ŘŚĽ`#íxGňę"ž|Lčść{ Á™9;f\Lb}MBĆą—¤Ř–í~ßš•Úź‹˝ĎŹ€ŹŽ€¤‡;e–Ű.‘5őÇĚ+"…şŃ(ý܆ĐB»sŁČ?ÝŤŢýçýô~áҵ(ťg6”YŠhŃA,Ľ«’Ö&Öš®›­Ůׯ餆3ń·9Q^Ať?aôôľ JĄ4¦,wéűIS·Ú JżÇŞZ×/^»%‘“Ř8ŽěßU&ľiuV›wĐI¨d;/ą ©´Çm ĂÚ—ďÍbŹNr†_YŢáSÎűŢőý ˙1Ź˝VÚg¤ŤńÔóyĄ"@ysňŘŰ-ô˝Ć-|řXŃ1‹Ľ€YĆŘî×.ëě1KzÖ§˝§NÔZB×YĄ‹˛SdÉ8}Ři?ţÚ@jň°şkO,ęLąšn!‰‘‹:â×c‰C‡ń~Đ ĺÎ"ÍĺwŻfVBD·*ł:6´Â°¦§Ľ­š4_OÔáś}”e€÷®tŇw´üBŐŇ €TĚzęęg:[S§ubX9 Ѝtô«dâÇěíŐ uQÝŰĹLź`­_t.zŽ5Jő(»LoĎăb"4hëF¶2'úYv«ZU¤4n ~’!µ˙´?»łµ±ő˝­‡C:G=Ú¨ľ;aĺÔŞŰ»ů ÷˝‘Vö+éÖÄÎş"ŃNčßîĂöŃ?^O„,h¸]ćÓ…íş©"}úĺë•n÷úµ«E{A*y™o‚kTÎO˘Ýtä/KVĎáźx>WŮ‹ąśVĄX?Ś)ŘáÔčú,E`Ç\vUCM×S˘¸Ąe9›XL¨ąŻűM’!÷şÉ‰Ű„f‡P팎×UđA™gŹÂ\Őg‘Ű;ŤÜRnŚçe9ĄJܤĚ')óÖÉ’Ń ń‹ř–·XN—¨$4”HóaE3ŞZ"§ÄAĘ÷ćVí SŃ˝ŽU™ˇ¶şqNXSęŠ$Z6¸nĺ#ĺgÂSą!L¨ÝUm„Ä•C\żA“Kò”¶ž0sÁ)"ÍŔ°µł “Á÷|Óîł§ŮUŰoä:ŢSs‘€ŃđnÖ>őP*ǦEuŞÁŽ_/ŤÂKHyň;Pâ›bŁÔˇ FŽÄw:ĂŘ8f›SRƚ̖B‡R˙˛<7őÍÜFAăkŘŐ0ߦ´:íŢŽŰxŔ»0üç±D‹,čăĺ[=1±DeŔáă2…ŻÂŢÇ~FDţ"NŰĎfÖč´pôLßH´°›Ę¬ Đ›WTj6ýsŢŠËôÇÓ”϶%ÝĽźő#BF{aűô†s±”´omŐƆô7k}çąüťmÉ®c݉A Ę`»w2(•Ť«>Žcy_čźşß;ç'“ŠăW1ĺ\¸/H5V–Dt•ůiă4ÄMŔěÜN-tÉĘ“›OcŢĹ«[ÓČ2Ń)ZáĂ^_*…Đ®§F‰PĐéV9 ż1U!5Τ€q40Ç3Tá•ëňCĄmčFÍm&á!Ćí—]ÓŚŻŰuą­D˝JNˇtĎBCYtÁ10âŮ!–¨ÍgŢĽd üýd¤űÍü~a gł0ĐJłúČL04”ĎϤžŇy-,2ş¶kűőô ˵óY3.GKůëĘlčÍAJŘĘNé­\ Í(Ďa%ÖwC_*“ŠSXÉČą*¶QšĚ“j›˝«zÔLú'ű‘ˇ-ÖtŹcAB¤şEeß2D¶˘_aÔrIP¶eV†•Ô<^”›WIígT%âËpó+ZIUńO-‰*¨«ÄË&Öv#Ž»H*¤Ô,Ť€<ýłW:ĺŹ7ţî+Eg:M\![‡Äe«1ÉŇÚŚ%9JŮoXě;QečĺÓ?.‹ačŇ(×ôFĺšJ„¸>˝öĄ†H˝ĺěżçŻ˘Îůř *h&°C«ďÇC5Ă»°ů a’ó[ř¶CúGĹËš NđxQWş#›đęý1ŇË%”NÂ)&ž¬–S4ËĘđ‡ŐHhţ1űăužRUŚ{Űó4B•€Ň‡%˝®pťË÷vĘťM<[Ű'±óÔ§’I0µĺΊł”đ ŕĹ© $1Îş˘¦9úC;, sŹŢ«ŐTčŻmŔ©Ţ–‹h&«ö‘Ź?µ0sÁ=ybXwjĹ|ŮŕľtČcóť´!UŹĹçjÜÁňć[ąvÎ<.7ł đÄ™ÜÔvRś%s@=â'’V˛ő7™mĚ‚Ą &&Oě«2°>w$s,ąĎL ‚Č™1 Ó9A…6ÜyM·DТmŰ3@ŽČ[ŇÂó˛yý$ fj?kůŧš^ç;»ŻőÚĂxňe>K‡RhK{GH +ÖŮ-D«7ÉŘź`?ţžÔŹĹˇ˙ÇF Żń}eQ“ßűÔE> ou~<Ó%íHl*x ™»ß·źDdfWĺ&ľ ^Qz¸Áďyë1“évŇhhĄŁtÄñ˛HMn¤üŕ-%‚Z€‘vF$Wőé”`cę]0/Ź?˝ŇŰ”ý¨ú…%¤cŤ/ő<ó’ú*Gą92PhűXzyşŇz!î8Ww&;$üˇËĂ+“`Eg—¶Ę™–&R A÷ጡ%[Ý“sęýÁv.ˇyP«Ďˇ…•„®Wř!P„ú˝°TŽ’>ĺdôYXn]lî?d†{7łYkOéG3ÄĂ¡śa)±ó Á¦<ŕĽEkëMÖ*-9ÓýŽmÓtjH,*Ĺć ˙w Řă[ămgq DKQýG¶.ĚîŰ䌬“é’ůmźšÇę“ů{ â_– {" Mń×őĐtBpdPf—(qŔéo&ttÖŢşx2»ĚL »|Ń@W*8¤&NEc°R‚ĺ ±˛^6Ł.Š—cVC•‚PR}cµ˙m‹ë|Ę'nók=Ď”ĐQWříH¶:µ7 ŽźD:;J;ŁŕmÄ'GŁ\Gµ:zÚŚ]Ž_Řć »™ Ö¨2íI»p3c¬Iů/p¨Č÷ŕÜo&yśmúŸPÎ^aĄߥ·‹ß3˙üšµóąĹ\Aĺŕ‚vÍ}ÓŽ:­źDĘ#ašZĄÝĎě [?ĄJ<Ć‘[ŘÜŻMaŁŃ˘ë±Ăor•ŃÁgb–z9-oP¶ĺň<_„Łř®,ďt°?yv*±Íł)7–íđ 0QM7¦ /§g_2i„CŚľ®¦vćKÍő9ěáă6ĽI® ĂÇŠRţ䲠”áhDÁ­”Ăŕ},Śť€b^?Ś,¬ô‰öU>¶3éY ¬Sh„…kĎ—xiÁzÚ”ź§R˘Ěĺ5áĄĽŠ¬3ů&ěŔ3ŠJŮZô-%•ŃÇř—břuĽd˘@=špµ™Á÷ÚsoXO<±°aGRö  {ëx»"pZÎÇ˝(Çcë ­M×mÚÜ7ÄO¸ËŐQRjÄöyzs` …»€±"Úěî%6‰.ĎÍŹˇç;†zóMV ƆO™E‘¸;ŤßEÄş·#$Ătß~ä7Ţ!x5…} î«đéËGçnS>`G°Ă؆Ą« đ kÂ$bşJŕIţ’ŔĽ.(<Çb?˙ôDB®NĐľ™ZÔPpáîÎSľóßrŢ7é3+RY™TmĘ{oßŘ]ß•ÁL4Ąp˙śđĚĹr‰XUEeÚ¦-§âÓÎSv“Îg FŐúéŕI˛„@.%ßšąt ŔĹŹrFPA"ň22˛sę:Îą8yQ6ŚM›á őT„Ň®ů+/V±rfh†Î—DҸ_ĆĹź¤y1)Ôä8śŇ8®}ŤĘ×X^¨ŻěLDlOĽg6V5v‘w !ę[eö-Ç0rŤ+uÇ’mér«-nMQ–‚{Ś‚ą?>mŹ…7yńZó¶· öß2e;+m,Ľß+íđÖJůä}&wböѧGĄ$(ANÝΑAŻ›ě —RaިęGzl…–Hň<ý8gćĎ î^őńĐÁ±‹¦…çJŻ®üXu« ¬X(č>+•­h Ý ňAcDłŞěO·Ů]Ęň„ľ7¬V«{;đXü™ľĘiVŞńŐ’©˙hÜô“r˘Ë˘Č¦Ź"üŁaŕŻhąM]“Ď®˘«ť1ŠywbëG^ÔÓMŰö­†ášńWzú›S9Ů@ÇŻ`±1VŹŐ»›?_ěô$ŞËαAÁ˛ébţPőJę€9Ĺř+ëbĺŽVđŰx»1çCýIŇ;á˝ÖW×ďČ}söNŔ=ŐÖĐşś˝.Dýó7űcę­ ÚY “řMJŢ´¤ak¬ Žßز ®‡_I Š0I:ŻÇEŚýŠ čFZ¨ó6RÂÍkĽmě6+[©f-ĺYcř(?¤Ç$KRIżŽ5×Üľ“üOSۢ\†TJhY ·¦UwÝâ ýĘ„Ćfa|8˙ĂqJZŐ®nż„ôFάxĐ ˇ–ľŻď·oä¬ÂäŮ7›6Ä™ÚóÝÓŚ2­7[˛WěúqE›Ř=?·1BšÝt€Ç¨žŐÖ·ŤŞöäĐ=ýşCřL6sg,[|9QŹŁÁëŃ‘Ť§›Úľ˘Q’W/§_Đ"üTvt5¦X kí^PY<% ŇĄ–4ĘI®*ÁéţĹȸãźp‡8H»ßúőţž.„ňMsŘÉńh%żíFXTíN5e 8ĺg654Ŕ‰ńĐ2eLŐ'¬dëźG„‚$áÖ–†}ÖdngËW 3ÄÓË@nä–©U:_ąć˝HĽÍuQN@1qČ=–”Ó×µ`nF“fř¦ú‹Gů¨\Ů[žq*řN{ÇÓóˇ^ ^"(uĘ•Př)ŮŢ˝"ŔÝQ8yÁ|ZC›P‡ŇHĺ÷KŻČĂÁť‰B{DŮĚ,@ĄŮĎY®ěXgŽáhtď§pnću)f‘× 7 é@ęćţ±…=ixĘ|ÍÖ'pÉ7sVĄĘ0Îü}i@«k @·„%%á5˙ Ćţ|Ů|ş‹ňa Í\-§Ó2ČęłOÂ]\, t;ÞэÓ~m4řŐń*~5GÝxž<śŃçäżr/-GŻÍÎRš­dé=1zA‡Ćô”XRň~SZ˙H„G‹°<ŁÔřjť —¤N&eLăčEÝ /ÇP.\´p©E­;•Dť`ęFň©řmCyťEőFs%ëňÓk$N„ČśVúĹ’*đ9ßĹf ÍcěâV芶(ť7¤‹áÉŰ!ŻÁv[ ĺNZ4]\“nlŢT†=c5 …X$6ć‡qĐü}Ń%ĎŹ-ř€đnÁgs« 5ŻnâUP4™`V¬ «˘a[UINŤd5k©±ćH´ÄäIé´5Ö řFĄŻľ·Q ©BŚŞÖg‘űq–NéCěĹÉ€‡cN˘ÔňĎ&5™{®ć7 HíXWNü»óQ $á{1GĚGĎA[ŰźCjEV$–$µií5AÄŇń»ů·P@e@€°N×PĂzm3-Úoü<Íů3ŚţlODĹş†’ŘFW8PĄŽá'.wŤÜĂÚÓb1jÜ4śvŤF™űDHŤz:Ő;¸ZdŇ…íq„ÝDËG™ł—Ĺí•~Ä‹žvć[pl 0 ‹d˛^Úű}Ça'.ż± 7b@‚Řš ¤óĽ­[UDőÉRsK?ÂoérŢ=ÍŻăqŔöżi<*|:©`ĘŕIĎ-ĹGy)úňŹE%›˙Š„Ó96ôî0Ő¸qÂj ˇ2ÉÉm§G|.EŐ±ˇJ;ĺ嬩^Š Ç튰Âé…jŞz©ů5VżŚk|QťRZLť:¤ÂŔHŽ pŚeMäí¶­#Ţę@JH]aG\vţx/áµ÷}73'zNÇT˘ą ŁqućÓ[Iݮ˜Ňt.ĄŃN4WÚl…Ř’e>r 4ÁϧĚWr>H§ˇÚŃáápŽĂşs3C¦Ź…s5Óî™űQF"Hřm+pć/âĹ!ĐýxQúŚ—|ůqF»Ľěč ľŃ'Rü&7e˝6 +Ç|ˇăł¦÷śkfâ{a&©g$'íúń*.›ĺJ6šC^—…š’Ň-:“˛4‹c´šśO<_ |žŐńQż!-jwˇÜßR,O ďĐź/Ŕ ČŹZšZ ˛ş~çJ#Ź„Í0S‹ť÷{ĺ°K­cě ¶í–P‘čçD)ŃŔŐ· C[(~!QÄŤ¨ŕďUčsö—)ńüĄ2„Tś…™»ĘŃt¶$ÍťłżŽťjVç‹ú<ßUkłwMŃĘđě˙Ž’ç6˙ľ`żš$SĚdW,ş“¬Ć¦†…f oţ})Ňö{e˛-¤ˇł°÷ň˘Ę„¬AB`E€_×Sv—ő‘ĽŢm%Dr*đôřAŃPçĘN¶ü¦ˇ‚=&ĂőĆĎűÜBU9V®äz{N& Ţ5kŚß<íOXGR'ďô†©N `ü@Ľ©;.6*'§ř!.D-;«Y<¦b“3Oaj.<,Z¨¦Ä2kâM®Ä(ďXv™óßĺß°Sq\FĄŇo1„Neß|5P}x˝ ”źďE eóŠĄç,Ž‚Rń.,íŰŁł©ű\š=RÄ(:ŻŇłŇ…hLś‚}r”Ë,;Ěo†•ĺŞhĄrř+Mţ˝Âë‰ ›áď ÉWăo&)‚őó솼bEŠbq*hťb×T+ŻŃüC(ă|żhĚńÓŮ´zšŞ<0ćc§'kUĹŔP)bY’p#űnřň‚—JY0-¦·Ď˘ôYMŽXzýË›`ĹůXgőű&ËB%‹`ŔÂĆň·Á.Ę\“°ŤĽ&¸Ťnź»WéˇlKýĐ%V|‹Â+ÂrXx}nIEžž}Ägâ‹f$]PîµsÍ őô»!9ÝřÓ%†RpÖ}óęŐŘą7ˇ+şCŹBoí`Uü` čcő•[Îń[…tß/Ařň*™ e˘*ćOÝ\5ĹŹ‹ÄÖIht9Í!Š ˛:ô'°ÓnoAÝ»e1†Y«úýŤ]ŇŔë"OŹ`ŠĘA¬ţ’‚™…ěľ7R<ŻwĂf§ýć»sˇ4ÄfѦťŘ"b…cŔJ™Ş7\îŹm%Ϥxáä‹^A±ĽO„ĺ[OŢS?T¤˝[˙Â‚Ë »|’?‘ŠÂG~XöA~¦#ŇčşűDuĐGî­Ź¦…>&80ĎV ôUÝĄćŤ3Ý©§š*(‡ŹA®._Ż'»qÚĺĘ/[‡îćăb­Ýh٤ţ÷ćF¬s^[ô[Ň †«V:žŽô3ĂçµbWŠáŁä®©‹ýř~W :vgü4;ÎŻŮą"㯠XÜű%4¨ŃťJňž/°¶,a”`]ţC#J0ĺ'q¶·&¤6ăÔoÔ¶#ßX|Ś…qLŐOńwĆ‘˝ĽéŞ*‘ĘxŃ”® zK.żPŢ/ł 8!VÄčôiÁ‘~LČk3Ź‚UjÉ2#ž{xçĺyËlańay?ë¨|x!© Fym†„Ĺľű™ßaů˛¸°»4¦çö•ő24ß‹dëÎ}ĐĎMö,Ë,U:FŚ7ľŁĂÓÇł8}őU>5&ą\č,„¨(úŚÜ‰-őÍĺ^7qŁx.WŤđ§ň¦TF«ę'…/Cͦ’O”ÇĚHsmÔý¬îřŹí]·BŢ/Y\G¬)ďń$ŰäXúDOGžü,§y…Ň2Ń1'Ŕ¶ĺI¶WZ2^Ţš_ß&ËÎÔ̩텼Đu¤¨/c“ ś3ج.:Í‘š2ž[Ő(ÔXđ`Q™Ţ—‘Čp#Í46Ďmâö :AíśgĘ—/ˇcP¶OÜż»´T“÷±—«eŢ\vëq–ÜÉÚ¸"~; $Vűë‹´aWů_şĆ jś` Ú­rg"Ý–ŔÄNŤIŁÎ8"&Ą¬_)x§ľČP™Ů}¨§Éđě XNfÚ÷x>Ęc5ąbăďh{ÎĘrk#ġZCĺK›µú%îPâm)ÚŞj}ö!‘ÜĚ´Vź^p'˛Ü•_ÎUřĂűÉ}í6“˘Śé§§űŤ"G¶ôđ1•/Ę—ÁZu™OŮ5 ˘ţ´Bż3hËŁśmÇbp‡Ú*ÜçX˝}‘Aá–†Vf{“ř¸-µÄ`ÎyxTßjěěóRPćt bşYś‡~…ś·˘öž®ć†Â»Ş#ó2~đä:UçĺĐffYdŔah©•D»źé“0_ă—úý»bÉ3hŽ|,ş»áčçýź"扇GhŠč$>á6JFÓŻ»ä ż4«#*pƎ©Iă7 ±b´óť˘řjú»=äE»w •]>Ü!=JNSÇ)ËđImgĐéă)y]¤NŠŘÄUF kşßŮ6󎩸%h  ĹuŇ0„XÜľt ML‘*Ë:(–śĽ‚ň"@×f‡ý˛,ym%7p+«d¦NĹÂŮwĆ”*9«łN ÜÇ2?[š şüőé´xȶŽJźa<˛' ăá°n×j’ůRŔ?jN^ĺŮ5Ą¦÷/u&F QŤM˛Qľ6ńSťŘĐ`KLďˇÓ¨p¨rÍs" { ®†5×Oé˝I¬5oeŘE–&Ćľ‘ôTĘ›']«cfí&±6tőÄ0aEí­I]’V\˘żÓé´:¦%]PťdFÝ^ĹެHIőe“ąxâ~…ά«spnóâ°L4yM1NV‹ ą#]zb“H.řEÍöă8úĘ ŐT ôgťŘ $¤ŁV3Ňąe(ŰN±˙üAů ü_±€…ĐĚŐähćjŹňÜŃţendstream endobj 6 0 obj << /Type /Font /Subtype /Type1 /Encoding 355 0 R /FirstChar 40 /LastChar 122 /Widths 363 0 R /BaseFont /UWIJVJ+CMBX12 /FontDescriptor 4 0 R >> endobj 4 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /UWIJVJ+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/parenleft/parenright/asterisk/comma/hyphen/period/zero/one/two/three/four/five/six/seven/eight/nine/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 5 0 R >> endobj 363 0 obj [438 438 563 0 313 375 313 0 563 563 563 563 563 563 563 563 563 563 0 0 0 0 0 0 0 850 800 813 862 738 707 884 880 419 0 881 676 1067 880 845 769 845 839 625 782 865 850 1162 850 850 0 313 0 313 0 0 0 547 625 500 625 513 344 563 625 313 0 594 313 938 625 563 625 594 459 444 438 625 594 813 594 594 500 ] endobj 7 0 obj << /Type /Pages /Count 6 /Parent 364 0 R /Kids [2 0 R 9 0 R 27 0 R 30 0 R 33 0 R 42 0 R] >> endobj 47 0 obj << /Type /Pages /Count 6 /Parent 364 0 R /Kids [45 0 R 49 0 R 52 0 R 58 0 R 61 0 R 64 0 R] >> endobj 69 0 obj << /Type /Pages /Count 6 /Parent 364 0 R /Kids [67 0 R 71 0 R 74 0 R 77 0 R 80 0 R 83 0 R] >> endobj 88 0 obj << /Type /Pages /Count 6 /Parent 364 0 R /Kids [86 0 R 90 0 R 93 0 R 96 0 R 99 0 R 102 0 R] >> endobj 107 0 obj << /Type /Pages /Count 6 /Parent 364 0 R /Kids [105 0 R 109 0 R 112 0 R 115 0 R 118 0 R 121 0 R] >> endobj 126 0 obj << /Type /Pages /Count 6 /Parent 364 0 R /Kids [124 0 R 128 0 R 131 0 R 134 0 R 137 0 R 140 0 R] >> endobj 145 0 obj << /Type /Pages /Count 6 /Parent 365 0 R /Kids [143 0 R 147 0 R 150 0 R 153 0 R 156 0 R 159 0 R] >> endobj 164 0 obj << /Type /Pages /Count 6 /Parent 365 0 R /Kids [162 0 R 166 0 R 169 0 R 172 0 R 175 0 R 178 0 R] >> endobj 183 0 obj << /Type /Pages /Count 6 /Parent 365 0 R /Kids [181 0 R 185 0 R 188 0 R 191 0 R 194 0 R 197 0 R] >> endobj 202 0 obj << /Type /Pages /Count 6 /Parent 365 0 R /Kids [200 0 R 204 0 R 207 0 R 210 0 R 213 0 R 216 0 R] >> endobj 221 0 obj << /Type /Pages /Count 6 /Parent 365 0 R /Kids [219 0 R 223 0 R 226 0 R 229 0 R 232 0 R 235 0 R] >> endobj 240 0 obj << /Type /Pages /Count 6 /Parent 365 0 R /Kids [238 0 R 242 0 R 245 0 R 248 0 R 251 0 R 254 0 R] >> endobj 259 0 obj << /Type /Pages /Count 6 /Parent 366 0 R /Kids [257 0 R 261 0 R 264 0 R 267 0 R 270 0 R 273 0 R] >> endobj 278 0 obj << /Type /Pages /Count 6 /Parent 366 0 R /Kids [276 0 R 280 0 R 283 0 R 286 0 R 289 0 R 292 0 R] >> endobj 297 0 obj << /Type /Pages /Count 6 /Parent 366 0 R /Kids [295 0 R 299 0 R 302 0 R 305 0 R 308 0 R 311 0 R] >> endobj 316 0 obj << /Type /Pages /Count 6 /Parent 366 0 R /Kids [314 0 R 318 0 R 321 0 R 324 0 R 327 0 R 330 0 R] >> endobj 335 0 obj << /Type /Pages /Count 6 /Parent 366 0 R /Kids [333 0 R 337 0 R 340 0 R 343 0 R 346 0 R 349 0 R] >> endobj 364 0 obj << /Type /Pages /Count 36 /Parent 367 0 R /Kids [7 0 R 47 0 R 69 0 R 88 0 R 107 0 R 126 0 R] >> endobj 365 0 obj << /Type /Pages /Count 36 /Parent 367 0 R /Kids [145 0 R 164 0 R 183 0 R 202 0 R 221 0 R 240 0 R] >> endobj 366 0 obj << /Type /Pages /Count 30 /Parent 367 0 R /Kids [259 0 R 278 0 R 297 0 R 316 0 R 335 0 R] >> endobj 367 0 obj << /Type /Pages /Count 102 /Kids [364 0 R 365 0 R 366 0 R] >> endobj 368 0 obj << /Type /Catalog /Pages 367 0 R /PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b) >> endobj 369 0 obj << /Producer (pdfTeX-1.10b) /Creator (TeX) /CreationDate (D:20060704165800) >> endobj xref 0 370 0000000000 65535 f 0000000306 00000 n 0000000195 00000 n 0000000009 00000 n 0000360394 00000 n 0000348113 00000 n 0000360236 00000 n 0000361132 00000 n 0000004602 00000 n 0000004490 00000 n 0000000374 00000 n 0000347373 00000 n 0000335831 00000 n 0000347214 00000 n 0000335014 00000 n 0000320646 00000 n 0000334854 00000 n 0000319738 00000 n 0000303336 00000 n 0000319579 00000 n 0000302629 00000 n 0000289248 00000 n 0000302469 00000 n 0000287817 00000 n 0000283232 00000 n 0000287658 00000 n 0000006926 00000 n 0000006812 00000 n 0000004729 00000 n 0000007782 00000 n 0000007668 00000 n 0000007043 00000 n 0000009204 00000 n 0000009090 00000 n 0000007887 00000 n 0000282915 00000 n 0000279329 00000 n 0000282757 00000 n 0000278156 00000 n 0000276752 00000 n 0000277997 00000 n 0000011554 00000 n 0000011440 00000 n 0000009332 00000 n 0000013043 00000 n 0000012928 00000 n 0000011670 00000 n 0000361239 00000 n 0000015776 00000 n 0000015661 00000 n 0000013147 00000 n 0000019037 00000 n 0000018922 00000 n 0000015892 00000 n 0000274354 00000 n 0000262000 00000 n 0000274194 00000 n 0000021623 00000 n 0000021508 00000 n 0000019165 00000 n 0000024371 00000 n 0000024256 00000 n 0000021751 00000 n 0000027461 00000 n 0000027346 00000 n 0000024499 00000 n 0000030319 00000 n 0000030204 00000 n 0000027589 00000 n 0000361349 00000 n 0000032893 00000 n 0000032778 00000 n 0000030447 00000 n 0000035602 00000 n 0000035487 00000 n 0000033009 00000 n 0000038745 00000 n 0000038630 00000 n 0000035730 00000 n 0000041258 00000 n 0000041143 00000 n 0000038873 00000 n 0000044377 00000 n 0000044262 00000 n 0000041398 00000 n 0000047218 00000 n 0000047103 00000 n 0000044505 00000 n 0000361459 00000 n 0000049953 00000 n 0000049838 00000 n 0000047346 00000 n 0000052139 00000 n 0000052024 00000 n 0000050093 00000 n 0000054562 00000 n 0000054447 00000 n 0000052267 00000 n 0000056666 00000 n 0000056550 00000 n 0000054702 00000 n 0000058811 00000 n 0000058693 00000 n 0000056794 00000 n 0000061435 00000 n 0000061316 00000 n 0000058952 00000 n 0000361570 00000 n 0000063430 00000 n 0000063311 00000 n 0000061576 00000 n 0000065114 00000 n 0000064995 00000 n 0000063571 00000 n 0000067559 00000 n 0000067440 00000 n 0000065243 00000 n 0000069243 00000 n 0000069124 00000 n 0000067700 00000 n 0000071510 00000 n 0000071391 00000 n 0000069372 00000 n 0000073719 00000 n 0000073600 00000 n 0000071651 00000 n 0000361687 00000 n 0000075935 00000 n 0000075816 00000 n 0000073860 00000 n 0000078229 00000 n 0000078110 00000 n 0000076076 00000 n 0000079867 00000 n 0000079748 00000 n 0000078370 00000 n 0000082504 00000 n 0000082385 00000 n 0000079996 00000 n 0000084404 00000 n 0000084285 00000 n 0000082645 00000 n 0000086534 00000 n 0000086415 00000 n 0000084557 00000 n 0000361804 00000 n 0000089285 00000 n 0000089166 00000 n 0000086675 00000 n 0000091761 00000 n 0000091642 00000 n 0000089438 00000 n 0000094957 00000 n 0000094838 00000 n 0000091926 00000 n 0000098002 00000 n 0000097883 00000 n 0000095110 00000 n 0000100763 00000 n 0000100644 00000 n 0000098155 00000 n 0000103961 00000 n 0000103842 00000 n 0000100881 00000 n 0000361921 00000 n 0000106734 00000 n 0000106615 00000 n 0000104126 00000 n 0000109615 00000 n 0000109496 00000 n 0000106899 00000 n 0000112483 00000 n 0000112364 00000 n 0000109780 00000 n 0000115080 00000 n 0000114961 00000 n 0000112601 00000 n 0000118052 00000 n 0000117933 00000 n 0000115233 00000 n 0000120884 00000 n 0000120765 00000 n 0000118170 00000 n 0000362038 00000 n 0000124071 00000 n 0000123952 00000 n 0000121049 00000 n 0000127147 00000 n 0000127028 00000 n 0000124236 00000 n 0000130059 00000 n 0000129940 00000 n 0000127312 00000 n 0000132276 00000 n 0000132157 00000 n 0000130224 00000 n 0000134285 00000 n 0000134166 00000 n 0000132382 00000 n 0000137226 00000 n 0000137107 00000 n 0000134426 00000 n 0000362155 00000 n 0000139982 00000 n 0000139863 00000 n 0000137391 00000 n 0000143056 00000 n 0000142937 00000 n 0000140147 00000 n 0000146009 00000 n 0000145890 00000 n 0000143221 00000 n 0000148489 00000 n 0000148370 00000 n 0000146174 00000 n 0000151346 00000 n 0000151227 00000 n 0000148607 00000 n 0000153683 00000 n 0000153564 00000 n 0000151511 00000 n 0000362272 00000 n 0000156091 00000 n 0000155972 00000 n 0000153824 00000 n 0000158598 00000 n 0000158479 00000 n 0000156197 00000 n 0000161966 00000 n 0000161847 00000 n 0000158739 00000 n 0000165129 00000 n 0000165010 00000 n 0000162131 00000 n 0000167994 00000 n 0000167875 00000 n 0000165294 00000 n 0000170697 00000 n 0000170578 00000 n 0000168159 00000 n 0000362389 00000 n 0000173906 00000 n 0000173787 00000 n 0000170862 00000 n 0000175270 00000 n 0000175151 00000 n 0000174071 00000 n 0000178254 00000 n 0000178135 00000 n 0000175376 00000 n 0000181010 00000 n 0000180891 00000 n 0000178372 00000 n 0000183281 00000 n 0000183162 00000 n 0000181175 00000 n 0000186419 00000 n 0000186300 00000 n 0000183446 00000 n 0000362506 00000 n 0000187962 00000 n 0000187843 00000 n 0000186572 00000 n 0000190822 00000 n 0000190703 00000 n 0000188080 00000 n 0000192628 00000 n 0000192509 00000 n 0000190940 00000 n 0000195794 00000 n 0000195675 00000 n 0000192781 00000 n 0000197251 00000 n 0000197132 00000 n 0000195959 00000 n 0000200088 00000 n 0000199969 00000 n 0000197357 00000 n 0000362623 00000 n 0000202039 00000 n 0000201920 00000 n 0000200206 00000 n 0000204393 00000 n 0000204274 00000 n 0000202180 00000 n 0000206300 00000 n 0000206181 00000 n 0000204499 00000 n 0000209196 00000 n 0000209077 00000 n 0000206441 00000 n 0000212299 00000 n 0000212180 00000 n 0000209361 00000 n 0000215299 00000 n 0000215180 00000 n 0000212452 00000 n 0000362740 00000 n 0000218370 00000 n 0000218251 00000 n 0000215429 00000 n 0000221310 00000 n 0000221191 00000 n 0000218535 00000 n 0000223728 00000 n 0000223609 00000 n 0000221475 00000 n 0000226685 00000 n 0000226566 00000 n 0000223893 00000 n 0000229476 00000 n 0000229357 00000 n 0000226850 00000 n 0000232374 00000 n 0000232255 00000 n 0000229641 00000 n 0000362857 00000 n 0000235119 00000 n 0000235000 00000 n 0000232539 00000 n 0000237680 00000 n 0000237561 00000 n 0000235272 00000 n 0000240187 00000 n 0000240068 00000 n 0000237833 00000 n 0000242620 00000 n 0000242501 00000 n 0000240352 00000 n 0000244242 00000 n 0000244123 00000 n 0000242785 00000 n 0000246247 00000 n 0000246128 00000 n 0000244407 00000 n 0000362974 00000 n 0000248917 00000 n 0000248798 00000 n 0000246376 00000 n 0000251815 00000 n 0000251696 00000 n 0000249058 00000 n 0000254758 00000 n 0000254639 00000 n 0000251980 00000 n 0000257969 00000 n 0000257850 00000 n 0000254923 00000 n 0000260817 00000 n 0000260698 00000 n 0000258134 00000 n 0000260982 00000 n 0000274777 00000 n 0000275095 00000 n 0000278359 00000 n 0000278383 00000 n 0000283166 00000 n 0000288076 00000 n 0000288300 00000 n 0000302984 00000 n 0000320234 00000 n 0000335445 00000 n 0000347750 00000 n 0000360810 00000 n 0000363091 00000 n 0000363204 00000 n 0000363322 00000 n 0000363432 00000 n 0000363511 00000 n 0000363621 00000 n trailer << /Size 370 /Root 368 0 R /Info 369 0 R >> startxref 363717 %%EOF libupnp-1.8.0~svn20100507/docs/dist/Makefile.am0000644000175000017500000005572311021325544015616 00000000000000 EXTRA_DIST = \ ./UPnP_Programming_Guide.pdf \ ./IXML_Programming_Guide.pdf \ ./html/upnp/icon1.gif \ ./html/upnp/icon2.gif \ ./html/upnp/toc.html \ ./html/upnp/General.html \ ./html/upnp/index.html \ ./html/upnp/Introduction.html \ ./html/upnp/License.html \ ./html/upnp/AboutCallbacks.html \ ./html/upnp/TheAPI.html \ ./html/upnp/Errorcodes.html \ ./html/upnp/UPNP_E_SUCCESS0.html \ ./html/upnp/UPNP_E_INVALID_HANDLE-100.html \ ./html/upnp/UPNP_E_INVALID_PARAM-101.html \ ./html/upnp/UPNP_E_OUTOF_HANDLE-102.html \ ./html/upnp/UPNP_E_OUTOF_MEMORY-104.html \ ./html/upnp/UPNP_E_INIT-105.html \ ./html/upnp/UPNP_E_INVALID_DESC-107.html \ ./html/upnp/UPNP_E_INVALID_URL-108.html \ ./html/upnp/UPNP_E_INVALID_SERVICE-111.html \ ./html/upnp/UPNP_E_BAD_RESPONSE-113.html \ ./html/upnp/UPNP_E_INVALID_ACTION-115.html \ ./html/upnp/UPNP_E_FINISH-116.html \ ./html/upnp/UPNP_E_INIT_FAILED-117.html \ ./html/upnp/UPNP_E_BAD_HTTPMSG-119.html \ ./html/upnp/UPNP_E_ALREADY_REGISTERED-120.html \ ./html/upnp/UPNP_E_NETWORK_ERROR-200.html \ ./html/upnp/UPNP_E_SOCKET_WRITE-201.html \ ./html/upnp/UPNP_E_SOCKET_READ-202.html \ ./html/upnp/UPNP_E_SOCKET_BIND-203.html \ ./html/upnp/UPNP_E_SOCKET_CONNECT-204.html \ ./html/upnp/UPNP_E_OUTOF_SOCKET-205.html \ ./html/upnp/UPNP_E_LISTEN-206.html \ ./html/upnp/UPNP_E_TIMEDOUT-207.html \ ./html/upnp/UPNP_E_SOCKET_ERROR-208.html \ ./html/upnp/UPNP_E_CANCELED-210.html \ ./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCEPTED-302.html \ ./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \ ./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \ ./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \ ./html/upnp/UPNP_E_FILE_READ_ERROR-503.html \ ./html/upnp/UPNP_E_EXT_NOT_XML-504.html \ ./html/upnp/UPNP_E_NOT_FOUND-507.html \ ./html/upnp/UPNP_E_INTERNAL_ERROR-911.html \ ./html/upnp/ConstantsStructuresandTypes.html \ ./html/upnp/UpnpClient_Handle.html \ ./html/upnp/UpnpDevice_Handle.html \ ./html/upnp/UPnP_EventType.html \ ./html/upnp/UPNP_CONTROL_ACTION_REQUEST.html \ ./html/upnp/UPNP_CONTROL_ACTION_COMPLETE.html \ ./html/upnp/UPNP_CONTROL_GET_VAR_REQUEST.html \ ./html/upnp/UPNP_CONTROL_GET_VAR_COMPLETE.html \ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_ALIVE.html \ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE.html \ ./html/upnp/UPNP_DISCOVERY_SEARCH_RESULT.html \ ./html/upnp/UPNP_DISCOVERY_SEARCH_TIMEOUT.html \ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_REQUEST.html \ ./html/upnp/UPNP_EVENT_RECEIVED.html \ ./html/upnp/UPNP_EVENT_RENEWAL_COMPLETE.html \ ./html/upnp/UPNP_EVENT_SUBSCRIBE_COMPLETE.html \ ./html/upnp/UPNP_EVENT_UNSUBSCRIBE_COMPLETE.html \ ./html/upnp/UPNP_EVENT_AUTORENEWAL_FAILED.html \ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_EXPIRED.html \ ./html/upnp/Upnp_SID44.html \ ./html/upnp/Upnp_SType.html \ ./html/upnp/UPNP_S_ALL.html \ ./html/upnp/UPNP_S_ROOT.html \ ./html/upnp/UPNP_S_DEVICE.html \ ./html/upnp/UPNP_S_SERVICE.html \ ./html/upnp/Upnp_DescType.html \ ./html/upnp/UPNPREG_URL_DESC.html \ ./html/upnp/UPNPREG_FILENAME_DESC.html \ ./html/upnp/UPNPREG_BUF_DESC.html \ ./html/upnp/Upnp_Action_Request.html \ ./html/upnp/Upnp_State_Var_Request.html \ ./html/upnp/Upnp_State_Var_Complete.html \ ./html/upnp/Upnp_Event.html \ ./html/upnp/Upnp_Discovery.html \ ./html/upnp/Upnp_Event_Subscribe.html \ ./html/upnp/Upnp_Subscription_Request.html \ ./html/upnp/UpnpVirtualDirCallbacks.html \ ./html/upnp/Upnp_FunPtr.html \ ./html/upnp/InitializationandRegistration.html \ ./html/upnp/UpnpInit.html \ ./html/upnp/UpnpFinish.html \ ./html/upnp/UpnpGetServerPort.html \ ./html/upnp/UpnpGetServerIpAddress.html \ ./html/upnp/UpnpRegisterClient.html \ ./html/upnp/UpnpRegisterRootDevice.html \ ./html/upnp/UpnpRegisterRootDevice2.html \ ./html/upnp/UpnpUnRegisterClient.html \ ./html/upnp/UpnpUnRegisterRootDevice.html \ ./html/upnp/UpnpSetContentLength.html \ ./html/upnp/UpnpSetMaxContentLength.html \ ./html/upnp/Discovery.html \ ./html/upnp/UpnpSearchAsync.html \ ./html/upnp/UpnpSendAdvertisement.html \ ./html/upnp/Control.html \ ./html/upnp/UpnpGetServiceVarStatus.html \ ./html/upnp/UpnpGetServiceVarStatusAsync.html \ ./html/upnp/UpnpSendAction.html \ ./html/upnp/UpnpSendActionEx.html \ ./html/upnp/UpnpSendActionAsync.html \ ./html/upnp/UpnpSendActionExAsync.html \ ./html/upnp/Eventing.html \ ./html/upnp/UpnpAcceptSubscription.html \ ./html/upnp/UpnpAcceptSubscriptionExt.html \ ./html/upnp/UpnpNotify.html \ ./html/upnp/UpnpNotifyExt.html \ ./html/upnp/UpnpRenewSubscription.html \ ./html/upnp/UpnpRenewSubscriptionAsync.html \ ./html/upnp/UpnpSetMaxSubscriptions.html \ ./html/upnp/UpnpSetMaxSubscriptionTimeOut.html \ ./html/upnp/UpnpSubscribe.html \ ./html/upnp/UpnpSubscribeAsync.html \ ./html/upnp/UpnpUnSubscribe.html \ ./html/upnp/UpnpUnSubscribeAsync.html \ ./html/upnp/ControlPointHTTPAPI.html \ ./html/upnp/UpnpDownloadUrlItem.html \ ./html/upnp/UpnpOpenHttpGet.html \ ./html/upnp/UpnpOpenHttpGetProxy.html \ ./html/upnp/UpnpOpenHttpGetEx.html \ ./html/upnp/UpnpReadHttpGet.html \ ./html/upnp/UpnpHttpGetProgress.html \ ./html/upnp/UpnpCancelHttpGet.html \ ./html/upnp/UpnpCloseHttpGet.html \ ./html/upnp/UpnpOpenHttpPost.html \ ./html/upnp/UpnpWriteHttpPost.html \ ./html/upnp/UpnpCloseHttpPost.html \ ./html/upnp/UpnpDownloadXmlDoc.html \ ./html/upnp/WebServerAPI.html \ ./html/upnp/UpnpSetWebServerRootDir.html \ ./html/upnp/UpnpSetVirtualDirCallbacks.html \ ./html/upnp/UpnpEnableWebserver.html \ ./html/upnp/UpnpIsWebserverEnabled.html \ ./html/upnp/UpnpAddVirtualDir.html \ ./html/upnp/UpnpRemoveVirtualDir.html \ ./html/upnp/UpnpRemoveAllVirtualDirs.html \ ./html/upnp/OptionalToolAPIs.html \ ./html/upnp/UpnpResolveURL.html \ ./html/upnp/UpnpMakeAction.html \ ./html/upnp/UpnpAddToAction.html \ ./html/upnp/UpnpMakeActionResponse.html \ ./html/upnp/UpnpAddToActionResponse.html \ ./html/upnp/UpnpAddToPropertySet.html \ ./html/upnp/UpnpCreatePropertySet.html \ ./html/upnp/UpnpGetErrorMessage.html \ ./html/ixml/icon1.gif \ ./html/ixml/icon2.gif \ ./html/ixml/toc.html \ ./html/ixml/General.html \ ./html/ixml/index.html \ ./html/ixml/Introduction.html \ ./html/ixml/License.html \ ./html/ixml/DOMInterfaces.html \ ./html/ixml/InterfaceitNode.html \ ./html/ixml/ixmlNode_getNodeName.html \ ./html/ixml/ixmlNode_getNodeValue.html \ ./html/ixml/ixmlNode_setNodeValue.html \ ./html/ixml/ixmlNode_getNodeType.html \ ./html/ixml/ixmlNode_getParentNode.html \ ./html/ixml/ixmlNode_getChildNodes.html \ ./html/ixml/ixmlNode_getFirstChild.html \ ./html/ixml/ixmlNode_getLastChild.html \ ./html/ixml/ixmlNode_getPreviousSibling.html \ ./html/ixml/ixmlNode_getNextSibling.html \ ./html/ixml/ixmlNode_getAttributes.html \ ./html/ixml/ixmlNode_getOwnerDocument.html \ ./html/ixml/ixmlNode_getNamespaceURI.html \ ./html/ixml/ixmlNode_getPrefix.html \ ./html/ixml/ixmlNode_getLocalName.html \ ./html/ixml/ixmlNode_insertBefore.html \ ./html/ixml/ixmlNode_replaceChild.html \ ./html/ixml/ixmlNode_removeChild.html \ ./html/ixml/ixmlNode_appendChild.html \ ./html/ixml/ixmlNode_hasChildNodes.html \ ./html/ixml/ixmlNode_cloneNode.html \ ./html/ixml/ixmlNode_hasAttributes.html \ ./html/ixml/ixmlNode_free.html \ ./html/ixml/InterfaceitAttr.html \ ./html/ixml/ixmlAttr_free.html \ ./html/ixml/InterfaceitCDATASection.html \ ./html/ixml/ixmlCDATASection_init.html \ ./html/ixml/ixmlCDATASection_free.html \ ./html/ixml/InterfaceitDocument.html \ ./html/ixml/ixmlDocument_init.html \ ./html/ixml/ixmlDocument_createDocumentEx.html \ ./html/ixml/ixmlDocument_createDocument.html \ ./html/ixml/ixmlDocument_createElementEx.html \ ./html/ixml/ixmlDocument_createElement.html \ ./html/ixml/ixmlDocument_createTextNodeEx.html \ ./html/ixml/ixmlDocument_createTextNode.html \ ./html/ixml/ixmlDocument_createCDATASectionEx.html \ ./html/ixml/ixmlDocument_createCDATASection.html \ ./html/ixml/ixmlDocument_createAttribute.html \ ./html/ixml/ixmlDocument_createAttributeEx.html \ ./html/ixml/ixmlDocument_getElementsByTagName.html \ ./html/ixml/ixmlDocument_createElementNSEx.html \ ./html/ixml/ixmlDocument_createElementNS.html \ ./html/ixml/ixmlDocument_createAttributeNSEx.html \ ./html/ixml/ixmlDocument_createAttributeNS.html \ ./html/ixml/ixmlDocument_getElementsByTagNameNS.html \ ./html/ixml/ixmlDocument_getElementById.html \ ./html/ixml/ixmlDocument_free.html \ ./html/ixml/ixmlDocument_importNode.html \ ./html/ixml/InterfaceitElement.html \ ./html/ixml/ixmlElement_init.html \ ./html/ixml/ixmlElement_getTagName.html \ ./html/ixml/ixmlElement_getAttribute.html \ ./html/ixml/ixmlElement_setAttribute.html \ ./html/ixml/ixmlElement_removeAttribute.html \ ./html/ixml/ixmlElement_getAttributeNode.html \ ./html/ixml/ixmlElement_setAttributeNode.html \ ./html/ixml/ixmlElement_removeAttributeNode.html \ ./html/ixml/ixmlElement_getElementsByTagName.html \ ./html/ixml/ixmlElement_getAttributeNS.html \ ./html/ixml/ixmlElement_setAttributeNS.html \ ./html/ixml/ixmlElement_removeAttributeNS.html \ ./html/ixml/ixmlElement_getAttributeNodeNS.html \ ./html/ixml/ixmlElement_setAttributeNodeNS.html \ ./html/ixml/ixmlElement_getElementsByTagNameNS.html \ ./html/ixml/ixmlElement_hasAttribute.html \ ./html/ixml/ixmlElement_hasAttributeNS.html \ ./html/ixml/ixmlElement_free.html \ ./html/ixml/InterfaceitNamedNodeMap.html \ ./html/ixml/ixmlNamedNodeMap_getLength.html \ ./html/ixml/ixmlNamedNodeMap_getNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_setNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_removeNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_item.html \ ./html/ixml/ixmlNamedNodeMap_getNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_setNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_removeNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_free.html \ ./html/ixml/InterfaceitNodeList.html \ ./html/ixml/ixmlNodeList_item.html \ ./html/ixml/ixmlNodeList_length.html \ ./html/ixml/ixmlNodeList_free.html \ ./html/ixml/IXMLAPI.html \ ./html/ixml/ixmlPrintDocument.html \ ./html/ixml/ixmlPrintNode.html \ ./html/ixml/ixmlDocumenttoString.html \ ./html/ixml/ixmlNodetoString.html \ ./html/ixml/ixmlRelaxParser.html \ ./html/ixml/ixmlParseBuffer.html \ ./html/ixml/ixmlParseBufferEx.html \ ./html/ixml/ixmlLoadDocument.html \ ./html/ixml/ixmlLoadDocumentEx.html \ ./html/ixml/ixmlCloneDOMString.html \ ./html/ixml/ixmlFreeDOMString.html if WITH_DOCUMENTATION docsdir = @docdir@ nobase_docs_DATA = \ ./UPnP_Programming_Guide.pdf \ ./IXML_Programming_Guide.pdf \ ./html/upnp/icon1.gif \ ./html/upnp/icon2.gif \ ./html/upnp/toc.html \ ./html/upnp/General.html \ ./html/upnp/index.html \ ./html/upnp/Introduction.html \ ./html/upnp/License.html \ ./html/upnp/AboutCallbacks.html \ ./html/upnp/TheAPI.html \ ./html/upnp/Errorcodes.html \ ./html/upnp/UPNP_E_SUCCESS0.html \ ./html/upnp/UPNP_E_INVALID_HANDLE-100.html \ ./html/upnp/UPNP_E_INVALID_PARAM-101.html \ ./html/upnp/UPNP_E_OUTOF_HANDLE-102.html \ ./html/upnp/UPNP_E_OUTOF_MEMORY-104.html \ ./html/upnp/UPNP_E_INIT-105.html \ ./html/upnp/UPNP_E_INVALID_DESC-107.html \ ./html/upnp/UPNP_E_INVALID_URL-108.html \ ./html/upnp/UPNP_E_INVALID_SERVICE-111.html \ ./html/upnp/UPNP_E_BAD_RESPONSE-113.html \ ./html/upnp/UPNP_E_INVALID_ACTION-115.html \ ./html/upnp/UPNP_E_FINISH-116.html \ ./html/upnp/UPNP_E_INIT_FAILED-117.html \ ./html/upnp/UPNP_E_BAD_HTTPMSG-119.html \ ./html/upnp/UPNP_E_ALREADY_REGISTERED-120.html \ ./html/upnp/UPNP_E_NETWORK_ERROR-200.html \ ./html/upnp/UPNP_E_SOCKET_WRITE-201.html \ ./html/upnp/UPNP_E_SOCKET_READ-202.html \ ./html/upnp/UPNP_E_SOCKET_BIND-203.html \ ./html/upnp/UPNP_E_SOCKET_CONNECT-204.html \ ./html/upnp/UPNP_E_OUTOF_SOCKET-205.html \ ./html/upnp/UPNP_E_LISTEN-206.html \ ./html/upnp/UPNP_E_TIMEDOUT-207.html \ ./html/upnp/UPNP_E_SOCKET_ERROR-208.html \ ./html/upnp/UPNP_E_CANCELED-210.html \ ./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCEPTED-302.html \ ./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \ ./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \ ./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \ ./html/upnp/UPNP_E_FILE_READ_ERROR-503.html \ ./html/upnp/UPNP_E_EXT_NOT_XML-504.html \ ./html/upnp/UPNP_E_NOT_FOUND-507.html \ ./html/upnp/UPNP_E_INTERNAL_ERROR-911.html \ ./html/upnp/ConstantsStructuresandTypes.html \ ./html/upnp/UpnpClient_Handle.html \ ./html/upnp/UpnpDevice_Handle.html \ ./html/upnp/UPnP_EventType.html \ ./html/upnp/UPNP_CONTROL_ACTION_REQUEST.html \ ./html/upnp/UPNP_CONTROL_ACTION_COMPLETE.html \ ./html/upnp/UPNP_CONTROL_GET_VAR_REQUEST.html \ ./html/upnp/UPNP_CONTROL_GET_VAR_COMPLETE.html \ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_ALIVE.html \ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE.html \ ./html/upnp/UPNP_DISCOVERY_SEARCH_RESULT.html \ ./html/upnp/UPNP_DISCOVERY_SEARCH_TIMEOUT.html \ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_REQUEST.html \ ./html/upnp/UPNP_EVENT_RECEIVED.html \ ./html/upnp/UPNP_EVENT_RENEWAL_COMPLETE.html \ ./html/upnp/UPNP_EVENT_SUBSCRIBE_COMPLETE.html \ ./html/upnp/UPNP_EVENT_UNSUBSCRIBE_COMPLETE.html \ ./html/upnp/UPNP_EVENT_AUTORENEWAL_FAILED.html \ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_EXPIRED.html \ ./html/upnp/Upnp_SID44.html \ ./html/upnp/Upnp_SType.html \ ./html/upnp/UPNP_S_ALL.html \ ./html/upnp/UPNP_S_ROOT.html \ ./html/upnp/UPNP_S_DEVICE.html \ ./html/upnp/UPNP_S_SERVICE.html \ ./html/upnp/Upnp_DescType.html \ ./html/upnp/UPNPREG_URL_DESC.html \ ./html/upnp/UPNPREG_FILENAME_DESC.html \ ./html/upnp/UPNPREG_BUF_DESC.html \ ./html/upnp/Upnp_Action_Request.html \ ./html/upnp/Upnp_State_Var_Request.html \ ./html/upnp/Upnp_State_Var_Complete.html \ ./html/upnp/Upnp_Event.html \ ./html/upnp/Upnp_Discovery.html \ ./html/upnp/Upnp_Event_Subscribe.html \ ./html/upnp/Upnp_Subscription_Request.html \ ./html/upnp/UpnpVirtualDirCallbacks.html \ ./html/upnp/Upnp_FunPtr.html \ ./html/upnp/InitializationandRegistration.html \ ./html/upnp/UpnpInit.html \ ./html/upnp/UpnpFinish.html \ ./html/upnp/UpnpGetServerPort.html \ ./html/upnp/UpnpGetServerIpAddress.html \ ./html/upnp/UpnpRegisterClient.html \ ./html/upnp/UpnpRegisterRootDevice.html \ ./html/upnp/UpnpRegisterRootDevice2.html \ ./html/upnp/UpnpUnRegisterClient.html \ ./html/upnp/UpnpUnRegisterRootDevice.html \ ./html/upnp/UpnpSetContentLength.html \ ./html/upnp/UpnpSetMaxContentLength.html \ ./html/upnp/Discovery.html \ ./html/upnp/UpnpSearchAsync.html \ ./html/upnp/UpnpSendAdvertisement.html \ ./html/upnp/Control.html \ ./html/upnp/UpnpGetServiceVarStatus.html \ ./html/upnp/UpnpGetServiceVarStatusAsync.html \ ./html/upnp/UpnpSendAction.html \ ./html/upnp/UpnpSendActionEx.html \ ./html/upnp/UpnpSendActionAsync.html \ ./html/upnp/UpnpSendActionExAsync.html \ ./html/upnp/Eventing.html \ ./html/upnp/UpnpAcceptSubscription.html \ ./html/upnp/UpnpAcceptSubscriptionExt.html \ ./html/upnp/UpnpNotify.html \ ./html/upnp/UpnpNotifyExt.html \ ./html/upnp/UpnpRenewSubscription.html \ ./html/upnp/UpnpRenewSubscriptionAsync.html \ ./html/upnp/UpnpSetMaxSubscriptions.html \ ./html/upnp/UpnpSetMaxSubscriptionTimeOut.html \ ./html/upnp/UpnpSubscribe.html \ ./html/upnp/UpnpSubscribeAsync.html \ ./html/upnp/UpnpUnSubscribe.html \ ./html/upnp/UpnpUnSubscribeAsync.html \ ./html/upnp/ControlPointHTTPAPI.html \ ./html/upnp/UpnpDownloadUrlItem.html \ ./html/upnp/UpnpOpenHttpGet.html \ ./html/upnp/UpnpOpenHttpGetProxy.html \ ./html/upnp/UpnpOpenHttpGetEx.html \ ./html/upnp/UpnpReadHttpGet.html \ ./html/upnp/UpnpHttpGetProgress.html \ ./html/upnp/UpnpCancelHttpGet.html \ ./html/upnp/UpnpCloseHttpGet.html \ ./html/upnp/UpnpOpenHttpPost.html \ ./html/upnp/UpnpWriteHttpPost.html \ ./html/upnp/UpnpCloseHttpPost.html \ ./html/upnp/UpnpDownloadXmlDoc.html \ ./html/upnp/WebServerAPI.html \ ./html/upnp/UpnpSetWebServerRootDir.html \ ./html/upnp/UpnpSetVirtualDirCallbacks.html \ ./html/upnp/UpnpEnableWebserver.html \ ./html/upnp/UpnpIsWebserverEnabled.html \ ./html/upnp/UpnpAddVirtualDir.html \ ./html/upnp/UpnpRemoveVirtualDir.html \ ./html/upnp/UpnpRemoveAllVirtualDirs.html \ ./html/upnp/OptionalToolAPIs.html \ ./html/upnp/UpnpResolveURL.html \ ./html/upnp/UpnpMakeAction.html \ ./html/upnp/UpnpAddToAction.html \ ./html/upnp/UpnpMakeActionResponse.html \ ./html/upnp/UpnpAddToActionResponse.html \ ./html/upnp/UpnpAddToPropertySet.html \ ./html/upnp/UpnpCreatePropertySet.html \ ./html/upnp/UpnpGetErrorMessage.html \ ./html/ixml/icon1.gif \ ./html/ixml/icon2.gif \ ./html/ixml/toc.html \ ./html/ixml/General.html \ ./html/ixml/index.html \ ./html/ixml/Introduction.html \ ./html/ixml/License.html \ ./html/ixml/DOMInterfaces.html \ ./html/ixml/InterfaceitNode.html \ ./html/ixml/ixmlNode_getNodeName.html \ ./html/ixml/ixmlNode_getNodeValue.html \ ./html/ixml/ixmlNode_setNodeValue.html \ ./html/ixml/ixmlNode_getNodeType.html \ ./html/ixml/ixmlNode_getParentNode.html \ ./html/ixml/ixmlNode_getChildNodes.html \ ./html/ixml/ixmlNode_getFirstChild.html \ ./html/ixml/ixmlNode_getLastChild.html \ ./html/ixml/ixmlNode_getPreviousSibling.html \ ./html/ixml/ixmlNode_getNextSibling.html \ ./html/ixml/ixmlNode_getAttributes.html \ ./html/ixml/ixmlNode_getOwnerDocument.html \ ./html/ixml/ixmlNode_getNamespaceURI.html \ ./html/ixml/ixmlNode_getPrefix.html \ ./html/ixml/ixmlNode_getLocalName.html \ ./html/ixml/ixmlNode_insertBefore.html \ ./html/ixml/ixmlNode_replaceChild.html \ ./html/ixml/ixmlNode_removeChild.html \ ./html/ixml/ixmlNode_appendChild.html \ ./html/ixml/ixmlNode_hasChildNodes.html \ ./html/ixml/ixmlNode_cloneNode.html \ ./html/ixml/ixmlNode_hasAttributes.html \ ./html/ixml/ixmlNode_free.html \ ./html/ixml/InterfaceitAttr.html \ ./html/ixml/ixmlAttr_free.html \ ./html/ixml/InterfaceitCDATASection.html \ ./html/ixml/ixmlCDATASection_init.html \ ./html/ixml/ixmlCDATASection_free.html \ ./html/ixml/InterfaceitDocument.html \ ./html/ixml/ixmlDocument_init.html \ ./html/ixml/ixmlDocument_createDocumentEx.html \ ./html/ixml/ixmlDocument_createDocument.html \ ./html/ixml/ixmlDocument_createElementEx.html \ ./html/ixml/ixmlDocument_createElement.html \ ./html/ixml/ixmlDocument_createTextNodeEx.html \ ./html/ixml/ixmlDocument_createTextNode.html \ ./html/ixml/ixmlDocument_createCDATASectionEx.html \ ./html/ixml/ixmlDocument_createCDATASection.html \ ./html/ixml/ixmlDocument_createAttribute.html \ ./html/ixml/ixmlDocument_createAttributeEx.html \ ./html/ixml/ixmlDocument_getElementsByTagName.html \ ./html/ixml/ixmlDocument_createElementNSEx.html \ ./html/ixml/ixmlDocument_createElementNS.html \ ./html/ixml/ixmlDocument_createAttributeNSEx.html \ ./html/ixml/ixmlDocument_createAttributeNS.html \ ./html/ixml/ixmlDocument_getElementsByTagNameNS.html \ ./html/ixml/ixmlDocument_getElementById.html \ ./html/ixml/ixmlDocument_free.html \ ./html/ixml/ixmlDocument_importNode.html \ ./html/ixml/InterfaceitElement.html \ ./html/ixml/ixmlElement_init.html \ ./html/ixml/ixmlElement_getTagName.html \ ./html/ixml/ixmlElement_getAttribute.html \ ./html/ixml/ixmlElement_setAttribute.html \ ./html/ixml/ixmlElement_removeAttribute.html \ ./html/ixml/ixmlElement_getAttributeNode.html \ ./html/ixml/ixmlElement_setAttributeNode.html \ ./html/ixml/ixmlElement_removeAttributeNode.html \ ./html/ixml/ixmlElement_getElementsByTagName.html \ ./html/ixml/ixmlElement_getAttributeNS.html \ ./html/ixml/ixmlElement_setAttributeNS.html \ ./html/ixml/ixmlElement_removeAttributeNS.html \ ./html/ixml/ixmlElement_getAttributeNodeNS.html \ ./html/ixml/ixmlElement_setAttributeNodeNS.html \ ./html/ixml/ixmlElement_getElementsByTagNameNS.html \ ./html/ixml/ixmlElement_hasAttribute.html \ ./html/ixml/ixmlElement_hasAttributeNS.html \ ./html/ixml/ixmlElement_free.html \ ./html/ixml/InterfaceitNamedNodeMap.html \ ./html/ixml/ixmlNamedNodeMap_getLength.html \ ./html/ixml/ixmlNamedNodeMap_getNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_setNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_removeNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_item.html \ ./html/ixml/ixmlNamedNodeMap_getNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_setNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_removeNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_free.html \ ./html/ixml/InterfaceitNodeList.html \ ./html/ixml/ixmlNodeList_item.html \ ./html/ixml/ixmlNodeList_length.html \ ./html/ixml/ixmlNodeList_free.html \ ./html/ixml/IXMLAPI.html \ ./html/ixml/ixmlPrintDocument.html \ ./html/ixml/ixmlPrintNode.html \ ./html/ixml/ixmlDocumenttoString.html \ ./html/ixml/ixmlNodetoString.html \ ./html/ixml/ixmlRelaxParser.html \ ./html/ixml/ixmlParseBuffer.html \ ./html/ixml/ixmlParseBufferEx.html \ ./html/ixml/ixmlLoadDocument.html \ ./html/ixml/ixmlLoadDocumentEx.html \ ./html/ixml/ixmlCloneDOMString.html \ ./html/ixml/ixmlFreeDOMString.html endif libupnp-1.8.0~svn20100507/docs/dist/Makefile.in0000644000175000017500000011630111360640113015613 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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 = docs/dist DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/autoconfig.h \ $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = 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 = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(docsdir)" nobase_docsDATA_INSTALL = $(install_sh_DATA) DATA = $(nobase_docs_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = \ ./UPnP_Programming_Guide.pdf \ ./IXML_Programming_Guide.pdf \ ./html/upnp/icon1.gif \ ./html/upnp/icon2.gif \ ./html/upnp/toc.html \ ./html/upnp/General.html \ ./html/upnp/index.html \ ./html/upnp/Introduction.html \ ./html/upnp/License.html \ ./html/upnp/AboutCallbacks.html \ ./html/upnp/TheAPI.html \ ./html/upnp/Errorcodes.html \ ./html/upnp/UPNP_E_SUCCESS0.html \ ./html/upnp/UPNP_E_INVALID_HANDLE-100.html \ ./html/upnp/UPNP_E_INVALID_PARAM-101.html \ ./html/upnp/UPNP_E_OUTOF_HANDLE-102.html \ ./html/upnp/UPNP_E_OUTOF_MEMORY-104.html \ ./html/upnp/UPNP_E_INIT-105.html \ ./html/upnp/UPNP_E_INVALID_DESC-107.html \ ./html/upnp/UPNP_E_INVALID_URL-108.html \ ./html/upnp/UPNP_E_INVALID_SERVICE-111.html \ ./html/upnp/UPNP_E_BAD_RESPONSE-113.html \ ./html/upnp/UPNP_E_INVALID_ACTION-115.html \ ./html/upnp/UPNP_E_FINISH-116.html \ ./html/upnp/UPNP_E_INIT_FAILED-117.html \ ./html/upnp/UPNP_E_BAD_HTTPMSG-119.html \ ./html/upnp/UPNP_E_ALREADY_REGISTERED-120.html \ ./html/upnp/UPNP_E_NETWORK_ERROR-200.html \ ./html/upnp/UPNP_E_SOCKET_WRITE-201.html \ ./html/upnp/UPNP_E_SOCKET_READ-202.html \ ./html/upnp/UPNP_E_SOCKET_BIND-203.html \ ./html/upnp/UPNP_E_SOCKET_CONNECT-204.html \ ./html/upnp/UPNP_E_OUTOF_SOCKET-205.html \ ./html/upnp/UPNP_E_LISTEN-206.html \ ./html/upnp/UPNP_E_TIMEDOUT-207.html \ ./html/upnp/UPNP_E_SOCKET_ERROR-208.html \ ./html/upnp/UPNP_E_CANCELED-210.html \ ./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCEPTED-302.html \ ./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \ ./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \ ./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \ ./html/upnp/UPNP_E_FILE_READ_ERROR-503.html \ ./html/upnp/UPNP_E_EXT_NOT_XML-504.html \ ./html/upnp/UPNP_E_NOT_FOUND-507.html \ ./html/upnp/UPNP_E_INTERNAL_ERROR-911.html \ ./html/upnp/ConstantsStructuresandTypes.html \ ./html/upnp/UpnpClient_Handle.html \ ./html/upnp/UpnpDevice_Handle.html \ ./html/upnp/UPnP_EventType.html \ ./html/upnp/UPNP_CONTROL_ACTION_REQUEST.html \ ./html/upnp/UPNP_CONTROL_ACTION_COMPLETE.html \ ./html/upnp/UPNP_CONTROL_GET_VAR_REQUEST.html \ ./html/upnp/UPNP_CONTROL_GET_VAR_COMPLETE.html \ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_ALIVE.html \ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE.html \ ./html/upnp/UPNP_DISCOVERY_SEARCH_RESULT.html \ ./html/upnp/UPNP_DISCOVERY_SEARCH_TIMEOUT.html \ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_REQUEST.html \ ./html/upnp/UPNP_EVENT_RECEIVED.html \ ./html/upnp/UPNP_EVENT_RENEWAL_COMPLETE.html \ ./html/upnp/UPNP_EVENT_SUBSCRIBE_COMPLETE.html \ ./html/upnp/UPNP_EVENT_UNSUBSCRIBE_COMPLETE.html \ ./html/upnp/UPNP_EVENT_AUTORENEWAL_FAILED.html \ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_EXPIRED.html \ ./html/upnp/Upnp_SID44.html \ ./html/upnp/Upnp_SType.html \ ./html/upnp/UPNP_S_ALL.html \ ./html/upnp/UPNP_S_ROOT.html \ ./html/upnp/UPNP_S_DEVICE.html \ ./html/upnp/UPNP_S_SERVICE.html \ ./html/upnp/Upnp_DescType.html \ ./html/upnp/UPNPREG_URL_DESC.html \ ./html/upnp/UPNPREG_FILENAME_DESC.html \ ./html/upnp/UPNPREG_BUF_DESC.html \ ./html/upnp/Upnp_Action_Request.html \ ./html/upnp/Upnp_State_Var_Request.html \ ./html/upnp/Upnp_State_Var_Complete.html \ ./html/upnp/Upnp_Event.html \ ./html/upnp/Upnp_Discovery.html \ ./html/upnp/Upnp_Event_Subscribe.html \ ./html/upnp/Upnp_Subscription_Request.html \ ./html/upnp/UpnpVirtualDirCallbacks.html \ ./html/upnp/Upnp_FunPtr.html \ ./html/upnp/InitializationandRegistration.html \ ./html/upnp/UpnpInit.html \ ./html/upnp/UpnpFinish.html \ ./html/upnp/UpnpGetServerPort.html \ ./html/upnp/UpnpGetServerIpAddress.html \ ./html/upnp/UpnpRegisterClient.html \ ./html/upnp/UpnpRegisterRootDevice.html \ ./html/upnp/UpnpRegisterRootDevice2.html \ ./html/upnp/UpnpUnRegisterClient.html \ ./html/upnp/UpnpUnRegisterRootDevice.html \ ./html/upnp/UpnpSetContentLength.html \ ./html/upnp/UpnpSetMaxContentLength.html \ ./html/upnp/Discovery.html \ ./html/upnp/UpnpSearchAsync.html \ ./html/upnp/UpnpSendAdvertisement.html \ ./html/upnp/Control.html \ ./html/upnp/UpnpGetServiceVarStatus.html \ ./html/upnp/UpnpGetServiceVarStatusAsync.html \ ./html/upnp/UpnpSendAction.html \ ./html/upnp/UpnpSendActionEx.html \ ./html/upnp/UpnpSendActionAsync.html \ ./html/upnp/UpnpSendActionExAsync.html \ ./html/upnp/Eventing.html \ ./html/upnp/UpnpAcceptSubscription.html \ ./html/upnp/UpnpAcceptSubscriptionExt.html \ ./html/upnp/UpnpNotify.html \ ./html/upnp/UpnpNotifyExt.html \ ./html/upnp/UpnpRenewSubscription.html \ ./html/upnp/UpnpRenewSubscriptionAsync.html \ ./html/upnp/UpnpSetMaxSubscriptions.html \ ./html/upnp/UpnpSetMaxSubscriptionTimeOut.html \ ./html/upnp/UpnpSubscribe.html \ ./html/upnp/UpnpSubscribeAsync.html \ ./html/upnp/UpnpUnSubscribe.html \ ./html/upnp/UpnpUnSubscribeAsync.html \ ./html/upnp/ControlPointHTTPAPI.html \ ./html/upnp/UpnpDownloadUrlItem.html \ ./html/upnp/UpnpOpenHttpGet.html \ ./html/upnp/UpnpOpenHttpGetProxy.html \ ./html/upnp/UpnpOpenHttpGetEx.html \ ./html/upnp/UpnpReadHttpGet.html \ ./html/upnp/UpnpHttpGetProgress.html \ ./html/upnp/UpnpCancelHttpGet.html \ ./html/upnp/UpnpCloseHttpGet.html \ ./html/upnp/UpnpOpenHttpPost.html \ ./html/upnp/UpnpWriteHttpPost.html \ ./html/upnp/UpnpCloseHttpPost.html \ ./html/upnp/UpnpDownloadXmlDoc.html \ ./html/upnp/WebServerAPI.html \ ./html/upnp/UpnpSetWebServerRootDir.html \ ./html/upnp/UpnpSetVirtualDirCallbacks.html \ ./html/upnp/UpnpEnableWebserver.html \ ./html/upnp/UpnpIsWebserverEnabled.html \ ./html/upnp/UpnpAddVirtualDir.html \ ./html/upnp/UpnpRemoveVirtualDir.html \ ./html/upnp/UpnpRemoveAllVirtualDirs.html \ ./html/upnp/OptionalToolAPIs.html \ ./html/upnp/UpnpResolveURL.html \ ./html/upnp/UpnpMakeAction.html \ ./html/upnp/UpnpAddToAction.html \ ./html/upnp/UpnpMakeActionResponse.html \ ./html/upnp/UpnpAddToActionResponse.html \ ./html/upnp/UpnpAddToPropertySet.html \ ./html/upnp/UpnpCreatePropertySet.html \ ./html/upnp/UpnpGetErrorMessage.html \ ./html/ixml/icon1.gif \ ./html/ixml/icon2.gif \ ./html/ixml/toc.html \ ./html/ixml/General.html \ ./html/ixml/index.html \ ./html/ixml/Introduction.html \ ./html/ixml/License.html \ ./html/ixml/DOMInterfaces.html \ ./html/ixml/InterfaceitNode.html \ ./html/ixml/ixmlNode_getNodeName.html \ ./html/ixml/ixmlNode_getNodeValue.html \ ./html/ixml/ixmlNode_setNodeValue.html \ ./html/ixml/ixmlNode_getNodeType.html \ ./html/ixml/ixmlNode_getParentNode.html \ ./html/ixml/ixmlNode_getChildNodes.html \ ./html/ixml/ixmlNode_getFirstChild.html \ ./html/ixml/ixmlNode_getLastChild.html \ ./html/ixml/ixmlNode_getPreviousSibling.html \ ./html/ixml/ixmlNode_getNextSibling.html \ ./html/ixml/ixmlNode_getAttributes.html \ ./html/ixml/ixmlNode_getOwnerDocument.html \ ./html/ixml/ixmlNode_getNamespaceURI.html \ ./html/ixml/ixmlNode_getPrefix.html \ ./html/ixml/ixmlNode_getLocalName.html \ ./html/ixml/ixmlNode_insertBefore.html \ ./html/ixml/ixmlNode_replaceChild.html \ ./html/ixml/ixmlNode_removeChild.html \ ./html/ixml/ixmlNode_appendChild.html \ ./html/ixml/ixmlNode_hasChildNodes.html \ ./html/ixml/ixmlNode_cloneNode.html \ ./html/ixml/ixmlNode_hasAttributes.html \ ./html/ixml/ixmlNode_free.html \ ./html/ixml/InterfaceitAttr.html \ ./html/ixml/ixmlAttr_free.html \ ./html/ixml/InterfaceitCDATASection.html \ ./html/ixml/ixmlCDATASection_init.html \ ./html/ixml/ixmlCDATASection_free.html \ ./html/ixml/InterfaceitDocument.html \ ./html/ixml/ixmlDocument_init.html \ ./html/ixml/ixmlDocument_createDocumentEx.html \ ./html/ixml/ixmlDocument_createDocument.html \ ./html/ixml/ixmlDocument_createElementEx.html \ ./html/ixml/ixmlDocument_createElement.html \ ./html/ixml/ixmlDocument_createTextNodeEx.html \ ./html/ixml/ixmlDocument_createTextNode.html \ ./html/ixml/ixmlDocument_createCDATASectionEx.html \ ./html/ixml/ixmlDocument_createCDATASection.html \ ./html/ixml/ixmlDocument_createAttribute.html \ ./html/ixml/ixmlDocument_createAttributeEx.html \ ./html/ixml/ixmlDocument_getElementsByTagName.html \ ./html/ixml/ixmlDocument_createElementNSEx.html \ ./html/ixml/ixmlDocument_createElementNS.html \ ./html/ixml/ixmlDocument_createAttributeNSEx.html \ ./html/ixml/ixmlDocument_createAttributeNS.html \ ./html/ixml/ixmlDocument_getElementsByTagNameNS.html \ ./html/ixml/ixmlDocument_getElementById.html \ ./html/ixml/ixmlDocument_free.html \ ./html/ixml/ixmlDocument_importNode.html \ ./html/ixml/InterfaceitElement.html \ ./html/ixml/ixmlElement_init.html \ ./html/ixml/ixmlElement_getTagName.html \ ./html/ixml/ixmlElement_getAttribute.html \ ./html/ixml/ixmlElement_setAttribute.html \ ./html/ixml/ixmlElement_removeAttribute.html \ ./html/ixml/ixmlElement_getAttributeNode.html \ ./html/ixml/ixmlElement_setAttributeNode.html \ ./html/ixml/ixmlElement_removeAttributeNode.html \ ./html/ixml/ixmlElement_getElementsByTagName.html \ ./html/ixml/ixmlElement_getAttributeNS.html \ ./html/ixml/ixmlElement_setAttributeNS.html \ ./html/ixml/ixmlElement_removeAttributeNS.html \ ./html/ixml/ixmlElement_getAttributeNodeNS.html \ ./html/ixml/ixmlElement_setAttributeNodeNS.html \ ./html/ixml/ixmlElement_getElementsByTagNameNS.html \ ./html/ixml/ixmlElement_hasAttribute.html \ ./html/ixml/ixmlElement_hasAttributeNS.html \ ./html/ixml/ixmlElement_free.html \ ./html/ixml/InterfaceitNamedNodeMap.html \ ./html/ixml/ixmlNamedNodeMap_getLength.html \ ./html/ixml/ixmlNamedNodeMap_getNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_setNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_removeNamedItem.html \ ./html/ixml/ixmlNamedNodeMap_item.html \ ./html/ixml/ixmlNamedNodeMap_getNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_setNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_removeNamedItemNS.html \ ./html/ixml/ixmlNamedNodeMap_free.html \ ./html/ixml/InterfaceitNodeList.html \ ./html/ixml/ixmlNodeList_item.html \ ./html/ixml/ixmlNodeList_length.html \ ./html/ixml/ixmlNodeList_free.html \ ./html/ixml/IXMLAPI.html \ ./html/ixml/ixmlPrintDocument.html \ ./html/ixml/ixmlPrintNode.html \ ./html/ixml/ixmlDocumenttoString.html \ ./html/ixml/ixmlNodetoString.html \ ./html/ixml/ixmlRelaxParser.html \ ./html/ixml/ixmlParseBuffer.html \ ./html/ixml/ixmlParseBufferEx.html \ ./html/ixml/ixmlLoadDocument.html \ ./html/ixml/ixmlLoadDocumentEx.html \ ./html/ixml/ixmlCloneDOMString.html \ ./html/ixml/ixmlFreeDOMString.html @WITH_DOCUMENTATION_TRUE@docsdir = @docdir@ @WITH_DOCUMENTATION_TRUE@nobase_docs_DATA = \ @WITH_DOCUMENTATION_TRUE@ ./UPnP_Programming_Guide.pdf \ @WITH_DOCUMENTATION_TRUE@ ./IXML_Programming_Guide.pdf \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/icon1.gif \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/icon2.gif \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/toc.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/General.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/index.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Introduction.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/License.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/AboutCallbacks.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/TheAPI.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Errorcodes.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_SUCCESS0.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INVALID_HANDLE-100.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INVALID_PARAM-101.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_OUTOF_HANDLE-102.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_OUTOF_MEMORY-104.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INIT-105.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INVALID_DESC-107.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INVALID_URL-108.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INVALID_SERVICE-111.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_BAD_RESPONSE-113.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INVALID_ACTION-115.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_FINISH-116.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INIT_FAILED-117.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_BAD_HTTPMSG-119.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_ALREADY_REGISTERED-120.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_NETWORK_ERROR-200.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_SOCKET_WRITE-201.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_SOCKET_READ-202.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_SOCKET_BIND-203.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_SOCKET_CONNECT-204.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_OUTOF_SOCKET-205.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_LISTEN-206.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_TIMEDOUT-207.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_SOCKET_ERROR-208.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_CANCELED-210.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_SUBSCRIBE_UNACCEPTED-301.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_UNSUBSCRIBE_UNACCEPTED-302.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_NOTIFY_UNACCEPTED-303.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INVALID_ARGUMENT-501.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_FILE_NOT_FOUND-502.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_FILE_READ_ERROR-503.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_EXT_NOT_XML-504.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_NOT_FOUND-507.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_E_INTERNAL_ERROR-911.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/ConstantsStructuresandTypes.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpClient_Handle.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpDevice_Handle.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPnP_EventType.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_CONTROL_ACTION_REQUEST.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_CONTROL_ACTION_COMPLETE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_CONTROL_GET_VAR_REQUEST.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_CONTROL_GET_VAR_COMPLETE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_ALIVE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_DISCOVERY_SEARCH_RESULT.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_DISCOVERY_SEARCH_TIMEOUT.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_REQUEST.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_EVENT_RECEIVED.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_EVENT_RENEWAL_COMPLETE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_EVENT_SUBSCRIBE_COMPLETE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_EVENT_UNSUBSCRIBE_COMPLETE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_EVENT_AUTORENEWAL_FAILED.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_EVENT_SUBSCRIPTION_EXPIRED.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_SID44.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_SType.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_S_ALL.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_S_ROOT.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_S_DEVICE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNP_S_SERVICE.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_DescType.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNPREG_URL_DESC.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNPREG_FILENAME_DESC.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UPNPREG_BUF_DESC.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_Action_Request.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_State_Var_Request.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_State_Var_Complete.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_Event.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_Discovery.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_Event_Subscribe.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_Subscription_Request.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpVirtualDirCallbacks.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Upnp_FunPtr.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/InitializationandRegistration.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpInit.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpFinish.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpGetServerPort.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpGetServerIpAddress.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpRegisterClient.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpRegisterRootDevice.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpRegisterRootDevice2.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpUnRegisterClient.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpUnRegisterRootDevice.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSetContentLength.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSetMaxContentLength.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Discovery.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSearchAsync.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSendAdvertisement.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Control.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpGetServiceVarStatus.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpGetServiceVarStatusAsync.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSendAction.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSendActionEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSendActionAsync.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSendActionExAsync.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/Eventing.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpAcceptSubscription.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpAcceptSubscriptionExt.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpNotify.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpNotifyExt.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpRenewSubscription.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpRenewSubscriptionAsync.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSetMaxSubscriptions.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSetMaxSubscriptionTimeOut.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSubscribe.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSubscribeAsync.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpUnSubscribe.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpUnSubscribeAsync.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/ControlPointHTTPAPI.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpDownloadUrlItem.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpOpenHttpGet.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpOpenHttpGetProxy.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpOpenHttpGetEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpReadHttpGet.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpHttpGetProgress.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpCancelHttpGet.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpCloseHttpGet.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpOpenHttpPost.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpWriteHttpPost.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpCloseHttpPost.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpDownloadXmlDoc.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/WebServerAPI.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSetWebServerRootDir.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpSetVirtualDirCallbacks.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpEnableWebserver.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpIsWebserverEnabled.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpAddVirtualDir.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpRemoveVirtualDir.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpRemoveAllVirtualDirs.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/OptionalToolAPIs.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpResolveURL.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpMakeAction.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpAddToAction.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpMakeActionResponse.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpAddToActionResponse.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpAddToPropertySet.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpCreatePropertySet.html \ @WITH_DOCUMENTATION_TRUE@ ./html/upnp/UpnpGetErrorMessage.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/icon1.gif \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/icon2.gif \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/toc.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/General.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/index.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/Introduction.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/License.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/DOMInterfaces.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/InterfaceitNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getNodeName.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getNodeValue.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_setNodeValue.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getNodeType.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getParentNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getChildNodes.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getFirstChild.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getLastChild.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getPreviousSibling.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getNextSibling.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getAttributes.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getOwnerDocument.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getNamespaceURI.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getPrefix.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_getLocalName.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_insertBefore.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_replaceChild.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_removeChild.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_appendChild.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_hasChildNodes.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_cloneNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_hasAttributes.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNode_free.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/InterfaceitAttr.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlAttr_free.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/InterfaceitCDATASection.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlCDATASection_init.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlCDATASection_free.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/InterfaceitDocument.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_init.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createDocumentEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createDocument.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createElementEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createElement.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createTextNodeEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createTextNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createCDATASectionEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createCDATASection.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createAttribute.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createAttributeEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_getElementsByTagName.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createElementNSEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createElementNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createAttributeNSEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_createAttributeNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_getElementsByTagNameNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_getElementById.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_free.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocument_importNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/InterfaceitElement.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_init.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_getTagName.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_getAttribute.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_setAttribute.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_removeAttribute.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_getAttributeNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_setAttributeNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_removeAttributeNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_getElementsByTagName.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_getAttributeNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_setAttributeNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_removeAttributeNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_getAttributeNodeNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_setAttributeNodeNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_getElementsByTagNameNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_hasAttribute.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_hasAttributeNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlElement_free.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/InterfaceitNamedNodeMap.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_getLength.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_getNamedItem.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_setNamedItem.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_removeNamedItem.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_item.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_getNamedItemNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_setNamedItemNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_removeNamedItemNS.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNamedNodeMap_free.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/InterfaceitNodeList.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNodeList_item.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNodeList_length.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNodeList_free.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/IXMLAPI.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlPrintDocument.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlPrintNode.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlDocumenttoString.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlNodetoString.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlRelaxParser.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlParseBuffer.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlParseBufferEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlLoadDocument.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlLoadDocumentEx.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlCloneDOMString.html \ @WITH_DOCUMENTATION_TRUE@ ./html/ixml/ixmlFreeDOMString.html 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 \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign docs/dist/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign docs/dist/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 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nobase_docsDATA: $(nobase_docs_DATA) @$(NORMAL_INSTALL) test -z "$(docsdir)" || $(MKDIR_P) "$(DESTDIR)$(docsdir)" @$(am__vpath_adj_setup) \ list='$(nobase_docs_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__vpath_adj) \ echo " $(nobase_docsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docsdir)/$$f'"; \ $(nobase_docsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docsdir)/$$f"; \ done uninstall-nobase_docsDATA: @$(NORMAL_UNINSTALL) @$(am__vpath_adj_setup) \ list='$(nobase_docs_DATA)'; for p in $$list; do \ $(am__vpath_adj) \ echo " rm -f '$(DESTDIR)$(docsdir)/$$f'"; \ rm -f "$(DESTDIR)$(docsdir)/$$f"; \ done 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$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)$(docsdir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 info: info-am info-am: install-data-am: install-nobase_docsDATA install-dvi: install-dvi-am 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 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-nobase_docsDATA .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-nobase_docsDATA 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-nobase_docsDATA # 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: libupnp-1.8.0~svn20100507/docs/dist/IXML_Programming_Guide.pdf0000644000175000017500000073120011021325543020473 00000000000000%PDF-1.4 3 0 obj << /Length 72 /Filter /FlateDecode >> stream xÚs áŇw3´T02Ń3·0WIS02˛Ô370S0±°Ô327UI‰ÖđŚđőŃÔ567Ő(Ó4Ô0ÔFš±!^\®!\Ý[endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 1 0 obj << /Font << /F19 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 10 0 obj << /Length 856 /Filter /FlateDecode >> stream xÚí™ÝOŰ0ŔßóWřŃ‹ńťż÷Ć×$¬›čĂ$ÄCŐZ©_kæý÷;;ZZ1Ň(ęťĆľ\r?ßť}űÝl÷J ‚1¬{ĹĐ0Ě9ŢÖ\đăog§yˇĐń9p_vO˛ŁnLŇXĚ'‚2¬?Éľg—’ 2ÉN2)Tđě'őĄ€Ř$Ó¨šţ8;ĎľŢÉ(HH±"e?Şˇλ¨€A*ćŔ ‰T; …fÓ\ݍWćpşB^-ŁŽônЬŠó tÂË ÂK“ćC^ DĂŹëY‹Y|O>¸!aý(¬‘ôÂpA—Ţ˝óĆľőwHF÷÷6×(…d!§u2ąŢBĆÝ0Zj´°AătÔ/§KBË`x'_©ó/x1äÓ8Őđ˛ßé·ÔÚý>›'0cźčctĂĚa猏W·q¨\\őúĺ’ž(Ń·ć}K¦wq+TĐdX·¶é F3“]Ł™)ŃčĄLŁlŃ÷Ňť@ÉL“?Ďr|Pnč@Y *lFEM-¶Íc Ľ2•"/@8ýtđů íĺäpŞj± ’˘´\· ˝uşjž¤p´óZá B”Đ=J=¨Ă-aĺ,ďćÎSŹ&ť—Ń]őÓţé!h´ĹTľĺě?–ĐĐ(ězĚBůúůh¦ Őż™ÄÍů4m¨7c(=3¸‡×éS1V“31kÄŔ6b°!Ć<źŁq9)§[(!ÖƦ·“Ď8%Ь9Ąs2ö™qo’‚Íŕ6E>ëÍ7cŽIg~-@˙±‚ň‚öNkpú1ÜË·H§qđ¦-·řJu´j9xý¬ Âę°NŘv¬FHĹ Ú‰;ç›»ćPż®[xĹ÷ľD$ŽóÂŐžÁż‡—Ćę+Ç´°Q•RB!0„1ú%…©ZNq/(Ő¦Đ0-‚‡¨N°Ä*ĆTÖ„Ú‘u‡yôADÝ’4šĎ{×µKW?s%yoĺv}sZ.zU9hĆŚŞaÝ«†y3Óđámťk<Żoήęö°s°˙ßIËG’ŢőÇ"e†±8VÍ?îîbKňţ|ž×Ëś/g7‹~y5Ë1đĹu)¦ĺ¦ÓDk…cJČć[źÄúŘř‰RŠëu‹RR÷FY~W ü Ó=—Ęendstream endobj 9 0 obj << /Type /Page /Contents 10 0 R /Resources 8 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 8 0 obj << /Font << /F20 13 0 R /F19 6 0 R /F23 16 0 R /F8 19 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 535 /Filter /FlateDecode >> stream xÚĄRKoÚ@ľűWěq­ÔËĚ>l/·H %+Ş”ć€Ŕ<$‚]cšäßwv× ¨=V–Öóüć›Çmőî$0DaŤaĹ†É …AdY&EžYV¬źřřűl'JfüWŚ…Śź‹I4*"d@2 ,3™°Ę°ŐKô3zz¶Ž€M"Ęćě•dh-{‰´Tť|Ń·Ś„@’+”[OM1+lŞ<30BfŠĄ9ý!ó̦űc¬$?ż˝\ńáýŚJ§hH“őÁ…,›ąĘ&ckś‚ü´ŻŽÁ†"N\2őÖ»Ë/uc…‚ś%č¸I_wPŐ±Ěů»CŘowNn E)ţ čÁ JH<.€ ¦ńч—‡ ަŽšmŐ,Ű@†č~ž:ňJóůřËW*R8ŚEȏȰpĎ> endobj 26 0 obj << /Font << /F20 13 0 R /F23 16 0 R /F8 19 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 1821 /Filter /FlateDecode >> stream xÚťXKoŰFľëWđH!áš»|÷–Ř ŕŔ©ÓÔh¤9¬)JbB‘*IYńżďĽHĘ’ěAs8;;;Źof–z{7»x—:™ĘâŔą[:Ú¤*đ3'I|•¦±s·řâęą§CĆîu=7©Ű·sí6sČĹČ–ÝľDf=˙z÷~öűÝL;>üÓNć;I”¨,ś|3űoöĺ«ď,fľó~ć« Kť=ĐľŇYćlfˇ „®fÍţuřŽ%é‰ çü'šĆŽVY8má,ź¨đŔ/1‘ ˘µĽEŻuâ¤ŕvĚn‡*ŻE„˝>ňE± ýĐ9Đóś5A+Ü{Îś5yAbáKšXČť÷+NSe {Ł_™Ła[‘c:T&4Nâ•ú)yi c°S©„×Ĺ.GNŮŔź“4FÚW âŕ¨_484¬Écą…’î›S§±2SFp «q¨Ł.ß­ lą7%ůŘÝý@Nč^Ý~–áĺĎHß0ýĄ,‚˝Ă0-Ë˙=OxéJ@;1´2LüëGţőç7đÔĚ);VeůQa€Wk*"üłÇ?*'nćöŻA0IÝ-UWg÷ö·}7¬y{lXävXŚ[ÜšŔÖŢĂ$bń `€0”5¬ ß)(Ć Ńő¶^ß¶ dřîwľŰm5YƲ·÷s/ŠÜo=ËfŔfjp“Ř.÷ßŔů]1ËđcĚK_´K›äš‚ÓŇ„ł‡B[2sôYčtGZ;fX~\zÄŁ8?VĹů`P"ÄjŚ'Ś4¦!MÝŤý>D ł‚&öH&ną(,S˦e˘ŰŘŞ’Ť¤dęď)ôŽńY –¶[ôĄ*sŰ#$•ŕoh"đ—€b‹)b-ł9č4úzÂŃ8]ňᏦ§:‰]DˇżśA˛-©í€Kr oš4Ҷ° ®şŘ][QiůÁéÚ"Ü™Ó, (XďŐ-ĐŚwIŇí´0‚%o8‚EÍíËÝśRH AUCµÄ:s?Ď 2޵ĚLçg÷ßú; TfŐp7ć ˛±ą§î[Ö,n™›Ł“…4ÄjŤŤďŢb¶«G^·˘ś*S #Γ’Ý t2É l,Ç:A+wÔ(p}]´…¨źwô/<ČĐ%÷$AHŠ;ŚŘ]|čZ„$5í ö4;4/Ä ŘLM‰Í¸iśBŚĎŘß 7ߍ  ” »ŽÍśŽđ J¶E÷úŚ˙ëćé$ĺŮŇľćĘ+K_Jńbűň:÷’ć“s®KAĹÚ˘š‡’ü‚}űőÔΤZ%\°ç'ńÁŠî¤źÔyUŘ–*řâÜw§{÷i9ż[ ·4;*D¸¨€Nh’´őŕ¦ă?ŮÄŁĘđjĽ¤O‘Ć9GĂ8ţą‰ď<ѱ†ĄmŹ\ó,żňl5ÔL:LZh€˛§mS«—&ăARy ô¨˝B`óç?Ű7éˇö_\‡5ťDîuϲp2a.jj´VQ#ěoĽşŘŃg\Łił­WxŽ]Q,OdĎ:A+TVH8 F6äcŹçą 4˛.;™! ŤP™Lˇ‰áV§‘âf]p›ő ÉEĺÉ<îą: T„?Wuň«G _Í™Š˘đ×řđDŹ7)˘Ď\9ŕKŞé;7V1|އ ‘iIÓö?WŇSđm?|ě`ă2/ÖE ™]L %jÄ.L‰qV[^¤öáôĺ+äż`'q˘ă% Ś]NÎéö¬čüf×ćPĐ® UĂŘ8´‰c•8ň!s¨ďýn¸k’CňĆ÷cČ~Än8¤â9ĄŤ.endstream endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 29 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F19 6 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 2029 /Filter /FlateDecode >> stream xÚ­X[sâĆ~çW¨ň$*F;şK9O„Ń–Ś$văJňŔ‚lë "äuíżOßÄ%­TΩ­őôĚt÷ôĺëžâ÷ahˇz¶VÇÓL# m­)µç °cŕ[®a»>j˘{¦ŻŕźÇţ9†î »÷_LŰ3ĺhgzţÎŰ÷ îýť9kŘ>°9ßÓÄ„ď¶_^¤éčW¨™ ćşäé–ciľ˛Ś@äYZőM}UbÎn¤Ě5•áBŞĎÔţKă‹5 ď;Š ¬¬ď¦Ď <Ă:eďśDćŮ®á36Gőľoú·<­^^‘nű۶őß”«VđÇÄ©Ł[J©ü±y7ŮkąáécTŁ’}D.ŰŞŢń~´ů†5ťuŕí¦¸Hw*Ń3ä»Á)3®/™⹦Öeć…W×r2XiŮ– /]ď$˝fđ®Ţ¶%wή9Ó’ŞďC-˛5ą#V¶Ë¶lŞĺćdáű×uń_Ś;Ő±'”ç`ęĘĺŘF)˙'@ÍJ8™Âˇ2[*8KjÄĽ¸?`:Şn„uÓĹ_LK)[´¸dđ.uVtť(óX€xÝ6ě_ÝČ>I/ `Ľđ…’SňäíplĄxnÍ#żt·ÉÍrp˛ÂÍÚÖ­„\Ú5u0ŞVÚěş$wč?¶„gVŔLT3•HjÜkű®w”˘»EŢŹ—Ç+Ýpr­g÷̪‰‹čhZŐţŢTmŰ?:,ÎpłeĐÎťnĺ_ÜĹ4ÉŃUSĎłIńąoš–Íc\˛ônëTĚщ ťř”ŚcX3Ďđ‰Çb3ó(Cö§9źÜ9-cšĄ$8ĎyÍNZF٬'C”Yp\§ë‡älß«~`"šŤ‘đ€xâ•ř6ÔŕIąHds‘|xLa9éöEĽózÍ ˛šdďDf6Jădv/s±‘%gp ť&f'E Ç8­Ůť*ă ö$bn !¦’Ä93eŢ|ľxŽ MŃPXІäJšOĚCAbŇąYĚş@ ® ŠC4®{k ʇL€9ŁE SŮÇçŹčrŽŔĹJHAbśäŁ4JČ×čüÓ(ăOČaFŤů4JSažqĘ«§I€Ĺ­^B¤ôˇ /M˘a*4{ËÚpN0AbśĚăQqÇ“d†SŕÝ»ôAÚÉ˙±Ř‹ÁME"‡ĄG’ # ş­ř\ż „Ç4"S@Ób)đ—A€nRPĆÇű(e†1z=D8Ü# ěŔŁçľ—.0ŢNŕ?&łL@&Ł'„B$ KŮ-SG‹yLpĂDYvHÄ1_ ó")EĚó{Śn6Î…k.\ŚTÄň§dăô?Ľ“f9ńGŤ‹<–§6LĆŘc"üîRŻX%Ţ1ogéx$°"„!§8_ňć‹Ń”©Ëâínዟ’löLÍ ×uţýŻIŃ38)˘ßŕ~`ŇĎ3<ÇŇŕ€ďtj˘ô§GľTáq±|éŢţ0{ďŰđč?ŰćÍ] Ďľr-<üdęřdu]ýř&Ţěy“źőŽ>ÎF?âúŹ]Zä9 ĆĽâ;¦Ý˙ôáĂš^qújż§áůđą*źküâk^JcW¶WďYËó _ł ¸¨ď#>Ş6ß8ÎŹ–R^¸¶§»]*ţp™°"endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 38 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F19 6 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 480 /Filter /FlateDecode >> stream xÚť“MoŰ0 †ďţ<ĘčÄH˘>wL·‚Á0ߊ‚ÄiR¤‰—ą(úďGYîćmMEX6ÉG|_Qó¦š}‰0y‚f ÚD$• …1zh67‚j©ťĄ$ćËĺ×ú¶YTź›J⟆¤ ¸€‰¬ŞŐÍ­‚MĄ`Q)¤á‰× uJđPYCăúP}Żľýf(dĐ…řîů? 7f=hL‰ŕÜÂö/„ä>d0É…L™g]:@daľłhY×RtýŁE“G«,L8—şˇŕQ±ĽKíŘB’8ÍľE*„1ďu]>F4|>/ş G¸ĚąAfŁąge0Ş8ëkÄs­EWKE»i·µôŽÄţ#}ÖÍî¤ Ĺ÷yË\˙Ú9;ŢĆń`Lzy§"k I–Ľ7@ÖđT(sÉdB2ĚóĆcĐţýă'ÓHr ťłlv`1EťýI˝5`9#éÁ¤fÇďůjźµ$gE·şËomy{ŞI‰Ő$\‚ÇöĽęŰÍłďweŐgŘPéĸÔâĐ•ŕi[žź–×WůűU>›|iĆ[ËÍěz.껏łŮćÄÉJ¬»Žżŕ°˙éńĽn·§Ú$qľkńŘŽ0ąöĆł‡l¨˛vŕ-ąúđĚ("a?”§QĘ×2:ňÂżŚÇ/™ZéÂendstream endobj 45 0 obj << /Type /Page /Contents 46 0 R /Resources 44 0 R /MediaBox [0 0 595.276 841.89] /Parent 7 0 R >> endobj 44 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 49 0 obj << /Length 2500 /Filter /FlateDecode >> stream xÚíZYŹŰF~ׯŕ#•„íľŹ}łÇĂ×f‹Id‰3Ł@×RTĽţ÷[ŐEŠ˘F3Ł}Y Y¬®óëŞęys3zőłÍqZd7·ă–ę2c(±Vg7łßs9.ŕśćo?ŹYţq\!ň_Vcnóş¬n'Ór;ţóćýčÝÍeţ±ĚŃĚ(CśPŮt9ú÷č÷?i6Ńěýálö î)aÎeË‘ä"Ţ/Fף6aďëzM^Đko=NwKđ^ąŞ_’ěIIĆŮ‘$ăŃ]ę‚îz·(—/nzŞ›„8…ú’Ą3ľ¸H5ĆÇɦ~šŁ_|QOçRF÷(AÁî]˙˙Aé÷7¨9@ßö%Ąž–Rň Ľ×ńŘ‚ŢÜ—ĐşH‡{ ”ŚůŤ˝c/ń¦ ˝(RŘüó×qˇTţW9­Ă' ż˛ŕ¤E ńźC Îň^ŰÖŰ@»ľ “pńoËşűnŔ]ßOÓÇ“Ő,P`´Űc¤Ú†W·ë*®ŕeŔö _ÎWwńqⱜ¬Í¦đ6ÁŢ%öv`ŤÝŢLę9*€ß)“ĎNŘe V`ß_~űř©u˘nČk]‡űůrżţőro\x3Á•áľľđ_D˘h’ęô”‘˙¬ńÂQËY ůk›9ô­Ľ¸ZWeÇ!0Ş2ř2±[úőQ™ŮĹÁJ±ŕŽć_qĹď1Y˙ L˘“P:î8ú‰¶I´Ż[ϧŹŃóx­1 ‘Ár˝Ť¬v)†ĘŰ]0 >Es8PĘŰ7Až‚b1ëĺHöÚN«9šĽnÄí-ąÝ!ÁĆ[pŤ<÷Ů‘đ8tF[ŢH24Pä‹y{Ç,7tóxĹĄ«ŞmÁ×Ţ_pőß'ňmĚ‹ąO1âE„ÖŰIÜ'q*ZđźÇVć>”ó§i>]/7‹uĂ_3Ď´ +ëUř$\m°’÷33.C`Čü„ÄÚŰçˇďçe5AűMÇđí=jţ…Ž,ĘzJâm•>˝Ý›Ýł¨]q•¶YĽŕŚÄZŻ1Îމm’aË`Wŕ°śČćj]í_¤,XvÂńc˝"Gfs˝ ű(✎ł9él¶ĹńZřąčĎdZچfk‰$ěĽ ë Ř$TLĎgK%´!vH, Ł|™˙”łp©Ź¨(,'Vóˇ1'\eÂih>YS;°6îKŰúRa7&Z5ŤăŁî(ŽEuÖ’áéĘHáł­śfrΖTzh"'”‚’Kť1‘KÁů€ĺÍßýöűňů×±ĐţĆ‹QD€–’§ŮĂfNśuGGĚEdU´x˝9śČíšĺPÔë/ Ţ»«ˇ­b˘NyŠsňké*nŇýzÓŔ¬‹Ű˙ń@µř„xÁŹ„—ŠPáŔŃÇ\x¨9”ťÂ×<ń*ZĚz^äPéJ¸M4(ĺ]Y7úޤ׋@}ÍRuüUÔתHSjĹůŞśpbâŐSĄ%Ô„ŢŃäÓ~żó©úCđç*훺 O@ Öď`Ç€Ö‚w\ř+öe˝«V¸:÷&¸Yˇ©ŕNdŹŻúaĚW{\ŘGBwu®‰ćÉʰ YŠuÍĆŻżšq_šyP`ÉHăö ×o÷“:ÜŐh…ďľĚPaoˇľěíIi%d¶;CHG Mmé<®â{$XsĘv¸TcĹsßíN!”SÝ˝qµřJĂ-&ŘéĹ r„˛˙—~kiňÔčgA3ěgŤa pňG'7 ú"¸ąg5›‘˘‡šˇ–ą®±ŠÁĽ(@rŤ; ş @¶ d˘9ČŤ!á'‹Ý”„Ąő Ű>äÓŮęśÉŔ«§N$aÇf]mž ’’`9’ÜĆž[—˙íűË]ŻC=Ý™Ů6PqůJĆÓM⪓°ć6…`E < ct¤Ř ťŃŢD´ŤPâ1…­——¨=ŻAŚŠ$=JťôeÁ z «^śö̆Á)Ň ”Ű.8iśč>厜§qĹD((Š™:_§“xőtę tw´«Ň9Ĺ DňÁ)(Ý„Ž˝=ÔUú´ü–‚‘ NXÂę~踀"ÔzΊ†°˝ÝÎď|%¨ÂHŃĎŮpň-<Űăťźc¬ĺѲĐ8öȲ°Źh`6Mź4ć Jł”âBCkČŮÁá#ň9Î Ŕ¸LűÖâ5”㉤—ă»ý;µUšlůG~*V]eĚ…Ú·łAH4‡ŐÉ žr|ßř_G€AŞŘĆ8[§“xőtę€ v•¶JĎ.Q±†+QŞyůw`űćčľlýčtJ·ľ±Ă!ů±JŚiÍóóWĄÝóűÎÍYś>bih¬ňłY)T“Íę1Ů Ŕj¬ąL6ďy fs$éeó±ĺrzKČxť’C×í em ŮŹŃ^Śv\©:Ççc łÄž¦gaĘžŮ0¦Dš)_J&UNĽ *–8ů ¦ŕß Šóu:‰)WO§6¦hčźď¨ôlLq°_óÓOwđĆĂȤ Ó›#ŰŤ˛Eś1‚cÍÜ#ž5şc€„/SĎĆ#XOČÔX%<‘€RT'űá®~žXG¤ä“=«!4‰Ź“ Ř`ɰ„ JZFć‡yŞ_ęzG=°YB™Á¨”|ú_b‘O±gpAeÔc>B!P@B ŽĹ3{ě«›#f™o&wľř żľŤ޸y^®ĘjOf^߇»ýy°Ęď“ę‹Mx6^ś»_ýĎL‡˘ŃŽ Ě=ČÔ›Ľz…gß°ňtłńg“¸ţzWMËŰ5žŮVw%Y•ýżŕŕşŮ âZ†x~ďO{ż‡8‘?…+oŽ «„ŃŠ®ř/ćâ9âendstream endobj 48 0 obj << /Type /Page /Contents 49 0 R /Resources 47 0 R /MediaBox [0 0 595.276 841.89] /Parent 53 0 R >> endobj 47 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F28 52 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 2509 /Filter /FlateDecode >> stream xÚí›Ys7€ßů+ř8Ü0î#okŮ©˛Ë×ZJUŞ’‚đ|ŹŇxµő=CjѢŕ•ę¬!Ňš˙­śj™0şF0G”–ŘG0vBßHÂ9ćhňęđäă‡O+’«ĂfFaÇÚ‚ŢjQ7•‚HU‚ł7µ†p Ś%e­`Ěd"Znwŕ›ů ¸€aŤ—‹:!)áě a8)Ŕho§şuŐśŞ’CčóŠOg’ky7 uČß(“Yâwäâ$ďż )'̺֞zÓATč »ăú`¦á.§Őá‹őlĄ®ęňW€Ú7˙Á9+¨Ë¶Ľ]{ taí'‚n®ŞşAâ4čžo`ÝV sč~qč2 , ş…˛včF™Ý·ł~ĚŐ†äë™vćjâ {űÔÉÜ «ćS™ąŔeÇŞ.ťË\ě%&:™+łE©´ vćĄđĄ ¸ Nşă€řW.´Ö\ŽË>޸â;o˙Ţşx«ŕ ĂŰBUoŁÄIĽŔŔś·ífĽ-YřĄy«´€‘3oKĘZy›ÉDŢ~ܦ,7Ź»Ëĺőʧ‚ëŰÚ°t>w ¶FîD‡ş`uŐ*ĂÖ@~jyĹźsak ,/;¸Ę¸09!p•ĄÉ«×ľ°Ćű·őřp0UőÉî'’f‹ŕĺ=hĽO±őĹr¶OWĆl–ŔH!ÇŠĂ<^áŻŕMN…˛09,wu«4óˇ~î™ őîëĺű9KČŇ~A”ź4«DdĐĄâX?*rXµDĹ\U+ÄiT<ßŔ‚Š­ćT,,üâT¤ŽŘÁ¨X(k§b”‰T|ź~Ţ_zÂĐn "Ľ3ě´c5QŢl_g:k˘AWÍ™25¨T¶âË5Q *˙iDĽŮ@Ú h˛Ú<Ç öŮ™ WŽÉ ýšÔ˘BAćT#Ů ”Ú5  UmŚ'Qps ¶[Q°dáűŮ}˛S–´ôÝěa2<ĄŇďÄ’˛V f2˙žŔüş‡Aý¸oÚ#˘@s”‡”Ŕ4Ýß—N]5_*%PA8Żx2@Ôt®c!Ç‹ŮŢq‹»,ˇßümLŁýㆼ\AŚĐóčgŮ>°ZdÖ…ýŇ%6Eu˛Üă§I–»đ9[7P)ł9íŐ*˝O×h˝agűŢek>č;$rú \upµ\Ç&Fcš!€¨Ř~ÄŃSkĎZ «ř+;Qt¸ť(NaÉŮ Ęqo:°UVŘĘOa+…=s(äp-tµŇ5Šś†×l,řÚndŘ’‘/Ăxť?b0â&˙Đ\ć6 V ]­TŤ"ŞžÖ/±ÁŮbä•ß#tŤĘËl­śµđ&Nđ­ łQŐˇoeĘZESe×ÎĄ¬•D2UŮᢓƚ'^,< Ű°=żä܇›ë˙Nb6<÷·l2Űay9ü‘ž]~LÓJ=-÷w]ËFI‰zě™ęŻľlěC?ć€~2áU;Ž/pn*đ'Ŕ!Šť3üJşÚŕ—‰Ôŕ7Ç٬łÓBĆÓE—¸±]â†Č/,ű‹Ô–h#ÂNˇ¬ť;Q&KoăÂÇÂĂlžţüéuSŃO ŰŁčGa˝Ňۡ#E?ÔUs¨Rôł0G°Š?ý¤c]´©ě°¬ˇď|żˇĚ śűŁ>á)ö¤—żŮl[7KR„÷I:§™dĺpĎ.€©il3žĽüđĚĽ/|Y·Ĺ奜#ÔĘN>YńŤŠsĘr Ă@‰&ÉXÄ.>Ä ,*éjcQ&RcQţŇ0gXŚna„…`§¤¬;™L±×€gB>× ĝ>şÁ€çA…čďEk˘®šeÖMśUś8—5ÜËYWÉŤ ¬Á ĎššXŘ÷·ÂáBß—v)­}˘Wz´K×>?jČŠ*±îű†jŰöŞ<Ř^­Fť7B™aSčjLů;\N(:…˛vęD™ěDIL«f+Xö Éi˝|%‰5GOđ)I ŹíďOgů*čŞůS)_AÜAŕ•Ý9»~ĂźË.ţH¬ĐMţË*$KB«pkí—ŹŇp_ĘÂ;M‹ˇ!‹;1Cš9P4 %- ëá*ĽŠ›ť»"Ů«CNJXŞB^uFĄß$LEB)M€ MŇ' Š9ŃÁATIW˘2‘˘–ˇÔ3,……Ś]ëa(TRÖJˇL&ŐߥŰý‹’‚:|4V;ŽÖt¤€W{‚ťGŮ‚®š•ŁlÚ.{Ń>,«FăÁ1V-ĘuúĄ-±Ś äWˇ¬ŐŻ(ŇĺWútĐ5ů¤ŹűĂŇ*5O…˛Vź˘H‡OŰôćâS‹Ő˘űÔˇň%XôTŃĐKŻ1†q‘°ËN]űCÝĐKĹ˝46´˛ßn/î6YV|í)ă‹uľ>sě‹NŇĎËÝ~§ &‰¨nÍä;ż`čY-ľ—ńBO-ă™S¦ ¦+ă•tµNQ¤kÚ¨ü˙źđYśrD)yÎż=ÓBQ@żKđ‹e%3tüď ÍŐ]ţVŠ2yÝƵ~{šjHńqx¸N·ł}ş2±-qY©’»l`ŻÂC6WájţâĽ˙CVÔŽĆÜíqř>üřüů#ť&óÜŞ&ľýÍăvóÓ„»d{›’uZß}ŕâd ˇ.Cáí îľ­ţ ˝/ź…ON)¬9¬:±Ů«ř?ú~†endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 595.276 841.89] /Parent 53 0 R >> endobj 54 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 59 0 obj << /Length 2847 /Filter /FlateDecode >> stream xÚĺ[YsŰF~ׯŕ#¸1Ćsű+NU\±ĺŘzpU60 JÜ" -YöżO÷Ěŕ"˛ą©ŠS®q4zşçřúëžń‹ë‹ç?Ű™#N‹ŮőjƸ%‚ş™1”X«g×Ëß9O™ŕś&?]ÍYňzž !’_vsn“2߯˛E~?˙ăúŐĹËë 6ŁđŹÍťej¶Ř^üďâ÷?člyAgŻ.(ÎÎášćÜl{!ą×›‹÷żŐ:RP’¶´Ľ@SA¶±Ő)bÔĚpA¨VŢÔőç-›lŢ`%O–ůˇa\*Bą®?:iť Raű*]iKYĎH.-‘pٶrźßm ×.oˇ;×ŢŢ%ÚŮ­ ăĐĘ˙‡*úˇ׿:#ŔiĹtg8qÖ ;Séę9Ó˛I /†w|Áž†‰°Wrtĺ_azěđ±¸+÷đꚍPB™šĄŚ§Â÷Gý9ĆÎäV­kÔ« qĚ©üńňv˝§ËŻsH;G:Ó@µ”ŤąT‰ń©Řŕ“K|â§ŁżýJď¬!üLľUŞF=ó~EÇöyů€So÷¦šŠř\âbbaµqŮčMĄ&ô˘ŻŠ†Yđn®@'.Uq?O—I¶Ă_•äź× ýľ\ďnÂĹ->¨–r¨8#Z˛¸š;ŘÔµB0b•rŹëň6hÎÂp0`ädŹ€Í0%ç©dňHëا”Ohś#U”[ďP­HĘŰ<\l‚·ˇ±b…żÝ,÷sĹ“|Wżń¶€/i:S'ë›f‰?NZĆ5ŃÜE9ŇJ& úuĘ4˙^~8×6a:ô)×”(‰sTcBh&€Y00żp,yůnŢ^˝›[‘\®Sfv¦„-fżiˇFUiK×áJe„vushîű·`ŢË˰@×A ,şYgîLŽëÚ‡&qž¸ŢR6×+™×·ĹĚű„N†wĺĚ„řî4›îÔ hE]=§ŔŐ©ŽKOďzRĽđnaŔĄöLn5ĘĆÜŠ§ám? ęęóJůËĎăUKŮW•Ä©PĎöSCˇ!R DÂmń  „/łđłl(Ü­|$(¶á.D¸Ř¬ďA#‡P!r€IÍ—`W ŘŰ´3{PZ(;:8t¨¶ß;8áV}'±3H҉Ń28c«hÁ:áÂ=!\(󌫳„‹–®±pQ‰ü5áByÚwžhŃč QÄłˇ»;o[ľ« -Ŕs­;(`–+1ŮťŁĐTşÓAçélË›˙OťňBťÉ«F٨[QdZ"Ś!©Ě:Pú#Ś;‚éÎ7Â)eN)o@±7ÇŤ Ö‰I^‹*Ń(‹ 6 1\ ňµçđpă‘ÚŽŤ¦1Ç ’@–ÓdřÁbÄâ€Éf“%ŚŔ·#24lěß‘9u-¸u@š¨éÁ-‡ľĄO€[Hđ¶ĎĂÎ[şĆŕ¶éÁí‹««_Ď‹µŇrbĹ™¨yKŮ(ÚV2hĺmv߆Yo,ü†Ęe§g c¸;YySƧ®“}:†MQWϧ66Aę§”µ]š‚ąÇŔIq”]ţ ibľ_#ÍV&Ź·yé+Ců><(âď®(ńB ˇc’Hç&•¬˛Żyq‹ úZFIR‚n’úđ!8aL—Ĺ€ă…jf#IA´OY€É ŐÁ"ö,’ŚČsaQŁk‹˘H‹†V Ç(MőYl¬t3’ Cä[m#ű+°·R‰ü`•MGLî:b6ĘĆ3Ę • Ź”VPóEÜęĄŇ'é©€,ÄtގeÔŐó§Ť8VśwÜ™ĘPQ˘źXć^É:ôŔ” M$çťAľDRUě<’g°0‘x]oý¦ ÖŇżEË™ F9jăů FQ ţ›ó`TŁkŁ˘Č_Ŕ—„µÄN)$MYý-eŁ«ż’iřŇŹs Ieą_|(‡¨#¶.žŚS%śçnş;G©RĐŐs§˝ř•$FłíͩŴ¦818;FxLää1¤Ňó$Č ĺZß÷g›şâ¶¤m3#Ô™…µ4żĹŕĚ„!ÇT·eď?‡=…11™0ŃŞĎz5Ěč.‰'€Öd©fgŁ–®10ŞDz`ô KeĹzyô ÂŁg:3ŃR6HQ­\íó>űŕśPy2WŁŔŘčĚ?@QWĎü6Q *UÇú4Ws"ٙ̍şŽš«qřąG°Q âh—Ýţ<7& 陯ëc‰‹»!¬ŰL,jUô'Ű-Ł:`§ĐÄfP+n7N˘UUăŢF6˝AůşŚî>VI(ž‹’ÝH^V^Âź>ĂÜüăňĐšę)Ń€«p¸_Ťu_Ź”]ßć[:ŚŽ„GŰŤŽF7çü®@\WČáń@FL“¬‚ď·>~ęPĹ‹;”ZołýĽWÉ2+łŐ|ąó| Š­Š}xźm6áIíÄŻëÓpţÍGŽ*ůoeÇg†çTzéń8ŻÚ+ĘZÖ9âAşŽůľß°}Ő÷ˇřşl;ĽęĂţĽÖŢń=nġlé÷ˇă‡ëúŘ<ĚžH@Ň@Żn;ZKeÉMü]Ź:Vř‹O×Ĺ.ó•ĺЇ .N PP•Śŕ«m±ĎŁ.t:ŽMVÂçŃ€}ŐüŞ±Ă»…lüđ'x~őš§;…—A; Ő:vo Y8šČPC9­˛†Vd™­¸čuĽ8ťŘRäa•™™…iŞC^†e°ş­@)°CXŹ=ĹtÔN·K(XN¦2<Ń$śUć?Ą ,\Eé'™ ŇNč¬ęx𒡀—Ěó@E^~đ4‰Đ$<Í©L-=I(<9Č“˘®´ĄlŔ> [ŰŽ}ďß"ObN›dQěp?®›őĚ’÷8­÷x°Ëcsm…V0^“ú ’[śýuEůĐg =„çŻ&ű, jŘçJWĎ玉.ĄĐźoň˛mä›lë×XŔŕv‡ĄH_¨E.Ś[ăć(µbXh„ ˬ"ŠĘoϨ+m)OiĂ…j¶‚i˛*®+ŕđ¤b/mŰÁBACkzý:‘<(KĂg'0Ę+<”7†,Ě Ë­Nh1\sÖ@ŻK„'Ń:ˇQ>ěw±ŕäŁ^ě˛mÄÝ"`k Q©ł|bIęY’0–̱TÖěo†ř–Öa¤›!aÎĘhë—đM”Y ť „śÂ˛I\‘ŐśrőűŁ‹Ďšë]U“ó? WÍĽÍ©/Üů”®ľˇű*íöˇqw3x \ś0»S ;VĹ3y%adB…ˇŹ;˛pϲmč9˙ŔďĘr‚v>˛ąbíi’t0BRʆ4DšăOřă«Řb± ăDp> endobj 57 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 62 0 obj << /Length 2185 /Filter /FlateDecode >> stream xÚĹYŰnă6}÷WčQŢV\Ţ/ű–fł@ÍĄIşh±ÝĂQbŽíZJÓü}gHʦ,9ö¶Š1- ‡3Ă™9‡ôOw÷źlćÓ"»{Č·DP—C‰µ:»»˙šËaÁç4˙x5důŰBäçó!·y]®Fă˛~»ű<8»°ŚÂËÍŚ2Ä •Ťźľ~ŁŮý€fź”głSœ˞’‹8ž nż¬u ¤H´ü„¦‚ěÚV\„ BµňfŢ”`g^?ŻŔČ9iEţečT>š=—Đ@mO'Ö8X '/ćU¤’pHA„0QćăŐ¨ľ­qéüń۰ĐŇĺ'đˇhîçŹBPâb‰©Ś˘©ŢVZ:KjE”˛Qrń©'% fł‚0-aŔSÁńůbXp“ß—¸3|gůčÉt-)Ń„3 ×p=<­`lhµ7XóĹ}ą„0t˘e‰ŇM´®1‹)DĚ÷Ö¬BćÔ`ß"ZO`śŤŽŘµ#‰ŕ*ČÁöúŕűá_¸@uNâ`žzľ•‘°M„ ×ÍHąÎH.1#±¤Ž_{’2Qä“’™ĚB t( úÖkůú!`3#|Ű$¦`¨=Ü.ˇQNö¦˛Bb8Ű©ĚOĄ ,Ś˘tź“”Áě¦ňŕMĚ9đ’"Ď4†Š‡$:űíúęfhy~×uŠX™µôŢ– bĽż)4şŠDYŹ}š©mËľŰëłÓaa„Y÷1¬AmĘą–Ź–H+b:O˙ɧü»ÄśdĄ[n ÁÔ‡{)a×Uż—QUÇÉ–B0bśj9ů¸.”ÔRčú Śź",âä‡×`FTWGV ­1Öb/ÓŮ,`b3 yxmsĽM8#„úXFLíĆ—ˇbo,ą&š7|ˇ—†č Áł‚Sâ8?V(Ő·.§rĐÉÁ“ľ|‡F*bgśH*v–łŁú–˘j¬`ÔHµS»źÁÁžčéf˙Ď®cŁ–d (‡9^/‚ňU /7ÜNö¦j+<[4OJ{dţ;ÍKí˘yŤHBóÄ.šw°]Ń<Ą‰°îPÔŠŇ=NÂcB÷Ń<„+ëĄyŤôQh^˘l7ÍKí 4TŽ©kšÓX‹9ÁŽhóĚŽśz¸co0»¨ŞăWË>nqV¶üŞĘú2^Bézůś•Ä0˝‡Ď §‰sň(»Őčz{·$Ąľ¦^%|÷ܵČŰŹ‘ă9€ig@Ă´1îěd„@ń.PĽyů‚ ÁëÓţÉ< M#°íaIüűz:: ňy¤ŕ€V‹ Á#[UMç) 3ŁĐ+_úh oą^˛‡2áŃ‚ď'€}8ź2<É`,†×X‰6Ą IéY–”Ôßřť{ ßŰíŃf|3ężcáR~/5)Ś–ĐË`ŃX§,Ç› L3¶Qľ¦'ťU€ť»f’Gtí1Ř>ŤN#!{^ÂżŮt<ŞËűčŮÂEú¸@>ďc&/‡(ÜÇĐ ® üm› †ÁUŠęžĎn®Vdî-™>zOF‘ZŢjYVÉNś7!†·€.Ě?‰śÎë.}–6ôq K‰ŃcąjŘËr}UUů˙A*\Ď7df‹>úg ôt¶Ŕ°ů†č~4ś%•Ç î%^®b«g¦ë!šJîyHGN¸Ň‡Sy?D]E˘,´.“Ĺl#âAű×ÓÓłŰŰnäˇVYcü‡aˇµČď0!5í"&ŇjTO!®ţĺxń´ś•XL:€V!TĎcźQĄŻ®ę[Ëlö:´˛IŻ4ĆE]±>FŚá &Ś:RŚ7ĘvĆ8Šx».żśü|ţ±cš4xÓp˂޷ sźŰ˛ěúäćäâěîě¦{ 1„®‰ěżbćí^ŤPÚ­wÝĽ2@f†4­â)ÚF9łu·ŰÓ(|DDšŢ§­lëÄö¦ŇQĘŻ'ݱRiŁlg*E‘J·ż~út~z~vŮ9໮3G˛/ęzŰ>c =»–gW7żw·ÚMŇI;›_FĚÂqěŘđŕůq“8šnĄÄĂşĂ#'á"ż8<-VŻřť‡wÇ«€˘*yęÂ7-*>őH‡ŁEŠ‹0ąđĐÖÚˇÓířaÇ)H__~ŔÍ1ď (ˇ»>Ö,×jľďÄ˙2™Žî& ăăQčĐHÓô<çU@Ű9Ř˙ˇÉţ&0f‚İ^~x˙i'¬<^.}-ŕú‹çŐ¸|X`^=–d^Ö=q†C śńˇ@śPăg˙ńJTţ>9ĄzXX%tÎhł˙;7wendstream endobj 61 0 obj << /Type /Page /Contents 62 0 R /Resources 60 0 R /MediaBox [0 0 595.276 841.89] /Parent 53 0 R >> endobj 60 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 65 0 obj << /Length 2013 /Filter /FlateDecode >> stream xÚĺZ[oŰĆ~ׯŕ#Ů–›˝_ňćŘJá ‘|lć EšÁ¦/€-©}Ňüű3ËÝ•V")É5qN"€EŠŁŮď›™ťťć]1zó^'É’â6!T#†M˘FZˤ¸ůšň,'ŚRśžM3’~ĘrĆXz>ϨN벺ť]—«ě[ńa4.F$ÁđŹ$'J(dH®źFŚľ~ĂÉÍ'F1Ł“ďpŤ1&yqĘüőăčjôݵśäŚ"ˇt[_« Üް ąô·ŰZr€’+*Ę*zg •h`,cú’ ŇFŔ“ ľËŠŠ ÖI¤n?.& †w“NYÎR”ô*k~ŠA™»ňŇ$ĄRH2ą&Iá AF†%V™& 3Ň Íń—‹ée¦iZ´‰‚ď€`>čC†ˇť^Ě®…`€ĎóŐĂÝĽĽ±w$]A<¦÷ đQU[äŕO«" -`u«äÄţ|z„ż“üś¤7ĺ.[Ć8Ň’Ď–# ÝÉ6čj±Ý‚ČFÚČ-¶we,2řř±lîJÇrË`šÁî’žäďXŕó/ź>î2ă„ĘAütí÷#‡¨¶cf–UŔé'‹l$˘[r;@Ffd–uś©´śČ.‡0ćIę}Ďpę”ĺîg7ł•ög‹ŠÄ†á›Ľ QŚ(5‰ĺŇĚe&Ŕ·uőPţ2(EĄuÚetó‚bŮÚ/uş¸ug>&X”»1AX+M$QîŰ`¨D’/‡Üóč Č9k.ŔSqµ´Xl€Z´6ó7_¬ÜYP7xâçNĆ>n Ăg'd"ş!ë^Ä9ç<-ÂŞ7qp~DŽõM­• żsx¸ h®óU=sÇÜĘ­4«ÂRo}≬šS,!4ŕ“#Ĺ™ßDy,j#é.Ü*ĺIQ\žżű\Ś[IX*¤!ś„!đÉŹŮĽ6úş“°×•GĘ\ŚF°śůFÉő‚Ť©¦găŞRB ¤ ×ŔÁ+ŽĄzzvRś´hr‰ UE\›×ŃôşňHY›¦Ŕ ľ^°9jƧĹůtҦ˘†ÍëÚŹÍ@Ţal [Ź ´h$^ę‚é§OăIçĎ -  ř+cÍëĘ#em˘ĂQ#Ö î! §…PäĄDϦ§ź;™Ú SĆ2Żt©×•GĘ: Hr˝ E÷ţňä×.pkD‰\е…“›Ů˝ëqěƇwę[đܰQÖď/ł/ąAëéĐLąŕ.RÖË4ČXtĹoăľä6°ÜöóÉ-vLr“Çş`üqĽ/ąq†éA’[¤¬7ą™Á“ŰĚ«"ëP ŃÂŹęóŮö`bËĆ”ŮzŐOŽh#v‘ŞY5{*ë˛Z´ę|áfL-ł@ĚjG m P˝¨—Ťn­qOnxđýŢúč: Ţ{c-Üge‡@Á aşâć)~´ž­x Ž;Őó yý´> endobj 63 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F14 43 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 68 0 obj << /Length 1993 /Filter /FlateDecode >> stream xÚíZmŹÚĆţÎŻđGÓÖ“yé·v›J‰¶In»·Ş”ćo@ba/›öß÷ό׆LŠÚ¨Ş"-c<>sÎsŢžcňíÝčŮ÷¶pÄiQÜÝŚ["¨+ڎÄZ]ÜÍŢ–r\1Á9-ż{=fĺăJQľXŤą-wőć~2­·ăww/GĎďF¬ řÇ G Ł qBÓ‡Ń˙FoßŃb6˘ĹË%ÂŮâ#Ö”0犇‘ä"®—ŁźF˙ieТś(cEČV—^„WZęxŮ—RA•ĘpE„2^Đ·Ţ`f ‹u°XB^‘¶4ŘÉŢ·Š)NµEGÜi˝„rD9™WLa•4„žÖ!#n¶ś· }ux ©ĂŞ”ňMŃ}đ6-{ÇöĘ|ĘŤ.4ĺDX5¤ IaŽ”ˇ(«ę 9ŘKN íMĹ­w7޶VËí:Čjnţ›:€żÚJ–ÝźÂíq'g< bÔ6«®‡ý1Ť‹É.8ő2ÖúŻI¸ë0~tçç€k´ t>É9XŁźÂżH}Çy7?l …ŻV”?Źť*'Ëő×Q„é¨^iŤ‹‡Ľ}µŽ˝űÝ2ÚiÓĆo2FQbś¸4‰ş7Ĺ5ŔFsŐÁďŮŰ{ ŤC]—nÂ7ľĂ%V“ŞuÔăŘęöM…işZ˝"™ÉFˇt {…±¤#čŘX’¶tĆsl,¬×бÄpv­ń»3FJV¦ÍéÁD:G´8—ÄÍWKždźJ:Ę…ˇDćČ,ŕ†_CÁ$꤂\(B­ě*Řa˛‡“ł "§´eí91‡$QűöôőÄTwíéM!ßűŢah©¸ŢřÔ ŮšE0yyyôä"‘ Śëkx-‰:é5‰ óCÖQŻyŁ09éf‚rŠÇŠzÉLŇÉşOOß«O%^+¦]v*¨–čS)ŰKĽł}…?6ťüJ™L{¶qH™ö˘×˛%Q\^8‚śiа„0ŇäÚnwş k™ć vfŔ< 6­ěٶÄĚwż0˛çP„ŮËZl˘ąÁa| ÖÁlH±cW"vR×ă ß@Ş–ĺc“\ëEKfëQ¸ „–OMČ›€ jöť˝±K ™€8r>âľÉX鳬%Ň˙˝˝=Ä!ŢŽi‹űhĹÖŕ‘yÝÓC˘"ÍÎłđ>h/.Wë‡ó‰‡łKµ&Ř•ż†é&aľÂ"Ú gbMd=)ŕ:`cŰáő‰•ÂüŹMÁňE,ĚđmXřlŤßĹ:—VmĐá«&čš$çýY8GSSÄ(÷çijGĐ1šš¶thŞ=FSëő—ŇT®-Ř‹=MS9&,*Ů@žšv_…¨v„gŞ]ýU5Ś}î^ľ×Đ3É:­'ÁcT÷ô<ÉX%#4Ő_'~;GX1ó ,:ÉX¬‹ö(«m~čZôľö äv˛íľ9ϱSÚ$˛Ók8©Ą§'ť”řéq'] vňí3"¨\tδÔ8„žűh©e]Z &ĐrRKu°ěéÝÖ1Î,ë˝ĹĘ3Q>áYĎ&ŞŤ:ĂD ë1QŻű)&JőżDôł};#l?—sTlń.ÔOűO U”S= •YhĎ–5Ż˝‘ÂŇżuaş§7đ(ď&ďýU®>ŽEÉxşn®ęÍdWĎâžĹnV-WŞś'€–Źáf¨Ŕ˛üîőÍ—ţű/›ţN]áÄňîż~öl桦ĺôń±AĚźżţ°™Ö÷k‹›÷5YŐ»L…bČ!đftcŮH|é‘YĆŘ•_…ON©WV ]2žĽńdř bendstream endobj 67 0 obj << /Type /Page /Contents 68 0 R /Resources 66 0 R /MediaBox [0 0 595.276 841.89] /Parent 53 0 R >> endobj 66 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 71 0 obj << /Length 2076 /Filter /FlateDecode >> stream xÚÍZ[oŰČ~ׯŕ#Ů 'sżě[v7äÖŤ[Hó Ř”%@–\‰^»˙ľçĚ…˘Ä‘ÄlÔ`a@’Ă3ßą3ň/W“ç·…#N‹âjV0n‰ ®0†kuquóą”UÍç´üí}ĹĘ·U-„(_­*n˶Ů̦×Ͷúrőzňňj ¬p´0Ę'Tq}7ůĎäóZÜLhńzB‰p¶x„1%Ěąân"ąăĺäăäť ZÔ‚eěP„ěDp‰"´Ôńr_J PjĂĘ  _Paf ë ±yEšâ& '#îP+¦8qÔ=q§q ĺr2Laµ4„žć_Ą ,Śâ쌒ڀ:9Ü”ň:R€ya¨ ZXŻäËOŢ˙^Y^^ ŐĎÁiöY ˘Ďú°N˛ęž° >ÍÔvßÇ/­j®5-_}‚,ßľ9Ę•"Öń‹M˛NĺŕPIĺĐwk€iĘ›ćo‚Ëő^ĐŇÉÂ8sńqu·„|G0xçP%aQśŤWI I–U)ɨ´‡PXE”Ň{*ÝÄmŢÂŕĂĆ˙€áb ŰŹ‹Ż¨Äbu4Ţ3ŘÂ6Ş'܆Śú7UôŐ§ˇ™„EĄ*´c ěűB-ĘŞ{Â2ˇ AŮ­xŕA(9ş\Ąëűvî~v€ zvy÷çÓWň ŞŻť­+8_Q~Ľŕic… ť ä®Äs)‰áĽĐJ‚˝~Ż8ĽÝ,š? –×PŰŔóŕóy.¶‡;qŽB1Â}\ó×űË tZš·¸ĂLhpٛŴm–˙ Ýo<’Jńň:Žp¬ ʎÝĚŰ!ĆŚ·ĐY\Í]śGÂó^ď«%1FpÄŞ`™. Đ8ŘňüŤmh‚­7h ˛\¬ŕ3g#1§ň{8ŚTgˇ;żŇ Ú=Y– ĹÜĽŢ=÷öńxđ*g"Îeö<‚Ś…úr ;b “ÔÜAÔłŃ"[d+ĘUN•ÓĺCós”azX «[“ůün y÷e€DZ˘´‰“^€T ŃáÓr˝HÔ#Üm×ń{,#´…™ŕ°^Ůz؆9[Ľµ€[_—ř™‹g,¨á9SAçilš}ŰvśĆöń+Ś.sü‡ßq‡s ŚIÖiŚöw}' ¬ĐÄíšÄÓÓ -ÄBź­Ń)e 4ÚG(°í[ý¶Á–ý®yj?fŞ}ß@0/z’¦bP2®/â¦$ë´›$쑍÷¶,Ř‚ú…úۨë.Ůţ|ŇîqWw8gG¸+îĽÁ,BAîsW,ŰXż˙ďVžˇ°łĐ· VPµËĺúń,}…(×ěŇô•ý5ůël˝\z ”ÇÄĆvüݞ6‚6ĂĹ%ř«…ÜóWöů+9ţJGÁ§Á40?é© 3k=é!†š›1Ňň$iĹrx’´rAśčN4f!”_’XŚ”>=Ú>Ł®P ä8˛7–ş ©dcEä?ş߲nĚľAwŮ>Ă[ßUµ¤ č+rW‹ÜURéăow¬´ ő­Oańy˘°8^53řön§‰«b¸§É[ąµ`Čď§­;9ÇXkśq@ZŮ1Ň:ŘXÎz‘“W.Á¶ôĚŮ+׆09–´¦Ů!­=aÇIk_ ­LB;{…q”c® łB‡\h’u(ö~ĘŐĐwÖ7/z;˝ĎQXFquEmÄ!¬Äw…ŻŰ ›d tŰ(™‚Ľp{şű˘ˇĂöëC›jÁ6wň*¨VdâÉ«uňĘ!Q¬’—9yí ;~ňš&}˙Ék/ďţBgŻJP•ĺŻXZ™!ÚÉěą«T‘Ŕ`Úîj>8>=_Ďâă€8dü‰ä3”gB'ą‹6~Çő¦«áB O­RG~ąlîš6Ův¸5w™ÎE˛Üřm ~8Ô9eĐY´Łś)Í˝BćĂ•lŘü†ůŰvăŹĚĽ qŽ•3śŮ˙F2–1sÝ7§)'ń‘ŕ¸ë˝Ó˛ŢQţÄô›(ěł vĹzçŕwD“s•ăľ±{®QŁîňÎ/č:ßäU‘qGóľ±{®‘Ž „ŰŇćxś°”X®.ÉŇĘĐ#†lv€Ýꋌď(1ÝoăViéő¬w6·[Ó6ĺ5QG–ăäV#Nsň`¦ăŰ}éÓży¦Ë™µ7qb =íŕ\WĐxćß§¸±ź7Ź´xĚŐ®…‰Ż Ě?ÚŹéÇţqˇŽręť ĐT!‰łĚ¤ôy‰˙Ŕ˘éP J–÷Ó[ĽjÂŐc%(äâîqx¸j6°ąľ‰sí<Śş`SŞś'…—÷ᡏHřţíýŻ?áýźü:Wt€™űęv˙óóç7ŢŇĺő=ţ¤Büúë‡Íu3Ľ+7· Y5m¦1b-ˇ2´ş×ęé@> ßśR]ŐV ]2‘Ľń?dUÓ~endstream endobj 70 0 obj << /Type /Page /Contents 71 0 R /Resources 69 0 R /MediaBox [0 0 595.276 841.89] /Parent 72 0 R >> endobj 69 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 75 0 obj << /Length 2723 /Filter /FlateDecode >> stream xÚ˝ZŰrŰ8}÷Wđ‘Ę„ q#€y›Ś˝UI%v6q¶¦*“E¦-MÉ’W’Ç™żßӸРHŮ’íÚJU‚`ł»qúrż=?zó/“ŮŇÖ";żĚ7Ą¨l¦uUSgçßr9*ŕĽĘŹĎF,˙8*„ů»Ĺ›|Ó¬.Ç“f=ú~ţţčäüeţ±ĚV™Vş´Be“ëŁ˙}ű^eGUöţ¨*…5ŮĆUɬͮŹ$aťüđq©ów|ü°­$ŘE+_DÉ(ëa%ą"«şŁäńrTpťOnŻÄ„Î7€Í+R8łÉłZ”AVą‡fXôózŽ˙Oń¸`ůEłmťŔJ°˛¬oÖEY=ë: ­Ëšu!rě3ëěnѬčâŘ+ ›éöb$čľ3ąă.ř­ŽđÁőgĄŞˇÍd/•*«-NŮód‰°Ä!Ž€ÍöŤ¤Ý©ßĚ‹ć äuľ×7›•źţl[w(RV•ĚÚđ{zKîEţ±GÓ ­WßťűjlŞÁ‚Öň>ŰŹeĄë¬FŽČźG ;şˇM^aogÍßČî2]î榍ż¸ ‹%­ťÜb żˇ&_ţř«qÓázĽ^ŹâĘŮxăî]ř[włÍÔŹ6ÓŮ:ŔG$Úq2*Ś ÂdŰŠ˛ć6¬+ýý¤¤’aLh¶4Ę[ŮBz ©’ą ˛ÔÂRg%!´éž3“ŤŻ|~ĹňǨP*˙«™„‰ńÚ ˘M°¸đŰ:Zě^AÎ2ZTe­Ě°Őf§ŃE-ęü<ۤĄŹWgŠŰ§TkŤS-XÓS„U¦Ô†?ŞôUđŞ_6žĎý{ťeäq¨©€ćuXłt¶7a}űë˛2šO ë¶“&˙á,müĹ$‚Ů˝;ráç)/ü0ŞDb&ËĐÚüÜř›Ë˰k¦Î˝¸¸ÎôY7±P>]nš{u¦ăĎrEĄ¦Ę{˝ 6=[śVE[Ű„Śľ¸7z±ÜŻ×đŽćŻOǤe„:upă…˙]RŃş[ÜMđrŰĹ’™={d©–ó4´nWÁ»Fä˙YhÜ6ż†‡u3ôxFGëľ/ť#6Żľ÷ÜPŰRš¸đ7HÖ<żqÎXÎĽn­ţ ,ĂŻ‹e, ń0#CŻŕÎ[™ŮSTÉm¬ćËŐ€aČË&nňé×ú&§±°âµWwvé·E ťˇélai_u*c{„ F1NCbk“6śĐăŰH‘)RLŠ”,¨BĄÔľä[ĺ!ń‰\8^ŤŻđ…őŁ X,}ąÝ6@šRŐ:,:źyŁ=RQĺWvŘÖPkŠ*Łâ6żťź~÷öëůIżţIŕ›gU‰sţ,C٬"Öł”ФBG×ě´”#‘´$qBí)8UNýX§wĺĘb?Ú‰ _H¸ËďX†®ś q8ČÔ0Ѥ—o¦®ÇĽ˝šĆëŢŐŠ„ĺíE Y»|H|Űz"ÜÉNϩƚ.*îfóyčé©aE°ą gŔŇ“©ń,týăŔÓ Ńę,.=Ş-Üç÷đ.úĹ+ô-'žýt_Zćnčt,hˇB&ĐTózŻXDÝÜѱYE"ĚC4MAš•Złö…€«–žĚ›¨ĺé—Ţv™şlŮâm˘—kę^)|>“ž,ë>lP‚…ĐŰi™jďâęű¨¨+ jÝS™GÖzźd^+Ŕ2n㪹i±°Nľ!5«R €  ©ľD” yBŘ‘nTÓěpľăĄ¨ŘŁ\ś?´AŃ6x-ű˙ňZh'µ=áűFţşs#ĄuŚźŚä}¨z ¸aúŤ(8[lçO–1UŽK0ű|ŞšÚĹUă’-˛*w‘Ő˝uŰ÷ĽNsvŔ—~Z=d(©˛Ź°U.Ŕ0*¶'[Ť«_„­&ÂvłŐT?ĎV3á°x'9µ¦”őÔ”Á‡˘Ţßş‡¨iŐł®KMąĎô©užš~Ząřłbňç…︎ą~• pćEv+Ęzx·$3ĄˇŔIěé0P¦» Ô7Ô+ZÝůś÷+MýôČxń30ŇŠ rRśiĐ3#Ü×ĺ„•®žFGQňč¡ăµ`véĂ­ułŘ P@.Ľ*űQ@ ±öÔăűÝiĎS($y҉BŤÔâ•W‹‘Zľ±K2„ő‡I­oŹ_?ŰůzÝ®Ű/ćŹĂhÖ}B¦ëů,NEB:$Ęéăż—VťĆ5ziCc 92$ş‘Sb-ďž`€vYPLßřö€TĄ2űŃL‘ś@A'ףHť°L3Ä2%ń/óËD,™Ôč!XYń,öe‰°űr-­Qí wł/P9űđɇh?Żď¦—’ţâć% ڞ4PJ¤«÷4Ąô’µu."Ă'!"ﵣŁśö‚n ©tzÔ‡SM‰V8&ťSP­–D´®¦ÉÔÓ”®—:€iJ¶h^şdA<©ähN–ôůĆëSÇá°•ćĆţ§ď"?Oi‰„ ˛i“rIy5t…t_[ÖŮ˝)%«Ń˙gÔ}i-žE)٬"ÖŁ”¬†¶Zµ/|2Ąětăŕy(¬Ę–Jɧ˙ ^ä÷‚Ľţ* sp<%Ď=”eĂ™…JIdí«Xpu7 ˝ío.šUř`@kÂ߆Üł Ąňöć7ţ¦K¸ř=>űýš˙%–Śŕ%:ř&´nn~}ó†=ńćÉ •ČŇ˙™ĆíjŇ\.©.¬®šrŃl˘} 3™(+)ťÄ÷·É'ůÚ˙ňŞŞG…Q˘ÎYKBţnî__endstream endobj 74 0 obj << /Type /Page /Contents 75 0 R /Resources 73 0 R /MediaBox [0 0 595.276 841.89] /Parent 72 0 R >> endobj 73 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 78 0 obj << /Length 2580 /Filter /FlateDecode >> stream xÚĹZŰnŰH}÷Wč‘Ú ö•äĽM/ ‰ł‰g0@&‰¶H˘V˘ÇÉßď©®nŠ)›I ,XM˛Y]÷ŞSĚ‹ë‹ç˙Î'ERX5ąľ™™'*-&Y–&yn'×óĎ‘žĆBI™FŻ®¦"z7Ť•RŃëÍTćQSínĘYµź~ą~sqy}!&)ţ‰I‘N2“%…2“Ůúâżźż¤“ůE:ys‘&ŞČ'÷X§‰(ŠÉúBKĺ׫‹O˙iiÄ w¨Ľ V±·ĺ•‘*I­ql~¬ŔgÔÜíŔäLć*úcZ¨\ÝUżx;ëHŞd’gŽ˘—?żşz÷©Ů-7·_xkG'¶Ht6ţć)uřÉ(˙tp>“ęSXżsWm‰UÇőŢý…J‹¨Ynp÷vË"Ťšď 5Ý.×´ŻÚoˇtľ»ĹÝť{;¦ă 1™(‘Obł kćŻTčŻl¶z×ׄ´î ćęýďoßöř–iRHáw$} ÄR‰M3ś*qŞpű>L•ŚĘ]ą®ŕ%űG-°©çŐ¶ŮőÎÖyblć7]/ŞţéŕN·dŢ×TFóŞ/VA÷7¤ůzM:ŃŃýb‰«ŮTfŃ‚µÔÔü»«`Ç`ŁČá+~ĄÁÍ…_łśŽ“8°&MRUôă@·qí!(ň´ő—ˇĐ!äBAd“˛Y[ zíY.jđ%żć”-aňD 5ž7et")†łL,ÖđŁBž%ć^MAŚWn·4U‰ŐŮ!ćńÄ;3[†h“ u9ű÷ĺź®>Ns]÷Eú0Y»űŃd¤#äp: ´â±ţăÚćGü}úpůTXxY˝Ů7nMéô]7O˘K&Ça"¸ýň+¬¸^áŹsoáÝ»+©†^DˇÇKŞay3,i Ő“ôEŤĄ”Ĺ‘¤·!X(@Ţ2ŻłŇ1ŽÔEĎ8z»‹ěťgśČ©ßPu†ôß¶.&«~ߡ5Ţ ť@uůöňÝĺű^ĺPwľŚĚ’L‰1‰F¨|8ŃZq‡ÇX‡+%ŠDZŃ褿zuŮÜ$Zżęç„J›|ż]_|ýâ÷ëË^Ĺ€ńRTҧ0ĐzPB-4Ţ+ađ€Yąa«.J2kK˛wÉ?}ŹwNި'Essę¤p@]hÎáy4o[pĘi4ŰUeăņD‚ý~WßQSľŕ=‡P8q]ŠhBęzĹ®;»[Wj…›žśĆ$ifCŤç¨ěěn\ą|)Ś$䊏Ż)–Wß<ż5żW.7ĚoÉ÷Ň= )8ĺT‰;3N•ţXČ>gőIä|uăw{Nú=¸+ÚvĹÁ”Ő ŽŞy/l0ÔČQ.Tt¦š{Zq‡X2ŠB%™ÖíÎÁśĹ/WUŕňý§žĄr úţˇĂm¦Ik@Jň đ(7Š=0¤Ą˛S¨‰ż¸ĆŇš!€j‘*… P3™Ť¨Ö*Ö«ÚCP7D8‰’kąŮ·•ąy–TŁëݨ ­B sĚŇ™°Ob˛@ëa“©‚0ű±Éş`V*ôS]4űĚ÷RťÄ%‚Ě—MD* }˘…öPu¤Ę~R(¦w …ęl3ÓžŘ*5€čŐ=±űr±\ÍPÝĄsnĽG 0^ e{ˇÄĘo;ěŞ'ÜC#‡Nžůá|őä~tfpâ BŔQt(4głŻ¨˘5{"”üă,K‹™ÓEŻrB‘ťĘ~ž R7ôâ}»éĆ 7Ńa”ŔÇ4 ż¨ľREÝ7ÔHµ L 8 |"0‰Éľs¦10µĐđŐ‚FVť©…S‹Ó‰ĺî?›ˇH56÷eźŘ=َěqŔ­¨ż­~\w’ ;8ô´vOYG®¦•S•%Ô¶âu€°ăf§ę:Ěű5włę”4™vm“ě@'ńů÷ą!Ú:#˙h";ó)Řá> k–¬>Ä)†;lďßͧ)z=5y>§4Ć«=| ‹µ” Ký̇ľŁg ‹k׋§ŮÁ„i­–űćř©o !ÁjŢ~zÚđ\‡†Tďëćđzł8ś:ÜŕĘ´RŽékm!:ő´íńŹđ7@Ý÷9ÍŢeMǬłÂ‡ˇYů.…ŻÉÂw ⨣‰UöČ~ĺꀻçnK-±E5Qąß•ăRŕŤ¶řQřŐݶămsß·;äíĆ n—WśŰB9š¨ĐWúäÚ–‡_)=™’ňČŠ5G÷á}µ0F;ÜŘk ‚h¤íoeşÄěFţVoČĹ„Š^ßxf)ń4ˇ«,Éőq|śťÓXWđGř\jôă>'~Đé¤Ö'Á•r–÷¶PŃr˝u—µË a$ĺžLĂ ¸ćŚ×°´»rs›Ű!L $•gß;µŃÚ¸â#ŃT¨qß`ÎNm­¸C¬7µŃZž·:n×> endobj 76 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 81 0 obj << /Length 2547 /Filter /FlateDecode >> stream xÚ­ZŰră6}÷Wđ‘Ú„Ü/óćx4§<öÄö$ŮšĚV˘mUÉ’––×™żßn¤@‘’µËUE‚ŤÓŤľśôÓíÉ»Ź6sÄi‘ÝŢeŚ["¨ËڎÄZťÝÎľćrT0Á9Í?\ŤXţiT!ňóĺŰ|SVw“iů4úvűËÉřö„eţXćhf”!N¨lúxňź“Żßh6;ˇŮ/'”gł¸¦„9—=žH.âőâäćä×FFBŠDĘOĆ6Xq.ŐĘĂĽ.gľy®ä@Z‘˙6r*ź,žË÷Ţ6‰¦‚kL…/ť/7ß ÄÂFMrş šĎAsšăl÷enVĺçő7źü˙0jľĽVËđX™Żî½ÍĂöŢÝj_+´ę ľ?G5î#p&ŕ’8)ł‚ÁT˙“2ÓŐ/xţǧ‹ÝEÔ)Yf¨ 0Á« Ł„í_ŞZT±•–+#%ĘÖł!¨›/ggă››®Ů5ѬFţ~Th-ňۇ/ŔxëQÁM^V“ÍŚęNWŹëEą)g(*+4#ěĂSÁ>OĎÓ)Ú×çîM˝ř>˛2']ÁpĂXF¸ĆŔ[Yű GxP—żť^śčŕ’†X>¬ é *EaZ°>ź^ź~ߎŻ;+â¨Ű•ç’çăy',Żâ"$Y@HHT6ľ˛\A4ń|V®7UGxÁP<`K]cŐ#’q©ŞE–/0űŮĂ|f© ŤÎâŕůSO˘ˇ„˛ŕĺ—‹‹Žâµ>‡d3Úšč’z—ŽČ~ĂřäVŘ^§ŚC×ĎçăëÓëłź˙Ő§,ávlAÔah'$kc»˙úe|sŰAć,Ńj hQÖAl’2bśia_w†)˘KFë*ńbĹä{Ě—xË`éń)’ F”Ó­PaÖ Ä[űo`ݤ Ć”µëÍ@Ś„éCEĘńrµ “V­“†§xŤ1!ÖŇ%>ăľ\â[[|YQGoĂok m7_b´82¸!a@¸íL‘kŐ€ĄB9E”¨'ÂöĹe=qý~}uůĎ0aPn`QÖa`’ žź"űpuöĺÓř˛––ĂkfpQÖapV#Ô-pG„eÇ PĎ˙ŁŔ]׏‡ÉS `ĂF١$L|Ŕ(<—ĺ¶hú»łÓçÇ2pwĽ­CTMâ?Ć$A«ë Uů#ŢślB¤z´/}„ŔkhlŠÂóྮŻÜ1’ˇŇć`ˇ4„17d@*HÄÔ[a{2ńÉöŞŠ3˘µU”uz…źŔútőáüăůŮéíůŐe7"ˇerڞt@öEŕéĹĹŐďăí•ĐŰ*ŁÁVË:MBM4ŕź)¶·d‹‚SQ¬ÝÓ )bKJŃ–ĐŁNfĹj‰5ö{¸łŞÂgşÖĺkLU“"ü0ěW­a=ě sĄŘöłWuâű÷6×Ě1MÜ×ýőSL,vŮ3|Ŕ\˘H! …˝‰2…c|@¬ŕÓ>PŘ Ű›âş•ŹkbťV”u–Ć…q–ŕúxőĺ˛Ű\*Ćô0Ȣ¬ĂČú”l!{K”AmiŞPUŢťaLĚŃý˝ĽP§áĄ¦˘Cb­ÄëI,ŇR'Ű4uŠĹŮË^Ěö—Dˇß{[MlĹ'÷[yRąŁ±ĽI5y,7eőôęîŘrŐ?·.íjjâŰÉřn‘Ś Ź6đ¨/‰XČ!Żw”îşÉă _ĹÉ_pă,ŮĎ˝Y…'~C-I-q‰$Ś»ŹJ™ ˛3‘v(¤k°"Ú˘•˘Ë¤uł×íÖ1Ü˙¸tŠzĆýIOŢ@…jłÝ˛´Í€T˝MU–}Ú0* ßŮ*ńAq”:řĽiăî¶°iěp‰ŠÂĹĺ 1á`Ë*ĘiŕÂ5®F·?…ů9ŐÇřeuxzX=ŹęŘ5Á9kë۸€µŻ*17h°ă®ë§Úޤί™c€JU˙Ë|±`H­·?©ÂţölŢtşbT§P¶_“$Xüę'žĐł\ĺrZîqţťÍ~ˇąçÝťd/›dĎ%&{<^:~íŮďOůDKbÁ,:lËI×ĚĺŹ& b„Áł ‹á¦Ł± >o]?8„A``ď¶W•‚°pG÷(ʡ´á¦˘Á“¸`¸eŤ2‡˘ë¦"”´?>_]Ź ¶Üv5đ˘iFQqnŻ÷UÜZV‘ëÁ‡;gĐ:¤řn>ŹĎСŤĎ6&äWX@—Ľ§8ŃÍöîü/XµGt) ,FBŞ7řęńŠI (Ş_±(ŞŁW 7Š8+[zU>O­çdęăâ ‹X…â©m 4łĽf”RE{YĄuIJ`AŇáĺNÁÚît:ýYůřd–y’áo`ˇgůŹ!™ŔŘţÁČ\5IF#ô¨¤ŔˇÁ ™%Ňţ]Ą‚¬"ÖŁô‡([=hW-f‘•Ĺ\ë‚•đ}×ě(…8dmÎů0 %Âö+Tę¬×Ŕ}ŐÚ«Óq‹Ä ›TjdĐ(Śi+‡í\<łmžě¨ÎŹb8±]• ˇTfIB}{f–<+ÂkŻ– Ż(ß_ϸR`¶µNz ~ 5-ă‚×'˘×#ĺ“Ídę/°áUş‰°.î§łüŻůS> endobj 79 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 84 0 obj << /Length 2342 /Filter /FlateDecode >> stream xÚµZKoŰHľëWđHí ;ýfwnÇ8±×QfČć X´-@˝oţýVőjŠ”¬M4`‘ěf±ľzWuţŚŢĽ7™%V‹lrź1n 6+KJŚŃŮdö5—ă‚ ÎiţîzĚňŹăB‘_®ĆÜäMµľźŢU›ń·É‡ŃĹdÄ2 ˙XfiVŞ’Xˇ˛»ĺč?ŁŻßh6ŃěĂaMö×”0kłĺHr®ŁĎٶ4hVNTiú$dK‚K$LKn»T `Ą(ą"B•HčĚĘĚbíK —Ĺ-0śŚ0řkv‘1eg"KHćM(I¸±ĂĚiO¬0šhú>bîU ÄüUŘ=T CJiZ V±J9¤´–yVRNŚdęĹ_7×·cĂóI(čĆÝŻęQĹř &‹H«H đ§‘Útřű|sqÇË|Wć ˛ ´É{Š]‚ ąć˙­-đçS /˛|Ví"ă%ľz<0I(Řń °@އ«Ă/±Fvp­Á§ňj lÖc`ňűXđĽ:śĂĹĚcěȦ4„šńßTŃËż>^í×'ŃX uXa bĘ®AˇÔAOłęđË„ĚWńÁSłţ9FâÄPăţµA8FÁ>“iĂ|ĺ—ŕRĹ–Öc‰ŕńs=0śiPęô´E,ŠpĚ,áú,š©ě‰Ŕl‰íGötážR–ůşjž×iծ쀢@ÍD›c» €CB©Ě’¨óóáKrO¬đŻ˝Wqż˘|ĐG®¸Ú Gnł7ÜkI˘…ÎíXˇGÖß!›L>ő?wŃ)ÝÝ=\Żqg˝ÄŔ‘+żŠagľiüM}ďw|>sŻU«îâ4řşHŁ€™ŕë.Šń ™ GnĂ>âדT^H°I+•÷7ĺmó¶B~—5&ďďřŃJ&­d"żĂga˙Ä!F´xÓ RĽX P6H«ńd ”ů#ĘDo"ŕt}07Q6‡ń¦t, 1Dv,{8†f:ě™/€Ş}u¦óo«ţWKđÔ@¤ˇ!8‘Ż_,˘Oîw_cMźžśđÝßů´©?üÂşB –¨A›;ŤÎüB«,‘7pěŻQngĺwb™“Š8©rÔfă^p“3ů…€ –?8"k˙ő< ŚHyşňżÎƵUü¶{ ŕc´Ďz^V^Î\Zˇâç‰ĺ9#ň?ÇVĺÓĹső6(“zJHSFą~ťŻšo=ŃCś€Ň(l9 ÜcąaˇľĹŻ=Të(÷§VŽ›ĘCĂ]óŐCŔ ˘Čť‹ ô™íłű=k± zőg‰sCd˛RşĽbą !•}„xÁó™Ş> ÉYA¶µPŃ‘y0{2O U$Ä|pM5 iÄ-®Šűr~~ńůs_ň _™;†„&ň š¬Ö ż'—“Şő´™\Ýâ]˝|ZTM\ FŃńŻÍóťóßĘ…¦Íýłłăc#cŔHe\xŮťNĆŞ&FO$ă„Ř>Ç-ŽŻOž]]ľë±&Kbři8ó¤3¦|Érvsv{öńbrqŰÓ?¤mČýsÉó‹ytŚ˝ $ôĄ19®b8…Ú˛ź˙’ćR©HBĂéP ďňŞ\ÇşŚÍ@¨ˇ„˛6mąşęÇx c¬›ŔşöhAŃ ő) »U®Nd[b{ 2lq"¸îq!Aks®­Ă\AooŔ S¶>^ż»|y~6ąĽţÔŻŇ!Ř1hfĐB]Ď®®®˙uŃsdÉ Ô7ú$ĽEZy“ú 0Ď”·‹Űľ3E´e­÷ł8öőŠuőAĎ•<ńń:äŢyłńOÓu(ÂÂ&&g S¬:‹zµ?č+ ®NôˇJňT>¶%¶×ÇÂďc“ľ“ib¬9 [Öa¶>´á„Ż÷×_>őS‘jLź†ł@ë0g .•ěpö3ĚĐY7Ař˘{—ŘV©ě6I@Í{ă릀ězÂtYÇę±y %´o˘|ßŮś±¬ľč|ŔťĺQIZAŐf±ˇ’ŞThĂA°:-őóĐśNM×Ó%T^ëÍ«UöŞţ¶–ĐŹG.'±3ÁćfÇŁ‡*çN_éWë´2mÂZ\ ‡Eřx§Ř—ę‡ ­q:ˇK'%QJżŢâE†] ×snA `8dѲŔuąĐâu·)†¤Z§- U(Ń Ҳˇ®\S™}ŔŘnDHuşŢUţÎ ,KŰV9 DF)$u»ő´"řŤĺDŇn+}ŽÝí±DŘϤ*‰`ťÉÁÎa… Ň “~ů¤!!´ď¤!nŮ9i°űNŽćí¨“›Â}ŇvĺĘ xđ¤›mřúICÜ}’“†„Řţ“†”żżń¤áh`Gś4ěâ(#A´˙ďĚżÂä—0ÓIJX˘×Ştôf•TéN†‹¶Ňv=ä˙xľňÚZĄ±®Ü>Ó3ť©ßâ‡B -čÓJÎw*µnéfđL˘Ľ6Mż&eAÄ‚FAóÓ˙‡˘tŠ-!ď‡*…ž›±Ä !Q–…’ué&¨häPŁOâŃÜ˝ŚE“k—ýâ 'µîÁ)ž»j§TŢöO~Ń»™Ěß]ź˙†Ďs¤~2+3Źh{ÍÓŰ7ođŘľ|çNEű~ýĽľ«îk¬k×YUÍ€áĂd‚PéĚ7G)2śµphzĆ…QBç~€ÚřŐŮšendstream endobj 83 0 obj << /Type /Page /Contents 84 0 R /Resources 82 0 R /MediaBox [0 0 595.276 841.89] /Parent 72 0 R >> endobj 82 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 87 0 obj << /Length 2482 /Filter /FlateDecode >> stream xÚÍZ[sÚČ~÷ŻĐŁ8»šĚ}Fys9딛쥒<° ŰTa`ŻOţýéž‹Ŕ$Ńž:ĺ*3HŁžŻ{¦»żnńjtöâŤMr’k‘ŚnĆ-4OڎÄZťŚ¦źRŮËŕś¦Ż‡=–^ő2!Dz±čq›n‹őíxRlz_FoĎŁ3–PřcINŁ É…J&gť}úB“éMŢžQ"r›<Á–çÉĂ™ä"Śçg7gJÉ*R^!T[bĹE¸ T+óşśéöq ŇŠô×^®Ňńü±x‰áiSŃTpbMKáĂźf‹í?©b a Ł&L9_xÍg yšăjwĹÚ_\+\×]ܸ˙~Ölqç',ţ¶2]ŢúkŰűݵŰĺľĚ—hŐ'|~†jÜŕLV€K’K™d ®pŻúgĘLSCđţâ÷«ËýMÔ)Yb¨ °Ŕłł„mߪ(*ŰÉňŰU#%ĘĆŐÔÍÇ~psÓ4»&šEä/{™Ö"Ý8ă­z7i±og`Tws˛|XÍ‹m1EQI¦`FrĺíłyśLЦpPqnŃÔóŻ=+SŇ4pć םµa„ën Ľ“uČŔa†őî×óË‹× \ŇË;ĺ%EĄ(ěC Öűóëó«ÁhpÝŘyGŤŘí<—<̢ź°t6ˇ„„@eĂ#‹%xO§Ĺj»nĎŠlŐŁ±lÉ8áTE‘Ŭ޿źÍŔ´!UˇŃY<Ű´J(‹ß}ĽĽlŕ`!E´H>Ł­ GRwq$ENDżnÎäNŘÁC¦ ®_.×ç×ý_ţh€S–pŰ 6/ę84’Ő±]>|ÜŚČrK´ęZu›¤ŚÜÔ° ®›ĂŃ9+¦q” 1žx’!ËĂbBÖüNtĆsźłđsě?¶§ľ†P.ÝŹ·~4/0Ű-Ă×?wł OáÎ"µ—¶©Iťô`â=fľąĺ´î«·-ľĘ EëSÜ_r˘eLć­nĎÜčd·K•^ΧăEüśřLł]"= ¶9h¦ Uş¦âQ `{”6Gâ„„ <ď0L(+Ŕ{m7a˘"ěPS×o×Ăw˙n†•w,Č:LR"Á«Č^űŻďšQÂrxĚt.Č:Îjwú«ŕľ'J(Âě©Î6Ńáž0 Ś7žv1¨Ś®‡ŹÉÚĺm !ăkpň[řľ^>ŕ‹ŢŹ×¦38¬˘Xľ´đ÷0\€OŔhňřP!Öţ®cŕv Ťč?ĺU]đAK%:ňŞť°^¦82l âŚhm»AdGŲᩭŔşľľxsŃ?] ß5Ý Ę°Ľ#€AÖq€9˘đüňrřŰ AĄ%ÔËĘčN°EYG±IÄŽgŰ÷¸|Ć€ý(&N÷Čź;˘íRžp‰Ű•żŃ˝]zĎpä ^¨±+kQ7Ňá¸`“C ČóşWÖđ ÜŁ7WDPŹ˙}„Ť×ă¨×›g‹ţŲ]S%€{EM±đl¬Ś]–bŽ(ٍę,´ž0dÍ<Ó mâś9W0^ąpW,¦xŤCŚ -‚E4ň“.Čis´:iŞ …$Ľ¬xt đݧϫíVÁ|ŕ–Ż-÷ đ€fŻ%ńŠHΛN"K'áť›PR‡Ż-]ˇŠ ç Ě$´Đľx“ Ż\Ë5°‚ęţÓ}X p“± &µy;8í…ePh¨č sŹRćGav‹˘"‡=ˇl hÝ Kä/<‘ ˇŕ÷÷Ăëžĺ騩¨M9ű„HĄ° Ó©˘¬¬"¬ÖW ŞřnŢúŘN¤&}…G;ŠĂPłĽňp® Ů–Ńć?0ídÎ×XđµZ’€€‡EűÉęIB1 µ&‰ «ˇ^ ˇ€›\Ö´»oúą`,±Ć¦@}óŔľyd ź©˘mŚAŞś0`ň]lZ”u|Ó$„g-曆Р?+ţ剞P`‹… pTĹĘÔáć`@…p¨Q'¶Ż€#”ʤr®żßAŔ]ť° Ëź÷\śŻ(?V§»°Âe•JI0­N„6{ť?`±XϰŘĘřľí}{í/¸ňOY0ÎÖĆmU'PÓžJjpS#IżoĽŔI8këž( Ň,ę…6.ĺvÄŞ*pßPxî»Ö!=9đvP{×áÓ«V58\}SJôZěe˛’J,*9­F\€H ŢÚf?Ţű5^~śŇttýqĐŤ&äŃöł[żąŰVb ‰1öY+¸Í”ű›Yľ#P9äUÜwůaą.Ân×3>VJţAWeŢ;-D]l/Ux]±~šmЦp3L$‰oÎ/om<Ś)~„‡q°ĄyĽK&mĄ2늇m—ţĚýőX¬żú!ŁńŚ7L\;Š{„† ”Iü8ˇ©:Dhâ”=BĂš“±ýO ú‹~śĐpµÔČ MśÝ ˇ©;LhŞřˇaTµ–ü\ÂsÝ Č(ë8H.)Tצ˛žŔ÷xŚ„sRľm;…iII·§«tŚiY •ęL O®Ş4AŚËEQąg ŽŁó)V;TR¬Ł;)Öá:b±ôç^¦•¨ŃhÇ»¦E±Â‘9ĘŔ*ŽřÄŔ5DŃĘŔ$ä} ŮŠiáúlh’ľ{gľ(6é”u\ŞçéU[żˇJŁçČ:*4Ş?_–5ąC [€?ćć[™b4áJą"Ľ)ë}×(˝`×NݡV‘ź* "Řzý»çďă•±× ËűqěĚVеĽ;µ`źhpw[45&śŐĎňŘ·v·ž8«t:HŘé]/çćSŕÖŢC(ś%]ç9ĺ*¬SŤĄČs˙Ü–”2Ürżż°4Noč`ą;ą'VrVměń|łôŁIĺtřŽH¦¬Nßôl`Ô€`'lÇŽÇ!Ë…żíĚŕĹĚđß]P-4Z&ńw"ź)“oďĹÜNdË(îŢmČo;š;P(íZ~·»ZÂ[u6ČRB%oß !Ó×Ă+řÂ]ł°ď)®ű!Ťßű‡‡’yMý/=Ú(€ě1 J2%ä—F^N¶䣏J$É-sý°(#wŐßȱÄŇ‹$ĺ»xČŕŰSOPôžň¶żąŔ®ŕëO7ÚŕFĄaĐ ŁAç+ÓťW…ë˙„׊ďFĂa ˝¸íęĺ‹SÜF8:«•?s°ţňq=)n—čM뻂,ŠmËc[Ů&¶Ěg¤·ŹľëvEţě?ˇBŇ˝Ě*ˇSfănü_‚‘ĺendstream endobj 86 0 obj << /Type /Page /Contents 87 0 R /Resources 85 0 R /MediaBox [0 0 595.276 841.89] /Parent 72 0 R >> endobj 85 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 90 0 obj << /Length 2341 /Filter /FlateDecode >> stream xÚÍYYŹŰF~ź_ˇG*Y¶ű>ňćc ذ=Ž=Ypü Ź¨ŚŤ8ˇ(˙~«ú H±uÄăě. Ś)˛YýŐýuńÉőĹŁçvâÓbr˝0n‰ nb %ÖęÉőüC!§%śÓâŮŐ”ݧĄ˘x±žr[´UłÝT›éÇë——×lBá›8:1Ę'Ôäćî⯋éd~A'//(ÎNľŔ5%ĚąÉÝ…ä"^Ż.Ţ_üÚÉ(AHŮ“ňˇÂÚ+n¡Zyď*ŔY´Ű@®¤Ĺż§NłŐ¶úÂۦ§©ŕÄ[áËŢÔóę§ŹaYĎŇĄM\ô8¨~ű¬ę5ěSáYÔ‹(ż‡N˘ă{ë–ńb^Ý·Íx€aÓu“Ę §*.xóŰ«W#śÇY\AĆPJAˇĘMJĆSÁ\o§iÖĚî*pâć¤Öőř}]ßVăÝťěÄĽI¦+WI˶î[ě\Ż+2FX:KśÓµćUu?-ą1޸~÷ŰĺhĂ Ä_oE÷Ş Šnw×|ş…ßźÚ&ÜíÍ›%ĺý[Şd˘çŹ_˝żĚ)ŻĄĚĂÂpöć=Ť!”ÉÂőA|ËŘť Wg„ p=’L.ka µrśË˛Ëe.1—±zHfŇą'ȧ33pˇÖÁNäu{ůĘC@5F8üĺű°˛„3q>6ˇ$áÖĺÁé ¬’sP–“‚¬pçÔ¤‚¶S“Ă“č1Đ“"źh¦‰ĐˇÄ^ţţöęÝÔňâz¬¦ńŃ“Vź,§‚(Ćó5É*{Â2ř4#RŰľ÷o/źb™âÉŐU,@Ěő^‚´R4đň+8ěĂҧ;‹éŢW‹;FŚeç«% …6U+É©5@Čť"–©Z·łÍc,-@m›ĺ§mZŮžE¬„žňăŞč‹ß_żÚ×H‚\Ů“˙G%YÇ%d07ŤĐŕŕ%čeč.íóŢ˙?<Ű(ßő‚ö»_ň « oťĚI\Ż(?R0(4!Ö3€ě•-n uЉ2ÎwHÔ˙W,ÔUł?B 5Ŭˇ·U{[5áFëo,}Ý•L'ł"ߪ;Ł×R´Cˇh[ĚZCKŐ†ŚŞl) ±8t+(·V±\„„­eéŻ6ˇ÷äř8‚‡{íŕ¦Kżózl€ B=lloŰ6ôĄ”$µ‘ář†8k#ÝÁNąĘ´&0µ×ËUuW­C~Ťh$Ęö›“ŇM;Cnů˙T=Śź`×íδ{ GÉ!c"z8!ÄB÷pJóLBkbXWň ‚Ô‰8Ś›1č«ů9˘vŕ!. Ú=Ô§h€p·N$‚çËrSe4Ú§N1MâǸ#T?'ĚǤWč8ţµ­šoárô±Ůuź¤1ÔÇ|G·€Ś~8ßé :ÄwŇ’=ľ#ńťł±ýůá ťíqľ#…&Z¸3ůNZýCřNOŘaľÓÇ·ă;P… Ő°8Ď3´GÓ^ö`d}=A{ UInĎ×î퉲FÚ iŹ…Â‰Ň×nŃÄCĚęp.v'¨ŽPWÖŹđQ’uÜGBBa”f Ĺ>ŐÉ“2Ô@ü¤IÖq¤Ş¶…,ŇÓ$¬—I˙?$ AQw€1˘„„sľXűF35řŚÂSĽ¨=Wx€/,?“o%¶0[ĎŁŔŐ´T8ËDw„ý\h~š§hŹ0—‘-ŕeďmŇń?črôNiç|ŔďžO­,b¶Er3ËÂuöď±·R°yěj«Ľ 8=Łyî[.Q}XÔ‡›í'O@*ŻHŽ$0cř¤_źëĺ<3Ž#ŠŘM›–‘Â.Đ?ë›vYŻĂŤůÔŹdě(őşnĂESí`ˇĂź§J…‘ζĘ*i44Í4nŇßĂ„r5ŠĆ:Ą›3jö@O˛Ęž°ł¦ĎE QÝm"äE;=ŰłßEŃ»aZŽ‚qcˇ~ň±5pŕ¬u¬GÁđg¦xő˘`iIGÁĆĂ&°«—źŤJh8›‚Ą‚°OKô°0˙j¨őxWçT„´P"ß˙ŽŹôuCh¬Ď/ŕLĆŠî°ç'řѵ¶÷¦Ňž"¦Ń7WEf‡ĂľĹ w€a:߯ŠäAV^;iă]ß:äz „<ôń€3'›˙Á›QÜ‚ †§ź4Ťä„AQaŽóy+2Ö(čkŮśNhI»6*{˛žě˛ÚuŰţ đ<…őu ę`ťřëŕĽĚg˝ŁÝňëť;?ö12v8—€ßLEBĆĎ)V vľXyQeOÖČMW–îö‹ô5Sb¸~ś¸r‡ď|đGEŤŔŞž#(`űc˙Ő¬m~ÚHăyîĎă´#Ä!YaÄh6h>‡Ö:CŕĘî’ŮĎd°;7R„„ÜěF3 2$×t××ÓüřgFś†Ď$‚:˘Áep'`}´}qaZĹŚNI˝đísW@q6vÎc¸Ĺ}×Ů6ţ/¬v…çRđx†śÚń(Ö‹ř0ăA…rsÎl ÇŚ»‘žWĽúh—bBíf‹Ż{-üíŻżů/gE3OZüA™D˛„p#Ĺ‚70ÇŕĆłk\ňlĘş¨…ÜPĐ Ś~¦ňóWľ–Ýŕn·•Ż4ł0—E3l¶@eż…usÜÍkgŢ<8»íľĘ$˝5Jů‚çóňÓUzrjŮňÄ'‰4+<×Ă&@E;W…ŰÝ´—$÷ł¦íŔŕúŐ,ęâ_DGD/‡ x*Qú'Qwu>áŃa±E@‹á[řŤęőżM]t“ß:M€3ÇńÎXÇ1×řUއd( ľ(ôřpŚ tŇĄ9\Ř‘Ngö6‚ŃÓWŻyů4ó6 çŔţ•#Jɇ|ůrĘť ĐÔş14,ěßppš*a…c1ĂŃëť/%8îĎî[­„@]Ú=×Uń5Źk–bţjjŞčƬ«űđЧ)ü˙ěęéĎx˙çäÚhTśÝú‘íý/ŹaÂÁÎ7÷÷!6`˙zŰÜT‹ËBógEÖU›9—AągŔ” söńr†îŢ-2Fô|=-­‚ g.yă?ěśwendstream endobj 89 0 obj << /Type /Page /Contents 90 0 R /Resources 88 0 R /MediaBox [0 0 595.276 841.89] /Parent 91 0 R >> endobj 88 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F28 52 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 94 0 obj << /Length 2185 /Filter /FlateDecode >> stream xÚĺYKsŰFľóWŕ8ĆxžAn˛ěTŮµŽ˝‘*•*džeTřZ˛śüúýzf@‚Hq%ĺ´Ą*â5ÓÓďţşőúzôę'—”¬,Tr=K„tLń2±–3çŠäzú9ŐY.””<}ó1é‡,WJĄď–™tiSmfăIµÍľ\ż˝˝‰„ăO$%O¬±¬T&™,F˙}ţ“é'ďGś©Ň%w¸çL”e˛i©âý|t5ú÷ŽOr%™±®OBďHHM$i]ÄÇC*9XÉ­4LK„^“ŔÂ&Ab zI»Ä Ě §dâľTÂHVr—tČťćK™’™R3VbąŅ̌ĺwrĐ wań€EÉ™q{%ľVăeä ËÄrĹ ĺĽoűôń—ĚÉôş/&,ńÚŐZP1#ä  ó–VŢ!6Ŕ_!.ÜWźŢ^ÂŐ¤MżeřYÁ$ő”X…ůĘÎŢçB4î7ŐXő}1ÇďE¦DÚŕ¦ŮÜ—OZĹJ-Ď—O3G”ŻĄŐ“ď€Giˇkä›m*ÄUZ‘Ô÷˛pű ŇďÜđwż}ř×})”挓ă>•ZZ§­¤4Hâ@Š ˛MCzŢĽ ké8<ýĽĘ śtZ…·˘N`‡q®“Žë>:´ ´ň°ëÁȤő†Ëă)â®ÜkBFĘ0ČEQ0m"~ʬM7™!‹™"%ćʸtĽŚöUűí wNEóÂO%ü4oőđ$x‚Q6.]®ü´ba]'kçš·,Y2gDäČé4:qŁô1nŚ(Źr㑥Ú3ěËú$óB3_Ë%gĄ Üüâin7pŽ%¸q*ý5+M:žßV?F¶S‡úťmŮúümUOżô‚?Şťv®żÖŰPšf·tƤ©WËđbŠgbץž‰¸ląjÂͦڳ…Çq¸|Ë q‡÷·2 [0) r ˇR~"őŤ7ăE…¸}P,„ âdZő3ŠŮŇí«úÇCłÚžo5ÝZm§ p‰&ĽˇŰĹmĺUÄ şŃa/ú±U–EŚ-ОN5¦ÇĐę:VŤŰ%»j¬zEJkV@ígsĄ ËÜ1¶L †eYá1ż5d"ş‹«‡DHi˛®yOšÄ@TłĐT,W^ýTEŁ»ÎNC.×Fŕĺ›LŘŢ”pü\\!óđ4ř}/Ő ¤;hkĎ×ăÔ2Ëö5żĎµÇ‚#)µĎµGÇw퀔Té…ţ±µíů8hŤ:¬˘Ă(`·\Š’ĺ@§č¨ că\˘á‚ÜŻ `açRy‡ÖëűĐÚ".Šrw\9`Ďăźq—«ät• ßś8H5ő÷yĘ^€ŕżČĘňáç‚Ţ^U^€<ŕ)jřjĺASzÄ=‘Tľ§Ő3ť,Óíažçeí“T?GÁ+ą}đ ¶aչܟ°VKę>÷–—‘‹.űp ö®„ź‹«6^¶Eú"$Ňn–]ę Ü‚ ĂŹd Ýó!YźŇéf<Ż˙ÎÄTô= ŚBr—NúÄáů*RâAڎT®­8  ŮąH '9í‚zmÉú Q&Rě‚Rţ/A)-“O4ó.(÷´Že\ňŘ 4OJa<}ž¨Ü;–qElEú„µVĹ$|mÁůĚź ĘH«ÇüATÂŹ”<ŕţ K@5Őµď1?€ŞÁ§“ťxTä¦ë‡\>:,%Jy,,ϸP rEŚ\Că4FΞğ’—'óÍ€|ľ‘" ŃB\ŹÜy‘ŢnýŽixjVáJj™ńÚw„[ąM˙ď¬9ˇôĎHb5‹›«ďM¸›Đnp Ë´×>±.oÚOŘů•ěfPg1Źě­ü÷°é®ŢVA%* ×kţhů–5d7ăÍ´Ý8Ą—h¶áăbĽů“ŽXĂ.Zňô’Ö´î­Ł{ÓR•zťT^¶†DZ-·á5&_÷ ˝:``Ůž˝m" ÷ Ô‘ĄëMŘBń±©ÁĎ_õďÖ^ß«m$U]Ń-ő«¸·^Nć$Ĺ´¦łnĽ^řF㽲kôXŘfÓím4žŠ”’Ť=ŁE㛅߆ŽŰ—ÄOďęć«7I–.«ťDńhĽvm‹C·Ő6¨g˝×Âw>g6_ăoźy˝¨©ŤóĘQˇť"Út±ÚTá®^Ń!RH6/äÝTł*&ďÔtÝEU'ć‘r”iŁęÝ’¦«$ü$dźk.3ďřS¸Y×VZ4kBPfmén;QéY©ýUń)QľÁ?ČüRu‚˛´>Ť?y.Ű!t¬l—ě;ÁăsŮłů:k. ŕ§N»7•Š«‡„Ô‚§ç˛@E[uć\¶]ý,sٱăsŮ.OśËR­ élIé ?ůÖĘ1.ÝůňžÓ¶´zňđ¬4@b¦+oˇřŔ–ú÷ℤą^SĎb´–ÖiŁinĐ ›!#Y*"äVND­Ż–/b٧vxŤ˝óşÝ|oíaŇ#ÜťŹ?>Tž}‚K<ĹaNo‚« tCŮ >Âȧ·\˙Ä»7Ýír[›»éîŹhŠóŰÂC|ćś;gŘ+Đ—ÇiŻüöšÇL{—«L=ą3…={ŘűH°=`ĚŢئşiÝ˙Č$f@Ž  jôă˙»›G:ůžPR“ ‡ĄˇÁ,) Vh4{T¬ETqŘšŐčt=ľ ˙EóOw™âdŃÝçđqYm8§q @c¸kń;’Aşňóuřčű\ß|ĽüŢ˙ĐÂş¨T0óŐ˙{qýă«WSß©¤“ő:€iśżşÝLŞŮŠşŽÍMĹ–ŐŔÔ ŐŐ˘Rh´Ăäá˝ď/ţ .©_†«äĽČrgT;`!küK)Ňendstream endobj 93 0 obj << /Type /Page /Contents 94 0 R /Resources 92 0 R /MediaBox [0 0 595.276 841.89] /Parent 91 0 R >> endobj 92 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F28 52 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 97 0 obj << /Length 2049 /Filter /FlateDecode >> stream xÚÝZ]oŰF}ׯŕ#Ő†“ůţč[»@¦ÉÖƢ@6‚EÇlÉ•ĺ$Ý_żgľ¤‘HJ˛«-ŠÂ€H‰Ă;÷νçÜ3¤__Ž^ţh+GśŐĺuŸ%‚şĘJ¬ŐŐĺôc-Ç śÓúěýŐďĆŤ˘ţi>ć¶^µËëÉUű0ţtůvt~9bĹ«­Ś2Ä U]ÝŤ~}üD«éVoG”g«Ż8§„9WÝŤ$éüvt1ú×Ú­Á‰2¶kB®MpéMx§ĄN_·­4pĄ1\ˇŚ7ôÚĚLe±ŽKŘ«ň0Aś‚đݨâÄQ[ćöű%”#ĘÉ~Çt4Ö(M„uĆ­ĆâYݤÖ>&»’ă #N©%5p™W†rb% až˙öáýŻcËëËn ČĚŁćPĹxo›l«)Śőř§‘pľôďâĂů7ő—1>HĘlę]E]qŻĆĽŤ†›főíîźoÎƂկĆN"@|ĽşhŻVţňbľŻ–PnŹŹWŠŇîŤ7ŰęĻ峜P@®Ś÷zŮiuCÜZśb˙ˇŠţôŰ»źwŁT·N‘µlkÖ$ŞJKł–Ézëʲ´ěXsVç=Ć 9b©®Îăń¦ůbÜŕ®i{żZú”k$Ű ŢJeUTúó!#y4ÖÄŰbŮŹW”“Ś÷Jn8†Ë « Ł@d˘ŇR«\ůDZ1őr¬|ÂĂ«ş˛ő$€( H„Kܶđ…­|akśˇj.ĆŢNâbG … i,YŔrcĘiK⸂˙‘xJ(?dI±äŞ•u*N> â¬Ě>¸ɏqłŢ`Rk6^Ƣ ÝÉƱKĎ)q©Š~ –WŹKL2‡źVÔ˙öÓOnŰ’ Sô:´k\šíă—Ĺlú©ă‘DěŃĺÍě!¶żëG?G "ü0őÄm / ›/VńdŮnÜÂ×I<|+ď~ěŇh™öŃr±đ«:YNîZ4߇aÍTť¸,QzWŰť +×fŢädę'&Óî&3ÖĎ*.—?˝Ćé˛ vHŹŽPčĎ4Ő¨s:ÔCµţk> CC" Y‹ŮéŚ@°F&ŽöJhjpKEc@=atŘX¸5ň™?KŁ{B” tň䪅™(r•ł¤\Ş[Ü©|Š”Ç3P­ŻďÚůŞËĎ ©«ŤĎGňh«‰·\ç =¤_Zč&7ü\”:®K‘xä€ëˇSΰÁ$qR¦ň@DI3G!¤°„AK‰-î¶’]ČĂMŞÍŞ_JESMaëő®~7@vë颎‚{AJĘE-˛Ž*A!Z¶Ĺ5łowľ0nϨ1ü®Žçaîhţ¬gĘŐ\&Q©Ńľj&Ƭ!ĘźQŞîăšç@tck˘iH˘łűUĎC¨p‚y"„ĆšÇxoŻ–ídŐv|=˙Ö©gqpĂ#CŰ>:¦=‰Ë¶:1•š‰jh»R˛ łÓt!•'TőZČ©Up 4ça¤ďgA|a›Ŕă6Ë·Ćk8ĚŰŻń¤˝»_ýŃ­ťbäÉ1¬84ËÇŚA MNQ4@ŠgÓ'Ĺ@(`ŮŞ“`pcj‚iD}ĹơS(ŘđfS{<äjĹ©ŇĂžćĐÝ1H<©ţ\’ëä‰(bcl"Ň=Ń)@«Ň.?Äś”! ő_ďo'µ §­–&ź‚&~¦Ýiŕ´±5§4ä/ni”brŞzÝ®×4fSŻç·ížf†ítňţt@:?>}ň3šęÄRj0§Ąv+”!ő™;Ů‹˘•mSĚŐbţ°Š»ů3dýý»‹ PgţˇßçpÝJńjňŮď±|š_ô\Ţł<\ŁťH{’ĺ)l -O—ßfů=ÇąĐĂX®Îq*#<8KاŮ1w"µ~ÖĎUšRĎUţ๪(ĂŔ™pОěN' áÂîPS´ü5ďV7ń‡°i‰Ľ{±Ę­ ř<űŇÎ#s"ą‰K‘bŇ÷TȬź&ü ő˙˙?pn蚌ącá)Č®¶QO`cž4Ý)ظ°5ÄĆĽGË›Sř¸Ö7{śĚ§t˛DŘ‘ç™-N%ÍiZFal°eä1˝-Ł‹I?Ô/$.őńˇěcÄd«JI‰ëŽÂ/#yNÇPGtŚő#âĐ'âK±}Ä©(8Ĺíß3ýíSýÉSďç–ŠŐOŕM†ú4›ÂÂÖoć!űTěÖK µůwýJ>˙˙šd§ŮŠt˘*ĐD˛ß~h˘%ݤ˙·–^Ýř×âů•“’ő˝Ż˘|ű:ˇě×—ăĹy»*¦iĚĚW«?[ÝŚÓťŞľÉ\|{/.®ăńěý›ďýďßgĺ–ÎÜxĚ®îxůŇ3fľş÷Ź*Iń¸ĽjŻ^5-?·dŢö<¨Ő!*%4=fëßłÝţ×_ľGŽć2n¬şćë—Ä˙' lendstream endobj 96 0 obj << /Type /Page /Contents 97 0 R /Resources 95 0 R /MediaBox [0 0 595.276 841.89] /Parent 91 0 R >> endobj 95 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F28 52 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 100 0 obj << /Length 1946 /Filter /FlateDecode >> stream xÚíšKsÓH€ďţ:J€†y?ö’l–ä@ËÁk+±«;ë(ř÷Űó˛%ëa;jY¨TŮciÔÓ=Óóu«'/.FĎ׉AF˛äâ2!T#†M˘FZËäbú1ĺYNĄ8=9ËHú&ËcéËEFuZ«Ëń¤¸Ë>]Ľť^ŚH‚áŹ$'J(dH&7ŁżG?ád:ÂÉ«FĚčäÚc’›§,´ŻGçŁ?Ö2r’W¤Ľ°ŞBߍ®F %EÂR8Uçźo@Ůôúd ZŇtrS,2h”Ű R b´^?ĽSK†8SízFYyEXCYŞ@­k;Y㲸ȌL‹Ďĺ[Żó´8ýlµ­-‹‘Ř=ő'řĺ‡7Ż·Mâ##äţ&QĐÚ´›e5LŞčÄ1C†×-˛ónáçÝúÇď-Ópý™U:ÉF€tB`”0ËĹ]i;óôĽěěÍ9|–«ůľ®üő)4ÇĺŘËŔµ§űćCh>*Âşć#v±z˝őv[Í ëOÂ|”a˝×÷ş¦›xo |3, 8“q=&®çń*$ ;I°#s.t:ö_ ;v=YÇ” f‚oE_lIbچn‹ĄfZxéVúÜ.—mĚüĹrî^Í˙_pöŽ´"Á>Ď–),(j¸;°Wü`¤Jú3|QJeJĄź,Ę=0r˘=Ü“q¤ 18=ý3ţîě}¦,Ű–ď%Ó‰äŇŃük\?Ę+˛¶=ź(Ҭ‡łŞžżőNŹC°hŮž” „±DÇ(«OIĘ ’QS˛±=›Ű#çQ.j›ňŕ(#GLđa˘LEXg”‰}z˘LcÓiŔ8ěĘţ Ă4p@Óý-ęYµ(«aQ•DŞš=‡ÄQÍţ1ĆK쀯ĐH ńCĂWü‚o;|Ő6|%RjÍ^}{…¦(:{+˛şŘ»4Ř;÷›¤é{Äîľz4>l^(¤,€­"¬l±ĎlÇ'Xy”á7Đ‘µŕ<}RΗ‹–„š@ŇŞŚŮ•RĂŰŤ¸·™})dŐ0łšBÂŢ#„Ő¬lÁ]“oa?Ű®*ťXĂ۲䓳70/çĺ >ç‹«€Íłę8%ŽČd )Ůëś’ĐĹŃöÄNÄ‘ß}đqT_îĚĺŮ]“4™ÖŁľĄ~č!‘`Ť=m=UÔ‚Ţ~-Š6ÂĂČ*¸Ů®ÚÔBDo°ßř0/gŢN d)Ľf¨gÎ ´â–äz ČŢŕ"$iäÎć~smW] Â.~Ç.ĺÎCč¸Îť{”ŚąsUÉ=6á®lú‘A‡ŰŐĺf SÖtbź‚N3ä€ú:±ę 9„#!ö·±Ż^TĂÄ*]‰O@«~§€ÓK^-¦Ľ?ĹţEŢ˙yuyĹšĽćŰG ŮŹľ#Ĺő0ôÝČę¤očr}ĐqCßn%×ô­(yävfąúV f(äÇlĆV„u26öŮ0öČ+ŰWtËŰúëľl)\Ŕ;ë %÷·«·náe5쪾Dk ű nÖc !gÍ€˛3ËÍUxf1ľéĎ]…BXô§®\aW٦  Áęáŕo•ĹhÖ'$’˘Yžů”®ĺk0V˝&!XÍRkWKIBB?ůó”$(ŤrLn×",QÉDe#IČ D­Čę"jěň}ë Ţ(Ąč8Ż"¬[ˇĎnlťÂŹ–=Ž4ĺ»ŕĺN”ö7®Ź]^TöÚ9ErÂŞiCŁkßjC´ÜEľ,ßČę´ş cl ˇvLW >K(Ý,ő§ĂĢ]×@ü޲(ďW [L Üp/ÎeľëŁÓ×1®ßąs·Ćh@ FbP_^Zé<_g9 xÝ„DÖÝmšpíVüfímpkĺl\†Z„„-§ë$ż—@?ĽŹxôŰF¬OŘkă+ß/вűm±őÄrĺŁÉĘţT6‡kĆď‡Y<ŠtZŐgĹßz(ś·FÎĎmŐĹĆÁĄmÝŰ]T+6Áqęźś/ü÷Ř?zäŔÇF§¦.Ą»7ţ§°±úÎN˝-ĆŘĄ`BĄĺ¬˛ĄjˇVŽb€kĹG}„€”"ö/7޵ÄNŞŕ}?&vRXŇ”š°g€””Ä—R‹Bě€(Dq‡y¨ČęŠB±KßŰ@í˙b”$ ±OęţB/'ßňL »Hü×:NnĎzĽ‚łÍţáé­Ý$Ţ{á×CĆ\¶ľío.ŠäsÓĐÇĺ[¶UÎÂ1“é,Ć´ë[Ó;$Ć?µ×źFWĘĚJËŰßž?·l„‘'··pąń—÷«IqąĚ¨IWWZeÓď$A ČÇć>Ŕľ˛Űíú‹źţĚSŐY®!˝K)Ť«ń/%a.˛endstream endobj 99 0 obj << /Type /Page /Contents 100 0 R /Resources 98 0 R /MediaBox [0 0 595.276 841.89] /Parent 91 0 R >> endobj 98 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 103 0 obj << /Length 1660 /Filter /FlateDecode >> stream xÚíY[oÓH~ĎŻđŁ ő0÷ńě—¬T…m„Í^N¦ł 0ü‘@ă@ …4ÁüzňyňἜ`ÄtÜĂ#˘up=á”UăőäbňOŤHÜ@yf¨ÂÜ-W-˘ a),ŐŐ×k ®_l€% çw×YÁ Ü%H%Ŕ$Iýđ,âLőóôXq¬C–*@ m¶ó"KËlşÎ<Ëł‹éWĂ´ĚPObűĚG,đéűׯv â8ADý ˘ŔY÷ä±:5XqBá-sŚÓ!'śÓMroű¨klP]ýĂö*+§ŰŻ}†ć-üěŰ,Ň2LŻüď‘YÂčlű•{Pm9sZÄřř AÚę{n%ŞĽ+r ( äi7±ÁÇBUútćy‘˝ň…פHχeĐ«ôć˛çÍŇŻç ĹmA8ńß(ĘeZVß ¤°×›®ľNËůŇÄ‹»˘`´Ýś8m·Ăµ­sSsR»5Íećf ůmw:UÂéąy q§-ëÝXĽ;7sOM@´ý~bŽ["p˛)\*Z÷ľął´¨ę…9Ér»Ěć./łęş+;TăĐčPî†i_Růh¸1+Ř keBşEíĄôKVÜBał—!HŰŰˬ'b8AŘǡWĐvâBĘąŹŰÖ†¬[c"L%ă-+†Já˙ů@)áu@a?Ű_[ş]@r@@EJ'GéXC]€źrPp Žu0BŇwM’?´~»fQJÁćçk‡o\Ý»HőB#9µš¬ť„Ď–[)†̡¦\ůNÎî#†ťÔU·ÝÍ<+ Ý^Tsl;lFĺ2ŞžáŇŰ˝ľq7ťDp¨Jϛ돽öTţ2ËŇ”›żž<1…Vžß—d×ßÜóěrQWĘł˛Ł¦H+o™vÄ—ć}cýÍĺ?qG ŚâD0RćŁńŐhTPendstream endobj 102 0 obj << /Type /Page /Contents 103 0 R /Resources 101 0 R /MediaBox [0 0 595.276 841.89] /Parent 91 0 R >> endobj 101 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 106 0 obj << /Length 2553 /Filter /FlateDecode >> stream xÚŐZŰnŰH}÷WčQÚ‰:ě{sŢ6±pÄŮÄ»ÉƢl,ŃKŃq2_ż§ş›7“’lÇ ě"@ÄKwuUuŐ©ÓEż:?zů››¤,5rrľšpáL҉µ sÎLΗ_¦j6çRdz|6ăÓwłą”rzş™ 7­˛rµ¸Č¶łŻçoŽNÎŹř$Á?>I“‰Ő–ĄRO.ÖG˙>úň5™,ʒɛلÉÔMîpť0ž¦“ő‘2^_}:úG#c!óŽ”W¤*ƶş¦šY=±B˛ÄhŻjţ} e§×Ç´Ó‹Űu¶™á˘şŻ 0ă\3ů –’)iÇő¬eÍ;ÂĘ ˘ŻíeVť\g^ă¨ć«§KRµ·'N±T(¬Es~OtrúůÝŰűI—˛Žřö¨śŽŰE Ěé¨$SÁ„t=kČç‰ŕsŠŤż…HYĆç/HeHOXÂ!ťs–ę8óěëSUâ˙|s¦U‹Ë÷‹uF7ЬćÁ/pDŁĹÜ$ xY:á^ÖÇ™†7«ŰrłťÍ•áÓę*‹3;»ˇ K”Ž.=Á˛×~şŃŇ_Jićt=áá[Ě«eŰŽo` –qčéńP×PďçzQ]\…‚ʲ$±=çTW‹ NĐnz™~ţ2_˛AË27ePĐ˙§ÁťžJ!¬c)ŚÁKŔPŘYĹăpyJSR>=ůŚ›ggNNĎď§·š!> `ĚZůSéEÍ;˛î§‡şŇ¤Ír¤î§Pďäućo”EľF"·Î㎛§ŃŽ9nźÄ:Âv‚X=†´]•Y6E!_âd Ż=Bý}e Ôď‚–H™Ô¶§ý!Đ w;ŕGX€B?[›Y;-=Í´"±‘ŻjşnĽT(´.şht«ű«iÍ8ŻÓ»řăĎŚą¨˘üÍ2^Č4ÁŮ`=ĂQ,mś˙>¬·Ě†ëŔ‘FÔëÔ¸da)—=KŰmáUČç ŘĘ«ä±Ó;z’WWŻ0¦B–3¨"ň˛D˘;°”ZfĄô°dmJÖ%ŹA%î—öyP©•µ•â*ĺ!ä€Ň™•I ăN<(µÂvRăµőĘŢ@U>-Ęę^¸w‹&vĎčC@eÓ)¸Iű€*ĘÔ* >ăz=…\…j˛Ď ťÂ|ažÇ Ž°Ő#j‚âKϡ°WŃž|ŤM¶Ţ´îÝüńŐŮŮŰčŽ,» ă’Ţ˝N@Ń–üąśĐ Űĺ„8bÔ Ń 0ŹâËýŇPEş řt=ŁĐ×>ňQŚKĆęŹć`V‡ËDrĹQ«’JZ±Ž"7¨u9Rh Sé °Íc%Á˛ÖşŢćě®y8Śş&;óMU„jR]ĺŰ‘‚š2ËSPąß˛şřÜGŽínęĺs˛\7•2†˛RĚHîcZ¸ĐçcÇ‘x²×4ף ˘őZŔřa努őĹ”qÓ2»)ë7[˙?F§SŠzŤęí_Ňuçm^úgvJIĺ/jşĹřú8K«Â`­ ő ü0bCíBśŘ†ľŔK«Á |dń˛ P…ŰbEż¦>Ú! pś3}"¶ Sü÷ŐÂÁŻČ'Ą×% ¤Ó2\ßĐË‚FË›ôÜƉQ3…·~\ľ^”?čŢÔî΢ź;Ň)xďĎÎÚÓ?ÍŠňÉ<’Ećů{Ük…çt ąĆ®‹2Ŕśl[e-aQ%+6/"ŕd+¤r8wń÷j x’vXčé¦5T‡ÍBvZč•Í6ĂčtHę´!ޱU^lN‚_Ś'Ü;†śłwâ5ěb#m&Ą%Ó|ŢŞoˇŰąëęú$J1˙}}Ť˙Ź)ě(Ň“HůĘâ|şŻn©b †Ź3„(k`iO[‰ŞcmĎĐ|ăO1»nAX&Öâ®`Ç\=ËfEQű÷J‹Í˝X:ŽXČk@^b:Ŕ¸MxµĚnŞ2<©yNרĒV4Aüä\P"š‡YS”ĆëDěč$TçhŇ%Oń@¦Tč#f†í¤Ó1!çuţŐmŔÎ1ž¦°ľ}\ź éTn</ł!˝™«„ŁÁ¶¦Ěé®n9)ĺ5’Łť €›2ćálD±”‹Vˇ°ßl(wΑ#’Č!řN*ÂÁçŁ/Ő-U.* 8V˙k–j8î6űuŘ|ĺR0gëęňĺ[‘/ż4R’IY»ôüĘ3”ž•¬M§-^—zşń4ÄÍV-Ü.ęVź&íđüvÜH$˙ďVçäąEąXg(¨ŰfmŠ/»p1­]ăDR5bžşu!0Şŕşôä"GÜP#ˇCΫŐtR·Ný|±îÚU­ë!ťr-v•ëëő z­ôřqňŁŐ¨‘đ‚EuŘ[˛L°"}`É®G?KÉîŰ]˛»úĹ’­ťîwžză,¤MÝĚż‹|xÁ¶ §śŰąŻ`GY;űۡ&:Ţłó˘ô}Ńş|˘%¦“yTýäűHEG`kć}÷ętoeç€1Ł4h%ŹŮÓ(jŢĘŮReQYl˝ŢÎÂ+{{;TŐ;ţôŚyöşNZ ÁÇëşÂ\#ÎÔőŔq^űćď€/޶śűźMv.˛őMőcĘ)9ýß.ńµž̶ś™P¶¬?ŹűÇw᱿†ş”§c*k¦ů¨B˘ä,*UçCŞě—3Í$x`˙Yd$’šĐ?ťţT˙ą–5ďôźĄ1L[Ń, €Ľ<еNúŽgRś†›ŹÁ§îüiŘ"ůď —LĘř%F ”資‘jËI‘ŚîF¸*őXGúŕŁ*éősŤü(kŢ6läţq®›÷8rŘTĐ~jíFň!OC3Á;…¨vn|Ł /ú¶ ĎqpVz–áî˘Ó…ĹmŰ ň˝˙ kö¶P/ŰR"‘LôżšÁśmM/WEÝr©[]ŕR«I»ľ-ŰGĺ˘@ ĆîČ" ů“涡ŚpÝüŮČűľ};üJK4»×í6°dAß…ęgţŚ'Č™·‚ÂÎă\ÍRú¶Ź$Ŕ™G(•úŽl`Żä٦7‹ËŘLŁ»»™LÂGÇř:ĽÜdđU?…ŢĹŻŹŞő/yăÉë›đŇ7ń{|öúzţKÝ=‹n‚2WTת›__ľ\FrC}?ć×/nË‹lUPg´ĽĚŘ&§ oŻÜM$KTë7tÔ¸ţ¶PĹ&śH3›; ôŞŢŤ˙UVm‡endstream endobj 105 0 obj << /Type /Page /Contents 106 0 R /Resources 104 0 R /MediaBox [0 0 595.276 841.89] /Parent 91 0 R >> endobj 104 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 109 0 obj << /Length 2507 /Filter /FlateDecode >> stream xÚĺZ[s۸~ĎŻĐŁÜ­X^EŞoŮÄťI§ąśÄÝŮť¶®-'ޱ-ݬlÚ^d)’oë·N§5-Á ř>’ý}tň杉2’Ą"Í"Ć 4‹´¦Ä4M?Ĺr0Á9ŤĎŻ,ľ$Břb5ŕ&®ňr6žä›Á—Ńű“áč„Eţ°(Ł‘VšdBE“ĺÉ?'źľĐhzBŁ÷'”ĚDO0¦„eY´<‘\řńâäî䵎”$ -żŁ© [ŰŠ“pAhެ™·9ŘWŹ%ą#Ť˙d*/ó·h üZ7<śťÁTřăOóUőĹ 5˘! aT{‘Ó•ó|žgŕ9Îvź—îa™Żq^űpc˙uRóŐ˝(Vîµ2.fîYő°}6+đeQ`Tźđ÷stăŢÎdĂpF2Ą˘„)’IkŮgĘt×A7p¶_üyůáů *‰T"ŇTĆX(A0ýKt% en˝ x§2VO†Ý}<;ŢÝu#ź’”qoýŰA˘SŹr@üÖ„ë8/ÇŐâj_NŠĺz‘WůUEIĘ3,Ô˛yśL0°­¸HłGŚ÷âűŔČtŁś¸ŃѢśęŚ@ň%Č[];cěE¬UWwß˝»8»^Ť:ÖA™g†Ĺ:ŻjŻuZÂĘ·¬»^^ßţŐ]F„i¬ż‘&ľ*`Ĺ*7ö%ĆââńţÁ-9ă\oŻů¬.JřGj/í—eQ~ÇďÜ˝űBs›ŐƉU…ű Yĺź>Ěýűřś"±&ĐÖÜ.9YH®fçJXĆIFe”p źÚĘß ŹÇĺx ó•›;Ö´t˘Ć5Ieęn°•Ín˝JJ霓л†)CŚb^Á9ČI“ÇeľBŰŞÎ|*%”K/ţô—ąÓ\=řÁ*„˙É}/ľĄâżs[‰•_8&Á/Ő ŢÓ|±pMňk4vÉMU”ů”ôŔŤŇ|çÝ–u s‰)ڇ1˛_{§ˇČć/Ó‘S‡ŽPY=—G.J"ž›Ä®°9Ü.ˇ2H_ŮoXę”%B­w겿¤ ËŤśpź‹BCŔ·.r@}„"Ź”‚zöE:üóćúv`x<ęş ř¬t-}@QŘ×ű:HĐ•4”őŘ­]¦¦eßÝÍđ Ó„ö¶`e!Xz®ý6r쉷mÄj‚DvŐ ňć•Çť¬ń[pOĺkjŽ­i‰Ěŕ  ’†‚ôőÓnçCŤy_ć^„ąÚŃĎť®Ž§-keÍ é餴 w\…â·Ť„ˇÝřdkúł¨e 5–~¦ŠÂ_öÜEXBˇs6rř‡kAr§+qżz±DQ^Qľ§w€Q€qۤh !!'d!0 ăŮĎY9PAŠZ /Ę@[¶«üÉ ňĺşúŢmŐ¬ťVű[us~ĄSA~UŕśÓśtZz")%?$ŃĆx;a5·uMyěÚqł˝ăc®k Ó>}V+Âk\?`kháŠČl oŞÂDFPĄ°LŮ6ç…µ­zŐݤ‘&žbióŘ‘‚çË5ł‹ńă¸Ö˙ řpHR'^”=1KťŔŐÇşśA”‡=˛i´w6ž/jZ“0l,kôcͬúĐX@-ĂÖíçѸˇh‘Ë]h|°]ˇ1°% Xp` ňŇ}NJF´dűńXhC4ĺâq> 7”íĆă¦}Ź%ÍÜnY‡ĚmA“śh–ý ŇAˇĘ÷sŇy]?ŰH­KÝňłtĂE-ĂŔUîđ[ŕA+,,@Oejŕëc1LBˇJ;cčËRţÜĘz]ICYĎĘJاc.yˇÝ,&QĐÄżz ^S‰{'ěąn[ĺ$ÎáÁőĺ]UÚSĹi\ŤďáŮěyÜŻx|ň=îKÄ{~÷®ýîK¨J»ŕ ÷‡‹|NwL\˝zĺ$`ź_Gč ĘĺFYYa%čăiĽŹĎ4zŔŹ7“Ł´ŠKŃKh¸v÷'XFRFňˇéŕ]*‰’ź†x"c+j7Ť‘°Wäé3ă&xšĽÚ‘Ýâŕ~ţoľňĎĆ÷ŢȶŢĂaKť`ďáŇşÂĹW˛\1-O¤i2,ë Ěă]áŤ3Bx Ţ`ÚYŹđ•ő;6^ÚŮîł™;* Ż[w›šö›ŠöŤëđtĚ€őŠú§Ó‹˝}{M“bł›AŚÂčŐ& aŃŚWS„’ĚvއĽk H U!‹b2^ôëÔ@·Ż»j€ÔgaÎu™Ďćßöźi˝Ć-‘´ćutq`Uł^°fłOňŹ·] ÓÖ>îÜąňî=z5áőZô“AÜĹ…™‰Ó4i.ÜxĽěT¶6ŁŕEO9@w ě€ä˛kŻ…ńkźúó[a«!\pRÜ]ŚÝAîk÷Ę>Îó2 dOčš`Ř Yô’ęÖqXžÁΊ#ýÉ:—8Kďqו4”uî18ڬ 2ŽY`çi† lż×»Gĺ&%™¨—ĚâtskeÂđöÄáŃčˇ'B€[Rň˙!Ŕ¬š2‡--MĹĎEČëJĘşbP¤)«'ěŤĐ°[qŚ7UőÎ ’‹2fŠľź)őîĆľQń¬,–v(-tű0'Éä®ů “= ‡¸7»Ů®`2ĽaĽáÜŘÖö3Á ş’†˛N0ŕµödúÓíy(u L!­# !`JGđá“»ţ LŘ~™űĎ2÷[ďŤ{áĽ,‹Ň '~Kďš M]ˇOJĽű:G»woâ,Ţ^Ý,(}+ŻßśşÍ+…Öę.ĺŘi*Ă=ÜŘßíý O7U·ujýýż´ÎîńD&aę§żî•%ÓĐŮé‘nÓĘv^§™_ęĘ’)FĚaé€(o•펲—q·–ś~¸8ď؆ü_°ăŘćuí· _–f-ŰnNoO/‡Łáí~–9@y<ś‡˘A¨éô0‚Ş´ľÔs@Ňí.°ą ňůA_ëôÓP؆™Vţě!ȲfŃóMO§śećĹvÇÚí®•Ś(óÉČŽ‘Ť\ŘłŕădăVŮîlô2‡ŢˇĹŔp‰ľ×@‹Ţ4đąFo3 " xP«äĎü7#§'Ů*rW‘„µ`6GS{‡+3›ŽMŁłád@ÉxŤ›qŤđíi (î\ę×îĺ ű>ő2ţ¸BnAU©¸n‹µ{i‘>ĎŻĎ~Ăçż…ůEc{Uë·oŢLýąézm#†óŹĺ$źíĺ}NVy—Űq€ ĺ;6ÎőŢ"Íw‡ůŇďł8Ą)¤ŤiĚUXŤ˙x6°Ńendstream endobj 108 0 obj << /Type /Page /Contents 109 0 R /Resources 107 0 R /MediaBox [0 0 595.276 841.89] /Parent 110 0 R >> endobj 107 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 113 0 obj << /Length 2772 /Filter /FlateDecode >> stream xÚÍZŰnŰH}÷Wč‘Ę ;}';oŰ$Ž×vłČäA#Ѷ˛ĺ•äqň÷{Ş/iR˛’hE€¨M6««ŞërN“ż]Ľ~[sV ®®B–Lq7( ÎĘŇ®&ź3=Ě…’’gLJ"ű0Ě•RŮéýP–ŮŞZ\ŹĆŐrřĺęÝÁÉŐpüÇ…)Sf0ľ;řĎÁç/|09ŕwś)Wž0ćL87¸;ĐRĹńěŕňŕ_µŚBň†”ßHUĚ­uĄE¤bÜŻćůPÉl´ÝUĐjů†TÂü˘a›’¬,„ÓôÉ|¦4¬7ŽqYĆ W·U0u>”EötŰqAd‹(ąˇ‰vĚXź;žă1™ŤďŞ{RiŐ]F3'dś>ż«¬nĂJéěľzŠ\8xz’–g]Ăra3\c 3Á«ŃÍ|±ŁŤ˝^‘ó¬u‹ÓH±ŽőB(&Ę"Š<™U ך™Rʼn ŰŞ>٤°¬@¬4ŤZ¬‚řŐvłÎ)6çS„¨C†MËĄŃŮŠ4&ÝwÍ0%+¸ŰĹ ĹJž¬xş­Uę˝Dż}4˙5Ěńów5&VáâÓt6#™0ŚKfM ń˘-úźŐ„ő$™Ő†é˛ě&™®“LjJ2Jkmăź=yÖäóLöÚP4äŐků’Ŕ 6óąJÂHćxą»^ űfśîWĚa9„rł0˙(‡°0ňł{Ť4α®k nDÇĂH^0eäŔ˘˘E?Î?^ K™]uÍDU2Ešüb‰S~›{‹\•Żeő(gÓ¶l*wy~r„č(­ÎN˙řđţą†R[¦¬Ű‡†IÔV áxô ŃrĄpčŻB ×x MFŞT§_Sw3üwLOQĺ©ŠŠ†M 56LĘÝ-ÔŚŁŹôZD=·°Ą«ĆP˘4,/HŃj´Jµ™LNăfńhą f)ÔÚ{Žk΋ú“Ţ·ŹĹÉ4°˝ ĎüT¨EYyCXO¬é‚ Ší8)µ4TĄ°ÁݍËY´Ńpë×anŤĘĆóűĺ*Ü9ţřárµR™ż W¨Éě,´<ŁĹsˇ=ăheë\ýńś×2ČĘĂc/#šo¸Ü\%I)iĺÚqzÝd(‚ ¦ÄăE(“G‹ˇ‘žşJĘ•)łQřémĄ5U‹Ôŕ¬™Ź°v+j®ŠŽZJ›:ęśVšTa§) ……öŤÁÍôH ×|Ă'=°¬Óăré$b v+ÜPŃÄşn2EjoŠT[Lq/ŇĆş4kK(ŞĽ)X'š"( Wa Uo‘LF&ăWcĂ\kaNĽĺ č1EÁŠRďctiűU%ýFµ{:¨†Ę¤©Đ|Rőb´\•Â'aŚő@/&xB=›ź.™Hčlt?ˇşę| ßV]•eÜ$'ĚćăѬ_fÁx‘ěřµ+ưҥ5Ő5ŠűsJ0UĘZD®„öęudIŇť&R¸.Ŕ9>]śvDZ,«ÓĆ,«şĽąóą¨úő^ś}z˙ľ#O˘@Ë´2 ’®†Ą ÍÉeă-cLůÜP‚÷˘K tÎĹÁĺ÷ľP ÷ |8ą} xózTż†[ţrUuU ŠŞŠşŰú ™ő˛•’€ć®0#kZďŇ4­Ň %˘¬Ľ!¬Cë¤-FKsB§ĄĘÓtt?é—˙•„±Ţ˛Ž &ĐŤk.¸÷"„Ę#m%UěđďCš0{¬^$’źŹçŢ{«W_şéP)ŇÄC UbÇrĎN† UDNTHÉyĆ2GăŢę긯Ę;‘[oú|Ńc `Ťq[ł@1Y'óü>XqMq7ť=.žóҦŻ•ÔfŰMGA3¶hSXM4˝Ü¦›˝ÓtzŔKÝ čÝ8zżmšî3=RüO©zęq}T!iž6mâ iJÚMtg˝vâ ¦d\ěŚGăě#P†Ű9¨0¶;’Đ4{/,´!l3 męx(řˇÎ¦ˇśőđ<ˇv…ř1˘çű!äěl禗duěl©«JĐ ×2sĽ-žRüjčTV}]ť…‚­sźĐíŻ}td±ü.ş§9m–ÚÝkŰL÷Ҥmt϶č^AŐ3Ň=Ü9ƤČř¨FY“MF«.Ć©0—\ôľËăiKÔ^LN˛¶›¬9(Ť5-“ĎR…{ő*(ż˘ýĄ‹– ˝?®CDC€tPTgDÚČŤvťę?^2öNaI).ú)¬"ø(ŇEş=PXdŠĄLéWişÔWŠŞľŞË[řޱAo»•‚Ba{Ő/ŰÚ‹>˛ éI}›8–7É*ţ$¨ŕ É-XĘ`ŃmŮŞ†rß Ű•Ó`šĺ@! Jn ¶'YyCX¶C`˘©\ĂöäĹł 3je— :‹’CĎOCĆQ¦ÂÍM&4!Üü'ĘcźĹ’Шʮó»0ZÝöřĐ3 óÝĚ Ő˘ŇAąź#>QTľ–Őĺ=\ŽŤŽS¶řŻËyP$¬¨˝ť’7|KĆ/l»­‚¦ńwQEşł 3GqfŔÎ ˙Î!ĚÇ&Cś&×@wY3ŕé_ôJ(•˛Xo\Äş ŕ ł|Ľř÷öCqÄb©Kâ&ţ›Ć±äŁ]>ŢÜĆŻň?«A×u“ŔşPYx{7_|Łżc›'> ß,Ă4ú>‚~S•‹Wo§ń~Ş©ëç^ŢZ;ËţAáahz©Śßboßí(˙ĄČ˙Ëw;»0íÁŢÜď·ÎO Ěă«ĐpÂŇăixˇę·g5UëăĂŤďÁ ҩ؅ńš–´źČŁż}Źk AŹg{ lËŘCh[Ř,Ý|ş>.§«ŢěÂÖoŮÚx_Ő$n3lVHő´?äń’oă ě'ťyčâÓÔC©…®@![>ĺYőĂŁBe HŁć[ą '_ UČ łĄËjécމKTj~¬ł:^ŃŚżž†Še®o‡›÷„‡ŞIśÉ®^çüT·ÎŮC¸é“żÇŹ~ˇëż¤ş÷ĘÜ[^=ĽyýzO|ń1ý¸W×s‚ş‹›ŠÝW}ń(XNŮIâ;ŹĽľ…äĐńíäܢ”e3Y˙ä%ihendstream endobj 112 0 obj << /Type /Page /Contents 113 0 R /Resources 111 0 R /MediaBox [0 0 595.276 841.89] /Parent 110 0 R >> endobj 111 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 116 0 obj << /Length 2403 /Filter /FlateDecode >> stream xÚ­Z[oŰČ~÷ŻĐŁÜ]Mç~é[6IÍĺ4ébş}pm9ń±rdgÓţűCÎĹ–"ŮqZŁ@5–hЇä|¤óÇÍŕí{›9â´Čn¦ă–ę2c(±Vg7“/ąLpNó“Ë!Ëχ…"?[ ąÍWe=ŤËĺđë͇ÁéÍ€eţ±ĚŃĚ(CśPŮř~đżÁ—Ż4› höa@‰p6{‚5%Ěąě~ ąëůŕz🵚‚elW…\«ŕU ŃRÇŹm-R®Pý€™É, Ö±}Yń€ ŕ”Ä)ß }^®ń€o ¨—śA`}żźĂ˙'ľ'h>~Ľ/CÁňŐsx¢-Űž$ßŐ/éęŔkY+)#†éĽq]˘±ŁíW7C'Ăę;ÜZ] hy¬ŕNˇ%„…{Îëü›*zÖłˇLÂ{ĄĘ´ăú×"/ę*Ęz"O1ş~#Zw64l ,ů@Ču>‰Ź~Z‰|\-–«đääňüzUĎ {eG«QX\ö*ŘM(•Y#oľH”ák/V&”W”o/™h—ÉÍ!V.‘iĄŔůÁcÇőPq …qçA!”ÍGá˛(źbXŤ-‰’,¦”ÎËď«(Öx×N›(¶¨P?™Wű4[Ý…Őę.Ţşťý ć—č{ô5Ž7RAŚ1Ä*m/Áf çe8ŰĐn!óEŠ÷~ó­ěµŢ¶Ś§nc{¨A7ÚďÂű‚ý°űńTő/E‚7q4ß{§+ä\x€ńÉmőXĂ—­Č˙:•ŹćŹĺ»¨Á4Nz8\­Ić}ą¨ |}í@–(m˘ĐQ°ňŘĽšů÷qTě‹÷ÜKN„şŕReÄŠpË®ÝFŞŞ{€pÂiÚ‹‹Ď?v5HňDŐ";ĂFłů#\ę˛ĎĂBrbĐÇľV*t5GőčľĐË˝:©ĆcĽ€NˇsÝTˇ#źÖÎŞ»öŔé¤tňĂIđV<9xŢŤ=ľe)żŞi ´ĆĆ@V®w¨ň[:IŻ']`@(RéD|XŕöşC9\ $ÚŇg]xűxćł0fGJ Ě’=B Y†ÚĽőUIzŘ«âpň_gž=Űg”hđN»ŤwîkÔ^´SYB™Ú÷ÔńŇşˇÔPQ©ÚM;ĄDk˝'íLҡť eŰigÓľH;Á‰ů,žţ]VÇ€'ńTgH^Áę$ž=b»X]ÔŐٲV(Ý\ć¸F[Ë «;ööÁGHď …¬X~]ŽWXę«Ĺé÷^v'5QBżŠÝIë fĚaŘ]CŮvv—„v°;ă\“Ý1ź§çłĹm”Ŕ"Ćň$(Ńw¤žGËŤŞvă”ThMZ8ŹOÝQH5 űę·˛ZĽńxÁ`¤ć%ŕK¨ ‘ Ť' ¦×]Ôµ‘ű?_DZÔŐ€ş˘Uśę^îĘŤ"ZĺK¤:w/ Ě`ZţŘ9Âx¸NIĺŢĄµvZ°hílV@$q}P6‹x8âŃMĘEć×ĺMĚ5řjÇ«EŘ#a¨ß›&÷ŰćpĆqBcLš_rxŇU4”uŽ$Wë6ţšPf€MińĚÉ@ŔŐÂynâä#,ërĺ»Ĺ2|Eů˛Ćý€–Ĺß·86Ţ™”žţŽkÔő- đIâéA{`ÉUÔ: :CîHüÓhQ¦#T7÷m`ĚÄz¦6ínÓđ¸ű¸\ő´1~üăv6UŘyň(Ń×?!żUš°Gť-VÝUX,3m[†ÄÍĺˇ Ţ&ÜuůP§T[ĆĄüŮŽŐbăłľ–iZ!Ç›‡^ żď[ŕŰh8“Í`ňyR`üĘH‰é ‹`{az w?‘{äúÔĎŁŞbŁ+¤RĂt]9–^çŮđçăăÓëë®Ű5Ń,m˙;ŕFZ„fĎhpŢ? JÁŕzryüŢ˙-Őš¸`ĚöŢ«‡woßNâ8ňáÁW?o¬Çĺ´Bň[ß–dQö Ęńw`č #ď§c?BjËßĂ•SŞˇü*ˇsľţs‰˙›ZĂÜendstream endobj 115 0 obj << /Type /Page /Contents 116 0 R /Resources 114 0 R /MediaBox [0 0 595.276 841.89] /Parent 110 0 R >> endobj 114 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 119 0 obj << /Length 2140 /Filter /FlateDecode >> stream xÚíZ[oŰĆ~ׯŕ#•–›˝_ú¦Ú>@‚¤MkźiT‰¶t`K>”T§˙ľ3{‘–&Ĺ(Ž^ oËŮůffgľYúÇ›Ńë٧Eqs[0n‰ ®0†kuq3˙XĘqĹç´ĽüyĚĘ÷ăJQľYŤą-·us;ťŐ›ń§›·Ł«›+(ü±ÂŃÂ(CśPĹěaôżŃÇO´ŹhńvD‰p¶x‚sJsĹĂHrĎďGף_ö2hQ N”±]r/‚KJK/ŰR*PĄ2\ˇ ú3SX@¬b ňŠ4Ä&€S÷Sś8j‹Lܰ^B9˘śěWLa•˛DÇčߤ +ś…Á=µÖD›DOqJyŚÔ€ÂĽ0T-¬yőۇź[^Ţta‚ç^ýE ˘ďőa•dU™°ý4#pĺú]¸şWŠ1Wľůíý»çJr«‡=‡’IÖ°’ÜZb\[É‹Ë17ĺ$Ѳrr]϶Ëő âçj ˇćrś&ţĺĺgöp?—°ÂĘ5,,ZÎvľ±ŻŃŐŁđ¶ó/<ŔЇ®Ć‚•ŰŽß„!VđB;ˇŕNXy„Âí÷[”UeÂÂŇiăaÄjłź•ś5^Ĺé6){á‚“±“`&'ŕŚ•ŢRpcyCµ¦—ÎECýNí‹ÁŃ`›“Ä@’ŐÜŇK0Ga-Ŕ—ŕ8‚Ůîˇ^a4l_jĘL9Çşśˇľ‡S*$¤Đ÷×Űfąş Nć Ú‚I+É@1/oîM7c tö6` ”Ę"[ň/N’YUxë‹ Ç+ĘŹ§ZTŠĺ擇â Ú— D‡\{ŃŚ‡@Q2PH*ˇ¬‡UýcC„hI”d12`ý '§0°4ś­ŻSä…Ą$djX‘$¬Ö8őĽ3>-·‹pv·üÜéOÁ!SÄd•Ş ‡¬!±*‚©N˝ U€×WIŁ~7/ý8>d?8*Ťw{3Ó†(5¸vc-O#óőŻ:ŔŠ#FłçK›ô°liT`ţí9tŚ"§!EfđK»üŃÎÄéş Śř~š„U@ť0;ťXěüč~ ÂBú—ĂDY9‡|x"QNŁĎB”3aljr®_ Ę\8ŠD#ŞK–ˇqŃZžEŃ$kXQ®č–˘Ďް05}äŢP<Ő3\“ź»Üاťę+śó<ęd€Ô7Éęli+ˇ °J¶v¨ď$äHP¸Yţ± ·»d·âN{R•sýcś—Ič>¤‚g„Yőm1eU™°ž“†0Śň8¨—óú†Ç3Öy|ŚW+.Ó&>ŤU /Ě ąÍ–éË×űŮŮ­„b¤…îe·‚ZHw¬ ‚‹Ë3°Ű>ČŔš.ŤĺŠ(aż@c·‹şĂgWŕ€>> ú;yN:ŰŐß¶ÔçNž@_„ŚÇ†nqĺŹrÔĐůčěd»mzh¬´ľ™9đXPőŃł‹őŇĎł§˛f¶Ń•:ĄľÚśG+§rşB•ç’'_CY…_¬şĹoţOY[ćđ‘zŔCŽD´CúLSmĂnŰK9´4śëo'™ c1 yFŮ1‚x˛n§DŞż¦`ŕč> B–1á^‚Čnń b}‚ ;NsýA˛Ý2Vëž­I@Ť˙[“Gé2}ÇOÇ9Dż˘¬ΖşÂ‚5¸iáś5¨k=LżŕöŐç^f±oW_E¸ ±w– ;NÂŇ s°řđXÓ $%”鳀L˛†A 0¶9ČĽięOŃŁŰć§°˝:?LfKú幡E&ÝČ$:)1H&q*ţĎ&“ěźČ&‹Ę@Đŕ6~ÇäűÝŃŠ8dŁ}â|@ ÷˝¬ŁŐ’c$j¦áú¤oĐ|iÉŁ¬*"*S“3jŞöƆ\2ń9=äČú ďŽyŐÄ´1:ůđ@*v×–żS&|ćm6ţ¶ó¤±Y?Ä«H]şűgĚÉc–KßÁ őöĎÉÔ1Ł2Ŕč¬őߥ“ßdÔ$«Ę„uŚĘ#’«ý„GŚÚÝgF_Ě ö‹F±@W†˘Í Ś…;íÂiSÇÖe®§«p¬Ľ ¤ß_Í"C­ĂĺĽŢĚOWý±ÄŐvž$JiXx6/6ë(ő6Č ĐÓJü6mÂŢNQµű]s ¦Í4ČLÍÎb»˙"AÝl{š˙1Ő ¶%ˇ #şWÁ!Ó;żÁúâ6¨˘śę (8[ĐXć{1 …šűî±Ш)Ą)Y>NďüJWOc`MÓěqx¸ŞÁNő<މŮ5k •*É÷Źáˇo~?ĽřďçýE$š ”Yx¦óřĂë×óČ×ÇĚpţő®™Ő·Đ:ą˛ą«ÉŞî¶A¨Ła¶„Ćý¬·ŘőÝ˙\(żGN©WV ]r›Ľń7ÂŞ]endstream endobj 118 0 obj << /Type /Page /Contents 119 0 R /Resources 117 0 R /MediaBox [0 0 595.276 841.89] /Parent 110 0 R >> endobj 117 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 122 0 obj << /Length 2809 /Filter /FlateDecode >> stream xÚ­Z[s۶~÷ŻĐ#•–q#Ľ9Ž2ăN¬äŘN§gŇ<0m©#‘*EŐÉżď..hR¶k+¶ăŻ·żťMnĎč(?:ŇÉ(“Ń\Žf볿Ͼ|MFółdôŰYB¸VŁh'„j=Zź Ć]{uvsöżVF Bâ@Ę[Tú¶şâ Ś“$•FÍëôŚš] J– ¤âŃďc-Ł|µ+Ţ ‚đvĚ”3˘2 CáË_–eóŐv ¬ÁˇIćşś—vćKą†™ăh÷EmoÖĹÇ57·ćżíµ,ďm‡Ş´Ź9Qugď5‹ý˝»j« ­ú€ď/q÷Nq*Ĺ)ŃRŽb*‰Fł?šő'hV÷Ë?®><^#ž"$eIF(;bˇ8ˇ\ /•—Âěz qx&5mDĹn>_\Lnnú–OIJ™ÓţÍ8ÎRÝ. l€ý6ăeQQçÍějÎŞőfU4ĹEŤâ”jĆÎX(e»›Íа୸Hw;´÷ęÇX‰ô­ŰÖɬśfš€óžÄČ{Yměş­¦żź¸|×SL˘8=‰bNÔ“Š äT‡Š}:ż>żšÜN®{«}“Ś«ź°h˛ôáBŁÚ­C @…D¦î•yAŢYO0D&ÂőŞÄÄT%$…©‡žSćë˘ďˇ ču\n t Ęu~ţđˇŻMB4óN>ä„5LĘ:!=…JJ ŰśČ ÷Âűˇëcńćóű÷——“émOAśŞb§QĐÉzZÁL@ę*x5ąúxý˙ţJCä"%T4­ŔŰvéžFŐî~aÓe ¦ßÍ?wm€"ăŃÚ\¬«ú^3űě;tZš Őlm·¦˛ż>Ăą»‹Ą{ ĹF…¤3¶M”Ô;Y×ă5#‚"†ŕĐPíLhŽ!|ňü*üöŮę9Żúˇ&9É´w“şMŞĺS¬‰L}ľsĽ[%ŞÔô‡ĄŰB1TXËâÁŢ,A׹›ôg¦ËÄóŃ?<;Óő`‰wšX tžzů ~vM1¤“ß]æžVógt9ÇI˛hcćZယ}Đ+đ(ď[>ĺD*ŃĘ1ćF?¬‡Ňh¦|˛}Xua…úŮb»]ă;pőmKýU"ÜŘ›ËŐʶľ9'6ᣄfÝâÝTu1'8SRČ4<íg Ńf &0c ˛©»€š “-h6R0áÔÂbČyşË b„˙ŮcµŚQ~ĽnÜ)=¬\j…ĹXevPy5a¶ĺzLT@~»mZL<¦4U+#\2CI”/śęäŹOŻÇ°H·ý‰BU‡Q|ď#ҶÄhJŰ^VĐťHUGż›O“ pްöˇwőęc€'őiôô˛žÖ“>`@¤B=§•qňyńaąm^ązŻ—Ŕ ”ôëűIÁ;ś&ÂÄ'Bja·€2B!s=CŔKŔ«P+«7ĂŽ˛úu ¸„—ľşi°\[†o‹Â^Ă4éă)‚Â$Z„đĎçÁ¬°Řľöl’Âţ2a‡3¨HˇB(ş·V€e5u'DŠ©Ýđő±„E7%©X]žáR U&x)Ńľ2M-&€(Bë.7¦„C’`‚†ĐĄC˝‘ ¸eo& A±Ý'«˘…f„!馜îÍjş‘żÎ›ŮÂ6  qżü§(Ý˝üŢ6T€ÖŇíW7<ä2Czš›¸\ş>‹e0Ŕ[0˘2Ć;óˇ0ď»AŠr†WŐÎF 9q §HéŔülö©ŇËü€† .·anuľs=đޢ0rÉłÝR9ďB3K 1ćsb㦄˙H•Ä"Á* É‚kH4ÜB¤U#$A'ăú€“1©Źq2Őń‚Ddř‰>6ě^¬e{m‡dRI[ĎB7Vkt.Ds ;Žu0n o'ăŢÉxëdđ¦Y[žůW4.©_Qî–žŁsátgşüc\Hçf<ă]Zó`F6`ޡŕ–¤ç\ÎbĐbŢßÜţě÷ÎBµOÖ9ľh'WV„ńk„±53𲌨ä'IDSĹOb)#6îhűË÷Í(ĐßyC Ą÷žCβ<Ż ÷ŃNBPŹżC ĽşÝđęA—¦>ŻÍ*»rů˛lKŽg3[âťĹóNp IÄŁ\dŢľ·äÓťU~˝u\©î[ Â^púäć Äşh‰ź÷'÷[Ô¸"U=¸Ž Ęž Rh—%NŔw…ŢšŚpŔ+MÍţ9§¬ěÄL ymÓŔ …e¦ĺ©Łĺ*¦C,¶§łY ůÜ­. 3W•8oů3ˇ˘śű-…GśŚeBĺĺ”l/ç#s=2~«ŘQ| d&4=ąŢCł–jń4c QęÂéy>ć{ź„ŹÂó±P?ËÇŔ}¨9,QŢą;ô0kCü?łN8ÇĎóI¶ceőćůíŔ: ĂóśŐ6_˝&]¶cë ÷ôfň}Ţ@,"—¤¸Ó«Ź˘7 uz~;Lp|§'ŽČTČpŔoÜi!S6°C™Ăťµ=Ů`{fLôůš—ť·đö ŠŢżü÷ßX-]™A—ČNÇ”TĚ1Ń9Ž5hE ^-„áç™xa„8Yq l`' ¦ďÔâ?wJáńĘqÄÚĐć•ő oßgÉ`?~>ťś ˘V4ô¬đÜžaxi»ĺ&ąŘÓŤĽ)¶*‚;§}d#lé]Č×úTMĹ<¤)+Ëeşś'ŕj°-]§Ă^× ¨Ňž˝ĺepk»1ęĎâőůúr€©P•WĄŽ©¸ůC"±çÇ6á>ę Ú ŰžTÇRń˝ě.ÔŹ•~łÚyĎ'¬‡śÝ±ÄüńvwŽZwmŹŤ-öŘlŃnĽ“‡bŠ'üü0lâöKW'ľ0˛„Oť?<~şDą„DAʉsÁł;~NVë}ŤB¶Úkúh/a fiËAřéĚÁý*ťB[AŐ1hvŢžđlÍÝa‚¬ÖćJůÍ÷žý(ç0)qČ€>źâˇgŘ~ȶńµŰÔT"}‘m˝¬8Öł-Ą@‡l> endobj 120 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 125 0 obj << /Length 2546 /Filter /FlateDecode >> stream xÚíZŰrŰ8}÷Wč‘Ę âFyó8J•S‰“µť©ŮĘćA‘([[ş EŤ'ż§"MĘQbUí>lReA$ŘčnôĺPżÝž˝|c–ŮTng. “‰dYÂŚI·ÓĎ‘Ć\ ‘DŻ? yô~K)ŁËŐP¨Ě‹Ůx’o‡_nßžŤnĎř Á>°É ÓłR&Ëł?Ď>IÓłdđö,aŇšÁĆ ăÖ–gJČ0^śÝśýŁ–CHÜň©Šąµ®´,IµSó:‡žQą+ ä Jý>´:/vů+ROg KĄ`&łXŠţ<_•_ü¤†7¤a<É”ó•·|Ë-,§ŐîňÂ_,ň ­ë.nÝ_?kľşóÖ+[J­gţZyżż6[/đe±&Ż>Đós2ă.(ÎUCqάÖkf•Óě_ Ďşú×ýňŹ÷ďď‘LSZ˛$c\±Q’qiú·Ş’7„ůýj($qO[^/HŠÝ|ş¸ÝÜt=ꞔ‹ ý«aśĄ2ş˝Ďi˙m†±Č˘Ľ—sřŐÝś¬—›E^ćS5SÎÔŚłHĘv7™c­´Iłů{ńmhTÄş^Žýčd^N3ËĽ'qň^ÖA‡)N««ßĎß]ľî(¦3’źD± ęIĹ9µMĹ>ž_źżÝŽ®;»ŹąI&÷»ĎeĘŁök^Ą ŹŠ°Ť‚€ZÁëǦk$–&áJŞYżvĄÄÜ¤Ě šÁł/óíĄîÖż¦ő/;‚3Í„áµŕŘp­{Ô3J‡yîĆ‹9ÉCx)D/Ź®ĆK¦]ů–eş*Xóm7ˇ9jšŃ-ÍŻ>˝{×%fEĄj_ôK*˙*„??EüKË$Ęíi`/ěp„9>n>˝ysyq9şşí(NgŤ8Ť‚AÖÓ f 寭ŕűŃű×˙ěVAΤiTAŁLtµFŚ”~ ŹÖ»»{_ř¸0ż]ůfuk•Éhéľ,×Ĺ7ú.ü˝ż)ż\m,·~ZąöźUm Wďçá~U‡}:ň(v*$­µ}‰ćUµÍ fD™PřĚ|Q"iÇŇ ŘbűÝľ=]OúňÄŞj‚k®éşÎşz˘|(ËtZĺĺëP>vË|E*•ťe4”®[T_K_ĺţâ ˛°ř´Z›ő¦.b[¤ŠÎőeŻ•şm¤tO¸îFOy-čYwo¶.úuě8‚Łž[ťáŁE~Đ m6í:Ň2K¤)ă©i™ĺJŢlžOŻHŰŁě˘G(PČ’ XĄ«Ěó˘/ČŠÂz˘”‚SĽ‡IU‹G™ňŰ‚Yţ‚ŤqänĹ#˛ĂÁÇMY8:OVcÚ`O%74ž8}şĆđ˛ő]ľ!Ńű‡Ńͨ`Ď=^ŠMB hH×X[…ţ’’#ůc'Â#,zjT…ź®.JxY±ę»EŹćëDRŇö‡¤E6y̆ bŐ­˘>!ČZG|˘fúýÜVAMg`¤álL,vĹc˘Ńô5€ÓD˘Čí˙¤ëHW×J˛ď„Ä+űﯮmBewDUźPť„|ýśŤŹř@('F>ź?4âŐ”GüAâGëv,HřŹ´xšÝg(HB’fO3(L„9’ATłO Â3¦~žAȨz@\šY•őqçŹbsl$RmçSŕ<ČęŘŮFçŔGVÚ–ťt~îs óŻ»úň7#ś×ŇSŕ6pŇÍQ ]HÉžË+Śľ—u˘‡9˙ł]­żŢ“|¶¦ßw9[ĺ]j%Ą3Ŕ -ĺKĆ[÷so~ ŐŻţS$I:ŚŤ–i$“j7ţ »˝Ńendstream endobj 124 0 obj << /Type /Page /Contents 125 0 R /Resources 123 0 R /MediaBox [0 0 595.276 841.89] /Parent 110 0 R >> endobj 123 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 128 0 obj << /Length 2708 /Filter /FlateDecode >> stream xÚíZ[“Ú¸~ź_Aí“ÉĆŠułĄĽM&¤jR’3—­=•“Ě §Ŕ0;;˙ţt«%c°a9·¦Š–Ôjµúň}2ďî/Ţ|0=Ël*{÷“†ÉÄö˛,aƤ˝űń×Hőc.…H˘÷źű<şéÇRĘčşě UĹj’ŹŠu˙ŰýÇ‹Áýď%đÇ{6ée:cVęŢh~ńăâë·¤7ľHz/&­é=C;aÜÚŢüB éŰł‹»‹Ő2b7¤ĽCUal­+."$KRíÔĽ-@Ϩڬ@É”42ú­ou”Ď6Ĺ[TfgŤťJÁLfa)śüuZVßhPĂŇ0žd~ČeI;źÂÎ-ěW{,VôpU,q]÷pí>iÔ´|¤‹’şĄTŃbBĎŞ§íłÉb_f ´ę3Îźâ6˝â\5çĚjÝ‹ąfV9Íţ“đ¬˝Ajî׿ß|Ú?#™(¦´ěeIƸ8á $ăŇtU7„Ńy5’Ч-ŻDĹî®®wwm˧,ĺÂk˙¶g©Śîź l€ý–ýXdQ±Ę«)ŘŐuŽó嬨Š1ŠęĹ)gÔŚ˝±PĘz3ˇaÁ[ń&´÷ěĄoTÄÚVŽ©u6+§™eŕĽg1ňVÖAű!N«áo—ź®ß·SŠÉϢuT1śÚ¦b_.o/o÷ŰÖéĂŘ$“ŰÓç2ĺŃÎkB†G+Ť„ą‚×ÓĆ ,ŤZÂ9X( Ł^·ĄÄܤ̀/4ť§ĚçĹz ©îÖżĹőŻ[‚3Í„áµŕŘp-:Ô3Jűq?6ůlŠňŔ˝x/ʆůÜąi[ľe™ kşnű"h9Íč͇ź>µD‰„YTíň~‰é_y÷ççđi™„t{žŘ ;~ …ŔÝÇ×W×á}KA¨tÖó(čeW0SţvĽÜ|ľýw; r&M# e˘á|¤˘¶/4dHřL÷ŐâÚ0ÁĺéşIRal·r) ‹AhjĘr3E-ܵM ů@m·)’€ÔqźP”¤lxťéżů|Ű7"şoo°’ÎęŃ'”$Ť™¨«$YqCX‡~€—ě«©ßÝ—Á¸S*Mga Îŕ<:zQÇU ßě¨xŮO¦€ĺAŚmLZ† :Ĺú6Çlňă5 éťSz߆;L{ňţK€§vĂ/«µÁmĄŃĚ@X478ZąpĎq‹Ĺ%)Š©’orÁž@í ˘Ü€ÍÄ*ŃÖ8ťtť&Ç#PŞR«ĚĎąś—7„u¸ž':ąŠ.ś(ť -líb ăŕxWăÓĦ`Ńč|A{‹9áť5áŽÜăĽmUî2 ШÓjż°jktö±/Ň`D8ŠylfAâ9<žLÖ\r.ĺ¨hă)…JßY%öđN«táu á.®#{g¸t»ÜőŞ}íY§YvZ» Ŕ.·NŤĽ$‘ÜÝň>r"V5!Ý©'RóřćfIĐMł}¨š"řűĂ Z|:ŰÔ¤¬ËÔŻ!›Ŕíjô5:75Úý"ŐPäĎţ† C ? ŮýŮ!вn'~@IbO-Ńnt'ě h•©ă°®LŐ‰°?Ś> ěo; ű›úěܡ~ôŕ6ň)Kíyô ˛Žë)$śVSĎa¨‘ź¦ëŞ ý5X6ţü?Ŕ?Pv‡zňŹ/«µĂ]🥭>†„Śa;ŔĆ,<™ctGlóîĺľoŹ<úëcčvSpnµËd'Q!9xxvJĐv„AÇ(U;”Ŕ ¸'>i€§>…#%p8‡(6wfb2-ýĚŠNiĽc‡‰Ái” ‘&ţ~ľ9;'řÂt–vr‹ä1ëq`/ĽauŕŔ^YÓvOYbCiR€Eăşs¨ÚlŔE%MÚ2ÁC2Ĺ`VÔ¸ĂAń.y˛ľp«žňŠ”ťçŐčµŔŘrLÄQ¨­§‹>zÖAbá†NËíšôjRúW+ŰňXÂQ Mˇ/ŢŔž„ą/EéYlJżn9]k–ń mLvé´ „Tđ5˙`$m4#Ŕ°Usjľ?€˙šGđ‹ë|«­˛EÓR‰rąoŇ *+ hô·Lđ7[ŻÔáo}ŢOŃCjDuČă”<ęq»â”µµĂőÝ… (,Ł9ÝŢŚ`?ŃŁ/Â~…+©kćš›4Łg¸űđBĐ=ČËqłg f f’"« ˝ŇřnLěůŢx ü!?[?ă…ľäx%T‚Ţžç¨×vĽoŚi,.)¤óAśÔrUtČÇy9&sÚ=9!ö şdŁ?LÖćt"'lݰ÷‹—Ń€uŃőY2nBň8Jb|Ąťq»É]΄5—DμҸeuÂ}Ç]BşaŢÖ¸k{Çö…­ äÚk˘ĆĹ(Üýçł6ç€,žŕ˘żĽúĄýVܰ4 dv„‡ăüx•ŹŞú¬_#lŇô’{§~śÓoÜďPŻÜ9Ë őîQ)ěG…];ăöC žKţ ŔĘÝ׫pŹáŢj¸‰Za{9ŇřŤÇݤ% BµŐęg~¦Drâ­ ŞĄş,Îk)€\¨pȢ-÷4n›ˇ ďŞh ŕÍ9|{î>ÍÝÔYâO^ŮÓŞľ)k\}hŐżŹ-©“»ső+>˙5Ľ¤őGĘ<ąKĺĺŰ7oĆ/—îV ×_lVŁb˛Ŕ_3­ Ví0)hÓ“,Q]?ş׼UŻéżH’´-ÓHÖ@épUŢzendstream endobj 127 0 obj << /Type /Page /Contents 128 0 R /Resources 126 0 R /MediaBox [0 0 595.276 841.89] /Parent 129 0 R >> endobj 126 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 132 0 obj << /Length 2535 /Filter /FlateDecode >> stream xÚµZYoŰH~÷Żć‰ĚDť>É漍ÇÉ"A®M<‹2yP$ÚÖ@µ’'˙~żęj™”%ÇZxtW×]_}~yöě…T¬*Ôŕňj ¤eŠW˛äĚÚbp9ů”é|(””<»x—‹ěM>TJe/ą´Ů¦^]ŤĆő:˙|ůęěůĺ™püŠJS˛J™Áx~ößłOźů`rĆŻÎ8S•Üâš3QUů™–*\ĎÎ>žý»Ą1‘aBĺśXĹÚ–W:D*Ć ăŘüPĎlóu&`ŇŞě?ye˛Ńěký1Ýe"©’Ě–Ž˘ÍźŢ6“úőt˝yňŮ/MtRTL۸đwP6<[ćCYfÍZ¨ :y…77Ť˙…#†‹‚I\yBoiťĚp*řť5.6ťÓuĹDöŚŻőÎŦĹu8ň¦ö\ÍG›qľnđvH”C! # ă‚UĆkĘí¦˝JădřźŻý“fŐU–%"çľ~ÝaSj&µ +š…w’Qř­Wd”fĹş:J+×0·`P¸ýďshf´Ík8Řú ń&͸ĂO©Y)â‚K(¨s˛äL·$.Ľ5Ć_çő‚ďÚÁhV‰( 32[“âęŃjLfąa]F‡ÂŔ·ĹŽúk˝DŘüůáĺaľqůłČ°Ëy íôO›+úĺ°?^‡gnÍ,~‹wҵ_ŕYçŮß\h";ń·}VV±˘2˙ň䗷²Ę&Jq.'ąd…ÖAfźC¶ž,ýđ×Nd}Ş ŞIU9kĆŁŮ[Ú|„q")ňĂXc:e4ŁÇ6pŕlé×9ÍR¤áEÜ[Ď‚J} ®ýS§NܧęÄí^uZq@ťm‚čW§9¨ÎDF'ß®†YOŞ.¸`RĘnŞÖmŞ–šR5]„ŰžlťrŮZ”’¨đ•E^{–+, |i&đż˝Ë–0–IˇŽçM!@%Ąé>ć Ol¨KĆMą—ŰĘAĚ_…Ő=‚&Ф,áM°$ĺ%SFLY1õőů_ďß}Č­Ě.»‚˘Âᔸú`˝TĚPę«‘Ö0!ÖĂ_!.ěß?˙Ę|‰ĘNnň×›×w•šcyuF#­ű•Z3.Ĺ®"gu›Ô…O| !Ň·Ű ÍT“Ňô;ĽkN1qA»(ZyLóˇÜ¦BŞĘŕhu$ÝžÂŐ“TĐ«Uí›ŕ.¤”‹cIŘ%şn«ĺIĚiÝo.U"ćŚŢ‘â(é­yNLśř§áä0‘âĘöĂD˘„Q"‘TżČËu°˘űϰ˛o4 ţU [öT’ô4C´­Ş_ţqôÇÖŤ“pÔk8pw*mó|; íž# VČX:~­×MnŔßt´qç†ÓnÉwÝ<ó&`ĘM T%+©%€ňEnu|źáşWGĘůďŞmŃN š/Đ„Éţ©ťŽľÓWĐQźzk*ÓŻ»«•(‡čş‘ä: €HC˙âvęÔ‚I-CŤJú»Ăr?új˘Q?sľSâw ąŐhěËAĐoÓQ=N«pÓ6®<(S¸–áΨ:ŚáŮ•źbďu„ Ü0oC¦oOé]•ŐěşŔ Â}Ú´ł7ó›őÚrgôQŔݲ”pGqL^Ó[{GÖ0!Öů´!Q‘Éyââö_ő†`sRĎćyŰý'6±H›m”ńĹe˝Ú©©™íMó0Dů–›n8uv”˝ňč&s}ĘtíoüÄ”đÔĚ?řJfµw¸€« ĺ2XjÂúű’Şŕt܆çě‡Gpă8Ůhő¤ÇZ<4;ňÍηf:é6:!­¶pÓ‰ Ć®śhăÍ4~Č´3Őm§˛EZ¸U˝e‹Ć±ţz%îČIëŢf˘,»Šeť ™@Ă\čâ˙ýĺăjc˛îĂ̢¤jôxČĽĄł1‡ `–řźďĚÇ2vě8ąěK{gI´şOJŔŠ{łÇŻâHÄWź1'Äö#ć”?ŹK08 ¬-ădSţ$ZJúx!ďËžTGĆ;Xą`ŕ*•‘Xž/Á(}ŮÜĽ ±…1©’,G lŔg „!KuŰEZ÷ŰN«‚•vW®~řě+´¬PŘÔηÚ;ÓŮŢ sA°¬Íăü1ĐB=ľX 7L§ş€ąIđ˙tĆX+’Ş}x?÷îučęzyŹ@ EVUâŃE:űR†á˛G  ĄáMűôp_“¤šźĎY;ŤMu‚Ɔ¸JUv¨gĄŇ. ZUůą+}Yô‡!cWĐ33.1l2'βQŘĐ[4óŘĘ´őBçŚ[óŔ†©ž WFÝ,|şîé4*V űâđúj˙ ‡ľ˘UČ·ú1Źăé ·„Ľ±ĚÁ ÷'9hĐłÓ\˛€l˙Ľël9şŽÚqw›#ĎŹ’×ţĺ˘^…ÎĹ´ť‹ŃŰ?t°jg곥éć‚ř˝x÷ÇŻôüW—łŕ\AM`憢~łüíŮłI¨0ËĄ›ôş–éëj\_5Ô›¬®k¶¨7=ýŽp†QŚk˙Ąî!ĹgőS˙+9/ňˇ5ŞČ”ŚÖřFwśendstream endobj 131 0 obj << /Type /Page /Contents 132 0 R /Resources 130 0 R /MediaBox [0 0 595.276 841.89] /Parent 129 0 R >> endobj 130 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 135 0 obj << /Length 2797 /Filter /FlateDecode >> stream xÚĺZ[oI~÷Żŕ±Ů™®Ôý’7OB¤DÉ$k“ŃH™<hŰHöŽ'űë÷śş@µ«ÁxíĂ®,™¦»úÔą~çRü2>{ńĆqZ ĆWĆ-Ô ŚˇÄZ=ĎľTrX3Á9­^˛ęðBTo—Cn«MłşšL›őđëřÝŮh|ĆţŘŔŃQ†8ˇÓŰłť}ůJł3:xwF‰pvđ×”0ç·g’‹x˝8»<űç–F DęŚĘ/ŹXĹ=#Śy&ßŢŢ kŕ¨]Ź›5\;]MŻo`í[R®9l€/ýÚ‚0Ľš5a]Fś;˘L\u…$ŰŰHr‰_67ÍŞ¤­2˝ő:ĐžŢß6Ë!\lŠ=”$J$VćAźH,›ŐëÖŰ®´›aÄp—®˝˘Ś›¶dÂV)‘面 É QTî|Ai›űBIz«YÓÜká1Úömr†HÄ`Ŕ|k›űZ ­€Ď‡›ĆÇ“_5Y,ÂE°“ě‹ Î3řżG÷ ĽA˝Ë˙}ĚsPöQ‘îD’q˛Š›Îč-2|ç]ą]mšŹŐ…ë*9fä{Ó>bűőǰ„ׯĽŘ«¤ŕAÍő¶Ę5¶j‚vŇ®·ŃçY5› |óv`÷Ş]…‹YÚOćA—˛JëJţ‘Ęň:<]ďž„Ťqů”Éi ’Xxcfű ¶Y“RŰ€Ő oÇą—'čhsŹb#GVTż 1ú÷±EX@z!Ö$Lű2_nľ–af Ł aΓün×MTÍŞąŰÂĆ:Ź­řmÄ;ݰ«(ŕÍîŢU»€/‹e~HęY^GĆ™Ě&¬™"NzÎ@‹¦0\Ţßţţáýă|)¨$|B” ¬§“¦ LŘţ´™hŐ1ź;s†5>-¤5ČŘĺçWŻF——Ąć5Ń,ŕ­Ń˘Ł› ú‹n´šlĽ“âĂi{{·h b‚ĂkF8°™űűú~ęý®ńž¸ľşG}/~ ­¬H©ĺ:\ťNËŚi퉴Ľ#¶_ËqŤgě×ßÎßż}]đ&%±‚ť†·Hë0oŘÔ9oźÎ/Î?ŚĆŁ‹Â`15"óĘ«Ń< ˘`Y8HB•~*%q™Ą¤¶‡LÍ,ŕ¸K&”¤ó„mV›ýč®%T/)áÎ׼mBÜO­ďCµÝ}Dŕś§:·Ď/ PçötŽ©,á§qĚŚŘ^ÇLk|Šü8.řâ‚8čNÂW¤u/~&m‡ŻËĎź>}ĽŹĘő›lńßâ.Ň:Ěť1ľ)Ęą]”Áî ·%÷ËŇĄAF–2ŮΓyě]8łÖ3göčĘ€kU^{úlëř_k~ńp3źb,Ü„Żż'—)–ľĄ˛#j~Ű)ťĘŕŃŽXçÓôSڙώŘţŕ‰k±7çoßí¦NŮ5KťŇBóASÚľ2ďÓUmČŞC_5űWŻB­—+vLş›Xżí:Żéä«ntÖ‹äÝ*Ö\ęúXÔ‡lÚ@p» ~™wZoż÷ ź¨Xňűäď ŻxŢÁkůŁ"¸ă>ľs›‘ľ|ŕ8‰„zSÂgP˙'tăÉ Z@ęő“欝öf •ä÷6(Ť{N{ďXo{Źň=řŽ&ö6ˇmcM» R R3á–]«Ă+> îI€Ďëpź¤27رš,ßË-±Ý®Ţ7’µŠVă‹ĎŁb' 'ň­$3ąV ß(âE_÷ˇ˛/{zƉ®{ńŐ'°—˛ÇuJ.*§ędÓ©SŢśżżő©Rn‹©~]¦Fjâ˘=Y…ńJ@ÝNł–ޱ>K8A Ö„y×y„ËśďŞ!ŕÍ7B± Ę˝V†:Jś$Y€+'źĺhˇ H »ĐŢRS=]júé‡ŘN?Ę‘Ą¤RQO÷圎DB.ą=Ă!©ÔńkĎÔ2#äłxÜĐ:LX!Ÿí^~ŔJ@kę1C ¤Ň ŐŃ\ ĺÉ>¶T V‹ŕÇűůW) W~5ďQ›íę$ćR3ĂŚ+hŮ $ß8ź” ĂŠĐ/ŕŘ8ŇfoBJă,Ůh´hŇh,WŚ‚ĺŠęAĆÂ_—Eň@¬Ć×ĚÓJ–j?¬¤öŮ^Č4r7±Îýžß€jbĹ ůj]¸)ĐĐtRFß¶!řŁŐčwPÔÂC xá.FA­1XrĐ#úGH˘ÖőWA‘TťŃz<|gBjŹ´ÄꟀ˝Ń«Ş~´ŰÎg= Na»@4˙Ó#ń"|›Nsń¸‚´¨$duÔ„D Ó/_˘UgÄ [q-®ÔvĂĹçaäV`§H%ýTŃŢB•I@G‹pŔD‰V!B§ř4ब#Áh‘"đ6›Śý#ŘĚßAÄ'6ĺ!ECć—x–ĺ縸&üJNÉÝ\[©jűc‚Ĺ]xčË~…ťâ«źđţOÉőŁ™ ¦ÍÝË/üŘ:€»»!óžQ­ŰűŐ´ąj±aY]7dŮô n „ ¤~@©8p{珫âŘ]ĆłON©Örj%D˛ĆnľUendstream endobj 134 0 obj << /Type /Page /Contents 135 0 R /Resources 133 0 R /MediaBox [0 0 595.276 841.89] /Parent 129 0 R >> endobj 133 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F19 6 0 R /F28 52 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 138 0 obj << /Length 2239 /Filter /FlateDecode >> stream xÚÝZ[oŰĆ~ׯŕ#ŐF›˝_Î[Ó¸€¤éq @ŰŐ˘-˛äJ˛ÝüűÎě…"ER”bĆç 0`QäđăĚîĚ7ńÍĺčőO6sÄi‘]^gŚ["¨ËڎÄZť]Î~ËĺxÂç4űqĚňă‰"?_ŽąÍ·ĹúzzUlĆ\ľť]ŽXFáŹeŽfFâ„Ę®îFŤ~űfłÍŢŤ(ÎfOpL s.»I.âńbôiôßc “ ĘTdwş:EŚĘ „jĺU˝ýű”Íg‹â®XŽĎ·űŞqĺV¶Ľ­W?A¤0í&¬I¬ˇ&×pÍŐő\w+Ôî˙?ŚË·ŰőíźŰő­m‰ŐÄrxŢ÷;Uôü×ď÷Ť¶‹éăŤâÄY×nTÂjUŃIXA,­Űt¶ď(půqéŃ9ľ ®âĎá†ŕg¸’ŻĐx%”©lÂq*˝ýř®Ú®á˙íň&€,áËÔonNŔR°°V\î›(N¸ópŠ2w1VpÓÝęÜt"”ͧËř–€·E8óçü4đ°‰ÜGűÁ¤ÚmIÍOűŕ\Č\h?8¸ŕ °7 öK˘1ćh~ö+(ńËÇ‹±ůĺţ®3ٰ™¶ś0#źµéjRÁÚßsf€´+‡Ş~úÔ;ű1RB‹crˇĄzÖ!%ąľ€`«*ůwąíú»č.•ŘśHpYwż8DKÂ6 Ă!°NI2¨çM±­ÇĎ+؞Ϛ â`QŤíĄ Rňx›RHŔjŘTŁ<ä5“^”Bd'…X"ĄiáXč"˛Ů±âşçovąÂ;fűĽ2˝k#íŕş‹Q8Ő"6Ú äě@.cXÉćľŕđhLJá‹V'_D‘_ÜĆŤlD%pˇ°ě«’YB!Ú† ĘXwPFÔsăµCŻđî‡G=ńÉŃýń »¬ĺńćŚĎ€Ő0ŻźŞ+Qłn°ř;°NŁH=U”ŚáMzJľÎ$ĺ$a| =«€u™”Dj&E›Ö¸3pŇŔI8Z¬¦¬!đ¦%Bb› ríý¸ˇů˛x ÓúK%˘üvĺ–-aą[™{^×K2Âő®ŰŹ'`'ŚL^ŰźŻ©Ôţíś3Y¦´ ‹2K™Xě ‰E)AÜ iĄDęJ*AŕĄRЇsr ^±Ö™R’LOŻŘťRU¤ëÉ)’B×!ŐńöŘş„Ő°ĎVă–ÂÉšym9ĄÉ±aQ,j‚Śi/ —fúT&2sÖifiÉ,«Ĺ,ĐđWd•ŇL\Ć dάӜ(ňě¬Â¨%NČ]şđy6÷ţŇXńüęöwĘdáJ¸XéáSaoMĘ9•3×kĽĺ˝§ĹkZÓ‘„Ü—Ş˛3xÂÂăőd%Ö™•'’ÚgĚ ţÇą‚Á† s…–…›ĆŘÂť-¤V„Y;Hľ¨`ueŚ$rŇŘb˱Ĺ%ÓآŞ$’;Ů,Ńă{¬«6ľŻ~’!!źr!†Ép°Î —dâ$UôáÔÜ€©oľ\ŽťÎ§7?§¦˝QÚgőž$ÇÁ ¨hŽ6ń]F¬†‰UşäN×,<.É©ţ$§[ÇMBŰúe;<瀶Ó*Ö6çxX/±ľ·P§7=MB «4­(+÷©ŐÝ´1Ł%ŇxËę:Bź*ĎŞřmVl®üĂ—ł©ż¶qFÁ]Ů LÂ2 µş]u KGŤZ‚e—2"=Ýnç  Ek'Ňąü#íüIXĘpz9 é”|GŮsLbó"豫ę¬Öˇ‚´(A«x—ňyšß^ÍĂYřަëńü—bé×eő°Üń|Čmiďhq’ű =‡Už/¤Ŕą|ť>č?Ü<‹űâŻÎo7-ŮŇ!cÇug’čr@ľÝé\´ujÂ&ťď:„ ÁR&ÁƆ!–Ę2Ĺ0Đ™bVrě¨4#p\ĎÄ i¦‚Ő•f’H#Í´Äě- <˘ŮCŕ°NO2­ŁčOÍ_±éqÁ2kŁŹ·ĺи$b5l©ŽK`Ď´–5SŞL‡Yˇ}6żÇďWţűç‹ó¶ž¦fá')ążqş ‡ů^šj»aÎţ\›˛0צbo’#(4 ÓĹCXüö°)µˇPP¬“‚’Lßŕ˝…Ť Ł5˝l$‰ôŁÍ:ČF«aVŤŤ —Ru«^ě±^&ŇÝ0!+Lľ7Oęb×’ęöŁ)íq¬ Ţ/Ić“A§YT¦ŇF„©´HSiŮJ‹8‡íŤ?~‘Ç•:ö<5 %#†˛<™ózYX(ŻdI~?\ě~|.9jđ4ÁzČ‘Cë´c7 'Xă7E¤7~˝1ĚńfJ«‚ŐEoIäĄč ¦5l  «ÖIoI¦oܤ7F9Tν/ 9 9ްC±†U ÎA­/tÍ®oFpí•ÇpWow ]©ć¬ĄÚJ3N*b­ĺů QýăęĂLzŘř~ń&ĆBKTßQŞóCÓśĎ({žŢ[íqŻÔĽźŕ·Íüż .9µ4—,:ŁD‹ć©Kś@]ř†Ś¦0ŰAuW”8i9€‚ĺ˛[Ă4†¬hX{yŞöЧ üM)ůś·<ÎdQeŇçVt@M´ä™ ´şś—ă&ô\™ßă&fG™?Ť ‰5^—Ĺzş-fQĆO}đh;ʇRů<ŃŃâ>\ôSř|űńÇďńü÷)ľâ˘2sd¦íý^żžá4ŚćW÷H1Ä?ő°ľ*®WŘE®o ˛,¶Ťřâšy>~n„ď_‚[ČWá“ĂćŤ'V ť ™văOĽł©endstream endobj 137 0 obj << /Type /Page /Contents 138 0 R /Resources 136 0 R /MediaBox [0 0 595.276 841.89] /Parent 129 0 R >> endobj 136 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 141 0 obj << /Length 2592 /Filter /FlateDecode >> stream xÚŐZŰnŰH}×W𑚱:}żěŰdâ$q&öfç‘hK€Ly%ÚŽ˙~Şú"‘"uK´ŔĚfłY]Ő]uętQŻoŻţ°™#N‹ěć6cÜA]f %ÖęěfňW.‡#&8§ů›«!Ë? GBüm5ä6ŻËĺm1.WĂżoŢ .o,ŁđÇ2G3Ł qBeăűÁýMłÉ€fď”głghSÂśËî’‹Řž®®eŚ@Ȩ!ĺ5Ş c7ş:EŚĘ „jĺUť}»eóů弼/«ˇŕy˝­WŽheׯÔO)Lż†IÖ¨!¬Ł&×đ̵őĽ+ë߆‚ĺu˝ś}}¬ËŹ XUžOʏרo{KhŘęßüUôí—ď·Í’”Ă(uĽYś8ëúÍJ˛:f5´’TîdËŞKpŹy‰€‹Źîń Ş™Ť%”élÄq*Ś-Ű/ŕ†Ňäb×5ü_Î*řç%ĐÖ»Uq.o?Ŕ€bŚ­ňßźß^ô }sőĆ\×Kř?«î‚ďÎaµaŇq1˙’°O⺲°ô\n¬Aڱ^¤˘Ě‹üvş3IO§§Ëů(ě Ó@Ł”moĚ:ŚPŁ…`/eâéĎłz ŞP´v$ťËď0€ź@‚﬋»ĐÝ éţŚK‹Ó°iô‰˛›ę,–!+,˝BW—?ŁĽél< · á%´ ĎĂaŔÁŠř…Y!{I^#íY˛WC֮앆t˛×ë««÷ç>H§{'Γ Âv&4őśţ­ÚGgc14µ9€úB3%Ž·fĎN%YkJ [t±iL_˝Ăo›ďĂťuîĚ÷UBzKŁpTߍǂ+t„ă@f˙|D°YÎ|q™üyZúŔťú0†Žöí͂ӳĺú¨U„ów¸ź «Ax`¸ eřPéZć⮂žüJŁž!$%C'Şčw3©Ř¬|nÂŔ’żá2)o ´y^÷ä¶§bîף‹ę­s?Cťă\Őmr)bµDB9ׇ“ćśČÔyX~CÖ.śLCľ'ő©8)¤&gBɵ¨ťFě@Čjl9pP{#Ť†QňXKö!d”´eI3š ŘjEĂ>NÜ‹ŽXćbůĹNÂÜČ{@ţp)ŘäţĹ#č/pR¦Űĺŕźn ‘·iî´ 7g±ąUkĆ®˝ŘJEfz°Ľ¬%–—CŻA}háČŤŰöČíď¬Q×řúíbŮłŤőmnS0y`t!ÎŰNźâ97lŐë2RZkY «í XÍ<±°¬nČÚ…ŐiH«ź0âłÉąy-äaÖś±ÂvbvzŢ.Ë.‘ŞHĺˇň…€mĄâő÷Át”ŐQż ÔĚĘMKű“ zoEÔĹMk˙“§÷h-L8ůúF@žŽ/hKÖđ8ô~–ď?7şőŮAĘË.Ş—ĐŔ”úřµyžŚ ÇEµ}îľ đŇ‹Űk>GÁ6›ŻhťŇĚgŮOń‘Ť:şÁ"®O…OÓ<:ĎMď:ÁsŞv-”mmÜćăölÍĽĂ-}vŁŁPôˇŘŤ©~˛~ôVô)ŞCR„ką)7FŹ…ÎXuŮŚS9FŁďŔ*l¬=6m`ľ*żŞ0>^z¬„Ł±ć€źÚ-ŻHŰž´^–±1‡Ô :<ă?ŻEü  §a˘4o§AÔćâá Oń-ě,ęMÚ_]@Ţót6Ć!Ó8$.'¶CŮy±^ŕ v3_&Âk=nĘ:¦ ×Đ\GC‘ŘęŞcµ’DłduXß{Tĺ«_räI8Ť/ńˇf=ßŃ%°%·]=ěâ-TŢ8ŃIF!úSeo] Ć .ŹqR@ sŔGĂNY8TÚ6+żŐeĺ?ůYŹ 2’և͖:)@^ţÁl:všÚ‡DÚd¶xđÜ7Ŕ÷ë٢Jz.Âű‰öěÁźŻ‹:MP‡h$C ¤ç7@řk"Ç{rš\ç4.}NÎ uĽíůPCĎgĚdĐkćż‘I·ž+Đ#üZEX‡ )HžÔŻ—> ŕÜÓ«ÂŕL„Gč]˛ü›d…VÜc˘“„©á Yňˇđ‹Oxĺń3ěĺĎ÷xßĂßL¨4úB¤ßAř˘¬QCXŹ~€ÎEMý®?yÂČd^ÁŤ"çc®ń®¦ţ3ltkőíŃöŇ3Ź5-†ŹG¬‡ţ9 Á鎷VER;č_”Ő±¶Ą± đL¶¬ťUˇ„b»ą6ŕťÔ®fÂIĹĘłlY’µ˰ž)ťn»T›é!ä!›¶ůlgâM#@# ŔÖžüÝUV5 oŚSŹőĎľ8ňĚG)Ł?ôsÄ(!AÉÍŞŞLz.‡§zí‚$4X$GëO\Č*eţ€†â°$¤zAĂŻÇâăđ°*—€µ“8Ɵر1´ULi#áa ­2sőűŻŘ˙k:;ÇüŐDíúá_Ż^MŢi>~@.Eüü‹Ç帼] ďYŢ•¤*ëžüŠßc-¬(~«B‰ď|^x 9C^„+§TGV ť •śämk|]endstream endobj 140 0 obj << /Type /Page /Contents 141 0 R /Resources 139 0 R /MediaBox [0 0 595.276 841.89] /Parent 129 0 R >> endobj 139 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 144 0 obj << /Length 1925 /Filter /FlateDecode >> stream xÚŐ™[ŹÓF€ßó+üh·ő0÷ oĐn%P)VĺÁd˝›H»Î6ëÚ_ßsfĆÎ$¶7.UŞdbŹŹĎý|žź/žül3GśŮůeƸ%‚şĚJ¬ŐŮůŇ\%śÓü§×Ë_Ą"ŃÜćm˝˝¬–ő]ńńüĺâě|Á2 Xćhf”!N¨lyłřsńá#Í.4{ą D8›}5%Ěąěf!ąëëĹ»Ĺo˝Ś„”‰”ç¨*—;]…RÄ*ť.ŐĘëú˘YŽ-hśă˘ş^˙  `)”Í+Ô„ť%‰˘^čź~Źľ‚'~9´HJF,<Ř˝ě¨Y‚HaĆ ëd•‰°`]˘”Šđ}ăή뛺)!2Ý2;CšMˇX~Q“°/ p))%"[ G”ÝóÚÝĺ}%䨯Ŕ&=ĂWĚHâ¸É´…ěŁ\Ő‰*w˛žbrVËîuŁž˛{ŽRVěUrłóT*łž8 /çP ÚůŢÖhv{żĂđ”ůď…Si÷őÓ(Ă$şk\|ۇϛőĹǡF‚t€ßsľZß…»ĽÇw,Űő¦ .ŕ;ęksŻDÜÖlÚ°ŘÖ;µŕk>> µë÷ăFM8|`Ś8ňá z®ÚV75řÝQłjďíO[˘ôήzřvp¬ěĹĚZ» ¦­°jíÓŁO‚‰­HSŁfĂD”}"r‰‰ÍOęřu¤%‚|2“Y¸ Cç” Ż—ośÔ‚*Ô‡‚=ÔÎ×K(¨U'ÇÓAX)5–ćĄ ,¬âî#•Ҷ¤ÔŕNL °’"Ď”…K4̇ł÷o^ż-,Ďχ†B÷V¦ß=Ł(Ć':A”U&ÂFôÓ z”ÝÓďÝ›ł Ěsš/7ÍŁ\?ÍXţ®…ŐvÝ\…´c.h)1”ÇĚĂ<űzĹt†â—â . uYHÝ˝ÁÁ aÜÍ÷$Ţřŕ˛>ŘSYrFôĂÔWť¦hęyá =ŕĄ_+Ży,ĚÔ‘Ą`‚XFÉ8áÖx)PE_Ľ5lřĐÁ´T™ŇŽhĐĺQqޞĘDŘHś%x3+nęűÚĐä;h\‡ć´»Š ÂŤŤĄŕ¶]ţ{!I„•ᱣŽű¦ŮTëA­¨ĺ î,á2 š2ŕBS8˙q4}Zhż~ŃT7~eňÍĺÁ­r"pRĎKţcY(Ž|x×VM®ŢµŰu6,ż NZ)hĽís4+â“ AHO\Gý`ĺőĂi°ŠÚ ¶]E<é1ĹŹ_ŘUb¸‚ęá+®F†=áH-ĺÁ‘ţÓkĤw-ľşĚlj˟ ő2X§úĆ”Č× ŇżC±m}»íęű®Ëu<×iF;äK4ňg2ňÇÝ>D@YČć lôÚµÍ1îŕ2rű‹Sě˙Ŕ—čĺÍMpÓ—f˙˛€n˛ ×a pŻ ‰ĎEŔ5źżp±Ëe 4ß)dúš6ŹG–Dвt[dSČ2[ŻůČÂŹ,~™pŁF?43‘ĄŰ}dI„M#KŞ_@a4Ç6ĐwŽ >Á1ůä+lü÷|Ód¶˝GđD ĚĐ Ć*5wŹNž5áďvýéľ}OśobóůDhH!®OĂ'‰°i>é6Íć“ ]+1 §~{ěÓ°za’‚8ø0 T!1FŹćPI¬€*ŕŽČ=†Ů®ëĎáÇäUÁÄźđ„6 9ů%Ťß5čřŚÎ1Őň'OR>ýd6U_G#¬Ě@”0¬żÚ«îWzŰYż7‚Ĺ„!é‰ŐYUŽSäáÖ5O¨Ç_ńŕŕ` ZSkOJˇ•yđ DÝvGČQén@Fˇnr9a˝ŐÇI0)“áÄVÚľúXx€Š޶ cŰŁ¨X˛qňźý~ ţ“ťA>š¸>"=ů(Ł|–F«đ±G°§Otg˝Ë ĚÖČy.3éˇe°k¬GíOXë ¶ŇߣE¸‡sŃ®1Tc†yj4Ş%‚¦P­Ű’ šśBµŮzÍB5«3ŘÜâwó1#áŽVúaRcĆ®0Ž“Z·ű$¤–›&µTżHjđ+š üŰŽ0D÷ŁçŤ[Geó-}€Ń:YK÷4ćN"RKďęöYhGĐĚM(ÍťB2I1ö4Ńëd==Iáđđ^v Ś3LűŚs łG Dđ­;&HŤka€Ž§ 0®śr}źÂ­äŽn­âyq<Ş÷“çČ!Ő®Śľ˝OyF%Ŕ?] H|Ä˙ůEAŘ’”ÜReĆĂ8: üÍ3‰M‹ĹFŹ.íŕJÉü˛Bw‡o_ Aó*ąn6ő¶j닸gݮªź ‹UWś×·áf L üń{Ľţ}Ĺ8@™•ŻŹŰ§Ož\ŕˇůňö¶Ŕ©†ďßÜo—őĺác{U“¦Î]Hb€0ˇ2dÜKśJ×Úäá“SŞ č¦UBwYň†‰·éendstream endobj 143 0 obj << /Type /Page /Contents 144 0 R /Resources 142 0 R /MediaBox [0 0 595.276 841.89] /Parent 129 0 R >> endobj 142 0 obj << /Font << /F8 19 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 147 0 obj << /Length 2142 /Filter /FlateDecode >> stream xÚĺY[s۶~ׯĐ#Ő†îóć:Ęgâ8µ•N;id‰¶4ŐíH”]˙űîb‰˛([ÓŁÓ™3g«Ęĺ]P®:ß{[Ý^K´9ü‰vÁŰÎ8V(ÓL[˙n}űÎŰĂolq¦ ß~„1g˘(ÚÓ––*Ž'­›ÖĎ9ÉkR~B¨Ro±* Xač¤bÜš€ő¬cD6®¤ńYź.łň1ŢW°•¬ZÂ6Ʒ몤ŮjźÎpđ U×–€…w'ĺ´śu”ĚŞ¸˛†F &mZÉčyM±ą0Ö¦ť«‚ův8$€U‹€U GXĂ}U-Çđřv ˙*N"Ôđ°ŞcNCXýA¨ą-\vqGßÉt­’šjźW#z W‘ĹŮ*µ?ŤwłŢŕTśčO`fYö‡Oôj‰ĎţDŮáĹŠT ˛7đXÁG%nçÂzV8Á CŰCĄ”Î:ĆÂWÖ„gÇ“ ™ém'—.MŻá•ŢŻŚ!­‚}ÁÜn@Ů4~`Ü ©,+„Źj}čXŤď”{Ú—†9çw Ą.'‡ła¶°0ŕ¬2¬»p«5îNHy•ýŇ)Lř»(ĂŐlAIć]?ňm<«ľďáPž îâ’łí6&‹Ś”s_.irY.–´w8ŞđźVŤg÷´`~—T·UŃ ç“ÉiâVF”˘ć2ń`saŔ3Śßąpű»ˇ˝řőňÓs¶Q\3mTŰ*ŘĺUĘQL(ßL:IV^FĚS¤¸c¦›"°›ŻççÝ››}5[fEr¶wťÜY•őĐÄČś,˛\ö«ń|FóébRVĺÜŔ‚łĚş¬ÖAp°ŕ7«;4ĚÉä©ău˛§ş–sťNËÜ2ĂŐ‰´ĽvXËqMöů—łOď÷°iÍĽ§Áe˝ŚMC\˛Ĺ¶/g×g—Ý^÷zźpăNmm@‚űv‘Ç’ĂAî2@‰ĎËIXvÓÁ› +´řM«o™» C˘Č>CÖŢă'ËÜ&佉ŢOx0Lő:ÝŚ‰‰Ć«®âŚohóó×OźöE Š]Ćܱp¶ÍĄ=ťŤç™r<‰Ť×„´ń´ć? ¶dă/b‹6^Çvţ/0ňóhă;č °Vwp$ęel…gžűlÝë}Ďuz·oÄÂd˛˝FoP‚y­ăŠÁ|–ÇäÄ ¦„ۡĺŞ?žQ2ńŻź"j çňľ?ˇůÄQj?°8äĐ˙kĂ!;”'˛č­°Ă×Eß|ýđáâü˘űą·*ŤÂËÓŚ˛^č4rŕe÷ňęú·¦ĂWľ»˝öŮç9¦ž4Žą$:ëűQ4 )aű»ńún“=aJ Ç?-C‚<Çů'š*˙ŻŞŤC–iA0ČĐ‚(˙‹ď‡l5ŽS AAŚŠ,”ď}Č.Dc¶) É qAj¸Ňň/cúKđ0ÎŐ«ůejŤ†:Ă3cS†Ů• 93gz#ćĹ’E3㓝ϣk=ŽĐąŔˇÜ&wźÓ•˛ÔęYBżWRm5âv˘‰bVîa#7ěí/88@ń¦)3>F”^GńĐa÷ah%°h1T{­ă bÁk•–4ÉťB#Żb}‡§1 SzË6Ńě¤ÁŢfÁÜňEą‚<–ąlSě-KŢÓl6L,)žč&xG Č?Ú"ÍÂAŻSąXŃä¦ŔĂŞPv€47裛€› YCŻB±¦ˇpĐ»#ÚĆۆvEMPŕ—YKő9°g±ůVč¬0ŘŤać9$aĐ'ýń¸”)€ut30KÂrçxď°đ*a4Š«6©ŚcRŐâ2O•\ČćSFB>Ş@ ůőŻ_®®;^f˝ý}B†a\Z|ő,Ąš¨?‰Ę·˛ŔA1Ą­Ż»ůŇ=ËĐE(}}˘QÔ^@‘r„16.¦čU]´µI"ö)€» ¨oRzP—ôGoR3®Ló&“¨ç›ÜA+ lď¨ú&—ŚóN pŰňŚĐb? ›aa'ÄB»çąÝüďÜđ¦CŁ[€çźŕ“¨ŹQcR¶{Ś!vÄÎâx¤ŕí“®)đ=#°@_0óC°ƱFeďAW—7 ŤĐÖHY–ÁćĹóŤĂ6‡ŘYóżďZZ’°ś^{Őçq˝áň0ˇ’+š{§˛4 nŞ ť’ÄF×Ř;-§ó‡rµiƶi0‘Ôr™Ű'Ľ:lE…nĽ×ĐňDsĹŹPËSÔYÓĐzŔĺł|ą±Ĺw‹+źb[nŰ`lČgxl›‰˙…¶Ůl›4¶ĐćČ/±…†ďc°~˝“&NP.H°-ĚiĘ…š°ĺBZóŐJ.gćD5ŮVÖaÓ’#z §–Z /‹†°ă›hŔÇ4Ń<¨Ço •pÖ« 8Xš˛;&ŇŘű’Lrýb߀3nôÉŰ^Ď~(°ŔE"–nî.Ýŕě!±=˘tŘhÓ÷B)<ö¶\§ááŤS gą 5>]–%\Ś4—ŽÚr,Łbp‡˘_+łŰŠů›ÖµĚĂÉT .c`÷ëŶ) ł7ú?ů•ää[A䇦 VăEŕ+ VÓş4AŰÄc ś‘^g‹ţ}l`ŕÝcGqüĹróÎ}±ŕ kÂŹ…8Úh*ŇŤŻNô0¨®ďŻÎÄůSőő`F!K]Ľ{űvęăŮ`±Ý üţ|˝”wsڬËű’ÍĘŞˇŁ-_SŚk˘íŹçcBˇc“[rn;ą7ĘfĘĄÓř Ť—!Aendstream endobj 146 0 obj << /Type /Page /Contents 147 0 R /Resources 145 0 R /MediaBox [0 0 595.276 841.89] /Parent 148 0 R >> endobj 145 0 obj << /Font << /F8 19 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 151 0 obj << /Length 2660 /Filter /FlateDecode >> stream xÚ˝Z[sÓH~ĎŻĐŁĚŚD_Ő-Ţ d·BA`gvŞL¬$®rěŚíLČżßďôE–"ŮqŔµEeąuúÜĎ÷µx;:zý/›”yYČdt•pasÉĘÄ–[[$ŁÉ×T 2.…`éűĎž~dRĘôd>6]WË«ńeµ|}8:ń„áOJ–mňRęäňöčßX29bɇ#–ËŇ&¸f9/ËäöH ®gGçG˙©e°$“"×ĆvE¨Z„P$‚”VEřÚ–’A•ĚťKmHĐ[2›ÄÂâÂ[¬ /‰KśÁ9ěÔyńÔ*®E^2›4ÄíÖKę2ץęW¬đÂ2er¶C{”Aż «{Ś, ĽP›(pźçĄÖÎFf °H “y!­3ňřĎ/źĎV¤Ł®™ö«źŤ Ě5˝1̢¬¬!¬Gż‚窰-ýÎżżdB žž Ó??}|ިĐ<·ŠDŃ(k·˘BëŽ#‡aŇő)ł|E"˝ĘĆ#xÂ0ŤMhíô–ÝÎđĎ1ŮD]ÜŇĹ| yş~j¤´EÎx±ż‘*g(»^#٬ޑ-ŤeÉcĽeäuE˝†ř»ś~ż_GíOq±@[ŕé¤ňh9-Vä´É¸Č…ő5öÓě¤'¦\aSĄ“˘äđ4˙µä ˛˛†°žäCI!Më]qĚŞ[gšďrŻ`ś(ŇŞ}÷÷AVhYwEžž»$ÎŻýňůVÓŚĺO …Ö9c*©Ëöç«_ /*óŹ=Ű–h˝fb{ż,ŚÉ-ÔţR› ôĎO ­ŕr笳F" %Ş0 2tĆt<§O›Ž×äüÇ a*wľ '&áŰ÷G˙ ą+÷éÓH™(Ü~™,s«ý~.Ţ×Ő? w¶.ßš>×”¤XóTśvF6¦“ÍťďôüŁdŽŰă[’E2-tz^Ĺ„–Ťiá®ę’vOĚ\Ę „EO +ž!’‚+Ě©}RZIłĄ‚¨l#ËG¨ˇźT ]ĆíBůúÚő…[ťRą „ŕôĽăqά›şŢĽőÂűféĽMžŁń(T*dn oK O‘óáLěE͂ʹ7řżň â~ĺ‹—c˙ń÷ýšâô/ĆU5ń÷BAÂbî¸@ů¨ßř_/ÎNňn´Î‚ĺ%|ÖČť{ŇŽĹĘôŹA©Óńěľz6 _XS_|¬Wß:SpXa¢!2‡Ëô†št1Ť0Éß%oşĎ›Š.ď¦.Q+˙«K¨ńú’˝™’±×=Y„fâ¦ÎEOŐ’4Ńâ ¸®cĆĚۡ;˝řř±# I(EÍCČÂgµ$o.–=ÎÇŔQÖ·ţ24×/T$ă%T†_VĎzÝuÝůz·×G7=…*ŕ€‚‡Oęł-Jă*Îč+g b ŚH(7”‘—4ćoč.wa¤_ŻC'ň7)¦t×ußđ\źqUR g"xÚăj׌ Š!ď M°®™Ţ wĽP—Ú¦j®|śÖ7ˇíIŐбY Q!˙uĆ:.©©b¨qć=`_YŚaůë@}#gN+0Ýléű*µ/J7‚ż`NÓę> ĄĆh-wăt*ĺHV NÝÍٲOý—ęÇtµ^ůkWSÔÜ3şĘ:×"ş"OÖË~8ÇŸvśkE €’!ŻžŁß=Ć™®ýg­Ělćo|wĐ& ›eu7müâa Ť;ÉgÁ§y6Ńő$.,f1 wójżÝ˙ L{˘I$NéI—aň„<ďAúĽFú}0\š"/ČkŁBÓůşK„¤Ía"š×Ö‰Ňĺ4xL"°Ś%°Š«j>Řôz€˝Zp-¨‡×îž_ĹyŁdC˘âPOń›®ţÂëŢ? @'ĄŔ‘{ÍgŽ™ąexYYCď‚ …$Đ .y˝ˇC[ďŢźwI»D|y,é7ĚŇłSŔžŚVËńzJäŤ~Ľ\ÜŢÍ@Ŕ&ž %¸şMU­î//ÝYČĘéęŢĺóăŔŞbM/gţę`^Ą†űĚaĽÜ¶ŐËqŤSěôŹáÇ“÷ÝsÄŁ[µ[7Ěbę„MÝľ φźŽGÇgݶirfä&0‚±Q±nęÖŃj4>˛5×vß:9^o­DYôHĄ“Ţń>ßîą­ŹÓV=­‡ĺŚGűĎ'|[k5ŔvvZä7éÉ‘ź ôBńĺçFŘöü kH±˙ž}>ýwG3©räČAó˘vë%ˇqSŻ÷źß]|:>í0UiđfÇAt ˛v+ęĎąi)w|Ö-¤CQňşd:i (ĚőžY\8ĺ×Nqŕđs–Îë|¸o\ű Âl' C¬MśáúđćT§ KV=H1ĺž…Ť.P‚pl/ Ź cŘŕé,č0´¶˝€Âßŕ/ÎŹ·Đ!‹´KŻX@ ˝†ŁŃŮÉŰ‹QW7«ŃPËĂ(díÖÎŇQťii÷3„l—ÂěWB-J´%p§Őí× ł<މ=¶¤{7#ű˘»©ú¦Śe¬x9…ęCÜ€!Ä *ËĚ˙÷ŕ›H¨¨™ á¶ÝŐŻčĽ,xťČ¤7S˙‚ľzMźÎá“p/ aJĎhüőâŘwľÍ´h ¤Ç°·µn=ăƆă°@ hÂť{ ŮE ¨R5_tQ~LęCîŽĘ€lĽ ’AĚžŐxH'şůF(Ň!"C\ů­ąęeő45j őś5ňő€ü®üľ5kÂ5QŐÎ…Ľâ/ßbęŘ-ŻGצ^ ń„J¬Ëj’yXŤ&%VŻ@Ý"KVʸ÷,c:ÖŠŻé渧L‚ńť€PŁ˙Ć14Ąs U¸óyç’Ó˝łň7Zo&˝’P†jYá;\Üú_Ht:žĐË­~ţż=eAN¶䛳NĐI,w3lO‰D•n°ůŞ §Ć×ŕZĄwăkWóţŰĂ@2:zŞö?ΉşSZăŹApUgŚÖiMfwţG×Gń ¬÷Ý˙Í9ŚEHĘܸň»7Ż_ÂΗwwÎc´˙â~yY]-¨–×U>ŻşíH€Ť~Đ^ĺˇĆG>C›Wá¬G U2«e‘JŁń?? ĘÂendstream endobj 150 0 obj << /Type /Page /Contents 151 0 R /Resources 149 0 R /MediaBox [0 0 595.276 841.89] /Parent 148 0 R >> endobj 149 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 154 0 obj << /Length 2537 /Filter /FlateDecode >> stream xÚ˝Z]ŹÓČ}ź_‘G{7ým›·ť•@0paX­Äňŕ›x2‘ň1×ÉŔňď÷TwŰŘč Aw»RU}ŞęT™ç7O/&%+­šÜÜN„,âĺ$Ď9+ ;ą™}Jtš %%O~{›ŠäMš)Ą’—ëTÉ®nn«i˝M?߼ş¸şąŽ?bRňInrV*3™®.ţwńé3źĚ.řäŐgŞ,&_qÍ™(ËÉęBK®—.ţÓÉŕ“LIfňb(Bw"¤&¤´¶áëľ” Şdą4L™ś='E>)`±őkČ›´[śÁ vV<¶JÉJ^L"qÇőR¦d¦ÔăŠY/,3ăÂćĺćŻÂî#­ÍáŃ)±"XiŚł’cŃČIÎ5ÎW:3Żţ|÷ö}ZČäfh(ζ»ż{†Š!GO1kee‘°ý¬`Ú{ú}xwő‚Ŕ–ÉhË“é‰Ó+ăq€.wO,ţĆÁ­–řç M袦‹]¬S%ĽŘT…cŕ¦8ÝTÍ8P=jj+k`ęžĆĘZĆKµgjÓ©ą!-ż¤J&őĄW›Ĺv­1×nW†µYí˛çÉL"ą&ĎsÜ+śüż¸á/˙|ózpĐZ1«ÍÄ– ŘŃ˙î ¬,6rĐ:g€D÷‹ËzĺLó9ĺ—4łČ05Ýőçţ‹ŇÚ&ж˛” Aq+‚¨ăFČ Ëĺž—NS:Ą&°Áőrî7‘ ýµ(?Ó1´˛Ž[ %RëŁc-p&ȤŮE7Ik€\&9ä ä/#[x‰Ç6AAĆąžDiéçó©KÂ2˙ŘwŻ3ŹËĂÁ" ­zçčľJÔ>máZ*á,|ź„ßjóµ.S(˝«ýĹöŢ-ĄF&ÓĹ_\čšľĎübĎeä:‘ „)”é«{2Ú3ŠdăŮÝąmčŰfĺżUëŢ*ŞĎeÁ$üĂűŔYS˛©16C &­ ;™_Ź*˝JI@Q%+Ś·Ň§ˇ …áúÇY«t°Ţ҆ű4(Ü^or›šf~SŐ&-|<ě“kä,Hśů˝$ô–ÜâŚĹ—1c%—LIsČŘ⸭±¤Lâ,M*$‘ĄŚ¬Ý=8 U¨äŹ´4Iµ|¨źyäz°‘"/ĂŹ|Z¬wźz¨‚ˇŇ†-—ko9Ż2Ůą_›×ŤżŮÔ÷Më¶m›ü°k±žű ›uď©Í­ż·»‹Ľ·ˇň¶tgő•ž_󠸀˘•çâUäCý…×},K),mÔÄ v JÚ YJ¨â@© ˛˛HÄH!ŇbJŃý #_Ľ¸úđačyˬhđ,Ír«’Bmn῀ئÚ-ŕW·8ݬî—ő®žů´ţ!ˇfÖ¦HHŮ>L§.\č··żËĺ·´Đ-Äb/gţę|^–¬Ôgňr/찗çŘő—Ż_ţ6ĐMkV(qÝ‚¬ăş-”¶ÜÓíÝĺűË7W7Wď‡Y gŰ®Ô-…í‚ŘóCAŚ/ s„-xn6 ~ ňŽdUMµBÍh¶ßĺľ{a*3¶Ťw*PCÖX{ éÉAzÚßëČ”ĺĘóňębJôýŽîBÂĆŻ651Ľ<0<Ż=ËAĹv™?,âÁĘ„łň^hĎ„žs2:" 6îĄH@h4ű=v‡'c’Ô§ĹŽ6Ĺ<5p"jSZFLff]2#ŐϲĘŘP ôÓT%¶-Ów ˝DmâEŕŃ›6´’;[é¬ŘîboĐł OZiqxÚ±{˘‰Ő4ôôhŪďcÖÇaßľÔldÔ§räőďÇt˝śCSş°#Ň•‡†t§*uŇŚŽĹ‘ߣ6ěłP˘×ĘŐńť2HľâÔ]»ű,3şHŘá]¬źźŃIQžÍH0óňDTŇú2Üß}‚ gT÷"C$ÜdË7ÝŘľ«ŞŔ/µ˙~l°ĹňĎ'…ł¶H+•›ŃÁV ŻĺČ/Ü0tĹŃ\k÷ЬĂ\«LíçŐĽ $KÇĘĆfO%ôk+§›^Đ<Ëă2)\ú›ŐÉ©ÓÁMĂfUK™bÉ­Ň#Űq±WşŤĺŻÔüËÜÇ|ń…~ËÍ𪹿XăŔźx%ëGó=4w†ěmü×PwéŇ×ÝĹôÎł%x×€pﱥ»ú[řq'%¬×ÎäÍĂT2LĂȰW ¨{6$Ű4~VŘřŤa˛±Ő0Ňjéo{o“]7“KÔ`ĂŐIóCdDŮňĐ]Żg=6KD3'iĽöx–HápĄžĽj_€e–|ĄbŚ›•LeŚ0ÉjąÚš!l  .ŔmjčîK1âží¦‹Š€2RÁ›9'ś´Ô4Śe.Ö•ĎJşRű3§u:<ľ!ĘĺO·ŰĺŻwÄđŠ$N˘S Hc˝”HľúÖúô pٱóCÚćÄşi©Ţ" ,+˙Ń(˝Y?Ańlś«€ű1·›•9,Ň 3ž[ŽĂǨOšđjf Őˇ±®G§Ľ9j"Ĺŕ٦Ľ×›@†ł^#đr¤ĎŕČúGa] kß5·} :żŞvĺCÎz>’,Ń kűŁÝÍÖKď&Y±G@ÂE~l•‰’»ő{_ ¦đY7®CmFĎŤý¶ď”Ä˙ąßF•íÄś Á˝—LXľűę›U…âX5»6âw(uŐřXë+… ’ĺ~-©> endobj 152 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 157 0 obj << /Length 2665 /Filter /FlateDecode >> stream xÚÍZYsŰF~ׯŔ#¸1ĆscĆoŠL×*eË^JJeËńM‚«H‚áaŮ˙~»çŔA€”*fĄ¶R3žľűë˝»xýÎ$–X-’»Y¸!‚Ú$Ď)1F'wÓĎ©dLpNÓ·,ý0Č„éőjŔMş+6łń¤ŘľÜýv1Ľ»` …˙Xbi’«śXˇ’Éň⯋Ď_h2˝ Éo”k’'S¬M–’‹0^\Ü^ü§˘A“Lp˘rÓ%!+\" dZęđئ’+YÎ*GBż˘Ŕ,O H¬˝Äč%q‹€śŠ0řK%cĘÎDŇ yš7ˇ$áĆö3§=±LY@%ć^Ą@ĚŹÂîAµÖ„Á((‡F¬RNRšË<É© 'ęđŹOGĂÓ»® `?0î~ÖŽ‚(Ć{-™EZYXš©M‹żŰOĂ+p8ʢ÷Ýî6óŐ2 f´­·91\ÂřŢü;l^.ŕĎĽ7ĹA%VÁŇݡŔÂZÂęyŢq ˙î8ŇęÜbYR®ˇ[?;`ńŇs˙oć_÷»Čý n˝ě-ÍeÜ*6 šć@Ń8JREŻ˙řđľcX)–*іݍź3l •5őVć\ :Ń9ޢX:™|ů× 34O ś…™<Ý˝‚EÍTúdţÍî6­Ćh[H:đöÇ“â~t]í?p41T9ÝXĹÜé‹rÁ!“ńb»Çȉ€gP;TČN(•I#´ţ~ŚJî‰eţµg“îW”ĎlZ+°NCď˛Îĺśjb©N4É2ďŁ_ĺßPÁŇń M:ޡBa 4>WřŮocŚť}xÚĂxë O»Ç0Ť[J¤<Á?đ†›]y˝âÎĐÓzz»(î§'8 tîG8s Ô÷ňFeĘóâd"'FřŇ4r.„ńˇ'ą‰­ŻQN2üÝE©0˘đ,!ÓoĄU'ěٱ`¸{ôń†»śŁtżd‚•1zδžőîŢ4ÁQ $ â@Ą«äăq ¶łMAö›FD&ŚHXĺ|^Îe*ŁÉmHvźßĆůŇQ›¶Dš¸ń˛Ë„Wűu µĺ"“Ą]‚’äÜ„6Ĺz“Ó6†łMws˙n¦t^©Ç Ąăc9Ă_·¸hÍÁşSKHpĘrĽ›`NŔ]••Шř\µrš¦x cN•fôpľ  đËöYőú¤´ëh"M°¸éî±čžÎ1š…CźŰŕč.) é[ÇÚ5CąĘĺ “ąHźśĐA|YKüĺP)ĽďűI EśuľţCvWëTNąjé´˛銟Éü~i>jÇ.Ő>݉F¬€cŕk>hđe·†–÷±V4bÔóýGŕŻ=ľµ˙I™,¦7ŻŞ7š —¶¸ä®"¶áú$¬m„â˙¬E®hŁaoÂZWäúµB1ŕ€ťÓé6Ů€3‹§6°őh![,ŁnuŐŠ™ ~¬n7™‘*kôqŔß:čřç4Ćă`±Ę× ŘyŹĽŹ®{đ0——&ľśNţrAQŔŘ*Ćé“îT5Ü‹Úp‹}Úŕ-•x Śč„n°ŇF@HŘiÍ*ěŘsŞpüDg»WîQnt=‹<—±jCäŕśé‡A Ľ×Zs[V˝Ń5€ńvĽŚž|łădŔYgRŁšhě«\wsı°¶uP ¦1ÜaüÝż>LUśŽWE íüÖľşŽ¶črßOT{ÍnvžŠ?H­‚±y«Uih 2Ňb>›űdÔ…^Ś]Ŕ;7şĘăA×U¬yhÖĽlNi^6ce_lŻo-ť XşŹ†nńĂÉ+$ßŰ @¬S¬‡gëĆć«]·†°‰}XhLçľ[r§=?yĽ§ ťOąŞµ×[g%ş(ĸčľďłR`ś5S©·*tâË4Ë»ú罯 *]†ŕîÚëEWJL#WgVÖ ćk@!QYVčpŘýŐŐđö¶«yM4‹ÉüÍ Ëµđ=A®S®}ŘlĆ»9čŐ-NĘĺz­á44OŚŔ1­Řî'>†]ŠÚÎĐő‹#Ł‹5µśů‘×2;‡š1Č”=“škbÇŐö8Ćn~ż|ý¶ĂVBÁÎĂ[ uš7 p]Űoź.G—†wĂQ·2ĺ„ć˘v!=D@Ьťä Ń–Őץ+~áÖÄĚ÷Ş'Ó0ىa˛ĺIu[ l„ŰŻNJUěŘqÂŕWşĘ>.;Çd_ ¸‰U©'Uk]Ó˙:-7}śk@Öś\ ¸Ě»ďIą€ÝlägľíÉ—qYĚŕ7÷ďßwIPČń¬ťµ[!• ĘÎąDz®Ş‰©°ç%!uŢŞ:Ĺ[ ©oW˙†ş !Őţ\‚nwć<©ÓĽYC 5-ކŁn łfČľéłîz±'XbŔ ť~Ţ­›~ß‹zhcRúFrěđď¶ş.n”üĐ aš6áŹdăÉ.$$Öëűcćśő„  (Îäü5±ăÎö8}BĆľýty5ěp§ ď56˙wÖiî”k·{‡A‘2épŢî@rÓ¸Ón; ‚6ťŮł; hżĹ}9ś bó¸áäe®Íć˛Nß™bx7ĺZťö>›e1%?nHŢn¨FĹ ‘¬„ęŕnŞń×]NĂŔ_ŕ»*7avVşý"]»®ŞÜn#hýş[6Ĺ8«î98¬\mź\g†×wÔś'>ÄŽĆGÜă‹Ăíý»w×W×Ă›Îí§€2h ?ÖisIo3řařáăčż]ŹXf°ŰH“Ţ”÷ĹÇEüÄTîŁ7qż µgU/„®`…÷ÄbYn~řçâű|‹A¬tW“ĄF Bpâ8"ţaËߣ¸f€Ą˙„oąSó3ůVMě¸o…=ČŘ»Ëë÷Ă·ĎšNZST!ď4MŇRPř~1őCgÔť-ŢJ8ű*M¨n›wR.ă-Ź7—OÝĎ,‚đ;…—•ňď˙›˘,ĐÉjB^Q*‘ŕýĚYúEÉiťşü$,ÔńrHÉt=~=đô4đ—mŐ˛_\ˇ~ÜMîÁáFU§ Ş‹µ_tíĽÂDyő Î˙}3Řytđë7Ż_Ońć4ż^;Ťáůĺ~3)f%BŚÍCAVE·MáĐĎćˇŇ;đo®}ýáq|ĺ9Ą[Yý#¨˙°-¶Đendstream endobj 156 0 obj << /Type /Page /Contents 157 0 R /Resources 155 0 R /MediaBox [0 0 595.276 841.89] /Parent 148 0 R >> endobj 155 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 160 0 obj << /Length 2074 /Filter /FlateDecode >> stream xÚÍY]sÚČ}çWčQdW“ůÖ(oŢÄ·Ę©Äɵť­­Ęć€p¨Â@v6˙~OĎŚ„@ÂfęŢ­T@–zzN÷ô×żÝ ž˙Ç%+¬Jn¦‰Ž)^$yΙs6ą™|Lő0JJžľz7éŰa¦”J/CéŇMYMGăr=ütózp~3 Ç?‘<ÉMÎ e’ńÝŕëŕă'žLßăcăEX×¶Lhø€×„`… YŔëÎçĂŐĹÓvb7ť.° VŃ.~e¸Kë=ĺtݢüD&ÖÎ"Ě>qÇ6ÂŻ÷Łůl:+'—´éqżbZ†Ż?ąĐĺ$"ń°I  ‰zQŹ ďa4ż/˙çjg< ŤMýZdş¬j·‘Đa‡íĄUŽq§»)¤›’šR’VŰřgOµů,yâ`Ť ݎŻŮË'<$Ă>ĺ>,a“BŹMͤ+úÁŮ ,R.ěAe~)‡˛pĄ{ 5ŽŁ¸mąŔ“xś°”çL™X‘3®BöţńţÝŐĐÉô¦k' ŹÉká'«bFČţ:V«Ę¶şzŔYÁ4·Ŕ]ż?‰X)P[f Ş±Â˘˝çŕPC4Îţ™ÝÍńqN)<á†[t*%‚޶ˇ*7LęhC5¤LżˇµŞ}Cw+¤Ź’;†V Ć%A| jZž´ř_!G6µ%—¸¸ŽŮŰö_&s\çîć¸WxĹrĂ/ţxű¦s¸Z1«Mbąe<?wşQWÖRÖsĽ:g‚Â) 5­l ­ôŮ0s<Ź}É÷Żxh…I_ÁćwoŻáĹmZŚčśŃw±zE׾Ć7ňľOGyŽ“)ăŔ($Iżű]›ŚGóË  ˇ†żá2±ď.ŘÎ8×I+»~<|j#‹íĐj'á!]ű™QwşÝéÝOôzh&ăcs­…d=xj¸~ąw ëI8ĚI…lĂßÜDěTúű°0ľG>9©}ś-6ź:^BÝCAŹ"gŃ T'‹8%Ý–±ëV媪ËÇşN8HůlňSÍbŰ–·ÎöŢtI…tîť˙Í»ÓÇE.Z%#‚5Hä] ĂEßWˇGWF `ĐDÜŰc*:Á˛ue-e!UZ€šŁ)Dłˇo@^ľ<żľîşŢ2KĺĐ ˝fąUaĘ-¸ňˇRVŁÍŚf^z8^Ţ­ćË'ˇˇŐÉbwŇZߏ}p…’¶žRäÎç߇N×ÓnŰÍY¸ n>…—ŤŔd Näĺ­˛Ă^Ž2Řĺďgo.^u°ˇ8%N-ęzZTa‹lďĎ®ÎŢžßś_uą şw®¶1 ‘ŇçT€ęÄiŐ­ Ę0[-óEí}B†®žl~í*Ë„łĚ!.ú9`Ä:Üŕ1¦8Ń(5 ­ŔtZÔqN%0ÇTţ0†ôń´™“MĹÖ=u ýSÔ—ŢĽé¨đ5łŢ˛§¬bĆÂ9Ó¸±˝@ý;%óŐ,O1_ŰśČĚ7wµŞ)N˘ZŢQËÓˇ~RĚ l"ĆÓŞ¤—Çî5•ŘťëŃ&‹ĺÄ€ŹďFÁQ”9Ú{ m);ĚFŰřĆÔK)L:ýTjÔ} µ®ÇbT#wžyňDڱzÖñ"uő§Ŕ˙ëfÄ —îx#cĚQWÇČ=Ę Ę„śoy[’Źdި"ť”—ýlŮjďb„ŇĺG±eYĎÄN–[ĘłĺZč˙É–ĹŹ˛ĺ&ýĽŠěpĺâ\™0q.úɲQ0["Ą N´E–á™2Ňe˘łÝ±%ĹÔSÁYíŐŐÎ ¶5i[,Iý$’ćĎßĂs·E“óúŐ®'ë“-sîeŢ=|šŠ„CŢt µ/°.Žž-ű>ÝoĄT­t;FJĐ’ĆH śIl¶ź‰y~ďëÔí7ŘÁLlŃ?\ôÍ…'OźŽtźa,xÖĄÝÚ1cÚ€ŻĽKĎŠăŻBí_6tŻ;sßş@źre3˘·AŁ|qóčDŤŽŻĺŢŹ0ő[“˛"ç,«ŢI[h¦¬íaě9i˙ŔoLŰIN?üCő/˛÷ ‰O†G¦SüÉťř÷NĚö_41+¦‡=Ŕčźů4čɶŠBá6 ř΂ŢrX´T™čÂżZ¦ÁŞë8ÔjtŰĽ˝$¦x:j=ôÎĆ˙śF2Dä;ü«áöóUxčÝďWď^ţB÷ń”×ohĚ?ź¬^<>ˇřăéxµ’Çh˙ĺ}5.§KŞŠŐmÉe7Â%fѬY1®ĂËž×ţíP¬˘:xÉąE»7ʦşéÉ6 _endstream endobj 159 0 obj << /Type /Page /Contents 160 0 R /Resources 158 0 R /MediaBox [0 0 595.276 841.89] /Parent 148 0 R >> endobj 158 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 163 0 obj << /Length 2887 /Filter /FlateDecode >> stream xÚ­Z[sÚČ~÷ŻŕvŁÉÜ/ysźSŢJśďŮŞl´ ŰTađ8ŢüűÓ==’%0›P®2Bő|ÝÓ÷ćířäőżü °`Ő`|3Ň3ĹĂŔ9ÎĽ·ńôËPŹ ˇ¤äĂ÷źFbřqT(Ą†ç‹‘ôĂuUß”“j5ú:ţíäl|"ţÄ đ3Že“ű“˙ť|ůĘÓ>ří„3üŕ ®9! îO´Téz~ruňź >(”dĆů. ˝!!5’@ĐÚ¦Żm*@)ś4L‡„Ţ"Ă tă±z“H¸ČňĽ iŹ/łĹúk†g˝¤%§ JA1!ńÜŕD«šn m4p•# ¬š-niÁ2ŮHk¸Ľˇ{YÄxď&Ę,4ŕ ߏ*z›€ Ý’#ОtЏÂu¤ ÂŢÉäÚ¨1†{HĘďH>©bK‹ś_Ž‚4Đ‘·‹YÖő»wgWW]±[fE¶¨7ŁÂY5Łq„÷€z8¬ęr=ˇĆ‡“ĺýĂĽZgŤ„„N˘l(äęqBĆĐęUx>˙>ň:«WSÄ]OÄŇ1kÍ‘dĽ%¶[ČiMvńűé‡ó÷l`ů^‰ă`K´öcl,ŘĐÂöůôňôăŮřě˛ë—ăNmu/$Ö`Ůh6nŁéŔ`µńé­jO|§ă†ăĺ -ŰR”eUH8$×úSHu6žk¶ęń;śq‘!^\řĐ!‘|ZËůµµĘ· ’zŠ#č§´ŔŃE?Ävęg^Ŕţ{ůéâßdT”;0"µ—\Ü·p˝˙ôîúăŮE§BUáGÁ–híç‚p-pg—]“u°AlL¦ŁĆŽ9aÔbËüĆO—äqŁç$+¤Ć±îŰZNĚ` žkHţÚľ1_¦ÔﯗéSĂŠ®)%ĽOßŇfŃY?nňD*ËhEąę±PiĽŰ~ÜąČXéYëNź€í•=–§ äzG ÚŔJq,ĂŰŰmxi †ë«ł]†w `Ůđöáʆ×Ŕu:_žż˝w±y?Ç—híGç±ĂçZč~ÄňZhyŕŰUN9ËůF‡},›:\Wĺô{JIS…yd™˛ÔnMÖHĘp Al÷p ‰Ź†Rx í¨dÝ&±„ 6g¦µ§T<†ł&Î JĄ¦ŐPć_z ŢüĚř‚J™ąÜ;ľ Z.Űă $ Őiry[­÷^ÁĺŰďăQŹv ×e|¸cśa,s•*>ďg(aA˝ÍqĆ b»ÇyŃŽq†MB X—ęŕçśÔi”zµ®©/K±×;Ş×—çq‘‚E¸Ł-’Ô µ””có6§%Řfć&Š+¤vóEĚä_ęÝ7|ÂŹ;—Vď>ˇw.‘Ůß» {'ŇBć/¨w‰mřjýX/6íűn†Ł 9Ř AB`DáĆr*ĺ!Íťt|ąöŠ›qŘ¸Ź‰ář7›V¨Ú“aO§eNZExĄ{ňź\Ěu6W:ű„'l¶4·ło¸^®ËŰ4Ť€E gůŮ]šT,ë‘A~kúšşîx[ś\ÝĄü–c¶×î!•ďi÷H&Ѭ‘çĺăä>NCv x %ć»5ŤMjZš:Ď@¸ü)h9§Ű$p˘Đ&$uĚë°+›l |«ĚůČz ´ojŁąŽî¦9¶IÝlŔ ú•Ň{ŻzU 4sŁ/=*6}Ů.¤Ĺ>4• âm9źwđ#lÖPş¤qýÚ ZGG>«>fcIѱy‹Şň ]Zrnń!é\,Ň(ő.h:uź˛q|}‰Ţ‹NnçÇŰd>ęś”Š).źé\!©˛*ë*e„„C\>6˛WȤÁ@§­żť Ëzşí\ŇBśŁ”HeËjMg ~vžíaAŹN‚‹Q Ş4T8rŁ’UŐW¬IĎ™ĹiNěBŠ#LV.–)éÎWlS O{˛zŔü?Wím·–ĚYQ©\Óů§a\W{±%`˙éČ/:˝m»Vńé­ÝŰëŐńW ě"i&ľ}ö†6ŹćHë:jwďŮUÖ·âń‘ m§™a_ˇ ú˘]8T łĺß /Ë{20Đh`łÜ5KBq˛¬×Ů’EF+©ĘšÎ´·Pęüł.e#ßy™ËMýlö wăěąm }í‹q?¤SX 'ö˙äBŁíMű¸D`°ip9_NĘyLĹcqľ™>OČď4¸î™Xv\ˇ1­9—­ş<5ř"1Ăč˙i_‘č[B”癑ȗ šĆđ$’¶ţ&Zú†!ňđđíi¤8Ągé1=\ŕ€2F\“©FoĂá&ÖĚ’ ąˇĎ÷źŢýŠ÷ÍżbHâ0wń×1o^żĆF9ěÖ“ęf‰çú¶b‹Ş§ż ő¬ĂšŤńôCśßâ(4…;ťú!ŕě¨đF١–ů4ţF „Vendstream endobj 162 0 obj << /Type /Page /Contents 163 0 R /Resources 161 0 R /MediaBox [0 0 595.276 841.89] /Parent 148 0 R >> endobj 161 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 166 0 obj << /Length 2315 /Filter /FlateDecode >> stream xÚ˝Z[ŹŰ6~÷ŻĐŁĽ­^%ŞoM“ ’N:3YČćA±ĺڱ{ÖÖ$íżßďđ"K¶l+S#Ŕ˘(ňčÜxř}Ô<ż={e“‚™Jn牖)^$yΙµYr;űęńD()yúâj,Ňwă‰R*}˝K›ÖŐf^N«ířÓí›ŃËŰ‘H8ţDRđ$79+”I¦÷Ł˙Ť>~âÉlÄ“7#ÎTa“ohs&Š"ąi©B{9şýŃČŕÉDIfr{(B7"¤&¤´ÎÂmWĘŞLri29 zN‹<±°8ókČKâg0ť† üfű– c™*i‰<­›2šI[ô+—yaťł\ŠŁÂÜTaľF÷šĺ9ËTÖ*ńD°Âg)ϡ˛Lr®0Č:S_ţůţęzlez{h(âăčłqTĚŮÉI”5i ëŃ/Lg¶ŁßÍű—ż!áx‘>G¦”€WoIU±hÍÍ%ăVăm4iQÝ/ńű’&QŁ˘Ć=5Vc%ŇzßZĹ-ÔĂ­ŐŚ#ą{­Ť˛¬íh¬’I۶ö®Üţ:VęAĹÍâócíTwćv\•[–"űnřë?߽ݷIKJ†‹0:?­z/ż–Ő˝ó˝/˙ň±¬–R–¸‚!H !ÂÍŔxŚÍÓúçń$3*}A!ww¬ľ`¶ĚŇU‰.’Ş0 Ć‹}Ăaă\'­ŐđôeĄĄ6ńÓήwo¸<^ŚH+Ńöˇn•_ĄY†iŚBŃ ‡üńHI°Y ĘNPqŇoäÎ»Şľ«6ľŁö!MÔNZÁa~˛ÄEbĺłËŹl˝WkfeF" I°MËU¸Ö.))éUUKŹEěĽëęânľ,ľVAÄŞtCk´.ýí¬š—ŹK/…îż–Kg/óJ¶¶¦‰°ČMd(ƱÂÚ–sčĄ4®µő;”÷=®B_Ýë&”ZËýn˛/«˘— Ů9Jiď('G‘ŢW•řmQßĹ·{e©ľˇQ…™+’v˝‹ŽuиôĂgŃĚ9 l†'_Ç&KÓh;4ŰwƸ°ÉDÂÚ§Őµ]?’¤„UéżÇ…!QŐ/AFŢÎLÉl^ă?>żşzű $çéíő‡—ľÂÎĆłčÔĹś^ úÝŹŇ"35Äý"‹N’bărľ§kMĹyŠßGç{tîrôÎw¸,¶ľú9Â;ˇ‚AŞOS­sçşş÷PŁô—ݱ¬ý}×ýZ[ˇ8Ű˝® CÝ2Â},ëPíg§ďč°Žiâsş1aëłă 2ČJ•Éŕ–Wżľ˝9 †Ě0q»čK©3ÔľXĄ÷ž˘Pnŕ ĽíŮ”¨\äz˘†Í0‹Eč¶/DÁr› ILß·FÜ‘7鷻ŔVŇÝę´^űî)í!Ť#ÝÝý“9‡e°‹KXµ»E”·|#±˝äËY‹Ý:ő+<ܬç‡á@ ęśű: wŐl,óó)×üHď„Ę[Ęząá3˙K7bŽ!i?`GçÇpô@­~(ŠÖ˘9ű$ŠÖó­˘ăč‹ č–°ă(ş­źGŃŇs(š·`ĺ“P4ją°Ă­=‰˘˝¬k÷P´`Ň¨ŽµGP4T˙Ť›8] >*yNŁüdČŠK„2Ę:JlÜÍ´}<ía´*¤ěŕčĺ’vô˝‹¤ďŁk¶„ާnŹůpŤćkż?ÁŕKWfýxš¸üÝ×6ôťBä­•u!D^\‘“V˛;lE´`FÉKŕq7:ňšs÷`yŔÖ]¸Žcp|éö CÇOąě‚tvbł]÷öÁ Äp™†—} 1ׯýlS”‰BĘŘöąS»ü´ŇäŁî'ŕdG ĺl¸+ëĆŕécU÷q™!7 5#¬Ĺv-z­ČăÖÜĢ©gŘ‚¦<ĽŃŹ®.x VŤş4ÁCGí'(pčőtÁ/}÷Ř-Á<,ÁĄď Äś’đƬÝëÖř4<ţŕ'šŔ"ěűyOčľź„8ŕ#čPŽ‹ŕ!Aę˘ü“Ą‹IŃ‚ ,‡gÜŞĹłôhĆÓ0\KSýe?ĘuG‰ńduľ‹tŕ;1ŘÁÎßńäö;)Č €ÉŽ#Op‚"ë쑢8ąfą(NQ©×âLĺoç6~­[LÇśÎXDbăzěĐŐ÷U‘ĺPW\¦Q-ˇvY‡Ł7`=aM'ŞhP0¶ť•~@ RU9ëޱ—ą¨ľ$QvĚw‡5Çé¬fޢĺzZzh2L-·hl:u ćI¤-¨¶Ç˝$Š‚•ňźłŻ– cü+Ůc`ö¬Ű ¦ŕ×|(ľóűĚD ą‘§„˝‚« ,Žľk ;ÎŔÚú…ď’Śđł¦MpÖĂŔ2ŢŞbO``TĆ ` ¶ö‹˛¬í20T+tÇÚů¦jWň¶só¦ ŁZ (.łŮEbeťŽ™Ę°}Ýő|»˝©ş˝çżB´růÉkââ!¤ŕĚÝËy¤1đJ ®ĺľľç9öjCAĄźŔ}|‰4÷Üâ`ߣŞĐěcĂż@”‘z”«ż}cKőősÝŇ |Mď9„ęh©A/˙Ëö°C›Uh¶6Vńjluň<|č?ßďsŠ5ę{ż74€^ą“KČţŰßl#•úě°uŐţ0?ńŮCpÁ2=čܵÇ=Ýăc“aŰŇ„î_׋٧ľ`Ąv'«‹@OćdýjZ/ÖákĘĚ‹F†­ÖnŞťZ‘Ý(´¤ťcˇ˝Qň [\÷{Á;#‡cu#fpÎÔëŕ ]b˘řT˘Z±<íż5&AÎd'Č“h¬ŽŮ2-Ť…¶ŇFcdtúP~i>1jĹýQAx쮪MYWł0Ć^3­ĺgĚŽÓ/üC_(túâę·ź¨˙§Čj‚竹Ç_ž=›‘߫ƄçčýëÇÍ´šŻÇ˛H7_*¶Şę–"lBX_;‰oÜ GX§:°Ńl> endobj 164 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 170 0 obj << /Length 1840 /Filter /FlateDecode >> stream xÚŐ™YoŰH €ßý+ô(·Ődîcß¶˘işm ´}pcĹËYGéńÖ#ɱ5Ŕ"@$K#9$?RŁçgŁŁ×6sÄi‘ť]dŚ["¨ËڎÄZťťM?çr\0Á9Í_žŽY~2.„ůq5ć6ŻËŐĹ似={3zu6b…?–9še*;_Śţ}ţJłéfoF”głpN s.[Ś$ńüjôqôĎZÍ Á‰2¶-Â9EH¶ˇŇRÇźŰR PĄ0\ˇ zŽ3“Y°X‹%<–Ą!Ţ`vę»61)‰V:kŰ­•ІŘ>µTVEĺ˝ÂüŁ„…ł8şĂDí(áJmLtcÄÁ´‘q¸™*ĄŇŰţ,ŻÁĐÜ›{7˘ĹGŻąm<©4á üăźy7Y”cEó黥?”'“뻫¤ŕYEuÖĐç÷ “<+Âc÷®¸ä0 ¦7´u •[Ż„Ţ:ôáľÖśh­×ĆŢ„iäČ`’8)c hÂĆgŽćŻ>ÁZľ?ý0¶"?kĹŽ±™–†ÎďĎ NśuťYQDQECÖó»Il ´[O‡Ş~|ę˝z’÷¶‚7č÷K8™Uĺ4\żZâŤYŚŃ”sâäa}..PŔ®$kwD: ĐŕcŁőýĆ "…é6>É*ÂZŽTgřzBÔvVÖoËjVĎ[UŚÇ˙B=ţtň¶ecDŰlŘáŔ$«eCC)á ´ŚÜ2Ág¬ř\„ë řť¦ôĹegůT‰P¦Łł”¶Bżâ ďf°’EËÍś aĘúçeţąc3Ô·« ˘Eš×ó2śT·‹ocĹór~//ÂŞF•ĘE1ĽxŽb–•ż>ÁU‰W¦ń‘ĘëM·4®ç—7qčuŞŁVämŰd+ÂĆń¤ĺ{Ŕ",Tş[0Í˙đ3js©˘ź8Ô'0Ą!âŐš(ü˘( ‘6 P6˘úxG´pŇ•1"—şP0‰Úˇ!Đl@`44Ľ›"OÚŃő…p©¶âî`¬)蔜VĂ`­!¬kiLÄ(ęÓ =Ćł2ďn [0»-CűP'!Ç,ÔPĄ ×Ř—DYw‡۸4YćĘmľ±­ëćËźmÁ$ óĺé ÜůXŻŕ˙e5 Q‹ŹÄµŰ‰E ŮIYW—ĺ÷˨“"ź´ăË‚W•L´J±ÔžB*ßÉ„q+ÄęráĹJÜvŕ2î@ôÖěCCK Śó|űC•É« .ÂşlR‚[¬ŚśišKÝÂąc-ü‰đ'ˇNrjá_CVÓ8„ŽkîP21°©äcAPZ|ÁĂ@°!¬‚i j{ă!XNŹ;ÉG‰aű’ĎŐC`ąłD_U4„µŮD®: Ůź~{Â/Üî6U²@ţHČ7űPS¬˘!¬e*両f=_wlúTš¬f;qĚtH *đ8Ôúż}79E[Ž(ĆŁ„.óG;Ţť!JŠ=  Vą4®^FŃľ…íF2ä‘úP&;MtšĺöĆ÷Ć`?cŞýĘÍíýęL)Č»)>ş„˛ů¤†ęőí›őě ięł1~pa›Raáwž\«°Č ‹p#É), Y}…% 9¨° ˇăş°ěP2–¦’ŹUX„EF´iĐÖ[XŇÔvU.–cĐđ;ţ+cŤ‰ď¶­WIʉܯĚHŔ˝řR˙v”U4„µŘ+ᚯçűCećnŹÝé#d/Ú)Ľšh­öbémźľ]Ť¶†ŔT{0Ý)M«Ńî[0!!ňůúě›koţ;GĽˇL†—}hzqëW¨McÇ´ÜĐÔŘ™č'‹1-Ř©`LJu—Ŕ®!«viČA°BÇ5ěv(™`×Tň±`ǡYuĚ »†°^ŘĄ1^Ű>˛qEڞ÷mjáᲷ »6H٬– Í R }ÜjZ°jᕿBFM®ź56J·}vßθǗďҦĺĎť}Ş˙˘!wmph;ię,8Ő®eÝBeŠHíîOˇxX˝'Ë, ,Ăă&Żđ>ö™EXó(Żą;ł(}Íđ›Ä“«°+q‰ëŰŃ2°A˙ŹÓÔźrXŠ„lŽ›”ZGdoľ$éC oAŚ łńŃŐ‹ě8ä0d ăŮýJ®‘ÝP˛Ů[_¨śeĘů-şßţH]D9ĹFP ­Ę u€—űřŠ'9îĄ)@p6Ç€G˝đ Ľę]Ofi#~ý ę_bÓípł*W“Ú Ç\ÖópVĎÇńI•Ď“˝W×á¦˙,Ç—§/žâő§©/‹«ĘĚń#p}ý×ŃŃI@óókD&ńó/oWçĺĹrĚ]ľš•¤*ëv}ĐĚż˙ BăgŃ7ďWżB„ČgáČÁŤ€%t.eňĆZşendstream endobj 169 0 obj << /Type /Page /Contents 170 0 R /Resources 168 0 R /MediaBox [0 0 595.276 841.89] /Parent 167 0 R >> endobj 168 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F19 6 0 R /F28 52 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 173 0 obj << /Length 2151 /Filter /FlateDecode >> stream xÚíY[oŰĆ~ׯŕ#•–›˝r—ç­iRŔAs©íÚ>(m«ĐĹ•ä¤ý÷ýfv)S"eKµ{€0Wäpvfwćűf–Ż./Y%ŞŇd—W™ŇAYeŢKB™]N~Éí°PFk™żţ0Tů»aaŚÉĎCňM˝şŤëőđ·Ë·7—•Iü©¬’™w^TĆeăůŕŹÁ/żÉl2Ůۦ ŮWŚĄPU•ÍV›4ž .?muPR´´Ľ"S!{okĺ„w™×FČұ©Ó?ç06ź˝ÍëÉű%LŐů¤~7şÝ7ĐH#śąůQ+Ť°Ć÷ŰŮč*ZĘ:ĆYŠĘëkŻë %ë VöŚF›zţţ‚¬ÝŮ–Ę ]f…R˘rńÝ_Ą“gźŢý¸ď5N(c2YĄ÷K‹*Tý~5ŞŠ{]ŻöÂĹš ”ÖÍld-=9BŃ JhČ÷h#Tţ‚lƲ™Ű>-ĂFć[–‘;Ź_x‡'›ţO×/zD|M3‘ŽŃ—öçół#´íHĸźEëÇŁYôÉKË®âîh{ż …’ZxŁůu'ăBśf߬¦ő˛I+«óQz·Á ‡‰y隀íÎ`‘e•ä®VC§óĺü°R$¬¶Ü]Ţޤ؝¦ŇB“¦Y߲ôo<Ĺ*ý*•ĺĄŮ'ĂÂËĆýżhčăÚqo“žöě¬ [Â* ăBŽŤ‰Ńb3h[ň|,<‹wI±č¤„ŇJHk“­†•úßşhTn}·Z8L\(LÎYQ OŰQÉüÍ'xńńĂů0ür?=•w„ĚUAŘž”žIUŃҵźžĘÍŤ™zńć˝ů>ˇx‚h„Ž”ĺłŘŘčzČHmŰ•Ű1r8^ô„¸ŐB[·c'Ăż %®ćy࿥ě ü72ś_ ˙őä Of÷á~)8GżrŮy+śODţ¨«h)ëB?A†SžĚ!Ą(›YîÖD`Wčp6ßôÍă‚(uxÜüB9'´ ;ö̺Б.”aşŁČ+鱙慌âIćçsşCD¤đtĂ«Á%Áç»M˝îŇJN»ź˙.óüo^4ę’܆<©ş´[ş 'ĐĄőŔŁ'Vł ]¶t˘ËFä$ş|·tů€‘ ]¶ŤüoŃĄ-cÜ? ]¶”¤ËF†¬]Őóĺ~ˇubN®Gű:&…pk*ňFĂAę°”î9ů4*IzФ¨C#€:¦ÇĎO—Ź·5{=RŃóđÝ<×ĺ§k?˝iB+¬ĄíišćËÔ2úZ&ÔPö¦ Ąő=MSżZ4M©Ą˙ß4=cÓö›& P[¨N`Ł@Á? ´tbF¤Ă_čäk9ťt#c‚Úɇ“1Ö(+¤Vϱ-e1¶‘‰IRם Ń1ÓÄ÷! 5ňęóؤFWÇü–Q¦„€GŰúń”·n žüë.s¬´;yřĂĐ{”….ĺ1ç`7!&čL ÎŘÂ6!; ĎžŻÚ}j˘/0ä/:ťŽ|żë‰m-ĽW;Öî\%Âł9°Z~˘˝ĘŻÇ l‡wVőí*’PĎ‘×ńţ(^fÓu\^ĄkŇĐT8ăćŤÍÍ(‰ŽG‹8€¨ö$ć¨0ŇüŢzťŽ[“¤®‰iÍU}îă¶BĂ ­U•Ř2Ă|4ŤľŽ¸'‚!Ö+n‰xpżF| –Đ9KG™C=oG+’™˛ôFłŃŠžČ|ąšÔ+xśĎ/oxÁ:Ţh‚c§ű)´ťeJÝlz2żŮŞčđ?Zy Vśd`Ág„—ćÔEŤ»ŞŐ·Rî2ŞĆ•L‹şČľ›TxP?C§D¸ÔÎĹ»SÜŞ'LXrĽL"]î}ʼn Żz*^»…3mÎ@¶L?{>d´1”)ź8XĆԲзť+r#L.…ęPˇ#Ř ÇŰEXę*ŰoX•ˇ<ëĘřU eqÄҦĎIŔ âĹŢÓ ž¤ť†—ěSÁ‹˛Ôěć›OĚůş‡óéĂŹó[é#čĐ)}€ô“®˘Ą¬Ç>Âý2ěŘwń‘H_Oó»Ĺzz˝ äŔO@Ô2–żŘÉŞ­Ä.!SĆ`˙śSFßyRŢLŢÇ,6ŠâťĂxH,:g\P*OXđ (˙ŔWÔŐY€Űé{Oew7čş±šéG-čŢć&Ąw{‘ÂÔŕPe&ńÖ ´P%Šx.ČĽ{Úţ&]EKYĎţZ/ETÚ€Ő şd ]´ö7ý¶\h»›Đ±Ű¬ů˙<…¬ŽĘŠřÚŁąMňNęĂ C!t«Ĺ¶íŞNr†ęĽfŰź¬îV‹Tŕ0;q;Ař>˙ĚĎWtËSâxş©çë8ä.dąŘ´đąŐţ.FjV>]÷Px6(bU¬  «0¦č0 ă¸íçۆ«‘¸6‘-y̬ÂN±őŰ’‚hŹY#’&Ďéî<©/ŰOhAÂ[n˘ úťvÂj{tuŐőy‡· ł6!żłOůő÷Šbą }25qń°a‰dbÎ%Ç”k-Úf‹Jĺ:F˙ú:42žÂ¦Çńá˘^Ť6Ľ\$3ĹBńh»#¨Śn(šÝƇĽ¸ľţđý7t˙›ć8"-Śąˇ=ŢÜţçĺË -§ĚÇ·Ô žy·×WKŞW×µXÔ›nëň ­'wͤń-×ZĹý´ßĆ«–˛¤‚Ë”ąuÍnü ‚šrendstream endobj 172 0 obj << /Type /Page /Contents 173 0 R /Resources 171 0 R /MediaBox [0 0 595.276 841.89] /Parent 167 0 R >> endobj 171 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F24 22 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 176 0 obj << /Length 2088 /Filter /FlateDecode >> stream xÚÍZYsŰ6~ׯŕ#Ů–îŁo=Ň™d'MÜNgŇ<0mkĆ:JÉuŰ_ß]” ”%[ăv<#R¸řv±Ç·€ż?˝řÉŽ8-ŠóË‚qKu…1”X«‹óń§RV5śÓňÇw+ßVµ˘|5«¸-WmwŮ\´ËęóůëŃËó+(ü±ÂŃÂ(CśPĹĹtôÇčÓgZŚG´x=˘D8[ÜÁ=%Ěąb:’\Äű›ŃÇŃĎk5©)ß#T»ĆŠ“pA¨Vć‡p–«Ű@Τ寕SessŰ~‹ám“h*8±ĆÁTřň§ŰŮrr5kÇa`bĺĺ6»™Ď@úŐç`sśđ´ř]–Ţ$·đ}ZqS~©jřl»0v~®ł9<¶ĺ8ĽĹĘex<™…ë ĹM–AŢ´Y­j)MyçőĽ@;]ăU®ćxŐe–~î&íźhQʵe„K¦jŻë/ń˝ |˙oZ’ńI­(ˇÂíú¤\ű$—č“RÇŻ·Ly·d¦° ´!$AŢz.A`iÂďCbŠĂJÚĂq đFĺdÂjiUfP•‚°pG甤 ĐňMěÁ/Ńô %5D(^h4g^Í—ż˝÷ˇ˛cGQcĄý`RD1žO ˝¬:–Á§‘ÚnáűřţĺUm/_ýööÍ}Ś"DąÓ`ěeíÇČ…†€s[1ž (ĆíW!šK^ŚP&b<ˇ«˙5˝OÄ>ťŚĎ0Č Ř&$S%%ÔÚ®¤ÇTy%{Y;JncGŃTn)yŐĂ]ÝC˙ ´ÓxR[Ő‚‚ż‚ĂŐŚn­—ó;U4·”L ˘Ą*4Ó_<Íݢ¬:–q7#†mĺGżž°_aŞÔ%–Ů[Ô·»Ĺ7¤±.®¬ü’ßě*1áÔe÷UÜ„˘y7Áúř¨—<«Ăk¦#ݰ ćI@%ˇ¬m&“Z˘1FxˇŚ…ĘLöˇR°ţ+Ěü-AeŔF;UHŮe_ĘÖ(ŽKf¸ IůQÜס€¸äŞ›„,ěÜţę–Ę·–ڇ㗿ŢYkč]šěDd%D H «XJ\¶*ކäő×NĺőO&ăp§î_¬”±jćô7Ô^Ý-‘Şţq˙9‡ ®7&Řâ/ś·„4VsJg' ogsČ—źwJ ů©ç3ßí"ƉŁě8ď2` !ŃőrüňćÍ® ŇÓ¦Id‚¸ŕ×mŮˤ_îH˝=ĐÝĽËQY˘…ţOH $óH7A–‡ęy˛Ö6ÝşÍ5Ů…ZcFĄw˝‚ˇń©đAŔÁCÖËöĚ{ČëŤ"ę¸`ę•řť2‰ľ>ÎqMŕ´„őt®™âšý„kŠ!®y0®gĺšPÚŘý\:E¸ęąf?ú$\36Ě5S|‘k†\ť=Ă7a4= Î^Ö~śČ7-ŰĆůß4|Í7˙ÂÎv/ß\sš]Ú)ťŘĂuÝK;¬]ďŃNěŰĹ–®ËvućKS‰f¨ÔY˛ %Ö°H6ÍAdSÂűT»ÓÍDŘ0ŮěO6‡|R`ĎÝItéeí×EpEdŰşl|ŇëĐ`Ľz'IäDŘť€ gŔH.˙ɤ)„>ź˘x<^˘Ú„ˬ˝Ëđ@AŚGň`_Ľ†0Ô"ĹÔ#đí÷t|Ű2Ȱ91†‰8–r4Ć Z/¸Ă¶Ę’ký4äá”\7Ć­¶¸ˇÖDn5¦$ĘGń€Ľ)B=Ž%Ý.'łčňH×=QĚSÎÍQ7¬¨A©hM¸Ü®ň<‘„Ux^žîśeĐŞa©gÔÖD3ţ ÚBĂdÂą-cëýB”źőŤY&Ľ7j×.jsá9í2îVČŃ”ońóÉ fĆ&4ÓDŕ†µ{›Gäz„WD ůTz-Đ’ooĘ;¤âÍĺâ6uÄŠÓKyŻđ­··˘óu˝îý.9šî©D—wE ÷Tűzě€ >c·ĂŕÎŃíaÔýp4‡ąë Ö;ŢřtĺŹ !Eů›¸ţ>ëť52a§ě¶˝‡#_ű°äz, n|݇lş«:,¨[C„m©|Đń w›6…^˘·ܱţŃp×9ÁŁŁ#]^ŘÔ$÷Ú6<\áN<˝mK µmý¤m“CmŰÁ¸žµmcRč*ö·m ‚Wy`ŰÖŹ>IŰ–nŰR|ˇmăĚ·mUî48{Yűqr`Cśş-ś{Ű6Ěę›Ň÷„¶M€Ó™#TÝÓµEQ;šnwŠX޶4íÚ~?u^Ü?1ë·»g­÷ĚJŐʡ˙ŕŘ“´r‰°áV®ôěçI˙ŹÎ ĐxFŘüąr`´ h)ă:97Îă©ÍîšShµl=DöĐ #TŕŢŻydĂ´\xŘřq§y¸źč9$N:s†cëWs·^ ¤†_ɧü§ESo««·Z˙g ČT’‹ ‹D MRˇdąh®z˙í®´l’źĂŹł¶kVí8Ž™@y÷wë|Ąú˙¨`ĺÍ"üčwpáú㻾Ćç_{Š nÍ `®};łřöĹ‹1Úź–‹> endobj 174 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 179 0 obj << /Length 1764 /Filter /FlateDecode >> stream xÚíYYoŰ8~÷ŻĐŰJÝŠá}ôm{)𤛏‹m\[I ز×qšößď )ÉT$ÇN›=Š- Ř´8ś‹s|¤ž/mâÓ"ž'Ś["¨KڎÄZť 'ďS™ĺLpNÓç'Kʞ\‘–·éşXťŹĆĹUöqřjđb8` …KMŚ2Ä •Śç?ď?Ňd2 É«%ÂŮäĆ”0ç’ů@rQŤgłÁď Źä—§·TEŚĆĽ’§h™Î¨ŐgüĄ@Q™ŽP·— ¤Y)1 ÓŻ;^O'E ‹řs©Šę|–/ć[9 F¬jXŽćŤá{4ZvX[K¤®¨Ż–YŽęŽQ˙)ů@™,&Á˟ВŻa\[Ňťçs"É9%ŽÇŢX_ŁÚ%,·"ý#s*Í®‹'íşŕÄWiôţx1)}ěh--QÚTDżeąT4 Ę/¦^N0±^ŕ/č3—EWmăr÷&h˘y­Řc`i\:="Î×(v_8cişXumÓ"®–óöőë®E$­ÍŞyŁAk$E˙J°~ÄňT7hęč }\á/ëŢ}±ŚH‰ 9,ä~á› Ě­`'ÁQW;w˘,ű˘GXÂ…‡}Îĺ j»{„#ŚŚąęŇęôćr:F[/ńŻ › Ź‘¤“o•·ĐM†·Üµľ ô<Óu1Ç•¤k{^/Ĺ ßí€&?‚ŚĹyxŇ•‹#4gWjo*íIO SŽ[ß)a˛)a\b ≠í˙öT±‘ŻbĚ$ŚŃˇâJŕ×Čň—€Ţš¨Ű*1‘Díţz ĺr˛_1AJŞĚVf~)faTQ÷)•Żâµ‘fŞŤ+©!’@A_QÂx3_Ľ{sršYž»†BŐ)5őÎ"bĽż‹ÔĽňYŹ~’UŰ–~go^<ì1ĐíŢ˝ľ­$‡Ę™z%k^w+ɵ&†ë–’ŘÄP°Cš0-0ŚhÁęŇö˘j>/¨uOŽ1ŰÁJ†µźŚŕÁň¶­RKb©ÜßVI(tí^[k^[[ŞĂf …;¶uŠÍŇ8TŽŘ3ąŔýłĆ[nůŞhßĆ1)–°qĘB}_pU¬ň ŻžŘ‚śaͦU“ýÖAM~„¦}7)7ŰmM+‘^—WÓ‹Ňc ™-Ę‹0š–“âK‚­ě¶ť 5ˇ¸i›Äüö —<0ËòťĄéĺwÔD)‰ˇlă2uAc°i+čcÔş€h2Ĺz5->{d§LSŕtéúQE,@ŕnĘMÇS< ;e{ŃÄTÓo¶´Ó;Ŕ;¦×ř5ÇŻq ďp : 2?}­e{ĂJśGl3/V¸dŚ‹Gł@3 9`B“NwĚąíĐ‚…TăA G†v ®B'ěw¤Ţ  #+w_<ް>şF÷Ť˝ßŕŃÔEovä·bă”…Vá‘4˙‰¤˙“HšýDŇ5v{żčCŕŕh u1 `44™ý x+ÇŞ'wä–uűńÜPúŢx\dV}?ŹmĂă5I„Çő6<ľ·^{áqMˇŃîÝ­=µí5’‚VFߍDž¤Dk˝'Ż©ŹG̶ăńXż€Ç9łÇ1ĆşÜ=Śž5Ż»őä€$8ěV¬çť\cň ąpŚ{z"ŻXu,m+îŔvŐ˛ô˘XßŇýpÝ4ś9ëĂęÜ·vq/¬.0ĄŤ{°1ŰŽÖk˘mp]I†]%ĆęŚBeNŽÎ©Lg©§äţrâj9oOŰ”y¨öŐŔ»ńe‘ç45î÷ňЇ›Ž°?Ę˙o/$ű`,kl?ěg‹ Ť ”´ů1qżřÜďŁĂ'9ýqXčgŢžâšĂĘđ˛Zˇ ZÇ߷΀ş5Ô›p`˙ŻĂ@pkŽ~őnÍ«Ű@ą-Ć$«–ű$łisj—Šű~^Ľ˙­ÇÝ\ř'O FĂÜÎÓ‚ľßiA˙¸§_Ż©î\Ř׍n·[9ć—…Š‹ýÜć*żĎH<Ő8pżÂť6PfäÇ> 9Ä(GČĹŕlQ·ŕýĚk—éwŰ«ŠŽ‰ÎzĎw•;,lť© Eˇpá©DÉďySřäFˇ·«Dg™7‚Ir|őŞ«”aů®:Ź’értQ—hřw“ Š×9Ít,‹Őhí‹=ŇLÁo~ÔĽęQ*˝¬łd¶ “ŢÉđűüäŮŻřüWź2F*˙2—X.×Ë'tMÇËĄż%Bů‹ëŐ¸8_ŕIvuQ˛X÷ä @hçBĄô_aŤśUťH>żśRťĺĐůt*M˝+:˘endstream endobj 178 0 obj << /Type /Page /Contents 179 0 R /Resources 177 0 R /MediaBox [0 0 595.276 841.89] /Parent 167 0 R >> endobj 177 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 182 0 obj << /Length 2324 /Filter /FlateDecode >> stream xÚ˝ZŰr۶}÷WđíPmŕN o˝¤3É´NNâśéLšE˘bwt;’’´ßµ-J–·“ ˘ŔŤ}ßk‘ůáęâéĎ®đĚ[U\Í !SÜuÍ™s¶¸šľ+ő¨JJ^ţôr$Ę_G•RŞ|ľIWîšÍl|‚ę;Ú8 JUĘ EĄjϸ“X8†&"5ťb/Ąą&Ő4W…ölëał]Ďj«]'8čG쬕8§L°óˇ[taZĆj"µwסîGJŁtŐy*Ď©j]9Ď“/B„‚sčÄéíŐ-yz= qŞBśh×Ű#‘L×z/L¸!E*tď-Ű×'936FčuŘ·űDw.aSĺ˙FŢ”ăů§ć»tsť•# ›«}2çÝĺ čýžÍEŇEó ᩜĺjLÜw$b/äýŽÔ¬ľťµ3’)Úŕů‰äÁ­8Mx[Ö›f=żőü6z\ Iˇ%ŹGä|zp(şŐfßS„my÷Ë·żü˛w¦ôLw;‚AEw0źá$u‚­+ż‚oI.rj•tEjăS W € …çŐ Ő$`Ó©Â\ Y5#čłir°’knxhŰú«ophÇöŢä[.‡TAďÎRoż+¦äÉŤF.oýNľł@¬_®©ŹOF0ô:^ˇ^Dźc4Ľxá@×€c©oľ‡Ć“`«l-fű.©,WŮ^VŽ7â îηGÂĘä\1M‹]ÂşŞëša˝ŻŮÔÖ2%Ä×ÓżLĐ!ú×nÉčź;D˙NÖë$úg9Ŕ’;qĄÝCFrhĹď!€CÉxy"lw? Ě„&€ą~§ŔÇĐł#€Gől `®çżJO6őx×ŇA[şéßju?S?nrSţ)Z¨ŃŘ7ŹC 3a‡ia»é-”ZĆ2¨ťíŤ‰ň ů`sC ^jÂjó¶Öă04Ľ}ŤĺsZöĽŮ…; P> ź€ó¨ŕáe+Váű1>—µ…‡÷—ŁóŹŔč4§ěŇĂŚ.LL$»uˇŠ,Vź›ŽÓí3h®Ďdrł Q˘Őâ PděĆâ©l®‘G5zřť ±:M|ëĂ_ď uOÔ‹v¶–貥 éB\¬ăj«ĂŁ`^R @h•3Żë+€źéOp­ŇC^ĐžŐę¬É?#şü:,útžÎľ2üŻEjBµnmŔř@–ü×Ă,‰~!–5K¤Š.ćÔ«˝ťîB§h/Ě]˙»Dé{t ĂËh˙*<)HĎŕăďr?@@ż…Ň÷Ç1‡”ÔťjŘ1[w\i}‹R íŹ2fSğdß„ç‘Ky ť>híČŠŹăţłŚ‹ŚĐ˙k¨‰ţůŁđŞz{Îó_Ű»ŐBÜaB¶^ÓWŠË›n˛f%›ĽEnŞeŹ1˘‚Ć›;/†h…ČLn{gĆgGăI“žB÷`ŻČÂm±&SqŞr5K¤aČÝ4$LçŔóčȦYĐ™™‡,”HRIx!KÂů*ŚŢEs˘yýž˘CćĆgnřrkßp¨Đcř™m÷ ďđ+@k&Ąţz~• :ÄŻÚ-żň‡řŐÉzťÄŻ đŹó§âź´{ŔH˘(N™ăüJ5×üÔlíîGáW™°Ăü*×/ň+ÂŹźéAĹŠ N( !"Ó6kěúóˇÓŚŰ3Ě>Ća’¬=łď°/žÉĺfĎ"‹i¸ *ľ®Űćx“hˇ™¨őŁŻ•u:ôˇ@ q'Ď›őIËđ~#€­›i¬rşJ“8,”P’(Ó&]ˇýô™Öł«4Ó'”ˇŞü`ăv׊9€M,†Â}ďÎz/”TÍś˝˝ú0ŞŚ)˙h&»ý™GOv‘ńF?ü?¦TINu+(ć¦)4óN„á §jIĚÉx‘@5Řv('uąl9 ľ})‰_ú9ţ¸l6ă]`7´ç® «îé)L˝n˝=_ǰŔçO/ü–®ZŠ)yĘ\GŘ­ż{útJćĺd˝/íčüէͤ™<řró±aËf73xÇ ś;őáy˘^úIü”śŰđzÁ–ş{śú7ß <endstream endobj 181 0 obj << /Type /Page /Contents 182 0 R /Resources 180 0 R /MediaBox [0 0 595.276 841.89] /Parent 167 0 R >> endobj 180 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 185 0 obj << /Length 2402 /Filter /FlateDecode >> stream xÚ˝ZŰrŰ8}×Wč‘Ě„î—yŰ\¦jSŽ“MĽ[©ĘäA–h›[2éĄh'ůűé@Š)ÉN´S©˛xÝŤîÓÍĽĽ˝řĂÎqZĚ/®ćŚ["¨›C‰µz~±ú’Č4c‚sšĽ~ź˛ä]š !’–)·I“×W‹eľIż^Ľť˝ą±9…lîčÜ(CśPóĺíěł/_é|5Łó·3J„łóopM sn~;“\ÄëőěÓě_ťŚ „d=)/QUŰ銋pA¨V^ÍŹ9č™4÷5(Y‚’V$˙IťJëűüwTf›žĄ‚k,…“ż›@< !,ŐđŠď·8zÝáĎT`r- 5r®Ś ň¸u0A}Ňş()ëDŤb‰CĘC&ÄĹĽŽ ŞßŽ"Š+,fÖźTŃ©ÍN wôqĘŘšVŇŽň}ä‡ĚeĘötßÝ–ł"őő păY¬b˝GĎQyXʆűä+⦸.óU¶†ÚČ’kĽ‘ J(»5ľ‡ŕ@öJ.DŚń˘ Pý1U0±©‹ü!ÇĘĘ$TĐQđ(F¨u[ Ń2–Ď1şE»«:U<©nQŞš’*Tł+ő ,)BˇG|Ű`‰emŐŰÜyýńĎ2 ţc”eĂ8˙“2éˇ˙”M.ŕŻńdnËű[t_],Qă…ω0 (Wůw2QzÁ@x[zaQ~ňΤK¤‹Q! ( bË;ĺOAQ¨ ČMN‚˘[Y{Q4ˇč}ŮĆ<†î8ŞG ¬É~ş¨Ěä'Ż­°ýđÇ ¦ëĽĽöv3ćŠŔa´=ah¸}Ľ ‡0,™ĐW âŚâćő,xŚÂź ,V˘˝ťŚt_—0ß “4@šý¤ĺĄYă˝NŞ«‰Đ6-ß‘Íxmá´­ł‹2,±:(Gě@ĹÇc“"Ú>#ß `@˙gÔřŰ~8ł&Q4Ŕ‡#-ă<ÂëŕI<ž¤FÜ`'§ž¬}đÔÁÓľáÄzz’pTź‡zÂöâP;&”ă‰3$đ~*ůQçőőҨ k¤ţ€HýR ´?!AYr ˝ż‹¤ĆŔ1;P žx&Ľ`Šł…˛üÉśĹ÷n9Kuůß@Xš1B·§ôďAθčňWůk=űäÖh^đ^{ă ý=«%p€ÜB/6·¶g¸ÂłsGĎdqąÝCx·X¶—›řľÄ_(µŹ„Ú‹X…gËj˝ÎĂŚ„Ę5X5üë˛k#ay€QŕôůĽjň0˛ąAUšpłLąIüň:ßÄUo`Đ ůéD˝‘śqéúÝ1ĽťhŽôí뎵C¶Ý1ÂFePnRűx˝ĺä´b:ˤ!†ó˝ÂüÔĐNÂ+?šMIfŰă´ßŁĆG–€ §“7ź}˝çőűÎpmG?˘*¤x“?ĘĘzÂ&ô3!Ôű~ź>`ÁwTďéęHâ;‰Ž­¬Ă:bvJÁ:úŞg GcCgĐ”ôýóUżCPÝ"âřĽfž‰`¦ŤČpâ¸}ĽeŁBí©ćQÖȲ˘B+ź”}ËP·¦íę ü% y„’H€qšÝ‰˘oŽ”N|zsň=kë¨"ţ”ĂUH÷_?O3­đä»)®±]ĐÚŔ‘ď|…ĐľŮжpŕ¶Ą/Ă.16*ç˝lüů´Ć®/ Ë´ŁxłíďBĘ=űď\Řo áÉ\ p!Ó?ůµ•˘mA)ł§ĺÔń”Ŕ=žč@íasśpj~‰Íő;PÔŘjňK\zĐn˛ˇÝdđKó=˝ŰĽĆ)KśĽX‡1±›‡0ĄÇ1ă¶H{kcĹďsČ™ŔŤéη˛iwę}ţ´†^7ę 7É;SČ=í<«ÄSŮTJg·ľôźů–moČ÷íbwč­ú1řČç™ä=zqéÝŹŠ~'´sßđ|Ą!8’x±|ß<ݎżN٦t]˙ćdurç1Ł*Ú/Ľái¸!^N8Öŕ^éŁ{ţďş©U=Ą4€@·ĺ˙>;›l©ë6° äÍV!EZ‡ş}CNŚÍ+ZĆ~+@ŁV|@âňş®ę}î· §Ô#ůO}ymŮOüňĘ1N>=B»9ŔµJľÝ·ă­ô×m6Őđ˛MI|Ź›=©l{Ä>s §)7l2ő}•q P+†´Ú7˛Ź»lśCń‰?fT!÷÷l^:Éţ ŢĐď@lĚۡîAÎ"óUňWţ˙C“m…ŠĄćŔŐ°u5wŕg€Y‰$›EmCŔZ&w‹ë€őţî[*hřz_‡—e^/Źb8¦€ĂŁżŠ‡H¸VÉMëďő]x‰‡Vü}ýţŐořü7źkPbŁë@™܆ćî÷/Vč88ŢÝů”Ăő«űz™_U¸kőuNĘĽ™#F Hhü*űkŇ:B¬|~9Ą:ÍŘuü»ń`qÉmendstream endobj 184 0 obj << /Type /Page /Contents 185 0 R /Resources 183 0 R /MediaBox [0 0 595.276 841.89] /Parent 186 0 R >> endobj 183 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F27 37 0 R /F17 34 0 R /F19 6 0 R /F28 52 0 R /F24 22 0 R /F20 13 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 189 0 obj << /Length 1524 /Filter /FlateDecode >> stream xÚĹXŰnŰ8}÷WčQÚV ď—>ö´h·ÝÖXčćÁ±Ű…cee9m˙~gHÉ–,Ůq‚‹6-Q‡çĚ ‡Gy9]Ľµ‰#N‹d|ť0n‰ .1†ku2ž}Oe–3Á9M_ĘXú1Ë…é»uĆmZůňz2ő›ěrü~ôfú’YžŽűB!w °™}oQŚf1o°ňŘ?ÍÔ¶Ăďëç7ݞ\Z—nרÁt9‡Ľ¬ý,^\ë9‡tş6“Ä2 ‹#Ćžřuł‚Ď? (\–ÎüĽ¶©5 Ą‰„":[ł$Ę{PsŐÓÜa*4$ٲŽć•_ŁČj•ub$9ŃL×ÂţˇŠľűöńá )0}’ĚŐP§'%–q·°0ÔÜ„PoŞ?!„D(Oä ¦+¦­ń6$…kTĂ•/B©LZuýř "yËăc÷î\śŻ(?ŢRkE€Í&50W]›č—L±ÔWŰKY(hť ë-$üć*Ü/ń’I ¬öëşD«;SF8“u „ŠććM=łMAĂDł ÖqĄI‘C›7ćđ0Z"‡ Öb]*˘wO‘xżuä’ÁXB¶ˇ‚¬Šú=âU€!Ŕ ÇÄBŮqN”Ś Şç*ÔPxŞŚGN1ŘR‰íDj× ™su< U9ĂvŃFĚ9p4Lá°y;Ű;,bEúwćT:Ymý‹Ă´XÁIhMC˙;ôĂĺá!8o(o¸@ôůeÔ:Ćď‹ö‰H;N¤rŹ tťć~ůYb,{p´Í‰h 'w:MÝŁ`Ţç p'ĺäĆaŮÜßŘzÂ,S´ž2^řÁÍ$ ;g3µiľ.Bxú㵜bfńJUÄďŇWĺŇßaň|'¶a“zźQ‹ íW;Č ëep;±h¤îM2#LvjţŔý)ŘG†?ukłnÍ”–uǬŰټβnŘeÍąSś< QZ I±§Ť`ÂćÎ4nÍě'1n-°ăĆ­Í/7Ĺ{‡\`-ϬřČËĂťś‚Ř5ÎyĘ©ŐX=‘]§FxJÝy]†îŚĽ݉p̨ mŕ ëiRŐ`ťN•0°»áá¶Š«ĚŘ™ľ¬U¶Ź.˙'·eHJęAW&!ŐŽv ege”˙63ěZŻđ±‰ţkŔ}aůŤ’˘ÍSĹŐŹ°Ę´°L© )Z&Vłł2­Ë ™9>ČLA/V=u »íλÎ ĄŇ™ĺšąôë­Ă4xXxwĘŔx‹7gľ\ýĆEš·°Î9" CgąEhĂ}RÖře\ -0k`=ŘÓ o„ĎáUę`+ţw˘rĎt]`!;†»5Ěu˘m°˝6&{؇BŻŁâ }č]±ś]ö© "ÄŢ(Ĺ@0čëiµ,jS8ßEt)±PŁ… )Aé÷´‚W_w™Bvřá‡D2ŁáI˙oöĎ=Ćţ5°Ńäa˝4őîűć ˘ ď·hO”|ü×ň'ßĹŽ ’88Ńňkx·âˇW8VëŢ«N)ÓŰÉĽiđëg&(&jw;Ţ\űrRáżmÂśeµŁ]KŚ.Á«ŰxÜiř~ýéŐ3Ľţ,ěQčđuä€Ě ˝ş}qq1øŃtz{J×/¶ĺÔ_wi9÷díűˇç`] ł‰ TĘ€ř~ŰÚ´ňyüć”ę,·JčTŃ&˙9#ÇŠendstream endobj 188 0 obj << /Type /Page /Contents 189 0 R /Resources 187 0 R /MediaBox [0 0 595.276 841.89] /Parent 186 0 R >> endobj 187 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 192 0 obj << /Length 2166 /Filter /FlateDecode >> stream xÚíZK“ŰĆľóWŕÄÂhޏܬ]©J*Ë»‘ö *۵LHbríŐżO÷Žţ¶ŃAłRp˘Śí©Čţ˙˝Š ç)uĆs"këlşŁ˘„y”†+"”A-ŻĐLf2 vę`§$ĚŚ"ÁĚ=[ĐDR™uôšŤ0šP0ďĐtdĐT‚FçÔ1MAC”¶K[°]ó­].cđRŢ0& —<3”G­· ü†N3*˙|vŰsšb”(pzGńďśžäAS‰rGI.¦ü¨µŐDlýpŮŕnkÍŃÎ[řcµ¨WhÖA¬†“2ř—°˘äNŰüúqüqÝÂßŮňKx®«ťQEŚ‚çńąŮÓĎoŰٲ<__7°<?.ęĐŃQAŐQÁĎTQď‚˝eÜÁ(&Ӏ˟Ađ¨u”)“®˛ŁěŐ·°Ęg’Î má6ÚŤő_Ý"źÄ~;‹ë#·šJÁd–7â4}(Ëëĺתƕ]ˇšWý啊(ť–÷ǰš“ş? ŘHbjúĐE©(ţĹžŐ#Śöą¬çő˘Ŕ) Ŕ:Ž>žĐŃ ~ «vf^€P6,¶ŔšlŐ…mˇx^?´ŢÔU˝\WëYł$}˙+ąqę4h~đ™ąâazâ®'Kf*—_¸{KÝ™°±Bü·đJ%1@{ H{\ŁŞr««‡Vj±2Ť–  ś [в.VM>yéb5á ě°ëúi‹P\–? Ž€×TüŤĘŻ}łBÍůó0űü gÂmŃ É`Ś]t‹łĐÝ‹ĆŢŇćcáY‹k€v—¸Ş,˙Ň7›YBąűôĄ$ÚfJKÂÄ™‘:¨*;şzĐ—†hČlIäŚ@ ˇži÷g ľ\ űZcX„˛ŚP~ý ­›ŞRh ˝~µčÎ@‹jOO›vQă“®ă‡Ü Ű]XÓK{óßxáŕä P8ěs%ćŕ čb·ä–Xę.»;şĹî$Ň‹ÝCÁ” E(l>/1ǤëŘ$ą0ţ4 ;ÉjĄG;Đ ›H5Wş¤{őř3eb{’P憹Ł÷gŚ…ţń°|ç0ý †±›ĺn‘]Č?C=‡¤aů'TŹÁđwŕ¶6cĹď#›ĺŻu»ĆěčűfëΖë&°.Ĺß·Ĺîh؇ą&FâTŕlăüˇ:G˘‡_ΕΕL•ŤŠďU6ćvŕi3â"ěčč:ÄŽ$ŇcÇ,`金fyŻáÇSż˛%uâř˝(JçÜ i……EW&PňCťy^u•e˝ ČqB|Id´{{Ścô)%jŹÍ˙ďüéf{  <µ—âĎV×AţD‘“˛Ë%ć¸É.G&™˛Kw’çf—šjrŤŐR:9đ;x– {®vynóű Éźó7XúÎëc{If‡ˇBĂë^Aw,˝áC†xŹŘ7‹rž}zlH«zóű© ˇäUçTňś9–+٢ ßűŮĆťŔ;q.ĚEŘŇŃu-Iä"Ů懳ľß$ň<8˛ü…_eÔŮ=ü>äbDK°<,¸9ó”+č*;ĘúÇ\’ht`9?IAXÜB)Ęţ“,Ó˙M,KŻĂhîy&Ë(Y—áXŇta^ŕ˘çTWófYo ťS1&„ÝW ăfąZ‡Ž˝yń] ž#ű)­|Yw“P8ěqďjîJ<*;őJý4[ĄCkN3`˘„ojÎľ=ÝT!ť“Íž˝N™: _ś™+Ą5ŃŽyDYË¤Ř b.Ô^T]‡`•DzŔ:r2tQo §ý»…ÚÇŮآќí`ëúäß','@Éü34§GńŮGîž˝)LŠ/áD.âŞoŹ€*ÄňçĂG†DZýÇť˙pNíŠĚñڄµ‰ß¬Üáq·nűÍ ţ߬ř6ĐŰ'Ęsm:q ˛žÍgž‡°›űŠÝ6ź˘[ĐMcłĂAg|díw|ë XµqXnÖˇýŕ·„Q˘™†«, ŻB&ŔyL*„Ä$Čřä ,-`¤:˝ĎšVcß^ÁRH¸Ö~ÜĄ)ĎѰInŠ?–cL<ÉL®v[m]á(خ­8¤ëăxýlśbGłŘO ŰM®źă6úJÚÝA–Adă$čC±~Áź¸öíŢ(8©ýŹ0|3„­zÎ;•Cß•QOąUľ=Qž”3żń‡Č'y&A±¶ô’ŃsOćŐ_É…_ż"ÔÇŰáć˛na!&Qfđ­„ ˇT~źŢFĚÂM„^Żo®ľĂţď’Ű#3a2÷kDďĂ__ľÄš F? ‰żylÇő´A8µ_j˛¬űŽßŐ0Ř…żśy‡€™ aIľW;·˘´JŔΗ%oü łRŞ:endstream endobj 191 0 obj << /Type /Page /Contents 192 0 R /Resources 190 0 R /MediaBox [0 0 595.276 841.89] /Parent 186 0 R >> endobj 190 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F19 6 0 R /F23 16 0 R /F24 22 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 2245 /Filter /FlateDecode >> stream xÚĺYmŹŰ6ţî_áŹr[1|—Řoi÷ 4Č[/{E4´–v×Yreą›üűÎ IYZË»{Mzčá`EQäpf8óĚ<Îw—‹g?äKÇśUËËëĄ9SÜ-łŚł<·ËËň}bV©ĐÚ™äÇ_^­Dňr•*Ą“çoaüăęĂĺ‹Ĺ?.bÉáźX:ľĚLĆś2ËővńŰâýľ,|ůbÁ™růňĆś ç–Ű…–*ŚëĹ»ĹOŚ„¤#)ßÝÓĎŠqkH˝}ß@•5h™ô8ęŞoĽŠEo%ŽU˛-š Ľí5ü-úĘŻ¸x˝ë;ř»inüŇöj•“ü»Z÷{ĘfŚ´ąbNČS#ťłÁH ćnčOmĂ댝#Ad§Č–9jýehŘ6śEwÁ@Sq_!¸fŤ}şVĘf,?§–ńÂReXŠśF[9óٰzÎDť3ˇí`˘„/‚9cČFŽĘ—Ö fť¸‹7`ä+tý»ďo,ç¸ŃN« B[đn?nńnßÂň•‚P€ńE 7 ˇqŘVaŽÄL`ëĺüĘ ‡0yßĂJ:¦!˘šŹ·b.b6ĽŁ¬t$ěÔ1JIđô=Ç€=2 öŔ ˙ ě“&)ĂŽp˙Ţż\šˇžă4ůć×E\Ú‘ťĽpr¶ŁťQźfë,SPkÍ iC!…ŚŰüŽăYř.éODr]¬+ß2¤Ć*ş¸®ÜüĘ…– )ĽŽŃ8¶ ͆3îč '¤RA w“ŠńáK Lú oW¨2ÖżIx(&235L3Ţbp‰|ţóÎËr&E„V¸ÝSąśń<;'ř?Ő~3xáëPV×"¦9Ť‡Väiqm{•O}zw»©çQBfLććOxś)bB¶ J˙HgAˇŽ2±˛ZZ´?šâ«Đ-÷k9Îóf˛ŽĎˇ.~ßyM&|śŐµóŮł iL^ܲŚO1•R´ö°˝÷`@‚Ďf]¨<í}“ÝSŔ—Ýŕí“öĽ›ëŞŘű đ­x®–Wńfi0"HżłPs9`®şŹąjHŢ.xcĆgo0¨nű°µ˝ö3wS‘<ěw”ídb-$"ÜŤ3çjŚ„ţÄ™Ó"‘a¶Öh>Šő)¨qUW_·řeë{ 6Đ6Ń„ÇöWĘQkŠČÉUňó x_QŞoŚl”}СćY4áýE¬ANUdž7.|>‹xeS_D°|Ř%Fµmľ†ÄÎF ›1Ň!úeČ üÚAGVĄC ˇł) ě§mOq ˘Ă™UúÉIÇ«»97 ¦e„××˙zůň´ i&µ #¤LxVÁF7GS5Ď7źĎRŹrΑ԰bŕ¨ňG}ŞJ˙UŠŞ2`®¦¨*×,WúËRTŞüČLĆ;`~Cz–™r 0Gĺ>‹zQéHÖ /…škťxăµçźeE|Ô|Ôż=ÄJGŽ˙±R•qĐ*ź§Ą.'>¨Ál¦ţRZŞ˙ZÚWŹ\Tz.*<=ËCsË8xě!"Şąž58gBŠGm°×š‰˝šĆQ[j şŻN(”p:ÝÓ%u˙Ś]Ž˝ő8BĚŹĺsäžÔs@S“\ⷀ츅:2T*lëĽv› Ŕ‘a31ćCľ°Ż„nő˙Š›NţŹqSĽJÄf˘§3Ń?řeâ ŠfĂe‡}UúiěĹb8B´Î˛Q¨`žÄFŐ,EńQ hńÜŻ˘LÚÄ&uŃͨ ) {géMh•(0¸ń]®> endobj 193 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 198 0 obj << /Length 2341 /Filter /FlateDecode >> stream xÚÝZ[sŰ6~ׯŕ#µ]"ÄŤ ú–ĆéL3qťMĽ;™IóŔH´ÍY‰t)©vţýž x‘DŮnšvšťĚD śű9č.gĎ~Ě#/|¦ŁË«HŞ\čÔGÎĄ"Ďłčrů!¶óDămüÓűóąŚ_Ď­Müü ŚšĽ|5{y9“Q ˙däÓČY'Ľ¶Ńb=űuöác-giôj– íóčĆ©ŢGë™Q:ŚWłwłő4Ň(ŃJX—“đ> $ [Ď[“…Ç}* °’8e…¶ ý€’Jĺ jƢŘuKHR2éC™@x‘Ů,{+ť9‘źbË2±D[ထSÄhk ÄxVOĺ^X/{Ľ‘Â[K2¦¨ eQ¬V`tÚ[…“ŰňWToŐ–K” ‚ "Osuˇb‘}ŚŽŻč$:'¶7hÔ Ýĺ™.żś]ś¤Ź‘ú2toV¶ĺv‡>Y—ËŃÍş;¬ ţjL|…L× ´:N¨x·˛ÓiĽH{/®î×d…ç>‹[â…9ŃĹů e ÁŁ; ßÝ”5łSmĂďŔúTĂZÔYQ‘ď©qŐŕ‚k:łĹ2«‚şÇ% Č›Aá ä:‰eWgÜ–\9ëżŘŽЬř€šŰáq 0ö~µ(hŕâO”ó©Ý&LŻp{ÓňX~ňůX·*őBeůă!’‰¬Ë Ä\őziŽ ®_¶xfAě–ŕ¸Ţ;v\dŐQý’Jt´ÔË–6‚ µďÉxÖ&˙ěx,äRĺśĺŚ QĹ[J8Í;,Ś;UÇ΄˙Č\H§ú ygÂO˝Čś>8ąWé¶9áś|=`úc˛PŐÓäˇ}˛<ýˇ˝ V;ʨ›ŕ˙P–R(={ĘçlŽďCŠ×9gŻfŐ\óăÝMµšÎ)Fą˙ýRpľ Űš‰'·\ô—»ŢŤ6Ěa˝ĺŐ &Tëăç5żî×-)đ)Eăr®WŁšä™¶ &T|¬"hţ˝íűłż~}śxŤPF÷ľ ~˶Ą$/&@žęeÔW@h#B§Z·¤GhćB{2W)B3Đ˙f™zˇAI…—ďß\Ľťç*ľ<Ô˘IużúŹ€¤ŽV2"6Á8˝ÉěďŢĽ|YŐ=LúJ—ë3ć>L\”š%ĄćŃ#şqîAŹ&EÓÍt´Ö 4ÎtĎ1ÖĚϡ`”¨‘źÂŽ#'ůaGŁ ëŕ8ĆŽhV hR'Rű§bGó§`Çmy?FĹ€Q2`< óL¤ 0F‹“`ѤfR^č‰úFět'Ś^`÷Ä5)däŐŠ›®yřt„ˇšĐé6HĐ"±Sóow}‡cGűµ©Ç‡E ťTyŢ…Ţ ·PL…m-sWĚ‚cŚY¸Řö;lüţßń#ĺÉo ?j‡*ˇvĎé<âĂŐ9â4éć 9â GŽÚrXľ}X†í<⸠Źű<x2ˇĄ{xě!Ů>zDúÇFŹ ŻŠŤÁµm¦Aâşĺ#đqO*ŮăÄĐOaĹDič2üž…~p“©{Z÷őŃhšů‡!Ł’Ů— ŃA P{řau€7V#FžĆö—=_âpŚŤĐŇZü'?W=> endobj 196 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 201 0 obj << /Length 2442 /Filter /FlateDecode >> stream xÚíYßoŰ8~÷_aěĂAę®Xń7Ő·4M€M›kÓEÝ>¸Žśha[^Y޶˙ýÍpHY¶śÔŘ ěá ¦ČŃpřq8óqôüzôôÜŤ V9ľžŤąpLćĹŘÚś9gĆ×7ťf\©B'.SžĽJ3)Urrí‹ôÓőËŃŮőŹsřăă"[mY!őxşý1úř)ߌňńËQÎdáĆ_ ť3^ăĹH Úóѻѿ;(ÉzZžďŰ+V(5¶B˛ÜhoăĹ -yz*;ą‚q‹:qĽl0·nNá˙ݤ!ážN-.D®Öi&´Jrúů-×ů ĽWÉ “ÍĽ…NÍ_@ÄćI{GăBëd…ÍÚK7Ř%;…kěkŃ’ję›4<ů ż.©7ičRɇËW4ćŐ,aŔżP{A4¦Âľ[~–f*×I•˘$Ś˙™j“LćŐ ©xŤŻžĂh† l)˙ؔ˩׿F<sĂlnÇç¬Đ„k +Š'?ýë'j”~†¶j«Č,™:°Ý”ż—ÓÖŹŢHRÁ2—7¤#˘…˘-őöß’‡ÄÂôíšÁęLqp‡…âĚ{ěK¦ µÝcśhY·ÔČ•í]I+Üİüj6ź|-o.QhÖôႝ°*ÇÍémCŠ(dĘq؉óĚaSŔv‚ÄťmBľP" (5iJ’i"ÄŇśÄĘ ęs*ŠäµŃä!6Ľ`VÇb“ĂQŠţHhîhż”Ű_NčôłEŻ@żl«rMć‡u€éĺ¬ ™‚ąśď`¶YâRÚf‚ía>iăĘŃ}Đ”N®Ł×@đYyŕv˝FŇ9Ăáč`h— €óŤü’‚_!ŠŘßÖôK‡‹ ˇŐn˘v ÄÍçnâŠÂ„§ Ř-FM• Ź˘\O‘ŹrÜŽl‰ˇP¬ŕµn.‰Xeö ‚ŕĚŚ6Ç[%Ťeî>ł4)ˤ†ŁeîUć_ÍAµ‚ôˇ%rͤÝŚ„ÍÇPŽą± Š\řEž}¸zó6˙ą,T”–ťôw3Śdš‹Ă9&ęĘzĘŘgÄ ˝cß»«łSđ𢠌Ň{6 ”,ÔŁŘu=lŁ»rłcă‹Ú‡ĎéfńÚ&í:ńĽč˝k]𬾂k-ćđď*•ÜĆG÷ňůć·śË2ÄŚť© Ç”Ť0MNq˛;˙ňÄČ$źăŰ1ź5÷Ó ĎŰżu”żîqJ˛Ś^űîQPÁśP®Ŕ*ł…^őµ06Ö$e=W40 iŚźôësąÔs;•Ż-=őˇiŞ1ýY6-ĺņ́w¬Z©–>\ő4o <ĽxsIň Ş*WôłN}ÎĆ3i«zɡ?s~™t " ­#ŕ6Ä–!¬NB4íÓŔ–Ö˝ź1dú%ćăkrüĂĄÖ‚oVÄvb“2HÇq¦ ÂZ´:hě$Ŧ$ée\ jbĂl;)r¦)Śľőď·›†€–N&ż¦Ŕo'óMů,Ľk{Ű ĚŮI?ľ¨ý±jź|@ ŮMą(x2´‚ &#Á#*E8˘Đh‡9Ů0Ą;N:Ă\j‰ž(ç€đdÓ‡G§uÓ”D'đ(#Ń>#]SWÝ ×™Ǭ;ÉůőűW݆Ab*V/w·,2Ť›Í0ÁWŔ"¸šD¦0Y”H€ľ‹ţçÍlVé‹’l D×w‰ BŢëąÁ¤%‰ŕží¤ äCÇAňUŽ~Ž:ľF†®˝«â@G¶^îąNľcçŘÄžn}Gx¸"^k‘Ęę''=E÷‘“(Ň‘{99ÚŞŁČ \ĄSǦ /­-QŠĺ€ćäDPĘKN˘ôŁ“ž˛űÉIßľ-9©(ńČűp×5Vź÷áéěëěĎ!5Ş\Ţ›ţť:MYÎéĆ_ĂŮ€<ͧ»;ä“ Ę˘Ňp&«öOńB4ęĘzʆJŁ-d7ă=TŠ'ÜÜ„1zzÜôíŻ{ěą±Ź@n$0—ĽP‘iăˇôO'7ú†Ü@Xő%°Śc•LtiďPr)rŐťő…ż^‡śëŃ{Ž=Ýâšł“Ü>ŠŔósŢńš« 0Ö*Cő0ˇRµľFÖÔ ’:XśżÖ•Ťź48­«9°ńPĺÄÄ föÉěz3ťĆĐ ›4ŰřęÚ·Ô©ča}”3j=Ę ›î‘PŢ*»ĺ ă {ýëÉ«‹Ű€ĺ:ÉǶ ëaŰ~SěŘvuňöäňěúěíđzdYneϸ=ś.$Üě¸ëîZ÷Ä`p)-Šm!Ýű wśŢ‰ŁxRë'tR{Ud|$˙«ű‘ IůßâF`§Sâ‘Üh«ě~7 2äFďŢźź_ś^ś˝\$¤… ×đG10čzŘ@«<ďxyvůćí†;Ď!Ýô‚‰S.y]×Áv÷µŞŢÜŢż@ş@f]„Çb†•ÉÂ?,ę+V$Ýe»˘OfkC…ż1D…Ţ»*ŚÇpÝ(;p§HÇćB^O—2¸Ýąýâq {e&GXí}gĽ©§cvÓš˘/ś'ŘĐçM‡ßu¤Z5~x’ŰϲCú)\őŽ_‘f½BÎۦ0ď•ôH(7ťcO[Ht%éţrWĂűGW‘ëŮ©’oé]nÉ»gŇ…“ÇTăv E.śy]0­ŐŹ|«'=ŮVĹ=†#nD„Uxż €G;~<Öř=ď6D|ú’ĘóE7LK¤)ţËĘT°ąľŐq?đůŽEĎW4č "üľxsú3ö˙]?ŔĆܡ˴«gOźâufž®VôŐćŻ7Í´śŐťšŰ’-ˡw`H’&\ĄCůüĄ'DßhÔ/ô+ňÜ@ÔŇ$ZĹÝř/ĂaşAendstream endobj 200 0 obj << /Type /Page /Contents 201 0 R /Resources 199 0 R /MediaBox [0 0 595.276 841.89] /Parent 186 0 R >> endobj 199 0 obj << /Font << /F8 19 0 R /F23 16 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 204 0 obj << /Length 2005 /Filter /FlateDecode >> stream xÚíYKsŰ8ľëWđHf†ŢsóŘr•Sv쵝©ŮĘä ’h›[’čĄčÄů÷ŰŤE™’ěÉj»µ•Ş$€FwăëîŻéßnGďOmRB‹äö.aÜA‹ÄJ¬ŐÉíěKŞ˛śIY¨ôěŹ‹ŚĄçY.„LŹ®`|–}˝ý8ߎXBáK šeH!T2]Śţ9úň•&łM>Ž(…MľĂVÉb$ąăůčfô·NMrÁ‰2v(˘(t!AŘb„ÚJ7Ąä Jn¸"BôZĘLbÁTíM•°-‰KśĄl˛/mă‰V:é ŰŻ•ІŘ]j)/,—–¶ŰD·•‚0?r«Í6µŃD‹˘3‘Ă #…RÎFО‰ˇ‚0él˙quyťYžŢěTŕ%ââWďOĹřÖĚŁ¨|-k‹rš©U_ą›«ńq–Kikç/äśÁÍ!Ś˘ö*Č…$}Oę,ç&ť>-Ęeóől˝­Z'á–ęÖ,ć9őd†Cđ˘„ČJ—™ŕ ÇÉŘôUÄüIťâ‘ŘŮĽC7éôy1?­ć%ˇ1 ĽĎA‹»ŘK7*8BQťôóó”Ü Ëý¶WcCrmĘw‡¬6Šh)Ö7"{ŮÉDÂśV‚Pnť…W“fU®Ŕ©Ę¦“Ą˙Eě¸A[>·~ô'erî]ŽŹÓL±´^~+›¶ZŢűwL‡ŐŐ˛­7Ežu2O.aÝ…7™âiůŘ ´rU.ŰI[ŐKâ/ł—VóÂ+ž‹‚Řp5Wń [! ś WÝB¤ý\Ě€·}3`bŠ;ë AÂľáS(5›Ş°ą‚UEę,ĂÜ67ŚŃÉĺ…4hU@čŞtâ˝qđ2Řé»3.ĐZpoÚµŰÖ>5á+Ňß3( “ůSů!l6˝k…toMú—“Ú…WűîëŔŹÜhăÂŁˇŚ­ăĽ 5buc=q‹M'®şĂĺ4mĐąśmřšśşé<2mç?ü˘Gx…t~ňŻęf‹‰P;0ą“>}>?B„Ô˝ëč ŰM;úúyŢ! şVˇ¬KşâDţ—Šúřy[YŇi૬+«EęĹ»`iżşúŽ9–Ań9vA–+X"ÁD@ĐżĺĚ(+ď :SXĺ íäH`çPufa20E8^äíÎkŚĄ‡»źđc1`,RhĐĘîe,’I" ý—2–˙Â9•‡ś!DWËĄŚĄŞ tWÔć.̱öĆBă\ÂŢ?<Č„ŹrB»śCžNg0¬Ŕ1˘3}ĺ'î0Ô |ĐŽ‡ t+°\Űż ŰP-Ę I`[ÔŞ‚ÝŮXÎ[˙P…ߦĚCÔJE 'Ú¨Ŕíęľ\ľ˛ ŤH[üSŔ¦Y€EwsH§šr Ŕ;¬đ.<5CÁSwŢdîŃo“jîTčIśŔú&îÄç Î?ž"†Ű!#@Ł4Óű¨Z`ş=.ń‚ŠA¤%LŕÄüśÂ{Ȇ…%ŚFZv´ÜwÚ}438|ÂU]Äą0 ®CćÖů,Ľ»«1ç5^ÉwÜďŔrgýŚç1Ţ-dtf†úÝ]Ë(P%¨ ‚b¸xK-c„·×˛ +ď ó©ză⍣qŤăźŹŹÇ77CĎCçÜŃůYn d;^l4řďŃa»l|úq“Ózń8>ó¤á f?€VOÓiL«pIwŃ9tVFő˝śűŃÁĽĚ ¤ynăĺž°ť^Žkśbź~?:?;čČAt ˛öë&ˇ2@űŘ×íęčúčb|;ľ6E†P#Ö’ď¨'–a×-Ţď)–—Ľ·t[śPÚuĄ+Źf!X ă?ĚbĚÖm,Ž.fżeJCJ©fţŃ#±îç„fÝŔ˙G W!řµ¶PaŤÔÍçÓÓłăłń§AĂ! ädËŁ`µ_A#iď+x1ľ¸Ľţű0­0"l/­XiÓOµ'y8î:íúéţ!ŕŮé‹Tr×ĺz컍HîaQ7?đ™ű9l1*_W~™k·Í:Y…·Uʉ-Â(ŹmIďě=ßr쥠ŔŔ  .¨ů˙ŠWľPl:š$ˇÚü@4«§ű}q”嚪~"ŔŁńoQ{÷»-mag×±‹7¨oćĽ÷- ăd.ÉÁŁ~Bó†„WđM?űŚîłšŘH•\°5WsČ Ş őŰłö~QŰř$$€˝CëYĄäĎ˙1+rňµ ź!TA`™Ë©Ŕ&$Odáŕëë%řă> źľg‚bĆď¦ýä)G9 k*Ŕµu> endobj 202 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F14 43 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 208 0 obj << /Length 1278 /Filter /FlateDecode >> stream xÚµWŰnâH}ç+ühkÖťľ_ćm&i˘Ě&;aW#eóŔ€If $™żßŞn7Ř@&›nÜUŐ§Şşęźű˝Ł3›8â´Húă„qKu‰1”X«“ţč&UYΤt*ýňýkĆŇ‹,B¦ź®`ý%»íź÷Nű=–Př°ÄŃÄ(CśPÉđˇ÷Oďć–&ŁMÎ{”g“'XSÂśKz’‹z=í]÷ţXŰ I.8QƶM8§kŚ=ô­ÔőĎm+9@É WD(†>٧Ě$\ŐÁU jIńžđ‰Ń—N1‰ńaIĂÚ~XB~Éşq©`,—–¶ŰGŻJÁXXyiÓĺŁ6šháÖ>rŘaÄ)坤!›*“ŢÉÓďW—ß2ËÓ~ËOÁQ" L  ŠńÎćŃTľ±ŐÂ$µj‚»ľ:=Îr)DzrůőzYA>&ł; És[Ž1Âá őj{~Â÷1~•ł"¨Żu·Ď’Pu˙¦ŠËŮb‰çňÖąIέ#`ćŚć•ŐĘ€Ôf/ă¨ŕ(EuŇČĚŰS,y0–µwOr¸{”ď® mŃRlR"7ĺ/´!JŰD+˛ŢŐŃ8¬l:…gń`ĽĽ·Ĺҧtë®;Ŕ)‡VaëVÁ˝úU]eP @·ZL;v––·*6¦ĄŃő÷ŰßěrP°±ŕÁ6 $ĄâWŇ™ŞxĘp·^wŇÁřŠBžŤúďtÝ0´‹®ŁČ†®Ů.ş~5¬WѵPÄhýÚ^^Kwř( öót-­"TŮWňu”~ÂnŰÍŘM|˛‘ 3ř*‘:GŚ­á\[ŃäÄĚ´bÓ:N´©™–żÓ>–“Q›dĄ Buם,B7cÇť ­ŕ $č”Ü6¦ c¤\TĹü„Çc¦Ľ_ťÓĚŽśé-"úE&Áj8Č$­“!¨rmbož> endobj 206 0 obj << /Font << /F8 19 0 R /F17 34 0 R /F20 13 0 R /F19 6 0 R /F24 22 0 R /F23 16 0 R /F27 37 0 R /F25 25 0 R >> /ProcSet [ /PDF /Text ] >> endobj 209 0 obj << /Type /Encoding /Differences [ 0 /Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/sterling/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 129/.notdef 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 171/.notdef 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis 197/.notdef] >> endobj 51 0 obj << /Length1 1086 /Length2 5355 /Length3 532 /Length 6067 /Filter /FlateDecode >> stream xÚí“e\T}»ď‘¤i†’ގC éNĄ…‘``†ˇSZ@ZBRéNéii$$ĄűpßĎ~=÷~yΫýŮk˝Yß+~×Y×€OŚxQFŔŃ|@~ @AËP (ň °ł+  4Wˇ!R ¤$ ďb J„€R‚bR˘ÂěҵµC8¸ţ*Č;BPPk BŰAo5¬A0€Â A{đäa0€ţ_Î}3ĺ ó0Ô x±… ţr¤·AÄ˙» ˙ťr… śoM8oMrn-‚p ±!ĐFÜ΂Ü:ů˙aęźâĘ.06Čń/ůżwéżĺAŽPÇU ‘.h  …CPđ–AţeN †ş8ţ3«†Á Öňp[ŔáůWę¬ u‡€uˇhk;€ ć ů;˙éäv÷ţö! Ł˘a¤ŞÄó_ÇúwR…Ł =€ŕďężř›o7 u ň o oßYüc܆ÂmB˘b ň Ľ•xP8‸ß:ŕ‡#Đ·-€ŰťńŘ PťŞ(@@ţŻĐżH  đ›$ŠżI  ôhţ¦Ű>­ßtۧý’ü&€€áčöb€~Óíë˙PP ţČxkúŢ΄ý·RŽżx+˙oĄ @ůŢZDý·ś˙ŔŰ…Ł˙Ŕ۸üŤ˙ý;ĚĄHFdjaM웩”żŮă,ěÍÍ'wyéëbĚ­µâUmČŘÔťů,x/ý¨3uoŽăhMÇ౟ ďöľžŘäEW~ű(üŐJ€ääľíΗ;hő‰r®¬‡'ăv%öÁú€9/g…g ¸f;_ 5“€AŽńZ[,i˘şüu˙Ľ€Źţ¬ăi~e/sżÔŰfĺÁÂłćú¤) t°ĹJě=0ęl›—p TÉ0y\ :MÉúńظlJ}¦}V3uň|÷ńFۻ퓏c-(]UÔř‡cŇ% Vk×gî$h2Ksܱt°ĚAš›Šč‚ľÝüBYÇĹÝaţĹIvqŹř'cĄŕÝ–S‹ÇŽ)‹;¦ć(8!Ś ^Ź”g˝^0'Z]ŠEŚ#µJĄj@ŃNTVUŤcz@üg`?•c=)#~MMĂyUu=/DáÔĺö5I bqtă#ż{çÚÉ'.<Ě‘7˛úąÍß/Ę/Ţj)qw,»ÁÖź‡I]Ť”Ř$ť%ę>Đ01[ÝťĚA1[Ź9“ŻŽťzK©g}˙čĘ#äR§Y2^eó(ÁÚp‰bÚęRŃţ†Ońh–cĐÍ;±´:llCta`™őBĎŐăcÝ~—6]OŹđI+ߦS@nŞz€[’_ #úĄá—}“‰v?o•oÜőŚ™‰9óZ+Q>Űh@Üë«ĺÇČtJ>ѧHąŔM5sk—Ňbđ>ßŐ7źÉóŃjj}ÖĘüI·LÉ^Ľxj^iÓh™c®ô„;¶»EYľúiŻa`—Ę`=,Ť/4Rę q´ě:/ńÚ± Ľ«˝»ŔěÜýäb+FĎm6ŤřžÄ‹—$ę*jWLlŁcÖĂLÄ(Č„"f@°ćâž믷č&Nú·XşWą‡łÉoŻ*±Ä•(č´{J1© ™C1Z´é—X4/)ó•Źý•^\în¶3Ó„Ą‡NO±Ű 5Šäg˛mŰł¬Ű¶Zę.ĺîQŇř1Ôŕ|ţĘ]jĺ…»:%>™}Ţăhý3*–˛áĆ$ʤZUé=ýŠ˙Ś•î+Ź<ëë6Ą‚ˇ°§Âtء-GƬ´b ôcČŻ“ńÎy©˙XßHő'‰J‰AÁđ'JŹäŰe,…ôsK Ąˇ¨Ć­)ż%RěŢň#ꨄă¬ĐIĂéÚuv3éö˝ŽmÖĺćőő`b_‚ÎňĂúËY98©ý1Ůĺ…ćÖĎ©˛˛„ Çkhgą9 j ™Ë–ç "óŻp śľnúÂBĆ=Ý|tţŘĎtöáťËk'ľÄŞ+T–˝Í;öɧŞOťqŮůŻ.w 'ůł9±É§ŮÔžżˇ%¸—˙<÷j‡¶zÉTzLŇł)óę»—˙šl‘A­&µRĚxűÓ>ŕz ?Ô,L4A¶őް)«l‹, Ú`SŚ<ćY—ÝłgłSöűăŹňgI äő6˛VjZvR‡é|ŁşJéOk›ßăHö“P‡Ćkř˛ç ytŞł%>żĎžŞ4 JiľP™—83Źđ¬ľ@”~Ä”śŁ+ŽO’ 8¶Mł^Ýuň¶č•i&ńŢ] HeáČÁ‹"/ĆżkI„I4Ź"3™’˛Ob’ËýHáŠů’¸ś”ţ›—:5×-HÖ[§žJĎU:3Ě„–9öÓřĹ#ŘŐ VÚNř‰Ő2ćpĺľ)Ϧ}3źVž§Ăť“ŰúxOâ а»Í#XŽťvöh.ĹŇş‰›‰´3㑱čć>Č_Ţ:Ńü®<ĄEă]4Šq¦]Ůµš›€§îŤçiúXFż=×ů}A oݏ>ľ Ô´÷«[ˇß®..ϡAYżůŢôvË‹$kŤ¬51I†ýŃť'‚ýČÄuęfG÷o‚Sů›Ţ&Şf Óˇd›ţ@fĐ„"_>ńJ}+˝Ë¨ÖD>ˇ ˝—!EÄ"|†V·"ÍŠhlę.Fâ‡I†xV†fyăRÂőău…>g©CúžŕĎ“ ¶xT|±±l]ź$ńÍJɆ1bcžŐcřĆŔî‘Ő¤Psćhă×ÁťJŞmű˘”c*öÎ%Ţ<š&<¤[aY›/ÔN-!r¶Ż@c4xQČozýI8|)ë1eGwĽš¨eĐ–0’ěH˙ů&RsN#’h©[V2Í.Ł ]ę5s±\QÜV~¶|ÝĐýkzHüXü«•Hú É“QÍźRvĺ4ű±¤ëĘÉÍnw˝şV#tçŔń*‹cO?«ČűŮ'ł‚ťm4ßnĺâřjy’Ä{সTER†H\ŚUçÝ|Á‘qcNqţ‚jčž9x23_Ż#Ö‹ÄÓŕÁ‡€ńEëő|˝zÔč^ňzÖ(…č†×ěA&ľ€Ůősáú¬ó<Ů&¶řë4ŇQů¤~ü AdvăCj5܆OR*ué]-…¶tŧ‡t;ě+˝EO9ž ‹ňâ–}RĂ­Áˇ¶ Hr°çÄ4çµ·9'Ŕ.±8ÄiE>źGŽuĆÜęńăwâ¸WšvfĆ,&ŶíaĚśr•WńFđ„ôˇ´ÓñĄşC+QVŰ™g»cÜĐš¤¬®HŻčń‰o®+doOÄuĆč>`Ętc°Ń}©ůŽăđć -â©;ů¤¤:é \®Z{櫟Ѹś„†ů*\}÷1łÓ˙ś˘Áá+ţ‘’đtoU˝’÷MÁ`ĎśŁBA†®XZ9‘ţŁ+Hě8Yy>¶ŕ†ë|GÔSăxA˙h˙$—ľ'†—ŁŻőéáŕŔűÚ,Żb™é×r÷†LX®–Śç$y›÷sž—?’ÎP±˙>e>1޸'ľËÖŮă?®tlŮmŔűR•śµ°ŘĽüîTÁ;Ž6ˇďňúéî56~7WLĐĎ/ á´Űż|E?E$ÄI=9NĽY¤ÁCÄŮeç ĆŮ»ášŐÚ€6OUŻ[‡®tClYŢŹ÷ ĹĹî© [IÚćVÇć6JvͤŐŢŹ«íŢw`žIfAµX±ž–˛ęM.ŁÇůIŘdđěb4ĹÚ”űvŐÍĘ`_‚N€\.g›ĐÓÖné‚üx˙µ´Ex~ŐWô‡đSR©Jłć±hŇ4©Ţ09ő EĂ"óě¨˙UŃŹVJO-xąËRĆO„kT; ¸ŕ\5€ĺ“©nîČŇťy‚ôYä8TSm/%˝Kť:Îëcާ‡ěsá­¦ş%Ëš2´öfşZ…ËÇÓŢŐë dŽŽzĚ çX>'1skbŹÜ!Cš=BŤPŮÎÎv!űŔ3Ś…3‰Ľ-ÓOl“ĺŔËWh=SĂyv+a•mËú‘H©aęë€&Rc--6Fi§f¤:H`J“#!ĽBăh‹Înâ…ď=š±B\ń­f”ˇ‘W}ŔF…Ž-·$¶P®pMśÇťó ÷›8ĹÔ.#ź‚¶ 5 …–MÝŹIŰöÇ&őzš4Wďç/lÎ6»ĂGN󥫊SWÇä˝Ď°„đDł: ĺöęĽy«Űú9 Ł{ęŞĹm‹,H÷ĽďÝŇQ˲-ÇľíßHÖăüذUňc‚ErŮÝ4<©;9çŇk\a0÷{Ň Ńř‚}ÍR çý5ÄFµ…{Ż× Ú·Ďěď«›%Qž´ť‡ŁěÄۉޔÍDóq2ŽŤ0îŰM,žĽ«Zť‰›^¶±tz2a,§‚ë;9EN:@ÎëUź·îr©îËhC)źqU•šî¨Ńóń–U=s«÷?c*¶é ŚŕŤq#Ĺ[|¦ÇcŇŇeęéjTqIŢńLńŇ}SźµÚĆĂ+´ĂŐW˛ĺ‚q»zuóŢęšĹ^HµűĎ*aęT8đÎŰŇyĽ µu "š¬ UĘ|…'4cÇűz)ö‘^ç®Î¶é•…ŮŮiťC—o~-öřq4¸^7eĄ·ŐčjpŔżę٢©Ű7făjŰWE_ úBÝźţhgnq`ţˇü‚ÓU–Ž´yÂ[&$˙൜bHJݲµĄŠŹ&N ›¤ĺîřyŤ×/ÚY^)>—3É‹)Ňî8‹,±·ŠW  %ľržVŁ*˛«Ť0˝®NdAE3ěŁüü%~—Ś3cG!™+ęĎ®WŁ»ü–&ÍŠŤ\!z1Íw‹űÁě<>8RíúŘZś_oăIŁÓ–MwźĚMJßłÁd‡ł0.;tĚĐśÔ&ĺQ%L*Ľ—Í#ZÁ[˘uÁÜÂćbËő}A×Íë5°S@sF†ż((|IÂq8ĚšN ôĚ•¤éA§ňĂôK"v]ťź=†§+ÇŢKí˛5ŻHŚŠĽ5łÓĹä‹ËG)—¤ú¸Ľ¸S›÷+íűü×b˝«lg§iVYJ«őŇ+ôvď~bV”f”¸†Ľőu %ÎlbhŚt©ă›űúűż™±xúW]+'`Uwß Ť˛xč«~ĚźĘńHćŇyłl1~.îRĘ™‰xÁ4[FćS¶OŠdŞéťŠ©PYř@ÎWX9¸XFäďf ěąóŰĚ{#µe]óé’W×őĘ'ăúž÷ŔéˇÔńCŔN!Îë•iÖČWi·›C^UéVŤĘűŢJńhřş¬ăęÔÁź ×ů{DGÓiÝ2tuETF™T\LŠzőśLŢb5ÁQ™’*˙\qľ4<-JaĚ'Ţ{ňܨâ ař˛^Ä}9J^ đ” ÚŽ#ćFď$5¤Ľ÷^Čs…’eBŘŞ™‡®[®bdÖmą´Ä® G|!®ĂЦyŁ6Wě˝q…Ojxďőc­®Ő?´–*¶şUft)/ţnęî÷O•`Ź(P2^©ä}žeű¸ GčÂÂ7>ďůyé~ěágV7 é]˝ď/ äűMĚäż0#®ć8'@ęVNOĺÓ  ,rěťc`:©ß·Z˙TźQ|Ćq×dh@áĐ^í¨M;ďk#ó_É×găe”)ĚâeŰJfät]\…8zĘĂÜM=H;í ńYĽ—7®•ś\&q 8Ňކ‡nm¶t°;EŠrĹsbt%€âąhJ #^Fz^Ń!zaŞIó*Ó2úâF{Ęýűi$ÔúµŕŕĽ.«ďVS#/´"ÜeąNÎüˇšč¬úĚ;x!+Űu5ŔřĐĄ3A?ęoš§ÚźZ3%ßęâÄn©ąúyČL<3ĎĚĘ•Ŕ/«\ÎI®řVŰă}Ôěćëz w‡âě°W§ÎÔl@ôô˘%Qµ$4aB_ăía‹/^Ú+­čRbÄÜ%qÉ>|ZF˘ŃŢŹĽ¸š&S^Ťň 4Ę.Ą@ÖÁŹş‹úËur<ŔʶĆOç5ěP”C/ňĽ5ËK&ýqFluÖe†BßPZěVź5‘׾—×ńĚUs¦ćwŘ7ÝÄĘD:΋N€™<‹ü"^##{¸{…˘µHkWA´j+a Ęđ3|%ęGę|Wľ©ŞńŰĹş$i˘/˝sľŹŽ9źÁ"WVI”Jh4ŞŮtŤd{yóśŻíúcą["ik1Ü·ă‹+Nâׄy´F;‘¦÷[Îrőʇ† ?XX1[˝ů¶…•>LLEi|ł•lłý!v¸NJţD™rSž× >ŤB¬ŮąÂiÇÂŻúć¤ý¶sAµ/@ü…)•´_t™F+Ę,d›¨; ©<­„,ľ®Ńŕ)vá nÔHdÎ+.+ôňݰ×HXş{ŞĚ–±\î$cV)Ňh1˙µi!&]ĽTg}oÉ‚tĹŽ#ľ¸TbÜ,6,"ďúÁÔŻŇíź©[t ŞŰćĐ!™ < C,~şÇS©¤+_«z5“]Ş€ĹŢ…“ĘŰśżĹ©Ó0B”wě!ą‹ ZŐ?—&„ěO=u%aśM÷ xČhźGůé矡קvęż` BöĆך,­E0yRÂćzş´Ź±tyť;ĺi~gÖëĆoĎ!~‰RÂ"°Żý+Qٵ¨DĚłĹnŰâśú‡ť\UŞL‰*Ĭŕ‡ůîĽä«Ů‚W}B~$޶ĺÄĄ<ÝwîÖŃ=†Q™ÓY_éT8·ÚÇ›&©z돭ĺ—ä©›Ę?'1sVI±éČšE0g—gNŤ vQ©&k¨ ë^żlË]üD†őôFŁ-…IČt¸Í´´Χ/Ű'‚N1ÇL4ˇżć3«Ň šoŇý6Ĺ'iaqQáUűăË…;Ďž Ís¤¸F•?˙őľÇc¬rĄ™ôjé¦ÚĚy6ł;ę{Ç(Ŕµ„đ§ÖV504Mđç=ŇJŚ™ęÚđ'‡ćKĽŽa.¦ŞA+ë:_Xdö8ÖŃEŕc*G‚ ĆDď»ţA Śôŕ´L`Ş•ĺŁČPE‚»ň+ŤŮýCyĚP‘Ś;0ói®ĄB—Ţďa˝Ż~µwuśßđEĐdúÚäoÚĆj67&2QÝ[f™ĺ<=)Ő¦¶j{+üZ?ągŕék4aÓ aú‘ Y,”¬\l„ĹŰ«¦ü´Ý9ICß›UŔ,Áxż™ň}ňÔČă{vĆ x…ł` ĹşLĐp=ő¨ŔˇËü|ţWŕ„€5 BˇŽ ”Á˙Ô Nendstream endobj 52 0 obj << /Type /Font /Subtype /Type1 /Encoding 209 0 R /FirstChar 65 /LastChar 117 /Widths 210 0 R /BaseFont /OGKWHE+CMTI12 /FontDescriptor 50 0 R >> endobj 50 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /OGKWHE+CMTI12 /ItalicAngle -14 /StemV 63 /XHeight 431 /FontBBox [-36 -251 1103 750] /Flags 4 /CharSet (/A/C/D/E/L/M/N/S/T/a/c/d/e/i/l/m/n/o/p/r/s/t/u) /FontFile 51 0 R >> endobj 210 0 obj [727 0 700 738 663 0 0 0 0 0 0 613 877 727 0 0 0 0 550 700 0 0 0 0 0 0 0 0 0 0 0 0 500 0 450 500 450 0 0 0 300 0 0 250 800 550 500 500 0 413 400 325 525 ] endobj 211 0 obj << /Type /Encoding /Differences [ 0 /minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/arrowright/arrowup/arrowdown/arrowboth/arrownortheast/arrowsoutheast/similarequal/arrowdblleft/arrowdblright/arrowdblup/arrowdbldown/arrowdblboth/arrownorthwest/arrowsouthwest/proportional/prime/infinity/element/owner/triangle/triangleinv/negationslash/mapsto/universal/existential/logicalnot/emptyset/Rfractur/Ifractur/latticetop/perpendicular/aleph/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/union/intersection/unionmulti/logicaland/logicalor/turnstileleft/turnstileright/floorleft/floorright/ceilingleft/ceilingright/braceleft/braceright/angbracketleft/angbracketright/bar/bardbl/arrowbothv/arrowdblbothv/backslash/wreathproduct/radical/coproduct/nabla/integral/unionsq/intersectionsq/subsetsqequal/supersetsqequal/section/dagger/daggerdbl/paragraph/club/diamond/heart/spade/arrowleft 129/.notdef 161/minus/periodcentered/multiply/asteriskmath/divide/diamondmath/plusminus/minusplus/circleplus/circleminus 171/.notdef 173/circlemultiply/circledivide/circledot/circlecopyrt/openbullet/bullet/equivasymptotic/equivalence/reflexsubset/reflexsuperset/lessequal/greaterequal/precedesequal/followsequal/similar/approxequal/propersubset/propersuperset/lessmuch/greatermuch/precedes/follows/arrowleft/spade 197/.notdef] >> endobj 42 0 obj << /Length1 772 /Length2 576 /Length3 532 /Length 1127 /Filter /FlateDecode >> stream xÚSU ÖuLÉOJuËĎ+Ń5Ô3´Rpö Ž44P0Ô3ŕRUu.JM,ÉĚĎsI,IµR0´´4Tp,MW04U00·22°25çRUpÎ/¨,ĘLĎ(QĐpÖ)2WpĚM-ĘLNĚSđM,ÉHÍš‘śŁśźś™ZR©§ŕ“ŁŇQ¬”ZśZT–š˘Çeh¨’™\˘”šž™ÇĄr‘g^Zľ‚9D8Ą´&U–ZT t”‚Đ‘š @'¦äçĺT*¤¤¦qéűĺíJş„ŽB7Ü­4'Ç/1d<8”0äs3s*ˇ*ňs JKR‹|óSR‹ňĐ•†§B盚’Yš‹.ëY’“™ě—ž“Ş kh˘g`l ‘Č,vˬHM Č,IÎPHKĚ)N‹§ćĄ ;|`‡čű»xűyjCă,™WRYŞ`€P ć"řŔP*ʬP6Đ300*B+Í2׼äü”ĚĽt#S3…Ģ˘ÄJ.` ňLŞ 2óRR+R+€.Ö×ËË/jQM­BZ~(ZÉI? ´©% q.LŹ89ĺWTëY*čZš 644S077­EUš—YXšęé˘`j```ańYriQQj^ 8 ĆOËljjEj2×ÍkůÉÖ-YÓ·µ­¬s]|a«>çĎk_Ţd?±ŁnvfJm°éĽ@Ĺô’%Ż>ÚÚwX<ű˘„W˛őTá˘-’˝~=q_ ŻŮÚµ`YÄ„Óýz7‚Ĺ+›»¦ńţÓVĺy¸0lĆśÖGŇVű‹ĎęTÖąůEąţĎĽ”NQ‹÷}żwŤ[H+h’–’”ůÍěwĹÄ+ď>ż,˙iGýôă¶ÉďÎŢňń /vëRżfÇťô%ńۮش˛‹µź9ĽňâQąDĘ˙žýŃod;”ÚU? ^Vńµ«Nşúú©vńKŻ{~­ńçäÚ/ëtôî…Ă-Çé÷7¸ď“ő‘9ńŘ8ă·Ô mżi"é÷Ś™6=Ű!y:ëIčĆő†í˙_°K-­ű±,1{Îö)˛.oŞ —ď¶ý*Ţ[«ç˝mFäű%»s_Ű-j(lĺ¦s˙Ďůś~gŘşŚ|K·~›¶#ŁďµľřÓ·&g®]p_ň¸!—GrnM`ěv®^˙D·l˝źŢë>Z`.x‹“Yh—ý.Ž#ÁÇ8Ź©ŻŘw6O~ˇ—5“{Ţ„U7¶đ807ě™ő…űkŤ4鹇Wń»5ţô öŚďĂąfŐź”ŰVĽ RĹ—÷mő‰_A˘ëX¦ĽOďjW;[Ă(Ď´˙ÇęĽuď,Ąn q(ď»°őĆŹŤA®ć…Ëü+Ě»·3z^›"_Őöű˙‘Ů“O:†~ýUűIŻH$P†kR¦˝ĎíĎ-‚©˘áúş×y'y=řŘ'sµńó‰Bˉę˙cŮWdtDÇ?ű:`‡‘µŞń˝w¦[K˝đ_°Č€BŔ5jŔ°0 9'5±¨$?7±(› ˇ‰xendstream endobj 43 0 obj << /Type /Font /Subtype /Type1 /Encoding 211 0 R /FirstChar 15 /LastChar 15 /Widths 212 0 R /BaseFont /MSDKNI+CMSY10 /FontDescriptor 41 0 R >> endobj 41 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /MSDKNI+CMSY10 /ItalicAngle -14 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/bullet) /FontFile 42 0 R >> endobj 212 0 obj [500 ] endobj 213 0 obj << /Type /Encoding /Differences [ 0 /Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/dieresis/visiblespace 129/.notdef 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 171/.notdef 173/Omega/arrowup/arrowdown/quotesingle/exclamdown/questiondown/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/visiblespace/dieresis 197/.notdef] >> endobj 36 0 obj << /Length1 1596 /Length2 9671 /Length3 532 /Length 10598 /Filter /FlateDecode >> stream xÚí”UXÚ¶Ąqw …w—ŕÜ îîî,¸»»{pw ÁÝ=‚C×ŮçŢÍîs»źúëŞz¨®ąćk.ˇ$UTa6±3JŘŮ:3°0˛đDĺTUY,ŚĚĚ"””˘Ž@Cg ;[1Cg /€…‡‡ lď`ĺ°0󲳂~”Q;{G 3sgµ(Íż’¸Â6@G cC[€śˇł9ĐTĂŘĐ bgltö`[[”˙5Ă   t:şMXX&ĆÎ# ™…-Óż‰{CźJÁ’[<łĎčÝ»¦Î;ĄÜă |"ţĐăK=Á‘ő‡DÄĘGřÄ)hÝJ%©˛ün{„;g†–ôČ"Í#ŰŹ˘,ń3cJµĽ|2zů¬4ó˛-v‘#ÂÚěVeTo@ćČQěçn™]š{—=űň'8$Ѹ}Ź~…‡grŹqôbí®2üTv~@1Ý´±Ôóârß‚Ťé•M=·85ŮřÉ•ŔńI)O •mĎ2­_«{Ż;ô*“´ĎS‘ÝbMý)§řFĚŘS ĐÇĽ?—#Nťs˛˘<˘¨§’’:ĐBWŞ3ڤâňČ"a÷<ř{ř8Y6¶[Úč§Ăe'é•O,Ł^ôyémőýéĆgDI\Ŕ+Ůjôó öCłB©ăVGĎv1±sCŢ3ď'ÜźâţĂĺČCşxÎ$EŻv‘Ý”Tâ2Ýp)c2±™E¦ŽIˇĘç2zŰ!® Řz!WŮŹ9®Áżo!|G´Ü”CPňrę‡Ól’ř*ůöt%Şô0¤N±ĚSÔK­C|jÉeßéŘ—ÉĄąŘçLÂĄÔŽ\serŃížH•·ąT_ ®o/u›Kň"ĄÂđŻh%RťHöge¬pܦDpEY{óˇí¸VIOŐ‘m ¨s¤Ńď5¨ĺĐ_SŔŘÍH•ü(­˛;ëpő)Şo†6ľpŔţňałĹuS,Ȭ‰’® úbZ1HAěçËřçBúĐŤő5 äś’g2s6ÄôúĐfË[[5~\ů ką183ţź!ďÇ·Č—Č!Z3`áôőůÜŕ—<”DËKmpĄäI·ÇD–đ>…ą2ŰŘ’%/G‡ I 6’Ő愊ÜTpźR!§v‹ü-.‰XÖ~ŕ·ůI%oaĂîŕî˝VUJÎg„ýGCńĄQOŤj şo¶«t8ĚDČMöDĐĆ^Ńdx€FţIđccü/¶šÜk„ŘnCBąţô¬q…)ÔFG<Ę«îűćkz ĹĽ<„Ď{„úţŐÇáÂŚ$-´k†m‰°ýúC „őB!Ιo»ašČ|ź(‹äčŽi"4žărňŕçaj=8…ňé°VF†‡+©~}f"Ú˝ě–5ÓŞ\ůÝŁ›źĹÝš}\ďj CĎc8V˝fńÜ+vŘHjŐ˛ÁŠ0 ňßîh99}BĆŠĎ÷ŕŐc ÔwôE÷ő]I]‡–ź5iîvş»Éć(Ô=6'Ą©2fi˛VRvk%ŁZ3Űaď$w źjłúš\ů=»Äómn#‰­Hwč¬GËĘ űiˇă-2¨/7Ţti'#&ubta[5ÁŐüúzŢ›D˛»%·z;UVąů‹žj}{kXŕbdU›yIFrac椶±c6݇đäĘ[U=÷÷Ü!ÎfáV€PrG"tŁúOdÚ“)ů ŚIĂ%~>Ś L”ĎŤĺ¨Ä Z¦QG4PÉ3!śŹŃ%3˘/÷yT"döÎĐN Rç Hí鰀ҙ•üé!›ëj«_†ŐµĂőnĘrŕóľ^m\4&ß(%7Đ kŕ!h¦_†vŠŹ˘·M˙ąfë¦ĎăB˝Ýi˝Đ0Ş 6 Mş·q¨Ť¦úĺěPqC ŠÜ=E„”^3”RIÉNP˝iĺ#óşá‹GúüóĘÜ#¦#<ő&áëâ•&Ë}R Qöźit%Ż,lŁë µ'ôM§i·÷?tÍß6«µ#ŠGŹMhÚÇ;8ÓWaK§f®)ď×yŠ&][ŇSDWCŁ(BHçáŤÜŤW8Ż.ŁxFşř¦ĎXWHőn™ăË c›¤g®‹ÚhÓniđřgvM¶hC§_˛0‹‰.ÝĆX˛†ô÷ĺň5#?o^vjEĂ™ç^śGőy›g#©­1™)ś=ŰÄrdĹLJ÷2z]šĐžaV,’Ł5~OdHĚô^R’îń"„-q‘7ŇÚČNŻfÉ•ľw?Ů›OÄŰŚKj@üÔĽ–cĽÜLäűzÔ{é»ň"¬đ¬c.Ç^‘@mH?­âműLüŘßb xőőĹ[Ůź%Žqń¬-ăęZŹiÜ]źęü[‚^ް€X6şwěj·W3ôňPŇůA™…ň'R ą:b•ôś0ŁĎ a?T }ä65Kn]ZmăŹ2łŞ›d1éÓȧ ¦ó‰‚ňČśśO Vf”L1۲ů˛šŠĘ©5ˇ:›ă¤c~Ę>Ĺ‘˝ĚH°ÚĎjé·«&acpEsÇeĘ@›Ŕ˘ĹłÄ˙h<%[Č2¶˝¸Í#ú%°ęQ!´Ć; ôˇ››+Fť´ÇčČ]„Ýzů; 6É‘C«…şQ[;ż89uáŢů®âĺ4­8¸¨Ńžckź-’oJŃdy6ę>ď^źîĎÚ}ŻeyDŁt{Ĺ'-^´f†š“/âkŻń ĹÚ'Ś:ę„#MŰçš'·7צ?÷sÎÁł”LE˙ř čZ›—#UđKcL3Ű{•đ&# íŇ·ńϬ‡ŕk Ă|`BČěFRswY”ľh;ŕ[NtÉKšI3íć8ŃÍŁQĄúěˇřvý´js(îdg_0čm詪—¶±čéËÔ[Ą!ÁC𬍂`¤ői&˝`菎~şiDCBpö·0Räéf~ŁÝxb;R4łÉţ¬“ŰŹ˘ĂÁ,Í&l;š7˘˘¦B•H ®xíÝ‹9ÉYř4Ôę|¸Rk·ă;É#Î۵^z ď8rýÉÚeL9ÉĹĐaçg«ýcĽ¶Ńş?O:Ú¤»¦@v›á`óSˇň†ŃŢW«‚€ë»·rWŐŰbUÝ9{©zk>×řÓdăoĹtąŚă›î¸2ˇL¸"˛Ň[µ RN7Ů@lo%u¨Šá0íyĹ R…­®·!+-1ˇ‚mR޶8v “z®µňY-Ĺ|=X&#¨¸Ę†«XWRÝŽ,yf!öSđÜźýŔ:•ĘăĎ˝L¤’ ńĘÝśiž#)Ńë!ÄűÔÍP)JcžhŮ4E©µÚPYŹ?“hÔ¦gţ\ír†aE#ď1¬?Ż«6LýXĺ°ű‰Ř›$ăZěkćIËřEKřëDŽŽéąÜń°źF_Źš\FÁ÷Fą|ArŠacé‹ůu@5í&ŁłŇPgŔc F:á<ő·H&ߊgK±Ç9@WŻ`ZXeś§~nł•qg^Ş)zzjn%ŮĐď!“řäoŰź Ő\xk§&4®×…|ÝgĂ:5YĄOk2Ç%^%ď})nëvL‡•ËŇ„Ă3T]˙“çŔZOŇż}=Ć_Ţ^QÇľŮ;Đł]égApIÚ dťIͧxěQĹéN? ±›Ö˛¦¶Ě-­&ěč/UGXęôanˇEöCĘ*źóSäo˘Ő×Í~§ďŚÁ}â¬yÂŇzŹě®ÂĂsÁX߆)îxWĹ X™ŞÓk*şąZ<*8gy{ęď8đŘO˝ôéčQoč’%ýÖ?“¨~™şŽOŚň€ Ž0¤˛‘‡SĄÚŐ­nb§X8xšŚ€Oś•u­§rď´¬xúĂ®FâSQýʆÎô<6o80” Ą/BÄóSłŘÁܱÄ@$oxąpőÄ0ňĐŇŰ˙‚(Ĺá!ô ; ëÚÜĽĚ,Ĺ °/ů:a‹źoM‚' M‹6/¤ű‹–rDI/ĺk€Ľgl±±ŠŻ‡ńĽî ŠR…&ł¨MŐ˘n©łl2@wˇ`wĺŁţBgöůuzŹlćH%;ˇ}žŕf¨S—BRz‡K¸+0Säű~E‚±!I‰ŮĚĽL‘Ą@şş«]Čę$šż»üMˇŰOE¤¬ŚÉoĎß;'I‹âł¶jhĘ@5ż 5>b®íáir¬;ÔÎŁó=o¨#źWü †Qi>˙h]·Nţ ÷YóN*ĘMaâ&™É-'gҬÖÉ]„;¤ĽÜĹ'ĹTćŚÝŻžjg´:ít¦ň„{ŽÂűŘYéVŹ’ţÄéC¬é¬1z"*’DýÁŹ˘C”zTÝîłőGV1=m¸Gr‘™jżł}ź‹”‹×?ú97ź}\Ş´?oçÉŽ,‰WkĎ+htjôK*ÎAbÜUçž2÷Hü ĚÓ\ߊ¦JÓAXŻ_ĺ˝ÚB%FÇ8©RÄíÚ'ÔňęşĆGáxżŁ4cĘ7Ě} (óÎ?@Şëy”ď°«X“Žł'ńö#­7č][Fť´/ŞŹÉLë•iéMčJz××6z—bžyĎo’]ŚE™ťiűMnşŔŮÔ7©ßézöš=mé ÍŮ] —j†nóOVŃüĂ?ńpîhLĎÖVé&Ůáoltw4 śkGl|Ą}'üźŻć?6ݬŕy/?°ŐĽÜ}ü(#NůYŔ‡ţŔĎâ'ł*C—_)>†w‚8 wć 氢듒dlÁĆEěÜĎ[ť"¨ÄŢ6ŕłi˘6/ݦíˇÉFÇžsâ„E,hcâÖ“­m¬ŐW§Ľ2ČßĆM˛="C˝ëŔĆ"˙-ҲŽ)ťóľt<1ţéççąŃQ2ë3Ćť4w8u)˝"zD/ŇËŔ•<1IčĘG&ęăŞ{¸¶Ň±Ě”Í “đg¶˘€µ4¬ôň?Ľ´§Şµ>sYL*̉ ¦­¸pň$6Lźür+¤8Ęŕ¸Bć«"Á«ü’Éż8ńe L7>×q[ŁĂx•t¬JđŘîöP™>2đ$*ö,?â3˘ÚC’ÝŇëąâŐsŤ]ąx´ĹŻ~Á¦‡¨÷{¦ÂlÝD ,¶ Řü1w¬q#”ř–ns%Đöá)~„·n`´ČgšĐ6žĎú÷–QJZŕ45”ţi¸˙$ĺCum^]˛Ůď kN‡Ő^ŠĄô*żŮ33GMŐť@ÚÝP?Ćłq˘ęĺäŹlâTŽ4—ÜĹŻVśăŐs€×ďĹl.ßTíá1Łdă—ëĂâ&VµëˇIWŁ_‚‡&űÖ^l Eë¬Íź]:\nť0ýKű––‘âŁ3 bédÖ”cÄz†txy°ňëĺ3í ‘=Z±îU";Śl3:řŠCb‰,Űú•PV0âśR\ÂnWßTHfhĄÉ-î]ČŽą9t<âÖ¦PExoJ.–›C7Ąîô‡îçć‘;ż*8ŤbŔ_K˘©ŹnU!yň ÔŢ`ů ?őOeĽS-o˝TNÂ'Ô®PË4¸´Ńź2#­†›*©)UŐVڵěSF7KQTlŢ$!H<~űćń˘ý˛ë7¨mi#qĚ*ý™}üPMś4x‹łqnřüQ÷jJHűë6ĘâM)~*m7njÚůÎѦ†-*ź>łĆsłÎJKÓÝvŞIÇ)9óöüF&™t›D˝ă…ýź)Áĺ;·5é‡{¨ż_A5üňĚčť;Ú„Ukúźki˛‡Ľ(ň ĚÔ´yÓŚŠ~ä&™jjG<㡠©ýřů‚t –púą˘©sĚk«e·wL¸ać«wYµµą4¬ ľÖµY˛ Âč˝Iyú˝ţĽŤËM=¤đ‹ě쀑M.<őóĐ/E¸\Îć–ęĐč<űĹx4ą,… ŹňTůµá|ó'ßWAnÜnŤ˛qg÷Ž=ËpŽj_,tśß©QÎŇBĘ!“(o‰žÄ4ü¬ysĆFjotÎ1Ł÷Ęp=&ד`¸üXţD1ŐÔÓ÷ľ” ’;GHç›”Ô~ElşSŃđóA ă˝*HU˛ľÖ%ěőłőżĚ\ ćÖ‹gľ:Ź)żSb•[¸…D)Q<6j­áµ; %€řT5ő&•áMń¶¦•Ö5ălş§d‚Rű¨Z?I®Óš@%‰qFénąd;Ś4~ĆZĚLă˛yĄhČ\ňbF9ŹeS†Mť[®Q©ˇś~b5´6Ó,hxű1VP…:j+7"şZÁ ˘+F•‘N“‘Yţb›7É‹Íjš{Zyżťťü»ř±Z¬d˝ýIýô@»™Ťźńv’±hyĆr<ĺřîçŰu­ 9ú´sŽV)?‚«%…(H»~lCK¸A)«lá^Íń„äňë2Ý«»$«•QąPţ­éĘ€[»ßgŁĘhéĂCśöß2™‹A¬Á2+ ˛­Ů¤ĐÍßjď+Z¶B^¸%;r»óY$íľß í“ĹĎVÚŘg¦Ô†éćů˛–N0‡âˇČY„ĆŹň$…€9ô»Ă!ś•‡9xë•ÜÔ‚(břś=švKĄĹĐéq Ômľ›Ýi/ů5â~ sI‡Ă™oýŞ8!Ç~‹-vŮçÉ#Y‚`No’ŠŻ°­Ź ĆWł!~{É“Ł*ÔđźXp˛‚čqTW·—óˇÂ\žťWz"’5ÖŚÝôó•âsŞFKďă ÚťťßáÔâ® ďÄüęö} ăČwťÍˇ´FevX‹SyVY»‹ĆzÝDś]ú‡$9Ůđ+‰Ó!Ľ‹¨ˇŤˇśݼġCYŻM)î@˙Zk¨q.7†{˙ýÇŽěß«8fE'ŰůnŁ–ćŇΫQYQQyÖź˛_ݤ-ĐtZ(đ9űáço(ş÷ŤKg¤ç‘ôÉh•·‹6q- Ť-W”w,]«Dw§3\o.žlŽ‚Ě{›łčŔ'†!éBÁÇl#)F륦"%w$Je±Xš6ŽŽŻ«ěˇR¦Hđ$˘1Hľ‹ó6§Ę”D˝’䝉l˙Ó9M‡C‘Ż7Eąt©Ôb*µk1oŮřÁĘ*!<Ć´'{Ť·ś|mq|íŰčö+(ĆŤ!¦żo~4żrá&çVďŮyNőd[2+ţŰ`´Ěx§?ĎÓšEé%n=ě—úLŇŚ¸Ř*K ŐH–|P‚Gf°…ŕrN5Ëę V“uéPhëNzYŰÇ×odš@v§źĚ*ÇÍ1…Řz©FńRGÂč«{«_kśűÜUIRçÜ€Tš[IFäĚÁ6ŰĐý¶üŃiŔúŃĎ‡ä´ ~tłFű(e…Dhá­ Uo°â˘+CŚĚg»dáÔqÍď–ĹŹ(9d{Q­¨F›ŤQűY\,űËÓ`U¬µ †Ş+'ÉţŕfDʎÜ&C‹”‰OĺČÔŐ„~ůF%ě© *ˇŕŮĎ ç"3¨6µăĐĆeZI]ˇgSŃVgÍJ$I‰¸‡ľ\"c…9ńv˵J Hď$ÂK•s#q‹‘–źŢŚ9˝Húó˙_ŇMIă“őĄKq ˙U<$ ó©Sş[cż4§îę9/´b»‘źúNü¤íĎX’%Ăý$q9ĆÓŁńáL%ľĚl\ ¦›]÷ßp±Ż’Žg&¶’Óë";Qđ†§“jd„6«ŁĂÉÖÂp”Đ%ŞEÁ«ˇĹ LCt2ľ©†f<xŠĐ+8ĆŔ¨±ŃŻs§ćß>´ŕ‚› R{VX—áňŮăw—’—٦/F‰©ú«4ŽöşŚ4»˙&>ľĆů—LŕyŮÍÜňĆ–Lu—±»ăö…L—ǵŘ%żˇ°ŮhŔ{ýĄǟń‡­gřĘv+ˇí^[“;$QŻÁ°Ôç‹>€ÚŽ÷¨šňúVĐŕÓ¬p†*ĽxcÄNň˙6ˇn™ß" řM_jb١Ǹ}¤­órx©Î‹.ýsv,Ń #‘‘á©P“6ĚĄI íg„ş6o™|Ç@°ÔkŹO/¶)bżÖpŚâŞ!ńŠž·˘Fcé±C˙ăúÜFŢţĎŚęg'»Ţ„\ľ—¸KÍ*lNňb¶AUlPiřNÉ&¤ăĹL±Wźŕ¨CV׊äI{{ĽĹN·3ů¸ćęÎ’ý¶Ë2~…]í@8vn©g!UŃnfIü+ĎŕŹôI5cťpőßť–ă»#ÓŁ•[ł'>cd®ßjaf÷˙9Ş™Ľ3K˘áSößÔL‘gJµs€ ź˘“śT?x¤mŢÝEeţN5"Ľř‡oÝŞSW·ĆRzsľ*·î‡ĎEĐ#š˛ҧÔH Ĺ´ßwÉ3‘C-&bÉcyă¸Mý3u}GŁ7ő–Â65–÷é6Ĺ·z„ë3őŮ泏ĂÂfé1>ë’oťröˇ’ëmubśPg¤érËü^´tŹľ˝NIóŔU6ˇőT‡Üo«kCß—© üÜ€ź-D$UBG9×ü_ż ł2/̇µ8pÂzt[$ŔVńLf\ Ş–0š„sZ„ɲPľźGh/¦ÜÝâăRf»2÷Ĺir­B^ÔM|«Ş¦HâÂ=ŞUbĆ:éŮ…ţÚ4@iĘa˛×«"mŁëđ¸4ô¸ëćqöF„ ÉTâˉF˝řöĺ`ÔŞxJÜ&ĐâwŇľ1v­ŞłˇřăxaŞA·Dş˘°fŕ¤l%ĺe`.oŐ y ÷•ŮnąV]°~ĚŃ7‚<÷ßôv»ńlhÉeâ5É–¸Ôp<+I»<bŕÜ-M{*‰h˘·™ÖµőŤČçźw?xZ ćô©ĺů>Lź ŁâbxMlhÓ ř{Ş_®#/Úgó„ě*CáE™Všęľ SĚOÖÜŠđ“ŢPrSGAşI°Żd:ÎĚ]VńńŇÄŔ–ĎÜ`ˇ#/âöş'Ąä¨„Ăj´ŐűÖmŮD´%škĆ řęÍđ¨Ů%˘ ŚřŁĘ0Żc2Ć\í n™jöQ2ő‹Çî¬ÔŃh1Jţać} ę§,7Oę}>](Đ˝ ŻŽSëŘţ ń|€2ž=ńŰę¨ü}6ŃýC´.Ő?CĺA1ő‰˘ń—{Ő©¶Ôî5ńţ4—LéşÝ'/ - ^φÎ$ ń˛VÂşüáJŹ`g–„A ľ”É ú(8 Ł_Ja1”š ¤ĺ>r s®´řL7Q鼫°Ë˝Ř×T Ó8Ç´ëüq}đäV$ůˇĺçĎĚ'É13rÖ—tÖ2xRÜÔ9nžďq2éĆör°ŰB —Ţeíöüő±…-fßÓ+[”Y”>SÜ*v&Ľ ű—xł6tÂF˘wlO ŚöÂŞ{íżĄG}Ó"7­\]Ć϶$őNóÖR„*a9:"ô$~ żN°öŠSmŰsÁľ¨ŻBI+ťZűbrâvýÖ-śóގ›‚JH^š&X~IfpŐ4*´×Á¬‚_ÂOYKYőăή ą} xčâý>çŞ(/łHf Uű6eiÓĽ$ËcĐjkw'±GňyU·…(8  ň xżăťCîfߊC":aﵾŔ±iĄ±×/JŻău•…±AΨç[µ{xŤ›ý¨Âµ@—Đţ%ĹXÔúz%®WĽĚaKĽYW¬ÂëŹŮ&Ô$íwŃ~Á@tJŤ·O÷[ŃBó‘Â8•F«’`¦ĎÜ„=]'}=¶x8ŻDśŤĎŮ›L(ń2 ¤čŢŘbL(a8Zf s»Xj‚š~äź(Ä·T·}«äwqËÔzPvŞő¸ YtŰ×ä9ĚGť ď? “áI…©Źí z*O˛n:_4k™Zřő14»Kvî~ö&ë˛'Ç´đG ę¨öѵŔ¦Ę˙Ejµ~6ç×P:őˇ6\ŮĂh˙ (âzä…•")z«É||)˙´Ăe.ź]łĄ,úýKq»"Ôcřˇcçúľ71SQm؇ĽąŠmIzNhŁŢĐhšĎő86´jLëHUÇÚdvʸdѡBž&żjőv &VĘFE-QŃÔ2™#”t°ţŁ™„ÝŃ7ă˘}łLů†éí•·ZÂ}Ű\T…ă»»}ĎÄăWČLvl¨űL|N¤(LĽ~·;~ŇŘEůS2Eünv;l¨gřĘ]»×ĎÎrĄţi4a3t ÁĽ,!l…š#¨đËB–euęż®ĘřB-†˙?˙żŔ˙Ś­†ŽÎv6†ŽV˙ `l ^endstream endobj 37 0 obj << /Type /Font /Subtype /Type1 /Encoding 213 0 R /FirstChar 34 /LastChar 120 /Widths 214 0 R /BaseFont /DJRNBS+CMTT10 /FontDescriptor 35 0 R >> endobj 35 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /DJRNBS+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/quotedbl/asterisk/hyphen/period/slash/two/three/colon/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/v/w/x) /FontFile 36 0 R >> endobj 214 0 obj [525 0 0 0 0 0 0 0 525 0 0 525 525 525 0 0 525 525 0 0 0 0 0 0 525 0 0 0 0 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 0 525 0 0 0 525 525 525 525 525 525 525 525 525 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 215 0 obj << /Type /Encoding /Differences [ 0 /Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/exclam/quotedblright/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/exclamdown/equal/questiondown/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/quotedblleft/bracketright/circumflex/dotaccent/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash/emdash/hungarumlaut/tilde/dieresis/suppress 129/.notdef 160/space/Gamma/Delta/Theta/Lambda/Xi/Pi/Sigma/Upsilon/Phi/Psi 171/.notdef 173/Omega/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/acute/caron/breve/macron/ring/cedilla/germandbls/ae/oe/oslash/AE/OE/Oslash/suppress/dieresis 197/.notdef] >> endobj 33 0 obj << /Length1 931 /Length2 2654 /Length3 532 /Length 3310 /Filter /FlateDecode >> stream xÚíRy<”mۦ(Ď„,ˇRܲŻ3±«ě[ĆŮă†Y4f1eĎľ”!kY*ˇ(Ňc§$DŮ*[–H(YRâ›ę}žŢďyţüľżŢß{_˙ÜÇq×y×yž’bÖvŠzŢD/ĐH +•ŕZ€ĄľŁ&W‚A$% H ŠŚ% QdP €kjÂ=Š  ŕjZ*jZĘ$`@  “°>ľd@Ć@ö»HĐĂ$,E,Qd_ĎĚFá;" ’éJ€Ř~żŘ‚ ‰ z+AŕpŔ‹&^ –~7dFŔőź´7%ŕĎ$2M2L“˛Ó˘7‘€ŁŢ E™µ@¦“˙SOnLÁá(ü÷ôß›ôŹ0 ŹĹŃ˙% â(dX˝AáďŇ3ŕOoúDÜ?Ş‘Q8,ZŹŕŘO hŚ ˝­±d´/€AáÁ1čĽ"BPTf:„Ă5€:ňż…öěY hfČ| ¦®¦ţESH$@ţ±áĚiţ‰1XćěA0DC^ŃÚQ~51·BŤ ź—˛Ë±ęűË÷i€b.ŘŘrYč}?:>f/í†0żkËE`2µ'˙,~í:Ep¤Żi6“Áušve3~"ŇĹpŤqĎoYmţr­”őá‘Cô"ŔBˇşŮ&L>-- ­ öÝ–ÄemśÎót×j ÝͶr3•ăó›¶Y͉^ÝĺG×¶™­J<Ť]ŕcÝ·ă#­řb.Ňőŕ^ńc´g(Lź§ç~~u˝ŕ–OĎf”^Ć;ýfŘ.<>·’żeCŕŐÄu]Hď]dxMIŠĹ)6Ăý!|ąMĹ_ĎĚ:ÄsJśőqgÇlóČ|e·S’Fâ7BC”ą~«´ëśş`Ş>_K0sĚANQ®Ś9HqqQrĺřz6¶`<ż «E_˙fÄ—Ű|“ ŻÂŢę–˛Ăŕî Öd:ÄÍfX‘aYe%-űtávÔç«+áC޶=ĹV®OÇ7ůM"-öŞô« «¦ ľ M—{­†×Vzn$h~ ®QÓpwvâ•&Ł+Ů—p©ń*ěHöŻşJ‰Ł~UźYŇgÎÍrܧ¨ĆQYAĽ‹*ĚĹOą.Č·*םLf±’ěĽŘŰď.UÔŮIëxóAnL»ąíä˝ÎAüTR°ď\š™Oó±nű”óş_şEľ|Óč˙0|¸ĽfŞyĎbă—Ž—?č·Á˝t/•vă6eĺ/ ź ÚS0~ɦ¸>cgöş™şżguH µÝš»/‰R·áë–ťďҶęQ\•Ń•Z“ľÉŰE~vń–c…—(ĄŰëĄ×čd¨š¨1ZĎYn(‡¨ÚĐ“Śß-y@ą*tF:*K‚V[íŕ{ć˙Ç´ż9Yäu)Ľ1§ľrm7ËRŔ¦©ŔXŮÝ0‡†ś;kŻ–F¬ż°#—Ż:sl"[_M+/âE Ěě Śa%·*žą”f•›ß9’´hŢAć —ę?´¤(pćˇT÷Ľ>7N@¤đ|4{JNďśč(Ë €b6T_W ÖCŻ{™jr^ÁíüEőčŃ›/’"âť Ú}‹­•źl#˘–u­űŻlç ˇg#öoÜF¨%Ăą> ßL‰ű™)|Ę'$vDâ˝ŰÜă±3‰¶(Ą;Ý.ˇ;ŤÎNěÝÄvďz´0|… Óą”Oż\ěĺSl»Ś_*׸fű8´ĽÚÇbÉóQ¨.·ë‰nŁÍ›˛qéňhţIŻUý­ĘĄ*•Čô^†Ţ«$dżOSvĄ zÍFé§+ÝlŃ =©±¬wqďeŽ;¸‘Bř-ß›G]§Úß´Wťč,čhŽÄ…‰ëoĆ ¦×EU'0ŻÚ ĐÇl?B řL˝2—sy5 šRÁ&]†•GŚe/˝*'?ţvłf¦›[>m9XK?čŇ>ŃXV$»5Ľ(št{GHäÔş}‰s˙×Űáů̶‡”‘‹ĽZţ!~Ë×V¨<…t3ňŰŁ¬yŰyď—¬’ň`bm!ß8Ů~SŞt0ĂÄŐoĚÜ\wCĆđa‚·^Ëż“Żďv ĺumŤîWdKLs§‹`Uťór–ü Újk*D_(r¤ľŐďĹË” Fäť[ž:e˝ş>ňxtŹiSęYD~ŹŁV»Č}*$SGnŁ÷ńyë­ětHÉÝŻŤ¸ßßß~w۰IxZű:R’ÝÚŽŻŁŠŰę’] <úłř×c¤µó?ß7;AD÷ççyA2tůÇ\ ‹zöĽ »ní™­¸×®+ŘDŚK̬ú:›óŔ«żuˇ]÷áGžHI[Ź/Sßę<š1Ę2Ó¨|Ó+am,˝ŕ®ŕpĺ´ąetĚʸ×;‡m<çĹG©lv2G^$>Š&\ž2Úc×/ňFéĘĂ+Şđý4üSäť©¤­d3¶łŰKŁ^í(ž.˙É6lˇF©zNAöŹ+ä{ FÎ \–m¸lĐÉţůÄî6­Î đłś!YćđŢ^q­!ŢJçSOôĐDz?5–tţM_úËďâéÁŐ-—CŢ8Ü’Ă#żŞ]Ü·ŘĐáŰ٧ŻňěépťĆĽTi®aµ˙XËK7µw»<<;tPŹŁăŇ'ĺšôH·łBMN€Ź7=bélʬpCSżÓ2ÇÎA"ňĺ33&[0÷ďʦ%ĺĂry Ą<ŘĂ­Â}5׋1ę ”ąşťĽ¨ë«č˛đ+Zě¬ă¬¸#q*]N*4e%’\xůběíŐ‡koKí%¬}ň÷,2ÔÉč=n0˙~Q$(Ź&˝ŐŮÝî5ľoď•ú¶m€t鎩'_V_ś˘IČ[Áâ@¬«A ˙"-¤kfşĘÜÜcUá› …7lřxçňţ×Çžx®6¸ë-Ą.ĺě4‡\reËľű #şYÓ¨a)|÷±Ś+űŁęGu“Ł2 b5)ɧ÷dľÖ(v=^‚4ÓÔ”|@ŹŐ»]ŰWŤź§Ż.ů6ŃS¶îŰÁpOý̶»ŚÚą˝±ĺMe»aQĽĹ6!äÄG»Ł˝VXA–ŐYâ«Ň1Ż8°°&˙őQJNVńŐbÚ‡@;ôůf_ÁľŃ:˙›„ˇňdÄHYŤIsěd¦Č"e”îÓÖĹm›ÍŐ-ŃfnŮ×ĉÝĺó4Á%'F{ä"a«y›`P%ŽŹ>gžŞ]jDÚoű?~˙&řŹH€Ć(™G‘ü!˙ I«endstream endobj 34 0 obj << /Type /Font /Subtype /Type1 /Encoding 215 0 R /FirstChar 46 /LastChar 57 /Widths 216 0 R /BaseFont /KCMDWL+CMBX9 /FontDescriptor 32 0 R >> endobj 32 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /KCMDWL+CMBX9 /ItalicAngle 0 /StemV 117 /XHeight 444 /FontBBox [-58 -250 1195 750] /Flags 4 /CharSet (/period/zero/one/two/three/four/five/six/seven/eight/nine) /FontFile 33 0 R >> endobj 216 0 obj [329 0 592 592 592 592 592 592 592 592 592 592 ] endobj 24 0 obj << /Length1 1125 /Length2 3572 /Length3 532 /Length 4306 /Filter /FlateDecode >> stream xÚí“g\Sk‡iAiJń"EŕHiIčŽtŢ%$!BSä"‘*H)J"EŠH‘& i Xh"M6ę^/{÷ăî§ýí9_Î33ďĚ˙ť™#rÖĚBJ‰sEéâ°)¨4ô elaˇ@Ą!Ś""Zxś€ĆaµáÔެ 4î€ €*^•»•a´p>d<ÚÝiť˙¤hxŁđh Ă (oJXŕh, h`0€ůŹ~€9Ę…'ˇŇŚP(€D#€+ĘŤe˙¤ŹuĂŠżĚH˘Ďß. ďGQDž(‘8,† QnŚ`ĄŠ˘äCÔż“ë1¸÷Źô?šôßÜpo4†üź8o"…ŚqHűďPÔ/mĆ($ščýoŻ>ŽA#4°îůeBűé˘PH34á¸Á1~¨źvůo”ľý”¶ÓłĐÓ3–ř5Ďź>38K°$űüÎú#ř'C˙aJwđčŔ" @)”÷ď/§ŐŇÁ"pH4–˛ň ʇ“)›A!y   ±HT€  KcqʀғŔ ‡gü1N9Yě!úý°ţ2(P ”!á˙°îçńŰ"Ż€8 eţ[(1Z˙ĹŻý›•°éoR’Ŕ–ż‰˛`ř?D‰Dü&(€‘G €QGP»AĘMÜŹ ĄŚÇ”Ŕč#Hůˇ”BŘ#H)„;‚”B>G’)™ýŽ Ą„#HąńR.č˙˙űĆhj₤ä)yĘ! 2€˘4äżZaŃľD”ľ6 @” żvAÄăQXÂĎ”˛Ťłš˛»(T Á8ń‡€ýé™ňäĆĂPťĽWĹ qjM÷ÚŰ&U-ĂMLáă ÔÂC_ńéJŰÝ’tŽ‹ E˙}^żčĆŕË}şźĂ|o§Ž~_$ą,¦ÖóÚ®§“|·ĂWN6<Ů\•§6š~ůđŽ]~Ç˝/ť+9fbÚ–KÇţ:KŐę@ŞnÍřSAŃV7cQ)*{Öś5Ő÷a”\ä”?ëťDş©đPĎČău“k¸F"űnŢńűIß7? ©;śÖżNÚIr%ÄcSdB‚ߨŮř…­ŕܜŠá'Vďsňz^ě>x­2kP¦Ü™.ŞÇ±KnsŽ(Mîâ©G}m50ŕpxt®ŕ«XţŇ€';U„­V;SH]+ńý;ň }Ţ9WŘxĺé÷rA[m€©ń»=ŃTťQ_č^¦ąC’(´?ámݵ÷ÖóZćsŹ=éŰݦ×—AĎş™&L˝Z> jËćçY :uÉ•§ĺP™­ň¤üÜmŕěî,ů-F|›%ÜPťŠMdIŘßźD|ÍÎwŻă‚dÁíâZŻÝlH4R†©­‰±ŕgďfl•©˛9)ŁvaeŻÇëĘ!%’—1(//á“4ŞĚbŹ’…¨%Sř´Ťź·5…ôźŽŐkc驹Ęn ĹrN®ą=Uď `y÷‡Ă:[űŰcr‚  3w5¶×ŮÁ^ęú,a*ĺłh÷9)S'§S[OďsřÓĺ ÝX,6QĺŮ­[‹Č^ëG¶3iÔřŤ g0ÁmĘĄżł\§ň2ÚĚ˝sđ¦¦.¸ŚIJÖ}‡#îm"¸ixěŮ|ge ś ÷$ľÚ—’KŔĎđČDv ‘lóőöáÇ‚ ˛Ĺ–ä’gŽć5łYZÁŻ5űž«5˛9őRgŻ@“·É¤ć‡®Źä‡_ë{N‹xÔ…¦&ÜëËĄu/ľ:7ýq>V »Lµ?PN¶1csܰTsÜĘ«÷yşšŔݦ;çÂŘŇ^Ö|IťÎ}­eÝč"lyóŘ€ÚńÂLĚ~ŕ«™E 1]˝°ă—™«–›çą/ »Č»l’M›ĺ´ůŰ/ ĹžšßB݇=ĄĎKź[xřlâ|Ő ¸ŔÇ„ŽĆ®K0ëŕ/qU\©¨!ľŮÂ÷*+ášAvg˛©ŮŠ?' ‡ĐIňş™|óŮJüSýX1}üXűŃż;˙¤oBq Ävn:ňĚZ଱QG·¸Łű÷–3ŤÁ{ - ď —.K-ź·«ü¸·˝­}L^Ę7:ˇÎčĎƱ…¶.ň”÷ě’{ }’6-FjřU%gÚC%wÁeî5·Ľ÷€?Ň ěWÉ5©čQŽĆ>V]°ťJòř[8•׺IĽß‰¬ĄîI+t{,AčÖĹ-’nÇrŠjW˝ żéqż!Ô“µý˘gÜSë* ¤ęÓPn»EÓűnŚŞaWĎ若ɫŚFب@ë'™° Äbâ{T'g˛\P ăqQ2aäk®K{‹$ťł‘ŠŞč¬çR´Â™9v˛"űĆ3é„L˙Ĺ[ÖT\±ţ± %T“}zŻť}ĺŤOŞËß-Ź÷zNŕqű“|öĹü>¬˝KS&Ƈ¬+µĂ(ÇTîÓDÚłuú­‡*şJ¤6•RłŻĂŢ˝ŢS…’¨ő†Š5¸]ňäĺCÖx·ČÇtąĐýä•‘Z}3Ň(fěPRálă“ńt%ôÝ;źă›´Í{ł‘ů^i6śC_ČĽFîznč҉ĽĎöŁ‹YŚJ9E Ý+’du}WĽ|‰}…Ć-“š!®t8sÖŮÜĄrŐRut¸/ţÇ5_{ÍŽkĂJzĐm«ľËžŰÁ»'é”ŢŻÍÍ ĺ9J¨L^h4řľ¶@Q©‚އf–'™”—ĚĆâm1MÓp‘Ężś´ňrä•ĹŔ”Ú­µÇç”úBŇx ä"ĐËllôpMpBŽbÇĚ3˙N˝ďą™ Ó);Ç$yíüšÂŁ?ĺÄ„“í>%Ĺ·íuµ#Y qÖÂxśnđŹ*¶1Ą­^/RťśĘâ·ĺ*/•˛~R@Đ?kĄČť§o@ä–[şs9Ěű’oźQaôŻŚ8ßDH‰;u¶WmĄI7˙}Ű-ÖŰvo Ůn¶x‚F}éT™ ęŃkľĆ)’v@!k^MŚÝ”«Đ*)…Fg—ľaVşLţyÝRMÓ›,áá®9Ź®1«Ńµ¤•ňiµ@).ú‚ŤßőóŮŠĽĺ§›çH®6QŮTÇgĹ`fŰ|˘ą`Řô|˛Běć”ÄçN}nőqdđ- ŠąĆŰ"(¬^Ę'[˝ńśAő2•şn7÷:RtMRĘĐel¶eGą‡0{±Š¦Ăő“úćw™öüŮD˛Cľ’QÔ‚(qî‰k EUŐ·ň=ëv%z‹™ëłŢää>?ˇ»•í*ťťęýxň¦śľ.É̶ěúíTMÓś7ůĘ“çE…rżśŐÄ˝6"ű˘Óča0äĘĽ?Ěح׳ӛß>ĘÝ}7umMÝł ·x÷Ż´ ř¨uŕůkę˘F6ăQĹî,D&™Q©‘ţÄü*ľ•l«Zt_í•3))ÄvŽÍ*g ź1¨đ*—¶§;ăĚüV:2P°$bă[ŇYŁ€3Ăijî ş´©c#Č–řló Îâ:&łN˘ňÓ^U~şK|ĺ;*Q/VŰĽë/oQ8ŕ@ćŰÁIź÷…2§b¨MYl=#j†ťm_,Łz¶ú–}Ľ‡š6 Ěžý@žÔhzćňÜs\Ňöň[ĺzhĄZËj©YUňs6ßŢ<ţtWŚEFPB`Q'®ĘÄ :Ńmě{ůÚ.źnž1’s–\™ŃŚ YËń=˙ żˇ^Š Ööä×YYŻ]i|t¬źÉŐĘş¶f1zµŞÎ”F¸y©Ż.ë ˙öŃ«ľăN/%ů)ĆÚ«ÓţkoAąĄ»9¨stĚűb4eÂíδfq•÷Â.ß9űčpSŤĐ»!»dÍöMXdŢ\şw˝+@ źRŚX wYńOł}˛XÖ°Ôé4űša€Ë”XŰ!^ö ˝űÚJ—źď{ÓSAŐ‹ýđ ]&ŰŹB=lnwÎyÖ„,ÝíXÖá)É{UΊ(í6»}ňŤ ɡ{Mő řꇑ“ é)ss4áŰĎ_Ş«˛źęá Qv3č?ŃÔ?!Üx0¸`ť|>ç™»~ ŰŤŐ›WdŻ**%×ÉüŇţeő€áăS,lŹ ,ńdđ «u˝uŮôrűs¶ÉŠŐŃ٨IV™—¦˝8‚^ľ0š3ڰ˘Ř4ňvfę˛p·YÍxEö8|MzGI˙3CňgÇ ‡[››l0/ΤÓ"™˛ÖŢ—nVÚ¨%ë,ń\÷i¸~"Mn9_|FKPÖEš4«ĐJšxľĐ)*L n4͉§‹ Ěgćia<„jŞ;+…|Đ»˝†iď¨4îľ+ŚńůüGbbóF<Ž«BĄčĂ1¨˙…jáŽđČŽM˝™kéH›zp¬­ţ–ř‹ćŠľśG}VÍ ’yŰĂc©WíúŞ&áÜéŇ`[‘«ůNń4Ś›–#Ř+Q©sč¶:Ěvö“;±q‘b„›i_Ş.ą¬g^b)¤>"pęó§ÝCîŃ8%p—AŻ–/"ŤĂNÜ4ŹśĚ@>ÄŞŐľS>§še¨ťŹI•\«2wV“4Ţ?|\KíßÇ0ĆĂ dyŻz†>óëF“BÉłÜO˝iĹm ŠŤ6«óĂD=vÄJ˝€Öř7÷l“w§Ssń®ÉĎăĄß2JŃâmi?{w qŤÔů|—4÷e¸Ü5/‚ëéB·bóŞsyt“úvĎýčú±ŢŞŽUĐvBqŞsuµ&őÎë0šŢ6Űpşĺç;A-ŢšJ`ë ‰^ŕŰ —Č Ř|I›Ä«‰˝äÖŤ< cŻ!WlÔŤ?ľ!Řo ŠŚ{±ő¸*đщ¦$ź~Í2č3yÁ‚¸ Ŕ˘ŠţŕÚ©¨&5§dŘî8¤?˛Ť7Ťqp±uwŘBY÷Z+ݦ¶.cč“úVžT{ü5őŇ%o·áh›Eżh'zÍIĹqâĨXÄD‰§„óĄ‰F1}‘!uÁs‘]:}ŮÝĽ$W–%PÔ VŇaeC˙-«ť-¶ž “ŇCiuŽ-žnÍ4˝űmY[o™/ÔÁO"ŚÁ]Ůť;šˇýá]  îgÇ•głŢqüů5”ĽbQeS(CË ţ¸u?^W|ł*~¸<Óh`ŃŞâĘ 5łpW 5zŔŔoűůܡ†ąh«Pűű+ra«oB_Ľ/kóő1<+Ht~}eJd:B{[}ŰrrĄÖJ·Č;~F™±9YÍčţ‚î­fö€Ż©˛ · Ăöhľ¨Ň $Î.8ˇ¤9"›4‹ů\vâ2Ň™M†×Aé×]íyfG÷O+&×*{/+­Ü^|gÜÚMĐ'*°7ű.˛ÝQřäôë,Ó©×-E0c¨SŃŞoJ ˝5O=ôBíSşµmÜ­žžOŃ´Ęl1Π© X@)™M…slň?|˙?Á˙‰ Ž'ŕĽáx/Ć˙&#¶Úendstream endobj 25 0 obj << /Type /Font /Subtype /Type1 /Encoding 215 0 R /FirstChar 43 /LastChar 119 /Widths 217 0 R /BaseFont /YHSHHM+CMSS8 /FontDescriptor 23 0 R >> endobj 23 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName /YHSHHM+CMSS8 /ItalicAngle 0 /StemV 87 /XHeight 444 /FontBBox [-65 -250 1062 761] /Flags 4 /CharSet (/plus/period/slash/colon/C/D/O/T/a/c/d/e/f/g/h/i/l/n/o/p/r/s/t/u/w) /FontFile 24 0 R >> endobj 217 0 obj [826 0 0 295 531 0 0 0 0 0 0 0 0 0 0 295 0 0 0 0 0 0 0 0 679 767 0 0 0 0 0 0 0 0 0 0 785 0 0 0 0 726 0 0 0 0 0 0 0 0 0 0 0 0 510 0 472 549 472 325 531 549 253 0 0 253 0 549 531 549 0 363 407 384 549 0 726 ] endobj 21 0 obj << /Length1 1468 /Length2 11149 /Length3 532 /Length 12021 /Filter /FlateDecode >> stream xÚí–UX\ÍÖ qî¬ŕÚ¸»»K‚CŤ»»×ŕîÜ‚»÷ŕÜÝBÎ÷Ď’9s9s5Ďt÷Ĺ~W­˝ę­Uµ÷Ó”dĘjŚ"¦vĆ I;[gF  ¦ .d™XXD))ĹAFÎ`;[q#g/ČĂĂ ż]Ľýx98yś”1;{G°ą…3€FŚö_I\#ŘÄČ `äl˛y«abd Pł3ś="ÖÖŐÝáP9]A¦L@ Ŕlâ 0™m™˙ĺ$ckfŕúݰ©‹ýą‚ťŢ¤4˙hŇŢ$Míl­=¦ 3DfE»·Ů@o.˙7´ţł¸¤‹µµ˘‘ÍżĘ˙Ó©˙mÜČlíń?3ělě]śAŽ;SŁí¦jţKNd v±ůĎQg#k°‰­ą5Ŕdgba˙Ż8ŘIě2U;›XĚŚ¬ť@˙ÄA¶¦˙iňÖż<ĹĺĤäÄč˙çÖţ3¨l¶uV÷°Xţd˙ĂŔ?üÖ$G°;ŕË[—o‰oß˙ľŇűŹÉ$lMěLÁ¶ćVN€‘ŁŁ‘âŰ!z#€¶5ą@îoĆĚL¶vÎo·Ţ:ă0łsDü׾ľm=łŮ?±˙BÖ7˙ŮŮĚ&v66F"f { íź'€ŮţmwíL˙â|ËůC\f±?ÄýÖ—?Ä`–ř7q±%˙€Yć˝M#˙‡Ţj*üˇ·šŠ警ҿ‰ű­¦ňz[ŻĘz[®ęz›Oí˝­]ý˝­Hă˝Í§ýoz;ŢĚ:Äó6fü‡Ţ\Lţ´—ĺMĆô/|łý…˙ęţ_řćcţľ Yü…oFŕżđ­=–ᛓŐ_ř&eýľYŮüÁ·łÉlűľYŮý…oVöᛕĂ_řfĺřľY9ý…oVÎᛕË_řfĺúľYąýu߬Ü˙Â7+ŹżđÍĘóüß>QQ;w/F '€‘•ĺ_ŽśNź˙5SĂěŕ’p°°°płr˙5qqtŮ:˙óŢ{{˛˙›ÍŔo/Čd‚¸Ľ`gÂl™ŇZć+Q0UKëD”Vü˝3¤!ŤŹéxťsαyRDr…‚a ®@O>•«d65ăŘ$hńňRcYÂBÁ¦ÍKW?79ÖŐ‡ÎěEłÉ ß_&ýißLţâvõ¶ZţČ•OpS¶¸đríkĺ7ľąŚ”jJ±›Ś¨—Ó&˙¤y°7öt"eW`·\4ڧ›~‹ő{™ wmĆj%Ť'2Gz>Mŕ×;Zwł­qD`†é˛v6ŹôkMĂ>Óë‚rÚ’" WI‰C:±ĺŚ%,W,Ů §|öÉćH…z“ŢhŕÔÜסć†Är‚.Y¸“­P ^gćËŘ{hčŮęqާX¤9łŇQTÓIŤzÖ§9ö@ç蹼1!á1R}sú@ÜÜĄß,Źź.pożc!ĘÁ'źÁ©enŐč<ěZ΂‘THőěźáęEx EÂ`Ňđâ ,ëeŘÁÓX®ľĚ–AŽű¦ŹwrŕWÚ‚„űaF‰«/ă1…ŃyďD*ŘŃł)S–wöyŘČńÇ­:ůݨľÂ¸ÂăŻé°"łćg3bX ”…ÁDOn—Á±‡7đ5©_O·cëú[ŇÜ!*  ‡íÇĚĺŠ%Ä~v:Ő źÚ%T Ş7ęDm¦ŞőŮó l6H 1™ÓT•AÇ€l¦!eŚ|Sn,X>˝6(ÉwŢŇdŤW#”ę‡ŘH;ź»ĆSýÓcF~ĹŁ­gŁ„JxŰ­Ń<~Dű Đ]Ô6§±Ąg ô«N*×tů ú™^ç’ ž¶3yU5Ęü&VAÂáJÜ oś_Đ'Rd¤CŢ }˘ř^§÷EWa)hoĹŠX§íĚ`Gű…UýIýGŐęś[AűLLzŁkÍB€Ă ’á"żÖ˝z;üńH— ˇ=«DV·QsÍr”(FçÄ˝ťâ/ÔŃłpGAëSµóh'6Ć ‹Ş‹ß>ĎZ<|? yŠ ű’ YËüßm}đň9ŕăűis’úŞo]üH-F—ě«4G´f¸đ 6]űIĂöš%޽ѷÄdr¤ó„,ŢqD©~®H2ľu$v¶ňEë†im’§J•ޏw ‰Ú±FŻM çcŔG«ęÓľ´ˇ/¶.Ü*cź·i9źźMŠ‚ h#1úőąu૱řjۓ޿,_+č#ů‡ťÓi(D4kŁîśjW}ăs‹Łąq¬ě€-qUąÄT˛ž‚zwŢ„LĚ:gé~0Ľú­f_40†ĎoCb! |żwz»}ÓU'ýŞ*I—cřFtĺi?ˇ±Dł¶QÜŻ_nEĹÚš±`¨C#±d˝ą«žŢá>1í°Ł1˛Ťşa+ü‘ď·AŞ”ő•ë |_÷ć}öŞŘ yţV6Ôxí˘^\'DIÇWp-g‡Új)6AgŮXۉ€‹íNŠkřqü jzv˙đć¦ă=Óh“\-JFąÉqQ¬‚¶ťÖč}8ŘAaąśćV’:.™:ămąNÉŔă{`JřäÄŽ ’‰Lžć ZE^×µ©ăjTÓWÖßýAěW V%_"pŮž»×˘ň—Ť ®CÖŞ ž0h:űbIĂ)éĺQi_D¤üfBć×5B$[üU_yPÚ?Ҭ“Ů÷ç(â+BéŹü(Ď dbŃ'OŕM3ôŇ>s2íÓrvÄćji ÷CiÎ/!KĚĎľLĽĐ;X=á,©NöS'Hy…?8ŔťÜĂżÓV ŹO"ĺ]ůŘÜöăÓřĽÓÍ$őçeŠÁĂ©RŰᇭßGŞvű eż ^˝¤óă֛޳3Źćě˛|úŔ¤Ŕńp’cÜ+pL:5ěk!°X¬üírąkż%j-×ßj{×€ą##äs%ůŰcB»`¨}»ę+h}ą\Ň㦊ŔĘ@ÓŮp5ŕăw”öa.„ý$~áyjA. p{Č—ţR1ŔЍo:$R´^ą‚óŔr·Ž˝Çë'ĚWŽĘl’şŻT›vÎ)Ą—´ś\I“ÇĎš˘ÂŔ‘CAr =Ü.äoďL%d<9Ć@ľßHA‰]§»÷ âÍÇzéyU ‡S›7V‰©]Za&íutĺŹFXcđEšw»úëňćz‡+ąŁř ÓĄ˝÷¬BçâvěNgr9M6ťŔŐäaĐ­»‘ /ęX˘B‰uŹűOzóm&™ IäÔvµWů%uőlŐ•’·ďř©Ą9pvĽ«I¤#}j; 8*—ďł ç° Đi›eÇ,{·l^Í ˛I9ˇÓ{N=´|tcßÇK9€gh 3Ś]ęľŰ şÎß+ą '=ŕy~©Qr„H6LŹŻM¤‚ő„ë Ý"Mß1\yHďÚ!·Ô1@ő™ëŰśňÖJ0ß2ń‚*@,“öÖÖ·ĚWl°ď¸ÉÁA‘ÎüC r?8¬“é§6lő­ďaŘ;Ź^7ĂâĹĐŁ—“YĽ2\6"?Źoç¸@­ü¬Ç;îšT©ZűîŐsĂ#XYçB Orž “¬đµ»+­OĂ–ëé%Ń{„+d™($ÂŮ#][HnNßkâfą+¬âíi¶Ęcě’k,ŃîŽ6òi /Ďh<é´›˘!ĚV(!·/â1@ÜŔ­uC0âj·S1eĎĐ/j5vĺŚA¨‚V4t~„¬„†Y‰ľń ÁßUHťŞnOy•ń× ¶OcŰWó…ň=Ź(~żĘ®ć§đ´îŕJMíĄFÇÚdÜ+ň“ťe•ĽĆ2ĆX°ŐuëÜv­÷|zĎ<Ž|GWY$:Ë–çĹ”i ë!ôŐ‹5:ąův € ­VpФʻ}\iI,߸צ!ĆĽ±aěşU•şWM×Ku3ÖXJx=2Ä[ü˝‚-cu3Jď őyf ŁKŐ5«7"ä+YŕNA…@ŞF—^ §«x0ÚŢć{’ănü>Gă΄<Š1?”8âçŮ’üŚhćÓARÚäGĹ ő€)4®¨QŃVc¤J._Ď2łÓÁďd\Oő„Xk>ÇęQ‚>·P¨®’쪹ž§ xh˘ĺ!ńdř˝)j~|ÜşÓ'0ľĐń…0?řu Ë‹ 7ňť¸+eş ~Łś@~Ä6ţPqN¤  VcVť €Ň=nšyťŐvNeHë·ÄÁ]BřxŚż™ŐĽöUěAEN\)x€4\•lQ˝;Ľ_ă» k3č{)f$"ľÍ•[^ĹđY%— ‹čiR8ŠţGaÎ ®&łÂB(HŐşńą3N>z FXŽ1ťýĽog\]¦ůÓţ¸8u/´÷á;¨Y Á*Őu†ÄC“+ŤRÍ%y-*ź÷°•4ćv†‚A®S5ő˝_‰Ň(öDńOŽÇÔĂBĐ×·YŤPËř1ybž§…ě¤ă¬«ĚśxĺA’ŃyĂxÖ˛§yB-¬Đż~>ĐŰ/é÷lY#—]ŞyhôÍ:¶KöŔ^|0d#Ü5Z´ćĹ&©_PWü¸IŮńoąź–ŕĄ¤%üzWhT7H3m~~ë–.ˇ•”Řđč;ĽčÝŠúAü‘™ŐŐ4ŘňŃY‡bť€žˇ/nĆW39ű1F6©YŠűęPÄQĚΤkń´X…-%dűł˘Ŕ Eą·‚W.mö»»óŔ ®őŽfuN‚ÜĚő›kwš$©,c1‹‘ÂŇšŞ&öĘŚ“ ťşČŃ„±B"ô»ŞuÝŐŢžTls馀®¸ĐV(ÉůYOçŔ6roNDzÄ+Ş‘\ŻixŠâjŢŢ2€ťÂ.K CW}A­4„WŤQ]5é*KŇr<¶vÖöľ3w¦ ‹{¦i¬Y3°•ů7icńPn@ŕ„­l,<ŰIFm˛kŽšUx©ú§,Ţui;8{v­žŕčŞt okIIŚVëËfz¸‚k8Ž.âĆ WéÚĄĹĹ» 6ććĺžABśyđ±6‰žTŃĆqoXŕ:‰ § ďcôš,*Eü”ŘOOý ĹćŹ=éá ł&bŰ!Šxb)~ÁĚHţ‡~6 „ÜG{š™Ć-®™µŤŤyŮJDÉ4ö¡QiRv"߆նîđ2ĆÇŰOÂóÔĹ~› ÍěÍ\5·PĹźyÚ©,?Ţţ°\_ g1˘ś*·şlß91ŰŇf“ě3:6hn0} úa,¶-ł„DŢMbň|¬eŘOŻ|  ©ôÖĐ%—»ţx\–㊊ąž`c@ľ_Ş|~% ™-˙~o}č×jn”3`ŢĂáŰl ĂČOťü{W˝ď6÷”žâäÓ/Ç©‰Có—ĐÜxt˘RŤ¤Şěd«FşqŘÝÄ$ČřŻft<–Gw1¬;Ľś«Böš“Ž^9KŤĺËů¬ĺë>yŰöcúÂÓ¬.řźý­S›dęgĹi$qöŁÍ‹_-|Ůö`©Ň]d|B¸ÝŮĽmUYU/Ó% ˇ ëŞÉTůjHa&ÚłI–f"U%éäČçŕąµ=Â~âbč)–ďĂuť šă~›W@ůĺ'Ď*×ć/Nž™xçť9Ţ—Ľë9_/|Ž=™ßż[ąČ/Ep_-űČŁ2Ö—[© gÍť¶„ÉI OęÚu#g€Ś€NČS­Xql‡îIQ!őň;Ř˙ľęş)Ýgó;şW#=*góé)q5PÓÂk岼ĺ­ňäŽÝ€·w€î_.vçä‰{ئ0/ěçţą÷´" %|Ľ{ÖJ_! %,JÔ§˘ť«Ě# UMŠo#Îwdp]%Y$Ś6Ó/˙8¶ ˘1ŠQ˝s\’1ŚúţÍŻw”ěIÓ‚JG{\Ö;Ďݽƥ«`Óq”Ű)ćöwNß´f 3ŽÂÚ௞ŻŐ IE/Ěćş{R<0^0nĹĹĆ»*ü‹˝* .e˛S%zř…+^7fO ;IkÜł‡uŠÎî4ÝuŹMĎĹÚă‘iM[×ŐđknTXĐçVôEq Fv­›ú˘řü]Çř˛bb~‡śáv~x$ż:‘ź:n±ŕÚ|!EµŇĂHˇ~hLjŐńc†wůţ‰2b±ÝÉ,Љ&Ľ3LD,a€49\ŠG{Ůu 2äwĽIă¤éŚJ¨ŞH– Jđ¨‘6‰ÎůµZŃÎňK/µ‹•$¬¬ů9©˘§Ż\P(NW$íS2‘ş¤B]W«ş·×‘@ž}ŇQEđ xXŮw}é4??…µČ.Č=Ö„~'p—§ +(‚yý·˛ôŮO¨•A* ĆkË\¦iË۶ôR~6G„Pť‡Dzä4ťŤD"ĂöA߉Ϸň3­¶°Q·ÓĂŚCJµ9W?ź»™MĂ)ÁByşh *ĹݦľÚoÚtú÷ZuŚçs5`©P\ß‚›VµÚ+®nń‚BS˘ß¬MzzéyčÚĘŐd°™«,%20A/‚©;…X ĐíŐ®­*fĹ{ źŻČ'ĐŐ˛^CQ\żw ܆}‰ÜĎ 6\3— K,8;Ă·–o:űhuDîꇇ´Îoď/ ©úôm„ifĺ>¦2‹”?pçŃÚWcđ+ÖÍďÄóž lń?*‡=Ů‹J%3V\m‚<ł´Ó‹˛s3ŔŞŞúy}}Ř=Ť€y°ęôaČ8TýÇQ)n3íhű˛ů˝ÔQ m y5-8łĘ3ŢÂ6µ€¸Ď6«•x˛kGzíöđ&‚ő°0˛ن•a§ą™reR‡OśdázŁí2_YwO…Y'Pa¨‘?»“¤8X]Tźc7i˘YÔaĆvᵉžo;yÓâ DA-‹˝wµ Űs"^+ëÖ“sIlĺcçMš_}Â@*"–Oý`qžwéZěŘ­+Ą°ĺj» ÁŮd’ɤÖ÷Ň©ď”JÍňą ¨A¤ćE4·†Gô™{ËŞ‡QĂ,Pä?˘ąF*Áâé}&‡ś|G˛` Ë=mŔ‘Űäń]ÜrŘs=T&ě÷Äaő-?Kg3‘&ŔUt<;× čRše÷ůgă" \˘čn‡ő"yĺ=ĄŚ:çxüV†¶=SqNŹ„ĐVć;ým­Ű<Łż˙7ÇÉŽŚ˘×^Jş•‰»‘ČL;Űň­ľé>?ŞPj–ˇ÷bS {öÔ iHš±Ë{ťl©ßxSGîIł}—ĺtÇŢk_&›ÂĺyŤ}đtęYU2Â)Š7o$J§"ô—‹ÔfĘ–¬7±/ĹŻŕ°·é3 „“/Ň’ ťšőLK¤®[%‰CĆe<ĽÂ%îôcraúĽÖ‘yÁäßYżŞ§©¸¦@|H˛k/MÔÚ¬hżpθď ®)ş€c…Ó†™íŮČ$™m'; »Ý¤ˇŐŽéĹľ±NüÂăuR4ţdQk0ÍIg_˛9ŹĹ‚«vŚĄüP]YËĽŤÁ,6ô}°qŮwłĺëť;ŮĐ ˘qě<\uzWa4˘@îĄÇoˇŘL$Qٶ ĄŠŤ€¸v›§ÝÉĽç4ńő OÄ‹x‰ÚĂ‚9!ű6ýkĺZQfłxLHÜŤV›Đ<®˝:¬7ř©ííŹpH}¶É¬* 5îŢ9~Ş;ăőDĽ¦¤żĎqŢhŃ< ™‡‡ÔôŠúé9já©jŔu…<\ÓU$&IÁů M©¦·P:;JşO-ÍníĐX e~Ń8ĎĚ_l—9ł»wqWŁAÖŘHŚ}>ÖŢBŤ[Iq^ 4îOĽ˘ř4bN¤CrÉZâOł]ÉMÚ‰ĎĂ`­K–7Ç§Ś˘”^>|Ú8€ŠżÚĹďçŻK¨g¬•ďą­¨ů„­]¶˛Ď×n\hÉŘĂďDí®Ű\·Q9.lUú”»3ąŚŻ<, 5ĺ"]ŐśG3‹O…–`]ĆŹŁí37ďĚ;˙, űe:R’wýnáČ$łßě¦B ›ĄF2ä7G‹ř“ iÁ%üŁ˘¶:N4ßDťSO±ő;–a¸‰ć˘ř_Ôđ‹1pqdt’ł/emłłëÔ˝.` ń6÷HĄ+ŹbŁŽ‡®Ú„łz‰zŤn„â"ô» [»¸÷Kąb'Đ­ ň‹V^wgép/ŇŘ=âe2xtâ$¨ňzag—J—5{UŇeEB;¨%Ř‹¨§ăĚ7ţ+Z2Fźq [z±ľ„¶°%+y‹R=)ǧž™­~y漾6CרU¬?8¤l&× ˙(˙•_’á`Ŕ´3@}Í®Ay äî3¬„´ř؉@IţcŇcË›#˝üřĺçéf]/摥ü„ťĆb?_dh6Ť¬'څȶĹ86ÉŰ Ú|“çŁůrEx0~fÜd窻‹‰dG1đĹ Ű~RB"1™ĺźúÚěöeźr>.Ä`Ř]tĘ‘‚SĘáĂáČwu¤3µ.- Ňë‡)#‡,Č ˝ö­)j#^·"_RŠţ î'IŐ) ž/ů÷ßG"#ý•\•^cnĐ ˇÄŤ‡Ć!żbľ ăźÂĐ)”ŕCřśŐ‹č˛UŠ–)ëÎotŤ/^LSľvâ¬(ő03‘™&ٶ˝®n7íÍŹ9˝xćöŁ}ßÜ×3ľüń™K‹‚×~¸ňk»ůěę]¨ßŃ6©k´l껚íAĽľě˙Ş!T¤3s,ŞĄëÁ6´EźE(«› ŹGżaâ@Z‡ˇ)…ÜdůÔääËŘł˝;č҇ě_Ů~ÚśG É_Ův21Ë}ĄfĐ­nŃî“fBĂkőřä±Lö)Ł—L~óáźYÇ ÚĆ#*.Ôb[v~‘*\é}-˛7VŢ©‰)­JŰ`sˇhňež®źW87qNAťEüÖtĄ=Ě‹gX˝í |MŢđręŹ1\¶Ęr óűř‹­nב.]NAĚ”šrŠĂ $ßkľ˛ĚQťóue»Ć@WjŔg¬y@aň-HĂ+GWŁŤß(RŹő†}ÂďěC¨ěŢiOĎď=öžčiŹđ$Udľik\‘ăţ^mĺĎşŚ´^×?d… 1/ÓÂB^D঑k¸R»Í7»D ]ŐFÚ”Á—P–y aoɸ¶c{Ěá÷mc†Ö+=4W±·óâ]˛™ýaŠ×rö­ę|Ďn˛Ad…—łâ‚<)ö%2=Cs’ąŘfµĺĂ“J*Ţ©ą©/ďµkíĆÖšÓ¤ödëŔÝ‘±ď®9Ăź•ę`U¶%ؤV+^°pc±UŞôűSšőݵşU-îV6+ł3í†d”U–`ŁľLěIíÝc˛Đű´sĆť‡V{Ź_lx—ÄÚf*á›]}/%’*e]9,QÝŇă]{«ĹaŃÄouo0ź®`’ ŐŹŚa3ľ˛˙ţ:Ă%Tłr—oá eęUXoôůçjAÎśyŃeÂŰ˝¸>(Ő5Yá\Wb„¬uąŕ]»m÷ť›±«đŚÂ–}3ĐJ1ŁTYIŘi¶ť’Ť«Ů|}§94"d•`_ÂľPţz:0$}-’’"ëč#Ź ='÷ÎĽ;ÍK5ľžĎ-KŁ|*®_İüé%=żšÖŇ˝ŁÉÂkÔV47B˝bZvYaĺ1=ę{Žz‚¤Hś!í»M߼‘•ĎR3ĆÚ˛9W(i»í~ r“»0=O8誉‡v[Áýń¸.€ÓzaŠĄôĐčKHĚ3šYß"ŠłŇϡyŐtaôřÜg>9D˛–ŃWâµ?‚Y6ZžKĐCŘqÇ%ů®3˛Gü!Í †˝Îľąćw„~C´I·c}ßóĽś˝ ¦:WG‡ ň?4ć)ÜQW¨Fĺ|Şň»O’QdúĽîٍý‚čŻ'W*  Ë=ć 8|ĹLpżuEÔnYYsµű©HÖKő‘ńp*`ĄüÁě:€KMŁ_¦ă‡â…q ˝ÚńG‚„ˇ"]ĎÚAU÷6í©`‚Ŕ†HS´ŐZľľýźš÷Łş‡FŢ0ÁÓŤˇ9×Ósö˛wÄf[‹#łR[QÜ‚d[!ˇE§‘ ŮG‘ ‹ĹÔ‚¶˘= šúgŚyŻL¦«uŠ›”Q…ńÂôűkô&ąâ}@•Ď FeŔŕŐVMCńäM-«ž‘—[›PE¨éK ˘„Ń*ęf臯qÇ kiÔżÍd{ëz~ié}Ş»Ë#·ŕÓ;é5«D7Ĺ1ď’Ą—G™?Ń[5yŤ\ AR†×|'ņgVgłŢĐ“Ęl ů1ţ®ÚýJc–ţöcú˛‘ĘŇÉý8Bsš K¶ÄlÝŁ?R'p®č˝đřˇ€x|i\˙Ălµ»·ÁsݎÓĎ—Űbűrń÷„á™ţřőŹŮ#´‰»ó|‹«áĽ÷!埤L‘ϸUúŹui>ínpŞsW™‹ÄνJë”ĹiíJ_QÔ}Ěť‘d«ŽĐ9ŰPˇ˛ \ř }ŕ‹7žďŤËuĄů…§ ¸÷V·źŇę6ú—˙ăÔ‡©xűŽ)ť“Ô+ŞH:îfáÁTÖ Ă Źý“˙2ĆѤ,ĚĐj¤±{Ç:´g`ˇĂŽOăÓN¸AÖýVf‚_Ôsw}ÇHXH_Lű¤ř\çc~.qoo™ ďË›Ţi&ÍĽÇ˝Š‚%ÉZRŃÁ35IřÎuóř#,ĺđµfŘě(Pe>XHE{ŰÍĺ—˙łmĚm.f)X'Ň;.ućŕŞ9öźŽ§ýµŘj˘bčVRĄ7ÇQžµëJýhYUlvĘ˙˘•nčë!mcżŹŮjź'–´Ş!)—ąŘ«€“˙ÜŻŁł/;ĺ$C† ⨢WĘŽ^!Ş_÷/CÔň4~2ë1ĚĐOĘ© —˛”ź!DS)¬şí󢋙h¦… TöĆŔ‚&ÍôçÂʞΥ ¶Ú…žv¨/«t`ZÚěŽŃëYp”˘#\8A™¶vm×ŔM#Î3śxŰ´â9FöMngq‚ýř_i(µeq•׹§řŢŃŽ´%éK'˘Ń$‘ß5mŹÉF܇{EßĎZ>1:¨ˇ˝¶OâHa‘§¨Ę^ŻŁ‚ďą°u?‚ÎĽq«’髞ë“Ĺ`Ôýď°ŁĄďżO†~c1/ďÓç‹5[Ž|ívĆ'cŮKus,;î ž1mPÝë9Ë#kťkŽĽŘ®`ps@Éę¸j,UŽ0ŠP´D¦ĚÝ[ńŘUN›}ŕSŃNEďőÓÉrlŹ™ď|ŽÍ?›vM$±MŁťÝš@)&Čw"k$FĽp˝|ö·'(ňÓ;ׯ;…ÉĎ6üŤµ´ş‰ü>.·˝†µľlż4Ľ"ŹçŇ.Y6%Íçz˛ WżmÖO1‘L“Üz^(%4ŢJ &R§jyG×Ě#®öEz[`‰’:řyřŮY«łýÇř¬úń¸ĽŚ[B+‹ř*”®·^gRMźŐRiiÖ+f†ŮóÜíĘ~FrZŁf!mşÄÉ@ cNv›«Ňyj$źoŰ|z![’¤~\fśÂDH¤!ĹE»r8Śš6gVè f2gßníU#ďuÄy‘N¦q!äő}=®árů~š¦O¸śÝ)śî´†ô¸ ©Ą˘ ­Ŕ„›+´Nî.3†µ#eŕ1`°á“Ům|ü6(¤!×JĎnPŃP2®hQókµŘEŻë´ËsFUyěR2±Ű 3řw•â~c„Đĺ¨Ă¶ŁĹŽ«ŘČ7:D‚ĎĚ'\? Ż×öOeęĐaőĘ»tÍlŮǰLćřHqŔ˛Ď±K¦îQQúĘ"ĐdˇŹ>ű¦É´~WcĄ Q=™SöćÔź®3´QĄp‰|p~Ű$vI ă8‘zł(;” UíKIzDĹš¦”_»|ňĄőiJ+Ăw$f'*iš‰HiBoĐŁ>ęRýšß™=Ź 8›4`nʵć«\,Ę<6oçŹyńö€M$r2pa4řf¨¤JlAů‘r~“öđů…VŘrŁě`ýöIdC ¬Źą;ă.­d®P÷ÚR­„EżŻŰ¶-)_Gäoě!†ýĘz/FP»&Ŕ•Kô¬×Bš“{ű'‚ĹÉÖČŃ\‚Ň$őőÂü&®âfOb<ýtă€4Ý“üZcSďDł—1ţ’ćŠýe ß)®J®ÖÝF„—đË>E»n{˘Ď ‘đXxŔŽWˇÄă¶'żÄ}w`‰ #ŹŽĘ}»Oú…Ž+°ťč>ľAا›çH»ó±ćzZ§‰ĎP´ Kň"o"ďŔm‚ŽÄűR­ß˝mˇ±={ëw¶°Gto$™ ó°X‰:° Ů„©±p-N_ řňűĽýÁóa&ÇÓjęš/©‡ŽvĆ7ăůmqź] %Š…ÂőkŚ­>Ľ)´ŽHl“ćZéq—ýÖm‚ę¨éqŽź×=¶w©˝1”| ŇVüG§YčWNň.K”„ŚBznJ•áM5uiĹŮCŘ×ý ÎţO8‘ranľ“óääÇj8ĽÓ¨0?cŤ…Ń3~K[GflâŇ­đP˝0®÷‡ě­ŕ« …ąaC9w~Dµĺíě%‹¤^˙T~ŰgÄ˝éĽtďi*;?öÓ /Ď4€_iČßá» •ľcÖxŚQE ÁzĆ.úł_¬ßW-`ă¦F”09™ŮH-Í’ç“đ,A±ô^!kµTĄŽ~ĎPłgzŕAÄáţľ®8Ad “çłăúš68i{eĺ6L…Ą+"=múq‡¬ŠĐqMäŘd;Âű=¸ CzŔłąEę5Pđ[4FbuŤ”Ř9sMTgĘO€ŤgV‚BćiS•‚TŔĚ€ç}zÔĐAů–×L÷ý2%qöž•’_ebĚ_'n.vŘpźKi#{'¬.úưş‰’.Úô_G¦FLŢW­¬ł.}ż$*ŢÇ ŚăźŇÇĄ.b†źńÖ…ÇżWŤ/×*\$äŇźµu*!űč¦Î®TÉmóĂÉXcÇ@ŠdÎ7ăŠzĄ†Ř” ˛ž;y1®:Ëúnî}Ţ~€Ôü 7f”GB+×k¨ąăú·dŽ€t+ĆY4Ë*‚ň¸/±”ĚkđŇ]„źÄ™ř ôíŐ2Ţ©Ł“Ňc,łˇµ*1¶0ÔuČ«!–¸bŢŽ-oŐ©ÝpQôč€xPóŁťľP¦h>V.Ś ˘…Wúx‘dW·´Z>Ő„®hc=xĐ”Ś!ŽËËyǢÚO—·¸šřŕ~WĆ>Sďç§„PvŠ:Ďňăl0ßGЬ®dłU’š(—ß«a ă›´¤"Đ´Ü…ď†gڡɦó—ňtj†Ť řZčkE•e WµSů}Ő_(‚s™8? ű›‘üł•¸.°HŤ[ă2°w˙PźČ®3ńđľ@ĎčłEŢFż˙"Šč&EŁH*lB5î¨ć&5X°˝<ÇPŞžŐZ˝§1LĂ4¸;ý˝Ľ=F6^뜢‘B&Î=y0˘•fË9qâcA–^ç2¤ńĺhÁsiđ·ŽXJ|bź1{š—ü»÷Ź´Ľ«f·śJ„%ĎÜ. Á—;słĺŠĎ¨<ş„ěšZ€;/ľ¤#úgۤÖýĺ™$%]0T”V@cĎŚŔ—& Ságüž¶@âŐN!Q"”¬$g1#ŽęJo§$Ł^úPKP<qőJ7P^•>· Ű.ޱ+,‚ŰFZ3¸ ÝŁšvL*1$?ÜJŚŤ044 ŽÁ2ĄŹ˛®’şŤT§Ö×VĘß˙,vVŹ´t2°Ô×Îaâ5ľĽZHŻŞŃŇĐŻĹýĚgfΛWj’’[y¤}­g{Q¨kn?iĄ^j­±A-ůhbS:cc·­ĚlĚťđľqU9ý”&˘áxqýxÄ6VAb¨‘'ŘI*îa™|»ń}őNaŔĂó7cacöús.Ď®Ttµa†4tR* 5G9Ůś··qŇ!«ókÚ†FZd=o1-ÇňuLKäT ĚÜ;¬—Ý«%¦Ák#óp{ă%EámHá»w¦˘‚ĄX$®ńJt|Zܱ,މ4y,¦%‰łmQ‹ď79ő H“f«yÇ„ęŮY;ď¦"L6:x\¶Y7…kE^ÖÂâ±P´†$®ÍŹŰŢđĽŃ†jž‰ˇ ůŃ@đ y›lF°ČĘL ~ö·jSÚrsjA"y}˘fÖ—űü_RuĚÝm„De}l{‰˘?•«_Ď–Ăp°†űďBĐÖ–Ď;D’Ymm¨ôM7c‰5ŞÚCá“´LEM˝ŹŹľ¦­T_čs\”DJ$63({ŇőÍ0ď1ĄÜ-ěŽuzŚMč…J4rž˘Ł(_~|ó¸|FôukíÖfĎWR'Žč÷t&Ů›Rf¬ŢĹ s^DŇŔő7ˇę™ôQ ôxÚĎ|ěqA~ôÉČ«µ€"‚„ަj$­…&Çň}]ýyü8łéŔB |‡’ěJă(#éŠÚ«IM©RÚ™’V’„/&Żx2Ä7{îtő>"Ě‹jV´áÖޢ7tŰÇ–RĽó<0>ËF˝¤­‹–'i¨1âÜl­'ÜĄ}ť\^ą„®g6pꀢ:ě_=BşÄ.đ›˝ńĆÄ7Źjbb§NŽýEµědŞŚ3ő4źöýv`Ţ+_$ޡM§Éüö áaÔBű‘ZKđ˙Úbˇ!tŔ!,3—µCŇJÁU’÷GŠE„Ęz›fă í”f˙´™µ+ťGőű$¨Ú\_n‹D&cě€ęţţjŃ"č»BLź­ýá!öË˙áń˙ř˘€‰5ČČŃŮÎĆČŃ ńÍŐĐÇendstream endobj 22 0 obj << /Type /Font /Subtype /Type1 /Encoding 209 0 R /FirstChar 11 /LastChar 122 /Widths 218 0 R /BaseFont /DKCGKC+CMTI10 /FontDescriptor 20 0 R >> endobj 20 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /DKCGKC+CMTI10 /ItalicAngle -14 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/ff/fi/comma/hyphen/period/A/C/D/E/F/I/L/M/N/O/P/Q/R/S/T/U/X/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 21 0 R >> endobj 218 0 obj [613 562 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 307 358 307 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 743 0 716 755 678 653 0 0 386 0 0 627 897 743 767 678 767 729 562 716 743 0 0 743 0 0 0 0 0 0 0 0 511 460 460 511 460 307 460 511 307 307 460 256 818 562 511 511 460 422 409 332 537 460 664 464 486 409 ] endobj 18 0 obj << /Length1 1948 /Length2 14187 /Length3 532 /Length 15270 /Filter /FlateDecode >> stream xÚíµeTśÍ¶p‹ܡ îÁÝÝ=hăîîîîîÜ-@pw înA|ýî}ÎNÎů~ŢűëŽ Ś=WŐłÖ\UődÄ Ęt‚ƶ†@1[':&z&.€°¬#€‰ž‘QžŚLŘhŕdnk#bŕä0qr2Ä€† / ?.6V.6fx2€°­ť»ą©™€RęźIAk ą‘ @ÖŔÉ h Ęad`P¶52:ąÓ­¬J˙<áP:\€ĆôđLLcs#'€!ĐÔÜžá%I[ÇżĂĆÎv˙=ätpI(˙ĄIIŰÚXąŚ&đ r¶ j@Ë˙Z˙;ął••śő?é˙Y¨˙kŘŔÚÜĘýż&ŘZŰ9;˛¶Ć@›˙=Uřo7Y ±ąłő˙•t2°27´1µ˙2w3w+;™L ¬˙ŠmŚ˙·hĺţĄŔ *#'!ˇBóď=ý×‚ąŤ“Š»Ý˛ţ3ů_Ěô‡A«ă`îĐf-/h"č÷żżéţŻZ˘6F¶Ćć6¦f6v€;<čô€ ŕÉ0·1ş€n az['Đ#ĐšxLlŕ˙ŮPĐž3ü+öodˇů…Ŕ`ďlë46´ú÷Nţgä €ÁŔÚt @í˙'Ęů_ó˙çdVFťĐĆ hňW”鿢˙k2HÁŔńźŽ–‚ #[kk?6™»ťĐćO”ôśí!VŁ•ŁŮźHÜč`ű'r¶µţ‡Ů@˛N®ĆŮ@šNfŔżfüłH¶Î,˙¬šË_3@şŽ  üd.ą‚6‹ř?úf©Ú˙-ňĺźž­l˙zóź4Öć˙3ĘJ.ř‡@‰…ţ(©đeůC l˘˙!PŰbÔ´ř5,ń‡@ÝJţ!P«RT]ćŞËţ!Puą?Ş.˙úŞ®đ‡@Ő˙¨şŇUWţC ę*´Şä˘ö‡@.ęä˘ń‡@.š˙!NPC#K Ó˙<™ ű‹áĎäĄ0üC F^#FP?Ć!¨!ŕ_řĎú AM˙BPOf!¨)óżÔ•Ĺ_r˛ü ARV!ČĘú‚î ›żdeű‚¬ěţB•ý_˛rř ˙9Ń!ČĘé/Y9˙… +—żdĺúו˛rű AVî!ČĘă_řß±BB¶nžtĚ 7ôÁřĎŞs8Ů9˝˙çLUs{g ¤čÍfdäíî?Q#gĐÍăôŻl  üżŮÄtÝn@#ř•E[#î ‹ÔćrŃÂé (jp!Ó–8ą†ďs]ËńŕV%ŁŇöÔőĎ•hHPD®/xŽť^Šb—ţöqi o.úmx7˛îűvźO‘;šçť±ËĎnŚ•'i d_ žć+PЍÂü$ëŐviěÍ bçĐ˰R ®'g!Vú”f_Ćşîú))áĂúT ŹE(l+ÍÚµm§3ęs!l^â›ÎF,ŠQ'‹Ň5şŇ!˙YYQč'äş÷Ă5™SeŔÔ*¬Ň¨d`ZHM¶®¨ŢĚÖ¤h¬Ë%m[§ń+»îFÉž ŤžY‘Ôr1ăUBˇmU4ŬÇŰ ĺ‘ł S:Ń—tËďŇ 9Ń)?ZM‡J Š±Í‚Kk #sÝ éW–*® üg;ţ¤wOg ]AďGxóÝOĎBT/>ň†Č?yŽs°rše¤(a90Ć\o ŸÓ×léh)ĚE)ˇČľĚĘŞ@xőˇ®ŁŘ~0ÚP*­Vn,đńßóOr šd3Á“ÄŕĎϧůči bĎČ{đ ş IN ÚĹĺ Ł‘:´Ş“ŻvÔÓű­Lţśsü·µŠv}çŹśŻ©Ć0•ŮIŞVóW°¤—ę™f`Í?ąj‚ř(Řc¸…śÖˇGŮkbŤÄzń„‡ĆI¸‰iĄ—ŔŁíóKe2’ÎÁ‹Őm9ŻY¤ť‚·~3CANăHŮ÷ż†F—TÜÔvţŔ\ŔřZŘä¬őĄé0•ş˛—:7ýĺ;ŰľuíW˛BűIÖu›WĎĐxŠdĚxb$.Ö§f; ÷1I‰ćZ¨:ş':Ľ´#ĺáîSż7vX}Pś0¸čÇ­NŚ‹°˝¨ ٰŰîËĺ•`ŕÚ@dekH5ňşwxó%ćˇü@k#Ćď–çÂŽvTűíŚmG¤ýĚł·ňâM✍adŐ&é3X'2Rg"=Ö`éŻĚ†l):FĆîÄ‘7ćgĂ4řQŐVnÍűµ0©Ý4CŁĚŤĘÎ÷’xÇš3÷lb|ö¦9Jľň˘¶®ŇÔŹo·ËÜ ‘éoČŽí" S%hâ„…CůnĽ|ŤDR“űçL “ťe¤‡ˇËjčťüČ5tŰŻŻz+>ÍčÉf©ĄťnriŔZ¤ŁĆĚř0}Éë_‰I'«­\˛Q,ôź‰kbmĄ$Uđ›KČ#FlíâIő ĄU…6Ĺ;=ŰM jâCwŇĆ<*‹cř›‡ŽL0{Ë‹Ę9ú€ă”e|ç±<©ÖwĹđÚöüĘĚ[SPC*Ż.ń¶g{k”0,2¬Ű;‚±ďx"TĹĆ•Áľ„$,^·TĆZ§‡Ź).ŚEH`Ź˝Ś*7Ýffô ÓŤ|<»áŢ9‡d>®Oá2óś:ÄşŹßŢ }ć˘^Ť´Ŕ&u_<á-źD¤ ‡Ůa]™gˇH‹´y˘ýҸL9|:.°¶ ĐĚžZąĆ(­ĂÝľ&ÖˇşęĘşeaáyK@lŻŕ7?c]`\—˛Da‘ěn#ş8%îĚňČÍ5]1Îřˇzć?ȸßZ(^»ÁěË eŠ…¸’祆™¨”ŐŮ“ŠEy#ž›aČłce˘8«.9rofęKş‚ň_LBLpÔŰ9âÜ% äâ’ŔňűMsX)ßżśqťć;ůy±ćc6F 4“¦Š·Iš7 Ł8OÖQ€Év«á¬˝łÜ q˝ş©ÜşQ¸g§ĺő^ţägDřb ÚˇD“ ˇŰŽen°2TˇDíÍdPˇvżŚ7̲&Ąueňóµŕ9Śôv›•ăxŢtľôwŹyYLŹĺ0ć9…ĂđçÔT°CŘzŃ^ěxvµYTýsYq÷‚óŇY)ET-ŁO,äÇĎôaŽüy¶*ˇ`F×°`E"ŤřS*¤şć1Ő¶}ŻYFU{ŘŚůKUCČ\ůĐsxÂĆKűG1T 3¤`zĂËŔčŃ(d&ţ‹nr[%%Í{< Ë7ݦŃLմĸÜě3ęÚ¤HĹD'WCD‰A‘WíI s“kcÜĎŽžűj¨Çóč86ŻĘVő§2žMSjôç·ˇ®]ă 3"ˇśí*öżÜJÍČﲊÁ:/î!§Šz ]w¦íS3ç čßšaáwăŠTÝeĽ'ý]yř}>‡RŐě6 a(Áżśí.ěžhÇ0}'UÖA{ ˝&’¤˝Ů™”xq{9n *<“=ł×5˘!†{Öe  +9ŔµŞË±*…$Š·żJQł¬{ÚřYŹ(L>{fĆŤî‚4¸»Ď…ĂřËüÍŤ·Ëp·XPǤ¸šXŁËÄÜRš ÔĂňöę9›ZýžPW’gvŔ·ű%ŕHěôÎčH/–pa‡%ł UUaͨ(Ăe˝ŘŘSo9XÜ“ód”Ö9©ţ5Ó;>Îá†ý·•@*] µÍdVH¸ú¶h–JéŮ8Ľ^ý–~!µđ2x#ßN‹˙†ŞVŕÝomîá¸hMßb÷ĐŇvyGĆ3Ü4âzu~ wL‘ÂöŢĘm w˝4Ęíz<’dř‘©î¬±Ň©¨Z2V¦źe$ë†|ŔŁy@Üô;iU¦O tńĎÓľ!–d-ˇgČD±?ř–ŚĘ„f×Ë}}®6bnACăÎŞµ3@Ąr~čŃ/łĄEÉIţ<Ž~"EĂîő ŹqĽ"wa±Ž·!ô¶v>vŐ,Č™üôq)†…{ťK×2çLf®)SŃ»aF6Y*ęŰý™Ôˇßxź×Ů-qé1YóüS7ö Ő|窍zQĂ2+,ʏu ‰®Ű‚×ęĽß—T‘ř¨)äÄu7by"6±DŠGWŢř źGMTů;ź~ęqpa¸śÔ6ş#ŤW*Ü˝ĐLC©E]’ÍcŰéŻÔňG%1ü÷č‹ yáčŕű¸Ç@¬€ .pO`äR#Ăk–vxîźţË 3kťx:9ÓŞ.é™—ç©|[Ť˛Řg˙¨ďy ,Q>K‡*nè¦óvú!&Šzţ–ýJQ©D9ŁŔŕ¸iXQ?Ę+ľ%Xwě0ydx¦DG DXávË“Bl(bŇe­{«&˙d6\P®ľjÚY „Z‘(ü4î]‹ŘüÝ=ůĂď4â[ű†RőďÜWsçđŁÝPnYĺĂćŕŕícđ/·D2´×Ôz)BKŔčËĚBeT´*™aâIŐŔ„ü:ýqřř˘NůWÔ1Ű—CŐĹÚĄO†/ňŘ•ÍÜČâúÂ`—6˝ÄVŇ1‘S‘ž“ŘiŮsĺOxó2 ÄŤ†Ś´JIpĚrc .Q¸¬SÂ{ ęíj‡ňŢBű¤¶ĆaüZuEł{)żHŕŚ'ç*b0·Ŕ_çzĄTŰÝ9ŢÜŰ)”ťđ“x Tú)~eP ˙8ňôVčęŽ&ťťűŐć˝@!˛O©@c>8usfŐ·&XnÝú˝ŤyQ,44ţ Ł˝aY†AyKlł®ć§N9×{ć¨Ćç)ňu#öA;C_€‰ŢžaČ1ŻĆňTnMYw%˙…ßkŕâä™ă­{¤hďÖö˘’}řŁ´é"Ć!?\4O-mKo?YGz y|ť˘5ô2ŢĎĆę¶ßJ-f™-«ÂĚ‹D$¸j/ĄŞIŞ(­ńŃ÷ťśÁi;R]Fň×VśĚĹ7źe˛őţe~žň ě OĽ¬<Ľe˝D7Ć''Іľ¶4˙70Ń ßró$z÷ęąź÷" ňúW]™+żŤ Čë%2LJ‡MxÁp 7ŽŽqBé‡ŕ“ü3ŤíÄrxnßźB[0„&.¸ VżŞ\30εď˙öoĎôÜč`$„űť”/Çźá)ŃďŔE­Szí>ŻnŠÁa1źÔěŕŕŚ(MÄŐďřd –´\±Ó+l f§WňŻeÚ*)Túč†p VŽŽ¤7|P`"¬§fKmżú˝»ĘHîĆ ]‡ÜńP .JÖ¨łN—ş_Ě3~1ЬéwŘ*[-cŁă\©ęßç x­Ż\ËľĂxđNt‘ăőt“ζ“r€B®źz߇§»9FăđZ˝]¶¦7|ÎF5mŻ*đ—ßR‹rŞ„š 1'•€\<˙ů#‡W˘çM˘üşĘ˙i©šż_úŘkŔpěg'ZęY“+ ,f&jĺ¸1ä÷Eśě䪰7Âű•IŮş ‹pô#SëFJ5&0–‘¬ńý€Č¤‰2+2Äj2Wń3=Úß(nSß (ČşŁÖŔ`ę&9¤vp݇Šo7=ż3h٬«NąŇ‘×řK×Vą#N9Ę›ö,<ÁKť˝E…$É7ÚîČźž3##°łj#?;z‡/j=ůľ MnstĘó˙´gÝgňł;˘ĄF˝×éppjs#–""ň™t\ŻŰŘoÍřÔş±:}«Q-ĂZî«7!°Őş|ÄŁBîŢEF§6–uŕ ~oŚ'¦Űˇ Đš(üXě®?©ŰáńńlŠÖhŁr™>ËĂůţĂťyÝń‰CĺTÎZČhí'S%˙ Nćľ(tŚ€o‹b|8Ő_íĽőOúžVÔ‰§‘÷#p6ś?g„ĂëK{ĘaË‘żÍĺ“č=oti8Ě"W]ň_鼸=úť›śŰ!ć%ŤŠ,‹*íMüTC÷Ś.…p ĺÁ#‚ť?°oąńYä+Źm[pąQ‘w[Od±Ü6ś”ŞÄ^nŽ—g„€(yá˝>A­Ů/×#|/ˇ`^ýXţ42Ąíše9ÝÚ4ęŽ(+ş_^ŃçőÂúŢJ5€2X‰ţŇW©0ËVäZÂxÍF*ëه”ÎMĽç/(PGÎşź5–ĺ*ĹÖl¬©u¸LU)šűcé*ň“č[Iýrĺ· ËXÄŞŰ®‚8 •ą«é= ă}PO®hŤ5y÷H˘5ˇű;…Ľ©źŐč$Ńúwń_b'6ŠČ\Á¨p~Ü›ż.B.±aR‰T®+`UĄĽVRaí:2Yp2řčh˘Iz3´ŞţMw/Ű{“÷Źočľ“Ť>CÖ‡Ü9qUXkÔĂĐŇxěČV°ÄlŰŕSEŮşą f PÂVŕEfĺśą†¸»VkSźË=ĎI'ÉOxců`ĄKEjŠ[E4^ k§~›Ĺ»aÁ(žUO˘â<¤aÁ*ĹÓ@©đč/@˛Fşg;ţqŔ’ć—ŔfVŃ:ě! Ő .j`1¶°´<)üAČIcY‡JŞa'´ţół{®Ź!Ô»^9]ť@3s~Ý9ô€ĺŤ¨Ćn>˝âBä6Éif1u 8٤’&ĄjwjçÓĎ“"ĽĚÁmz Ćđ™/îjc©†­!rJ´Ţ§mĎëŁ`ʎ`—˘Żýe­Ë |züKU?˘ć-Q¬‡»Ĺ%orm™*BÁźFÄöÉr­Ü7üĎ­ŮB{•^š^»Ŕ9ڏvĄÄٱ?W&ZQÍEÝsnš!ś+^&ŔOęgqSÄFýJOŁ„{Řr +Űr­vsVőBM2fĄëČČm˛Ą3đ2׼±”řfłÝ<_±KSţB4˛®‡ëőj…°U ›2y6‹¬Č6°[1˘Ëĺ3‚y< ŘŰ Ďxg– a»äťÍ ě¸s [Q@qáA·IM¬5wŇčöűő°ş>’R9ŐŔ¤§‡g‡c»^«^;ߦéU©ĽuüęGÓt°’ĂgţŮŠkš•Áö´_š[aźGŽ«ľôęç=ר“Xx”K@X̲ë)XfŽif¸ —˙Ż(f»wŮ]8±8łŃç8f{ ĂĚŠňŁ.á=u[= 땚uŞŞŤ3î™Ď„ŕďţĎľů‚R •&I}÷Iőŕ‚ú—K­äß± ]UŃQ47ôË–ąBUÜhZĐW«˝Ô˘Ć°`‰$–áđ/Ä-ÁŔ;1¨q‚|o«~`p»7§}Ë=H=W—?U"=¤ěó«żNz+°íh ­5KăK˙ŚŞđ}íÜ›jŚĆׂUˇ˛ť3~{CXáĎsP–G‘‰@4ŰΓjej4üe?‰‹0rÉoľóÝdřXOÄ yçÍ¡NđuŹz=âŇĂó Ö¬ČŃÖ’ýgŢŮ Ň ©DJŚpÇň1şM‰JňÇdó°ë¬ŻśK×JKQSĹvŹÂnkÂúwyşĺ˝užóĽÜü»kNúŮÖáčdďŤi^±Šu|4 ~6•Ż ? ”Ůđí¦jbA29đ(éZş¶ą 8–W}âÄfěłKăQŮ€łJýęŽ^Ězť*ý•¸0TřąÖŻű\óü4?6‹Ű"˘ÉfłĂ˝Â…×?š3:Ç­Ëv;wĺlă Tđ]C‹hW*%$&¸ĺ·•Ŕ¬JpmLô#A‘ŠÁ=d›AĎJ¶Ł5sŐŁ»<_'¨QâAĚCŚÇ_żGĘ„Ĺ9ę©núvâá/ęľd>V_ud†Ľa%¦öéžż—Arť—®őŠĆ Ž@ęâŮ]Ż7ŹŰTD·fĂŞ&řę^’łUŮĚkŠ3Ďęíó=,®'$pşToƶKŁV^ŞU&ąňOžőÇ[˛d¬Ý9¬şű‚_ví˛‘&śaŐ°óůt„2ţrWm·˛Ř’d§ĹßZ× Äŕ"Nď'ÍZĐ’šSĽ÷‡Ćď㹍N~GN•íТ t8‘ŻZŘZ‡Ĺű¤Xę1`Ă˙, Ć)GZřRüäŃżof”!°_ůŮÍ2ž‡ŕč«XíÄńÜۇƎ /Ţ‘ž#˙{ęeŐů!a{đţo‚(ęúŇ4űĐGůČ2ňö “=ć2JÓřöŢFŘ }}ŽUŇIĂk\ńÄ.wNYvXi.şJĚ(ÇŇ5Qă#ߊëknb/^Á$ňdľ{ňó!– ĹťžWŃLášďŻr-hą™žx1č…XN7ץşË ¸7oń(Ą¤ íâk 7"ëš›ŢçK5zL®höÓ´Úü}{®ĺü Eáô™ßpĚTĎâ`ŤÝTŻ™Źă’&.rUĆbíČñŤŘtO [ś_Zä>b/$u)L˛ďlXł/u…fÍ'j#» OVÉ™#;ű36°R˘ys¸2«v/şşwĹL]aio ˘÷° K['C\öX[ń×­Z•@ÎŽQURĄ-±7ˇ”R[t§ěF.ŐĄD“úôĎČĄ%Xŕ B%!b®µ6DĚ:ń‚ŕËiŞăě,K<h3zÍbݦ¬V¦ĽS“[©ĚµřCż6.ˇ¸äč"¤±P†7ĹóS֬ݫ;¦¬’˛ÜJ9ľ S+Ě'>0h°ÁjęZF"©§ÂÂĘ#ŢD%dŰ’ŢiQó0g9îŁrj‘ä1+9‰thKĺŃĘ"«$%gNTNLčÜ0_°~č{e—VĽŘ˘ë&bŕmu8ďň>ĎR4ŁK„‰oŇwę—wş®ykÁ?5Z‚ GŽ(ň±Zˇˇ=Č“Ź`«ďŻf…ŢŞÖ#€ť„#,¦lŽî'1ě›őžÉ’­đw=iÂüt®ŇeżĆĂD҉EÉůAýE{éžAÄZă<ÂŇt-ľ‰r@˙&’aCĘ&ň§‹môHXyď@ Ń™7QAđ‘ôĽ´Ś®+Í©‰Íq:ßŇY^pł?$fĐ+W̶‰t+ö©âö%D NVM0č™ß~_łtW+‘őĘÉ:nń9Uëöz?:3ź#ŽŔeÝr áÂ0ž ڞ ˝ çŠEřM>M1RB`óÖܵT^Üň•®Ůal žqÚżD걎lź»6ĺ«çŞěňQ~)…m˝,Š ¶žßľĄf:QµäÖ°9cĚi<ŕöŔ=?ÇŚOĆ뀹D·áă§­¸zs~µSB ŁE(źväP!äü®đ'W^ł ·Ćrł.¨}Ő‚ÁRZÜtübŞh‹á/IXÎĺD:ż–dŇwN˙ľŹĄúA˘ňóy[@IT릓÷,By‹ú#ŻmC ÝL/pFŐ“¸lY›Ďˇndú}A"ĄĆ?¬$UŐx R÷ÁşąlĄnÓd•VN!b¬ŚAu)ĽüC%M RŁ<…g{ÚŤf}5Ć.>6L¤;uś¬‘`Úw3 Ô9f÷řh€CÍ^ĄÖgW€ăĺA¸ŘjŔĺ“—’ß8úpßŔ¨:qi{ « cę™HáńO8ŕŢËI×7ŕAěF•y7JN&”ƧčŹÝr9DvŐ-_7©öˇ» ^ćőľpa1¬čł‹P'˙$ú°öfrnxiĄb‘/Ą-˝©?QüM}ě{¬DX…ĘŐŮńůÁMűsz3^­LX°Ú ĆrI4ŔvŠŽk›Ŕ«ÍE ’Ĺ!Jfď›zžG†ş5›‘2w%S­ ßs+ÚňČßÖöwJjaTޱ•î#}ҶŚ1çO·6jÚjďµöí—]ýIÚÉtˇĚPRÝ• ÷”śď~üsŹ‚RĐő~hśÜEt¤§ÁőK¬_2f4..9 ±ˇ+®›Ŕm·lN) ĺçŞaĺvJG—9ŠŠ±\ş2ťt?hž‡^¶`“[RRĄiB3ó]‰b'ňňIÍóÍNB¬ 'OŇLČ5Ü#žk!s*|~„)SßČý}Fęµ oźŽo®jż¶[łĚ–Ó\*I{ŃPqYnzîĚą÷śŞÁ¨ %Q}AX|žëô_Ü· âQIĽ¬şĚW@Ó&âŇëF»±j^Ňk±(ú¦ö#ö”“±ů˘B+wâôŕ¸ţY‚KČ$UŮwěíŰŽđ¬×Lxą'kŤµÄ–\ ö§…UU«r]bV-ÚX!źE5źÎ)w±XM÷Ü㽜XYbčb+m0¶ÓĽţK›™-Eşě`%őo]®ěµŽź·©$µ€lČ'ŮrÁcvn*Ăľä7íč™Ó}V˝Rž±{ Š{CVćňhĺ|řofř*rř É(™Č¨BË9Mvď* #·VÖ†uŘŠşřźß‘ČaĄśgÎ&)ç´mCfęFy—ćpG·rňňŘ`bYáaö;W?*ąĐ`ÍS’î$LÜUÍd»{ĺ?D?'›Řy5ßŰ3‘Ąâ|Üë"ö|CeW1]0ĺ‰ĆF•ÎxĹÎ7řčuO‹*Ěš‰ą0HăČď%gŐÔ4ó™§sV¨®nTO–ńˇM>şdn…@ZŁŕ–˛}|—¶Ţ{Z¤GŰůđ†Îżň]g×Ü-“’ř9*ŁMɀÖS]ŃÖí°ŰQ%Î"*w!&ň¸ÚŁ/šOsyÝÝë‡DwTdŚBkB_HČ“µ&u­Đ‡ÎöÂqSşH˛Jh‡ y)MK“”Ő„§˛u§n9‹‚GS_X΋űůüĚŞĐëđ8 ô—­PZżë•«Đ>d>} 66-ńÓp8¶_CďĂë Ňš‘ţ Ů\ď=5śŇC@É„ě$đ›wö˛CĄ}ŤFł”A±x Ąb0"%WKv.+—că f]®‡!AxO1 Ł\řňŁýÁ2"x;MPĆěľÎ4'"ôxcŠÜĹFŠ ‚{]•ťŐŢ`fEĘßšZ%ŕ Ń>X\ľmŠ5'¤GŇë).eµ¶»Ö„—ÉňĽ Ľç™(ëDŢéüüö~•_šşä$ýŇĄq§Ć>óT‰5P\+@Ô2®höůţî×ńŹŰVHňsäRů<¸IŁ|řŔPNÓ1Š &qY[ŻtĆve>SĽEäkGĎý»l6cäćó N•ťéţ7ĺAš•!"K\¤á~,ćIB{Ő„Q`«&ü‘ß ÇĹ)éYŕýT UşL0ŤwÉ/če6ëw^ úů– Ä:9÷R~¦‘Wö…Ńp6"Uqďl‡\é‡P*ś¸¶Ť—lÄĘ'˘(&Ł{ěĂl;ş*{[Ţâ_IZ…L;p‘Ěŕ4ŕ*Z”-"Z††RĂ]‰ă ŁŚ2Osş!?| ěä1ÂmmčÚđ®–kŇUn&¬j /Ë2…>+Ęsˇźw:Bń_4múJG„çD[>ń‰ú*EŁËE4`är—ú-ö®‚ŰK:ž9ą@S>jŚĹ"}ýx×îĆĂLÄęĄ4qĽYěs–­ą”pĚł«­’7ĆžT¬ď‹VŠř,L×)PGúŔÁ§ŰźĄůéJýB˙´*ýń·źűÇÉéTN9r+mví(R$ľKymAeFaćĺńlAbČrśsa¦Ě›üđń‹ŻpÇ_¸­÷t=»č*ŇŰ_‡UxóL®np Ëä¨řę˛ÎkíĆ“ă,T *ńČDă͡EË*%Ęâť-™JűmIşQé5Ą˘"PË™";a§¶!ŕ…Ë#[ȧQg;°–ůĆcnEŻšŢźä|ň톌´đZ\uľ,­q•ę=»““ŇČßĚá¦s%Lď†ĺó:z9}†éřéOwH]ž¨©éCVŐAŔć¤Vµ SO+ŰkďĹc—u˛?Y{ýiŻ„"´Âč문žY®Ş>Šiö"ý XţťPćžNűGV36ť˛Ž”Ő›ZxÝld6$9“¸< s5_đ|.O d»QaůO—ä>xW;6ęµ×Ú>ęţ{Ăt‚Lˇ§?ý)ŘĚ„bľ«Ĺűú’%Ă#á]ĐrAŹuz6?¶Ä:|9ľ€ÂŮ®í<*Ć,|ibٙȭ€bşĄrjŕ]ËgîŕÖĆ#0µÎů2¬¶ŽM>Ŕq*ÇB{ájůy•ŃLZŰ2Ťč“#j·b}C5\eě¶ž7o«=DÔ3żh?Ż®bűZťăc6XC•źXőT€ďJHJé äĎ•< ~ôX ă6ŞŤ¸‘w«Čh~|Ś#‘EY¬f„HYÉQ7),ű!y­ęŤńÇp$± Â~¤†€A(˙ČĺMy"fď*ţ/ÜË ¬5sFöőéćŘ;ZQ%üC‡@RX4°Ĺ”"›¶‘µ›ˇ»Cţ[y¤„P¶°ÄZB |•Ǩá wô_¶Śź&Ţýš~Ňśp‚1ů=ĐäZ¨ĎÇęlŕő9ç4¦śTfAßő“Š}PÖŁÓ¨XÎ徼8ŞAE)VXč©Ő&|«\šŕ3ŚŹÎĂe˘=5Aă[˘1ÁŮř0śWt÷~‚ϧ÷PŁö^[ÇŮý‡š°C§íŐŁKÍz®ëJYQ±‚ů9ZŻÁ❢­ŮŹťí?ŰTľÓM¬č7•ăgŢI´˝¦!¶ˇ:6ŔeŔż6ś m?ř¦#¨ä"8FHxýźÄ˘¶Ł–/ Ůé˘(XdĹę_<ô%–Ŕ kľďgŃXŽŮ»h(Ř5-Ôz^žČęó72^·ó7rş ČűŕsŃäý€w)‡ÍÚ3;@’BĂO.ĆŽéJŞřîrÄśLÚ·^ű”<ά5_Ĺ5˙ĺę÷Ň Î•GL“$E6>ż˛nhËű8C”ü/V p^>^˝Ťš»çQÚC©­»8_KüÝUÖX'¦ŞDsŞÓáŃ}bš1ć›ŕ6h‡Rwş!MK °âłzĘfvµ‡s­vĽj•'%§đ…óZqđţ-ł84fĂQĆíŘ6¤VíëÔ·2hFĂôÔ¨GJŁ{0¦ŘT·˛LÂ'ěR™[T@±°š»l;3î!ŮZ·ŢSLD“ř­XîláöĘy8‰_ČhťĽ }J…Ą),NŽĺ¨§2™=óĚŞ/-Ť‰šÚyGRoWj„Ť2%MÄŽPfĎ ÂßS{rłzCBhFż#}@{뀷Î?‡hqÁâŠBË÷(†¨ďĄMÂýDô¬kŹľÖťĐü¬“lćçÄÔÍĘ-3'ơxł,MX®ú„GúJÚ~hÝT˛F9­'‰[(Lo·ČÚž¤â:ř= vgŤu[c­QĚŮ“ŮĂě5ZžµŻ~sH•ťřę·¦§› µTb.{źJŽď°s»ń“ÁĹŢłÇÝ>˛-[°p•[QJŹ?­O7/2†oęjBŹavoë5lçމÂô-c¤5µ'DÍŠ:JÁÉłHTE»SíÍűxŻ •Đéđă…ě‹©Čh ôŽ\%rNCŚK_öo=ߦ8é÷)¨#űŘ7ż\ÚqC’z]p\4Lm:UĂO'ĎS>ă±ß3˝Nbl•Ąđ±D;+óD~LĘq68ŕĽg˘Dť1¶ÂŘvϢռăÚ¨wđ¨-ë÷^cđ)粩'TĚ9Čş} şía˛śŃk…˛=Řq8¶CŃ#•!í@^IÜCĄş-Ät%ÇęNŰ9Ő,Ł€cCÔ=9Ť΂}6‹rďóĎŸé ň•<Ńű2®MňqŢűÎűÝňÁssă«Ů¨´»”0ĆíW}†ÝU˛•őř§îO%Ýë¦Ę3wtŤu[ËÎ9őaN‡ŢĺE–^h±š9Öáf'ͬŇř{Źbůx窛K°KkČI±°ö©źâńä(X÷mŮ?tÄ.\„±,ă$ÝVŐ¨\SÝ:ŐyŘ $›ń2)‡a—gŇ:hęĄÚżCëJ/Öş[9ĐÉ‚Ye«\ť{ę‘fŹüŇ0îf©ľ·$,v‚ZÁ€š—JŢQ‡h]/|˝‚_.Óz#ʤNXŚ`Ţú¸üT(Ö<…áă,ś+ź6JrЧĘ7ŚNÇ,«OŁž®™ ë´ë¨a]Â_ĹşČ÷¤€ÎÜz=łbç@ŚžZ€[a´Ję;ŘE ¤KóŞ żI:ăOťřÖřl.«>'Řxđ˘wÝ8ÇKâs8C˛>ƤؔŹ,:…‰·ëe}€óŘaÁ"ZĄô,şós_í¤ő•LeŞoęŐˇšs¶…Iś]ľÜŇ9î'zCfWßëŃßŢůľ8ô±X4jMUë{=@Ś1NăĚđ3 á šĄřýX$‹ëŢlC-ßÝÁ|˘›ŰÍ‹ď˛jMTXĎáß\( ~/lŚŞG Ť Ŕ܉ñŞŇo"L(w«g 3ßś@Ŕ´ŰŠ—¤v_ůŤZ︕©8ß1gĚŃXIp:l˝šnź9Č[Ţߥ@ŘÍäUŤÔço{˘éÔŢŠyýB*Ţ0VJ¦VCvú^ČO)ôŐnđůqaĺ·ń—ĂBqQ÷4•ă 2¤CáÖŞ5ů_AĎČüµT±đĐ^Ź;/·ëłO&lĐAÜqęÇź34Sî©4¨“˝óÓ߉úŔŞlŠ3'dü¬ORrď\‘ŠűśV»j:IłYhdżĹŰ/îR„„¤ÇEĄţG0?Q‹µTcĽh‰—ÇńhŢ6fýd} ĚŽ:ĺ S­}ZyÓîŽÄęö¬'‡8pq9.˙ŚĘyÄäŢ ?Óů˘7óĂCáĺőZSB!Ş÷qVĘť5;ŁCÖŮÎBÓ°wśĘ!w¸ÎohĚĂ÷- \ÖŞç4Däű@ ­^M©˝ăđ=RĄ(đ«cÍŘňV‚€ö–´ë´Ź,ĆćÝ—'rM䯏UéĄäÇţF/Ć–†Ľ›ěW_ŤŢF§ś”›ËÚ4ßâŞç¦+f’"ëÓLµ*ĹěúÜY§ÂŢżŹĄ"W˘śIuŇ©uâtEL÷·eż|{ϱWłWŻ$Ń!ÝY>Ę{HIĹĄßÜěú­,7˛l˙ý : )Î1^BµÝ@«4¬c-i)¬Ě<Ö[Ďđs‹k»c÷éj§zô’€“äĄ^R§ť5~M±qÁeî–\š.¬sŽuúpŽŰX“Üë7pöń e)wGŠ.qBŇÍée5JľçHźřr¦58ŞqUoľ:$”Ńż¸ĚąOĚ÷IÔüŞp,/¤Îą§ůn„˝¨,§IW4H?Ż °ęťK)×>|ĂĄC2a.±ZŃŻHÍěP迆CF3í~s¬Ö«®a—Ž#pŞ–ůä¦ř1ąS*·sűŁŁţě5ß;a`c˛aĚT÷ Ú¤ÁCn=Śi2ÝeŁCoNźÍ{3ťpÄ+B5§Ť•děA^sţ”°oÜ‚–!×—l0” ›^âŹHŕď¬Qv¨]Ěܤ˘)ҲÁ߬WÎ0‰ü±lDe®:`¬Ż~ěÝ|ƶ¬hŚçt„ Q†1‡eXnLéę‘~/Íé5°*¤őBXŐ—«;M”ăşL-”łŮ ÖŽęÖÜçž5U’²ż5±Č´ă˝[ZÂř!)ŘO9&çˇŕNŤóý Đ5fĚ á˛˛¦—ČäůĂ-~íĆ š0Âҧ°Ë=Đ‹šlqZŽ]Ý~ëęL%žy28ńßľó®*,Ç ×2°ZWKß!ĺďÄUŐăž„ĘÁ=śĘó´ }ŹĎ"iż°´ÝÉT7k˙Ý„­đ 1ř“K· Q_ş95R$cČ:D”ĺí'fI%ô%CÍ6pVńÁfˇěťč˛ďddi‚hd¦šňUr{ˇďą&‰ő‚ú÷š-—ćź"2-ąôFŻ©e \Ůĺđß><˛ćÁ¶Î“kę%}) ,ô+omŃš•ìŰČu‚xľťąÔˇ[y,wŇkhî;%˛ix r=•0ž#×KއôűÄşŤ©f'–<&gzŚMĐ3Š«@:źá›Ä[O^« ‹¶«Š;íŹÓFAÄęó"ÂĺUµst¸™nă®q…J!Ž“EP_đ˝řM »nü«ŹP”Ž}˛./nÍçőőĎQĺäYZNË*&Fíe…săŰëÍÝ•(ąI€Y2ÔúÂ"ďÁůĆ~Oćľ—/v±§ęąÎmŠŘ>¨h"8ŞŻ`É1 ř@0Úú›m˛{đgŐ¬ZŚE- ż(¬nucúŞűémVÍVľńč`˛š4¨řď4řĂ/nµLSß#ľ}őÖ‚nßôfŽlĚęI ?·¬o ł,ŘĆWÔ-9âů>{}Y€{Ë»Ű3^k7ٵhďł‹Ž+¸ťŽOĚÇi– ýqMß2G8/ŞxýŁ.·đÇŽŔSaů ă˙Ăř˙?Á˙'Y śl­ ,á˙:-óendstream endobj 19 0 obj << /Type /Font /Subtype /Type1 /Encoding 215 0 R /FirstChar 11 /LastChar 122 /Widths 219 0 R /BaseFont /ELNHHT+CMR10 /FontDescriptor 17 0 R >> endobj 17 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ELNHHT+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/quotedblright/ampersand/quoteright/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 18 0 R >> endobj 219 0 obj [583 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 778 278 389 389 500 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 0 0 0 0 750 708 722 764 681 653 785 750 361 514 0 625 917 750 778 681 778 736 556 722 750 750 1028 750 750 0 0 0 278 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] endobj 15 0 obj << /Length1 1549 /Length2 10383 /Length3 532 /Length 11285 /Filter /FlateDecode >> stream xÚí¶UXśÍ·ö‰»CpiÜÝ‚ww Ţ@cŤC'@p—ŕîîA‚[î ¸K€`ÁLżďţö?™˝gŽćšî>x~«VŐ}×*yšžZC›]Ňl ”;{°ssp ¤UĄ ¸ąÜ\\RhôôŇn@ ŘYĆÂ( ŕâČ-ˇĐź0?ź0—=@ěqŮÚy¤™˙IH:Ý@VÎU ; t + G€6Ř ô€p$Z˙ôphÝn^@k4nn€5ČĘ` ´9ŁqţăIŃŮ üݰµ§Ë7yÝܡ¦L˙Úd@MZť!k  §Ş„zůĂÖ˙\ÎÓŃQÍÂéźá˙­Ô˙j·p9BţOŘÉĹÓčP[Ýś˙gŞ>đżĚI˙—Ś˘‡…#ČJŇŮÖŕúŻČ]ä´ÖyXŮl,Ý˙ĆÎÖ˙Ó´p˙ŕÔP“S7’cý?kúoنČŮCâňźa˙Éţ—ą˙0´:n €1´ĽÜĐDč÷żźŢţ1Yg+°5ČŮŔĂ/°psł€ Aw”řďą gk čuĚÉá ö€v@Kâ°»ˇýł Đ5ç´ů7ö_ČEĐŠîĐ ‚Üţůśv; óź€Óš¶ţp‚ť˙a~.§‡7řC…=ěÜ€eüŁ ötűŕýÇŚ×_ŻśV`Gđa¨É?µ!ő‡śŇÚWćAÝÉţ‡ˇŢäţÔ™ü‚šPüCP•?UPýCPµ?UP˙˝†*hü!čLµţTAűń8uţt~şŞ®÷‡ z˙!čáâ´řCĐ6Ë?őbőgŤą f¬˙Bč|á?ËđBÝŮţ…P{v!Ôč/„Ę:ţ…P]§?=śÎ!TüBu]ţB¨®ë_Őuű ˇşî!´0!´ž!Ô•×_uĺý׎‡şňů ˇ® ˙â˙>ÔRR`ź÷ěĽĐ‚±ó@÷3T– Ä'ŕ÷ĎÔuąze [ž‹Kşďţ‰Zyşąť=ţ˝Hˇ7Ćł zż>@+´ď `+‘ű´ć° ٢éJDX)Ű–ŹjŤ˝s]čÁK °ŽĄŁĘ®,ë U™řXűűTŢżÉÜŁ:}5'äÎ]?¦{Ţ÷2ßĎ|×Ffp™© Ůsˇą >Ćîhž˙u«>»>V‘lXx\ Á$Łs€ĽJ óĹŘ«éKV€ \¦Łnxh/µNşkE_řš7Nr"ÂÚT°ż}8J+ëʸÓďˇ%?éŮ ćŢ ):Úť4bŃsů”L"ČŻmŁI]ż/l'÷ :Żąâó¤*g-YďžŃ&ëo9iď¶Úťö&ʇ™µ‘*2ѱ^‹ ŹKbCz÷ßşźÇŮ?íd¤]ZĎŁt!%XţÉ#ñ!™ GÄ©"Âꉄ-Ą7Ëzxͬöéř¦ ÝŮĐ͡Ŕ0›!!ŇÖŢÄşDŃč¬Ű ŻcŹt3x·ŐÖŻîgAb„T,ňsý/˛J»w5N+»<®jěĹĄ‚¦+Žh&DşÎÉ‹}µÉ7Úýyh' LĎVFŽĽ” §ĆiŢřĐ\8ިȏ€TjŻ)›Rá3§„áđőO˘űăęÍšŘXa3¨ÔŢbvŢ0ˇ  ˘ŢwĄ6$]ŘXWb…ÜŃahŤjLí‡ě+äŇ{ᑍDoÔx©ŢŰ.řÁďč–9GŢ\tĆqq‘đm4éČŮşEţj†µ,ąÍ|y…˝Yő׿¤ĹŐΆL%ŇąŽQLýÁÝ 6ŐFB1ě—LH,SyŁzzBhŻ‚}•2Nß,ąOťqĐEËŚâË%•ŞNXU{¨ű'NJű±džşopp‰;µőŤ/ąn]!|5®F_EŢ @ZBFŢČíO˘-aÍÜč1Ô«ńN-;7˝í—y°Dµ0î t!Fěú=ŞŚ{Ťé0ü&t8Mg,'Ěż`c.˙ÉŚăé•úő‚[f釞b }ŤE…â×2ڪϡI—hüţŘů5ˇš“»T‰Ş_íĺ”p ęUxÂ8¸Éô€NČßEb0 ťqr·ë+› ·EZš&»Rşn†oŚ=×§›¶†qdŃ>ÄńĹťŹčš väOÝI`Ô´&Áí˛p‹«B[!ž>އ˘· ,ëx8´üßVÝ•vŞMÚ,&[âSR<K^‹ż|¤ţ>ßźpépx­bAhRăs2ůYç˛Ó€a=ßר„˘¬ďŇŢPáq~Ăúüń‚§Čź}T]zK¬^4yŁüd»EP±–0ŚďćCd`MľÜäśLô/íßß‹/’¬ăózÓř:@cîŇŮźÖŕ(dĘľ]¦ńŞ>›żŐóŹrťlËßú·ŤľVŕ Ç`XÖťŹ=ÔŰżiČÉ?Ydâ»DY‰5@ŕöÝ3>T  L ĐŢ…üh6zn—°(łjÂňĐ6Ţs̉EZ»—!’4ÉÉIđ°H#zh:wfăÉÜl—¤’Ó­_§ŕ!x+D'†ř±›\­Ż˙őS˘P6ÝϨaSŐjBüIŐe>umňĐ»C/ô©·šZó¦  EŤĎY-°6®|ß ĺ›}”ZE”°>EáŃźvLK–çUě#Í’Ż€şÎcđő&˝Ň„ôřćžę ’yp~7ÜđH.Tů€ qÜK‡F]^7ÔŔ‰ŹĹGŰ„ťŕşö4úKrĄŃ8źŠ‚‡‹rt¶®/ĽëŠ5ájż±tĽŃJFŁí[b¸©™µ­k§·Ë %°hzŽyÇ5XŠÇT —"VmX/ĹĐ}XMŔćsT›ó”°Ź\ÂJµM®é¦Ł×6z©V)f–«.!~5—|b}ń…™ ݧÉQę…O еţ^»97#€î˘'ÍÉ}*głgD »…Pâ<Ég’,˙pzŤďá_Çď-ź®ŤĆź$ÎXłíex3p?˙>® fwp9()ŠË$Ś5Áújö5âŘ˝$^đé<×~~Yútű°ůÓ˘]ŐççŕůR$•ĽĹ§eäoÇ5[¦Ľ8±}ŞhJf~ţäűňkqőęu3¶ 9Რp0źe"ĘíZč8Íő5ő(ú›¦}ĺĹ|YîeąF 7úLăŢt­»ý‹âŢ’îł«oÓÂCOĺV9185ÝzÇló‰Ů<Ó‹t®†Űj¬ĹžăĽLľ+eĂĘĆ~íW;U˙xŹy6UT$$Ŕ†§€ö4Pýűśë[«nÉyN“o*ß·0m^e,.‰Ô‹˛ekśń·!'&yzZń‹öR¨D¨ç—Ď‚Jf;­ç[HtývÓëňďqÓčuĽ˘¦^Q®ëŕ‹¸) UůŠO0˘ˇéśY[«­ŽÖ,!­s.îiË€~Ó";± ¤ť9TŔZş5˘­HŚ‹MjĆÎâ¬Pµ6ęÍĽKájńę¶úVSŇo­ŚáśŠ– '6‘Aâf€’tŽ©ŕr*ÓO§—)gů.^†Ź$0°ó]Řó˛ő±­NáO]ĎŚ1Źž@Ů uĽźŽnüÔńjr–Äő™ąF2Ďo¶ŻŰ#02ę}?’ŔTú4P“ŰŞˇĹR§Ű´h ÖnA äÜŢ? ¬ď"ď"ŹÔu$CŢî 4*Č6˛đ Ń>ýŘFϢŘĂ ˘śWP¦WX*. =›µ kĽrS->ß‘3©|j"U2LϲµwYÚ»ľÍř˘[OÇp1§4[ťČý PtwéěŔř`@sáÍ–}ŮĆ0ÄŐß்%b 'N­¬CăzĹjüµ°F)Gčf\f*7NĹk'ľ Ąm7…_‘™:«…ŽdÖĄňŽ–„OĂĂ›í™Lh@ähő®PűXŔϹ/łIôěýD|çŇYĺ]‡çŚ/ř ÔG\Ń®Ű&etĆ-»_a´dšśŢlŁ˛ÇŞn”jwR•ć*)Á‚?ż­÷¤Ľ•ľJyż‘‡™źpurřşÉŠ)Ő`/fBqśźB4e1žĺŁÓ}d“Ô˛áVźĎüş5—ćE“ďśŮ×őŐ‡ţÖŻX‚'ĺxYńĂżÚ‚ůvT†Ô¤«ďě=Đ~űßÎáé4>ˇ µDí† [—±qVžéď }áőrżł7›˘+މĐ<´w+M7̆žçz!ý×_…ĚÝŤžpDżŕvôŃ<+§ó¦žkräˇy=}Ş0÷hŁî˙˝úFÝÇ+ÓlIé3D2+m+üyn~´]BPZ'”@»ű6ČÁvę}+Zş”&ďć„×:?v…«żŽĽ»d÷üľÚôÓşÍΙ{»‡-Ď‹“6Łz…ÁŹYµÖóŞńyoĹöĺ'M×§30ú`X¸Ż;,7Űç¶±¶7–Qé+{©ě8éÇ·p¤čÚľĺX­Ç.źÎď V•¸üX–«¬ˇŤôÇ˙J{nişkDŰ ÂTsîŔPÝ_^7Ňî¶R Ęăçi‹Ć]|cÜ!·âĺJő~Aí@6*¶r®Đ WZеR¶Šę]ˇ )i/Őb‡˘îA‚‡k›Ô#«ëŽľeTAÄ+q;%‡-MţŐ ŘpăE®2˛kó·&áksÚ4~î5ĐJá„dŢ‹W’Č·ÚPżx,˝yđT¡ )›KÚ[XΤJáŁ}íEZŹcÂ`ýmóÁµ“d„±×Ţrů1ĎÉ”,‘ŤFBÍQJ)ąŢ+ő@¶.V˘z‡ÜŽźm=á×űk§?ŕ¶e–˝7ąß­®ß=ČÁšžBŔÎ)$!ďě`Ś öۦŢŘ„1/jgUł„,1LOĚů¶¦ăbÍďąź0%÷!0"©}×TŤ|˛"4N–ÄZAHĄ7$Ç6BßĘt G^^ްÉyí?¨QcaŤk>• }ß/Ĺ$„ĹV §„ţµěäC$s)ă°DöűQ§~{—kµ'žÂČÝ—+28Xtz·xz˙ý^=ţL‹Xާ„úśÂé|–QřaiĺoŔôâŞS«Qdłd±Ĺ×ţ'ŐYx‹‰ŰMŃ$ ¦ýۡ$O‡Ď@›3h4֤ʴôk&°µBGßő^ů]Łi3ö%?5ćęÇĆ&ú—€ŕÚhô‚öáłY¨€šßďË¨Ď üí–hŻ>{¨©×çÔg˛ŠGćdúŰ_ŃŃű,Vźçkď°w›Jďf0FîŞr—ş‘ m8fÝV˘¤Ż,bđ…B;u6ŻjWOÖ¬µ‹•akň FµĽ/”µ:1q)mi±_ËÍüv8¦ŃüѲsŰĺ9ősż}MÄíHź¨ÇŚĄc>Ń çhw~‰˛źD4FÁË…âä;}ĽcckĆ,úyŃ瞡¶Âç VťŮ… ¸…Ňú4©Ëöv¦ńŻÂ“*ęâ'3ž•w>]z§K&^Aél«Wô˛ Z:·łŻ1ąŔ;$©»9ĺČíßD”é>\ť=ůňśż Żé&n08D¤’eěuRÖŽ7S;ÚgPBŢ (+=ź ĎMF$‡ÔÝl– Ń~îjť±ĄN×z\[Âdőě“ȡ~śżFi§ zG1u´5čţ á„$ţî¶[ľŐŕ•Ř꣜:l~^­ŠpNŁ ŢŻ—ń"ĐVMć ĄIEGZ’t¬É:—»:­Ä”źä˘esŞ[¨B¬{v·đ„¶źrâ_ňžĄ22I–˙sŤčSĆkěC­€ĚJ­'Ňö÷Nrľę}¦­«'ő~3pÁ„|zŘńp"I–ˇE;čžË¦Ł9;ČüVţMżY†ęő9}H®W޽ߍCŮç–č–żUZu@ÓXA—O3¬nçCŕËÉqŠŮ­tv~ ôÉĐ›!p| °»a”˝5Ep~Yµë”|oŞ7€¸!gŞˇâÁăpGĺ7s(LqéÓŹĽŕĚjDúQ‚?Hގ¤n5BÚĺh5Ö츴7g=5•»ş‡îA]¤4Í˙‹ěĹ(%ÖGŇ5ţ«ÁŐľ5űµŤ)N)‹\'˛Wd9sËű“>]z`ł6€Źa§ťÇ€´z4˙ňˇ5wřŞâ¸ßF&űµÂ @¦îé/‰ˇŽ*ý[]$áőUÎ~uřmVóë·>c_ŁÚ .]q9~~ńÍ 1Ů3r)´¶Őŕ`úÍĽ?|8rŇłd‹ćH‹żĐ”ŇçŤq 3żĂt˛v­›Ë>Eßúz?‰÷ůýBC:°zĄĚđó) kśâ~T1ÂĂŚŇŤŮ8ó=±9'ˇŕ7iM‘0ŘáÂ[h„Ń«v`ŘďŹ]µźůt-zzŽíĂ!÷ÍÂú˝*č{K~×aĎ(ůxłx1KÎkĺćϡŘnK“Ô…ě vcń/­JŻţşľL÷_f­ż7/<Ą»ÔčŤAŞ ­±ümb„ČŁ÷°*ě¤ůŁĘy“5 ‡ŐPfŘż)¶i-ąÚňŘ Î‚öăZ|,ăŰpÍZ˘iö˛`´ŤußagěܬÔifýłlk‡íĚż:NÝm¤TT/SĚ‹ťĆzu:˝›2öŞNň{ŘĚÁ`‡‡°L€ÝD&Â3ń/ąŹ;kŕëč×Öé»Ü,6%y»5Ř+Ę5‚6Ňqúńü_Ěmčcß±oEěd9eUOë'|ź±Ń6Lâ\ ő?ŁiŐ‰lV)l;5f~ÓŇBť]  «seČ©˝Ň‘ŘÚńë ŔýÍĘ­~vóoż=f„đ¦ťĹĂîJ_ş×¤\3iÎxmŹzMš{ľ·đëgNşáävˇÎ¦¸R"]=µźcś^cĺA–€”üĘrÂ¬Ż—+gŁCôÖĆVĵ®Őë]®ăß·äâŻÖś›|J;&ż0;űŢQß§ń2úÇ…”=4I7µŢ9°/űż1j¬ŔŔ©hHÄĘĂÚ"2 › lm^­ĆÍÄî^rmąźD]ĂpÇĂĘĐ7"áťP®7ŞaPćžÖsZ".ŚiŢţŤň}ˇÓ=/µąŰMęC !r ^áĂćŰ{8ńł®+˘ńBű"ć‡+…Tíö6´>ÂsPϻݯá­#‚˛¸â,mŽeľ«ň7ëcż·§Np‹a«Îť^ _Âńß/;ž§¸.˘^6G ›=ň{Pl„ňßʡ„.·.:É~ÎCA,˘D1Ä˙ô]#rp^ó35NÜkKŇJąĐiÉł©QPGĽ^gm`ËÎí7śŞ§SĎ}],.Ó‰ô¦âË‚źŚ ČV{L”µš9˛Ýü­Öĺęݵ,Ůb!ĽT4Ł)ˇ”axÔ!9ÔI·‰ÓFkŁův Ë×tq>-ŃĚYąšŃ]bT—sȇ['Ü? LŔéŃU Tę‘č Eý–Ďoělj™•mL|/ËhĄ÷hzÍiŕ?AîĎÇńuŘ׋@c.G «xľ2“Ö¸­Đ\ú<ËúÉüŇc"a†ŠçŰ‹" ikÖ÷Ţ~./$’v44kĎĎÔh•âs[uâ­íP GVśšďQČŃMcßW'Ý)@…K@U˘~Á&ʞqŮ–šXL–jM@ë{ž‰ë÷¨şŞ´ě//)â2™ŽŞŞLŃúüˇi`AhŹ·Óö.z$L0ŕę’˙Ë )Ë3zd|$Ç µ‡ĚB¦ÄČô î¸)-‡Üő±»ě†Żýˇě-ji…ěř0¶×_K2’ľ’ťöˇO’* Ë󹉞šď¨[z¨˝óý6»l7ë"ůFń™#G´×˙úŰ‹±f»HŽüşď¦ş$#N2ÁíYţŁđű/­`ćťm¶7†Ľ»8-1 žqk^†č¤ˇunC)&|óýg& IJJż†<ÂçIŹśićA š­± eđĘÓĽĘ ôż[äđ°ć…ßr7]Oëf˝©5Ko"FjMËŞ b]WrMĎLcآ*lí'ŮĽaé ‹]N'KZ90zč1Đ>zĹźĘ8Ľłc@ERßľ śŻÓ5^›OČŐfT%W,.LާœŇ×yÎůTxŰźTZżý‚™cůŔU°7r#N°ŞŁ-ž˝DŘ•@Ü…ť”HS+A§P̉G@Ű$břłH9`×÷ďM%ż6Ô€gř.W†şW[âIwů6DĚ?=vJp+"Ă+SHeťÇ[FU ö[[&Aą–ď:‹đY q›‘$ZŐq‹‚Đ]/xť0ŰŇŁý ¸™÷‰!3D‚]!mGM0ňŻtńˇń!â^RďŔî•€§6Čh˛ôZPâžBbĺ ÚWK”¸„!łLş.Ë’ÉU)LżŽë˘¦˝YC”hí9dĚ»ç`IĆźZ#•zqř p±}wř&sÖ˛iWŕ ń®ě#ŔŰÉn`WÖ”•ĚjĺIš5–őqą5ůÔkY†H4ȸЮn'›ŐÖx)€JŻŚbjřŃ—É˙DłĆĐ'ţ"~yť}Y#Iŕ›±/^ćţ†Ţ0ěŢ|ˇ>Ł%C 7íµíB_™zשšTܦZ÷ާx]Ę­E×92¶žy÷ĺ©ëÄ|˝ ĂĽÝ ĆËŁâ&I훹÷UŢ«oćźŕršü˘Ţ \+='‹Ä}^Q+ęĚčů6±HşHqiŃyðY~Eoé–SK%ëz5ô&=ľéDłH·ý  řuŻŞ ;…ŘścĐ´ÇbiƲÜM<˙‰?Úţhs#Äí˝[ é!WxŃŹűšźˇ†µôt„Ď&Şt†E0Bő‘C;Ť%/&4FŠąrŤÉľ9Gź¤Ţíhöo5ĺďlš¦šżéV>grjń†Ao§¬P•ĄŐŐ/ůÉ'|ĘužkSŤKNx@>oť×ŔsUb”Ż”Râ…‰ p%cĹź&Î?Âť<ćtÁ3÷ő!ąf/QćUÓELµkł·éČY¤CŽŘ‰kĚ}ŞÔčXE÷{¶vĂ×.ä:\…bŁh\0é/~u^Ną'"Ľ›ŘŇŘśbúY\ř+ç–1ĐXĺÍÜÝ[ęPc™˘ŽÜŘ€5ÎÂÓ\E3ś@а,făĐAąA¶ EĐźáťÝU×9íńr[a<}č0Ľ ĺĂI,n ţÔ:V±ňŐ3jQ6w´wÓ¬f„P}řˇ,Ú™öÎQ•Đv3p`Öţ§•az4WďĄÄ*1x×uUlU« PžŻ)•pƸĂÚłŁ•®MŻ®ŹĹŹşă OÖeŻ łO×ÜĘ%đéĚDSÇWçZP{ŽŻžůW3B“0Č»Đŕ§·ŐËžě,ܡfă÷şÚIÖ9mʨE0©É!r‘EµD5~„wä·'­’¸• yz&636ÂîŔ€ĂNrľ)]Ľ·p::×Wť—š"Ű™Pä´_ť—grŕ|µvT5LłndÝ…ĎY-ŤÎ^¨°č˝đµ`ЧĘť © 2[-É XŞĹBS§¸Ć'Ö•V+F3?75I7+ŢRvÜÍąÄ4Č ÷\<;ŁíŠ˘‰BnąŘëxLŇ÷e×éÜQÍ?.Ů)dŇđÎp3q¨őos§ÔÂtĂÉ)7hŹüışlmwćđY.ăÁ‰SkŞ^vŚíÎň<D7Ěv¦¬¸%żě0ó íˇ'!(uŠ5uĐ&ⵊ}¶uĂχ6UU]™ÁŻd@M|·XćqPâŻY’vb.ţľÇî”4Ě{Fĺ{¤0ľ źOX>ťůV «W0ÜoŘ%˘W"YôË˝A™aˇ&”ňި0aWÓÉâ‡âĎ.ŔÝłŔsâÖTŁ‘ę§-SOóÔ‡¦ ^7Ś Żúfë/„.o*šÎ<>içą–łPcT čY>,; ŠřqÓ7„:źÍťzśş~±tT)©›Ţ¨€9®OSGSéă@{DH±Ź ć%ą”«´űĽ>ë§zëYŢ-ŕM\Śâ>§†­ĺ´ŽVł ;µâ¬ăaÓĐęAŻQěVíçůk8ę&xµuV®-®âĂy…0™GdŻî_ŻÚ/ôk/›äžűŔµg¦ żËçjăC;Q÷$ÇXMOz)“¨˘}§ řŠ9…iÄݢůŤ$Ő¦Š#cçé*ńĄċ®ó—•®š¶ëÚ ­Ň”Éň^^H‹đ /e'·Ń¦U݋ڞ‹–í ­ËgJŢD $]Ý‹Ś*@™h›^°#^¶v5_×öLŢęĘĘŠýR‚îI?ç‰ďr Tw%…jľ+VŢ|Ź1űvȨ¬·˛sÝ´0MM§g/ć°Ý'°p˙‘Ł#6ÔjŘýGî•îČażmôšehĂó”ě,|qÍ0QĹ;€Ë]ÍěŁnäĽi褒ÜLq ‹čľjŞ•>ZŔ¶Ô”iÔ»AĂ ‹aĆńŠ–Źćą˝~2O—rfđE6;îeé俬B“Ý!DZ¬q6v™§îmL¤/JŘŢ· ?$G‡ÓÇŐXćXwH´hŻ#Xâ#ůÜWn·ĆcH­‚µ¬‰h}–ö Mó×”cĆIäŻÄűĺ„Ů”wňŃ^Ů·ér­zZ(¶$€«¸ĂUZG*#óĂŞcÔ%‹G’vq$ n6EI‰ŠŮ 6 zx{ÚĹ;+Y‘"~iŽĘ  ¶ôD& ÝĐż’ŢĺEě˛=HŮQ›kđ9Q%P?‘ÓbUzg6Óô&§ů—¸ľü »ť~#f ^śĹŻ˝ŽäßßYRk?ö“Hµ‡qˇ·u°0~Âá» ľ˛şąv…ůű0.ŕ.uĽÎŮ…N6ÜĹÂa;Ú„Ë÷»™’źä¬o Đ+;îńíďq gę `łtö€űĺâg0âGťíůčÔ Dšć›µą•@ŕ⚪Mć×7©ĂÓj*ł™{o—ýöű*GŹę±/şXqś}ä»-1S 7<>r/Yżç’f ‚ń÷%W'Dî{ŕ©PÇĚPž4âÉkÝFv’Uüˇi$®Ĺľ‰ň.wIU­ľö€“ô}ř€ůť«ÁőÄ qŞĂ9Íí÷ĹĚ”L®Ĺ Qť–.>­ZŽđMÁ‰ŚňÎĎG.ZŔşă—Ą8ÎňĚáŞ]bń/*ăá2’€_+yÄXć]†[«Ööţí«ÇG<áOF[9™]®Ăů“čÖ‘z§ö­–Ř9¸[ŇjđrʂבŇíĆČĘn¦×SĽőž¶ňŃ€ń^K°ĽWŰŠČş5†ćÔC@ŠÝ乬µŔ倝Sş1„<ő”˘–l…´ůdŻq˝AŠłúNţi¸N^p‘55*µ­GʡšÇĚ]¬ÖłnČ—#<ć›đ6huŠż}*ÉĄí˘Äꞏ“pW˛Fź“ÝĐ@ŁÄšůňZÖç3Ϧo® î´Üř¸´ZúNó„ů·Ięr5į̡ý#ť®—ńÇůýÜ+b8‡ŢRBŕŁN‰MX\—TµÍ›â F›¨” Ź&zĆ[[ŰwĽ˘a†¬ŠJpŤ·´ßBô^!Łž˛>ňŞő¨4~¶öĎÓ(éE\V;`‹®CěžyWŹLĚ›Cß ˇvąJG l‹–źÚm@şĘĆ zőX m•ld#÷ŮúdÖuţöT™úé˘G>6‹$Ň´_ć±fهrĽ’ÓŃ×ä+âO±s xa8¤,?^č2Šíő}zĚ5ëq Ę| |ľ‡4°Ď$ß-ö]ÓLŤ”úK Ţ“đ\=î 8ő+4$;VŃúâH”ń¬ÔyنĐub{‰ÚH@ş©X—ńŔç R„ăyRIÖŮFuş6L~]á%śN>ë»– äŻÍřVÓüYfúIIĐť6Őž-쮣Ö; hZ_­ŢłOĂ?[WW5Ű„*•03ÂsćXÖa7ĐO´aPÂÖĂY…gż2čkťž›Ą˘˛Qź}™”Ü(0‡ő˙\š†óŢ춑ţf~Ńí‘Ö(~ŃčěÁ¶ëČk&áőáaK˙đĎKţb/$˙¬Ň, ‚şSb]§‡dţ˛Çj8U˝Ú¬GŽË÷˝ôŔ˘‘J‚yűż"ŇłRČ3f3S‚P>ÉĂ'jč%0Ї%ťyöđą…9޸q íŤóčF¬Š˙f—Ë•ĂqKG,ˇ'ţ¤zƱćŃeŔÍox‰ÖüT‘ÄĄ.úŽvÁ!¦)™ÓŔ1ż)˙»Ĺ¬ŕí¸jSldĂ †_@źĘÁ$¬Ŕ…Řęc;´N6bŔ÷ňą°‰yjôŘ7Çß !ŇŃ´çôčônK +K ™ëđ¬|Ë> ůý4FEÇiš®űođéç2 ď€"»!ŻkÓKFŽŮÁđšfčďmÓä„VŔŐ:Űç„?‰—©v¤¨µNî=U{Ăô4r±ÄŞ,§çpíąĚźŮĽś¦ŃÂáëďěÜMA^QŇî®ÇÁá ĽŮŤk_?łÉ|ő"&\ł† ŘY~SéAŰČÉ ĽUśĆ)ŹąlŤ˙řA@, »wâ­Y Éě’ĘŢ~Ó> endobj 14 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /PNFOZF+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/ff/fi/asterisk/hyphen/period/one/two/three/four/five/colon/A/B/C/D/E/F/G/I/L/M/N/O/P/R/S/T/U/V/X/a/b/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 15 0 R >> endobj 220 0 obj [671 639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 575 0 0 383 319 0 0 575 575 575 575 575 0 0 0 0 319 0 0 0 0 0 0 869 818 831 882 756 724 904 0 436 0 0 692 1092 900 864 786 0 862 639 800 885 869 0 869 0 0 0 0 0 0 0 0 559 639 511 639 527 351 575 639 319 0 0 319 958 639 575 639 607 474 454 447 639 607 831 607 607 ] endobj 12 0 obj << /Length1 1521 /Length2 9078 /Length3 532 /Length 9975 /Filter /FlateDecode >> stream xÚí”UXś[·Ąqw·@áÜÝť Á=HáP¸»CîîÜ5¸{€ŕÜ58 tí˝ĎŮI˙ç˛űŞź®ş©w®µĆ5çú>jr5&13 PdďÂÄĆĚĆP|ĎĆ`cfE˘¦–p»Xě%Ť]€ü6>>6€«€ťŔĆÍĎÁËĎĘ…D 9x:YYXşč$č˙ÚÄł:Y™ŰŤ],v` Sc[€ČÔ čâÉ łµĽ˙ë„3ŕ=Đčä4cFbcY™şL€VöH,’ł7xţ)›ą:ü÷’ĐÉ @IG4ŮŰzĚ€ćH,J °śä˙F¨˙—vµµU2¶űKţŻ&ýŹec;+[Ď˙Ú˛spu:Af@'ű˙ÜŞü'›"ĐĚĘŐî?Wĺ\Śm­LĹě-lÖJVÎŇV@3+SK€ą±­3đď:ĐŢě?C€űöw5qY%]†ćů÷šŠ±•˝‹ş§ĂżŞmţ›Ů~3¸;NV=VfVV6đFđ÷żü‡—”˝)ČĚĘ|!¸¸ĆNNĆžHŕ›&.€7ŔĘŢ čz€ł0Ű\ŔGŕžřĚANHŤř˝Łyţć” RyvcĽ‡îűJąĘ,tr)ŻÇ«Óq!‘^¤›˝©‘Ô@Źe•ߡ_,t`­O›"ý+˘ŻÎkşń×ärŮť%¶ Ň„äb;ňp=±´X/Ľ|m•ţab% ŤžkŤ…zž©”ku‹{ôüôPŁ›8ˤ¬ Ďë‡j­o÷™mÓ†giZm)ľ™)“ÓÎߌîuź:ĚťE Ú·Ítś#ą_ť=iÜäˇf<OĐčńŁĂc0ŕĎ Öë«#ý¦/Ţ9îâ q&żYă˛,SĄt,Ť„"Âŕ'âtPůUrz'b1‹ýĹGF>N-Ě>+bßĐŠ˝=Ľ”;ě¸21ňA7 q ŤÔ‹ő,‰ąłµű¶spłíÖĎ‘ÉÖ|ÜQë!fŤŘÁăËj\€LÚžŇúÁď´Ó*Ię¸ĚĽ?úĚWYxuŚćí]™EÍt77ë¨Ä&©ÂdZ”łé}_‹aŤ6k­ś4*‡gÄ•JsZŽ»Ę q™Đ·PY‘°Ż7.""ÖďüÝ>Ž<Ľ2…ĘX—O@ÜR¦Ó2ď±/Ó1ÍL»Í$ahý1檥Ő}oŁ–¦x“čřůÂ"›˝ CďŮĹ×[–QvńńP ˘ĘŢ CłZó ö«ŇµRR†®ŕWŇoLGĄŠę—ČѤ…€Ý¸xşłů:óÔÝ©@'c„¤šjĘŐµ(«jWśŠEţťyÓ٢ÔěŇë~É I}.´Žr<ąŘ“…Ľ09- ł1-XPl÷Ské`ľ%Ż« V:A) ”8Uţ¤śžrg?ÉDÜť®—ČŇYbŚZŽćÚŽOç„ €·±’bŢD[!šďŁt ąĘ“TŘw}gDÝn€NŞ>]˘QcÖńă`]MÂB)r“K !ťu?=üioíě5ߞŨbŤ' -D©`ŐK¸ŰSQź÷Ďݜˡ¤Caç—ŰÁofčůŚOAÔÁt%ÉŃeąĘtiZĽ¨p‡.†™‚–aoj€=ŠË0ÍYĐĹ€Ô´Cěť…ˇőIšüľBŻüă"ĽżüޱžëâݧN4ôp+ZŮ;tŔLi“µ2>„âĎTzŤťOZSĽqerä*) űTSú% ÖßńŘUł€ż“DíYúŢ Ď)XőÉ!뤙 Ý»¦SL[ÄŹ7ˇ·÷˙ Pľ<Z¨L©=/ߌ#ľ¦aŐ–Ś®D+©d‚ćŃŻ‹ä&Ľ _ĺČ©„<"â+ }ô„Ä+ţ8>ăÖu· 5ÇéFh(b&ńě+¸·%Ňéň‘´¤lcFń2°ŻÎ@‹đ¤&—]EqEd-ë(źĹJčň%,ť&ę‚~Ćĺň›˝J‚›QĐwFVI=ˇz{\s}¦^ŮW‚ĹtźŠ_l&wŚ[DŘđŐlQö aÖ#ŇákS˝]vśVl”†ę›Űv靣^ȈԜNJ%ď]ě™ÂŇŻľĽPµ¬Rđ„Iç¤y2í „%ßďnŰŕ}HfĂ>{Ůd{>ŁO (ë[…’Żłćdżl¨t’Ö:ia›NuzH;KVýAĆÉáBŻr…ËŃŘĘKE/Şî9’Ö*ˇ¨ťŕwwxIµŃŞŃëJŢm›3Đ5íâ ýŠĂ‡E‰©âć@Đ,oI •"3\W‡HŐÜĆ˘Ě ‰ěâĂ–Ë•s}ąAČĺš:eHuęgeÎ_lÔ·¬ˇ\Q®Ěp:Iýš´űëţ“†ĚD©Č íŞďşc˛6›j®ÇçćÉŤÄ:%#*_î70ëĐĚGĄ‚ąF9:Ě7u Ńę6/5Ői‘rĺer<řQ*„#O l#B]ÚŤ<“*mÂ|»Ô⑇m/ăţź3hI­<ß«ŞZú”•„’ ˛Ř=óţ… úYëěľN|‡Rç;¸ś-Ťó8VÔä„%ąÄř¦™ú0 YyumÚ_hŻJíeţyĎĎGgňK"&Ś'MfíĺĄÝ±ĘŮC>.($ť˝Ů7gň˘Ş9%'rz¸—ŮłÔMž^YKßË‚É2Ţ»â9c.Łů ĘjŹŮ 8/ă˛Üh¸Ű/É‹Ń<{`¦7Śv§4H4÷´wDČ ;ŰĽ4&8NAQ’ž3Wź‚4‘äTż\L®…BĆLŤ{¶.BĺŔ)¸.¶1M›É޵-xäÚ§/ÇŚÓ—ł«á1“—‚ľOpH+<ílŻâ~ WhX]A0ăë–lůUqą2´SÄ«L8vÎ Á…ÉÔ=(ţśÖ)vlţE×ĘsŞc;>Đý]ŃŰĽ\îkłe,HO~’g¬9ô. ¨gU_]xÄa)śl“/čPĆWĘčÄôkŁveÚG6ȤDQ‹(TŽüőR´śkĚľC;ŐFFzčďă93Üäę@ň ž‘Ľľŕ«U‘ŃÝ™¬A˝ĽŮĐ~ťMąúĽue"é(p%‘ Ňeóé—ÁJś+fťŮ­— Ó˘Żâ?¨íÓŐQż+–ťü5•Ś÷s}4OüÜ}óě’¸ŕÔeWCńeé§Űo¸ń^úĐěs˝ÁóeJ›ck}źćŁŠ+Uí÷Fه‡ŇaÇŢŔ×âL‘Ź\´DeKfÁ"yuÜ›ČîT;ôMÉ_*ÇÇA›^p¶PFÎ[q+ńŮyŢv3´XšŮ<#žoQóĂľ¸r-x›ľßnĘQ yű( °ë˛EDT!ö·”Ąů¸íű¸…÷K˝;¸Oô5°°§ľBÔüÔ1´üG#ë§W íÍhăĚXu˛hĄ:ęKm¶± ~٬}6=™áčÎgZ#šUBC.Âů̇鷅Łę§žőJרµb]¶m{OVˇĺ¦ÚViiź‰b±ŮLâ– Vrдޱݠ:2é°.CŚ-ŹM-ct~FíS?`wdÖÍÎÔ°cőTWÄş61ŐŞ*ů*ť‚Żýż“89ď3ôDäĄ}äÖ‰ –‚Łňěĺwµ Ő~s©Ű5&˘—׋dH‚L…WD`ţsQĺ#EE0ăc@Ůy«¶"š¬žO.›ĂĄňí/ë×”§SYăŢĘş—¤§E{uu¦u݉ť‡mÉďDéĆmř%űŇquĺţíGĆ(C´›öÚˇ5NmřK}~žŰ˝/Ť™swü(C–…U—m_‡žMĺ‚c"0” AĄ˙čËřizÝ/‡÷Ż˘ĂI —8’Í5#Ša‹«Ă)şÜŔRĎD.<ĺ´T/a÷ŕ)膓 sü€–Ž9—Č㸆„ł¸ŇrXígx*Ő˛pńňÓŕ훺~s #\'ŮŠ}kQî}ŁL^-ĹĆÔŹ´×ŚíËîJ°*"ĽćÉÂţ:˙˝’Śr=»'%>’öcxˇvqŢěI˛~ŽXmÚ¸áÄŞ‚“ĺ52c®ń}§ÁKŐňOÇŕŠ‡U.ÍňŃ ¨Ż ôgčŔX¦~ć9ßď‰z#t.óE~îR/•E„# ÉKµ:ľ˝Ľă;€@8Ôź¬ÚVĽ·Ä3Ç´›jč=…Ĺ-Uö ¨ŢK1‘#ťçŮ`31Ąť‘ďéŚvip‹ŞMF(ę*ÄĽ†€ @d/Đť(S"ĺ#IU,ŘKzčŁß-Ł_ ”Ăî†}e7ŢŘ߆ţĘś9î‰Ţš"¶ęrzäaĚŮ3nú“ťĎ‡^nżd—EĄ` p9.&˛V”s»oćŹŔł}ěŚ1ún«Ď ±ěKza4—¸A*’Ł—‡&}”înŹśÚ]Šö-5´w®šŹéµÇpĹoć‹ĎńJ›Úkj˝ŐgěÓ0ˇ<¶ bł˝\ĹłÝ2‰ űގĆńŚYÚ“7óËTĚ|ÝĂÍE#Ä»,Ď Ů¦»ű妱Lç2÷VäběŞËÚžťě.ND˙tyV}r•h¤hőâŹ9‘höőKpŕv"ˇđW˘÷É5-‰tş,íNkU5XďŁđźŽŮě·LĽrőté"YőQ&šGĹpäďĂ6MFKÜMWÔŹ­©¦fo850ߦM§ ßp#Ć%˘\úźľ—°ýJDoWî?Žě~¤ş‡O˝ö2*ɦM¤ŢŠE›kůˇ/ôÎ+ťęfWx‹Ą@đ^6ĎZIJchŠŤËËZ¤Á¬ÓĂŮ®xĆđ ú‰®őĂU•íĐĎŻ¬ß3_V±P»Ű›=yßß8#ĽŠÓÜH0%tV‘¨ü„VTŇĐĹŘřFŢSÝ+±dţ]-MłXś`^A• –ź@‰ Gz"Ťt˝ŰîsĹT:żtŞf*§”$ń‚w÷ÁÂc·O-m»řA^‰˝-Âąó¤Ś? n×î¶Đ]m4„¬ń8;ŠŢjţöH'ř=™JHLh-7–©Ý^+çŇŻNMĹ@_ĘJGĽ‘ČâFŕ  1*7%Döhę ?pű›ţň÷ŔIƇ(ĺ Ľźę]K?ëc•‡Du€`˛ Ăă_ ¶¶­úEr?hŽĺ•´§:›*ô`)ĺ­@}:ę“ř•‹‹\€#{ϨÖ*éWŔPŔˇVËŻ·ČÜ-Ë/¸t8žyÖqO޸2 Ä3uÍôk®ś´+±ŕ/ěsWgVłü4fňĽ›™ł§”ĚĘ´5űîŞČ€pyßL żş^íĄz 'MĺâĐ^ç ˛<ӷõ7’úY—XĘ‹“ ,Á@aŔóKÇÇů®Ę/ćáń T±űzč§Ň<©±·Ąç¸L6­úWŹ‚‚§›>rŤtűŰm-Ŕé™_â°dŁŰ§ć´M,Śc„E΋sŇ:ť?÷RfFĆYĽQĺ˝Z S(¬ăŞTÝ7;;/Î_ŕŁË [HmB¬•ü]ŻľÖ'őŘZ€ľ ôUF”BS@ő•¸ŠKňDO\f˛űw%&˝YČýŹuwĎ/ëm&˘©«źQd…xC0ŢI­ŘqĚá([«6ü«‰ŞĘ¸T‡Ë0ÝĘÎáä,żM:`vq—Áeť‡ö¨RUß:ŻbN‘»›Ač­éâ«0te˛Ł> |㎢+µ8&ókźIz­ˇo!v+žĚ4Ő ¶©'ÓĽ%ż1ËŤR5AÝmń4§Öf‰¶ŁÝݦŃť¦Ů62(=@rf&j2‰EÁ¸zŽ ·ÂŚů˝,QKËCIGI00nuőţÉwMâŞ%°łř¨(ä[k$QŻ ü§ShŢBĘđ7«9…o|Š_3řăřT÷(çI^íJ$ÚńxiWž”Ň~,”*wĂJh;”Ô0šc"m¤/ĽĂb-#žË»OÉě5'ęýŇF8jrÝć<Š †ŮČsa‡HOTv)—׳©ŢŰU¨ořVţĐ,^ą(Ś»a\˛…5ÁŇ“ČX”ęMZ}Ë9µö09dD’oâ‘Ů˙±ĂşćÜ‹[b‡™ç–źĄÓĐ‘n@¬;ţaHńE]g}z±ňXoÚ=ĂTŠO9¤ޭeËÎ$ż¤ČoĹ3¦…‚EăľŮS1[ĚMŔŻiX”®Śů±úx8cđ9˘VČQż=čźzWAޞ2%±Äś -Ć*ábŁ€‡›+fF3-lsl2RĐeVv2ÄŘŰjO:ˇ)ÝháČŽ/“_-?Făq×0)őőíݶ×BIX>ĎęĹlmczqÇÝÖ>…›€$VYć­eH}_YçÚG.Čłś˘ŁŔGx¨ @#× j{bPÇ:1AďJ¤‘[:EĐݲ—x.Ů/Ą© šË=P>ĘbmĚţęłu17ňéĚ«…ŘŔ<Ĺ•U‘PŁ»¦íyˇ7ÉÔ¨˝$qs=çv±´;L抆˙ŕL<ßrŐ„aaQ"Á÷MŤŤ^[iyţ5“TFŹÔ¶Ť.„ÄmWYĎ^(ÎňĘç#¨šwÝ×´ŮĺC/˘a†hŤ‰žŰ\2µőrĂs×ârgDQ0ŤřÝĂłöŽX3f!˝żŢJ“.:o4ÎňöY2–Őťî”B˙zbGcŽC}á“ éźŃ&Ű5TfCt3Ń˝Ľ„äF\wEŽŢß–ůTPˇf¸˝ö -¨ńěóZÚ5źdöE•Ç‹woTÓJĂÚă1˘ »d¤‘•üxĘóvˇ 'IuÇsŰ vč©Ä·ĄˇuŮVÁÉšŃŮr^¸Ęş¦m{|±#˙›ž^er*ő-(Ľ’4ŇZwśK$ŚŰőŢÁ]KžëY¤łH˘™ýiFX %ÓíĹ­üÍ+ííťí€HůŹ—µ”|pĽOŐÝ|‡\ŃÇwí '˛ÄG(xGbSCźŮ­TÄXÔCqcŁâs6SÉ@Ü Ř,‰6NhÜůŚ*‰ŃľaWBz•< ­Ň¶jśXCŤ…›ű5!ĘWJ€`ü#ú1Mj Ă|A>©Rá•IN'$Äq·µ«P|¦7Ü9^óhô¶ß™ hž– oÉó¬™kY»ÇŮÝpµNę©$ §Rgßq/jď¦#ëkëulú¦ŹŘc=üHŠKőÖۢl,NDE΂UhéÄqŻ*G0k·‘Łqç Âďx|CŚk #źâIhçz@řŰ䄢wëćo |Ě‹…­•ÂÂpPÔ5‘±/TE÷ÁZd”JÁbż×fłÓŇLО©Ń őůö?§’)#±ź–±Ď…ÜWŁ-ćSĺÖ^?¤‡R7ďf0ş…ŕ`NTĎ÷°µĆÝĘő•8Ź?jăřֻϢ5FŕÚĐ}ôŞXŻéëHźë?ÓÇďŮ ÝeŤ¦u}xŢĽČ đ”LhŤí›ăâ†.‡¤ąĽv|gżéšR§©›ç¦‚9'MsYÔ+<™JłB *űŃ­¸l+h7ş,I:`îz=pđĐŽ`ŇĐ9ß p §6‰ľ3*ż,¤…‰>9h0 C¬¨=tcty뚎‘(źb,MRsDż>đš6Ą döł¨–bµÝ×ϨWµ^ú(Ň(Â)·}(KHŰn†k.çďl7LűöĽ%ĽÎ’ą®ă{?7A& RWť łT(M̩˂·f‘PXBDbĐG¨Ĺ(†ĚxyŰţyę÷äÖď<ĺ?!# ü´'…ýj+XçÁ,ś%úÉlŠ–˛®ß©ëGé­ďtŘ –™a÷aß9„Är(˛o٤ @3´%–+ĄRTqhŢRŹó:[ô®KdŮ_ęO‡/ŐĚßľ\ą™bŢŘ´P›~Q˘ěîĘЬXOmĂĂŹ\ކVŞt™Ťxvö«Ô ÁŘ•,mŻKÝşÖÍI­GW»·¬ *0ćHĐŤc%!IÇcš§0 UĄş76KŚÎł(Ô±)oy`y#Í}®‰kzƤŃçż—âx¦ý B~8YDô…°ł¤ëŹőÍîl{1ťł˙ş™›ć!vLŃľâbTd:»];Içw‹y§†®ŹŰÓkŁ7 ćúúîźP|>ČTĂ\Gî̤žiPüH*`q66z‡µ .<ĐbF0ô=RłźLŇ’Đď]%Ý{vĽO ďśh4ÉŚlˇŇżĄ±t,ŞČX í’ß§`ŔĄťUµ_yt4EhA“9ŢŕL–oc ]1ĽťĹŞáóŻŰeđĚ‹áűŃ?•„q…:čG!`Za':› Ěj“hQÉŽĚv.(ť=Ę? Ml.›-ebXÂŃ/G4gk»ś}˙jôŤšüľ! úz©ŕć±ěý|łănĚaWĚ{_ HŠÁđ_Ô"XTLŐѲfĺ,$(ĹĹ©ě .óúĹ8-Ź™ Iď­DlŠs U„0Ó·tŞíĘ2ľŚş–0ĐhsIÍď÷°řÄB®’m¨˘`ýŰÜřVMpŕłvńázŃ2•®OńQv96}úŹ]Ë}Üé§DVYĚýc?©óXç¸F tUăąQ—¬J]ýŔÓq‡·€=çnö—G‚Ç–y÷č­§ôÁg ÂČË'÷–Ű|‡ç+MŢƵżňÁY…&ďŘ>u”Ż’ÇfM!úÉeä*®—9n~eŚ0fŕ Ů=¶9zś˛Mcś*xEŢÖ'¤‹Ó×Űöă3ÜD¶&ľĺ[Žó31»Ľď–Q„ ›‡6•ôŁ]1tR1Ľ!"%÷ Ť2źróP*‘(Ąnúý‘„ëěÝăżBb XSG;u˝9wĹń!kçÍ’Jó8ÂĄlëŤÝ„­B'đĚG 5xßf @ÂV„ďVü’°^‰…7ŚyÁŃĆ ßäĐű3XJ®âĆ÷ŕĐązľf|ŐŇ.͵ŮČśle‡q‘Ľ„g O] {Ć»úrĽĺ˙Ĺ(ăvNřžë1GąýKßN19Şšëće&¶šÓ-®…ĽŃú7^|Ľ(Â…mÜ„ý/-íÓ‹VuĄqžűň_BşÇ/ˇ¦ľµŻmÖÎÂ$Î4ŽŚMŃŘŐ°Ă‚d‡ŁtRl&˘|§p–xě bí×Ću]ţ¨‹p‚”1BäÁókkľ[01ďw°ÁŻ<§¬§ů e”ŮĽďU‹růŞ´ůËgľÎčáŻÄ±óőcp~ń]­ĄŻ\Šhş.űW+lĺłFa¸„TgĂŞ}öO UĚČĆNĚ…łć žĐ±Qśď÷\ĚR‹žâZ3ç&wśwé“ÄáÁŇĺô˘R*ĽO1fź4éHĽ—8ÇĐvVnŽŚV|`V>Łg‚Žć°¦ôď…ůđb"ëÓGäY—ł‚(ËMîĄ3hUA&ĽI˝śJ–xÓY±]‹w”]Ş2Ď•=mŹŽíÖ«RÓ ťľÉ¬hĎčűV9žťy•Ż§Űľ»"›Ň:0s0ˇgÍü%AŞLÍ*&ű¤ďÝ8‚Ĺ1S$ú/ĺ°« s˘· šŤ©r”‹uNľô~gć#1ĺĚŐôňÔđĄŹî§`VŹ%íůĐř'Dă=„č"3@&%€Ců‹ŚÄ+g˘=,,<:Zm×m¨Ü9n¦ٱß_őÇú®ć-­€ÔËĹIaţ°Ź6˛ŕţXô‹“IĆÂŤ€ ÚgęěănQ @lĘ"§¸î~®Č|¨Ô ¸›w|'&ńHţŠëI­t1i%#„űýZÇ’ôÁ_«ŕa¤s;.VĚElŘ:cŰŞą»S :Đb Ëä=@0F˛Č€0Ń™.便-ş~¸ŽGů•.".sŠM§˝K± Ä%ńěnşĎ%uú¬˙‡¤˙/đ˙„€©-ĐŘÉdgědôżńü\endstream endobj 13 0 obj << /Type /Font /Subtype /Type1 /Encoding 215 0 R /FirstChar 11 /LastChar 121 /Widths 221 0 R /BaseFont /SPBHNZ+CMR12 /FontDescriptor 11 0 R >> endobj 11 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /SPBHNZ+CMR12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-34 -251 988 750] /Flags 4 /CharSet (/ff/fi/parenleft/parenright/asterisk/comma/hyphen/period/one/two/A/B/C/D/E/F/I/L/M/N/O/P/R/S/T/U/V/X/a/b/c/d/e/f/g/h/i/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 12 0 R >> endobj 221 0 obj [571 544 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 381 381 490 0 272 326 272 0 0 490 490 0 0 0 0 0 0 0 0 0 0 0 0 0 0 734 693 707 748 666 639 0 0 353 0 0 612 897 734 762 666 0 721 544 707 734 734 0 734 0 0 0 0 0 0 0 0 490 544 435 544 435 299 490 544 272 0 0 272 816 544 490 544 517 381 386 381 544 517 707 517 517 ] endobj 5 0 obj << /Length1 1424 /Length2 7770 /Length3 532 /Length 8613 /Filter /FlateDecode >> stream xÚí”e\\ËúĄ»·ĆÝÝBp'‡éĆÝ5,¸C`ÁÝ  Ákp .ÓçÜ˙=ÉÜűqćÓü¦÷—~ŢŞ˝ÖŞz«6•ş›”%Ä(»˛q±s dT¤őą¸\율tt2Î@3W,kć p q¤Ü¬Üś.~a^a>^T:€ ÄŃËdmă `”aúk’@Ęč ˛0TĚ\m€P 3{€ÄtőbHŮŰ4˙zĂ  t:»-ŮQą¸– W€9ĐFĺř+‘"Ř řWŮŇÍńßCî@gh(#4$Ѷ÷X­P9T!P/ 4É˙ŤP˙).ďfoŻjćđ—üß»ô_ăf {Ż˙™qpts:T –@gđNŐţ+ś4Äţżl]ÍěAR`k{ €ó_%‹<Čh©rµ°X™Ů»˙®Á–˙şmŕW”ŃS×gůź~ţ=¨n»j{9ţ#ű×ěż™ë7CwÇä xËÉÎÉÉť}ţýĎč?ĚäŔKz řřfÎÎf^¨Đ“%>€¶z€žĐÄě`+ôtKüVgÔżÚ í8‡Őßµ!7A˙ /€ĂĆËŃţ]âp8B›±ü]p@ŔŔŹŔáęů‡ůˇ*Rż * ý›2żIŔ!ű› şr˙TUţ7ń8TSů7A5U~TSő7A5Őţ!A¨¦úo‚.^ó7A´~/€Cű7AW¤ó› îşż ę§˙AĎ<‡Ůo‚Ž™˙&h‹ß[Ď cůB;ü˙ęĚMgýBăŮüĐ| ?jk˙B}~#ÔüB}! Ô×ń„9˙P#—?ş® tńn 4†űŤáńÇÉĆđüˇ1ĽţĆ˙ľ\ŇŇO6>7TG ŔÇé÷żOÔśÜ€Š˛ĐăČÉ)=KU-Üśť`׿żfĐ‹űo¶AŻ9č ´@]…X„Ú¦6†—úËL”!0ĂH[7Ĺ«ÖuOw …Ě€±˙4˘äÄĽR«Wž‡ą°Céń@ęŐî«1&äźöýiÇÝt'Ă»…T˙×Âv56#ŐX4Díń^Ň%qzŹ/IîŞúýa—9gČ2O°Xą« /b¬0¶Ń2çňKśÓŰąr¬ć‚°I[t7e>f&Ąř“l9ĺr˘=é[ťÎ.÷’ĐN7!ťĐÍ(XîgŐ`Çž®¸ł—·Řă 3˛ÝŹjŠ3 Πȧ/×;ő÷SőÝÄśn:ŔŕäëS˛pÇűŠ÷ĺcÉćrŽ˝BŽřqNžvŔ0˛IˇÉdÖ>˙Ú›X®T@@qXgüű‰sĺ¶Ś7Z2o'.;ö—1]Xř°s ĺżrc¶m썝Fb˛;7:áń…PĐđřşí29R$~ďě¶@_PMvć9Dą%ÜqőO ĹOĂt •0Ë^#Rv eŮ~ÉvÖ÷qÔŘrŞ˘%hGÉ)4T#_îÇU™H0ÝţçXyÎęgîYŻC†ĎaBŞź®±iMŹß‰˝·¶Ř?(Üb)ąĘÇc‘÷–žîEŃs@ę’Yyqć"H© yŹĂ€‰{­ŕ_ÄHOşy‰÷>ÖjqéHÚI´í®ą´¬ľ3±Ď2uWŚ˝â„܆u†»ŃS%kő$™Yt|ŰiV 8±Y)¦©folFЇ)vŕx‘*[čWIâ6†™Ţ[)ąfôËnXnÚÔŁ,šµŁî ·lUĆsÄďłŰĆ—VŃľ¤'©9,#Ë3®_Ü<徊Q‹óÄ|9&Č|Gńěžä>¬ßϧgM^“«ő4Ěš˘—¶Ě»ä\dnB#9ĎŘŘŞb\Ń‹°Pőő^G®`DŚŃrčŁű!ťň$ç$şĂ3 Đš˛+Ż.HŃřcÝaęîŤÁ6äĘ}ďŰË„Ťb.Ť«Ţ31w݇–'Ş ôy‰Ý )ś;DĹR58Ü7†ć Ň7ćŻi‚ńnPě@ʉ–3~ŘčG$ňüuŕäâíĺ÷K‚±63ČŘ4Ë돥fK ë„)•hSňŰÍĺ37óż,Đ“ČyG¸ővD3ËoÓD:üÖťú¤‰9Ęť¨ÚŤ1Ş&ä@}ý¬[éŘřâJeî©e˛źqy›Xś]2Ą˛éađ—b›zčî~>v+”˝ 7‘|1ň1“GĎP|ôÁżýĽęʬWąDďU~YIŘ=mž±ŕ›<ëY!ń×%nÇ- †ü·&•ź{#kż’·ßEĺzöÓ° 4ܵ(–G'űÔéjÄěÜŢq”´ńPµÜŹŠš~ÁqNqqŘ ,â[бoí5¸µ·E¤šLĄ„ bŮŻ'TP–‚źĺŹ‚÷ć8"Ź7J9íé¶·„÷‚jŽ1§®çźą™^‡°Ďßę¨ ťä…2ľÜr·—°¬A) Š>wtF÷(k%Ť-źőďÉއ5 ëÚ„ÂNGuˇ)Čâíçęáú€Wľ}JťSż=6Á]u$ŇŮJn>ωXŇ’Âő}Cw|˝u“šW9rű8ö©ĺacrEř™ęg›č°aU©×k-¤ŮšÝ >ÁŃ„ ĘW+[W#ąOeŻOń{µ||ö~ÇäIJ…K–Ͷ4¶”Á«Väąi·Ö™Ľ˝4Xµ•ý¤Ţ;r\€“Ćăú’/&t™zÖŕ^ŢZx^oZv©­Ş?ckŇѱ¶3:¬ňËŻUű÷8Üôú“MÁV‘í•Ňi‰˝IXp]4{ç°đ ŞÝUçćjâJĆóĆ Í>Ô€ÍtÄ ¤etEÄX“—ß+w7šř5&KËĄ8?݆ěYź…ë°ŤdÓf[S±°ůÖ<íDŘčäž*5(,ž¨O?.Ď+[7ĐáŠnĄfo[¤’łÝ’B„Ş”´ľ<¸¦U d·ŞIŚ~ĆäÁpŤÜ®÷«· ĐĽĆ5ąc˛HGTFů…˘g3›˝ŹvOvmŹEíR’tM#,t\2öôË-ňtqČ9ôě”âpřëíý$.ąlouďçŔq<ęä̤ÍA4KÁ:D ş µ1l´­•wd? jtĂh…Ň˘Ł°Ń»räb;M1Ľ Ä@+â?3YđYmŮ+şU?BÜ0éË|ޚᇕn}'áµSýŇ˝ňăXiäĐDŰÚcĹĹř¨ľţTC‚ŁlÁ»& ä:Ă­˙cüsT• w·ßĚ˝§ę!›Ć53>řç~yôâ\gwz)DŕŤË좕á[Ńě#A§I»?ݨësB[PYI-١ivś˙(,–¶.üˇŞ&V§@ŻĘ ďąRa6 ŁcçzÁIʵxŕČKłoĚř˝˘§s$[ó˘zČ|Kž4/®v‚0’Oʬçś\+»1mŘW«`ř+śš]…*Tü•-§xŃ)3™â„ÝFĆŠř¬/‰:,0*˘W:áłuáöâfűĽ^}áĐ^ HLˇ#sŚ3Ő:‹˝ <ď#’ŽMŁŘă†Py˛RnbĂHšÔ şÓNW\źŃ;Ă5 •fuĽôÉÚ…ö!¬$I. fÓlIvsŮ%„ąîş4ż‹Z@Hîżt"—6–$&µâe®źśÄ°ŞĆ>Ý7ĶăYˇŁţ´Łvâ‚>˝(b/G¶š{ÂO'˘|<TqV_:e¶pńťiÉ 3v)˝µ¬ŇÓÝ7Á˘¨şf"¦ "%f7ú"[ÎęŘA'ňđĂŠŠŘ)mjĐţc'Óü^˝ÁłĂăfĆ}ŃEˇ]»Ľ<ěúLy–Ve—ŹÓ ŞAMźß"şű %űřаnZ¬ĐVlYĐ!W ŞK[Tę©÷nÎO˛UżĂ;÷Ő˝¸4ń_wׇA ¶–nľ“J+b»-“Ť ¬O†_¦-›ůîňăđ¨[»µË|›&HĆ-KŞ j;9›ŞLî“N0*´×Č6‡:RÖ©&hÖAź€N%š+Tç">»çľÉĽĎ7á ܱĺ“LţykŠ«GmÜÝU¬YÁ †Ű • ďasj,r"•­+ –šŞ-Ć5RAĐŽË©GxŃ ŐöÎQ0W¨łčř"’Ë d?Ü+^OAÓfŔ9™UÖ•»tŠK´I‘cُ#‰đĄŠM¤mk2V–»­"«Ć¨^mSX¬`łă±í˘V[8[)š´°ŰÉ4ń^Ô8˘cŕXR˝óYŕÉPÇŇ`aç­îä#ńë°NC’ xq•wapĹ8_|á=&ŐÄą/âúއXg¤H;¬?:°đ*…Ą—+é=Cě§HpĘ0A\Î"jż­p6 &J1nZ쇓×[­h\Jr>lŠŔ3FS„ÇÍĽkU\12Ď_eĚAâ­ÔÔó˛KWÍ\Dš!îź~Ş˝ /j^M|µl<úË®î+EŰ›c$‹ŕËňa*·#>ß7- „‰mT±©ŚĘ‡n‚»ĐĐďǨ»Č…Łżß"ćËI5ë2«·Qśx<{qô§+ —ĚĽĂßžú:2_5+čé¤teoK‹.+ÔĐďËăx+Đmöź–ÉŔ4h-N®GëuŘĺ«úŘĺŘÔúSs˝dť^H*°éĘh¨×hżO3€8BźU«6¸6ö<¸ç®ËWI4tŰËĹŚy“":8Ů}Óµ¸*żýfź#qĐÖ=mËŚ(˘NWńÖ}̤·ĘΓÔ™!ńᇟj˛Ú¦Ż}~u>Jé7Ł}č…q׺ż®řkü~„uM^ ÖpĘ˝žěîĂë7ĆcĄKĚ`SCeň¸oUĽ‚•ş&ĚGčϰÎÎź‘k˛ěšj¨Íă[YŔ›ąC fëH©©ŐČB+'ŘwLt]îőY꼄Ż«ěQ¶6T¤1N1‚-É4’nč>Ěĺýv„[”â<¤”ęaDŮ©+=}+Ę~VUŽYl_ľ TT/¸IŹcűA‹ŮŔJ†6^^ľY‘ś +¦ľnÖ‘TBAë–ăѤÍH޸}“ć>7ŚđwćY‘^K°!Ї ‚Ň´řďş=)'ťAĘ2ďhś0ĐJë wť° [Úćf%4m™‚1őQ˛ď~jâĐhťľQó†ÇľqĚ`ýٶjo G´±ń±ZµŤ…ü¬a„Ź#””ar(Äş2iz^ćÇÁ«á× ]q¤ÜŰď´ŚűřűŚŘŠĚťEeÇßD¸ĆBBĆiW5Ě–Őqľ!¸©ÁމćCýÇłÖ,máąaűňżöä>đ/Ź©î,N˘W$íś ń:#m+žY.Ě9źG_ž˝Űújůj˝fôq¬‰Ő”T(ROĂO’FćÄŮGëMŃżP!ŁŚH<Đ|ý¬Z@2ÁPéüŕăÄ·ĺv{/CçhtÂ7ę+^ÝĎóRŮ[›€0#ľ÷=C{['áęA/²… ¨űÚś3n ‚Ű9Ú˛¸Ś×ďë÷żĘ±Äö(9ąSᬀ˝ť¬Ĺs“Ź›zŃ ;ŻÔ‡0U™%’fôZeşăşĚŚq?˙¬fÁYŽ0xŠ4E޸‘j±%ĺ4ÓÓmr#›µĆ÷ý1·ŐAňąŮÝÜ.a[ţýl lťÄů~•p¬4Át>-°Ë0Pě×BÁńăő]%IWĚ»Hý»L?Âxł7ł[ăťpC†WCL$¶§D–H r!‚+°Â/ ´9Ć; Ôkl|—ÉmId¤ń«˝Ô#ăMËOJ^ú &Îâ’N {Ń–9&˝­Ö±Ç&ę­ŞÄóy îZäŁÎyşŚˇrz?l>=]‹Çn§yřĄĎϵg›ÝG±şh\F5ĺË´ŞŚ3çä`čŘčéiX3«.áŤÜbÍpŔCÄ;V L;PčÓi30Ţs÷©â xăkü$ří µX×cnŠ'}•~sC¤Sď„Ĺë-PXĎžá)śŁUâ®)ą˘Ů ą˛/@Ůł@mVĚ“/– đÝö íl€Ő»©ŻÁěvŢrü÷ŇĆÜ’AyŽ&.á! 0[†“˝áŻŻ*ľáÚ=Í/­^b]TŽ]ŁM¦ÍfŞ×—ˇEMvĺ—WęĂIo ÷-ĺqîyčË%.ž˘śd‘5?ČYˇ®cFďŤĐÁěD ábń%ډ¨ďv™ľž¤ţ™”*Í»±ť7ň‘’Ö\ÍŐä!nV„éz,iyܶ-|>Ő‚V€Đ•Š”ćčiNĎ^ö§ţÜ żë7fî…AECčđs—ę»îq@ÁŇŔËÍĽó‡Ń»ćáG˛Č,÷225wTÄaDĎ<µ~Ö†<šŚ“ŇâŘUebRľ ‡`ŁË’ńu#ˇqŻ‚­J%4ůöą…i{–’~‡€âB´UHo\“ÁÔĘaí(o¦Ť®"^źű±‡;ĎůÂv6îŔsťyőíŢíŞÉ^«F®6şĘý÷Đ'–ămIDőÜ:QśT…u•»Ök}ç¸^;=}fľ.r±o^3çŐăţóŰĄUšÍ|l)Ő]ßi $©·áŽć‰cHuvEćę['iŃ`¸č©Ť=5ŇâEÚ ŽGĎŰ[§©ßreť«úŹŮí÷/éٸZÄýZ{eDN#ŰcŞTđŽjÜDÔüZ9'Zi KVń’°ĺśvë||›ŚL!ś Ě ąŽËŢ­ Xo±+B*{ÚĆüÎ}ąk„iŮŠ6E{ů5b1NžŽ5+Gś4 +˘ŞĹݞiîĘ$ăńę#DĎňĹ»ą Ř¤ ž_ňĹWʼn§;űĹ9O.ížc˝®Ä­JĽ”ó†\ý|s* –]g÷Íyż¦ĐUyŕ×JÎxĎ„y]|i-«rLM„I%Ń/kzŹHM‚°7 â“ÉaŹčŻ´¤u:?*rć>DĆŠ`ÜGFˇ†ĆK ú%m\ŕ\e+*«Ŕ©»}®ŕĽÖÜ~K—žE”żNĹ$đőŠÖ7Cmôno6íďj=mMÎ'OYŇ–ůjRű¦mĆBÓî[ÄX ׸ť™VőŕĚ*çľ˝=•ó’jQŻ5°jČ,‹;±tFůNşÂHěY6n*Í).ü%ß9W N:ż¶őwd?«)aŘőć„f|Ú>Lůa39EGrQk÷Ž*¤WWů©đ‡ŕ†e‹;ˇĄáp­S`HS¬×V¬Ćq[µ“¸!ňŻî§v§·d Ońs74sëříšz˛VäIyz°¶„ ¤¦c WÄÇt ÚÂ`T.·3ďumn5ÄM!§EňŘ qbO{É~‡Ëę@Ěa˝ôV-}Ś˘!„ŹňëŘ‹U VDY[ŢüG°%^•ŮĘ`YÎNÉç&ˇ¸Łă\źF0(ľá­ś–?ăhlÎ}"VĚŞ… ¬ĺ¤=éÓWsř—¬0:ÔGžĚ lźź5Ăm˝oßSű5"ŘŽ›0HLťZ Uł|¸= „”gm­–߻쨚R>9˝śYl$=ÓçËJ- Ë`QőL˘ůuĺbm[©%¦ôŁÄwĄő}V.irˇ:RA+`BŢ/›K©);¨üLaywŻË]»ús źg$FŃ—@FőRJĹÚYĆŁ0gźý°łľ:¸ĺx¤°\RĐÎńVçďh™ř˘/Ť&.€-ŞĘm D0ÄüqýÄĹciłźy±Ň ±óŻČéÝÉSó¶ďłUdź0jf®˝¨ ˝Áş|8 ék:şĆ.zĎÖ™Od"÷3°É\dK±ă©El;1!´_˝µEtßVP”z˘6vŐÚ|PVö·Ő×GQ#s46PŠé}Ž˙ÜU´}J&1Pč”sB5)쩪SŠá—™NÓQ4÷e›xpńáę×%ť§†ńGň±Wą°´ëýjžŮăm}W "¨jMžńĹW˛pś†_{HX0P˘ŠžŘ)ś7ţÂUĄ-¦µ~űB˛f—†ŕíŇ~p¬’xpahź–°D1MŻb| O!ʵ ?íä¤Çš'ń‡×Y)ń'•č{—§c/‘D7ŁÂ/îΉ\nÄ”“ôć ’Ď^Ě=,"R[’‰c؆ÉQŁŘCDÂďpU¶ĂAx=ƵSŇÖ^3—ˇjďÇřBGŁ:ůl§O‹Ť”ZřÍ$J¨lÖdZgx>ŹÍ=νć÷c–8očK”?#b˘$Ţé/·ąĽŘŐľ Ty˝ű=‘Päu!çf^ŞőѡřŮ˝b2©g–]čP48~,éćéř őťĘ „íĺW˛’Çfžm3~ň 6&ş­hLě.xr-í¦..™uç‘‚FĽK^℟ׄ¤¦ö ~łXĄ¶ür´C›D$|çŐ‹(_.{*Ž;í©lňňúHüßçż#†s×ţ&€Vé9w 60¨Ł1@ĂkjHK|7HBO­Ž‘ßJiť>lűő»ű{YË:úşś»â5r%ţÍv‘Ős…;ß\ACg„ĺ!łwÖwošĚoűˇşÖ”©8ÜńqŃź··™˘ Y^Óŕ/ĚŁhk±™.ř\Ą—Ű43Ú§s%ä‹‹9?鲒îä ”“WjÜčE\1ęâ˛Ë\#ĚWźÚ%.Ňťró¸Ö ’ÝCKDÚ, ĐçĚ´y۵…ÝÁÁîI–éŕÝ·Ť’®őĽöoZ‹8/Bea#}-Ă*ŁŻ3•˛+ëaç^‡Aba®żoZpÁjŔTдש­YchUWľgĺx7× ulҢÚ#ڞÍ(ě:’)6w;ä2}מ*`©«ő ßúőyŇř2(śba’ôťôŻ[®–î%¤Ń+˘wh#!=»q÷MHñ±×W—yČ«Ö_KłĺĹW‚ÍK^¤‚Sp$ňżü0z ÷ż¸xtˇ°@b«}¨{§ëü ‚űÍg&0mÝI¦dëVpş¶y ö‚e e€–żG¨†6*ëîË€+WtůĎCŕe˙ńN.©ý°SŹBbĽ1ňěĄGDb2„DňőRśąuŐ鞍ŢĆ.ŔO¬iŐÚGĽ›ŻLźä-Ně#ߨ±ël6ř Ä^ľaŢŞF? Îág7ÁpĂ|Etú>Möň+]ôQ™ďĽ¶kűV‚+¤O8–¶T·âĺúEĚ=âŞCvTúUĆm Ő:ŞáŠ©:ŁŚ®ż`šĐ˛zĺô—f÷é¨Ń¤ąHlĂ Ţď:_m}îŃ©rś^p­ÂŚ? ¬‚ŻŞśu(ęú§ŠęŮVĽşČŐD8řÖG*·iďąÓOĚĄůŮíÚů !:;'?M™#Óâ'7ĄiźüSOŤeg±Á+”ËŢ覙஛dsz:úYJLaÁđV41á˛6`±ÖĂŮVĂŹÝč„âęąk[ŰËšiÇřnăئÇ=»R'ţČh}™¸‰á5xQĹÜ™g»čýĺH™ěO/SĄk/„7=8żĄěÂJpYĘĚŔÍÇNôs|âR÷¶C2žő9ď—]Ě‘©Őť"©·2ĐĹÇŃęG<Đř1fVuž‘\dľ-Ó‡‹šú™Ţ·°\Ś­ÍDą÷=/zÖ IG;‡#Ť<^ő¤Íz¤qľZŚoX´üźęň×őäSš¶§öŕζ=S†—ŕ‰Ú¨E>ú6ú‹ÉŰâĘązÔ_Ń8ćj´ć†KÓôGoNňĽĂ·‘ÜôľčD]^I©_Ąćé>xCI^jxT-Ľ3<¶´1Ĺ.Ł+€g*(š†—żĘ\h>Ž1Ű0 Ł”)†ËŕôĹŰĂ0_m đŕ=ÂŕÓbY”^`d–Ď“¨ §qŹMVW a«‘ f,px`“‡ČyµAĄücÁ›uůó?ÍGŇĚ 0G:pBŚÇŐz9ßÄ*řNç/aŻ"üüQăw­>ţ”ŁŕŇeŹgcˇ•â”qs»2ĽÚŞĘüŐO!Ô'ĂÎ!D𪲟Nt“aëXÖ±ôHJ}Ř(YĐÍM™7AÚcôÍ^c©řŽÁŞ†Ň ŮAŃG]t¸×Oždď“B^ýńOÜŠ\ŰÄ`˝bbĎčX?Šę鵝R–ňmWN~ě‘ßLXťr `gY¬Ü9>RćLű‰.ă`ĐŚź­5.ç`óV6˙ÉoM„‚śO“ŰŻĄŻ‡7X»AJˇFę’Ë—Ňf‚“QNúIÂÁÜ€ŐĆ대d˝}Ů~Ź•KHVämyŠ<óÖ«:rťŞÝ„Z+b]u÷lç·>%@d>!FË;ő /<ĽD˛ŢÖvŠuĐ«ŁčË{Ăp%ÖĽbŐ{ä;#Q0yŻpžV©•"csĎ®d‡Ĩa­^°guAji&Ńç|ť_zVÎW„™>Đ3ĘŕOŻ®,řü=Ý:řŕËŔĽW »6n€ %‚ä{rź"˝6Ą~=O¬é0ÎA§I·ËJ–UÎ˙Ăę˙řBŔÂhćě q0s¶Cý_>Lxendstream endobj 6 0 obj << /Type /Font /Subtype /Type1 /Encoding 215 0 R /FirstChar 11 /LastChar 121 /Widths 222 0 R /BaseFont /FICWPX+CMBX12 /FontDescriptor 4 0 R >> endobj 4 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /FICWPX+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/ff/fi/hyphen/period/one/two/A/B/C/D/E/F/I/L/M/N/O/P/R/S/T/U/V/X/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/x/y) /FontFile 5 0 R >> endobj 222 0 obj [656 625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 375 313 0 0 563 563 0 0 0 0 0 0 0 0 0 0 0 0 0 0 850 800 813 862 738 707 0 0 419 0 0 676 1067 880 845 769 0 839 625 782 865 850 0 850 0 0 0 0 0 0 0 0 547 625 500 625 513 344 563 625 313 0 0 313 938 625 563 625 0 459 444 438 625 594 813 594 594 ] endobj 7 0 obj << /Type /Pages /Count 6 /Parent 223 0 R /Kids [2 0 R 9 0 R 27 0 R 30 0 R 39 0 R 45 0 R] >> endobj 53 0 obj << /Type /Pages /Count 6 /Parent 223 0 R /Kids [48 0 R 55 0 R 58 0 R 61 0 R 64 0 R 67 0 R] >> endobj 72 0 obj << /Type /Pages /Count 6 /Parent 223 0 R /Kids [70 0 R 74 0 R 77 0 R 80 0 R 83 0 R 86 0 R] >> endobj 91 0 obj << /Type /Pages /Count 6 /Parent 223 0 R /Kids [89 0 R 93 0 R 96 0 R 99 0 R 102 0 R 105 0 R] >> endobj 110 0 obj << /Type /Pages /Count 6 /Parent 223 0 R /Kids [108 0 R 112 0 R 115 0 R 118 0 R 121 0 R 124 0 R] >> endobj 129 0 obj << /Type /Pages /Count 6 /Parent 223 0 R /Kids [127 0 R 131 0 R 134 0 R 137 0 R 140 0 R 143 0 R] >> endobj 148 0 obj << /Type /Pages /Count 6 /Parent 224 0 R /Kids [146 0 R 150 0 R 153 0 R 156 0 R 159 0 R 162 0 R] >> endobj 167 0 obj << /Type /Pages /Count 6 /Parent 224 0 R /Kids [165 0 R 169 0 R 172 0 R 175 0 R 178 0 R 181 0 R] >> endobj 186 0 obj << /Type /Pages /Count 6 /Parent 224 0 R /Kids [184 0 R 188 0 R 191 0 R 194 0 R 197 0 R 200 0 R] >> endobj 205 0 obj << /Type /Pages /Count 2 /Parent 224 0 R /Kids [203 0 R 207 0 R] >> endobj 223 0 obj << /Type /Pages /Count 36 /Parent 225 0 R /Kids [7 0 R 53 0 R 72 0 R 91 0 R 110 0 R 129 0 R] >> endobj 224 0 obj << /Type /Pages /Count 20 /Parent 225 0 R /Kids [148 0 R 167 0 R 186 0 R 205 0 R] >> endobj 225 0 obj << /Type /Pages /Count 56 /Kids [223 0 R 224 0 R] >> endobj 226 0 obj << /Type /Catalog /Pages 225 0 R /PTEX.Fullbanner (This is pdfTeX, Version 3.14159-1.10b) >> endobj 227 0 obj << /Producer (pdfTeX-1.10b) /Creator (TeX) /CreationDate (D:20060704165800) >> endobj xref 0 228 0000000000 65535 f 0000000270 00000 n 0000000159 00000 n 0000000009 00000 n 0000235422 00000 n 0000226532 00000 n 0000235264 00000 n 0000236058 00000 n 0000001385 00000 n 0000001273 00000 n 0000000338 00000 n 0000225850 00000 n 0000215596 00000 n 0000225691 00000 n 0000214908 00000 n 0000203342 00000 n 0000214748 00000 n 0000202477 00000 n 0000186927 00000 n 0000202318 00000 n 0000186278 00000 n 0000173976 00000 n 0000186118 00000 n 0000173493 00000 n 0000168908 00000 n 0000173334 00000 n 0000002240 00000 n 0000002126 00000 n 0000001512 00000 n 0000004359 00000 n 0000004245 00000 n 0000002345 00000 n 0000168591 00000 n 0000165004 00000 n 0000168433 00000 n 0000163393 00000 n 0000152515 00000 n 0000163233 00000 n 0000006709 00000 n 0000006595 00000 n 0000004487 00000 n 0000151270 00000 n 0000149866 00000 n 0000151111 00000 n 0000007498 00000 n 0000007384 00000 n 0000006825 00000 n 0000010308 00000 n 0000010193 00000 n 0000007614 00000 n 0000147795 00000 n 0000141448 00000 n 0000147635 00000 n 0000236165 00000 n 0000013151 00000 n 0000013036 00000 n 0000010448 00000 n 0000016297 00000 n 0000016182 00000 n 0000013256 00000 n 0000018816 00000 n 0000018701 00000 n 0000016437 00000 n 0000021187 00000 n 0000021072 00000 n 0000018980 00000 n 0000023538 00000 n 0000023423 00000 n 0000021351 00000 n 0000025960 00000 n 0000025845 00000 n 0000023690 00000 n 0000236275 00000 n 0000029029 00000 n 0000028914 00000 n 0000026112 00000 n 0000031955 00000 n 0000031840 00000 n 0000029181 00000 n 0000034848 00000 n 0000034733 00000 n 0000032107 00000 n 0000037548 00000 n 0000037433 00000 n 0000035012 00000 n 0000040388 00000 n 0000040273 00000 n 0000037712 00000 n 0000043087 00000 n 0000042972 00000 n 0000040552 00000 n 0000236385 00000 n 0000045630 00000 n 0000045515 00000 n 0000043251 00000 n 0000048037 00000 n 0000047922 00000 n 0000045794 00000 n 0000050343 00000 n 0000050227 00000 n 0000048201 00000 n 0000052306 00000 n 0000052188 00000 n 0000050448 00000 n 0000055163 00000 n 0000055045 00000 n 0000052412 00000 n 0000058022 00000 n 0000057903 00000 n 0000055316 00000 n 0000236497 00000 n 0000061158 00000 n 0000061039 00000 n 0000058187 00000 n 0000063925 00000 n 0000063806 00000 n 0000061323 00000 n 0000066429 00000 n 0000066310 00000 n 0000064090 00000 n 0000069590 00000 n 0000069471 00000 n 0000066582 00000 n 0000072500 00000 n 0000072381 00000 n 0000069755 00000 n 0000075572 00000 n 0000075453 00000 n 0000072665 00000 n 0000236614 00000 n 0000078471 00000 n 0000078352 00000 n 0000075737 00000 n 0000081620 00000 n 0000081501 00000 n 0000078624 00000 n 0000084223 00000 n 0000084104 00000 n 0000081785 00000 n 0000087120 00000 n 0000087001 00000 n 0000084329 00000 n 0000089397 00000 n 0000089278 00000 n 0000087273 00000 n 0000091891 00000 n 0000091772 00000 n 0000089550 00000 n 0000236731 00000 n 0000094915 00000 n 0000094796 00000 n 0000092056 00000 n 0000097816 00000 n 0000097697 00000 n 0000095080 00000 n 0000100845 00000 n 0000100726 00000 n 0000097981 00000 n 0000103283 00000 n 0000103164 00000 n 0000101010 00000 n 0000106534 00000 n 0000106415 00000 n 0000103448 00000 n 0000109213 00000 n 0000109094 00000 n 0000106699 00000 n 0000236848 00000 n 0000111405 00000 n 0000111286 00000 n 0000109366 00000 n 0000113896 00000 n 0000113777 00000 n 0000111546 00000 n 0000116324 00000 n 0000116205 00000 n 0000114037 00000 n 0000118440 00000 n 0000118321 00000 n 0000116477 00000 n 0000121116 00000 n 0000120997 00000 n 0000118593 00000 n 0000123870 00000 n 0000123751 00000 n 0000121269 00000 n 0000236965 00000 n 0000125758 00000 n 0000125639 00000 n 0000124035 00000 n 0000128276 00000 n 0000128157 00000 n 0000125911 00000 n 0000130849 00000 n 0000130730 00000 n 0000128405 00000 n 0000133542 00000 n 0000133423 00000 n 0000131002 00000 n 0000136336 00000 n 0000136217 00000 n 0000133695 00000 n 0000138705 00000 n 0000138586 00000 n 0000136501 00000 n 0000237082 00000 n 0000140347 00000 n 0000140228 00000 n 0000138870 00000 n 0000140500 00000 n 0000148037 00000 n 0000148209 00000 n 0000151473 00000 n 0000151497 00000 n 0000163754 00000 n 0000164058 00000 n 0000168842 00000 n 0000173752 00000 n 0000186587 00000 n 0000202947 00000 n 0000215247 00000 n 0000226188 00000 n 0000235723 00000 n 0000237167 00000 n 0000237280 00000 n 0000237382 00000 n 0000237452 00000 n 0000237562 00000 n trailer << /Size 228 /Root 226 0 R /Info 227 0 R >> startxref 237658 %%EOF libupnp-1.8.0~svn20100507/ixml/0000777000175000017500000000000011373047470012721 500000000000000libupnp-1.8.0~svn20100507/ixml/doc/0000777000175000017500000000000011373047470013466 500000000000000libupnp-1.8.0~svn20100507/ixml/doc/intro.dxx0000644000175000017500000000263211021325545015255 00000000000000/**@name Introduction * The Linux DOM2 XML Parser Version 1.2 (IXML) is a lightweight, portable XML * parser supporting the standard Document Object Model (DOM) Level 2 * interfaces. The parser uses a C-style interface, making it idea for small, * embedded applications. This document describes the interfaces supported by * IXML 1.2, referencing the W3C DOM2 recommendations when necessary, and the * additional utility application programming interfaces (APIs) that it * supports. * * Note that this document assumes that the reader has a copy of the DOM2-Core * recommendation. Refer to the link below to obtain a copy. Only a brief * description is included here and the reader is pointed to the DOM2-Core * recommendation for more details. This document does, however, clarify * IXML-specific behavior when the recommendation is unclear. * * {\bf About DOM} * * The Document Object Model (DOM) is a set of interfaces that give a * programmatic interface to documents. It provides a platform-neutral and * language-neutral interface for random access and updating elements inside * XML documents. DOM Level 1 provided the basic interfaces to access * document elements. DOM Level 2 extended the interfaces to provide proper * support for XML namespaces. * * The latest DOM 2 recommendation is maintained by W3C and is available from * {\tt http://www.w3.org/TR/DOM-Level-2-Core}. */ libupnp-1.8.0~svn20100507/ixml/doc/ixml.dxx0000644000175000017500000000045011021325545015067 00000000000000/**@name IXML v1.2 * \begin{center} * {\bf Linux DOM2 XML Parser Version 1.2} * * Copyright (C) 2000-2003 Intel Corporation ALL RIGHTS RESERVED * * Revision 1.2.1 (\Date) * \end{center} */ //@{ //@Include: intro.dxx //@Include: license.dxx //@Include: ../inc/ixml.h //@} libupnp-1.8.0~svn20100507/ixml/doc/docxx.sty0000644000175000017500000007074111021325545015271 00000000000000% docxx.sty % % Copyright (c) 1996 Roland Wunderling, Malte Zoeckler % Copyright (c) 1999-2001 Dragos Acostachioaie % % This file is part of DOC++. % % DOC++ 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 of the license, 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, write to the Free % Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. % % % Switch off special characters except {}\ for the rest of the text. % \def\cxxtilde{{\tt\~\relax}} \addtolength{\parskip}{6pt} \catcode`\,=\active% \def,{\char`\,\penalty-8\ } %\def,{++ } \catcode`\,=12 \def\<{{\tt <}} \def\>{{\tt >}} \def\TEX{} \def\cxxExceptionsStr{} \def\cxxParameterStr{} \def\cxxReturnStr{} \def\cxxInvariantsStr{} \def\cxxPreconditionsStr{} \def\cxxPostconditionsStr{} \def\cxxSeeStr{} \def\cxxAuthorStr{} \def\cxxVersionStr{} \def\cxxDeprecatedStr{} \def\cxxSinceStr{} \def\cxxFileStr{} \def\cxxExceptions#1{\def\cxxExceptionsStr{#1}} \def\cxxParameter#1{\def\cxxParameterStr{#1}} \def\cxxReturn#1{\def\cxxReturnStr{#1}} \def\cxxInvariants#1{\def\cxxInvariantsStr{#1}} \def\cxxPreconditions#1{\def\cxxPreconditionsStr{#1}} \def\cxxPostconditions#1{\def\cxxPostconditionsStr{#1}} \def\cxxSee#1{\def\cxxSeeStr{#1}} \def\cxxAuthor#1{\def\cxxAuthorStr{#1}} \def\cxxVersion#1{\def\cxxVersionStr{#1}} \def\cxxDeprecated#1{\def\cxxDeprecatedStr{#1}} \def\cxxSince#1{\def\cxxSinceStr{#1}} \def\cxxFile#1{\def\cxxFileStr{#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Define ... to do verbatim listing % \catcode`\=\active \catcode`\=\active {\obeyspaces\gdef {\ }} \def\ccverbatim{\strut\begingroup \catcode`\\=12 \catcode`\{=12 \catcode`\}=12 \catcode`\$=12 \catcode`\&=12 \catcode`\#=12 \catcode`\%=12 \catcode`\~=12 \catcode`\_=12 \catcode`\^=12 \catcode`\|=12 \catcode`\/=12 \obeyspaces\tt} \def{\let\par=\endgraf \ccverbatim \parskip=0pt \ccfinish} {\catcode`\=0 catcode`\=12 gdefccfinish#1{#1endgroup}} % % Definition of structuring comands. % \newcommand{\Section}[1]{\section{#1}} \newcommand{\SubSection}[1]{\subsection{#1}} \newcommand{\SubSubSection}[1]{\subsubsection{#1}} \newcommand{\Paragraph}[1]{\paragraph{#1}} \newcommand{\Ref}[1]{{\bf #1} ($\rightarrow$ \ref{#1})} \newcommand{\URL}[2][]{% \def\name{#1}% \def\empty{}% \ifx\name\empty% {\tt #2}% \else% #1 ({\tt #2})% \fi% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % printing line #1 of code #2 % \newdimen\cxxcodewidth \cxxcodewidth=\textwidth \advance\cxxcodewidth by -21pt \def\cxxCodeLine#1#2{% {\hbox to 20pt{\tiny\hss#1}\parbox[t]{\cxxcodewidth}{\small#2}}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for listing manual entries % \newdimen\cxxIdWidth \newdimen\cxxTypeWidth \newdimen\cxxProtoWidth \newdimen\cxxMemoWidth \newdimen\cxxPageWidth \cxxIdWidth=0.1\textwidth \cxxTypeWidth=0.15\textwidth \cxxProtoWidth=0.25\textwidth \cxxMemoWidth=0.43\textwidth \cxxPageWidth=\textwidth \advance\cxxPageWidth by-\cxxIdWidth \advance\cxxPageWidth by-\cxxTypeWidth \advance\cxxPageWidth by-\cxxProtoWidth \advance\cxxPageWidth by-\cxxMemoWidth \newdimen\cxxProtoMemoWidth \cxxProtoMemoWidth=\cxxProtoWidth \advance\cxxProtoMemoWidth by\cxxMemoWidth \def\cxxStrut{\vrule width0pt height0pt depth9pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1: type % 2: name % 3: args % 4: memo % 5: id \def\cxxitem#1#2#3#4#5{\noindent{% \setbox5\hbox{#5 }% \ifdim\wd5>\cxxIdWidth% \setbox5\hbox{\hbox to \cxxIdWidth{\hss#5}}% \else \setbox5\hbox{\hbox to \cxxIdWidth{#5\hss}}% \fi% \setbox1\hbox{{% \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}#1% }}% \setbox2\hbox{{% \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}\textbf{#2} #3% }}% \setbox4\hbox{\parbox[t]{\cxxMemoWidth}{{% \raggedright\sloppy% \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}{\em #4} \cxxStrut% \def\page{#5}% \ifx\page\empty% \hss% \else% \ \dotfill% \hbox to 0pt{\hbox to \cxxPageWidth{\hss% \pageref{cxx.#5}% }\hss}% \fi% }}}% % \ifdim\wd1>\cxxTypeWidth% \hbox to \hsize{\unhbox5\hbox to \cxxTypeWidth{\unhbox1\hss}\hss}\\\nopagebreak% \setbox5\hbox{\hskip\cxxIdWidth}% \setbox1\hbox{\hskip\cxxTypeWidth}% \else% \setbox1\hbox{\hbox to \cxxTypeWidth{\unhbox1\hss}}% \fi% \ifdim\wd2>\cxxProtoWidth% \ifdim\wd2<\cxxProtoMemoWidth% \def\tmp{#4}% \ifx\tmp\empty% \def\tmp{#5}% \ifx\tmp\empty% \hbox to \hsize{\unhbox5\unhbox1\unhbox2\hss\cxxStrut}\\% \else% \hbox to \hsize{\unhbox5\unhbox1\unhbox2 \dotfill\hbox to \cxxPageWidth{\hss\pageref{cxx.#5}}% \cxxStrut}\\% \fi% \else% \hbox to \hsize{\unhbox5\unhbox1\unhbox2\hss}\\\nopagebreak% \hbox to \hsize{% \hskip\cxxIdWidth% \hskip\cxxTypeWidth% \hskip\cxxProtoWidth% \unhbox4\hss% }\\% \fi% \else% \hbox to \hsize{% \unhbox5% \unhbox1% \parbox[t]{\cxxProtoMemoWidth}{% \setbox255\hbox{\textbf{#2} (}% \hangindent=\wd255\hangafter=1% \raggedright\sloppy% {\catcode`\&=4\catcode`\_=8% \def{\ccverbatim \ccfinish}\textbf{#2} #3\strut}% }\hss% }\\\nopagebreak% \hbox to \hsize{% \hskip\cxxIdWidth% \hskip\cxxTypeWidth% \hskip\cxxProtoWidth% \unhbox4\hss% }\\% \fi% \else% \hbox to \hsize{% \unhbox5% \unhbox1% \hbox to \cxxProtoWidth{\unhbox2\hss}% \unhbox4\hss% }\\% \fi% }} \newdimen\cxxtypestart \cxxtypestart=0.05\textwidth %\advance\cxxtypestart by \labelsep \newdimen\cxxnamestart \cxxnamestart=\cxxtypestart \advance\cxxnamestart by 0.25\textwidth \newdimen\cxxargsstart \cxxargsstart=\cxxnamestart \advance\cxxargsstart by 0.2\textwidth \newdimen\cxxargswidth \cxxargswidth=\textwidth \advance\cxxargswidth by -\cxxargsstart \advance\cxxargswidth by -\spaceskip \newdimen\cxxmemostart \cxxmemostart=\cxxargsstart \advance\cxxmemostart by 0.12\textwidth \newenvironment{cxxlist}[1]{ \begingroup \catcode`\,=\active% \paragraph{#1}\strut\smallskip\\ }{ \endgroup } \newenvironment{cxxnames}{\begin{cxxlist}{Names}}{\end{cxxlist}} \newenvironment{cxxpublic}{\begin{cxxlist}{Public Members}}{\end{cxxlist}} \newenvironment{cxxprivate}{\begin{cxxlist}{Private Members}}{\end{cxxlist}} \newenvironment{cxxprotected}{\begin{cxxlist}{Protected Members}}{\end{cxxlist}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Numbered Frame box % \newlength{\cxxBoxLen}% \newlength{\cxxBoxHt}% \newlength{\cxxBoxDp}% \newlength{\cxxSideHt}% \newlength{\cxxSideLen}% \newlength{\cxxTitleLen}% \def\empty{} \def\idPos{1cm} % % box with id and name [optional width] % \newcommand{\aBox}[3][1pt]{{% \small% \def\width{#1}% \def\num{#2}% \def\name{#3}% \setbox0\hbox{\hskip\width{ \strut\name\strut} \hskip\width}% % \setlength{\cxxBoxLen}{\wd0}% \addtolength{\cxxBoxLen}{\width}% \addtolength{\cxxBoxLen}{\width}% \setbox2\hbox{\normalsize\strut\rule{\cxxBoxLen}{\width}}% % \ifx\num\empty% \setbox1\hbox{\strut}% \else% \setbox1\hbox{\rule{\idPos}{\width} { \sf\bf\strut #2 } }% \fi% \addtolength{\cxxBoxLen}{-\wd1}% \setbox1\hbox{\unhbox1\rule{\cxxBoxLen}{\width}}% % \setlength{\cxxSideHt}{\dp0}% \addtolength{\cxxSideHt}{\width}% \setlength{\cxxSideLen}{\dp0}% \addtolength{\cxxSideLen}{\ht0}% \addtolength{\cxxSideLen}{\dp1}% \addtolength{\cxxSideLen}{\width}% \addtolength{\cxxSideLen}{\width}% \setbox3\hbox{\hbox to 0pt{\hss\rule[-\cxxSideHt]{\width}{\cxxSideLen}}}% \setbox4\hbox{\hbox to 0pt{\rule[-\cxxSideHt]{\width}{\cxxSideLen}\hss}}% % \setlength{\cxxBoxHt}{\dp1}% \addtolength{\cxxBoxHt}{1pt}% \setlength{\cxxBoxDp}{\ht2}% \addtolength{\cxxBoxDp}{-\width}% \addtolength{\cxxBoxDp}{1pt}% % \setlength{\cxxBoxLen}{\ht3}% \addtolength{\cxxBoxLen}{\ht1}% % \vbox to \cxxBoxLen{% \hbox{\unhbox1}% \vskip-\cxxBoxHt% \hbox{\hskip\width\unhbox3\unhbox0\unhbox4}% %\vskip-\ht2% \vskip-\cxxBoxDp% \hbox{\unhbox2}% \vss% }% }} % % box with id and name [optional width] of size #4 % \newcommand{\sizeBox}[4][3pt]{{% \setbox0\hbox{ }% \setlength{\cxxSideLen}{#4}% \addtolength{\cxxSideLen}{-\wd0}% \addtolength{\cxxSideLen}{-\wd0}% \addtolength{\cxxSideLen}{-#1}% \addtolength{\cxxSideLen}{-#1}% \addtolength{\cxxSideLen}{-#1}% \addtolength{\cxxSideLen}{-#1}% \aBox[#1]{#2}{\hbox to \cxxSideLen{#3}}% }} % % centered box with id and name [optional width] of size #4 % \newcommand{\cBox}[4][3pt]{{% \setbox0\hbox{\aBox[#1]{#2}{#3}}% \ifdim\wd0<#4% \sizeBox[#1]{#2}{\hss#3\hss}{#4}% \else% \setlength{\cxxSideLen}{\wd0}% \advance\cxxSideLen by -#4% \hskip -0.5\cxxSideLen% \unhbox0% \fi% }} % % right expanding box with id and name [optional width] of size at least #4 % \newcommand{\rBox}[4][3pt]{{% \setbox0\hbox{\aBox[#1]{#2}{#3}\hss}% \ifdim\wd0>#4% \unhbox0% \else% \sizeBox[#1]{#2}{\hss#3\hss}{#4}% \fi% }} % % left expanding box with id and name [optional width] of size at least #4 % \newcommand{\lBox}[4][3pt]{{% \setbox0\hbox{\aBox[#1]{#2}{#3}\hss}% \ifdim\wd0>#4% \setlength{\cxxSideLen}{\wd0}% \advance\cxxSideLen by -#4% \hskip -\cxxSideLen% \unhbox0% \else% \sizeBox[#1]{#2}{\hss#3\hss}{#4}% \fi% }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Pagestyle for documentation. % \newsavebox{\cxxHeadName} \newcommand{\ps@docxx}{% \renewcommand{\@oddhead}{\headlinetext}% \renewcommand{\@evenhead}{\headlinetext}% \renewcommand{\@oddfoot}{\footlinetext}% \renewcommand{\@evenfoot}{\footlinetext}% } \newcommand{\makeHeadLine}[2]{ \global\sbox{\cxxHeadName}{\vbox to 0pt{\vss% \hbox to \textwidth{% \hbox to 0pt{\strut\hbox to 1cm{\hss}\quad#1\hss}% \hfil#2\hfil% }% \vskip 1pt% \hbox to \textwidth{\hrulefill}% }}% } \newcommand{\headlinetext}{\usebox{\cxxHeadName}} \providecommand{\cxxCopyright}{% \vtop{% \hbox to \textwidth{{ \tiny\sf This page was generated with the help of DOC++ \hss}}% \vskip -20pt \hbox to \textwidth{ \hbox{{\tiny\sf http://docpp.sourceforge.net}} \hss}% }% } \def\footlinetext{\hbox to \textwidth{ \vtop{% \hbox to \textwidth{\hrulefill}% \vskip -20pt% \cxxCopyright% }% \hss\vtop{\vskip 10pt\hbox{\today\hspace*{3cm}\textrm{\thepage} }} }} \pagestyle{docxx} \def\cxxTitle#1#2#3#4#5{\noindent{% \thispagestyle{empty} \vfill \begin{center} \Huge\bf \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}#1% \strut\\ \def{\ccverbatim \ccfinish}#2% \strut\\ \def{\ccverbatim \ccfinish}#3% \strut\\ \end{center} \if\cxxVersionStr\empty% \else% \begin{center} \small\sf --- Version \cxxVersionStr\ --- \end{center} \global\def\cxxVersionStr{} \fi \vfill \large \begin{center} \Large\em \def{\ccverbatim \ccfinish}#4% \end{center} \vfill \if\cxxAuthorStr\empty% \else% \begin{center} \sf\cxxAuthorStr \end{center} \global\def\cxxAuthorStr{} \vfill \fi \pagebreak \makeHeadLine{}{#2} }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for contents % \newcounter{cxxContentsDepth} \setcounter{cxxContentsDepth}{0} \newdimen\cxxContentsLengthIncr \cxxContentsLengthIncr=18pt \newdimen\cxxContentsLength \cxxContentsLength=\textwidth \advance\cxxContentsLength by -\cxxContentsLengthIncr \makeHeadLine{}{Contents} \newenvironment{cxxContents}{ \ifcase \value{cxxContentsDepth} \vskip 40pt \hbox to \hsize{\hskip 8pt\hskip\cxxContentsLengthIncr\Huge\bf Contents\hss} \vskip 40pt \bf \else % >1 \rm \fi \begingroup \addtocounter{cxxContentsDepth}{1} \advance\cxxContentsLengthIncr by 8pt \advance\cxxContentsLength by -\cxxContentsLengthIncr }{ \addtocounter{cxxContentsDepth}{-1} \advance\cxxContentsLength by \cxxContentsLengthIncr \advance\cxxContentsLengthIncr by -8pt \ifcase \value{cxxContentsDepth} \vskip 12pt \or \vskip 9pt \else \vskip 3pt \fi \endgroup } \newcommand{\cxxContentsEntry}[3]{{ \def\emtpty{} \def\memo{#3} \ifx\memo\empty \setbox0\hbox{\parbox[t]{\cxxContentsLength}{\strut#2 \dotfill }} \else \setbox0\hbox{\parbox[t]{\cxxContentsLength}{\strut#2 --- {\em #3} \dotfill }} \fi \setbox1\hbox{\vtop{\vskip\dp0\vskip-\ht0\vskip-1.5pt\hbox to 20pt{\hss\rm \pageref{cxx.#1}}}} \hbox to \textwidth{% \hss\hbox to \cxxContentsLengthIncr{#1\hss}% \unhbox0\unhbox1% } }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for class graph % \newdimen\cxxClassGraphShift \newdimen\cxxClassGraphLength \newdimen\cxxClassGraphHeight \newdimen\cxxClassGraphDepth \newdimen\cxxClassGraphTotV \setlength{\cxxClassGraphLength}{0.23\hsize} \setlength{\cxxClassGraphShift}{30pt} \setbox0\vbox{\aBox[5pt]{\strut}{\strut}} \setlength{\cxxClassGraphHeight}{\ht0} \setlength{\cxxClassGraphDepth}{\dp0} \addtolength{\cxxClassGraphDepth}{10pt} \setlength{\cxxClassGraphTotV}{\dp0} \addtolength{\cxxClassGraphTotV}{\ht0} \newenvironment{cxxInheritance}{ \par\medskip \begingroup \newcommand{\cxxCGSpace}[1]{% \vtop to \cxxClassGraphTotV{\hbox to \cxxClassGraphShift{% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##1}}% } \newcommand{\cxxSlashHline}{% \vrule width 0.1\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.1\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.1\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.1\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.1\cxxClassGraphShift height 3.5pt depth -3pt% } \newcommand{\cxxDotHline}{% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% } \newcommand{\cxxHline}{% \vrule width 0.5\cxxClassGraphShift height 3.5pt depth -3pt% } \newcommand{\cxxVup}{\hbox to 0pt{\hss% \vrule width 0.5pt height \cxxClassGraphHeight depth -3pt% \hss}} \newcommand{\cxxVlow}{\hbox to 0pt{\hss% \vtop to 0pt{\vskip-3pt% \hbox{\vrule width 0.5pt height 13pt depth \cxxClassGraphDepth}% \vss}% \hss}} \newcommand{\cxxLinkUp}{\hbox to 0pt{\hss\hskip 0.5\cxxClassGraphShift% \raise0.7\cxxClassGraphHeight\hbox to 0pt{\hss\textbf{\symbol{94}}\hss}}}% \newcommand{\cxxLinkDown}{\hbox to 0pt{\hss\hskip 0.5\cxxClassGraphShift% \raise-0.6\cxxClassGraphHeight\vbox to 0pt{% \hbox to 0pt{\hss\textbf{$\lor$}\hss}\vss}}}% \newcommand{\cxxLinkLeft}{\hbox to 0pt{\hss\hskip 0.0\cxxClassGraphShift% \raise0.0\cxxClassGraphHeight\hbox to 0pt{\textbf{\tt\<}\hss}}}% \newcommand{\cxxLinkRight}{\hbox to 0pt{\hss\hskip 1.0\cxxClassGraphShift% \raise0.0\cxxClassGraphHeight\hbox to 0pt{\hss\textbf{\tt\>}}}}% \newcommand{\cxxInheritanceEntry}[5][]{ \hbox to \hsize{\hss% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##2% \def\tmp{##1}% \ifx\tmp\empty% \def\tmp{##5}% \ifx\tmp\empty% \rBox[1pt]{##3}{##4}{0.24\hsize}% \else% \lBox[1pt]{##3}{##4}{0.24\hsize}% \fi% \else% \cBox[2pt]{##3}{##4}{0.24\hsize}% \fi% ##5\hfill% }\vskip-1pt } \newcommand{\cxxNone}{\cxxCGSpace{\hss}} \newcommand{\cxxLong}{\cxxCGSpace{\hss\cxxVup\cxxVlow\hss}} % \newcommand{\cxxPubLeft}{\cxxCGSpace{\cxxHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxProLeft}{\cxxCGSpace{\cxxSlashHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxPriLeft}{\cxxCGSpace{\cxxDotHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxPubleft}{\cxxCGSpace{\cxxHline\cxxVlow\hss}} \newcommand{\cxxProleft}{\cxxCGSpace{\cxxSlashHline\cxxVlow\hss}} \newcommand{\cxxPrileft}{\cxxCGSpace{\cxxDotHline\cxxVlow\hss}} \newcommand{\cxxLastPubLeft}{\cxxCGSpace{\cxxHline% \cxxVup\cxxLinkDown\cxxVlow\hss}} \newcommand{\cxxLastProLeft}{\cxxCGSpace{\cxxSlashHline% \cxxVup\cxxLinkDown\cxxVlow\hss}} \newcommand{\cxxLastPriLeft}{\cxxCGSpace{\cxxDotHline% \cxxVup\cxxLinkDown\cxxVlow\hss}} \newcommand{\cxxLastPubleft}{\cxxCGSpace{\cxxHline% \cxxVlow\cxxLinkDown\hss}} \newcommand{\cxxLastProleft}{\cxxCGSpace{\cxxSlashHline% \cxxVlow\cxxLinkDown\hss}} \newcommand{\cxxLastPrileft}{\cxxCGSpace{\cxxDotHline% \cxxVlow\cxxLinkDown\hss}} \newcommand{\cxxLinkPubLeft}{\cxxCGSpace{\cxxLinkLeft\cxxHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxLinkProLeft}{\cxxCGSpace{\cxxLinkLeft\cxxSlashHline% \cxxVup\cxxVlow\hss}} \newcommand{\cxxLinkPriLeft}{\cxxCGSpace{\cxxLinkLeft\cxxDotHline% \cxxVup\cxxVlow\hss}} \newcommand{\cxxLinkPubleft}{\cxxCGSpace{\cxxLinkLeft\cxxHline\cxxVlow\hss}} \newcommand{\cxxLinkProleft}{\cxxCGSpace{\cxxLinkLeft\cxxSlashHline\cxxVlow\hss}} \newcommand{\cxxLinkPrileft}{\cxxCGSpace{\cxxLinkLeft\cxxDotHline\cxxVlow\hss}} % \newcommand{\cxxPubRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxHline}} \newcommand{\cxxProRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxSlashHline}} \newcommand{\cxxPriRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxDotHline}} \newcommand{\cxxPubright}{\cxxCGSpace{\hss\cxxVup\cxxHline}} \newcommand{\cxxProright}{\cxxCGSpace{\hss\cxxVup\cxxSlashHline}} \newcommand{\cxxPriright}{\cxxCGSpace{\hss\cxxVup\cxxDotHline}} \newcommand{\cxxLinkPubRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxHline\cxxLinkRight}} \newcommand{\cxxLinkProRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow% \cxxSlashHline\cxxLinkRight}} \newcommand{\cxxLinkPriRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow% \cxxDotHline\cxxLinkRight}} \newcommand{\cxxLinkPubright}{\cxxCGSpace{\hss\cxxVup\cxxHline\cxxLinkRight}} \newcommand{\cxxLinkProright}{\cxxCGSpace{\hss\cxxVup\cxxSlashHline\cxxLinkRight}} \newcommand{\cxxLinkPriright}{\cxxCGSpace{\hss\cxxVup\cxxDotHline\cxxLinkRight}} \newcommand{\cxxFirstPubRight}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxVlow\cxxHline}} \newcommand{\cxxFirstProRight}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxVlow% \cxxSlashHline}} \newcommand{\cxxFirstPriRight}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxVlow\cxxDotHline}} \newcommand{\cxxFirstPubright}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxHline}} \newcommand{\cxxFirstProright}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxSlashHline}} \newcommand{\cxxFirstPriright}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxDotHline}} }{ \endgroup } \newenvironment{cxxClassGraph}{ \begin{cxxInheritance} \newcommand{\cxxClassGraphEntry}[4]{ \hbox to \hsize{\hss% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##1% \def\tmp{##4}% \rBox[1pt]{##2}{##3}{0.24\hsize}% ##4% \hskip\cxxClassGraphShift\dotfill% \hbox to \cxxClassGraphShift{\hss\pageref{cxx.##2}}% }\vskip-1pt } \newcommand{\cxxClassGraphEntryUnknownPackage}[3]{ \hbox to \hsize{\hss% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##1% \def\tmp{##3}% \rBox[1pt]{}{##2}{0.24\hsize}% ##3% \hskip\cxxClassGraphShift\hfill% }\vskip-1pt } \clearpage \pagebreak\strut \makeHeadLine{}{Class Graph} \vskip 20pt \hbox to \hsize{\Huge\bf \quad Class Graph\hss} \vskip 40pt } { \end{cxxInheritance} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for generic manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newdimen\cxxgenericstart \cxxgenericstart=\labelwidth \advance\cxxgenericstart by \labelsep \newdimen\cxxgenericwidth \cxxgenericwidth=\textwidth \advance\cxxgenericwidth by -\cxxgenericstart \newcounter{cxxDepth} \setcounter{cxxDepth}{0} \newlength{\cxxSize} \newenvironment{cxxgeneric}[5]{ % % some local definitions % \def\empty{} \def\type{#1} \def\args{#3} \def\memo{#4} \def\id {#5} % % pagebreak ? % \ifcase \value{cxxDepth} \clearpage % 0 \pagebreak \makeHeadLine{#5}{#2} \setlength{\cxxSize}{2pt} \or % 1 \strut\bigskip\bigskip\goodbreak% \setlength{\cxxSize}{1pt} \else % >2 \strut\bigskip\bigskip\goodbreak% \setlength{\cxxSize}{0.5pt} \fi \addtocounter{cxxDepth}{1} % % write synopsis % \setbox0\hbox{ }% \setbox1\hbox{\strut\large #1 {\bf#2} }% \setbox3\hbox{\strut\large #1 {\bf#2} #3}% % % box with id and name [optional width] over entire page width % \setlength{\cxxSideLen}{\hsize}% \addtolength{\cxxSideLen}{-4\cxxSize}% \addtolength{\cxxSideLen}{-2\wd0}% \setlength{\cxxTitleLen}{\cxxSideLen}% \addtolength{\cxxTitleLen}{-8\wd0}% \hbox{\aBox[\cxxSize]{\id}{\vbox{\vskip 1.5\parskip% \hbox to \cxxSideLen{\strut% \hbox to 4\wd0{}% \ifdim\wd3<\cxxTitleLen% \parbox[b]{\cxxTitleLen}{% \begin{raggedright} \noindent\large #1 {\bf#2} #3 \end{raggedright} } \else% \ifdim\wd1>0.7\cxxTitleLen% \parbox[b]{\cxxTitleLen}{% \begin{raggedright} \noindent\large #1 {\bf#2} #3 \end{raggedright} } \else% \addtolength{\cxxTitleLen}{-\wd1}% \unhbox1% \parbox[t]{\cxxTitleLen}{% \advance\lineskip 7pt% \begin{raggedright} \noindent\large\strut #3 \end{raggedright} } \fi% \fi% \hss\strut% }\vskip\parskip}% }} % \parbox[b]{\cxxSideLen}{\begingroup % \catcode`\&=12% % \catcode`\_=12% % \begin{flushleft} % \quad\large% % \ifx\type\empty % \ifx\args\empty % \strut{\bf #2}\\ % \else % \strut{\bf #2}\ \args % \fi % \else % \strut\type\ {\bf #2}\ \args % \fi % \end{flushleft} % \endgroup}}}% \ifx\memo\empty\else \vskip 10pt \begin{flushright} \it\memo \end{flushright} \fi \label{cxx.\id} \begingroup \def\cxxExceptionsStr{} \def\cxxParameterStr{} \def\cxxReturnStr{} \def\cxxInvariantsStr{} \def\cxxPreconditionsStr{} \def\cxxPostconditionsStr{} \def\cxxSeeStr{} \def\cxxAuthorStr{} \def\cxxVersionStr{} \def\cxxDeprecatedStr{} \def\cxxSinceStr{} \def\cxxFileStr{} \def\cxxExceptions##1{\def\cxxExceptionsStr{##1}} \def\cxxParameter##1{\def\cxxParameterStr{##1}} \def\cxxReturn##1{\def\cxxReturnStr{##1}} \def\cxxInvariants##1{\def\cxxInvariantsStr{##1}} \def\cxxPreconditions##1{\def\cxxPreconditionsStr{##1}} \def\cxxPostconditions##1{\def\cxxPostconditionsStr{##1}} \def\cxxSee##1{\def\cxxSeeStr{##1}} \def\cxxAuthor##1{\def\cxxAuthorStr{##1}} \def\cxxVersion##1{\def\cxxVersionStr{##1}} \def\cxxDeprecated##1{\def\cxxDeprecatedStr{##1}} \def\cxxSince##1{\def\cxxSinceStr{##1}} \def\cxxFile##1{\def\cxxFileStr{##1}} }{ \endgroup \addtocounter{cxxDepth}{-1} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for function manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxfunction}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Arguments}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxentry}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for union manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxunion}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Members}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for typedef manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxtypedef}[5]{ \begin{cxxgeneric}{#1}{#2}{}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Members}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for macro manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxmacro}[5]{ \begin{cxxgeneric}{\#define}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for class manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxclass}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for namespace manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxnamespace}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for interface manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxinterface}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for variable manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxvariable}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Names}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for documentation % \newenvironment{cxxdocumentation}{ % % switch on special characters for documentation section % \begingroup \catcode`\&=4 \catcode`\_=8 }{ \endgroup } \newenvironment{cxxdoc}{ % % switch on special characters for documentation section % \begin{cxxdocumentation} \strut\\\noindent% }{ \smallskip \def\empty{}% \ifx\cxxReturnStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Return Value:}\hss}% \parbox[t]{0.7\textwidth}{\cxxReturnStr}\\ \fi \ifx\cxxParameterStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Parameters:}\hss}% \parbox[t]{0.7\textwidth}{\cxxParameterStr}\\ \fi \ifx\cxxExceptionsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Exceptions:}\hss}% \parbox[t]{0.7\textwidth}{\cxxExceptionsStr}\\ \fi \ifx\cxxInvariantsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Invariants:}\hss}% \parbox[t]{0.7\textwidth}{\cxxInvariantsStr}\\ \fi \ifx\cxxPreconditionsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Preconditions:}\hss}% \parbox[t]{0.7\textwidth}{\cxxPreconditionsStr}\\ \fi \ifx\cxxPostconditionsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Postconditions:}\hss}% \parbox[t]{0.7\textwidth}{\cxxPostconditionsStr}\\ \fi \ifx\cxxSeeStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf See Also:}\hss}% \parbox[t]{0.7\textwidth}{\cxxSeeStr}\\ \fi \ifx\cxxAuthorStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Author:}\hss}% \parbox[t]{0.7\textwidth}{\cxxAuthorStr}\\ \fi \ifx\cxxVersionStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Version:}\hss}% \parbox[t]{0.7\textwidth}{\cxxVersionStr}\\ \fi \ifx\cxxDeprecatedStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf\it Deprecated:}\hss}% \parbox[t]{0.7\textwidth}{\cxxDeprecatedStr}\\ \fi \ifx\cxxSinceStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Since:}\hss}% \parbox[t]{0.7\textwidth}{\cxxSinceStr}\\ \fi \ifx\cxxFileStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf File:}\hss}% \parbox[t]{0.7\textwidth}{\cxxFileStr}\\ \fi \end{cxxdocumentation} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for commented listing % arguments are: % #1 Section title % \newenvironment{cxximplementation}[1]{ \goodbreak \begin{cxxdocumentation} }{ \end{cxxdocumentation} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\cxxCodeLine#1{ \strut\hbox to 20pt{\tiny\hss #1}\small %\advance\leftmargin by 20pt %\advance\textwidth by -20pt \ccverbatim \parskip=0pt \cxxCodeFinish} {\catcode`\=0 catcode`\=12 gdefcxxCodeFinish#1{hbox{#1}endgroup}} libupnp-1.8.0~svn20100507/ixml/doc/Makefile.am0000644000175000017500000000445111021325545015432 00000000000000# $Id: Makefile.am,v 1.1.1.1 2006/02/18 13:47:30 r3mi Exp $ # # "Makefile.am" for "libunp/ixml/doc" # # (C) Copyright 2005 Rémi Turboult # ########################################################################## # # Copyright (c) 2000-2003 Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither name of Intel Corporation nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ########################################################################## EXTRA_DIST= docxx.sty intro.dxx ixml.dxx license.dxx html-local: @if [ -d html ]; then rm -rf html; fi @doc++ -nd -S -w -j -d html $(srcdir)/ixml.dxx pdf-local: @doc++ -nd -S -w -j -t --package a4wide -o ixml.tex $(srcdir)/ixml.dxx @-pdflatex "\scrollmode\input ixml.tex" > pdflatex.log @-pdflatex "\scrollmode\input ixml.tex" >> pdflatex.log @-pdflatex "\scrollmode\input ixml.tex" >> pdflatex.log clean-local: -rm -rf html -rm -f ixml.tex pdflatex.log ixml.log ixml.aux libupnp-1.8.0~svn20100507/ixml/doc/Makefile.in0000644000175000017500000002636311360640114015447 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ # $Id: Makefile.am,v 1.1.1.1 2006/02/18 13:47:30 r3mi Exp $ # # "Makefile.am" for "libunp/ixml/doc" # # (C) Copyright 2005 Rémi Turboult # ########################################################################## # # Copyright (c) 2000-2003 Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither name of Intel Corporation nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ########################################################################## VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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 = ixml/doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/autoconfig.h \ $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = docxx.sty intro.dxx ixml.dxx license.dxx 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 \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ixml/doc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign ixml/doc/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 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$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 installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: html-local info: info-am info-am: install-data-am: install-dvi: install-dvi-am 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 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: pdf-local ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am html-local 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 installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am pdf-local \ ps ps-am uninstall uninstall-am html-local: @if [ -d html ]; then rm -rf html; fi @doc++ -nd -S -w -j -d html $(srcdir)/ixml.dxx pdf-local: @doc++ -nd -S -w -j -t --package a4wide -o ixml.tex $(srcdir)/ixml.dxx @-pdflatex "\scrollmode\input ixml.tex" > pdflatex.log @-pdflatex "\scrollmode\input ixml.tex" >> pdflatex.log @-pdflatex "\scrollmode\input ixml.tex" >> pdflatex.log clean-local: -rm -rf html -rm -f ixml.tex pdflatex.log ixml.log ixml.aux # 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: libupnp-1.8.0~svn20100507/ixml/doc/license.dxx0000644000175000017500000000321711021325545015544 00000000000000/**@name License * * \begin{center} * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * \end{center} * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * \begin{itemize} * \item Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * \item Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * \item Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * \end{itemize} * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ libupnp-1.8.0~svn20100507/ixml/inc/0000777000175000017500000000000011373047470013472 500000000000000libupnp-1.8.0~svn20100507/ixml/inc/ixml.h0000644000175000017500000016242311025042304014521 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef IXML_H #define IXML_H /*! * \file * * \defgroup XMLAPI XML API * * @{ */ #include "UpnpGlobal.h" /* For EXPORT_SPEC */ typedef int BOOL; /*! * \brief The type of DOM strings. */ #define DOMString char * /*typedef char *DOMString;*/ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef IN #define IN #endif #ifndef OUT #define OUT #endif #ifndef INOUT #define INOUT #endif /*! * \name DOM Interfaces * * The Document Object Model consists of a set of objects and interfaces * for accessing and manipulating documents. IXML does not implement all * the interfaces documented in the DOM2-Core recommendation but defines * a subset of the most useful interfaces. A description of the supported * interfaces and methods is presented in this section. * * For a complete discussion on the object model, the object hierarchy, * etc., refer to section 1.1 of the DOM2-Core recommendation. * * @{ */ /*! * \brief The type of the DOM node */ typedef enum { eINVALID_NODE = 0, eELEMENT_NODE = 1, eATTRIBUTE_NODE = 2, eTEXT_NODE = 3, eCDATA_SECTION_NODE = 4, eENTITY_REFERENCE_NODE = 5, eENTITY_NODE = 6, ePROCESSING_INSTRUCTION_NODE = 7, eCOMMENT_NODE = 8, eDOCUMENT_NODE = 9, eDOCUMENT_TYPE_NODE = 10, eDOCUMENT_FRAGMENT_NODE = 11, eNOTATION_NODE = 12, } IXML_NODE_TYPE; /*! * \brief Error codes returned by the XML API, see the DOM spec */ typedef enum { IXML_SUCCESS = 0, IXML_INDEX_SIZE_ERR = 1, IXML_DOMSTRING_SIZE_ERR = 2, IXML_HIERARCHY_REQUEST_ERR = 3, IXML_WRONG_DOCUMENT_ERR = 4, IXML_INVALID_CHARACTER_ERR = 5, IXML_NO_DATA_ALLOWED_ERR = 6, IXML_NO_MODIFICATION_ALLOWED_ERR = 7, IXML_NOT_FOUND_ERR = 8, IXML_NOT_SUPPORTED_ERR = 9, IXML_INUSE_ATTRIBUTE_ERR = 10, IXML_INVALID_STATE_ERR = 11, IXML_SYNTAX_ERR = 12, IXML_INVALID_MODIFICATION_ERR = 13, IXML_NAMESPACE_ERR = 14, IXML_INVALID_ACCESS_ERR = 15, IXML_NO_SUCH_FILE = 101, IXML_INSUFFICIENT_MEMORY = 102, IXML_FILE_DONE = 104, IXML_INVALID_PARAMETER = 105, IXML_FAILED = 106, IXML_INVALID_ITEM_NUMBER = 107, } IXML_ERRORCODE; #define DOCUMENTNODENAME "#document" #define TEXTNODENAME "#text" #define CDATANODENAME "#cdata-section" typedef struct _IXML_Document *Docptr; typedef struct _IXML_Node *Nodeptr; /*! * \brief Data structure common to all types of nodes. */ typedef struct _IXML_Node { DOMString nodeName; DOMString nodeValue; IXML_NODE_TYPE nodeType; DOMString namespaceURI; DOMString prefix; DOMString localName; BOOL readOnly; Nodeptr parentNode; Nodeptr firstChild; Nodeptr prevSibling; Nodeptr nextSibling; Nodeptr firstAttr; Docptr ownerDocument; } IXML_Node; /*! * \brief Data structure representing the DOM Document. */ typedef struct _IXML_Document { IXML_Node n; } IXML_Document; /*! * \brief Data structure representing a CDATA section node. */ typedef struct _IXML_CDATASection { IXML_Node n; } IXML_CDATASection; /*! * \brief Data structure representing an Element node. */ typedef struct _IXML_Element { IXML_Node n; DOMString tagName; } IXML_Element; /*! * \brief Data structure representing an Attribute node. */ typedef struct _IXML_ATTR { IXML_Node n; BOOL specified; IXML_Element *ownerElement; } IXML_Attr; /*! * \brief Data structure representing a Text node. */ typedef struct _IXML_Text { IXML_Node n; } IXML_Text; /*! * \brief Data structure representing a list of nodes. */ typedef struct _IXML_NodeList { IXML_Node *nodeItem; struct _IXML_NodeList *next; } IXML_NodeList; /*! * \brief Data structure representing a list of named nodes. */ typedef struct _IXML_NamedNodeMap { IXML_Node *nodeItem; struct _IXML_NamedNodeMap *next; } IXML_NamedNodeMap; /* @} DOM Interfaces */ #ifdef __cplusplus extern "C" { #endif /*! * \name Interface Node * * The \b Node interface forms the primary datatype for all other DOM * objects. Every other interface is derived from this interface, inheriting * its functionality. For more information, refer to DOM2-Core page 34. * * @{ */ /*! * \brief Returns the name of the \b Node, depending on what type of * \b Node it is, in a read-only string. * * Refer to the table in the * DOM2-Core for a description of the node names for various interfaces. * * \return A constant \b DOMString of the node name. */ EXPORT_SPEC const DOMString ixmlNode_getNodeName( /*! [in] Pointer to the node to retrieve the name. */ IXML_Node *nodeptr); /*! * \brief Returns the value of the \b Node as a string. * * Note that this string is not a copy and modifying it will modify the value * of the \b Node. * * \return A \b DOMString of the \b Node value. */ EXPORT_SPEC const DOMString ixmlNode_getNodeValue( /*! [in] Pointer to the \b Node to retrieve the value. */ IXML_Node *nodeptr); /*! * \brief Assigns a new value to a \b Node. * * The \b newNodeValue string is duplicated and stored in the \b Node so that * the original does not have to persist past this call. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: The Node * is not a valid pointer. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists to * complete this operation. */ EXPORT_SPEC int ixmlNode_setNodeValue( /*! [in] The \b Node to which to assign a new value. */ IXML_Node *nodeptr, /*! [in] The new value of the \b Node. */ const char *newNodeValue); /*! * \brief Retrieves the type of a \b Node. * * \return An enum IXML_NODE_TYPE representing the type of the \b Node. */ EXPORT_SPEC unsigned short ixmlNode_getNodeType( /*! [in] The \b Node from which to retrieve the type. */ IXML_Node *nodeptr); /*! * \brief Retrieves the parent \b Node for a \b Node. * * \return A pointer to the parent \b Node or \c NULL if the \b Node has no * parent. */ EXPORT_SPEC IXML_Node *ixmlNode_getParentNode( /*! [in] The \b Node from which to retrieve the parent. */ IXML_Node *nodeptr); /*! * \brief Retrieves the list of children of a \b Node in a \b NodeList * structure. * * If a \b Node has no children, \b ixmlNode_getChildNodes * returns a \b NodeList structure that contains no \b Nodes. * * \return A \b NodeList of the children of the \b Node. */ EXPORT_SPEC IXML_NodeList *ixmlNode_getChildNodes( /*! [in] The \b Node from which to retrieve the children. */ IXML_Node *nodeptr); /*! * \brief Retrieves the first child \b Node of a \b Node. * * \return A pointer to the first child \b Node or \c NULL if the \b Node does * not have any children. */ EXPORT_SPEC IXML_Node *ixmlNode_getFirstChild( /*! [in] The \b Node from which to retrieve the first child. */ IXML_Node *nodeptr); /*! * \brief Retrieves the last child \b Node of a \b Node. * * \return A pointer to the last child \b Node or \c NULL if the \b Node does * not have any children. */ EXPORT_SPEC IXML_Node *ixmlNode_getLastChild( /*! [in] The \b Node from which to retrieve the last child. */ IXML_Node *nodeptr); /*! * \brief Retrieves the sibling \b Node immediately preceding this \b Node. * * \return A pointer to the previous sibling \b Node or \c NULL if no such * \b Node exists. */ EXPORT_SPEC IXML_Node *ixmlNode_getPreviousSibling( /*! [in] The \b Node for which to retrieve the previous sibling. */ IXML_Node *nodeptr); /*! * \brief Retrieves the sibling \b Node immediately following this \b Node. * * \return A pointer to the next sibling \b Node or \c NULL if no such * \b Node exists. */ EXPORT_SPEC IXML_Node *ixmlNode_getNextSibling( /*! [in] The \b Node from which to retrieve the next sibling. */ IXML_Node *nodeptr); /*! * \brief Retrieves the attributes of a \b Node, if it is an \b Element node, * in a \b NamedNodeMap structure. * * \return A \b NamedNodeMap of the attributes or \c NULL. */ EXPORT_SPEC IXML_NamedNodeMap *ixmlNode_getAttributes( /*! [in] The \b Node from which to retrieve the attributes. */ IXML_Node *nodeptr); /*! * \brief Retrieves the document object associated with this \b Node. * * This owner document \b Node allows other \b Nodes to be created in the * context of this document. Note that \b Document nodes do not have an * owner document. * * \return A pointer to the owning \b Document or \c NULL, if the \b Node * does not have an owner. */ EXPORT_SPEC IXML_Document *ixmlNode_getOwnerDocument( /*! [in] The \b Node from which to retrieve the owner document. */ IXML_Node *nodeptr); /*! * \brief Retrieves the namespace URI for a \b Node as a \b DOMString. * * Only \b Nodes of type \c eELEMENT_NODE or \c eATTRIBUTE_NODE can have a * namespace URI. \b Nodes created through the \b Document interface will * only contain a namespace if created using \b ixmlDocument_createElementNS. * * \return A \b DOMString representing the URI of the namespace or \c NULL. */ EXPORT_SPEC const DOMString ixmlNode_getNamespaceURI( /*! [in] The \b Node for which to retrieve the namespace. */ IXML_Node *nodeptr); /*! * \brief Retrieves the namespace prefix, if present. * * The prefix is the name used as an alias for the namespace URI for this * element. Only \b Nodes of type \c eELEMENT_NODE or \c eATTRIBUTE_NODE can * have a prefix. \b Nodes created through the \b Document interface will only * contain a prefix if created using \b ixmlDocument_createElementNS. * * \return A \b DOMString representing the namespace prefix or \c NULL. */ EXPORT_SPEC const DOMString ixmlNode_getPrefix( /*! The \b Node from which to retrieve the prefix. */ IXML_Node *nodeptr); /*! * \brief Retrieves the local name of a \b Node, if present. * * The local name is the tag name without the namespace prefix. Only \b Nodes * of type \c eELEMENT_NODE or \c eATTRIBUTE_NODE can have a local name. * \b Nodes created through the \b Document interface will only contain a local * name if created using \b ixmlDocument_createElementNS. * * \return A \b DOMString representing the local name of the \b Element or * \c NULL. */ EXPORT_SPEC const DOMString ixmlNode_getLocalName( /*! [in] The \b Node from which to retrieve the local name. */ IXML_Node *nodeptr); /*! * \brief Inserts a new child \b Node before the existing child \b Node. * * \b refChild can be \c NULL, which inserts \b newChild at the * end of the list of children. Note that the \b Node (or \b Nodes) * in \b newChild must already be owned by the owner document (or have no * owner at all) of \b nodeptr for insertion. If not, the \b Node * (or \b Nodes) must be imported into the document using * \b ixmlDocument_importNode. If \b newChild is already in the tree, * it is removed first. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b nodeptr or * \b newChild is \c NULL. * \li \c IXML_HIERARCHY_REQUEST_ERR: The type of the \b Node * does not allow children of the type of \b newChild. * \li \c IXML_WRONG_DOCUMENT_ERR: \b newChild has an owner * document that does not match the owner of \b nodeptr. * \li \c IXML_NO_MODIFICATION_ALLOWED_ERR: \b nodeptr is * read-only or the parent of the \b Node being inserted is * read-only. * \li \c IXML_NOT_FOUND_ERR: \b refChild is not a child of * \b nodeptr. */ EXPORT_SPEC int ixmlNode_insertBefore( /*! [in] The parent of the \b Node before which to insert the new child. */ IXML_Node *nodeptr, /*! [in] The \b Node to insert into the tree. */ IXML_Node * newChild, /*! [in] The reference child where the new \b Node should be inserted. * The new \b Node will appear directly before the reference child. */ IXML_Node * refChild); /*! * \brief Replaces an existing child \b Node with a new child \b Node in the * list of children of a \b Node. * * If \b newChild is already in the tree, it will first be removed. * \b returnNode will contain the \b oldChild \b Node, appropriately removed * from the tree (i.e. it will no longer have an owner document). * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMTER: Either \b nodeptr, \b newChild, * or \b oldChild is \c NULL. * \li \c IXML_HIERARCHY_REQUEST_ERR: The \b newChild is not * a type of \b Node that can be inserted into this tree or * \b newChild is an ancestor of \b nodePtr. * \li \c IXML_WRONG_DOCUMENT_ERR: \b newChild was created from * a different document than \b nodeptr. * \li \c IXML_NO_MODIFICATION_ALLOWED_ERR: \b nodeptr or * its parent is read-only. * \li \c IXML_NOT_FOUND_ERR: \b oldChild is not a child of * \b nodeptr. */ EXPORT_SPEC int ixmlNode_replaceChild( /*! [in] The parent of the \b Node which contains the child to replace. */ IXML_Node *nodeptr, /*! [in] The child with which to replace \b oldChild. */ IXML_Node *newChild, /*! [in] The child to replace with \b newChild. */ IXML_Node *oldChild, /*! [out] Pointer to a \b Node to place the removed \b oldChild \b Node. */ IXML_Node **returnNode); /*! * \brief Removes a child from the list of children of a \b Node. * * \b returnNode will contain the \b oldChild \b Node, * appropriately removed from the tree (i.e. it will no longer have an * owner document). * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b nodeptr or * \b oldChild is \c NULL. * \li \c IXML_NO_MODIFICATION_ALLOWED_ERR: \b nodeptr or its * parent is read-only. * \li \c IXML_NOT_FOUND_ERR: \b oldChild is not among the * children of \b nodeptr. */ EXPORT_SPEC int ixmlNode_removeChild( /*! [in] The parent of the child to remove. */ IXML_Node *nodeptr, /*! [in] The child \b Node to remove. */ IXML_Node *oldChild, /*! [out] Pointer to a \b Node to place the removed \b oldChild \b Node. */ IXML_Node **returnNode); /*! * \brief Appends a child \b Node to the list of children of a \b Node. * * If \b newChild is already in the tree, it is removed first. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b nodeptr or * \b newChild is \c NULL. * \li \c IXML_HIERARCHY_REQUEST_ERR: \b newChild is of a type * that cannot be added as a child of \b nodeptr or * \b newChild is an ancestor of \b nodeptr. * \li \c IXML_WRONG_DOCUMENT_ERR: \b newChild was created from * a different document than \b nodeptr. * \li \c IXML_NO_MODIFICATION_ALLOWED_ERR: \b nodeptr is a * read-only \b Node. */ EXPORT_SPEC int ixmlNode_appendChild( /*! [in] The \b Node in which to append the new child. */ IXML_Node *nodeptr, /*! [in] The new child to append. */ IXML_Node * newChild); /*! * \brief Queries whether or not a \b Node has children. * * \return \c TRUE if the \b Node has one or more children otherwise \c FALSE. */ EXPORT_SPEC BOOL ixmlNode_hasChildNodes( /*! [in] The \b Node to query for children. */ IXML_Node *nodeptr); /*! * \brief Clones a \b Node. * * The new \b Node does not have a parent. The \b deep parameter controls * whether the subtree of the \b Node is also cloned. * * For details on cloning specific types of \b Nodes, refer to the * DOM2-Core recommendation. * * \return A clone of \b nodeptr or \c NULL. */ EXPORT_SPEC IXML_Node *ixmlNode_cloneNode( /*! [in] The \b Node to clone. */ IXML_Node *nodeptr, /*! [in] \c TRUE to clone the subtree also or \c FALSE to clone only * \b nodeptr. */ BOOL deep); /*! * \brief Queries whether this \b Node has attributes. * * Note that only \b Element nodes have attributes. * * \return \c TRUE if the \b Node has attributes otherwise \c FALSE. */ EXPORT_SPEC BOOL ixmlNode_hasAttributes( /*! [in] The \b Node to query for attributes. */ IXML_Node *nodeptr); /*! * \brief Frees a \b Node and all \b Nodes in its subtree. */ EXPORT_SPEC void ixmlNode_free( /*! [in] The \b Node tree to free. */ IXML_Node *nodeptr); /* @} Interface Node */ /*! * \name Interface Attr * * The \b Attr interface represents an attribute of an \b Element. The document * type definition (DTD) or schema usually dictate the allowable attributes and * values for a particular element. * * For more information, refer to the Interface Attr section in the * DOM2-Core. * * @{ */ /*! * \brief Frees an \b Attr node. */ EXPORT_SPEC void ixmlAttr_free( /*! The \b Attr node to free. */ IXML_Attr *attrNode); /* @} Interface Attr */ /*! * \name Interface CDATASection * * The \b CDATASection is used to escape blocks of text containing * characters that would otherwise be regarded as markup. CDATA sections * cannot be nested. Their primary purpose is for including material such * XML fragments, without needing to escape all the delimiters. * * For more information, refer to the Interface CDATASection section * in the DOM2-Core. * * @{ */ /*! * \brief Initializes a \b CDATASection node. */ EXPORT_SPEC void ixmlCDATASection_init( /*! [in] The CDATA Section Node to iniatialize. */ IXML_CDATASection *nodeptr); /*! * \brief Frees a \b CDATASection node. */ EXPORT_SPEC void ixmlCDATASection_free( /*! The \b CDATASection node to free. */ IXML_CDATASection *nodeptr); /* @} Interface CDATASection */ /*! * \name Interface Document * * The \b Document interface represents the entire XML document. In essence, it * is the root of the document tree and provides the primary interface to the * elements of the document. * * For more information, refer to the Interface Document section in * the DOM2Core. * * @{ */ /*! * \brief Initializes a \b Document node. */ EXPORT_SPEC void ixmlDocument_init( /*! [in] The \b Document node to initialize. */ IXML_Document *nodeptr); /*! * \brief Creates a new empty \b Document node. * * The \b ixmlDocument_createDocumentEx API differs from the * \b ixmlDocument_createDocument API in that it returns an error code * describing the reason for the failure rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlDocument_createDocumentEx( /*! [out] Pointer to a \b Document where the new object will be stored. */ IXML_Document **doc); /*! * \brief Creates a new empty \b Document node. * * \return A pointer to the new \b Document object with the nodeName set to * "#document" or \c NULL on failure. */ EXPORT_SPEC IXML_Document *ixmlDocument_createDocument(); /*! * \brief Creates a new \b Element node with the given tag name. * * The new \b Element node has a \c nodeName of \b tagName and the * \c localName, \c prefix, and \c namespaceURI set to \c NULL. To create an * \b Element with a namespace, see \b ixmlDocument_createElementNS. * * The \b ixmlDocument_createElementEx API differs from the \b * ixmlDocument_createElement API in that it returns an error code * describing the reason for failure rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b doc or * \b tagName is \c NULL. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlDocument_createElementEx( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The tag name of the new \b Element node. */ const DOMString tagName, /*! [out] Pointer to an \b Element where the new object will be stored. */ IXML_Element **rtElement); /*! * \brief Creates a new \b Element node with the given tag name. * * The new \b Element node has a \c nodeName of \b tagName and the * \c localName, \c prefix, and \c namespaceURI set to \c NULL. To create an * \b Element with a namespace, see \b ixmlDocument_createElementNS. * * \return A pointer to the new \b Element object with the node name set to * tagName, and localName, prefix and namespaceURI set to \c NULL, or \c NULL * on failure. */ EXPORT_SPEC IXML_Element *ixmlDocument_createElement( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The tag name of the new \b Element node (case-sensitive). */ const DOMString tagName); /*! * \brief Creates a new \b Text node with the given data. * * The \b ixmlDocument_createTextNodeEx() API differs from the * \b ixmlDocument_createTextNode API in that it returns an error code * describing the reason for failure rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b doc or \b data * is \c NULL. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlDocument_createTextNodeEx( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The data to associate with the new \b Text node. * It is stored in nodeValue field.*/ const DOMString data, /*! [out] A pointer to a \b Node where the new object will be stored. */ IXML_Node **textNode); /*! * \brief Creates a new \b Text node with the given data. * * \return A pointer to the new \b Node or \c NULL on failure. */ EXPORT_SPEC IXML_Node *ixmlDocument_createTextNode( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The data to associate with the new \b Text node. It is stored in * the nodeValue field. */ const DOMString data); /*! * \brief Creates a new \b CDATASection node with given data. * * The \b ixmlDocument_createCDATASectionEx API differs from the \b * ixmlDocument_createCDATASection API in that it returns an error code * describing the reason for failure rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b doc or \b data * is \c NULL. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlDocument_createCDATASectionEx( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The data to associate with the new \b CDATASection node. */ const DOMString data, /*! [out] A pointer to a \b Node where the new object will be stored. */ IXML_CDATASection** cdNode); /*! * \brief Creates a new \b CDATASection node with given data. * * \return A pointer to the new \b CDATASection or \c NULL on failure. */ EXPORT_SPEC IXML_CDATASection *ixmlDocument_createCDATASection( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The data to associate with the new \b CDATASection node. */ const DOMString data); /*! * \brief Creates a new \b Attr node with the given name. * * \return A pointer to the new \b Attr object with the nodeName attribute * set to the given name, and the localName, prefix and namespaceURI set * to NULL or \c NULL on failure. * * The value of the attribute is the empty string. */ EXPORT_SPEC IXML_Attr *ixmlDocument_createAttribute( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The name of the new attribute. */ const char *name); /*! * \brief Creates a new \b Attr node with the given name. * * The \b ixmlDocument_createAttributeEx API differs from the \b * ixmlDocument_createAttribute API in that it returns an error code * describing the reason for failure rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b doc or \b name * is \c NULL. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlDocument_createAttributeEx( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The name of the new attribute. */ const char *name, /*! [out] A pointer to a \b Attr where the new object will be stored. */ IXML_Attr **attrNode); /*! * \brief Returns a \b NodeList of all \b Elements that match the given * tag name in the order in which they were encountered in a preorder * traversal of the \b Document tree. * * \return A pointer to a \b NodeList containing the matching items or \c NULL * on an error. */ EXPORT_SPEC IXML_NodeList *ixmlDocument_getElementsByTagName( /*! [in] The \b Document to search. */ IXML_Document *doc, /*! [in] The tag name to find. The special value "*" matches all tags.*/ const DOMString tagName); /* * introduced in DOM level 2 */ /*! * \brief Creates a new \b Element node in the given qualified name and * namespace URI. * * The \b ixmlDocument_createElementNSEx API differs from the \b * ixmlDocument_createElementNS API in that it returns an error code * describing the reason for failure rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b doc, * \b namespaceURI, or \b qualifiedName is \c NULL. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlDocument_createElementNSEx( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The namespace URI for the new \b Element. */ const DOMString namespaceURI, /*! [in] The qualified name of the new \b Element. */ const DOMString qualifiedName, /*! [out] A pointer to an \b Element where the new object will be stored. */ IXML_Element **rtElement); /*! * \brief Creates a new \b Element node in the given qualified name and * namespace URI. * * \return A pointer to the new \b Element object with tagName qualifiedName, * prefix and localName extraced from qualfiedName, nodeName of qualfiedName, * namespaceURI of namespaceURI or \c NULL on failure. */ EXPORT_SPEC IXML_Element *ixmlDocument_createElementNS( /*! [in] The owner \b Document of the new node. */ IXML_Document *doc, /*! [in] The namespace URI for the new \b Element. */ const DOMString namespaceURI, /*! [in] The qualified name of the new \b Element. */ const DOMString qualifiedName); /*! * \brief Creates a new \b Attr node with the given qualified name and * namespace URI. * * The \b ixmlDocument_createAttributeNSEx API differs from the \b * ixmlDocument_createAttributeNS API in that it returns an error code * describing the reason for failure rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b doc, * \b namespaceURI, or \b qualifiedName is \c NULL. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlDocument_createAttributeNSEx( /*! [in] The owner \b Document of the new \b Attr. */ IXML_Document *doc, /*! [in] The namespace URI for the attribute. */ const DOMString namespaceURI, /*! [in] The qualified name of the attribute. */ const DOMString qualifiedName, /*! [out] A pointer to an \b Attr where the new object will be stored. */ IXML_Attr **attrNode); /*! * \brief Creates a new \b Attribute node with the given qualified name and * namespace URI. * * \return A pointer to the new \b Attr node with the given namespaceURI and * qualifiedName. The prefix and localname are extracted from * the qualifiedName. The node value is empty. Or \c NULL on failure. */ EXPORT_SPEC IXML_Attr *ixmlDocument_createAttributeNS( /*! [in] The owner \b Document of the new \b Attribute. */ IXML_Document *doc, /*! [in] The namespace URI for the attribute. */ const DOMString namespaceURI, /*! [in] The qualified name of the attribute. */ const DOMString qualifiedName); /*! * \brief Returns a \b NodeList of \b Elements that match the given * local name and namespace URI in the order they are encountered * in a preorder traversal of the \b Document tree. * * Either \b namespaceURI or \b localName can be the special "*" * character, which matches any namespace or any local name respectively. * * \return A pointer to a \b NodeList containing the matching items or \c NULL * on an error. */ EXPORT_SPEC IXML_NodeList *ixmlDocument_getElementsByTagNameNS( /*! [in] The \b Document to search. */ IXML_Document *doc, /*! [in] The namespace of the elements to find or "*" to match any * namespace. */ const DOMString namespaceURI, /*! [in] The local name of the elements to find or "*" to match any * local name. */ const DOMString localName); /*! * \brief Returns the \b Element whose \c ID matches that given id. * * \return A pointer to the matching \b Element or \c NULL on an error. */ EXPORT_SPEC IXML_Element *ixmlDocument_getElementById( /*! [in] The owner \b Document of the \b Element. */ IXML_Document *doc, /*! [in] The name of the \b Element.*/ const DOMString tagName); /*! * \brief Frees a \b Document object and all \b Nodes associated with it. * * Any \b Nodes extracted via any other interface function, e.g. * \b ixmlDocument_GetElementById, become invalid after this call unless * explicitly cloned. */ EXPORT_SPEC void ixmlDocument_free( /*! [in] The \b Document to free. */ IXML_Document *doc); /*! * \brief Imports a \b Node from another \b Document into this \b Document. * * The returned new \b Node does not a have parent node (parentNode is null): * it is a clone of the original \b Node with the \c ownerDocument set to * \b doc. The source node is not altered or removed from the original * document. * * For all nodes, importing a node creates a node object owned by the * importing document, with attribute values identical to the source * node's nodeName and nodeType, plus the attributes related to namespaces * (prefix, localName, and namespaceURI). * * As in the cloneNode operation on a node, the source node is not altered. * * The \b deep parameter controls whether all the children of the \b Node are * imported. * * Refer to the DOM2-Core recommendation for details on importing specific * node types. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b doc or * \b importNode is not a valid pointer. * \li \c IXML_NOT_SUPPORTED_ERR: \b importNode is a * \b Document, which cannot be imported. * \li \c IXML_FAILED: The import operation failed because the * \b Node to be imported could not be cloned. */ EXPORT_SPEC int ixmlDocument_importNode( /*! [in] The \b Document into which to import. */ IXML_Document *doc, /*! [in] The \b Node to import. */ IXML_Node * importNode, /*! [in] \c TRUE to import all children of \b importNode or \c FALSE to * import only the root node. */ BOOL deep, /*! [out] A pointer to a new \b Node owned by \b doc. */ IXML_Node **rtNode); /* @} Interface Document */ /*! * \name Interface Element * * The \b Element interface represents an element in an XML document. * Only \b Elements are allowed to have attributes, which are stored in the * \c attributes member of a \b Node. The \b Element interface * extends the \b Node interface and adds more operations to manipulate * attributes. * * @{ */ /*! * \brief Initializes a \b IXML_Element node. */ EXPORT_SPEC void ixmlElement_init( /*! [in] The \b Element to initialize.*/ IXML_Element *element); /*! * \brief Returns the name of the tag as a constant string. * * \return The name of the \b Element. */ EXPORT_SPEC const DOMString ixmlElement_getTagName( /*! [in] The \b Element from which to retrieve the name. */ IXML_Element *element); /*! * \brief Retrieves an attribute of an \b Element by name. * * \return The value of the attribute, or \b NULL if that attribute * does not have a specified value. */ EXPORT_SPEC const DOMString ixmlElement_getAttribute( /*! [in] The \b Element from which to retrieve the attribute. */ IXML_Element* element, /*! [in] The name of the attribute to retrieve. */ const DOMString name); /*! * \brief Adds a new attribute to an \b Element. * * If an attribute with the same name already exists in the element, the * attribute value will be updated with the new value parameter. Otherwise, * a new attribute is inserted into the element. * * \return An integer representing of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b element, * \b name, or \b value is \c NULL. * \li \c IXML_INVALID_CHARACTER_ERR: \b name contains an * illegal character. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete the operation. */ EXPORT_SPEC int ixmlElement_setAttribute( /*! [in] The \b Element on which to set the attribute. */ IXML_Element *element, /*! [in] The name of the attribute. */ const DOMString name, /*! [in] The value of the attribute. Note that this is a non-parsed string * and any markup must be escaped. */ const DOMString value); /*! * \brief Removes an attribute value by name. The attribute node is not removed. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b element or * \b name is \c NULL. */ EXPORT_SPEC int ixmlElement_removeAttribute( /*! [in] The \b Element from which to remove the attribute. */ IXML_Element *element, /*! [in] The name of the attribute to remove. */ const DOMString name); /*! * \brief Retrieves an attribute node by name. * See \b ixmlElement_getAttributeNodeNS to retrieve an attribute node using * a qualified name or namespace URI. * * \return A pointer to the attribute matching \b name or \c NULL on if there * is no such attribute. */ EXPORT_SPEC IXML_Attr *ixmlElement_getAttributeNode( /*! [in] The \b Element from which to get the attribute node. */ IXML_Element *element, /*! [in] The name of the attribute node to find. */ const DOMString name); /*! * \brief Adds a new attribute node to an \b Element. * * If an attribute already exists with \b newAttr as a name, it will be * replaced with the new one and the old one will be returned in \b rtAttr. * * \return If successfull, the replaced attribute node is returned in rtAttr, * otherwise, \b NULL is returned in this pointer. The function return value * is an integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b element or * \b newAttr is \c NULL. * \li \c IXML_WRONG_DOCUMENT_ERR: \b newAttr does not belong * to the same one as \b element. * \li \c IXML_INUSE_ATTRIBUTE_ERR: \b newAttr is already * an attribute of another \b Element. */ EXPORT_SPEC int ixmlElement_setAttributeNode( /*! [in] The \b Element in which to add the new attribute. */ IXML_Element *element, /*! [in] The new \b Attr to add. */ IXML_Attr* newAttr, /*! [out] A pointer to an \b Attr where the old \b Attr will be stored. * This will have a \c NULL if no prior node existed. */ IXML_Attr** rtAttr); /*! * \brief Removes the specified attribute node from an \b Element. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b element or * \b oldAttr is \c NULL. * \li \c IXML_NOT_FOUND_ERR: \b oldAttr is not among the list * attributes of \b element. */ EXPORT_SPEC int ixmlElement_removeAttributeNode( /*! [in] The \b Element from which to remove the attribute. */ IXML_Element *element, /*! [in] The attribute to remove from the \b Element. */ IXML_Attr* oldAttr, /*! [out] A pointer to an attribute in which to place the removed attribute. */ IXML_Attr** rtAttr); /*! * \brief Returns a \b NodeList of all \em descendant \b Elements with * a given tag name, in the order in which they are encountered in a * pre-order traversal of this \b Element tree. * * \return A \b NodeList of the matching \b Elements or \c NULL on an error. */ EXPORT_SPEC IXML_NodeList *ixmlElement_getElementsByTagName( /*! [in] The \b Element from which to start the search. */ IXML_Element *element, /*! [in] The name of the tag for which to search. */ const DOMString tagName); /* * Introduced in DOM 2 */ /*! * \brief Retrieves an attribute value using the local name and namespace URI. * * \return A \b DOMString representing the value of the matching attribute, or * \b NULL if that attribute does not have the specified value. */ EXPORT_SPEC const DOMString ixmlElement_getAttributeNS( /*! [in] The \b Element from which to get the attribute value. */ IXML_Element *element, /*! [in] The namespace URI of the attribute. */ const DOMString namespaceURI, /*! [in] The local name of the attribute. */ const DOMString localname); /*! * \brief Adds a new attribute to an \b Element using the local name and * namespace URI. * * If another attribute matches the same local name and namespace, the prefix * is changed to be the prefix part of the \c qualifiedName and the value is * changed to \b value. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b element, * \b namespaceURI, \b qualifiedName, or \b value is * \c NULL. * \li \c IXML_INVALID_CHARACTER_ERR: \b qualifiedName contains * an invalid character. * \li \c IXML_NAMESPACE_ERR: Either the \b qualifiedName or * \b namespaceURI is malformed. Refer to the DOM2-Core for * possible reasons. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exist * to complete the operation. * \li \c IXML_FAILED: The operation could not be completed. */ EXPORT_SPEC int ixmlElement_setAttributeNS( /*! [in] The \b Element on which to set the attribute. */ IXML_Element *element, /*! [in] The namespace URI of the new attribute. */ const DOMString namespaceURI, /*! [in] The qualified name of the attribute. */ const DOMString qualifiedName, /*! [in] The new value for the attribute. */ const DOMString value); /*! * \brief Removes an attribute using the namespace URI and local name. * * The replacing attribute has the same namespace URI and local name, as well * as the original prefix. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b element, * \b namespaceURI, or \b localName is \c NULL. */ EXPORT_SPEC int ixmlElement_removeAttributeNS( /*! [in] The \b Element from which to remove the the attribute. */ IXML_Element *element, /*! [in] The namespace URI of the attribute. */ const DOMString namespaceURI, /*! [in] The local name of the attribute.*/ const DOMString localName); /*! * \brief Retrieves an \b Attr node by local name and namespace URI. * * \return A pointer to an \b Attribute node with the specified attribute * local name and namespace URI or \c NULL if there is no such attribute. */ EXPORT_SPEC IXML_Attr *ixmlElement_getAttributeNodeNS( /*! [in] The \b Element from which to get the attribute. */ IXML_Element *element, /*! [in] The namespace URI of the attribute. */ const DOMString namespaceURI, /*! [in] The local name of the attribute. */ const DOMString localName); /*! * \brief Adds a new attribute node to the element node specified. * * If an attribute with the same local name and namespace URI already exists in * the \b Element, the existing attribute node is replaced with \b newAttr and * the old returned in \b rcAttr. * * \return The output parameter rcAttr receives the replaced attribute node if * the newAttr attribute replaces an existing attribute with the same local name * and namespace, otherwise rcAttr receives \b NULL. * * The function return value is an integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: Either \b element or * \b newAttr is \c NULL. * \li \c IXML_WRONG_DOCUMENT_ERR: \b newAttr does not belong * to the same document as \b element. * \li \c IXML_INUSE_ATTRIBUTE_ERR: \b newAttr already is an * attribute of another \b Element. */ EXPORT_SPEC int ixmlElement_setAttributeNodeNS( /*! [in] The \b Element in which to add the attribute node. */ IXML_Element *element, /*! [in] The new \b Attr to add. */ IXML_Attr *newAttr, /*! [out] A pointer to the replaced \b Attr, if it exists. */ IXML_Attr **rcAttr); /*! * \brief Returns a \b NodeList of all \em descendant \b Elements with a * given local name and namespace in the order in which they are encountered in * the pre-order traversal of the \b Element tree. * * \return A \b NodeList of matching \b Elements or \c NULL on an error. */ EXPORT_SPEC IXML_NodeList *ixmlElement_getElementsByTagNameNS( /*! [in] The \b Element from which to start the search. */ IXML_Element *element, /*! [in] The namespace URI of the \b Elements to find. The special value * "*" matches all namespaces. */ const DOMString namespaceURI, /*! [in] The local name of the \b Elements to find. The special value "*" * matches all local names. */ const DOMString localName); /*! * \brief Queries whether the \b Element has an attribute with the given name * or a default value. * * \return \c TRUE if the \b Element has an attribute with this name or has a * default value for that attribute, otherwise \c FALSE. */ EXPORT_SPEC BOOL ixmlElement_hasAttribute( /*! [in] The \b Element on which to check for an attribute. */ IXML_Element *element, /*! [in] The name of the attribute for which to check. */ const DOMString name); /*! * \brief Queries whether the \b Element has an attribute with the given * local name and namespace URI or has a default value for that attribute. * * \return \c TRUE if the \b Element has an attribute with the given namespace * and local name or has a default value for that attribute, otherwise \c FALSE. */ EXPORT_SPEC BOOL ixmlElement_hasAttributeNS( /*! [in] The \b Element on which to check for the attribute. */ IXML_Element *element, /*! [in] The namespace URI of the attribute. */ const DOMString namespaceURI, /*! [in] The local name of the attribute. */ const DOMString localName); /*! * \brief Frees the given \b Element and any subtree of the \b Element. */ EXPORT_SPEC void ixmlElement_free( /*! [in] The \b Element to free. */ IXML_Element *element); /* @} Interface Element */ /*! * \name Interface NamedNodeMap * * A \b NamedNodeMap object represents a list of objects that can be * accessed by name. A \b NamedNodeMap maintains the objects in * no particular order. The \b Node interface uses a \b NamedNodeMap * to maintain the attributes of a node. * * @{ */ /*! * \brief Returns the number of items contained in this \b NamedNodeMap. * * \return The number of nodes in this map. */ EXPORT_SPEC unsigned long ixmlNamedNodeMap_getLength( /*! [in] The \b NamedNodeMap from which to retrieve the size. */ IXML_NamedNodeMap *nnMap); /*! * \brief Retrieves a \b Node from the \b NamedNodeMap by name. * * \return A Node with the specified nodeName, or \b NULL if it * does not identify any node in this map. */ EXPORT_SPEC IXML_Node *ixmlNamedNodeMap_getNamedItem( /*! [in] The \b NamedNodeMap to search. */ IXML_NamedNodeMap *nnMap, /*! [in] The name of the \b Node to find. */ const DOMString name); /*! * \brief Adds a new \b Node to the \b NamedNodeMap using the \b Node name * attribute. * * \return The old \b Node if the new \b Node replaces it or \c NULL if the * \b Node was not in the \b NamedNodeMap before. */ EXPORT_SPEC IXML_Node *ixmlNamedNodeMap_setNamedItem( /*! The \b NamedNodeMap in which to add the new \b Node. */ IXML_NamedNodeMap *nnMap, /*! The new \b Node to add to the \b NamedNodeMap. */ IXML_Node *arg); /*! * \brief Removes a \b Node from a \b NamedNodeMap specified by name. * * \return A pointer to the \b Node, if found, or \c NULL if it wasn't. */ EXPORT_SPEC IXML_Node *ixmlNamedNodeMap_removeNamedItem( /*! The \b NamedNodeMap from which to remove the item. */ IXML_NamedNodeMap *nnMap, /*! The name of the item to remove. */ const DOMString name); /*! * \brief Retrieves the indexth item in the map. If index is greater than or * equal to the number of nodes in this map, this returns \b NULL. * * \return The node at the indexth position in the map, or \b NULL if that is * not a valid index. */ EXPORT_SPEC IXML_Node *ixmlNamedNodeMap_item( /*! [in] The \b NamedNodeMap from which to remove the \b Node. */ IXML_NamedNodeMap *nnMap, /*! [in] The index into the map to remove. */ unsigned long index); /* * Introduced in DOM level 2 */ /*! * \brief Retrieves a \b Node from a \b NamedNodeMap specified by namespace * URI and local name. * * \return A pointer to the \b Node, if found, or \c NULL if it wasn't */ EXPORT_SPEC IXML_Node *ixmlNamedNodeMap_getNamedItemNS( /*! The \b NamedNodeMap from which to remove the \b Node. */ IXML_NamedNodeMap *nnMap, /*! The namespace URI of the \b Node to remove. */ const DOMString *namespaceURI, /*! The local name of the \b Node to remove. */ const DOMString localName); /*! * \brief Adds a new \b Node to the \b NamedNodeMap using the \b Node * local name and namespace URI attributes. * * \return The old \b Node if the new \b Node replaces it or \c NULL if the * \b Node was not in the \b NamedNodeMap before. */ EXPORT_SPEC IXML_Node *ixmlNamedNodeMap_setNamedItemNS( /*! The \b NamedNodeMap in which to add the \b Node. */ IXML_NamedNodeMap *nnMap, /*! The \b Node to add to the map. */ IXML_Node *arg); /*! * \brief Removes a \b Node from a \b NamedNodeMap specified by * namespace URI and local name. * * \return A pointer to the \b Node, if found, or \c NULL if it wasn't. */ EXPORT_SPEC IXML_Node *ixmlNamedNodeMap_removeNamedItemNS( /*! The \b NamedNodeMap from which to remove the \b Node. */ IXML_NamedNodeMap *nnMap, /*! The namespace URI of the \b Node to remove. */ const DOMString namespaceURI, /*! The local name of the \b Node to remove. */ const DOMString localName); /*! \brief Frees a \b NamedNodeMap. * * The \b Nodes inside the map are not freed, just the \b NamedNodeMap object. */ EXPORT_SPEC void ixmlNamedNodeMap_free( /*! [in] The \b NamedNodeMap to free. */ IXML_NamedNodeMap *nnMap); /* @} Interface NodeMap */ /*! * \name Interface NodeList * * The \b NodeList interface abstracts an ordered collection of * nodes. Note that changes to the underlying nodes will change * the nodes contained in a \b NodeList. The DOM2-Core refers to * this as being \em live. * * @{ */ /*! * \brief Retrieves a \b Node from a \b NodeList specified by a * numerical index. * * \return A pointer to a \b Node or \c NULL if there was an error. */ EXPORT_SPEC IXML_Node *ixmlNodeList_item( /*! [in] The \b NodeList from which to retrieve the \b Node. */ IXML_NodeList *nList, /*! [in] The index into the \b NodeList to retrieve. */ unsigned long index); /*! * \brief Returns the number of \b Nodes in a \b NodeList. * * \return The number of \b Nodes in the \b NodeList. */ EXPORT_SPEC unsigned long ixmlNodeList_length( /*! [in] The \b NodeList for which to retrieve the number of \b Nodes. */ IXML_NodeList *nList); /*! * \brief Frees a \b NodeList object. * * Since the underlying \b Nodes are references, they are not freed using this * operation. This only frees the \b NodeList object. */ EXPORT_SPEC void ixmlNodeList_free( /*! [in] The \b NodeList to free. */ IXML_NodeList *nList); /* @} Interface NodeList */ /*! * \name IXML API * * The IXML API contains utility functions that are not part of the standard * DOM interfaces. They include functions to create a DOM structure from a * file or buffer, create an XML file from a DOM structure, and manipulate * DOMString objects. * * @{ */ /*! * \brief Renders a \b Node and all sub-elements into an XML document * representation. * * The caller is required to free the \b DOMString * returned from this function using \b ixmlFreeDOMString when it * is no longer required. * * Note that this function can be used for any \b Node-derived * interface. The difference between \b ixmlPrintDocument and * \b ixmlPrintNode is \b ixmlPrintDocument includes the XML prolog * while \b ixmlPrintNode only produces XML elements. An XML * document is not well formed unless it includes the prolog * and at least one element. * * This function introduces lots of white space to print the * \b DOMString in readable format. * * \return A \b DOMString with the XML document representation * of the DOM tree or \c NULL on an error. */ EXPORT_SPEC DOMString ixmlPrintDocument( /*! [in] The document node to print. */ IXML_Document *doc); /*! * \brief Renders a \b Node and all sub-elements into an XML text * representation. * * The caller is required to free the \b DOMString * returned from this function using \b ixmlFreeDOMString when it * is no longer required. * * Note that this function can be used for any \b Node-derived * interface. A similar \b ixmlPrintDocument function is defined * to avoid casting when printing whole documents. This function * introduces lots of white space to print the \b DOMString in readable * format. * * \return A \b DOMString with the XML text representation of the DOM tree or * \c NULL on an error. */ EXPORT_SPEC DOMString ixmlPrintNode( /*! [in] The root of the \b Node tree to render to XML text. */ IXML_Node *doc ); /*! * \brief Renders a \b Node and all sub-elements into an XML document * representation. * * The caller is required to free the \b DOMString * returned from this function using \b ixmlFreeDOMString when it * is no longer required. * * Note that this function can be used for any \b Node-derived * interface. The difference between \b ixmlDocumenttoString and * \b ixmlNodetoString is \b ixmlDocumenttoString includes the XML * prolog while \b ixmlNodetoString only produces XML elements. An XML * document is not well formed unless it includes the prolog * and at least one element. * * \return A \b DOMString with the XML text representation of the DOM tree or * \c NULL on an error. */ EXPORT_SPEC DOMString ixmlDocumenttoString( /*! [in] The root of the \b Node tree to render to XML text. */ IXML_Document *doc); /*! * \brief Renders a \b Node and all sub-elements into an XML text * representation. The caller is required to free the \b DOMString * returned from this function using \b ixmlFreeDOMString when it * is no longer required. * * Note that this function can be used for any \b Node-derived * interface. The difference between \b ixmlNodetoString and * \b ixmlDocumenttoString is \b ixmlNodetoString does not include * the XML prolog, it only produces XML elements. * * \return A \b DOMString with the XML text representation of the DOM tree or * \c NULL on an error. */ EXPORT_SPEC DOMString ixmlNodetoString( /*! [in] The root of the \b Node tree to render to XML text. */ IXML_Node *doc); /*! * \brief Makes the XML parser more tolerant to malformed text. */ EXPORT_SPEC void ixmlRelaxParser( /*! [in] If \b errorChar is 0 (default), the parser is strict about XML * encoding : invalid UTF-8 sequences or "&" entities are rejected, and * the parsing aborts. * * If \b errorChar is not 0, the parser is relaxed: invalid UTF-8 * characters are replaced by the \b errorChar, and invalid "&" entities * are left untranslated. The parsing is then allowed to continue. */ char errorChar); /*! * \brief Parses an XML text buffer converting it into an IXML DOM representation. * * \return A \b Document if the buffer correctly parses or \c NULL on an error. */ EXPORT_SPEC IXML_Document *ixmlParseBuffer( /*! [in] The buffer that contains the XML text to convert to a \b Document. */ const char *buffer); /*! * \brief Parses an XML text buffer converting it into an IXML DOM representation. * * The \b ixmlParseBufferEx API differs from the \b ixmlParseBuffer * API in that it returns an error code representing the actual failure * rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: The \b buffer is not a valid * pointer. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlParseBufferEx( /*! [in] The buffer that contains the XML text to convert to a \b Document. */ const char *buffer, /*! [out] A point to store the \b Document if file correctly parses or \b NULL on an error. */ IXML_Document** doc); /*! * \brief Parses an XML text file converting it into an IXML DOM representation. * * \return A \b Document if the file correctly parses or \c NULL on an error. */ EXPORT_SPEC IXML_Document *ixmlLoadDocument( /*! [in] The filename of the XML text to convert to a \b Document. */ const char* xmlFile); /*! * \brief Parses an XML text file converting it into an IXML DOM representation. * * The \b ixmlLoadDocumentEx API differs from the \b ixmlLoadDocument * API in that it returns a an error code representing the actual failure * rather than just \c NULL. * * \return An integer representing one of the following: * \li \c IXML_SUCCESS: The operation completed successfully. * \li \c IXML_INVALID_PARAMETER: The \b xmlFile is not a valid * pointer. * \li \c IXML_INSUFFICIENT_MEMORY: Not enough free memory exists * to complete this operation. */ EXPORT_SPEC int ixmlLoadDocumentEx( /*! [in] The filename of the XML text to convert to a \b Document. */ const char *xmlFile, /*! [out] A pointer to the \b Document if file correctly parses or \b NULL * on an error. */ IXML_Document **doc); /*! * \brief Clones an existing \b DOMString. * * \return A new \b DOMString that is a duplicate of the original or \c NULL * if the operation could not be completed. */ EXPORT_SPEC DOMString ixmlCloneDOMString( /*! [in] The source \b DOMString to clone. */ const DOMString src); /*! * \brief Frees a \b DOMString. */ EXPORT_SPEC void ixmlFreeDOMString( /*! [in] The \b DOMString to free. */ DOMString buf); /* @} IXML API */ #ifdef __cplusplus } #endif /* @} XMLAPI XML API */ #endif /* IXML_H */ libupnp-1.8.0~svn20100507/ixml/inc/ixmldebug.h0000644000175000017500000000247211362564224015543 00000000000000 #ifndef IXMLDEBUG_H #define IXMLDEBUG_H #include "UpnpGlobal.h" #include "ixml.h" /*! * \file * * \brief Auxiliar routines to aid debugging. */ /*! * \brief Prints the debug statement either on the standard output or log file * along with the information from where this debug statement is coming. */ #ifdef DEBUG void IxmlPrintf( /*! [in] The file name, usually __FILE__. */ const char *DbgFileName, /*! [in] The line number, usually __LINE__ or a variable that got the * __LINE__ at the appropriate place. */ int DbgLineNo, /*! [in] The function name. */ const char *FunctionName, /*! [in] Printf like format specification. */ const char* FmtStr, /*! [in] Printf like Variable number of arguments that will go in the debug * statement. */ ...) #if (__GNUC__ >= 3) /* This enables printf like format checking by the compiler */ __attribute__((format (__printf__, 4, 5))) #endif ; #else /* DEBUG */ static UPNP_INLINE void IxmlPrintf( const char* FmtStr, ...) {} #endif /* DEBUG */ /*! * \brief Print the node names and values of a XML tree. */ #ifdef DEBUG void printNodes( /*! [in] The root of the tree to print. */ IXML_Node *tmpRoot, /*! [in] The depth to print. */ int depth); #else static UPNP_INLINE void printNodes( IXML_Node *tmpRoot, int depth) { } #endif #endif /* IXMLDEBUG_H */ libupnp-1.8.0~svn20100507/ixml/src/0000777000175000017500000000000011373047470013510 500000000000000libupnp-1.8.0~svn20100507/ixml/src/inc/0000777000175000017500000000000011373047470014261 500000000000000libupnp-1.8.0~svn20100507/ixml/src/inc/ixmlparser.h0000644000175000017500000001473011042015422016522 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef IXMLPARSER_H #define IXMLPARSER_H /*! * \file */ #include "ixml.h" #include "ixmlmembuf.h" /* Parser definitions */ #define QUOT """ #define LT "<" #define GT ">" #define APOS "'" #define AMP "&" #define ESC_HEX "&#x" #define ESC_DEC "&#" typedef struct _IXML_NamespaceURI { char *nsURI; char *prefix; struct _IXML_NamespaceURI *nextNsURI; } IXML_NamespaceURI; typedef struct _IXML_ElementStack { char *element; char *prefix; char *namespaceUri; IXML_NamespaceURI *pNsURI; struct _IXML_ElementStack *nextElement; } IXML_ElementStack; typedef enum { eELEMENT, eATTRIBUTE, eCONTENT, } PARSER_STATE; typedef struct _Parser { /*! Data buffer. */ char *dataBuffer; /*! Pointer to the token parsed. */ char *curPtr; /*! Saves for backup. */ char *savePtr; ixml_membuf lastElem; ixml_membuf tokenBuf; IXML_Node *pNeedPrefixNode; IXML_ElementStack *pCurElement; IXML_Node *currentNodePtr; PARSER_STATE state; BOOL bHasTopLevel; } Parser; /*! * \brief Check to see whether name is a valid xml name. */ BOOL Parser_isValidXmlName( /*! [in] The string to be checked. */ const DOMString name); /*! * \brief Sets the error character. * * If 'c' is 0 (default), the parser is strict about XML encoding: * invalid UTF-8 sequences or "&" entities are rejected, and the parsing * aborts. * * If 'c' is not 0, the parser is relaxed: invalid UTF-8 characters * are replaced by this character, and invalid "&" entities are left * untranslated. The parsing is then allowed to continue. */ void Parser_setErrorChar( /*! [in] The character to become the error character. */ char c); /*! * \brief Fees a node contents. */ void Parser_freeNodeContent( /*! [in] The Node to process. */ IXML_Node *IXML_Nodeptr); int Parser_LoadDocument(IXML_Document **retDoc, const char * xmlFile, BOOL file); int Parser_setNodePrefixAndLocalName(IXML_Node *newIXML_NodeIXML_Attr); void ixmlAttr_init(IXML_Attr *attrNode); /*! * \brief Set the given element's tagName. * * \return One of the following: * \li \b IXML_SUCCESS, if successfull. * \li \b IXML_FAILED, if element of tagname is \b NULL. * \li \b IXML_INSUFFICIENT_MEMORY, if there is no memory to allocate the * buffer for the element's tagname. */ int ixmlElement_setTagName( /*! [in] The element to change the tagname. */ IXML_Element *element, /*! [in] The new tagName for the element. */ const char *tagName); /*! * \brief Initializes a NamedNodeMap object. */ void ixmlNamedNodeMap_init( /*! [in] The named node map to process. */ IXML_NamedNodeMap *nnMap); /*! * \brief Add a node to a NamedNodeMap. * * \return IXML_SUCCESS or failure. */ int ixmlNamedNodeMap_addToNamedNodeMap( /* [in] The named node map. */ IXML_NamedNodeMap **nnMap, /* [in] The node to add. */ IXML_Node *add); /*! * \brief Add a node to nodelist. */ int ixmlNodeList_addToNodeList( /*! [in] The pointer to the nodelist. */ IXML_NodeList **nList, /*! [in] The node to add. */ IXML_Node *add); /*! * \brief Intializes a node. */ void ixmlNode_init( /*! [in] The \b Node to iniatialize. */ IN IXML_Node *nodeptr); /*! * \brief Compare two nodes to see whether they are the same node. * Parent, sibling and children node are ignored. * * \return * \li TRUE, the two nodes are the same. * \li FALSE, the two nodes are not the same. */ BOOL ixmlNode_compare( /*! [in] The first \b Node. */ IXML_Node *srcNode, /*! [in] The second \b Node. */ IXML_Node *destNode); /*! * \brief Returns a nodeList of all descendant Elements with a given tagName, * in the order in which they are encountered in a traversal of this element * tree. */ void ixmlNode_getElementsByTagName( /*! [in] The \b Node tree. */ IXML_Node *n, /*! [in] The tag name to match. */ const char *tagname, /*! [out] The output \b NodeList. */ IXML_NodeList **list); /*! * \brief Returns a nodeList of all the descendant Elements with a given local * name and namespace URI in the order in which they are encountered in a * preorder traversal of this Elememt tree. */ void ixmlNode_getElementsByTagNameNS( /*! [in] The \b Element tree. */ IXML_Node *n, /*! [in] The name space to match. */ const char *namespaceURI, /*! [in] The local name to match. */ const char *localName, /*! [out] The output \b NodeList. */ IXML_NodeList **list); /*! * \brief * * \return */ int ixmlNode_setNodeName( /*! [in] The \b Node. */ IXML_Node *node, /*! [in] . */ const DOMString qualifiedName); /*! * \brief * * \return */ int ixmlNode_setNodeProperties( /*! [in] . */ IXML_Node *destNode, /*! [in] . */ IXML_Node *src); /*! * \brief Initializes a nodelist */ void ixmlNodeList_init( /*! [in,out] The \b NodeList to initialize. */ IXML_NodeList *nList); #endif /* IXMLPARSER_H */ libupnp-1.8.0~svn20100507/ixml/src/inc/ixmlmembuf.h0000644000175000017500000001136211025042303016476 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef IXML_MEMBUF_H #define IXML_MEMBUF_H /*! * \file */ #include "ixml.h" #include /* for size_t */ #define MINVAL(a, b) ( (a) < (b) ? (a) : (b) ) #define MAXVAL(a, b) ( (a) > (b) ? (a) : (b) ) #define MEMBUF_DEF_SIZE_INC 20 /*! * \brief The ixml_membuf type. */ typedef struct { char *buf; size_t length; size_t capacity; size_t size_inc; } ixml_membuf; /*! * \brief ixml_membuf initialization routine. */ void ixml_membuf_init( /*! [in,out] The memory buffer to initializa. */ ixml_membuf *m); /*! * \brief ixml_membuf clearing routine. * * The internal buffer is deleted and ixml_membuf_init() is called in the end * to reinitialize the buffer. */ void ixml_membuf_destroy( /*! [in,out] The memory buffer to clear. */ ixml_membuf *m); /*! * \brief Copies the contents o a buffer to the designated ixml_membuf. * * The previous contents of the ixml_membuf are destroyed. * * \return IXML_SUCCESS if successfull, or the error code returned * by ixml_membuf_set_size(). * * \sa ixml_membuf_assign_str(). */ int ixml_membuf_assign( /*! [in,out] The memory buffer on which to operate. */ ixml_membuf *m, /*! [in] The input buffer to copy from. */ const void *buf, /*! [in] The number of bytes to copy from the input buffer. */ size_t buf_len); /*! * \brief Copies a \b NULL terminated string to the ixml_buffer. * * This is a convenience function that internally uses ixml_membuf_assign(). * * \return The return value of ixml_membuf_assign(). * * \sa ixml_membuf_assign(). */ int ixml_membuf_assign_str( /*! [in,out] The memory buffer on which to operate. */ ixml_membuf *m, /*! [in] The input string to copy from. */ const char *c_str); /*! * \brief Appends one byte to the designated ixml_membuffer. * * This is a convenience function that internally uses ixml_membuf_insert(). * * \return The return value of ixml_membuf_insert(). * * \sa ixml_membuf_insert() */ int ixml_membuf_append( /*! [in,out] The memory buffer on which to operate. */ ixml_membuf *m, /*! [in] The pointer to the byte to append. */ const void *buf); /*! * \brief Appends the contents of a \b NULL terminated string to the designated * ixml_membuf. * * This is a convenience function that internally uses ixml_membuf_insert(). * * \return The return value of ixml_membuf_insert(). * * \sa ixml_membuf_insert(). */ int ixml_membuf_append_str( /*! [in,out] The memory buffer on which to operate. */ ixml_membuf *m, /*! [in] The input string to copy from. */ const char *c_str); /*! * \brief * * \return * \li 0 if successfull. * \li IXML_INDEX_SIZE_ERR if the index parameter is out of range. * \li Or the return code of ixml_membuf_set_size() * * \sa ixml_membuf_set_size() */ int ixml_membuf_insert( /*! [in,out] The memory buffer on which to operate. */ ixml_membuf *m, /*! [in] The pointer to the input buffer. */ const void *buf, /*! [in] The buffer length. */ size_t buf_len, /*! [in] The point of insertion relative to the beggining of the * ixml_membuf internal buffer. */ int index); #endif /* IXML_MEMBUF_H */ libupnp-1.8.0~svn20100507/ixml/src/ixmlparser.c0000644000175000017500000021233311362564224015761 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /*! * \file */ #include "ixmlparser.h" #include "ixmldebug.h" #include #include #include /* for free(), malloc() */ #include #ifdef WIN32 #define strncasecmp strnicmp #endif static char g_error_char = '\0'; static const char LESSTHAN = '<'; static const char GREATERTHAN = '>'; static const char SLASH = '/'; static const char EQUALS = '='; static const char QUOTE = '\"'; static const char SINGLEQUOTE = '\''; static const char *WHITESPACE = "\n\t\r "; static const char *COMPLETETAG = "/>"; static const char *ENDTAG = ""; static const char *BEGIN_PI = ""; static const char *BEGIN_DOCTYPE = ""; static const char *DEC_NUMBERS = "0123456789"; static const char *HEX_NUMBERS = "0123456789ABCDEFabcdef"; typedef struct char_info { unsigned short l; unsigned short h; } char_info_t; typedef char utf8char[8]; /*! * \brief The letter table contains all characters in XML 1.0 plus ":", "_" and * ideographic. * * This table contains all the characters that an element name can start with. * See XML 1.0 (2nd Edition) for more details. */ static char_info_t Letter[] = { {0x003A, 0x003A}, // character ":" {0x0041, 0x005A}, {0x005F, 0x005F}, // character "_" {0x0061, 0x007A}, {0x00C0, 0x00D6}, {0x00D8, 0x00F6}, {0x00F8, 0x00FF}, {0x0100, 0x0131}, {0x0134, 0x013E}, {0x0141, 0x0148}, {0x014A, 0x017E}, {0x0180, 0x01C3}, {0x01CD, 0x01F0}, {0x01F4, 0x01F5}, {0x01FA, 0x0217}, {0x0250, 0x02A8}, {0x02BB, 0x02C1}, {0x0386, 0x0386}, {0x0388, 0x038A}, {0x038C, 0x038C}, {0x038E, 0x03A1}, {0x03A3, 0x03CE}, {0x03D0, 0x03D6}, {0x03DA, 0x03DA}, {0x03DC, 0x03DC}, {0x03DE, 0x03DE}, {0x03E0, 0x03E0}, {0x03E2, 0x03F3}, {0x0401, 0x040C}, {0x040E, 0x044F}, {0x0451, 0x045C}, {0x045E, 0x0481}, {0x0490, 0x04C4}, {0x04C7, 0x04C8}, {0x04CB, 0x04CC}, {0x04D0, 0x04EB}, {0x04EE, 0x04F5}, {0x04F8, 0x04F9}, {0x0531, 0x0556}, {0x0559, 0x0559}, {0x0561, 0x0586}, {0x05D0, 0x05EA}, {0x05F0, 0x05F2}, {0x0621, 0x063A}, {0x0641, 0x064A}, {0x0671, 0x06B7}, {0x06BA, 0x06BE}, {0x06C0, 0x06CE}, {0x06D0, 0x06D3}, {0x06D5, 0x06D5}, {0x06E5, 0x06E6}, {0x0905, 0x0939}, {0x093D, 0x093D}, {0x0958, 0x0961}, {0x0985, 0x098C}, {0x098F, 0x0990}, {0x0993, 0x09A8}, {0x09AA, 0x09B0}, {0x09B2, 0x09B2}, {0x09B6, 0x09B9}, {0x09DC, 0x09DD}, {0x09DF, 0x09E1}, {0x09F0, 0x09F1}, {0x0A05, 0x0A0A}, {0x0A0F, 0x0A10}, {0x0A13, 0x0A28}, {0x0A2A, 0x0A30}, {0x0A32, 0x0A33}, {0x0A35, 0x0A36}, {0x0A38, 0x0A39}, {0x0A59, 0x0A5C}, {0x0A5E, 0x0A5E}, {0x0A72, 0x0A74}, {0x0A85, 0x0A8B}, {0x0A8D, 0x0A8D}, {0x0A8F, 0x0A91}, {0x0A93, 0x0AA8}, {0x0AAA, 0x0AB0}, {0x0AB2, 0x0AB3}, {0x0AB5, 0x0AB9}, {0x0ABD, 0x0ABD}, {0x0AE0, 0x0AE0}, {0x0B05, 0x0B0C}, {0x0B0F, 0x0B10}, {0x0B13, 0x0B28}, {0x0B2A, 0x0B30}, {0x0B32, 0x0B33}, {0x0B36, 0x0B39}, {0x0B3D, 0x0B3D}, {0x0B5C, 0x0B5D}, {0x0B5F, 0x0B61}, {0x0B85, 0x0B8A}, {0x0B8E, 0x0B90}, {0x0B92, 0x0B95}, {0x0B99, 0x0B9A}, {0x0B9C, 0x0B9C}, {0x0B9E, 0x0B9F}, {0x0BA3, 0x0BA4}, {0x0BA8, 0x0BAA}, {0x0BAE, 0x0BB5}, {0x0BB7, 0x0BB9}, {0x0C05, 0x0C0C}, {0x0C0E, 0x0C10}, {0x0C12, 0x0C28}, {0x0C2A, 0x0C33}, {0x0C35, 0x0C39}, {0x0C60, 0x0C61}, {0x0C85, 0x0C8C}, {0x0C8E, 0x0C90}, {0x0C92, 0x0CA8}, {0x0CAA, 0x0CB3}, {0x0CB5, 0x0CB9}, {0x0CDE, 0x0CDE}, {0x0CE0, 0x0CE1}, {0x0D05, 0x0D0C}, {0x0D0E, 0x0D10}, {0x0D12, 0x0D28}, {0x0D2A, 0x0D39}, {0x0D60, 0x0D61}, {0x0E01, 0x0E2E}, {0x0E30, 0x0E30}, {0x0E32, 0x0E33}, {0x0E40, 0x0E45}, {0x0E81, 0x0E82}, {0x0E84, 0x0E84}, {0x0E87, 0x0E88}, {0x0E8A, 0x0E8A}, {0x0E8D, 0x0E8D}, {0x0E94, 0x0E97}, {0x0E99, 0x0E9F}, {0x0EA1, 0x0EA3}, {0x0EA5, 0x0EA5}, {0x0EA7, 0x0EA7}, {0x0EAA, 0x0EAB}, {0x0EAD, 0x0EAE}, {0x0EB0, 0x0EB0}, {0x0EB2, 0x0EB3}, {0x0EBD, 0x0EBD}, {0x0EC0, 0x0EC4}, {0x0F40, 0x0F47}, {0x0F49, 0x0F69}, {0x10A0, 0x10C5}, {0x10D0, 0x10F6}, {0x1100, 0x1100}, {0x1102, 0x1103}, {0x1105, 0x1107}, {0x1109, 0x1109}, {0x110B, 0x110C}, {0x110E, 0x1112}, {0x113C, 0x113C}, {0x113E, 0x113E}, {0x1140, 0x1140}, {0x114C, 0x114C}, {0x114E, 0x114E}, {0x1150, 0x1150}, {0x1154, 0x1155}, {0x1159, 0x1159}, {0x115F, 0x1161}, {0x1163, 0x1163}, {0x1165, 0x1165}, {0x1167, 0x1167}, {0x1169, 0x1169}, {0x116D, 0x116E}, {0x1172, 0x1173}, {0x1175, 0x1175}, {0x119E, 0x119E}, {0x11A8, 0x11A8}, {0x11AB, 0x11AB}, {0x11AE, 0x11AF}, {0x11B7, 0x11B8}, {0x11BA, 0x11BA}, {0x11BC, 0x11C2}, {0x11EB, 0x11EB}, {0x11F0, 0x11F0}, {0x11F9, 0x11F9}, {0x1E00, 0x1E9B}, {0x1EA0, 0x1EF9}, {0x1F00, 0x1F15}, {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, {0x1FB6, 0x1FBC}, {0x1FBE, 0x1FBE}, {0x1FC2, 0x1FC4}, {0x1FC6, 0x1FCC}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB}, {0x1FE0, 0x1FEC}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, {0x2126, 0x2126}, {0x212A, 0x212B}, {0x212E, 0x212E}, {0x2180, 0x2182}, {0x3007, 0x3007}, {0x3021, 0x3029}, /* these two are ideographic */ {0x3041, 0x3094}, {0x30A1, 0x30FA}, {0x3105, 0x312C}, {0x4E00, 0x9FA5}, /* ideographic */ {0xAC00, 0xD7A3} }; /*! * \brief The size of the letter table array. */ #define LETTERTABLESIZE (sizeof(Letter)/sizeof(Letter[0])) /*! * \brief The NameChar table contains CombiningChar, Extender, Digit, * '-', '.', less '_', ':' * * NameChar ::= Digit | '-' | '.' | CombiningChar | Extender * See XML 1.0 2nd Edition */ static char_info_t NameChar[] = { {0x002D, 0x002D}, /* character "-" */ {0x002E, 0x002E}, /* character "." */ {0x0030, 0x0039}, /* digit */ {0x00B7, 0x00B7}, {0x02D0, 0x02D0}, {0x02D1, 0x02D1}, /* extended */ {0x0300, 0x0345}, {0x0360, 0x0361}, {0x0387, 0x0387}, /* extended */ {0x0483, 0x0486}, {0x0591, 0x05A1}, {0x05A3, 0x05B9}, {0x05BB, 0x05BD}, {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C4}, {0x0640, 0x0640}, /* extended */ {0x064B, 0x0652}, {0x0660, 0x0669}, /* digit */ {0x0670, 0x0670}, {0x06D6, 0x06DC}, {0x06DD, 0x06DF}, {0x06E0, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x06F0, 0x06F9}, /* digit */ {0x0901, 0x0903}, {0x093C, 0x093C}, {0x093E, 0x094C}, {0x094D, 0x094D}, {0x0951, 0x0954}, {0x0962, 0x0963}, {0x0966, 0x096F}, /* digit */ {0x0981, 0x0983}, {0x09BC, 0x09BC}, {0x09BE, 0x09BE}, {0x09BF, 0x09BF}, {0x09C0, 0x09C4}, {0x09C7, 0x09C8}, {0x09CB, 0x09CD}, {0x09D7, 0x09D7}, {0x09E2, 0x09E3}, {0x09E6, 0x09EF}, /* digit */ {0x0A02, 0x0A02}, {0x0A3C, 0x0A3C}, {0x0A3E, 0x0A3E}, {0x0A3F, 0x0A3F}, {0x0A40, 0x0A42}, {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A66, 0x0A6F}, /* digit */ {0x0A70, 0x0A71}, {0x0A81, 0x0A83}, {0x0ABC, 0x0ABC}, {0x0ABE, 0x0AC5}, {0x0AC7, 0x0AC9}, {0x0ACB, 0x0ACD}, {0x0AE6, 0x0AEF}, /* digit */ {0x0B01, 0x0B03}, {0x0B3C, 0x0B3C}, {0x0B3E, 0x0B43}, {0x0B47, 0x0B48}, {0x0B4B, 0x0B4D}, {0x0B56, 0x0B57}, {0x0B66, 0x0B6F}, /* digit */ {0x0B82, 0x0B83}, {0x0BBE, 0x0BC2}, {0x0BC6, 0x0BC8}, {0x0BCA, 0x0BCD}, {0x0BD7, 0x0BD7}, {0x0BE7, 0x0BEF}, /* digit */ {0x0C01, 0x0C03}, {0x0C3E, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56}, {0x0C66, 0x0C6F}, /* digit */ {0x0C82, 0x0C83}, {0x0CBE, 0x0CC4}, {0x0CC6, 0x0CC8}, {0x0CCA, 0x0CCD}, {0x0CD5, 0x0CD6}, {0x0CE6, 0x0CEF}, /* digit */ {0x0D02, 0x0D03}, {0x0D3E, 0x0D43}, {0x0D46, 0x0D48}, {0x0D4A, 0x0D4D}, {0x0D57, 0x0D57}, {0x0D66, 0x0D6F}, /* digit */ {0x0E31, 0x0E31}, {0x0E34, 0x0E3A}, {0x0E46, 0x0E46}, /* extended */ {0x0E47, 0x0E4E}, {0x0E50, 0x0E59}, /* digit */ {0x0EB1, 0x0EB1}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, {0x0EC6, 0x0EC6}, /* extended */ {0x0EC8, 0x0ECD}, {0x0ED0, 0x0ED9}, /* digit */ {0x0F18, 0x0F19}, {0x0F20, 0x0F29}, /* digit */ {0x0F35, 0x0F35}, {0x0F37, 0x0F37}, {0x0F39, 0x0F39}, {0x0F3E, 0x0F3E}, {0x0F3F, 0x0F3F}, {0x0F71, 0x0F84}, {0x0F86, 0x0F8B}, {0x0F90, 0x0F95}, {0x0F97, 0x0F97}, {0x0F99, 0x0FAD}, {0x0FB1, 0x0FB7}, {0x0FB9, 0x0FB9}, {0x20D0, 0x20DC}, {0x20E1, 0x20E1}, {0x3005, 0x3005}, /* extended */ {0x302A, 0x302F}, {0x3031, 0x3035}, /* extended */ {0x3099, 0x3099}, {0x309A, 0x309A}, /* combining char */ {0x309D, 0x309E}, {0x30FC, 0x30FE} /* extended */ }; /*! * \brief The name char table array size. */ #define NAMECHARTABLESIZE (sizeof(NameChar)/sizeof(NameChar[0])) static void Parser_free( Parser *myParser); static int Parser_skipDocType( char **pstr); static int Parser_skipProlog( Parser *xmlParser); static int Parser_skipMisc( Parser *xmlParser); static void Parser_freeElementStackItem( IXML_ElementStack *pItem); static void Parser_freeNsURI( IXML_NamespaceURI *pNsURI); static int Parser_getNextNode( Parser *myParser, IXML_Node *newNode, BOOL *isEnd); static int Parser_getNextToken( Parser *myParser); static int Parser_xmlNamespace( Parser *myParser, IXML_Node *newNode); static BOOL Parser_ElementPrefixDefined( Parser *myParser, IXML_Node *newNode, char **nsURI); static int Parser_setElementNamespace( IXML_Element *newElement, const char *nsURI); static int Parser_parseDocument( IXML_Document **retDoc, Parser *domParser); static BOOL Parser_hasDefaultNamespace( Parser *xmlParser, IXML_Node *newNode, char **nsURI); static int Parser_getChar( const char *src, int *cLen); /*! * \brief Version of strdup() that handles NULL input. * * \return The same as strdup(). */ static char *safe_strdup( /*! [in] String to be duplicated. */ const char *s) { assert(s != NULL); if (s == NULL) { return strdup(""); } return strdup(s); } /*! * \brief Will determine whether character c is in the table of tbl (either * Letter table or NameChar table). * * \return TRUE or FALSE. */ static BOOL Parser_isCharInTable( /*! [in] Character to check. */ int c, /*! [in] Table to use. */ char_info_t *tbl, /*! [in] Size of the table. */ int sz) { int t = 0; int b = sz; int m; while (t <= b) { m = ( t + b ) / 2; if (c < tbl[m].l) { b = m - 1; } else if (c > tbl[m].h) { t = m + 1; } else { return TRUE; } } return FALSE; } /*! * \brief see XML 1.0 (2nd Edition) 2.2. */ static BOOL Parser_isXmlChar( /*! [in] The character to check. */ int c) { return c == 0x9 || c == 0xA || c == 0xD || (c >= 0x20 && c <= 0xD7FF) || (c >= 0xE000 && c <= 0xFFFD) || (c >= 0x10000 && c <= 0x10FFFF); } /*! * \brief Check whether c (int) is in LetterTable or NameCharTable. */ static BOOL Parser_isNameChar( /*! [in] The character to check. */ int c, /*! [in] TRUE if you also want to check in the NameChar table. */ BOOL bNameChar) { if (Parser_isCharInTable(c, Letter, LETTERTABLESIZE)) { return TRUE; } if (bNameChar && Parser_isCharInTable(c, NameChar, NAMECHARTABLESIZE)) { return TRUE; } return FALSE; } BOOL Parser_isValidXmlName(const DOMString name) { const char *pstr = NULL; int i = 0; int nameLen = 0; assert(name != NULL); nameLen = strlen(name); pstr = name; if (Parser_isNameChar(*pstr, FALSE) == TRUE) { for (i = 1; i < nameLen; ++i) { if (Parser_isNameChar(*(pstr + i), TRUE) == FALSE) { /* illegal char */ return FALSE; } } } return TRUE; } void Parser_setErrorChar(char c) { g_error_char = c; } /*! * \brief Encodes a character to its UTF-8 character string, and return its length. * * \return The length of the encoded string in bytes. */ static int Parser_intToUTF8( /*! [in] The character to encode. */ int c, /*! [out] The resultant UTF-8 encoded string. */ utf8char s) { if( c < 0 ) { return 0; } if( c <= 127 ) { s[0] = c; s[1] = 0; return 1; } else if( c <= 0x07FF ) { /* 0x0080 < c <= 0x07FF */ s[0] = 0xC0 | ( c >> 6 ); s[1] = 0x80 | ( c & 0x3f ); s[2] = 0; return 2; } else if( c <= 0xFFFF ) { /* 0x0800 < c <= 0xFFFF */ s[0] = 0xE0 | ( c >> 12 ); s[1] = 0x80 | ( ( c >> 6 ) & 0x3f ); s[2] = 0x80 | ( c & 0x3f ); s[3] = 0; return 3; } else if( c <= 0x1FFFFF ) { /* 0x10000 < c <= 0x1FFFFF */ s[0] = 0xF0 | ( c >> 18 ); s[1] = 0x80 | ( ( c >> 12 ) & 0x3f ); s[2] = 0x80 | ( ( c >> 6 ) & 0x3f ); s[3] = 0x80 | ( c & 0x3f ); s[4] = 0; return 4; } else if( c <= 0x3FFFFFF ) { /* 0x200000 < c <= 3FFFFFF */ s[0] = 0xF8 | ( c >> 24 ); s[1] = 0x80 | ( ( c >> 18 ) & 0x3f ); s[2] = 0x80 | ( ( c >> 12 ) & 0x3f ); s[3] = 0x80 | ( ( c >> 6 ) & 0x3f ); s[4] = 0x80 | ( c & 0x3f ); s[5] = 0; return 5; } else if( c <= 0x7FFFFFFF ) { /* 0x4000000 < c <= 7FFFFFFF */ s[0] = 0xFC | ( c >> 30 ); s[1] = 0x80 | ( ( c >> 24 ) & 0x3f ); s[2] = 0x80 | ( ( c >> 18 ) & 0x3f ); s[3] = 0x80 | ( ( c >> 12 ) & 0x3f ); s[4] = 0x80 | ( ( c >> 6 ) & 0x3f ); s[5] = 0x80 | ( c & 0x3f ); s[6] = 0; return 6; } else { /* illegal */ return 0; } } /*! * \brief In UTF-8, characters are encoded using sequences of 1 to 6 octets. * This functions will return a UTF-8 character value and its octets number. * * \return The UTF-8 character converted to an int (32 bits). */ static int Parser_UTF8ToInt( /*! [in] The pointer to the character to encode. */ const char *ss, /*! [out] The number of octets of the UTF-8 encoding of this character. */ int *len) { const unsigned char *s = (const unsigned char *)ss; int c = *s; if (c <= 127) { /* if c<=127, c is just the character. */ *len = 1; return c; } else if ((c & 0xE0) == 0xC0 && (s[1] & 0xc0) == 0x80) { /* a sequence of 110xxxxx and 10xxxxxx? */ *len = 2; return ((c & 0x1f) << 6) | (s[1] & 0x3f); } else if ((c & 0xF0) == 0xE0 && (s[1] & 0xc0) == 0x80 && (s[2] & 0xc0) == 0x80) { /* a sequence of 1110xxxx,10xxxxxx and 10xxxxxx ? */ *len = 3; return ((c & 0x0f) << 12) | ((s[1] & 0x3f) << 6) | (s[2] & 0x3f); } else if ((c & 0xf8) == 0xf0 && (s[1] & 0xc0) == 0x80 && (s[2] & 0xc0) == 0x80 && (s[3] & 0xc0) == 0x80) { /* a sequence of 11110xxx,10xxxxxx,10xxxxxx and 10xxxxxx ? */ *len = 4; return ((c & 0x07) << 18) | ((s[1] & 0x3f) << 12) | ((s[2] & 0x3f) << 6) | (s[3] & 0x3f); } else if ((c & 0xfc) == 0xf8 && (s[1] & 0xc0) == 0x80 && (s[2] & 0xc0) == 0x80 && (s[3] & 0xc0) == 0x80 && (s[4] & 0xc0) == 0x80) { /* a sequence of 111110xx,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx ? */ *len = 5; return ((c & 0x03) << 24) | ((s[1] & 0x3f) << 18) | ((s[2] & 0x3f) << 12) | ((s[3] & 0x3f) << 6) | (s[4] & 0x3f); } else if ((c & 0xfe) == 0xfc && (s[1] & 0xc0) == 0x80 && (s[2] & 0xc0) == 0x80 && (s[3] & 0xc0) == 0x80 && (s[4] & 0xc0) == 0x80 && (s[5] & 0xc0) == 0x80) { /* a sequence of 1111110x,10xxxxxx,10xxxxxx,10xxxxxx,10xxxxxx and 10xxxxxx ? */ *len = 6; return ((c & 0x01) << 30) | ((s[1] & 0x3f) << 24) | ((s[2] & 0x3f) << 18) | ((s[3] & 0x3f) << 12) | ((s[4] & 0x3f) << 6) | (s[5] & 0x3f); } else { /* none of above, error */ int ret = 0; int line = __LINE__; if (g_error_char) { *len = 1; ret = g_error_char; } else { *len = 0; ret = -1; } IxmlPrintf(__FILE__, line, "Parser_UTF8ToInt", "Error %d\n", ret); return ret; } } /*! * \brief Initializes a xml parser. * * \return The parser object or \b NULL if there is not enough memory. */ static Parser *Parser_init() { Parser *newParser = NULL; newParser = (Parser *)malloc(sizeof (Parser)); if (newParser == NULL) { return NULL; } memset(newParser, 0, sizeof (Parser)); ixml_membuf_init(&(newParser->tokenBuf)); ixml_membuf_init(&(newParser->lastElem)); return newParser; } /*! * \brief Check if a new node->nodeName matches top of element stack. * * \return TRUE if matches. */ static int Parser_isValidEndElement( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The node. */ IXML_Node *newNode) { assert(xmlParser); assert(xmlParser->pCurElement); assert(xmlParser->pCurElement->element); assert(newNode); assert(newNode->nodeName); return strcmp(xmlParser->pCurElement->element, newNode->nodeName) == 0; } /*! * \brief Push a new element onto element stack. * * \return */ static int Parser_pushElement( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The element node to push. */ IXML_Node *newElement) { IXML_ElementStack *pCurElement = NULL; IXML_ElementStack *pNewStackElement = NULL; assert( newElement ); if( newElement != NULL ) { /* push new element */ pNewStackElement = ( IXML_ElementStack * ) malloc( sizeof( IXML_ElementStack ) ); if( pNewStackElement == NULL ) { return IXML_INSUFFICIENT_MEMORY; } memset( pNewStackElement, 0, sizeof( IXML_ElementStack ) ); /* the element member includes both prefix and name */ pNewStackElement->element = safe_strdup( newElement->nodeName ); if( pNewStackElement->element == NULL ) { free( pNewStackElement ); return IXML_INSUFFICIENT_MEMORY; } if( newElement->prefix != 0 ) { pNewStackElement->prefix = safe_strdup( newElement->prefix ); if( pNewStackElement->prefix == NULL ) { Parser_freeElementStackItem( pNewStackElement ); free( pNewStackElement ); return IXML_INSUFFICIENT_MEMORY; } } if( newElement->namespaceURI != 0 ) { pNewStackElement->namespaceUri = safe_strdup( newElement->namespaceURI ); if( pNewStackElement->namespaceUri == NULL ) { Parser_freeElementStackItem( pNewStackElement ); free( pNewStackElement ); return IXML_INSUFFICIENT_MEMORY; } } pCurElement = xmlParser->pCurElement; /* insert the new element into the top of the stack */ pNewStackElement->nextElement = pCurElement; xmlParser->pCurElement = pNewStackElement; } return IXML_SUCCESS; } /*! * \brief Remove element from element stack. */ static void Parser_popElement( /*! [in] The XML parser. */ Parser *xmlParser) { IXML_ElementStack *pCur = NULL; IXML_NamespaceURI *pnsUri = NULL; IXML_NamespaceURI *pNextNS = NULL; pCur = xmlParser->pCurElement; if (pCur != NULL) { xmlParser->pCurElement = pCur->nextElement; Parser_freeElementStackItem(pCur); pnsUri = pCur->pNsURI; while (pnsUri != NULL) { pNextNS = pnsUri->nextNsURI; Parser_freeNsURI(pnsUri); free(pnsUri); pnsUri = pNextNS; } free(pCur); } } /*! * \brief Read a xml file or buffer contents into xml parser. */ static int Parser_readFileOrBuffer( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The file name or the buffer to copy, according to the * parameter "file". */ const char *xmlFileName, /*! [in] TRUE if you want to read from a file, false if xmlFileName is * the buffer to copy to the parser. */ BOOL file) { int fileSize = 0; int bytesRead = 0; FILE *xmlFilePtr = NULL; if( file ) { xmlFilePtr = fopen( xmlFileName, "rb" ); if( xmlFilePtr == NULL ) { return IXML_NO_SUCH_FILE; } else { fseek( xmlFilePtr, 0, SEEK_END ); fileSize = ftell( xmlFilePtr ); if( fileSize == 0 ) { fclose( xmlFilePtr ); return IXML_SYNTAX_ERR; } xmlParser->dataBuffer = ( char * )malloc( fileSize + 1 ); if( xmlParser->dataBuffer == NULL ) { fclose( xmlFilePtr ); return IXML_INSUFFICIENT_MEMORY; } fseek( xmlFilePtr, 0, SEEK_SET ); bytesRead = fread( xmlParser->dataBuffer, 1, fileSize, xmlFilePtr ); xmlParser->dataBuffer[bytesRead] = '\0'; // append null fclose( xmlFilePtr ); } } else { xmlParser->dataBuffer = safe_strdup( xmlFileName ); if( xmlParser->dataBuffer == NULL ) { return IXML_INSUFFICIENT_MEMORY; } } return IXML_SUCCESS; } /*! * \brief Parses a xml file and return the DOM tree. */ int Parser_LoadDocument( /*! [out] The output document tree. */ IXML_Document **retDoc, /*! [in] The file name or the buffer to copy, according to the * parameter "file". */ const char *xmlFileName, /*! [in] TRUE if you want to read from a file, false if xmlFileName is * the buffer to copy to the parser. */ BOOL file) { int rc = IXML_SUCCESS; Parser *xmlParser = NULL; xmlParser = Parser_init(); if( xmlParser == NULL ) { return IXML_INSUFFICIENT_MEMORY; } rc = Parser_readFileOrBuffer( xmlParser, xmlFileName, file ); if( rc != IXML_SUCCESS ) { Parser_free( xmlParser ); return rc; } xmlParser->curPtr = xmlParser->dataBuffer; rc = Parser_parseDocument( retDoc, xmlParser ); return rc; } /*! * \brief Reports whether there is a top level element in the parser. * * \return TRUE if there is a top level element in the parser. */ static int isTopLevelElement( /*! [in] The XML parser. */ Parser *xmlParser) { assert(xmlParser); return xmlParser->pCurElement == NULL; } /*! * \brief Reports whether the new attribute is the same as an existing one. * * \return TRUE if the new attribute is the same as an existing one. */ static int isDuplicateAttribute( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The node attribute to compare. */ IXML_Node *newAttrNode) { IXML_Node *elementNode = NULL; IXML_Node *attrNode = NULL; elementNode = xmlParser->currentNodePtr; attrNode = elementNode->firstAttr; while( attrNode != NULL ) { if( strcmp( attrNode->nodeName, newAttrNode->nodeName ) == 0 ) { return TRUE; } attrNode = attrNode->nextSibling; } return FALSE; } /*! * \brief Processes the attribute name. * * \return IXML_SUCCESS if successful, otherwise or an error code. */ static int Parser_processAttributeName( /*! [in] The XML document. */ IXML_Document *rootDoc, /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The Node to process. */ IXML_Node *newNode) { IXML_Attr *attr = NULL; int rc = IXML_SUCCESS; if( isDuplicateAttribute( xmlParser, newNode ) == TRUE ) { return IXML_SYNTAX_ERR; } rc = ixmlDocument_createAttributeEx( rootDoc, newNode->nodeName, &attr ); if( rc != IXML_SUCCESS ) { return rc; } rc = ixmlNode_setNodeProperties( ( IXML_Node * ) attr, newNode ); if( rc != IXML_SUCCESS ) { return rc; } rc = ixmlElement_setAttributeNode( (IXML_Element *)xmlParser->currentNodePtr, attr, NULL ); return rc; } /*! * \brief Processes element name. * * \return IXML_SUCCESS if successful, otherwise or an error code. */ static int Parser_processElementName( /*! [in] The XML document. */ IXML_Document *rootDoc, /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The Node to process. */ IXML_Node *newNode ) { IXML_Element *newElement = NULL; char *nsURI = NULL; int rc = IXML_SUCCESS; if( xmlParser->bHasTopLevel == TRUE ) { if( isTopLevelElement( xmlParser ) == TRUE ) { return IXML_SYNTAX_ERR; } } else { xmlParser->bHasTopLevel = TRUE; } xmlParser->savePtr = xmlParser->curPtr; rc = ixmlDocument_createElementEx( rootDoc, newNode->nodeName, &newElement ); if( rc != IXML_SUCCESS ) { return rc; } rc = ixmlNode_setNodeProperties( ( IXML_Node * ) newElement, newNode ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return rc; } if( newNode->prefix != NULL ) { // element has namespace prefix if( Parser_ElementPrefixDefined( xmlParser, newNode, &nsURI ) != TRUE ) { // read next node to see whether it includes namespace definition xmlParser->pNeedPrefixNode = ( IXML_Node * ) newElement; } else { // fill in the namespace Parser_setElementNamespace( newElement, nsURI ); } } else // does element has default namespace { // the node may have default namespace definition if( Parser_hasDefaultNamespace( xmlParser, newNode, &nsURI ) == TRUE ) { Parser_setElementNamespace( newElement, nsURI ); } else if( xmlParser->state == eATTRIBUTE ) { // the default namespace maybe defined later xmlParser->pNeedPrefixNode = ( IXML_Node * ) newElement; } } rc = ixmlNode_appendChild( xmlParser->currentNodePtr, ( IXML_Node * ) newElement ); if( rc != IXML_SUCCESS ) { ixmlElement_free( newElement ); return rc; } xmlParser->currentNodePtr = ( IXML_Node * ) newElement; // push element to stack rc = Parser_pushElement( xmlParser, ( IXML_Node * ) newElement ); return rc; } /*! * \brief Verifies endof element tag is the same as the openning element tag. */ static int Parser_eTagVerification( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The Node to process. */ IXML_Node *newNode) { assert( newNode->nodeName ); assert( xmlParser->currentNodePtr ); if( newNode->nodeType == eELEMENT_NODE ) { if( Parser_isValidEndElement( xmlParser, newNode ) == TRUE ) { Parser_popElement( xmlParser ); } else { // syntax error return IXML_SYNTAX_ERR; } } if( strcmp( newNode->nodeName, xmlParser->currentNodePtr->nodeName ) == 0 ) { xmlParser->currentNodePtr = xmlParser->currentNodePtr->parentNode; } else { return IXML_SYNTAX_ERR; } return IXML_SUCCESS; } void Parser_freeNodeContent(IXML_Node *nodeptr) { if( nodeptr == NULL ) { return; } if( nodeptr->nodeName != NULL ) { free( nodeptr->nodeName ); } if( nodeptr->nodeValue != NULL ) { free( nodeptr->nodeValue ); } if( nodeptr->namespaceURI != NULL ) { free( nodeptr->namespaceURI ); } if( nodeptr->prefix != NULL ) { free( nodeptr->prefix ); } if( nodeptr->localName != NULL ) { free( nodeptr->localName ); } } /*! * \brief Parses the xml file and returns the DOM document tree. * * \return */ static int Parser_parseDocument( /*! [out] The XML document. */ IXML_Document **retDoc, /*! [in] The XML parser. */ Parser *xmlParser) { IXML_Document *gRootDoc = NULL; IXML_Node newNode; BOOL bETag = FALSE; IXML_Node *tempNode = NULL; int rc = IXML_SUCCESS; IXML_CDATASection *cdataSecNode = NULL; // It is important that the node gets initialized here, otherwise things // can go wrong on the error handler. ixmlNode_init( &newNode ); rc = ixmlDocument_createDocumentEx( &gRootDoc ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } xmlParser->currentNodePtr = ( IXML_Node * ) gRootDoc; rc = Parser_skipProlog( xmlParser ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } while( bETag == FALSE ) { // clear the newNode contents. Redundant on the first iteration, // but nonetheless, necessary due to the possible calls to // ErrorHandler above. Currently, this is just a memset to zero. ixmlNode_init( &newNode ); if( Parser_getNextNode( xmlParser, &newNode, &bETag ) == IXML_SUCCESS ) { if( bETag == FALSE ) { switch ( newNode.nodeType ) { case eELEMENT_NODE: rc = Parser_processElementName( gRootDoc, xmlParser, &newNode ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } break; case eTEXT_NODE: rc = ixmlDocument_createTextNodeEx( gRootDoc, newNode. nodeValue, &tempNode ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } rc = ixmlNode_appendChild( xmlParser-> currentNodePtr, tempNode ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } break; case eCDATA_SECTION_NODE: rc = ixmlDocument_createCDATASectionEx( gRootDoc, newNode. nodeValue, &cdataSecNode ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } rc = ixmlNode_appendChild( xmlParser-> currentNodePtr, &( cdataSecNode->n ) ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } break; case eATTRIBUTE_NODE: rc = Parser_processAttributeName( gRootDoc, xmlParser, &newNode ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } break; default: break; } } else // ETag==TRUE, endof element tag. { rc = Parser_eTagVerification( xmlParser, &newNode ); if( rc != IXML_SUCCESS ) { goto ErrorHandler; } xmlParser->state = eCONTENT; } // reset bETag flag bETag = FALSE; } else if( bETag == TRUE ) { // file is done break; } else { rc = IXML_FAILED; goto ErrorHandler; } Parser_freeNodeContent( &newNode ); } if( xmlParser->pCurElement != NULL ) { rc = IXML_SYNTAX_ERR; goto ErrorHandler; } *retDoc = ( IXML_Document * ) gRootDoc; Parser_free( xmlParser ); return rc; ErrorHandler: Parser_freeNodeContent( &newNode ); ixmlDocument_free( gRootDoc ); Parser_free( xmlParser ); return rc; } /*! * \brief Set the last element to be the given string. */ static int Parser_setLastElem( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The string to copy from. */ const char *s) { int rc; if( ( xmlParser == NULL ) || ( s == NULL ) ) { return IXML_FAILED; } rc = ixml_membuf_assign_str( &( xmlParser->lastElem ), s ); return rc; } /*! * \brief Clear token buffer. ******************************************************************************/ static void Parser_clearTokenBuf( /*! [in] The XML parser. */ Parser *xmlParser) { ixml_membuf_destroy( &( xmlParser->tokenBuf ) ); } /*! * \brief Appends string s to token buffer. */ static int Parser_appendTokBufStr( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The string to append. */ const char *s) { int rc = IXML_SUCCESS; if( s != NULL ) { rc = ixml_membuf_append_str( &( xmlParser->tokenBuf ), s ); } return rc; } /*! * \brief Appends c to token buffer. */ static int Parser_appendTokBufChar( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The character to append. */ char c) { int rc; rc = ixml_membuf_append( &( xmlParser->tokenBuf ), &c ); return rc; } /*! * \brief Skip white spaces. */ static void Parser_skipWhiteSpaces( /*! [in] The XML parser. */ Parser *xmlParser) { while( ( *( xmlParser->curPtr ) != 0 ) && ( strchr( WHITESPACE, *( xmlParser->curPtr ) ) != NULL ) ) { xmlParser->curPtr++; } } /*! * \brief Returns next char value and its length. */ static int Parser_getChar( /*! [in] . */ const char *src, /*! [in,out] . */ int *cLen) { int ret = -1; int line = 0; const char *pnum; int sum; char c; int i; if( src == NULL || cLen == NULL ) { line = __LINE__; ret = -1; goto ExitFunction; } *cLen = 0; if (*src != '&') { if (*src > 0 && Parser_isXmlChar(*src)) { *cLen = 1; ret = *src; goto ExitFunction; } i = Parser_UTF8ToInt(src, cLen); if (!Parser_isXmlChar(i)) { line = __LINE__; ret = g_error_char ? g_error_char : -1; goto ExitFunction; } line = __LINE__; ret = i; goto ExitFunction; } else if (strncasecmp(src, QUOT, strlen(QUOT)) == 0) { *cLen = strlen(QUOT); ret = '"'; goto ExitFunction; } else if (strncasecmp(src, LT, strlen(LT)) == 0) { *cLen = strlen(LT); ret = '<'; goto ExitFunction; } else if (strncasecmp(src, GT, strlen(GT)) == 0) { *cLen = strlen(GT); ret = '>'; goto ExitFunction; } else if (strncasecmp(src, APOS, strlen(APOS)) == 0) { *cLen = strlen(APOS); ret = '\''; goto ExitFunction; } else if (strncasecmp(src, AMP, strlen(AMP)) == 0) { *cLen = strlen(AMP); ret = '&'; goto ExitFunction; } else if (strncasecmp(src, ESC_HEX, strlen(ESC_HEX)) == 0) { /* Read in escape characters of type &#xnn where nn is a hexadecimal value */ pnum = src + strlen( ESC_HEX ); sum = 0; while (strchr(HEX_NUMBERS, *pnum) != 0) { c = *pnum; if (c <= '9') { sum = sum * 16 + ( c - '0' ); } else if( c <= 'F' ) { sum = sum * 16 + ( c - 'A' + 10 ); } else { sum = sum * 16 + ( c - 'a' + 10 ); } pnum++; } if (pnum == src || *pnum != ';' || !Parser_isXmlChar(sum)) { line = __LINE__; goto fail_entity; } *cLen = pnum - src + 1; ret = sum; goto ExitFunction; } else if (strncasecmp(src, ESC_DEC, strlen(ESC_DEC)) == 0) { /* Read in escape characters of type &#nn where nn is a decimal value */ pnum = src + strlen(ESC_DEC); sum = 0; while (strchr(DEC_NUMBERS, *pnum) != 0) { sum = sum * 10 + ( *pnum - '0' ); pnum++; } if( ( pnum == src ) || *pnum != ';' || !Parser_isXmlChar( sum ) ) { line = __LINE__; goto fail_entity; } *cLen = pnum - src + 1; ret = sum; goto ExitFunction; } fail_entity: if (g_error_char) { *cLen = 1; ret = '&'; goto ExitFunction; } ret = -1; ExitFunction: if (ret == -1 || (g_error_char && ret == g_error_char)) { IxmlPrintf(__FILE__, line, "Parser_getChar", "Error %d\n", ret); } return ret; } /*! * \brief Copy string in src into xml parser token buffer */ static int Parser_copyToken( /*! [in] The XML parser. */ Parser *xmlParser, /*! [in] The string to copy from. */ const char *src, /*! [in] The lenght to copy. */ int len) { int ret = IXML_SUCCESS; int line = 0; int i; int c; int cl; const char *psrc; const char *pend; utf8char uch; if (!src || len <= 0) { line = __LINE__; ret = IXML_FAILED; goto ExitFunction; } psrc = src; pend = src + len; while (psrc < pend) { c = Parser_getChar(psrc, &cl); if (c <= 0) { line = __LINE__; ret = IXML_FAILED; goto ExitFunction; } if (cl == 1) { Parser_appendTokBufChar(xmlParser, (char)c); psrc++; } else { i = Parser_intToUTF8(c, uch); if (i == 0) { line = __LINE__; ret = IXML_FAILED; goto ExitFunction; } Parser_appendTokBufStr(xmlParser, uch); psrc += cl; } } if (psrc > pend) { line = __LINE__; ret = IXML_FAILED; goto ExitFunction; } ExitFunction: if (ret != IXML_SUCCESS) { IxmlPrintf(__FILE__, line, "Parser_copyToken", "Error %d\n", ret); } return ret; } /*! * \brief Skips all characters in the string until it finds the skip key. * Then it skips the skip key and returns. */ static int Parser_skipString( /*! [in,out] The pointer to the skipped point. */ char **pstrSrc, /*! [in] The skip key. */ const char *strSkipKey) { if( !( *pstrSrc ) || !strSkipKey ) { return IXML_FAILED; } while( ( **pstrSrc ) && strncmp( *pstrSrc, strSkipKey, strlen( strSkipKey ) ) != 0 ) { ( *pstrSrc )++; } if( **pstrSrc == '\0' ) { return IXML_SYNTAX_ERR; } *pstrSrc = *pstrSrc + strlen( strSkipKey ); return IXML_SUCCESS; //success } /*! * \brief */ static int Parser_skipPI( /*! [in,out] The pointer to the skipped point. */ char **pSrc) { char *pEnd = NULL; assert( *pSrc ); if( *pSrc == NULL ) { return IXML_FAILED; } if ((strncasecmp(*pSrc, (char *)XMLDECL , strlen(XMLDECL )) == 0) || (strncasecmp(*pSrc, (char *)XMLDECL2, strlen(XMLDECL2)) == 0)) { /* not allowed */ return IXML_SYNTAX_ERR; } if (strncasecmp(*pSrc, (char *)BEGIN_PI, strlen(BEGIN_PI)) == 0) { pEnd = strstr( *pSrc, END_PI ); if( ( pEnd != NULL ) && ( pEnd != *pSrc ) ) { *pSrc = pEnd + strlen( BEGIN_PI ); } else { return IXML_SYNTAX_ERR; } } return IXML_SUCCESS; } /*! * \brief Skips XML declarations. */ static int Parser_skipXMLDecl( /*! [in,out] The XML parser. */ Parser *xmlParser) { int rc = IXML_FAILED; assert( xmlParser ); if( xmlParser == NULL ) { return rc; } rc = Parser_skipString( &( xmlParser->curPtr ), END_PI ); Parser_skipWhiteSpaces( xmlParser ); return rc; } /*! * \brief Skip prolog. */ static int Parser_skipProlog( /*! [in,out] The XML parser. */ Parser *xmlParser) { int rc = IXML_SUCCESS; assert( xmlParser != NULL ); if( xmlParser == NULL ) { return IXML_FAILED; } Parser_skipWhiteSpaces( xmlParser ); if( strncmp( xmlParser->curPtr, ( char * )XMLDECL, strlen( XMLDECL ) ) == 0 ) { /* curPtr, ( char * )BEGIN_DOCTYPE, strlen( BEGIN_DOCTYPE ) ) == 0 ) { // curPtr++; rc = Parser_skipDocType( &( xmlParser->curPtr ) ); } if( rc == IXML_SUCCESS ) { rc = Parser_skipMisc( xmlParser ); } return rc; } /*! * \brief Skips all characters in the string until it finds the skip key. * Then it skips the skip key and returns. */ static int Parser_skipComment( /*! [in,out] The pointer to the skipped point. */ char **pstrSrc) { char *pStrFound = NULL; assert( ( *pstrSrc ) != NULL ); if( *pstrSrc == NULL ) { return IXML_FAILED; } pStrFound = strstr( *pstrSrc, END_COMMENT ); if( ( pStrFound != NULL ) && ( pStrFound != *pstrSrc ) && ( *( pStrFound - 1 ) != '-' ) ) { *pstrSrc = pStrFound + strlen( END_COMMENT ); } else { return IXML_SYNTAX_ERR; } return IXML_SUCCESS; } /*! * \brief Skips document type declaration */ static int Parser_skipDocType( /*! [in,out] The pointer to the skipped point. */ char **pstr) { char *pCur = *pstr; char *pNext = NULL; // default there is no nested < int num = 1; assert( ( *pstr ) != NULL ); if( *pstr == NULL ) { return IXML_FAILED; } while( ( pCur != NULL ) && ( num != 0 ) && ( *pCur != 0 ) ) { if( *pCur == '<' ) { num++; } else if( *pCur == '>' ) { num--; } else if( *pCur == '"' ) { pNext = strchr( pCur + 1, '"' ); if( pNext == NULL ) { return IXML_SYNTAX_ERR; } pCur = pNext; } pCur++; } if( num == 0 ) { *pstr = pCur; return IXML_SUCCESS; } else { return IXML_SYNTAX_ERR; } } /*! * \brief Skip comment, PI and white space. */ static int Parser_skipMisc( /*! [in] The XML parser. */ Parser *xmlParser) { int rc = IXML_SUCCESS; int done = FALSE; while( ( done == FALSE ) && ( rc == IXML_SUCCESS ) ) { if( strncasecmp( xmlParser->curPtr, ( char * )BEGIN_COMMENT, strlen( BEGIN_COMMENT ) ) == 0 ) { // Chinese Test #10: UTF-8 This file has 1 Chinese character, directly entered. The XML header of this file is <?xml encoding="UTF-8"?>. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-11.xml0000644000175000017500000000103211021325545022570 00000000000000 Chinese Test #11: UTF-8 This file has 1 Chinese character, directly entered. This tests Native Language Markup (NLM). The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: <中 />. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-12.xml0000644000175000017500000000134311021325545022576 00000000000000 Chinese Test #12: UTF-8 This file has two attributes with Chinese characters, directly entered. This tests Native Language Markup (NLM). The XML header of this file is <?xml encoding="UTF-8"?>. (In the DOCTYPE test, the name element has an ID attribute, and this element has an IDREF attribute.) libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-0.xml0000644000175000017500000000102011021325545022503 00000000000000 Chinese Test #0: utf-8 This file is the null test. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="utf-8"?>. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-1.xml0000644000175000017500000000102011021325545022504 00000000000000 Chinese Test #1: UTF-8 This file is the null test. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-2.xml0000644000175000017500000000137311021325545022520 00000000000000 Chinese Test #2: UTF-8 This file has 1 Chinese character, encoded using a decimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [中]. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-3.xml0000644000175000017500000000137711021325545022525 00000000000000 Chinese Test #3: UTF-8 This file has 1 Chinese character, encoded using a hexadecimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [中]. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-4.xml0000644000175000017500000000140311021325545022514 00000000000000 Chinese Test #4: UTF-8 This file has 1 Chinese character, encoded using a decimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-5.xml0000644000175000017500000000140311021325545022515 00000000000000 Chinese Test #5: UTF-8 This file has 1 Chinese character, encoded using a decimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-6.xml0000644000175000017500000000137611021325545022527 00000000000000 Chinese Test #6: UTF-8 This file has CDATA which looks like a decimal numeric character reference. It is a file with no non-ASCII characters (i.e. it is also a UTF-8, ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. This is not the Chinese character for middle. It should not look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-7.xml0000644000175000017500000000140311021325545022517 00000000000000 Chinese Test #7: UTF-8 This file has CDATA which looks like a hexadecimal numeric character reference. It is a file with no non-ASCII characters (i.e. it is also a UTF-8, ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. This is not the Chinese character for middle. It should not look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-8.xml0000644000175000017500000000113711021325545022524 00000000000000 Chinese Test #8: UTF-8 This file has 1 Chinese character, directly entered. The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [中] It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wf/zh-utf8-9.xml0000644000175000017500000000075311021325545022530 00000000000000 Chinese Test #9: UTF-8 This file has 1 Chinese character, directly entered. The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [ç©¶]. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/0000777000175000017500000000000011021325545020753 500000000000000libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-10.xml0000644000175000017500000000104411021325545023133 00000000000000 Chinese Test #10: UTF-8 This file has 1 Chinese character, directly entered. The XML header of this file is <?xml encoding="UTF-8"?>. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-11.xml0000644000175000017500000000110611021325545023133 00000000000000 Chinese Test #11: UTF-8 This file has 1 Chinese character, directly entered. This tests Native Language Markup (NLM). The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: <中 />. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-12.xml0000644000175000017500000000141711021325545023141 00000000000000 Chinese Test #12: UTF-8 This file has two attributes with Chinese characters, directly entered. This tests Native Language Markup (NLM). The XML header of this file is <?xml encoding="UTF-8"?>. (In the DOCTYPE test, the name element has an ID attribute, and this element has an IDREF attribute.) libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-0.xml0000644000175000017500000000107411021325545023055 00000000000000 Chinese Test #0: utf-8 This file is the null test. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="utf-8"?>. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-1.xml0000644000175000017500000000107411021325545023056 00000000000000 Chinese Test #1: UTF-8 This file is the null test. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-2.xml0000644000175000017500000000144711021325545023063 00000000000000 Chinese Test #2: UTF-8 This file has 1 Chinese character, encoded using a decimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [中]. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-3.xml0000644000175000017500000000145311021325545023061 00000000000000 Chinese Test #3: UTF-8 This file has 1 Chinese character, encoded using a hexadecimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [中]. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-4.xml0000644000175000017500000000145711021325545023066 00000000000000 Chinese Test #4: UTF-8 This file has 1 Chinese character, encoded using a decimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-5.xml0000644000175000017500000000145711021325545023067 00000000000000 Chinese Test #5: UTF-8 This file has 1 Chinese character, encoded using a decimal numeric character reference. It is a UTF-8 encoded file with no non-ASCII characters (i.e. it is also an ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-6.xml0000644000175000017500000000145211021325545023063 00000000000000 Chinese Test #6: UTF-8 This file has CDATA which looks like a decimal numeric character reference. It is a file with no non-ASCII characters (i.e. it is also a UTF-8, ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. This is not the Chinese character for middle. It should not look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-7.xml0000644000175000017500000000145711021325545023071 00000000000000 Chinese Test #7: UTF-8 This file has CDATA which looks like a hexadecimal numeric character reference. It is a file with no non-ASCII characters (i.e. it is also a UTF-8, ASCII or iso-8859-n file). The XML header of this file is <?xml encoding="UTF-8"?>. This is not the Chinese character for middle. It should not look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-8.xml0000644000175000017500000000121311021325545023060 00000000000000 Chinese Test #8: UTF-8 This file has 1 Chinese character, directly entered. The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [中] It is the Chinese character for middle. It should look like a box with a vertical line through its middle. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/wfns/zh-utf8-9.xml0000644000175000017500000000102711021325545023064 00000000000000 Chinese Test #9: UTF-8 This file has 1 Chinese character, directly entered. The XML header of this file is <?xml encoding="UTF-8"?>. The character is here: [ç©¶]. libupnp-1.8.0~svn20100507/ixml/test/testdata/xml.ascc.net/legal.html0000644000175000017500000000662311021325545021673 00000000000000 LEGAL NOTICES

LEGAL NOTICES

Unless otherwise stated, pages hosted on the website
Chinese XML Now!
are copyright (C) 1998 the designated authors and translators,
and the Computing Center, Academia Sinica.

Unless otherwise stated, permission is granted to use, copy, link to,
translate and republish in any form, including for commercial use,
providing due acknowledgement of the copyright holder
and the Chinese XML Now! website is made.

If you believe any pages here are subject to another copyright,
please email us (mailto: ricko@gate.sinica.edu.tw)
with the appropriate correction.


The "Chinese Numberplate" logos copyright (C) 1998 Rick Jelliffe and Computing Center, Academia Sinica.

The logo is provided as a public service for information,
and does not represent a test result or endorsement.

For integrity, we do reserve the right to ask makers who use
an incorrect version of the logo to correct it or to abstain from using the logo.


The Chinese XML Test pages do not represent
an exhaustive test of some software's Chinese capability.
The tests merely represent a base-level which may
identify particular important characteristics quickly.

Permission is granted to copy and use the test files
as part of any test suite. However, copiers must take
the utmost care to ensure that the test files
are maintained in the encoding given in their
XML encoding header.


Caveat: Information provided about products at this site is
provided as a public service only, and does not imply
an endorsement of any product, any company, or any technology.

Information at this site should be treated as an indication only:
products and capabilities change quickly, so information
may only be correct at the time of publication.
Furthermore, due to the technical complexity and novelty
of XML technology, and the poor state of product documentation,
it is possible that some information may be incorrect,
despite our best endevours.

If you believe any information here is incorrect,
please email us (mailto: ricko@gate.sinica.edu.tw)
with the appropriate correction.


libupnp-1.8.0~svn20100507/ixml/test/testdata/p43pass1.xml0000644000175000017500000000060611021325545017517 00000000000000 CharData"> ]> CharData CharData é" CharData ]]> CharData é" CharData ]]> >" CharData libupnp-1.8.0~svn20100507/ixml/test/testdata/tvcontrolSCPD.xml0000644000175000017500000000717311021325545020653 00000000000000 1 0 PowerOn Power Power out PowerOff Power Power out SetChannel NewChannel Channel out Channel Channel in IncreaseChannel Channel Channel out DecreaseChannel Channel Channel out SetVolume NewVolume Volume out Volume Volume in IncreaseVolume Volume Volume out DecreaseVolume Volume Volume out Power Boolean 0 Channel i4 1 100 1 1 Volume i4 0 10 1 5 libupnp-1.8.0~svn20100507/ixml/test/test_document.c0000644000175000017500000000745711021325545016642 00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006 Rémi Turboult // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #include "ixml.h" #include #include #include static const char* get_ixml_error_string (IXML_ERRORCODE code) { #define CASE(CODE) case IXML_ ## CODE: return #CODE switch (code) { CASE(INDEX_SIZE_ERR); CASE(DOMSTRING_SIZE_ERR); CASE(HIERARCHY_REQUEST_ERR); CASE(WRONG_DOCUMENT_ERR); CASE(INVALID_CHARACTER_ERR); CASE(NO_DATA_ALLOWED_ERR); CASE(NO_MODIFICATION_ALLOWED_ERR); CASE(NOT_FOUND_ERR); CASE(NOT_SUPPORTED_ERR); CASE(INUSE_ATTRIBUTE_ERR); CASE(INVALID_STATE_ERR); CASE(SYNTAX_ERR); CASE(INVALID_MODIFICATION_ERR); CASE(NAMESPACE_ERR); CASE(INVALID_ACCESS_ERR); CASE(SUCCESS); CASE(NO_SUCH_FILE); CASE(INSUFFICIENT_MEMORY); CASE(FILE_DONE); CASE(INVALID_PARAMETER); CASE(FAILED); CASE(INVALID_ITEM_NUMBER); } return "** UNKNOWN EROR CODE !! **"; #undef CASE } int main (int argc, char* argv[]) { int i; if (argc < 2) { fprintf (stderr, "Usage: %s [xml files to load]\n", argv[0]); exit (EXIT_FAILURE); // ----------> } for (i = 1; i < argc; i++) { int rc; IXML_Document* doc = NULL; DOMString s; char* p; printf ("Test \"%s\" \n", argv[i]); printf (" Loading ... "); fflush (stdout); rc = ixmlLoadDocumentEx (argv[i], &doc); if (rc != IXML_SUCCESS) { fprintf (stderr, "** error : can't load document %s : " "error %d (%s)\n", argv[i], rc, get_ixml_error_string (rc)); exit (EXIT_FAILURE); // ----------> } printf ("OK\n"); printf (" Printing ... "); fflush (stdout); s = ixmlPrintDocument (doc); if (s == NULL || s[0] == '\0') { fprintf (stderr, "** error : can't print loaded document %s\n", argv[i]); exit (EXIT_FAILURE); // ----------> } p = s + strlen(s)-1; while (isspace(*p) && p > s) p--; if (*s != '<' || *p != '>') { fprintf (stderr, "** error : malformed printed document '%s' :" "%s\n", argv[i], s); exit (EXIT_FAILURE); // ----------> } printf ("OK\n"); ixmlFreeDOMString (s); ixmlDocument_free (doc); } exit (EXIT_SUCCESS); } libupnp-1.8.0~svn20100507/ixml/test/test_document.sh0000755000175000017500000000010511021325545017014 00000000000000#!/bin/sh ./test_document `find $srcdir/test/testdata -name *.xml` libupnp-1.8.0~svn20100507/ixml/Makefile.am0000644000175000017500000000222011336633540014663 00000000000000# $Id: Makefile.am,v 1.4 2006/03/27 21:27:31 r3mi Exp $ # # "Makefile.am" for "libupnp/ixml" # # (C) Copyright 2005 Rémi Turboult # SUBDIRS = doc AM_CPPFLAGS = -I$(srcdir)/inc -I$(srcdir)/src/inc AM_CFLAGS = LDADD = libixml.la if ENABLE_DEBUG AM_CPPFLAGS += -DDEBUG else AM_CPPFLAGS += -DNDEBUG endif lib_LTLIBRARIES = libixml.la libixml_la_LDFLAGS = -version-info $(LT_VERSION_IXML) \ -export-symbols-regex '^ixml.*' libixml_la_SOURCES = \ src/attr.c \ src/document.c \ src/element.c \ src/inc/ixmlmembuf.h \ src/inc/ixmlparser.h \ src/ixml.c \ src/ixmldebug.c \ src/ixmlparser.c \ src/ixmlmembuf.c \ src/namedNodeMap.c \ src/node.c \ src/nodeList.c upnpincludedir = $(includedir)/upnp upnpinclude_HEADERS = \ inc/ixml.h \ inc/ixmldebug.h check_PROGRAMS = test_document TESTS = test/test_document.sh test_document_SOURCES = test/test_document.c EXTRA_DIST = test/test_document.sh test/testdata dist-hook: rm -rf `find $(distdir)/test/testdata/ -type f \! -name '*ml' -print` clean-local: @if [ -d bin ] ; then rm -rf bin ; fi libupnp-1.8.0~svn20100507/ixml/Makefile.in0000644000175000017500000006511411360640114014677 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ # $Id: Makefile.am,v 1.4 2006/03/27 21:27:31 r3mi Exp $ # # "Makefile.am" for "libupnp/ixml" # # (C) Copyright 2005 Rémi Turboult # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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@ @ENABLE_DEBUG_TRUE@am__append_1 = -DDEBUG @ENABLE_DEBUG_FALSE@am__append_2 = -DNDEBUG check_PROGRAMS = test_document$(EXEEXT) subdir = ixml DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(upnpinclude_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/autoconfig.h \ $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = 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 = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(upnpincludedir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) libixml_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libixml_la_OBJECTS = src/attr.lo src/document.lo src/element.lo \ src/ixml.lo src/ixmldebug.lo src/ixmlparser.lo \ src/ixmlmembuf.lo src/namedNodeMap.lo src/node.lo \ src/nodeList.lo libixml_la_OBJECTS = $(am_libixml_la_OBJECTS) libixml_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libixml_la_LDFLAGS) $(LDFLAGS) -o $@ am_test_document_OBJECTS = test/test_document.$(OBJEXT) test_document_OBJECTS = $(am_test_document_OBJECTS) test_document_LDADD = $(LDADD) test_document_DEPENDENCIES = libixml.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/upnp/inc depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libixml_la_SOURCES) $(test_document_SOURCES) DIST_SOURCES = $(libixml_la_SOURCES) $(test_document_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive upnpincludeHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(upnpinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc AM_CPPFLAGS = -I$(srcdir)/inc -I$(srcdir)/src/inc $(am__append_1) \ $(am__append_2) AM_CFLAGS = LDADD = libixml.la lib_LTLIBRARIES = libixml.la libixml_la_LDFLAGS = -version-info $(LT_VERSION_IXML) \ -export-symbols-regex '^ixml.*' libixml_la_SOURCES = \ src/attr.c \ src/document.c \ src/element.c \ src/inc/ixmlmembuf.h \ src/inc/ixmlparser.h \ src/ixml.c \ src/ixmldebug.c \ src/ixmlparser.c \ src/ixmlmembuf.c \ src/namedNodeMap.c \ src/node.c \ src/nodeList.c upnpincludedir = $(includedir)/upnp upnpinclude_HEADERS = \ inc/ixml.h \ inc/ixmldebug.h TESTS = test/test_document.sh test_document_SOURCES = test/test_document.c EXTRA_DIST = test/test_document.sh test/testdata all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ixml/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign ixml/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 install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/attr.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/document.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/element.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/ixml.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/ixmldebug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/ixmlparser.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/ixmlmembuf.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/namedNodeMap.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/node.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/nodeList.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) libixml.la: $(libixml_la_OBJECTS) $(libixml_la_DEPENDENCIES) $(libixml_la_LINK) -rpath $(libdir) $(libixml_la_OBJECTS) $(libixml_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test/$(am__dirstamp): @$(MKDIR_P) test @: > test/$(am__dirstamp) test/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) test/$(DEPDIR) @: > test/$(DEPDIR)/$(am__dirstamp) test/test_document.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) test_document$(EXEEXT): $(test_document_OBJECTS) $(test_document_DEPENDENCIES) @rm -f test_document$(EXEEXT) $(LINK) $(test_document_OBJECTS) $(test_document_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/attr.$(OBJEXT) -rm -f src/attr.lo -rm -f src/document.$(OBJEXT) -rm -f src/document.lo -rm -f src/element.$(OBJEXT) -rm -f src/element.lo -rm -f src/ixml.$(OBJEXT) -rm -f src/ixml.lo -rm -f src/ixmldebug.$(OBJEXT) -rm -f src/ixmldebug.lo -rm -f src/ixmlmembuf.$(OBJEXT) -rm -f src/ixmlmembuf.lo -rm -f src/ixmlparser.$(OBJEXT) -rm -f src/ixmlparser.lo -rm -f src/namedNodeMap.$(OBJEXT) -rm -f src/namedNodeMap.lo -rm -f src/node.$(OBJEXT) -rm -f src/node.lo -rm -f src/nodeList.$(OBJEXT) -rm -f src/nodeList.lo -rm -f test/test_document.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/attr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/document.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/element.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ixml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ixmldebug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ixmlmembuf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ixmlparser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/namedNodeMap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/node.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/nodeList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/test_document.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf src/.libs src/_libs install-upnpincludeHEADERS: $(upnpinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(upnpincludedir)" || $(MKDIR_P) "$(DESTDIR)$(upnpincludedir)" @list='$(upnpinclude_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(upnpincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(upnpincludedir)/$$f'"; \ $(upnpincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(upnpincludedir)/$$f"; \ done uninstall-upnpincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(upnpinclude_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(upnpincludedir)/$$f'"; \ rm -f "$(DESTDIR)$(upnpincludedir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(upnpincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) -rm -f test/$(DEPDIR)/$(am__dirstamp) -rm -f test/$(am__dirstamp) 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-recursive clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -rf src/$(DEPDIR) test/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-upnpincludeHEADERS install-dvi: install-dvi-recursive install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf src/$(DEPDIR) test/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-upnpincludeHEADERS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool clean-local ctags ctags-recursive dist-hook \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags 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-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ install-upnpincludeHEADERS installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-libLTLIBRARIES uninstall-upnpincludeHEADERS dist-hook: rm -rf `find $(distdir)/test/testdata/ -type f \! -name '*ml' -print` clean-local: @if [ -d bin ] ; then rm -rf bin ; fi # 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: libupnp-1.8.0~svn20100507/upnp/0000777000175000017500000000000011373047473012735 500000000000000libupnp-1.8.0~svn20100507/upnp/m4/0000777000175000017500000000000011373047472013254 500000000000000libupnp-1.8.0~svn20100507/upnp/m4/libupnp.m40000644000175000017500000000655511042015420015073 00000000000000# -*- Autoconf -*- # This file is part of the aMule project. # This file is part of the libupnp library project. # # Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org ) # # 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 of the License, 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, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA # dnl -------------------------------------------------------------------------- dnl LIBUPNP_CHECK([VERSION = 1.6.6], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl dnl Check for the libupnp library dnl -------------------------------------------------------------------------- dnl dnl This macro sets these variables: dnl - LIBUPNP_VERSION dnl Something like "1.6.7" dnl - LIBUPNP_CPPFLAGS dnl Flags to be added to CPPFLAGS dnl - LIBUPNP_CFLAGS dnl Flags to be added to CFLAGS dnl - LIBUPNP_LDFLAGS dnl Flags to be added to LDFLAGS dnl - LIBUPNP_LIBS dnl Library to be added to LIBS dnl dnl The LIBUPNP_CPPFLAGS, LIBUPNP_CFLAGS, LIBUPNP_LDFLAGS and LIBUPNP_LIBS variables are also substituted. dnl AC_DEFUN([LIBUPNP_CHECK], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl m4_define([MIN_LIBUPNP_VERSION], [m4_ifval([$1], [$1], [1.6.6])])dnl dnl Test for --with-libupnp-prefix AC_ARG_WITH( [libupnp-prefix], [AS_HELP_STRING( [--with-libupnp-prefix=PREFIX], [UPnP library location])], [export PKG_CONFIG_PATH=$withval/lib/pkgconfig]) dnl Check for libupnp >= MIN_LIBUPNP_VERSION AS_IF([test $cross_compiling = no], [dnl AC_MSG_CHECKING([for libupnp version >= MIN_LIBUPNP_VERSION]) AS_IF([test -n "$PKG_CONFIG"], [dnl AS_IF([$PKG_CONFIG libupnp --exists], [dnl LIBUPNP_VERSION=`$PKG_CONFIG libupnp --modversion` AS_IF([$PKG_CONFIG libupnp --atleast-version=MIN_LIBUPNP_VERSION], [dnl result=yes resultstr=" (version $LIBUPNP_VERSION)" LIBUPNP_CPPFLAGS=`$PKG_CONFIG libupnp --cflags-only-I` LIBUPNP_CFLAGS=`$PKG_CONFIG libupnp --cflags-only-other` LIBUPNP_LDFLAGS=`$PKG_CONFIG libupnp --libs-only-L` LIBUPNP_LIBS=`$PKG_CONFIG libupnp --libs-only-other` LIBUPNP_LIBS="$LIBUPNP_LIBS `$PKG_CONFIG libupnp --libs-only-l`" ], [dnl result=no resultstr=" (version $LIBUPNP_VERSION is not new enough)" ])dnl ], [dnl result=no resultstr=" (try to use --with-libupnp-prefix=PREFIX)" ])dnl ], [dnl result=no resultstr=" (pkg-config not found)" ])dnl AC_MSG_RESULT([$result$resultstr]) libupnp_error="libupnp >= MIN_LIBUPNP_VERSION not found$resultstr" ], [dnl dnl Currently cross-compilation with libupnp is not supported. result=no libupnp_error="cross compiling" ])dnl dnl Execute the right action. AS_IF([test ${result:-no} = yes], [$2], [$3]) dnl Exported symbols AC_SUBST([LIBUPNP_CPPFLAGS])dnl AC_SUBST([LIBUPNP_CFLAGS])dnl AC_SUBST([LIBUPNP_LDFLAGS])dnl AC_SUBST([LIBUPNP_LIBS])dnl m4_undefine([MIN_LIBUPNP_VERSION])dnl ]) libupnp-1.8.0~svn20100507/upnp/doc/0000777000175000017500000000000011373047473013502 500000000000000libupnp-1.8.0~svn20100507/upnp/doc/intro.dxx0000644000175000017500000000125411021325543015263 00000000000000/**@name Introduction * This document gives a brief description of the Linux SDK for UPnP * Devices API. Section 1 covers the license under which the SDK is * distributed. Section 2 talks about the callback functions used * in many parts of the API. Finally, section 3 details the structures and * functions that comprise the API. * * The Linux SDK for UPnP Devices version 1.2 supports the following * platforms: * \begin{itemize} * \item Linux* running on an Intel Architecture processor * \item Linux running on an Intel StrongARM or XScale processor * \end{itemize} * * {\bf *} Other brands and names are the property of their respective * owners. */ libupnp-1.8.0~svn20100507/upnp/doc/docxx.sty0000644000175000017500000007074011021325542015276 00000000000000% docxx.sty % % Copyright (c) 1996 Roland Wunderling, Malte Zoeckler % Copyright (c) 1999-2001 Dragos Acostachioaie % % This file is part of DOC++. % % DOC++ 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 of the license, 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, write to the Free % Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. % % % Switch off special characters except {}\ for the rest of the text. % \def\cxxtilde{{\tt\~\relax}} \addtolength{\parskip}{6pt} \catcode`\,=\active% \def,{\char`\,\penalty-8\ } %\def,{++ } \catcode`\,=12 \def\<{{\tt <}} \def\>{{\tt >}} \def\TEX{} \def\cxxExceptionsStr{} \def\cxxParameterStr{} \def\cxxReturnStr{} \def\cxxInvariantsStr{} \def\cxxPreconditionsStr{} \def\cxxPostconditionsStr{} \def\cxxSeeStr{} \def\cxxAuthorStr{} \def\cxxVersionStr{} \def\cxxDeprecatedStr{} \def\cxxSinceStr{} \def\cxxFileStr{} \def\cxxExceptions#1{\def\cxxExceptionsStr{#1}} \def\cxxParameter#1{\def\cxxParameterStr{#1}} \def\cxxReturn#1{\def\cxxReturnStr{#1}} \def\cxxInvariants#1{\def\cxxInvariantsStr{#1}} \def\cxxPreconditions#1{\def\cxxPreconditionsStr{#1}} \def\cxxPostconditions#1{\def\cxxPostconditionsStr{#1}} \def\cxxSee#1{\def\cxxSeeStr{#1}} \def\cxxAuthor#1{\def\cxxAuthorStr{#1}} \def\cxxVersion#1{\def\cxxVersionStr{#1}} \def\cxxDeprecated#1{\def\cxxDeprecatedStr{#1}} \def\cxxSince#1{\def\cxxSinceStr{#1}} \def\cxxFile#1{\def\cxxFileStr{#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Define ... to do verbatim listing % \catcode`\=\active \catcode`\=\active {\obeyspaces\gdef {\ }} \def\ccverbatim{\strut\begingroup \catcode`\\=12 \catcode`\{=12 \catcode`\}=12 \catcode`\$=12 \catcode`\&=12 \catcode`\#=12 \catcode`\%=12 \catcode`\~=12 \catcode`\_=12 \catcode`\^=12 \catcode`\|=12 \catcode`\/=12 \obeyspaces\tt} \def{\let\par=\endgraf \ccverbatim \parskip=0pt \ccfinish} {\catcode`\=0 catcode`\=12 gdefccfinish#1{#1endgroup}} % % Definition of structuring comands. % \newcommand{\Section}[1]{\section{#1}} \newcommand{\SubSection}[1]{\subsection{#1}} \newcommand{\SubSubSection}[1]{\subsubsection{#1}} \newcommand{\Paragraph}[1]{\paragraph{#1}} \newcommand{\Ref}[1]{{\bf #1} ($\rightarrow$ \ref{#1})} \newcommand{\URL}[2][]{% \def\name{#1}% \def\empty{}% \ifx\name\empty% {\tt #2}% \else% #1 ({\tt #2})% \fi% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % printing line #1 of code #2 % \newdimen\cxxcodewidth \cxxcodewidth=\textwidth \advance\cxxcodewidth by -21pt \def\cxxCodeLine#1#2{% {\hbox to 20pt{\tiny\hss#1}\parbox[t]{\cxxcodewidth}{\small#2}}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for listing manual entries % \newdimen\cxxIdWidth \newdimen\cxxTypeWidth \newdimen\cxxProtoWidth \newdimen\cxxMemoWidth \newdimen\cxxPageWidth \cxxIdWidth=0.1\textwidth \cxxTypeWidth=0.15\textwidth \cxxProtoWidth=0.25\textwidth \cxxMemoWidth=0.43\textwidth \cxxPageWidth=\textwidth \advance\cxxPageWidth by-\cxxIdWidth \advance\cxxPageWidth by-\cxxTypeWidth \advance\cxxPageWidth by-\cxxProtoWidth \advance\cxxPageWidth by-\cxxMemoWidth \newdimen\cxxProtoMemoWidth \cxxProtoMemoWidth=\cxxProtoWidth \advance\cxxProtoMemoWidth by\cxxMemoWidth \def\cxxStrut{\vrule width0pt height0pt depth9pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1: type % 2: name % 3: args % 4: memo % 5: id \def\cxxitem#1#2#3#4#5{\noindent{% \setbox5\hbox{#5 }% \ifdim\wd5>\cxxIdWidth% \setbox5\hbox{\hbox to \cxxIdWidth{\hss#5}}% \else \setbox5\hbox{\hbox to \cxxIdWidth{#5\hss}}% \fi% \setbox1\hbox{{% \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}#1% }}% \setbox2\hbox{{% \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}\textbf{#2} #3% }}% \setbox4\hbox{\parbox[t]{\cxxMemoWidth}{{% \raggedright\sloppy% \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}{\em #4} \cxxStrut% \def\page{#5}% \ifx\page\empty% \hss% \else% \ \dotfill% \hbox to 0pt{\hbox to \cxxPageWidth{\hss% \pageref{cxx.#5}% }\hss}% \fi% }}}% % \ifdim\wd1>\cxxTypeWidth% \hbox to \hsize{\unhbox5\hbox to \cxxTypeWidth{\unhbox1\hss}\hss}\\\nopagebreak% \setbox5\hbox{\hskip\cxxIdWidth}% \setbox1\hbox{\hskip\cxxTypeWidth}% \else% \setbox1\hbox{\hbox to \cxxTypeWidth{\unhbox1\hss}}% \fi% \ifdim\wd2>\cxxProtoWidth% \ifdim\wd2<\cxxProtoMemoWidth% \def\tmp{#4}% \ifx\tmp\empty% \def\tmp{#5}% \ifx\tmp\empty% \hbox to \hsize{\unhbox5\unhbox1\unhbox2\hss\cxxStrut}\\% \else% \hbox to \hsize{\unhbox5\unhbox1\unhbox2 \dotfill\hbox to \cxxPageWidth{\hss\pageref{cxx.#5}}% \cxxStrut}\\% \fi% \else% \hbox to \hsize{\unhbox5\unhbox1\unhbox2\hss}\\\nopagebreak% \hbox to \hsize{% \hskip\cxxIdWidth% \hskip\cxxTypeWidth% \hskip\cxxProtoWidth% \unhbox4\hss% }\\% \fi% \else% \hbox to \hsize{% \unhbox5% \unhbox1% \parbox[t]{\cxxProtoMemoWidth}{% \setbox255\hbox{\textbf{#2} (}% \hangindent=\wd255\hangafter=1% \raggedright\sloppy% {\catcode`\&=4\catcode`\_=8% \def{\ccverbatim \ccfinish}\textbf{#2} #3\strut}% }\hss% }\\\nopagebreak% \hbox to \hsize{% \hskip\cxxIdWidth% \hskip\cxxTypeWidth% \hskip\cxxProtoWidth% \unhbox4\hss% }\\% \fi% \else% \hbox to \hsize{% \unhbox5% \unhbox1% \hbox to \cxxProtoWidth{\unhbox2\hss}% \unhbox4\hss% }\\% \fi% }} \newdimen\cxxtypestart \cxxtypestart=0.05\textwidth %\advance\cxxtypestart by \labelsep \newdimen\cxxnamestart \cxxnamestart=\cxxtypestart \advance\cxxnamestart by 0.25\textwidth \newdimen\cxxargsstart \cxxargsstart=\cxxnamestart \advance\cxxargsstart by 0.2\textwidth \newdimen\cxxargswidth \cxxargswidth=\textwidth \advance\cxxargswidth by -\cxxargsstart \advance\cxxargswidth by -\spaceskip \newdimen\cxxmemostart \cxxmemostart=\cxxargsstart \advance\cxxmemostart by 0.12\textwidth \newenvironment{cxxlist}[1]{ \begingroup \catcode`\,=\active% \paragraph{#1}\strut\smallskip\\ }{ \endgroup } \newenvironment{cxxnames}{\begin{cxxlist}{Names}}{\end{cxxlist}} \newenvironment{cxxpublic}{\begin{cxxlist}{Public Members}}{\end{cxxlist}} \newenvironment{cxxprivate}{\begin{cxxlist}{Private Members}}{\end{cxxlist}} \newenvironment{cxxprotected}{\begin{cxxlist}{Protected Members}}{\end{cxxlist}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Numbered Frame box % \newlength{\cxxBoxLen}% \newlength{\cxxBoxHt}% \newlength{\cxxBoxDp}% \newlength{\cxxSideHt}% \newlength{\cxxSideLen}% \newlength{\cxxTitleLen}% \def\empty{} \def\idPos{1cm} % % box with id and name [optional width] % \newcommand{\aBox}[3][1pt]{{% \small% \def\width{#1}% \def\num{#2}% \def\name{#3}% \setbox0\hbox{\hskip\width{ \strut\name\strut} \hskip\width}% % \setlength{\cxxBoxLen}{\wd0}% \addtolength{\cxxBoxLen}{\width}% \addtolength{\cxxBoxLen}{\width}% \setbox2\hbox{\normalsize\strut\rule{\cxxBoxLen}{\width}}% % \ifx\num\empty% \setbox1\hbox{\strut}% \else% \setbox1\hbox{\rule{\idPos}{\width} { \sf\bf\strut #2 } }% \fi% \addtolength{\cxxBoxLen}{-\wd1}% \setbox1\hbox{\unhbox1\rule{\cxxBoxLen}{\width}}% % \setlength{\cxxSideHt}{\dp0}% \addtolength{\cxxSideHt}{\width}% \setlength{\cxxSideLen}{\dp0}% \addtolength{\cxxSideLen}{\ht0}% \addtolength{\cxxSideLen}{\dp1}% \addtolength{\cxxSideLen}{\width}% \addtolength{\cxxSideLen}{\width}% \setbox3\hbox{\hbox to 0pt{\hss\rule[-\cxxSideHt]{\width}{\cxxSideLen}}}% \setbox4\hbox{\hbox to 0pt{\rule[-\cxxSideHt]{\width}{\cxxSideLen}\hss}}% % \setlength{\cxxBoxHt}{\dp1}% \addtolength{\cxxBoxHt}{1pt}% \setlength{\cxxBoxDp}{\ht2}% \addtolength{\cxxBoxDp}{-\width}% \addtolength{\cxxBoxDp}{1pt}% % \setlength{\cxxBoxLen}{\ht3}% \addtolength{\cxxBoxLen}{\ht1}% % \vbox to \cxxBoxLen{% \hbox{\unhbox1}% \vskip-\cxxBoxHt% \hbox{\hskip\width\unhbox3\unhbox0\unhbox4}% %\vskip-\ht2% \vskip-\cxxBoxDp% \hbox{\unhbox2}% \vss% }% }} % % box with id and name [optional width] of size #4 % \newcommand{\sizeBox}[4][3pt]{{% \setbox0\hbox{ }% \setlength{\cxxSideLen}{#4}% \addtolength{\cxxSideLen}{-\wd0}% \addtolength{\cxxSideLen}{-\wd0}% \addtolength{\cxxSideLen}{-#1}% \addtolength{\cxxSideLen}{-#1}% \addtolength{\cxxSideLen}{-#1}% \addtolength{\cxxSideLen}{-#1}% \aBox[#1]{#2}{\hbox to \cxxSideLen{#3}}% }} % % centered box with id and name [optional width] of size #4 % \newcommand{\cBox}[4][3pt]{{% \setbox0\hbox{\aBox[#1]{#2}{#3}}% \ifdim\wd0<#4% \sizeBox[#1]{#2}{\hss#3\hss}{#4}% \else% \setlength{\cxxSideLen}{\wd0}% \advance\cxxSideLen by -#4% \hskip -0.5\cxxSideLen% \unhbox0% \fi% }} % % right expanding box with id and name [optional width] of size at least #4 % \newcommand{\rBox}[4][3pt]{{% \setbox0\hbox{\aBox[#1]{#2}{#3}\hss}% \ifdim\wd0>#4% \unhbox0% \else% \sizeBox[#1]{#2}{\hss#3\hss}{#4}% \fi% }} % % left expanding box with id and name [optional width] of size at least #4 % \newcommand{\lBox}[4][3pt]{{% \setbox0\hbox{\aBox[#1]{#2}{#3}\hss}% \ifdim\wd0>#4% \setlength{\cxxSideLen}{\wd0}% \advance\cxxSideLen by -#4% \hskip -\cxxSideLen% \unhbox0% \else% \sizeBox[#1]{#2}{\hss#3\hss}{#4}% \fi% }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Pagestyle for documentation. % \newsavebox{\cxxHeadName} \newcommand{\ps@docxx}{% \renewcommand{\@oddhead}{\headlinetext}% \renewcommand{\@evenhead}{\headlinetext}% \renewcommand{\@oddfoot}{\footlinetext}% \renewcommand{\@evenfoot}{\footlinetext}% } \newcommand{\makeHeadLine}[2]{ \global\sbox{\cxxHeadName}{\vbox to 0pt{\vss% \hbox to \textwidth{% \hbox to 0pt{\strut\hbox to 1cm{\hss}\quad#1\hss}% \hfil#2\hfil% }% \vskip 1pt% \hbox to \textwidth{\hrulefill}% }}% } \newcommand{\headlinetext}{\usebox{\cxxHeadName}} \providecommand{\cxxCopyright}{% \vtop{% \hbox to \textwidth{{ \tiny\sf This page was generated with the help of DOC++ \hss}}% \vskip -20pt \hbox to \textwidth{ \hbox{{\tiny\sf http://docpp.sourceforge.net}} \hss}% }% } \def\footlinetext{\hbox to \textwidth{ \vtop{% \hbox to \textwidth{\hrulefill}% \vskip -20pt% \cxxCopyright% }% \hss\vtop{\vskip 10pt\hbox{\today\hspace*{3cm}\textrm{\thepage} }} }} \pagestyle{docxx} \def\cxxTitle#1#2#3#4#5{\noindent{% \thispagestyle{empty} \vfill \begin{center} \Huge\bf \catcode`\&=4% \catcode`\_=8% \def{\ccverbatim \ccfinish}#1% \strut\\ \def{\ccverbatim \ccfinish}#2% \strut\\ \def{\ccverbatim \ccfinish}#3% \strut\\ \end{center} \if\cxxVersionStr\empty% \else% \begin{center} \small\sf --- Version \cxxVersionStr\ --- \end{center} \global\def\cxxVersionStr{} \fi \vfill \large \begin{center} \Large\em \def{\ccverbatim \ccfinish}#4% \end{center} \vfill \if\cxxAuthorStr\empty% \else% \begin{center} \sf\cxxAuthorStr \end{center} \global\def\cxxAuthorStr{} \vfill \fi \pagebreak \makeHeadLine{}{#2} }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for contents % \newcounter{cxxContentsDepth} \setcounter{cxxContentsDepth}{0} \newdimen\cxxContentsLengthIncr \cxxContentsLengthIncr=18pt \newdimen\cxxContentsLength \cxxContentsLength=\textwidth \advance\cxxContentsLength by -\cxxContentsLengthIncr \makeHeadLine{}{Contents} \newenvironment{cxxContents}{ \ifcase \value{cxxContentsDepth} \vskip 40pt \hbox to \hsize{\hskip 8pt\hskip\cxxContentsLengthIncr\Huge\bf Contents\hss} \vskip 40pt \bf \else % >1 \rm \fi \begingroup \addtocounter{cxxContentsDepth}{1} \advance\cxxContentsLengthIncr by 8pt \advance\cxxContentsLength by -\cxxContentsLengthIncr }{ \addtocounter{cxxContentsDepth}{-1} \advance\cxxContentsLength by \cxxContentsLengthIncr \advance\cxxContentsLengthIncr by -8pt \ifcase \value{cxxContentsDepth} \vskip 12pt \or \vskip 9pt \else \vskip 3pt \fi \endgroup } \newcommand{\cxxContentsEntry}[3]{{ \def\emtpty{} \def\memo{#3} \ifx\memo\empty \setbox0\hbox{\parbox[t]{\cxxContentsLength}{\strut#2 \dotfill }} \else \setbox0\hbox{\parbox[t]{\cxxContentsLength}{\strut#2 --- {\em #3} \dotfill }} \fi \setbox1\hbox{\vtop{\vskip\dp0\vskip-\ht0\vskip-1.5pt\hbox to 20pt{\hss\rm \pageref{cxx.#1}}}} \hbox to \textwidth{% \hss\hbox to \cxxContentsLengthIncr{#1\hss}% \unhbox0\unhbox1% } }} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for class graph % \newdimen\cxxClassGraphShift \newdimen\cxxClassGraphLength \newdimen\cxxClassGraphHeight \newdimen\cxxClassGraphDepth \newdimen\cxxClassGraphTotV \setlength{\cxxClassGraphLength}{0.23\hsize} \setlength{\cxxClassGraphShift}{30pt} \setbox0\vbox{\aBox[5pt]{\strut}{\strut}} \setlength{\cxxClassGraphHeight}{\ht0} \setlength{\cxxClassGraphDepth}{\dp0} \addtolength{\cxxClassGraphDepth}{10pt} \setlength{\cxxClassGraphTotV}{\dp0} \addtolength{\cxxClassGraphTotV}{\ht0} \newenvironment{cxxInheritance}{ \par\medskip \begingroup \newcommand{\cxxCGSpace}[1]{% \vtop to \cxxClassGraphTotV{\hbox to \cxxClassGraphShift{% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##1}}% } \newcommand{\cxxSlashHline}{% \vrule width 0.1\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.1\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.1\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.1\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.1\cxxClassGraphShift height 3.5pt depth -3pt% } \newcommand{\cxxDotHline}{% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% \vrule width 0.05\cxxClassGraphShift height 0pt depth 0pt% \vrule width 0.06\cxxClassGraphShift height 3.5pt depth -3pt% } \newcommand{\cxxHline}{% \vrule width 0.5\cxxClassGraphShift height 3.5pt depth -3pt% } \newcommand{\cxxVup}{\hbox to 0pt{\hss% \vrule width 0.5pt height \cxxClassGraphHeight depth -3pt% \hss}} \newcommand{\cxxVlow}{\hbox to 0pt{\hss% \vtop to 0pt{\vskip-3pt% \hbox{\vrule width 0.5pt height 13pt depth \cxxClassGraphDepth}% \vss}% \hss}} \newcommand{\cxxLinkUp}{\hbox to 0pt{\hss\hskip 0.5\cxxClassGraphShift% \raise0.7\cxxClassGraphHeight\hbox to 0pt{\hss\textbf{\symbol{94}}\hss}}}% \newcommand{\cxxLinkDown}{\hbox to 0pt{\hss\hskip 0.5\cxxClassGraphShift% \raise-0.6\cxxClassGraphHeight\vbox to 0pt{% \hbox to 0pt{\hss\textbf{$\lor$}\hss}\vss}}}% \newcommand{\cxxLinkLeft}{\hbox to 0pt{\hss\hskip 0.0\cxxClassGraphShift% \raise0.0\cxxClassGraphHeight\hbox to 0pt{\textbf{\tt\<}\hss}}}% \newcommand{\cxxLinkRight}{\hbox to 0pt{\hss\hskip 1.0\cxxClassGraphShift% \raise0.0\cxxClassGraphHeight\hbox to 0pt{\hss\textbf{\tt\>}}}}% \newcommand{\cxxInheritanceEntry}[5][]{ \hbox to \hsize{\hss% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##2% \def\tmp{##1}% \ifx\tmp\empty% \def\tmp{##5}% \ifx\tmp\empty% \rBox[1pt]{##3}{##4}{0.24\hsize}% \else% \lBox[1pt]{##3}{##4}{0.24\hsize}% \fi% \else% \cBox[2pt]{##3}{##4}{0.24\hsize}% \fi% ##5\hfill% }\vskip-1pt } \newcommand{\cxxNone}{\cxxCGSpace{\hss}} \newcommand{\cxxLong}{\cxxCGSpace{\hss\cxxVup\cxxVlow\hss}} % \newcommand{\cxxPubLeft}{\cxxCGSpace{\cxxHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxProLeft}{\cxxCGSpace{\cxxSlashHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxPriLeft}{\cxxCGSpace{\cxxDotHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxPubleft}{\cxxCGSpace{\cxxHline\cxxVlow\hss}} \newcommand{\cxxProleft}{\cxxCGSpace{\cxxSlashHline\cxxVlow\hss}} \newcommand{\cxxPrileft}{\cxxCGSpace{\cxxDotHline\cxxVlow\hss}} \newcommand{\cxxLastPubLeft}{\cxxCGSpace{\cxxHline% \cxxVup\cxxLinkDown\cxxVlow\hss}} \newcommand{\cxxLastProLeft}{\cxxCGSpace{\cxxSlashHline% \cxxVup\cxxLinkDown\cxxVlow\hss}} \newcommand{\cxxLastPriLeft}{\cxxCGSpace{\cxxDotHline% \cxxVup\cxxLinkDown\cxxVlow\hss}} \newcommand{\cxxLastPubleft}{\cxxCGSpace{\cxxHline% \cxxVlow\cxxLinkDown\hss}} \newcommand{\cxxLastProleft}{\cxxCGSpace{\cxxSlashHline% \cxxVlow\cxxLinkDown\hss}} \newcommand{\cxxLastPrileft}{\cxxCGSpace{\cxxDotHline% \cxxVlow\cxxLinkDown\hss}} \newcommand{\cxxLinkPubLeft}{\cxxCGSpace{\cxxLinkLeft\cxxHline\cxxVup\cxxVlow\hss}} \newcommand{\cxxLinkProLeft}{\cxxCGSpace{\cxxLinkLeft\cxxSlashHline% \cxxVup\cxxVlow\hss}} \newcommand{\cxxLinkPriLeft}{\cxxCGSpace{\cxxLinkLeft\cxxDotHline% \cxxVup\cxxVlow\hss}} \newcommand{\cxxLinkPubleft}{\cxxCGSpace{\cxxLinkLeft\cxxHline\cxxVlow\hss}} \newcommand{\cxxLinkProleft}{\cxxCGSpace{\cxxLinkLeft\cxxSlashHline\cxxVlow\hss}} \newcommand{\cxxLinkPrileft}{\cxxCGSpace{\cxxLinkLeft\cxxDotHline\cxxVlow\hss}} % \newcommand{\cxxPubRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxHline}} \newcommand{\cxxProRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxSlashHline}} \newcommand{\cxxPriRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxDotHline}} \newcommand{\cxxPubright}{\cxxCGSpace{\hss\cxxVup\cxxHline}} \newcommand{\cxxProright}{\cxxCGSpace{\hss\cxxVup\cxxSlashHline}} \newcommand{\cxxPriright}{\cxxCGSpace{\hss\cxxVup\cxxDotHline}} \newcommand{\cxxLinkPubRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow\cxxHline\cxxLinkRight}} \newcommand{\cxxLinkProRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow% \cxxSlashHline\cxxLinkRight}} \newcommand{\cxxLinkPriRight}{\cxxCGSpace{\hss\cxxVup\cxxVlow% \cxxDotHline\cxxLinkRight}} \newcommand{\cxxLinkPubright}{\cxxCGSpace{\hss\cxxVup\cxxHline\cxxLinkRight}} \newcommand{\cxxLinkProright}{\cxxCGSpace{\hss\cxxVup\cxxSlashHline\cxxLinkRight}} \newcommand{\cxxLinkPriright}{\cxxCGSpace{\hss\cxxVup\cxxDotHline\cxxLinkRight}} \newcommand{\cxxFirstPubRight}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxVlow\cxxHline}} \newcommand{\cxxFirstProRight}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxVlow% \cxxSlashHline}} \newcommand{\cxxFirstPriRight}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxVlow\cxxDotHline}} \newcommand{\cxxFirstPubright}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxHline}} \newcommand{\cxxFirstProright}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxSlashHline}} \newcommand{\cxxFirstPriright}{\cxxCGSpace{\hss\cxxVup\cxxLinkUp\cxxDotHline}} }{ \endgroup } \newenvironment{cxxClassGraph}{ \begin{cxxInheritance} \newcommand{\cxxClassGraphEntry}[4]{ \hbox to \hsize{\hss% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##1% \def\tmp{##4}% \rBox[1pt]{##2}{##3}{0.24\hsize}% ##4% \hskip\cxxClassGraphShift\dotfill% \hbox to \cxxClassGraphShift{\hss\pageref{cxx.##2}}% }\vskip-1pt } \newcommand{\cxxClassGraphEntryUnknownPackage}[3]{ \hbox to \hsize{\hss% \vrule width0pt height \cxxClassGraphHeight depth \cxxClassGraphDepth% ##1% \def\tmp{##3}% \rBox[1pt]{}{##2}{0.24\hsize}% ##3% \hskip\cxxClassGraphShift\hfill% }\vskip-1pt } \clearpage \pagebreak\strut \makeHeadLine{}{Class Graph} \vskip 20pt \hbox to \hsize{\Huge\bf \quad Class Graph\hss} \vskip 40pt } { \end{cxxInheritance} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for generic manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newdimen\cxxgenericstart \cxxgenericstart=\labelwidth \advance\cxxgenericstart by \labelsep \newdimen\cxxgenericwidth \cxxgenericwidth=\textwidth \advance\cxxgenericwidth by -\cxxgenericstart \newcounter{cxxDepth} \setcounter{cxxDepth}{0} \newlength{\cxxSize} \newenvironment{cxxgeneric}[5]{ % % some local definitions % \def\empty{} \def\type{#1} \def\args{#3} \def\memo{#4} \def\id {#5} % % pagebreak ? % \ifcase \value{cxxDepth} \clearpage % 0 \pagebreak \makeHeadLine{#5}{#2} \setlength{\cxxSize}{2pt} \or % 1 \strut\bigskip\bigskip\goodbreak% \setlength{\cxxSize}{1pt} \else % >2 \strut\bigskip\bigskip\goodbreak% \setlength{\cxxSize}{0.5pt} \fi \addtocounter{cxxDepth}{1} % % write synopsis % \setbox0\hbox{ }% \setbox1\hbox{\strut\large #1 {\bf#2} }% \setbox3\hbox{\strut\large #1 {\bf#2} #3}% % % box with id and name [optional width] over entire page width % \setlength{\cxxSideLen}{\hsize}% \addtolength{\cxxSideLen}{-4\cxxSize}% \addtolength{\cxxSideLen}{-2\wd0}% \setlength{\cxxTitleLen}{\cxxSideLen}% \addtolength{\cxxTitleLen}{-8\wd0}% \hbox{\aBox[\cxxSize]{\id}{\vbox{\vskip 1.5\parskip% \hbox to \cxxSideLen{\strut% \hbox to 4\wd0{}% \ifdim\wd3<\cxxTitleLen% \parbox[b]{\cxxTitleLen}{% \begin{raggedright} \noindent\large #1 {\bf#2} #3 \end{raggedright} } \else% \ifdim\wd1>0.7\cxxTitleLen% \parbox[b]{\cxxTitleLen}{% \begin{raggedright} \noindent\large #1 {\bf#2} #3 \end{raggedright} } \else% \addtolength{\cxxTitleLen}{-\wd1}% \unhbox1% \parbox[t]{\cxxTitleLen}{% \advance\lineskip 7pt% \begin{raggedright} \noindent\large\strut #3 \end{raggedright} } \fi% \fi% \hss\strut% }\vskip\parskip}% }} % \parbox[b]{\cxxSideLen}{\begingroup % \catcode`\&=12% % \catcode`\_=12% % \begin{flushleft} % \quad\large% % \ifx\type\empty % \ifx\args\empty % \strut{\bf #2}\\ % \else % \strut{\bf #2}\ \args % \fi % \else % \strut\type\ {\bf #2}\ \args % \fi % \end{flushleft} % \endgroup}}}% \ifx\memo\empty\else \vskip 10pt \begin{flushright} \it\memo \end{flushright} \fi \label{cxx.\id} \begingroup \def\cxxExceptionsStr{} \def\cxxParameterStr{} \def\cxxReturnStr{} \def\cxxInvariantsStr{} \def\cxxPreconditionsStr{} \def\cxxPostconditionsStr{} \def\cxxSeeStr{} \def\cxxAuthorStr{} \def\cxxVersionStr{} \def\cxxDeprecatedStr{} \def\cxxSinceStr{} \def\cxxFileStr{} \def\cxxExceptions##1{\def\cxxExceptionsStr{##1}} \def\cxxParameter##1{\def\cxxParameterStr{##1}} \def\cxxReturn##1{\def\cxxReturnStr{##1}} \def\cxxInvariants##1{\def\cxxInvariantsStr{##1}} \def\cxxPreconditions##1{\def\cxxPreconditionsStr{##1}} \def\cxxPostconditions##1{\def\cxxPostconditionsStr{##1}} \def\cxxSee##1{\def\cxxSeeStr{##1}} \def\cxxAuthor##1{\def\cxxAuthorStr{##1}} \def\cxxVersion##1{\def\cxxVersionStr{##1}} \def\cxxDeprecated##1{\def\cxxDeprecatedStr{##1}} \def\cxxSince##1{\def\cxxSinceStr{##1}} \def\cxxFile##1{\def\cxxFileStr{##1}} }{ \endgroup \addtocounter{cxxDepth}{-1} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for function manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxfunction}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Arguments}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxentry}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for union manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxunion}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Members}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for typedef manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxtypedef}[5]{ \begin{cxxgeneric}{#1}{#2}{}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Members}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for macro manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxmacro}[5]{ \begin{cxxgeneric}{\#define}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for class manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxclass}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for namespace manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxnamespace}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for interface manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxinterface}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5}}{\end{cxxgeneric}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for variable manual entries % arguments are: % #1 type % #2 name % #3 args % #4 memo % #5 number % \newenvironment{cxxvariable}[5]{ \begin{cxxgeneric}{#1}{#2}{#3}{#4}{#5} \renewenvironment{cxxnames}{\begin{cxxlist}{Names}}{\end{cxxlist}} }{ \end{cxxgeneric} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for documentation % \newenvironment{cxxdocumentation}{ % % switch on special characters for documentation section % \begingroup \catcode`\&=4 \catcode`\_=8 }{ \endgroup } \newenvironment{cxxdoc}{ % % switch on special characters for documentation section % \begin{cxxdocumentation} \strut\\\noindent% }{ \smallskip \def\empty{}% \ifx\cxxReturnStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Return Value:}\hss}% \parbox[t]{0.7\textwidth}{\cxxReturnStr}\\ \fi \ifx\cxxParameterStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Parameters:}\hss}% \parbox[t]{0.7\textwidth}{\cxxParameterStr}\\ \fi \ifx\cxxExceptionsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Exceptions:}\hss}% \parbox[t]{0.7\textwidth}{\cxxExceptionsStr}\\ \fi \ifx\cxxInvariantsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Invariants:}\hss}% \parbox[t]{0.7\textwidth}{\cxxInvariantsStr}\\ \fi \ifx\cxxPreconditionsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Preconditions:}\hss}% \parbox[t]{0.7\textwidth}{\cxxPreconditionsStr}\\ \fi \ifx\cxxPostconditionsStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Postconditions:}\hss}% \parbox[t]{0.7\textwidth}{\cxxPostconditionsStr}\\ \fi \ifx\cxxSeeStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf See Also:}\hss}% \parbox[t]{0.7\textwidth}{\cxxSeeStr}\\ \fi \ifx\cxxAuthorStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Author:}\hss}% \parbox[t]{0.7\textwidth}{\cxxAuthorStr}\\ \fi \ifx\cxxVersionStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Version:}\hss}% \parbox[t]{0.7\textwidth}{\cxxVersionStr}\\ \fi \ifx\cxxDeprecatedStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf\it Deprecated:}\hss}% \parbox[t]{0.7\textwidth}{\cxxDeprecatedStr}\\ \fi \ifx\cxxSinceStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf Since:}\hss}% \parbox[t]{0.7\textwidth}{\cxxSinceStr}\\ \fi \ifx\cxxFileStr\empty\else \noindent\hbox to 0.3\textwidth{{\bf File:}\hss}% \parbox[t]{0.7\textwidth}{\cxxFileStr}\\ \fi \end{cxxdocumentation} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % environment for commented listing % arguments are: % #1 Section title % \newenvironment{cxximplementation}[1]{ \goodbreak \begin{cxxdocumentation} }{ \end{cxxdocumentation} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\cxxCodeLine#1{ \strut\hbox to 20pt{\tiny\hss #1}\small %\advance\leftmargin by 20pt %\advance\textwidth by -20pt \ccverbatim \parskip=0pt \cxxCodeFinish} {\catcode`\=0 catcode`\=12 gdefcxxCodeFinish#1{hbox{#1}endgroup}} libupnp-1.8.0~svn20100507/upnp/doc/Makefile.am0000644000175000017500000000456311021325542015444 00000000000000# $Id: Makefile.am,v 1.2 2006/03/28 21:07:01 r3mi Exp $ # # "Makefile.am" for "libunp/upnp/doc" # # (C) Copyright 2005 Rémi Turboult # ########################################################################## # # Copyright (c) 2000-2003 Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither name of Intel Corporation nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ########################################################################## EXTRA_DIST = callback.dxx docxx.sty intro.dxx \ license.dxx upnpsdk.dxx html-local: @if [ -d html ]; then rm -rf html; fi @doc++ -nd -S -w -j -d html $(srcdir)/upnpsdk.dxx pdf-local: @doc++ -nd -S -w -j -t --package a4wide -o upnpsdk.tex \ $(srcdir)/upnpsdk.dxx @-pdflatex "\scrollmode\input upnpsdk.tex" > latex.log @-pdflatex "\scrollmode\input upnpsdk.tex" >> latex.log @-pdflatex "\scrollmode\input upnpsdk.tex" >> latex.log clean-local: -rm -rf html -rm -f upnpsdk.tex upnpsdk.dvi upnpsdk.ps upnpsdk.log upnpsdk.aux -rm -f latex.log libupnp-1.8.0~svn20100507/upnp/doc/Makefile.in0000644000175000017500000002647211360640114015461 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ # $Id: Makefile.am,v 1.2 2006/03/28 21:07:01 r3mi Exp $ # # "Makefile.am" for "libunp/upnp/doc" # # (C) Copyright 2005 Rémi Turboult # ########################################################################## # # Copyright (c) 2000-2003 Intel Corporation # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither name of Intel Corporation nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ########################################################################## VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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 = upnp/doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/autoconfig.h \ $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ EXTRA_DIST = callback.dxx docxx.sty intro.dxx \ license.dxx upnpsdk.dxx 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 \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign upnp/doc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign upnp/doc/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 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$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 installdirs: 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: html-local info: info-am info-am: install-data-am: install-dvi: install-dvi-am 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 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: pdf-local ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ clean-local distclean distclean-generic distclean-libtool \ distdir dvi dvi-am html html-am html-local 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 installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am pdf-local \ ps ps-am uninstall uninstall-am html-local: @if [ -d html ]; then rm -rf html; fi @doc++ -nd -S -w -j -d html $(srcdir)/upnpsdk.dxx pdf-local: @doc++ -nd -S -w -j -t --package a4wide -o upnpsdk.tex \ $(srcdir)/upnpsdk.dxx @-pdflatex "\scrollmode\input upnpsdk.tex" > latex.log @-pdflatex "\scrollmode\input upnpsdk.tex" >> latex.log @-pdflatex "\scrollmode\input upnpsdk.tex" >> latex.log clean-local: -rm -rf html -rm -f upnpsdk.tex upnpsdk.dvi upnpsdk.ps upnpsdk.log upnpsdk.aux -rm -f latex.log # 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: libupnp-1.8.0~svn20100507/upnp/doc/callback.dxx0000644000175000017500000000135511021325543015666 00000000000000/**@name About Callbacks * * The Linux SDK for UPnP Devices contains functions that generate * asynchronous callbacks. To simplify the application callback functions, * these callbacks are executed on a thread owned by the SDK itself. The * SDK executes the application's callback function in a thread * context so the application can allocate memory and preserve the information * it needs. The application can also use standard thread synchronization * methods to ensure data integrity. Due to the possibility of deadlock, the * application cannot call back into the SDK during these callbacks * unless explicitly noted. There is no restriction in calling into the * operating system or any other application interfaces. */ libupnp-1.8.0~svn20100507/upnp/doc/upnpsdk.dxx0000644000175000017500000000063111021325542015611 00000000000000/**@name Linux SDK for UPnP Devices v1.4 * *\begin{center} * {\bf Linux SDK for UPnP Devices Version 1.4} * * Copyright (C) 2000-2003 Intel Corporation ALL RIGHTS RESERVED * * Revision 1.4.1 (\Date) *\end{center} */ //@{ //@Include: intro.dxx //@Include: license.dxx //@Include: callback.dxx //@Include: ../inc/upnp.h //@Include: ../inc/upnptools.h //@Include: ../inc/config.h //@} libupnp-1.8.0~svn20100507/upnp/doc/license.dxx0000644000175000017500000000321711021325542015552 00000000000000/**@name License * * \begin{center} * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * \end{center} * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * \begin{itemize} * \item Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * \item Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * \item Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * \end{itemize} * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ libupnp-1.8.0~svn20100507/upnp/inc/0000777000175000017500000000000011373047471013504 500000000000000libupnp-1.8.0~svn20100507/upnp/inc/UpnpString.h0000644000175000017500000000435311025042302015665 00000000000000 #ifndef STRING_H #define STRING_H /*! * \defgroup UpnpString The UpnpString Class * * \brief Implements string operations in the UPnP library. * * \author Marcelo Roberto Jimenez * * \version 1.0 * * @{ * * \file * * \brief UpnpString object declarartion. */ #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! * \brief Type of the string objects inside libupnp. */ typedef struct s_UpnpString UpnpString; /*! * \brief Constructor. * * \return A pointer to a new allocated object. */ EXPORT_SPEC UpnpString *UpnpString_new(); /*! * \brief Destructor. */ EXPORT_SPEC void UpnpString_delete( /*! [in] The \em \b this pointer. */ UpnpString *p); /*! * \brief Copy Constructor. * * \return A pointer to a new allocated copy of the original object. */ EXPORT_SPEC UpnpString *UpnpString_dup( /*! [in] The \em \b this pointer. */ const UpnpString *p); /*! * \brief Assignment operator. */ EXPORT_SPEC void UpnpString_assign( /*! [in] The \em \b this pointer. */ UpnpString *p, /*! [in] The \em \b that pointer. */ const UpnpString *q); /*! * \brief Returns the length of the string. * * \return The length of the string. * */ EXPORT_SPEC int UpnpString_get_Length( /*! [in] The \em \b this pointer. */ const UpnpString *p); /*! * \brief Returns the pointer to char. * * \return The pointer to char. */ EXPORT_SPEC const char *UpnpString_get_String( /*! [in] The \em \b this pointer. */ const UpnpString *p); /*! * \brief Sets the string from a pointer to char. */ EXPORT_SPEC void UpnpString_set_String( /*! [in] The \em \b this pointer. */ UpnpString *p, /*! [in] (char *) to copy from. */ const char *s); /*! * \brief Sets the string from a pointer to char using a maximum of N chars. */ EXPORT_SPEC void UpnpString_set_StringN( /*! [in] The \em \b this pointer. */ UpnpString *p, /*! [in] (char *) to copy from. */ const char *s, /*! Maximum number of chars to copy.*/ int n); /*! * \brief Clears the string, sets its size to zero. */ EXPORT_SPEC void UpnpString_clear( /*! [in] The \em \b this pointer. */ UpnpString *p); #ifdef __cplusplus } #endif /* __cplusplus */ /* @} UpnpString The UpnpString API */ #endif /* STRING_H */ libupnp-1.8.0~svn20100507/upnp/inc/SubscriptionRequest.h0000644000175000017500000000442311347360466017634 00000000000000 #ifndef SUBSCRIPTIONREQUEST_H #define SUBSCRIPTIONREQUEST_H /*! * \file * * \brief UpnpSubscriptionRequest object declararion. * * \author Marcelo Roberto Jimenez */ /*! Returned along with a \b UPNP_EVENT_SUBSCRIPTION_REQUEST callback. */ typedef struct s_UpnpSubscriptionRequest UpnpSubscriptionRequest; #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpSubscriptionRequest *UpnpSubscriptionRequest_new(); /*! Destructor */ EXPORT_SPEC void UpnpSubscriptionRequest_delete(UpnpSubscriptionRequest *p); /*! Copy Constructor */ EXPORT_SPEC UpnpSubscriptionRequest *UpnpSubscriptionRequest_dup(const UpnpSubscriptionRequest *p); /*! Assignment operator */ EXPORT_SPEC void UpnpSubscriptionRequest_assign(UpnpSubscriptionRequest *p, const UpnpSubscriptionRequest *q); /*! The identifier for the service being subscribed to. */ EXPORT_SPEC const UpnpString *UpnpSubscriptionRequest_get_ServiceId(const UpnpSubscriptionRequest *p); EXPORT_SPEC const char *UpnpSubscriptionRequest_get_ServiceId_cstr(const UpnpSubscriptionRequest *p); EXPORT_SPEC void UpnpSubscriptionRequest_set_ServiceId(UpnpSubscriptionRequest *p, const UpnpString *s); EXPORT_SPEC void UpnpSubscriptionRequest_strcpy_ServiceId(UpnpSubscriptionRequest *p, const char *s); /*! Universal device name. */ EXPORT_SPEC const UpnpString *UpnpSubscriptionRequest_get_UDN(const UpnpSubscriptionRequest *p); EXPORT_SPEC const char *UpnpSubscriptionRequest_get_UDN_cstr(const UpnpSubscriptionRequest *p); EXPORT_SPEC void UpnpSubscriptionRequest_set_UDN(UpnpSubscriptionRequest *p, const UpnpString *s); EXPORT_SPEC void UpnpSubscriptionRequest_strcpy_UDN(UpnpSubscriptionRequest *p, const char *s); /*! The assigned subscription ID for this subscription. */ EXPORT_SPEC const UpnpString *UpnpSubscriptionRequest_get_SID(const UpnpSubscriptionRequest *p); EXPORT_SPEC const char *UpnpSubscriptionRequest_get_SID_cstr(const UpnpSubscriptionRequest *p); EXPORT_SPEC void UpnpSubscriptionRequest_set_SID(UpnpSubscriptionRequest *p, const UpnpString *s); EXPORT_SPEC void UpnpSubscriptionRequest_strcpy_SID(UpnpSubscriptionRequest *p, const char *s); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* SUBSCRIPTIONREQUEST_H */ libupnp-1.8.0~svn20100507/upnp/inc/EventSubscribe.h0000644000175000017500000000460311347360466016522 00000000000000 #ifndef EVENTSUBSCRIBE_H #define EVENTSUBSCRIBE_H /*! * \file * * \brief UpnpEventSubscribe object declararion. * * \author Marcelo Roberto Jimenez */ /*! Returned along with a \b UPNP_EVENT_SUBSCRIBE_COMPLETE or * \b UPNP_EVENT_UNSUBSCRIBE_COMPLETE callback. */ typedef struct s_UpnpEventSubscribe UpnpEventSubscribe; #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpEventSubscribe *UpnpEventSubscribe_new(); /*! Destructor */ EXPORT_SPEC void UpnpEventSubscribe_delete(UpnpEventSubscribe *p); /*! Copy Constructor */ EXPORT_SPEC UpnpEventSubscribe *UpnpEventSubscribe_dup(const UpnpEventSubscribe *p); /*! Assignment operator */ EXPORT_SPEC void UpnpEventSubscribe_assign(UpnpEventSubscribe *p, const UpnpEventSubscribe *q); /*! The result of the operation. */ EXPORT_SPEC int UpnpEventSubscribe_get_ErrCode(const UpnpEventSubscribe *p); EXPORT_SPEC void UpnpEventSubscribe_set_ErrCode(UpnpEventSubscribe *p, int n); /*! The actual subscription time (for subscriptions only). */ EXPORT_SPEC int UpnpEventSubscribe_get_TimeOut(const UpnpEventSubscribe *p); EXPORT_SPEC void UpnpEventSubscribe_set_TimeOut(UpnpEventSubscribe *p, int n); /*! The SID for this subscription. For subscriptions, this only * contains a valid SID if the \b Upnp_EventSubscribe.result field * contains a \b UPNP_E_SUCCESS result code. For unsubscriptions, * this contains the SID from which the subscription is being * unsubscribed. */ EXPORT_SPEC const UpnpString *UpnpEventSubscribe_get_SID(const UpnpEventSubscribe *p); EXPORT_SPEC const char *UpnpEventSubscribe_get_SID_cstr(const UpnpEventSubscribe *p); EXPORT_SPEC void UpnpEventSubscribe_set_SID(UpnpEventSubscribe *p, const UpnpString *s); EXPORT_SPEC void UpnpEventSubscribe_strcpy_SID(UpnpEventSubscribe *p, const char *s); /*! The event URL being subscribed to or removed from. */ EXPORT_SPEC const UpnpString *UpnpEventSubscribe_get_PublisherUrl(const UpnpEventSubscribe *p); EXPORT_SPEC const char *UpnpEventSubscribe_get_PublisherUrl_cstr(const UpnpEventSubscribe *p); EXPORT_SPEC void UpnpEventSubscribe_set_PublisherUrl(UpnpEventSubscribe *p, const UpnpString *s); EXPORT_SPEC void UpnpEventSubscribe_strcpy_PublisherUrl(UpnpEventSubscribe *p, const char *s); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* EVENTSUBSCRIBE_H */ libupnp-1.8.0~svn20100507/upnp/inc/ActionRequest.h0000644000175000017500000000726611347360466016375 00000000000000 #ifndef ACTIONREQUEST_H #define ACTIONREQUEST_H /*! * \file * * \brief UpnpActionRequest object declaration. * * \author Marcelo Roberto Jimenez */ /*! Returned as part of a \b UPNP_CONTROL_ACTION_COMPLETE callback. */ typedef struct s_UpnpActionRequest UpnpActionRequest; #include "ixml.h" /* for IXML_Document */ #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpInet.h" /* for sockaddr, sockaddr_storage */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpActionRequest *UpnpActionRequest_new(); /*! Destructor */ EXPORT_SPEC void UpnpActionRequest_delete(UpnpActionRequest *p); /*! Copy Constructor */ EXPORT_SPEC UpnpActionRequest *UpnpActionRequest_dup(const UpnpActionRequest *p); /*! Assignment operator */ EXPORT_SPEC void UpnpActionRequest_assign(UpnpActionRequest *p, const UpnpActionRequest *q); /*! The result of the operation */ EXPORT_SPEC int UpnpActionRequest_get_ErrCode(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_ErrCode(UpnpActionRequest *p, int n); /*! The socket number of the connection to the requestor */ EXPORT_SPEC int UpnpActionRequest_get_Socket(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_Socket(UpnpActionRequest *p, int n); /*! The error string in case of error */ EXPORT_SPEC const UpnpString *UpnpActionRequest_get_ErrStr(const UpnpActionRequest *p); EXPORT_SPEC const char *UpnpActionRequest_get_ErrStr_cstr(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_ErrStr(UpnpActionRequest *p, const UpnpString *s); EXPORT_SPEC void UpnpActionRequest_strcpy_ErrStr(UpnpActionRequest *p, const char *s); /*! The Action Name */ EXPORT_SPEC const UpnpString *UpnpActionRequest_get_ActionName(const UpnpActionRequest *p); EXPORT_SPEC const char *UpnpActionRequest_get_ActionName_cstr(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_ActionName(UpnpActionRequest *p, const UpnpString *s); EXPORT_SPEC void UpnpActionRequest_strcpy_ActionName(UpnpActionRequest *p, const char *s); /*! The unique device ID */ EXPORT_SPEC const UpnpString *UpnpActionRequest_get_DevUDN(const UpnpActionRequest *p); EXPORT_SPEC const char *UpnpActionRequest_get_DevUDN_cstr(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_DevUDN(UpnpActionRequest *p, const UpnpString *s); /*! The service ID */ EXPORT_SPEC const UpnpString *UpnpActionRequest_get_ServiceID(const UpnpActionRequest *p); EXPORT_SPEC const char *UpnpActionRequest_get_ServiceID_cstr(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_ServiceID(UpnpActionRequest *p, const UpnpString *s); /*! The DOM document describing the action */ EXPORT_SPEC IXML_Document *UpnpActionRequest_get_ActionRequest(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_ActionRequest(UpnpActionRequest *p, IXML_Document *d); /*! The DOM document describing the result of the action */ EXPORT_SPEC IXML_Document *UpnpActionRequest_get_ActionResult(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_ActionResult(UpnpActionRequest *p, IXML_Document *d); /*! The DOM document containing the information from the SOAP header */ EXPORT_SPEC IXML_Document *UpnpActionRequest_get_SoapHeader(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_SoapHeader(UpnpActionRequest *p, IXML_Document *d); /*! IP address of the control point requesting this action */ EXPORT_SPEC const struct sockaddr *UpnpActionRequest_get_CtrlPtIPAddr(const UpnpActionRequest *p); EXPORT_SPEC void UpnpActionRequest_set_CtrlPtIPAddr(UpnpActionRequest *p, const struct sockaddr *sa); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* ACTIONREQUEST_H */ libupnp-1.8.0~svn20100507/upnp/inc/upnpdebug.h0000644000175000017500000001752111362564224015566 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * Copyright (c) 2006 Rémi Turboult * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef UPNP_DEBUG_H #define UPNP_DEBUG_H /*! * \file */ #include "ThreadPool.h" #include "upnpconfig.h" #include "UpnpGlobal.h" /* for UPNP_INLINE */ #include #ifdef __cplusplus extern "C" { #endif /** \name Other debugging features * * The UPnP SDK contains other features to aid in debugging. */ /*@{*/ /** \name Upnp_LogLevel * The user has the option to select 4 different types of debugging levels, * see \c UpnpSetLogLevel. * The critical level will show only those messages * which can halt the normal processing of the library, like memory * allocation errors. The remaining three levels are just for debugging * purposes. Packet level will display all the incoming and outgoing * packets that are flowing between the control point and the device. * Info Level displays the other important operational information * regarding the working of the library. If the user selects All, * then the library displays all the debugging information that it has. * \li \c UPNP_CRITICAL [0] * \li \c UPNP_PACKET [1] * \li \c UPNP_INFO [2] * \li \c UPNP_ALL [3] */ typedef enum Upnp_Module { SSDP, SOAP, GENA, TPOOL, MSERV, DOM, API, HTTP } Dbg_Module; /*@{*/ typedef enum Upnp_LogLevel_e { UPNP_CRITICAL, UPNP_PACKET, UPNP_INFO, UPNP_ALL } Upnp_LogLevel; /*@}*/ /** * Default log level : see \c Upnp_LogLevel */ #define UPNP_DEFAULT_LOG_LEVEL UPNP_ALL /*! * \brief Initialize the log files. * * \return -1 if fails or UPNP_E_SUCCESS if succeeds. */ #ifdef DEBUG int UpnpInitLog(void); #else static UPNP_INLINE int UpnpInitLog(void) { return UPNP_E_SUCCESS; } #endif /*! * \brief Set the log level (see \c Upnp_LogLevel). */ #ifdef DEBUG void UpnpSetLogLevel( /*! [in] Log level. */ Upnp_LogLevel log_level); #else static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {} #endif /*! * \brief Closes the log files. */ #ifdef DEBUG void UpnpCloseLog(void); #else static UPNP_INLINE void UpnpCloseLog(void) {} #endif /*! * \brief Set the name for error and information files, respectively. */ #ifdef DEBUG void UpnpSetLogFileNames( /*! [in] Name of the error file. */ const char *ErrFileName, /*! [in] Name of the information file. */ const char *InfoFileName); #else static UPNP_INLINE void UpnpSetLogFileNames( const char *ErrFileName, const char *InfoFileName) {} #endif /*! * \brief Check if the module is turned on for debug and returns the file * descriptor corresponding to the debug level * * \return NULL if the module is turn off for debug otheriwse returns the * right file descriptor. */ #ifdef DEBUG FILE *UpnpGetDebugFile( /*! [in] The level of the debug logging. It will decide whether debug * statement will go to standard output, or any of the log files. */ Upnp_LogLevel level, /*! [in] debug will go in the name of this module. */ Dbg_Module module); #else static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module) { return NULL; } #endif /*! * \brief Returns true if debug output should be done in this module. * * \return Nonzero value if true, zero if false. */ #ifdef DEBUG int DebugAtThisLevel( /*! [in] The level of the debug logging. It will decide whether debug * statement will go to standard output, or any of the log files. */ Upnp_LogLevel DLevel, /*! [in] Debug will go in the name of this module. */ Dbg_Module Module); #else static UPNP_INLINE int DebugAtThisLevel( Upnp_LogLevel DLevel, Dbg_Module Module) { return 0; } #endif /*! * \brief Prints the debug statement either on the standard output or log file * along with the information from where this debug statement is coming. */ #ifdef DEBUG void UpnpPrintf( /*! [in] The level of the debug logging. It will decide whether debug * statement will go to standard output, or any of the log files. */ Upnp_LogLevel DLevel, /*! [in] debug will go in the name of this module. */ Dbg_Module Module, /*! [in] Name of the file from where debug statement is coming. */ const char* DbgFileName, /*! [in] Line number of the file from where debug statement is coming. */ int DbgLineNo, /*! [in] Printf like format specification. */ const char* FmtStr, /*! [in] Printf like Variable number of arguments that will go in the debug * statement. */ ...) #if (__GNUC__ >= 3) /* This enables printf like format checking by the compiler */ __attribute__((format (__printf__, 5, 6))) #endif ; #else /* DEBUG */ static UPNP_INLINE void UpnpPrintf( Upnp_LogLevel DLevel, Dbg_Module Module, const char* DbgFileName, int DbgLineNo, const char* FmtStr, ...) { } #endif /* DEBUG */ /*! * \brief Writes the file name and file number from where debug statement is * coming to the log file. */ #ifdef DEBUG void UpnpDisplayFileAndLine( /*! [in] File descriptor where line number and file name will be written. */ FILE *fd, /*! [in] Name of the file. */ const char *DbgFileName, /*! [in] Line number of the file. */ int DbgLineNo); #else static UPNP_INLINE void UpnpDisplayFileAndLine( FILE *fd, const char *DbgFileName, int DbgLineNo) {} #endif /*! * \brief Writes the buffer in the file as per the requested banner */ #ifdef DEBUG void UpnpDisplayBanner( /*! [in] file descriptor where the banner will be written. */ FILE *fd, /*! [in] The buffer that will be written. */ const char **lines, /*! [in] Size of the buffer. */ size_t size, /*! [in] This parameter provides the width of the banner. */ int starlength); #else static UPNP_INLINE void UpnpDisplayBanner( FILE *fd, const char **lines, size_t size, int starlength) {} #endif /*! * \brief Prints thread pool statistics. */ #ifdef DEBUG void PrintThreadPoolStats( /*! [in] The thread pool. */ ThreadPool *tp, /*! [in] The file name that called this function, use the macro __FILE__. */ const char *DbgFileName, /*! [in] The line number that the function was called, use the macro __LINE__. */ int DbgLineNo, /*! [in] The message. */ const char *msg); #else static UPNP_INLINE void PrintThreadPoolStats( ThreadPool *tp, const char *DbgFileName, int DbgLineNo, const char *msg) { } #endif /*@}*/ #ifdef __cplusplus } #endif #endif /* UPNP_DEBUG_H */ libupnp-1.8.0~svn20100507/upnp/inc/StateVarRequest.h0000644000175000017500000000704111347360466016700 00000000000000 #ifndef STATEVARREQUEST_H #define STATEVARREQUEST_H /*! * \file * * \brief UpnpStateVarRequest object declararion. * * \author Marcelo Roberto Jimenez */ /*! Represents the request for current value of a state variable in a service * state table. */ typedef struct s_UpnpStateVarRequest UpnpStateVarRequest; #include "ixml.h" /* for DOMString */ #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpInet.h" /* for sockaddr, sockaddr_storage */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpStateVarRequest *UpnpStateVarRequest_new(); /*! Destructor */ EXPORT_SPEC void UpnpStateVarRequest_delete(UpnpStateVarRequest *p); /*! Copy Constructor */ EXPORT_SPEC UpnpStateVarRequest *UpnpStateVarRequest_dup(const UpnpStateVarRequest *p); /*! Assignment operator */ EXPORT_SPEC void UpnpStateVarRequest_assign(UpnpStateVarRequest *p, const UpnpStateVarRequest *q); /*! The result of the operation */ EXPORT_SPEC int UpnpStateVarRequest_get_ErrCode(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_ErrCode(UpnpStateVarRequest *p, int n); /*! The socket number of the connection to the requestor */ EXPORT_SPEC int UpnpStateVarRequest_get_Socket(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_Socket(UpnpStateVarRequest *p, int n); /*! The error string in case of error */ EXPORT_SPEC const UpnpString *UpnpStateVarRequest_get_ErrStr(const UpnpStateVarRequest *p); EXPORT_SPEC const char *UpnpStateVarRequest_get_ErrStr_cstr(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_ErrStr(UpnpStateVarRequest *p, const UpnpString *s); EXPORT_SPEC void UpnpStateVarRequest_strcpy_ErrStr(UpnpStateVarRequest *p, const char *s); /*! The unique device ID */ EXPORT_SPEC const UpnpString *UpnpStateVarRequest_get_DevUDN(const UpnpStateVarRequest *p); EXPORT_SPEC const char *UpnpStateVarRequest_get_DevUDN_cstr(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_DevUDN(UpnpStateVarRequest *p, const UpnpString *s); /*! The service ID */ EXPORT_SPEC const UpnpString *UpnpStateVarRequest_get_ServiceID(const UpnpStateVarRequest *p); EXPORT_SPEC const char *UpnpStateVarRequest_get_ServiceID_cstr(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_ServiceID(UpnpStateVarRequest *p, const UpnpString *s); /*! The name of the variable. */ EXPORT_SPEC const UpnpString *UpnpStateVarRequest_get_StateVarName(const UpnpStateVarRequest *p); EXPORT_SPEC const char *UpnpStateVarRequest_get_StateVarName_cstr(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_StateVarName(UpnpStateVarRequest *p, const UpnpString *s); EXPORT_SPEC void UpnpStateVarRequest_strcpy_StateVarName(UpnpStateVarRequest *p, const char *s); /*! IP address of sender requesting the state variable. */ EXPORT_SPEC const struct sockaddr *UpnpStateVarRequest_get_CtrlPtIPAddr(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_CtrlPtIPAddr(UpnpStateVarRequest *p, const struct sockaddr *sa); /*! The current value of the variable. This needs to be allocated by * the caller. When finished with it, the SDK frees this \b DOMString. */ EXPORT_SPEC const DOMString UpnpStateVarRequest_get_CurrentVal(const UpnpStateVarRequest *p); EXPORT_SPEC const char *UpnpStateVarRequest_get_CurrentVal_cstr(const UpnpStateVarRequest *p); EXPORT_SPEC void UpnpStateVarRequest_set_CurrentVal(UpnpStateVarRequest *p, const DOMString s); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* STATEVARREQUEST_H */ libupnp-1.8.0~svn20100507/upnp/inc/UpnpInet.h0000644000175000017500000000101111360640053015313 00000000000000 #ifndef UPNPINET_H #define UPNPINET_H /*! * \file * * \brief Provides a platform independent way to include TCP/IP types and functions. */ #ifdef WIN32 #include #include #else #include #if (defined(BSD) && BSD >= 199306) || defined (__FreeBSD_kernel__) #include /* Do not move or remove the include below for "sys/socket"! * Will break FreeBSD builds. */ #include #endif #include #endif #endif /* UPNPINET_H */ libupnp-1.8.0~svn20100507/upnp/inc/upnp.h0000644000175000017500000030177011372263256014563 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef UPNP_H #define UPNP_H /*! * \file * * \defgroup UPnPAPI UPnP API * * @{ */ #include "ixml.h" #include "upnpconfig.h" #include "UpnpGlobal.h" #include "UpnpInet.h" /* * \todo Document the exact reason of these include files and solve this * include mess in an include file like UpnpTime.h */ #ifdef WIN32 #include #elif (defined(BSD) && BSD >= 199306) #include #else /* Other systems ??? */ #endif #ifdef WIN32 /* Do not #include */ #else #include #endif #ifdef WIN32 #include #else #define SOCKET int #define INVALID_SOCKET (SOCKET)(~0) #endif #ifdef WIN32 #define UpnpCloseSocket closesocket #define fseeko fseek #else #define UpnpCloseSocket close #endif #define NUM_HANDLE 200 #define LINE_SIZE 180 #define NAME_SIZE 256 #define MNFT_NAME_SIZE 64 #define MODL_NAME_SIZE 32 #define SERL_NUMR_SIZE 64 #define MODL_DESC_SIZE 64 #define UPNP_INFINITE -1 #define UPNP_USING_CHUNKED -3 #define UPNP_UNTIL_CLOSE -4 /*! * \name Error codes * * The functions in the SDK API can return a variety of error * codes to describe problems encountered during execution. This section * lists the error codes and provides a brief description of what each error * code means. Refer to the documentation for each function for a * description of what an error code means in that context. * * @{ */ /*! * \brief The operation completed successfully. * * For asynchronous functions, this only means that the packet generated by * the operation was successfully transmitted on the network. The result of * the entire operation comes as part of the callback for that operation. */ #define UPNP_E_SUCCESS 0 /*! * \brief The handle passed to a function is not a recognized as a valid handle. */ #define UPNP_E_INVALID_HANDLE -100 /*! * \brief One or more of the parameters passed to the function is not valid. * * Refer to the documentation for each function for more information on the * valid ranges of the parameters. */ #define UPNP_E_INVALID_PARAM -101 /*! * \brief The SDK does not have any more space for additional handles. * * The SDK allocates space for only a few handles in order to conserve memory. */ #define UPNP_E_OUTOF_HANDLE -102 #define UPNP_E_OUTOF_CONTEXT -103 /*! * \brief Not enough resources are currently available to complete the operation. * * Most operations require some free memory in order to complete their work. */ #define UPNP_E_OUTOF_MEMORY -104 /*! * \brief The SDK has already been initialized. * * The SDK needs to be initialied only once per process. Any additional * initialization attempts simply return this error with no other ill effects. */ #define UPNP_E_INIT -105 #define UPNP_E_BUFFER_TOO_SMALL -106 /*! * \brief The description document passed to \b UpnpRegisterRootDevice or * \b UpnpRegisterRootDevice2 is invalid. */ #define UPNP_E_INVALID_DESC -107 /*! * \brief An URL passed into the function is invalid. * * The actual cause is function specific, but in general, the URL itself * might be malformed (e.g. have invalid characters in it) or the host might * be unreachable. */ #define UPNP_E_INVALID_URL -108 #define UPNP_E_INVALID_SID -109 #define UPNP_E_INVALID_DEVICE -110 /*! * \brief The device ID/service ID pair does not refer to a valid service. * * Returned only by \b UpnpNotify, \b UpnpNotifyExt, \b UpnpAcceptSubscription, * and \b UpnpAcceptSubscriptionExt. */ #define UPNP_E_INVALID_SERVICE -111 /*! * \brief The response received from the remote side of a connection is not correct * for the protocol. * * This applies to the GENA, SOAP, and HTTP protocols. */ #define UPNP_E_BAD_RESPONSE -113 #define UPNP_E_BAD_REQUEST -114 /*! * \brief The SOAP action message is invalid. * * This can be because the DOM document passed to the function was malformed or * the action message is not correct for the given action. */ #define UPNP_E_INVALID_ACTION -115 /*! * \brief \b UpnpInit has not been called, or \b UpnpFinish has already been called. * * None of the API functions operate until \b UpnpInit successfully completes. */ #define UPNP_E_FINISH -116 /*! * \brief \b UpnpInit cannot complete. * * The typical reason is failure to allocate sufficient resources. */ #define UPNP_E_INIT_FAILED -117 /*! * \brief The URL passed into a function is too long. * * The SDK limits URLs to 180 characters in length. */ #define UPNP_E_URL_TOO_BIG -118 /*! * \brief The HTTP message contains invalid message headers. * * The error always refers to the HTTP message header received from the remote * host. The main areas where this occurs are in SOAP control messages (e.g. * \b UpnpSendAction), GENA subscription message (e.g. \b UpnpSubscribe), * GENA event notifications (e.g. \b UpnpNotify), and HTTP transfers (e.g. * \b UpnpDownloadXmlDoc). */ #define UPNP_E_BAD_HTTPMSG -119 /*! * \brief A client or a device is already registered. * * The SDK currently has a limit of one registered client and one registered * device per process. */ #define UPNP_E_ALREADY_REGISTERED -120 /*! * \brief The interface provided to \b UpnpInit2 is unknown or does not have a valid * IPv4 or IPv6 address configured. */ #define UPNP_E_INVALID_INTERFACE -121 /*! * \brief A network error occurred. * * It is the generic error code for network problems that are not covered under * one of the more specific error codes. The typical meaning is the SDK failed * to read the local IP address or had problems configuring one of the sockets. */ #define UPNP_E_NETWORK_ERROR -200 /*! * \brief An error happened while writing to a socket. * * This occurs in any function that makes network connections, such as discovery * (e.g. \b UpnpSearchAsync or \b UpnpSendAdvertisement), control (e.g. * \b UpnpSendAction), eventing (e.g. \b UpnpNotify), and HTTP functions (e.g. * \b UpnpDownloadXmlDoc). */ #define UPNP_E_SOCKET_WRITE -201 /*! * \brief An error happened while reading from a socket. * * This occurs in any function that makes network connections, such as discovery * (e.g. \b UpnpSearchAsync or \b UpnpSendAdvertisement), control (e.g. * \b UpnpSendAction), eventing (e.g. \b UpnpNotify), and HTTP functions (e.g. * \b UpnpDownloadXmlDoc). */ #define UPNP_E_SOCKET_READ -202 /*! * \brief The SDK had a problem binding a socket to a network interface. * * This occurs in any function that makes network connections, such as discovery * (e.g. \b UpnpSearchAsync or \b UpnpSendAdvertisement), control (e.g. * \b UpnpSendAction), eventing (e.g. \b UpnpNotify), and HTTP functions (e.g. * \b UpnpDownloadXmlDoc). */ #define UPNP_E_SOCKET_BIND -203 /*! * \brief The SDK had a problem connecting to a remote host. * * This occurs in any function that makes network connections, such as discovery * (e.g. \b UpnpSearchAsync or \b UpnpSendAdvertisement), control (e.g. * \b UpnpSendAction), eventing (e.g. \b UpnpNotify), and HTTP functions (e.g. * \b UpnpDownloadXmlDoc). */ #define UPNP_E_SOCKET_CONNECT -204 /*! * \brief The SDK cannot create any more sockets. * * This occurs in any function that makes network connections, such as discovery * (e.g. \b UpnpSearchAsync or \b UpnpSendAdvertisement), control (e.g. * \b UpnpSendAction), eventing (e.g. \b UpnpNotify), and HTTP functions (e.g. * \b UpnpDownloadXmlDoc). */ #define UPNP_E_OUTOF_SOCKET -205 /*! * \brief The SDK had a problem setting the socket to listen for incoming * connections. * * This error only happens during initialization (i.e. \b UpnpInit). */ #define UPNP_E_LISTEN -206 /*! * \brief Too much time elapsed before the required number of bytes were sent * or received over a socket. * * This error can be returned by any function that performs network operations. */ #define UPNP_E_TIMEDOUT -207 /*! * \brief Generic socket error code for conditions not covered by other error * codes. * * This error can be returned by any function that performs network operations. */ #define UPNP_E_SOCKET_ERROR -208 #define UPNP_E_FILE_WRITE_ERROR -209 /*! \brief The operation was canceled. * * This error can be returned by any function that allows for external cancelation. */ #define UPNP_E_CANCELED -210 #define UPNP_E_EVENT_PROTOCOL -300 /*! * \brief A subscription request was rejected from the remote side. */ #define UPNP_E_SUBSCRIBE_UNACCEPTED -301 /*! * \brief An unsubscribe request was rejected from the remote side. */ #define UPNP_E_UNSUBSCRIBE_UNACCEPTED -302 /*! * \brief The remote host did not accept the notify sent from the local device. */ #define UPNP_E_NOTIFY_UNACCEPTED -303 /*! * \brief One or more of the parameters passed to a function is invalid. * * Refer to the individual function descriptions for the acceptable ranges for * parameters. */ #define UPNP_E_INVALID_ARGUMENT -501 /*! * \brief The filename passed to one of the device registration functions was * not found or was not accessible. */ #define UPNP_E_FILE_NOT_FOUND -502 /*! * \brief An error happened while reading a file. */ #define UPNP_E_FILE_READ_ERROR -503 /*! * \brief The file name of the description document passed to * \b UpnpRegisterRootDevice2 does not end in ".xml". */ #define UPNP_E_EXT_NOT_XML -504 #define UPNP_E_NO_WEB_SERVER -505 #define UPNP_E_OUTOF_BOUNDS -506 /*! * \brief The response to a SOAP request did not contain the required XML * constructs. */ #define UPNP_E_NOT_FOUND -507 /*! * \brief Generic error code for internal conditions not covered by other * error codes. */ #define UPNP_E_INTERNAL_ERROR -911 /* SOAP-related error codes */ #define UPNP_SOAP_E_INVALID_ACTION 401 #define UPNP_SOAP_E_INVALID_ARGS 402 #define UPNP_SOAP_E_OUT_OF_SYNC 403 #define UPNP_SOAP_E_INVALID_VAR 404 #define UPNP_SOAP_E_ACTION_FAILED 501 /* @} ErrorCodes */ #ifndef OUT #define OUT #endif #ifndef IN #define IN #endif #ifndef INOUT #define INOUT #endif /* * Opaque data structures. The following includes are data structures that * must be externally visible. Since version 1.8.0, only an opaque typedef * is visible from the outside world. Any operation on these data types * must be done using the appropriate interface functions. * * This policy has the great advantage that it is now possible to change * the internal implementation of these data structures without breaking * the API. */ #include "ActionComplete.h" #include "ActionRequest.h" #include "Discovery.h" #include "Event.h" #include "EventSubscribe.h" #include "FileInfo.h" #include "StateVarComplete.h" #include "StateVarRequest.h" #include "SubscriptionRequest.h" /*! * \name Constants and Types * * @{ */ enum UpnpOpenFileMode { UPNP_READ, UPNP_WRITE }; /*! * \brief Returned when a control point application registers with * \b UpnpRegisterClient. * * Client handles can only be used with functions that operate with a client * handle. */ typedef int UpnpClient_Handle; /*! * \brief Returned when a device application registers with * \b UpnpRegisterRootDevice or \b UpnpRegisterRootDevice2. * * Device handles can only be used with functions that operate with a device * handle. */ typedef int UpnpDevice_Handle; /*! * \brief The reason code for an event callback. * * The \b Event parameter will be different depending on the reason for the * callback. The descriptions for each event type describe the contents of the * \b Event parameter. */ enum Upnp_EventType_e { /* * Control callbacks */ /*! Received by a device when a control point issues a control * request. The \b Event parameter contains a pointer to a \b * UpnpActionRequest structure containing the action. The application * stores the results of the action in this structure. */ UPNP_CONTROL_ACTION_REQUEST, /*! A \b UpnpSendActionAsync call completed. The \b Event * parameter contains a pointer to a \b UpnpActionComplete structure * with the results of the action. */ UPNP_CONTROL_ACTION_COMPLETE, /*! Received by a device when a query for a single service variable * arrives. The \b Event parameter contains a pointer to a \b * UpnpStateVarRequest structure containing the name of the variable * and value. */ UPNP_CONTROL_GET_VAR_REQUEST, /*! A \b UpnpGetServiceVarStatus call completed. The \b Event * parameter contains a pointer to a \b UpnpStateVarComplete structure * containing the value for the variable. */ UPNP_CONTROL_GET_VAR_COMPLETE, /* * Discovery callbacks */ /*! Received by a control point when a new device or service is available. * The \b Event parameter contains a pointer to a \b * UpnpDiscovery structure with the information about the device * or service. */ UPNP_DISCOVERY_ADVERTISEMENT_ALIVE, /*! Received by a control point when a device or service shuts down. The \b * Event parameter contains a pointer to a \b UpnpDiscovery * structure containing the information about the device or * service. */ UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE, /*! Received by a control point when a matching device or service responds. * The \b Event parameter contains a pointer to a \b * UpnpDiscovery structure containing the information about * the reply to the search request. */ UPNP_DISCOVERY_SEARCH_RESULT, /*! Received by a control point when the search timeout expires. The * SDK generates no more callbacks for this search after this * event. The \b Event parameter is \c NULL. */ UPNP_DISCOVERY_SEARCH_TIMEOUT, /* * Eventing callbacks */ /*! Received by a device when a subscription arrives. * The \b Event parameter contains a pointer to a \b * UpnpSubscriptionRequest structure. At this point, the * subscription has already been accepted. \b UpnpAcceptSubscription * needs to be called to confirm the subscription and transmit the * initial state table. This can be done during this callback. The SDK * generates no events for a subscription unless the device * application calls \b UpnpAcceptSubscription. */ UPNP_EVENT_SUBSCRIPTION_REQUEST, /*! Received by a control point when an event arrives. The \b * Event parameter contains a \b UpnpEvent structure * with the information about the event. */ UPNP_EVENT_RECEIVED, /*! A \b UpnpRenewSubscriptionAsync call completed. The status of * the renewal is in the \b Event parameter as a \b * Upnp_Event_Subscription structure. */ UPNP_EVENT_RENEWAL_COMPLETE, /*! A \b UpnpSubscribeAsync call completed. The status of the * subscription is in the \b Event parameter as a \b * Upnp_Event_Subscription structure. */ UPNP_EVENT_SUBSCRIBE_COMPLETE, /*! A \b UpnpUnSubscribeAsync call completed. The status of the * subscription is in the \b Event parameter as a \b * UpnpEventSubscribe structure. */ UPNP_EVENT_UNSUBSCRIBE_COMPLETE, /*! The auto-renewal of a client subscription failed. * The \b Event parameter is a \b UpnpEventSubscribe structure * with the error code set appropriately. The subscription is no longer * valid. */ UPNP_EVENT_AUTORENEWAL_FAILED, /*! A client subscription has expired. This will only occur * if auto-renewal of subscriptions is disabled. * The \b Event parameter is a \b UpnpEventSubscribe * structure. The subscription is no longer valid. */ UPNP_EVENT_SUBSCRIPTION_EXPIRED }; typedef enum Upnp_EventType_e Upnp_EventType; /*! * \brief Holds the subscription identifier for a subscription between a * client and a device. * * The SID is a string representation of a globally unique id (GUID) and should * not be modified. */ typedef char Upnp_SID[44]; /*! * \brief Represents the different types of searches that can be performed * using the SDK for UPnP Devices API. * * By specifying these different values to \b UpnpSearchAsync, the control * point application can control the scope of the search from all devices * to specific devices or services. */ enum Upnp_SType_e { /*! Search for all devices and services on the network. */ UPNP_S_ALL, /*! Search for all root devices on the network. */ UPNP_S_ROOT, /*! Search for a particular device type or a particular device instance. */ UPNP_S_DEVICE, /*! Search for a particular service type, possibly on a particular * device type or device instance. */ UPNP_S_SERVICE }; typedef enum Upnp_SType_e Upnp_SType; /*! * \brief Specifies the type of description in \b UpnpRegisterRootDevice2. * * These values control how \b UpnpRegisterRootDevice2 interprets the * \b description parameter. */ enum Upnp_DescType_e { /*! The description is the URL to the description document. */ UPNPREG_URL_DESC, /*! The description is a file name on the local file system containing the description of the device. */ UPNPREG_FILENAME_DESC, /*! The description is a pointer to a character array containing the XML description document. */ UPNPREG_BUF_DESC }; typedef enum Upnp_DescType_e Upnp_DescType; /*! * All callback functions share the same prototype, documented below. * Note that any memory passed to the callback function * is valid only during the callback and should be copied if it * needs to persist. This callback function needs to be thread * safe. The context of the callback is always on a valid thread * context and standard synchronization methods can be used. Note, * however, because of this the callback cannot call SDK functions * unless explicitly noted. * * \verbatim int CallbackFxn(Upnp_EventType EventType, void *Event, void *Cookie); \endverbatim * * where \b EventType is the event that triggered the callback, * \b Event is a structure that denotes event-specific information for that * event, and \b Cookie is the user data passed when the callback was * registered. * * See \b Upnp_EventType for more information on the callback values and * the associated \b Event parameter. * * The return value of the callback is currently ignored. It may be used * in the future to communicate results back to the SDK. */ typedef int (*Upnp_FunPtr)( /*! [in] .*/ Upnp_EventType EventType, /*! [in] .*/ void *Event, /*! [in] .*/ void *Cookie); /* @} Constants and Types */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! * \name Initialization and Registration * * @{ */ /*! * \brief Initializes the Linux SDK for UPnP Devices (IPv4 only). * * \deprecated Kept for backwards compatibility. Use UpnpInit2 for new * implementations or where IPv6 is required. * * This function must be called before any other API function can be called. * It should be called only once. Subsequent calls to this API return a * \c UPNP_E_INIT error code. * * Optionally, the application can specify a host IPv4 address (in the * case of a multi-homed configuration) and a port number to use for * all UPnP operations. Since a port number can be used only by one * process, multiple processes using the SDK must specify * different port numbers. * * If unspecified, the SDK will use the first IPv4-capable adapter's IP address * and an arbitrary port. * * This call is synchronous. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist * to initialize the SDK. * \li \c UPNP_E_INIT: The SDK is already initialized. * \li \c UPNP_E_INIT_FAILED: The SDK initialization * failed for an unknown reason. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_LISTEN: An error occurred listening to a socket. * \li \c UPNP_E_OUTOF_SOCKET: An error ocurred creating a socket. * \li \c UPNP_E_INTERNAL_ERROR: An internal error ocurred. */ EXPORT_SPEC int UpnpInit( /*! The host local IPv4 address to use, in string format, for example * "192.168.0.1", or \c NULL to use the first IPv4 adapter's IP address. */ const char *HostIP, /*! Local Port to listen for incoming connections * \c NULL will pick an arbitrary free port. */ unsigned short DestPort); /*! * \brief Initializes the Linux SDK for UPnP Devices (IPv4 or IPv6). * * This function must be called before any other API function can be called. * It should be called only once. Subsequent calls to this API return a * \c UPNP_E_INIT error code. * * Optionally, the application can specify an interface name (in the * case of a multi-homed configuration) and a port number to use for * all UPnP operations. Since a port number can be used only by one * process, multiple processes using the SDK must specify * different port numbers. * * If unspecified, the SDK will use the first suitable interface and an * arbitrary port. * * This call is synchronous. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist * to initialize the SDK. * \li \c UPNP_E_INIT: The SDK is already initialized. * \li \c UPNP_E_INIT_FAILED: The SDK initialization * failed for an unknown reason. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_LISTEN: An error occurred listening to a socket. * \li \c UPNP_E_OUTOF_SOCKET: An error ocurred creating a socket. * \li \c UPNP_E_INTERNAL_ERROR: An internal error ocurred. * \li \c UPNP_E_INVALID_INTERFACE: IfName is invalid or does not * have a valid IPv4 or IPv6 addresss configured. */ EXPORT_SPEC int UpnpInit2( /*! The interface name to use by the UPnP SDK operations. * Examples: "eth0", "xl0", "Local Area Connection", \c NULL to * use the first suitable interface. */ const char *IfName, /*! Local Port to listen for incoming connections. * \c NULL will pick an arbitrary free port. */ unsigned short DestPort); /*! * \brief Terminates the Linux SDK for UPnP Devices. * * \li Checks for pending jobs and threads * \li Unregisters either the client or device * \li Shuts down the Timer Thread * \li Stops the Mini Server * \li Uninitializes the Thread Pool * \li For Win32 cleans up Winsock Interface * \li Cleans up mutex objects * * This function must be the last API function called. It should be called only * once. Subsequent calls to this API return a \c UPNP_E_FINISH error code. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_FINISH: The SDK is already terminated or * it is not initialized. */ EXPORT_SPEC int UpnpFinish(void); /*! * \brief Returns the internal server IPv4 UPnP listening port. * * If '0' is used as the port number in \b UpnpInit, then this function can be * used to retrieve the actual port allocated to the SDK. * * \return * \li On success: The port on which an internal server is listening for IPv4 UPnP * related requests. * \li On error: 0 is returned if \b UpnpInit has not succeeded. */ EXPORT_SPEC unsigned short UpnpGetServerPort(void); /*! * \brief Returns the internal server IPv6 UPnP listening port. * * If '0' is used as the port number in \b UpnpInit, then this function can be * used to retrieve the actual port allocated to the SDK. * * \return * \li On success: The port on which an internal server is listening for IPv6 UPnP * related requests. * \li On error: 0 is returned if \b UpnpInit has not succeeded. */ EXPORT_SPEC unsigned short UpnpGetServerPort6(void); /*! * \brief Returns the local IPv4 listening ip address. * * If \c NULL is used as the IPv4 address in \b UpnpInit, then this function can * be used to retrieve the actual interface address on which device is running. * * \return * \li On success: The IPv4 address on which an internal server is * listening for UPnP related requests. * \li On error: \c NULL is returned if \b UpnpInit has not succeeded. */ EXPORT_SPEC char *UpnpGetServerIpAddress(void); /*! * \brief Returns the local IPv6 listening ip address. * * If \c NULL is used as the IPv6 address in \b UpnpInit, then this function can * be used to retrieve the actual interface address on which device is running. * * \return * \li On success: The IPv6 address on which an internal server is * listening for UPnP related requests. * \li On error: \c NULL is returned if \b UpnpInit has not succeeded. */ EXPORT_SPEC char *UpnpGetServerIp6Address(void); /*! * \brief Registers a device application with the UPnP Library. * * A device application cannot make any other API calls until it registers * using this function. * * Device applications can also register as control points (see * \b UpnpRegisterClient to get a control point handle to perform control * point functionality). * * This is a synchronous call and does not generate any callbacks. Callbacks * can occur as soon as this function returns. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_FINISH: The SDK is already terminated or is not * initialized. * \li \c UPNP_E_INVALID_DESC: The description document was not * a valid device description. * \li \c UPNP_E_INVALID_URL: The URL for the description document * is not valid. * \li \c UPNP_E_INVALID_PARAM: Either \b Callback or \b Hnd * is not a valid pointer or \b DescURL is \c NULL. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting the * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. * \li \c UPNP_E_OUTOF_MEMORY: There are insufficient resources to * register this root device. */ EXPORT_SPEC int UpnpRegisterRootDevice( /*! [in] Pointer to a string containing the description URL for this root device * instance. */ const char *DescUrl, /*! [in] Pointer to the callback function for receiving asynchronous events. */ Upnp_FunPtr Callback, /*! [in] Pointer to user data returned with the callback function when invoked. */ const void *Cookie, /*! [out] Pointer to a variable to store the new device handle. */ UpnpDevice_Handle *Hnd); /*! * \brief Registers a device application with the UPnP Library. Similar to * \b UpnpRegisterRootDevice, except that it also allows the description * document to be specified as a file or a memory buffer. * * The description can also be configured to have the correct IP and port * address. * * NOTE: For the configuration to be functional, the internal web server * MUST be present. In addition, the web server MUST be activated * (using \b UpnpSetWebServerRootDir) before calling this function. * The only condition where the web server can be absent is if the * description document is specified as a URL and no configuration is * required (i.e. config_baseURL = 0.) * * This is a synchronous call and does not generate any callbacks. Callbacks * can occur as soon as this function returns. * * Examples of using different types of description documents: * \verbatim 1) Description specified as a URL: descriptionType == UPNPREG_URL_DESC description is the URL bufferLen = 0 (ignored) 2) Description specified as a file: descriptionType == UPNPREG_FILENAME_DESC description is a filename bufferLen = 0 (ignored) 3) Description specified as a memory buffer: descriptionType == UPNPREG_BUF_DESC description is pointer to a memory buffer bufferLen == length of memory buffer \endverbatim * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_FINISH: The SDK is already terminated or * is not initialized. * \li \c UPNP_E_INVALID_DESC: The description document is not * a valid device description. * \li \c UPNP_E_INVALID_PARAM: Either \b Callback or \b Hnd * is not a valid pointer or \b DescURL is \c NULL. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting the * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. * \li \c UPNP_E_OUTOF_MEMORY: There are insufficient resources to * register this root device. * \li \c UPNP_E_URL_TOO_BIG: Length of the URL is bigger than the * internal buffer. * \li \c UPNP_E_FILE_NOT_FOUND: The description file could not * be found. * \li \c UPNP_E_FILE_READ_ERROR: An error occurred reading the * description file. * \li \c UPNP_E_INVALID_URL: The URL to the description document * is invalid. * \li \c UPNP_E_EXT_NOT_XML: The URL to the description document * or file should have a .xml extension. * \li \c UPNP_E_NO_WEB_SERVER: The internal web server has been * compiled out; the SDK cannot configure itself from the * description document. */ EXPORT_SPEC int UpnpRegisterRootDevice2( /*! [in] The type of the description document. */ Upnp_DescType descriptionType, /*! [in] Treated as a URL, file name or memory buffer depending on * description type. */ const char* description, /*! [in] The length of memory buffer if passing a description in a buffer, * otherwise it is ignored. */ size_t bufferLen, /*! [in] If nonzero, \c URLBase of description document is configured and * the description is served using the internal web server. */ int config_baseURL, /*! [in] Pointer to the callback function for receiving asynchronous events. */ Upnp_FunPtr Fun, /*! [in] Pointer to user data returned with the callback function when * invoked. */ const void* Cookie, /*! [out] Pointer to a variable to store the new device handle. */ UpnpDevice_Handle* Hnd); /*! * \brief Registers a device application for a specific address family with * the UPnP library. * * A device application cannot make any other API calls until it registers * using this function. Device applications can also register as control * points (see \b UpnpRegisterClient to get a control point handle to perform * control point functionality). * * This is synchronous and does not generate any callbacks. Callbacks can occur * as soon as this function returns. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_FINISH: The SDK is already terminated or * is not initialized. * \li \c UPNP_E_INVALID_DESC: The description document was not * a valid device description. * \li \c UPNP_E_INVALID_URL: The URL for the description document * is not valid. * \li \c UPNP_E_INVALID_PARAM: Either \b Callback or \b Hnd * is not a valid pointer or \b DescURL is \c NULL. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting the * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. * \li \c UPNP_E_OUTOF_MEMORY: There are insufficient resources to * register this root device. */ EXPORT_SPEC int UpnpRegisterRootDevice3( /*! [in] Pointer to a string containing the description URL for this root * device instance. */ const char *DescUrl, /*! [in] Pointer to the callback function for receiving asynchronous events. */ Upnp_FunPtr Callback, /*! [in] Pointer to user data returned with the callback function when invoked. */ const void *Cookie, /*! [out] Pointer to a variable to store the new device handle. */ UpnpDevice_Handle *Hnd, /*! [in] Address family of this device. Can be AF_INET for an IPv4 device, or * AF_INET6 for an IPv6 device. Defaults to AF_INET. */ const int AddressFamily); /*! * \brief Unregisters a root device registered with \b UpnpRegisterRootDevice or * \b UpnpRegisterRootDevice2. * * After this call, the \b UpnpDevice_Handle is no longer valid. For all * advertisements that have not yet expired, the SDK sends a device unavailable * message automatically. * * This is a synchronous call and generates no callbacks. Once this call * returns, the SDK will no longer generate callbacks to the application. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device handle. */ EXPORT_SPEC int UpnpUnRegisterRootDevice( /*! [in] The handle of the root device instance to unregister. */ UpnpDevice_Handle Hnd); /*! * \brief Registers a control point application with the UPnP Library. * * A control point application cannot make any other API calls until it * registers using this function. * * \b UpnpRegisterClient is a synchronous call and generates no callbacks. * Callbacks can occur as soon as this function returns. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_FINISH: The SDK is already terminated or * is not initialized. * \li \c UPNP_E_INVALID_PARAM: Either \b Callback or \b Hnd * is not a valid pointer. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * register this control point. */ EXPORT_SPEC int UpnpRegisterClient( /*! [in] Pointer to a function for receiving asynchronous events. */ Upnp_FunPtr Callback, /*! [in] Pointer to user data returned with the callback function when invoked. */ const void *Cookie, /*! [out] Pointer to a variable to store the new control point handle. */ UpnpClient_Handle *Hnd); /*! * \brief Unregisters a control point application, unsubscribing all active * subscriptions. * * This function unregisters a client registered with UpnpRegisterclient or * UpnpRegisterclient2. After this call, the \b UpnpClient_Handle is no longer * valid. The UPnP Library generates no more callbacks after this function * returns. * * \b UpnpUnRegisterClient is a synchronous call and generates no * callbacks. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control point handle. */ EXPORT_SPEC int UpnpUnRegisterClient( /*! [in] The handle of the control point instance to unregister. */ UpnpClient_Handle Hnd); /*! * \deprecated Use \b UpnpSetMaxContentLength instead. * * Warning: the Handle argument provided here is not used, so the effect * of this function is global to the SDK (= same as \b UpnpSetMaxContentLength). */ EXPORT_SPEC int UpnpSetContentLength( /*! [in] The handle of the device instance for which the coincoming content * length needs to be set. */ UpnpClient_Handle Hnd, /*! [in] Permissible content length */ int contentLength); /*! * \brief Sets the maximum content-length that the SDK will process on an * incoming SOAP requests or responses. * * This API allows devices that have memory constraints to exhibit consistent * behaviour if the size of the incoming SOAP message exceeds the memory that * device can allocate. * * The default maximum content-length is \c DEFAULT_SOAP_CONTENT_LENGTH * = 16K bytes. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. */ EXPORT_SPEC int UpnpSetMaxContentLength( /*! [in] The maximum permissible content length for incoming SOAP actions, * in bytes. */ size_t contentLength); /* @} Initialization and Registration */ /****************************************************************************** ****************************************************************************** * * * D I S C O V E R Y * * * ****************************************************************************** ******************************************************************************/ /*! * \name Discovery * * @{ */ /*! * \brief Searches for devices matching the given search target. * * The function returns immediately and the SDK calls the default callback * function, registered during the \b UpnpRegisterClient call, for each * matching root device, device, or service. The application specifies the * search type by the \b Target parameter. * * This function searches for the devices for the provided maximum time. * It is an asynchronous function. It schedules a search job and returns. * The client is notified about the search results after search timer. * * Note that there is no way for the SDK to distinguish which client * instance issued a particular search. Therefore, the client can get * search callbacks that do not match the original criteria of the search. * Also, the application will receive multiple callbacks for each search. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_PARAM: \b Target is \c NULL. */ EXPORT_SPEC int UpnpSearchAsync( /*! The handle of the client performing the search. */ UpnpClient_Handle Hnd, /*! The time, in seconds, to wait for responses. If the time is greater * than \c MAX_SEARCH_TIME then the time is set to \c MAX_SEARCH_TIME. * If the time is less than \c MIN_SEARCH_TIME then the time is set to * \c MIN_SEARCH_TIME. */ int Mx, /*! The search target as defined in the UPnP Device Architecture v1.0 * specification. */ const char *TTarget_constarget_const, /*! The user data to pass when the callback function is invoked. */ const void *Cookie_const); /*! * \brief Sends out the discovery announcements for all devices and services * for a device. * * Each announcement is made with the same expiration time. * * This is a synchronous call. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid * device handle. * \li \c UPNP_E_OUTOF_MEMORY: There are insufficient resources to * send future advertisements. */ EXPORT_SPEC int UpnpSendAdvertisement( /*! The device handle for which to send out the announcements. */ UpnpDevice_Handle Hnd, /*! The expiration age, in seconds, of the announcements. */ int Exp); /* @} Discovery */ /****************************************************************************** ****************************************************************************** * * * C O N T R O L * * * ****************************************************************************** ******************************************************************************/ /*! * \name Control * * @{ */ /*! * \brief Queries the state of a state variable of a service on another device. * * \deprecated * The use of this function is deprecated by the UPnP Forum. * * This is a synchronous call. * * A positive return value indicates a SOAP error code, whereas a negative * return code indicates an SDK error code. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: \b ActionUrl is not a valid URL. * \li \c UPNP_E_INVALID_DESC: The XML document was not * found or it does not contain a valid XML description. * \li \c UPNP_E_INVALID_PARAM: \b StVarVal is not a valid * pointer or \b VarName or \b ActionUrl is \c NULL. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. * \li \c UPNP_SOAP_E_INVALID_VAR: The given variable is invalid * according to the device. */ EXPORT_SPEC int UpnpGetServiceVarStatus( /*! [in] The handle of the control point. */ UpnpClient_Handle Hnd, /*! [in] The URL of the service. */ const char *ActionURL, /*! [in] The name of the variable to query. */ const char *VarName, /*! [out] The pointer to store the value for \b VarName. The SDK allocates * this string and the caller needs to free it using * \b ixmlFreeDOMString. */ DOMString *StVarVal); /*! * \brief Queries the state of a variable of a service, generating a callback * when the operation is complete. * * \deprecated * The use of this function is deprecated by the UPnP Forum. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: The \b ActionUrl is not a valid URL. * \li \c UPNP_E_INVALID_PARAM: \b VarName, \b Fun or * \b ActionUrl is not a valid pointer. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpGetServiceVarStatusAsync( /*! [in] The handle of the control point. */ UpnpClient_Handle Hnd, /*! [in] The URL of the service. */ const char *ActionURL, /*! [in] The name of the variable to query. */ const char *VarName, /*! [in] Pointer to a callback function to be invoked when the operation * is complete. */ Upnp_FunPtr Fun, /*! [in] Pointer to user data to pass to the callback function when invoked. */ const void *Cookie); /*! * \brief Sends a message to change a state variable in a service. * * This is a synchronous call that does not return until the action is complete. * * Note that a positive return value indicates a SOAP-protocol error code. * In this case, the error description can be retrieved from \b RespNode. * A negative return value indicates an SDK error. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: \b ActionUrl is not a valid URL. * \li \c UPNP_E_INVALID_ACTION: This action is not valid. * \li \c UPNP_E_INVALID_DEVICE: \b DevUDN is not a * valid device. * \li \c UPNP_E_INVALID_PARAM: \b ServiceType, \b Action, * \b ActionUrl, or * \b RespNode is not a valid pointer. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpSendAction( /*! [in] The handle of the control point sending the action. */ UpnpClient_Handle Hnd, /*! [in] The action URL of the service. */ const char *ActionURL, /*! [in] The type of the service. */ const char *ServiceType, /*! [in] This parameter is ignored and must be \c NULL. */ const char *DevUDN, /*! [in] The DOM document for the action. */ IXML_Document *Action, /*! [out] The DOM document for the response to the action. The SDK allocates * this document and the caller needs to free it. */ IXML_Document **RespNode); /*! * \brief Sends a message to change a state variable in a service. * * This is a synchronous call that does not return until the action is complete. * * Note that a positive return value indicates a SOAP-protocol error code. * In this case, the error description can be retrieved from \b RespNode. * A negative return value indicates an SDK error. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: \b ActionUrl is not a valid URL. * \li \c UPNP_E_INVALID_ACTION: This action is not valid. * \li \c UPNP_E_INVALID_DEVICE: \b DevUDN is not a * valid device. * \li \c UPNP_E_INVALID_PARAM: \b ServiceType, \b Action, * \b ActionUrl, or * \b RespNode is not a valid pointer. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpSendActionEx( /*! [in] The handle of the control point sending the action. */ UpnpClient_Handle Hnd, /*! [in] The action URL of the service. */ const char *ActionURL, /*! [in] The type of the service. */ const char *ServiceType, /*! [in] This parameter is ignored and must be \c NULL. */ const char *DevUDN, /*! [in] The DOM document for the SOAP header. This may be \c NULL if the * header is not required. */ IXML_Document *Header, /*! [in] The DOM document for the action. */ IXML_Document *Action, /*! [out] The DOM document for the response to the action. The SDK allocates * this document and the caller needs to free it. */ IXML_Document **RespNode); /*! * \brief Sends a message to change a state variable in a service, generating a * callback when the operation is complete. * * See \b UpnpSendAction for comments on positive return values. These * positive return values are sent in the event struct associated with the * \c UPNP_CONTROL_ACTION_COMPLETE event. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: \b ActionUrl is an invalid URL. * \li \c UPNP_E_INVALID_DEVICE: \b DevUDN is an invalid device. * \li \c UPNP_E_INVALID_PARAM: Either \b Fun is not a valid * callback function or \b ServiceType, \b Act, or * \b ActionUrl is \c NULL. * \li \c UPNP_E_INVALID_ACTION: This action is not valid. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpSendActionAsync( /*! [in] The handle of the control point sending the action. */ UpnpClient_Handle Hnd, /*! [in] The action URL of the service. */ const char *ActionURL, /*! [in] The type of the service. */ const char *ServiceType, /*! [in] This parameter is ignored and must be \c NULL. */ const char *DevUDN, /*! [in] The DOM document for the action to perform on this device. */ IXML_Document *Action, /*! [in] Pointer to a callback function to be invoked when the operation * completes. */ Upnp_FunPtr Fun, /*! [in] Pointer to user data that to be passed to the callback when * invoked. */ const void *Cookie); /*! * \brief Sends a message to change a state variable in a service, generating a * callback when the operation is complete. * * See \b UpnpSendAction for comments on positive return values. These * positive return values are sent in the event struct associated with the * \c UPNP_CONTROL_ACTION_COMPLETE event. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: \b ActionUrl is an invalid URL. * \li \c UPNP_E_INVALID_DEVICE: \b DevUDN is an invalid device. * \li \c UPNP_E_INVALID_PARAM: Either \b Fun is not a valid * callback function or \b ServiceType, \b Act, or * \b ActionUrl is \c NULL. * \li \c UPNP_E_INVALID_ACTION: This action is not valid. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpSendActionExAsync( /*! [in] The handle of the control point sending the action. */ UpnpClient_Handle Hnd, /*! [in] The action URL of the service. */ const char *ActionURL, /*! [in] The type of the service. */ const char *ServiceType, /*! [in] This parameter is ignored and must be \c NULL. */ const char *DevUDN, /*! [in] The DOM document for the SOAP header. This may be \c NULL if the * header is not required. */ IXML_Document *Header, /*! [in] The DOM document for the action to perform on this device. */ IXML_Document *Action, /*! [in] Pointer to a callback function to be invoked when the operation * completes. */ Upnp_FunPtr Fun, /*! [in] Pointer to user data that to be passed to the callback when * invoked. */ const void *Cookie); /*! @} Control */ /****************************************************************************** ****************************************************************************** * * * E V E N T I N G * * * ****************************************************************************** ******************************************************************************/ /*! * \name Eventing * * @{ */ /*! * \brief Accepts a subscription request and sends out the current state of the * eventable variables for a service. * * The device application should call this function when it receives a * \c UPNP_EVENT_SUBSCRIPTION_REQUEST callback. * * This function is synchronous and generates no callbacks. * * This function can be called during the execution of a callback function. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device * handle. * \li \c UPNP_E_INVALID_SERVICE: The \b DevId/\b ServId * pair refers to an invalid service. * \li \c UPNP_E_INVALID_SID: The specified subscription ID is not * valid. * \li \c UPNP_E_INVALID_PARAM: Either \b VarName, * \b NewVal, \b DevID, or \b ServID is not a valid * pointer or \b cVariables is less than zero. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpAcceptSubscription( /*! [in] The handle of the device. */ UpnpDevice_Handle Hnd, /*! [in] The device ID of the subdevice of the service generating the event. */ const char *DevID, /*! [in] The unique service identifier of the service generating the event. */ const char *ServID, /*! [in] Pointer to an array of event variables. */ const char **VarName, /*! [in] Pointer to an array of values for the event variables. */ const char **NewVal, /*! [in] The number of event variables in \b VarName. */ int cVariables, /*! [in] The subscription ID of the newly registered control point. */ const Upnp_SID SubsId); /*! * \brief Similar to \b UpnpAcceptSubscription() except that it takes a DOM * document for the variables to event rather than an array of strings. * * This function is sychronous and generates no callbacks. * * This function can be called during the execution of a callback function. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device * handle. * \li \c UPNP_E_INVALID_SERVICE: The \b DevId/\b ServId * pair refers to an invalid service. * \li \c UPNP_E_INVALID_SID: The specified subscription ID is not * valid. * \li \c UPNP_E_INVALID_PARAM: Either \b VarName, * \b NewVal, \b DevID, \b ServID, or \b PropSet * is not a valid pointer. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpAcceptSubscriptionExt( /*! [in] The handle of the device. */ UpnpDevice_Handle Hnd, /*! [in] The device ID of the subdevice of the service generating the event. */ const char *DevID, /*! [in] The unique service identifier of the service generating the event. */ const char *ServID, /*! [in] The DOM document for the property set. Property set documents must * conform to the XML schema defined in section 4.3 of the Universal * Plug and Play Device Architecture specification. */ IXML_Document *PropSet, /*! [in] The subscription ID of the newly registered control point. */ Upnp_SID SubsId); /*! * \brief Sends out an event change notification to all control points * subscribed to a particular service. * * This function is synchronous and generates no callbacks. * * This function may be called during a callback function to send out a * notification. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device * handle. * \li \c UPNP_E_INVALID_SERVICE: The \b DevId/\b ServId * pair refers to an invalid service. * \li \c UPNP_E_INVALID_PARAM: Either \b VarName, \b NewVal, * \b DevID, or \b ServID is not a valid pointer or * \b cVariables is less than zero. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpNotify( /*! [in] The handle to the device sending the event. */ UpnpDevice_Handle, /*! [in] The device ID of the subdevice of the service generating the event. */ const char *DevID, /*! [in] The unique identifier of the service generating the event. */ const char *ServID, /*! [in] Pointer to an array of variables that have changed. */ const char **VarName, /*! [in] Pointer to an array of new values for those variables. */ const char **NewVal, /*! [in] The count of variables included in this notification. */ int cVariables); /*! * \brief Similar to \b UpnpNotify except that it takes a DOM document for the * event rather than an array of strings. * * This function is synchronous and generates no callbacks. * * This function may be called during a callback function to send out a * notification. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device * handle. * \li \c UPNP_E_INVALID_SERVICE: The \b DevId/\b ServId * pair refers to an invalid service. * \li \c UPNP_E_INVALID_PARAM: Either \b VarName, \b NewVal, * \b DevID, \b ServID, or \b PropSet * is not a valid pointer or \b cVariables is less than zero. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpNotifyExt( /*! [in] The handle to the device sending the event. */ UpnpDevice_Handle, /*! [in] The device ID of the subdevice of the service generating the event. */ const char *DevID, /*! [in] The unique identifier of the service generating the event. */ const char *ServID, /*! [in] The DOM document for the property set. Property set documents must * conform to the XML schema defined in section 4.3 of the Universal * Plug and Play Device Architecture specification. */ IXML_Document *PropSet); /*! * \brief Renews a subscription that is about to expire. * * This function is synchronous. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_PARAM: \b Timeout is not a valid pointer. * \li \c UPNP_E_INVALID_SID: The SID being passed to this function * is not a valid subscription ID. * \li \c UPNP_E_NETWORK_ERROR: A network error occured. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting to * \b PublisherUrl. * \li \c UPNP_E_OUTOF_SOCKET: An error occurred creating a socket. * \li \c UPNP_E_BAD_RESPONSE: An error occurred in response from * the publisher. * \li \c UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused * the subscription renew. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpRenewSubscription( /*! [in] The handle of the control point that is renewing the subscription. */ UpnpClient_Handle Hnd, /*! [in,out] Pointer to a variable containing the requested subscription time. * Upon return, it contains the actual renewal time. */ int *TimeOut, /*! [in] The ID for the subscription to renew. */ const Upnp_SID SubsId); /*! * \brief Renews a subscription that is about to expire, generating a callback * when the operation is complete. * * Note that many of the error codes for this function are returned in * the \b UpnpEventSubscribe structure. In those cases, the function * returns \c UPNP_E_SUCCESS and the appropriate error code will * be in the UpnpEventSubscribe.ErrCode field in the \b Event * structure passed to the callback. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_SID: The \b SubsId is not a valid * subscription ID. * \li \c UPNP_E_INVALID_PARAM: Either \b Fun is not a valid * callback function pointer or \b Timeout is less than zero * but is not \c UPNP_INFINITE. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. * \li \c UPNP_E_NETWORK_ERROR: A network error occured (returned in * the UpnpEventSubscribe.ErrCode field as part of the * callback). * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket (returned in the UpnpEventSubscribe.ErrCode * field as part of the callback). * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket (returned in the * UpnpEventSubscribe.ErrCode field as part of the * callback). * \li \c UPNP_E_SOCKET_BIND: An error occurred binding the socket * (returned in the UpnpEventSubscribe.ErrCode field as * part of the callback). * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting to * \b PublisherUrl (returned in the \b * UpnpEventSubscribe.ErrCode field as part of the callback). * \li \c UPNP_E_OUTOF_SOCKET: An error occurred creating socket ( * returned in the UpnpEventSubscribe.ErrCode field as * part of the callback). * \li \c UPNP_E_BAD_RESPONSE: An error occurred in response from * the publisher (returned in the \b * UpnpEventSubscribe.ErrCode field as part of the callback). * \li \c UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused * the subscription request (returned in the \b * UpnpEventSubscribe.ErrCode field as part of the callback). */ EXPORT_SPEC int UpnpRenewSubscriptionAsync( /*! [in] The handle of the control point that is renewing the subscription. */ UpnpClient_Handle Hnd, /*! [in] The requested subscription time. The actual timeout value is * returned when the callback function is called. */ int TimeOut, /*! [in] The ID for the subscription to renew. */ Upnp_SID SubsId, /*! [in] Pointer to a callback function to be invoked when the renewal is * complete. */ Upnp_FunPtr Fun, /*! [in] Pointer to user data passed to the callback function when invoked. */ const void *Cookie); /*! * \brief Sets the maximum number of subscriptions accepted per service. * * The default value accepts as many as system resources allow. If the number * of current subscriptions for a service is greater than the requested value, * the SDK accepts no new subscriptions or renewals, however, the SDK does not * remove any current subscriptions. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device * handle. */ EXPORT_SPEC int UpnpSetMaxSubscriptions( /*! The handle of the device for which the maximum number of * subscriptions is being set. */ UpnpDevice_Handle Hnd, /*! The maximum number of subscriptions to be allowed per service. */ int MaxSubscriptions); /*! * \brief Sets the maximum time-out accepted for a subscription request or * renewal. * * The default value accepts the time-out set by the control point. * If a control point requests a subscription time-out less than or equal to * the maximum, the SDK grants the value requested by the control point. If the * time-out is greater, the SDK returns the maximum value. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid device * handle. */ EXPORT_SPEC int UpnpSetMaxSubscriptionTimeOut( /*! The handle of the device for which the maximum subscription * time-out is being set. */ UpnpDevice_Handle Hnd, /*! The maximum subscription time-out to be accepted. */ int MaxSubscriptionTimeOut); /*! * \brief Registers a control point to receive event notifications from another * device. * * This operation is synchronous. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: \b PublisherUrl is not a valid URL. * \li \c UPNP_E_INVALID_PARAM: \b Timeout is not a valid pointer * or \b SubsId or \b PublisherUrl is \c NULL. * \li \c UPNP_E_NETWORK_ERROR: A network error occured. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting to * \b PublisherUrl. * \li \c UPNP_E_OUTOF_SOCKET: An error occurred creating a socket. * \li \c UPNP_E_BAD_RESPONSE: An error occurred in response from * the publisher. * \li \c UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused * the subscription request. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpSubscribe( /*! [in] The handle of the control point. */ UpnpClient_Handle Hnd, /*! [in] The URL of the service to subscribe to. */ const char *PublisherUrl, /*! [in,out]Pointer to a variable containing the requested subscription time. * Upon return, it contains the actual subscription time returned from * the service. */ int *TimeOut, /*! [out] Pointer to a variable to receive the subscription ID (SID). */ Upnp_SID SubsId); /*! * \brief Performs the same operation as \b UpnpSubscribe, but returns * immediately and calls the registered callback function when the operation * is complete. * * Note that many of the error codes for this function are returned in * the \b UpnpEventSubscribe structure. In those cases, the function * returns \c UPNP_E_SUCCESS and the appropriate error code will * be in the UpnpEventSubscribe.ErrCode field in the \b Event * structure passed to the callback. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_URL: The \b PublisherUrl is not a valid * URL. * \li \c UPNP_E_INVALID_PARAM: Either \b TimeOut or \b Fun or * \b PublisherUrl is not a valid pointer. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. * \li \c UPNP_E_NETWORK_ERROR: A network error occured (returned in * the UpnpEventSubscribe.ErrCode field as part of the * callback). * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket (returned in the * UpnpEventSubscribe.ErrCode field as part of the * callback). * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket (returned in the * UpnpEventSubscribe.ErrCode field as part of the * callback). * \li \c UPNP_E_SOCKET_BIND: An error occurred binding the socket * (returned in the UpnpEventSubscribe.ErrCode field as * part of the callback). * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting to * \b PublisherUrl (returned in the \b * UpnpEventSubscribe.ErrCode field as part of the callback). * \li \c UPNP_E_OUTOF_SOCKET: An error occurred creating the * socket (returned in the UpnpEventSubscribe.ErrCode * field as part of the callback). * \li \c UPNP_E_BAD_RESPONSE: An error occurred in response from * the publisher (returned in the \b * UpnpEventSubscribe.ErrCode field as part of the callback). * \li \c UPNP_E_SUBSCRIBE_UNACCEPTED: The publisher refused * the subscription request (returned in the \b * UpnpEventSubscribe.ErrCode field as part of the callback). */ EXPORT_SPEC int UpnpSubscribeAsync( /*! The handle of the control point that is subscribing. */ UpnpClient_Handle Hnd, /*! The URL of the service to subscribe to. */ const char *PublisherUrl, /*! The requested subscription time. Upon return, it contains the actual * subscription time returned from the service. */ int TimeOut, /*! Pointer to the callback function for this subscribe request. */ Upnp_FunPtr Fun, /*! A user data value passed to the callback function when invoked. */ const void *Cookie); /*! * \brief Removes the subscription of a control point from a service previously * subscribed to using \b UpnpSubscribe or \b UpnpSubscribeAsync. * * This is a synchronous call. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_SID: The \b SubsId is not a valid * subscription ID. * \li \c UPNP_E_NETWORK_ERROR: A network error occured. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting to * \b PublisherUrl. * \li \c UPNP_E_OUTOF_SOCKET: An error ocurred creating a socket. * \li \c UPNP_E_BAD_RESPONSE: An error occurred in response from * the publisher. * \li \c UPNP_E_UNSUBSCRIBE_UNACCEPTED: The publisher refused * the unsubscribe request (the client is still unsubscribed and * no longer receives events). * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpUnSubscribe( /*! [in] The handle of the subscribed control point. */ UpnpClient_Handle Hnd, /*! [in] The ID returned when the control point subscribed to the service. */ const Upnp_SID SubsId); /*! * \brief Removes a subscription of a control point from a service previously * subscribed to using \b UpnpSubscribe or \b UpnpSubscribeAsync, generating * a callback when the operation is complete. * * Note that many of the error codes for this function are returned in * the \b UpnpEventSubscribe structure. In those cases, the function * returns \c UPNP_E_SUCCESS and the appropriate error code will * be in the UpnpEventSubscribe.ErrCode field in the \b Event * structure passed to the callback. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_HANDLE: The handle is not a valid control * point handle. * \li \c UPNP_E_INVALID_SID: The \b SubsId is not a valid SID. * \li \c UPNP_E_INVALID_PARAM: \b Fun is not a valid callback * function pointer. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. * \li \c UPNP_E_NETWORK_ERROR: A network error occured (returned in * the UpnpEventSubscribe.ErrCode field as part of the * callback). * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket (returned in the UpnpEventSubscribe.ErrCode * field as part of the callback). * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket (returned in the * UpnpEventSubscribe.ErrCode field as part of the * callback). * \li \c UPNP_E_SOCKET_BIND: An error occurred binding the socket * (returned in the UpnpEventSubscribe.ErrCode field as * part of the callback). * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting to * \b PublisherUrl (returned in the UpnpEventSubscribe.ErrCode * field as part of the callback). * \li \c UPNP_E_OUTOF_SOCKET: An error occurred creating a socket ( * returned in the UpnpEventSubscribe.ErrCode field as * part of the callback). * \li \c UPNP_E_BAD_RESPONSE: An error occurred in response from * the publisher (returned in the UpnpEventSubscribe.ErrCode * field as part of the callback). * \li \c UPNP_E_UNSUBSCRIBE_UNACCEPTED: The publisher refused * the subscription request (returned in the * UpnpEventSubscribe.ErrCode field as part of the callback). */ EXPORT_SPEC int UpnpUnSubscribeAsync( /*! [in] The handle of the subscribed control point. */ UpnpClient_Handle Hnd, /*! [in] The ID returned when the control point subscribed to the service. */ Upnp_SID SubsId, /*! [in] Pointer to a callback function to be called when the operation is * complete. */ Upnp_FunPtr Fun, /*! [in] Pointer to user data to pass to the callback function when invoked. */ const void *Cookie); /*! @} Eventing */ /****************************************************************************** ****************************************************************************** * * * C L I E N T - A P I * * * ****************************************************************************** ******************************************************************************/ /*! * \name Control Point HTTP API * * @{ */ /*! * \brief Downloads a file specified in a URL. * * The SDK allocates the memory for \b outBuf and the application is * responsible for freeing this memory. Note that the item is passed as a * single buffer. Large items should not be transferred using this function. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b url, \b outBuf * or \b contentType is not a valid pointer. * \li \c UPNP_E_INVALID_URL: The \b url is not a valid * URL. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * download this file. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting a * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. */ EXPORT_SPEC int UpnpDownloadUrlItem( /*! [in] URL of an item to download. */ const char *url, /*! [out] Buffer to store the downloaded item. */ char **outBuf, /*! [out] HTTP header value content type if present. It should be at least * \c LINE_SIZE bytes in size. */ char *contentType); /*! * \brief Gets a file specified in a URL. * * The SDK allocates the memory for \b handle and \b contentType, the * application is responsible for freeing this memory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b url, \b handle, * \b contentType, \b contentLength or \b httpStatus * is not a valid pointer. * \li \c UPNP_E_INVALID_URL: The \b url is not a valid * URL. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * download this file. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting a * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. * \li \c UPNP_E_BAD_RESPONSE: A bad response was received from the * remote server. */ EXPORT_SPEC int UpnpOpenHttpGet( /*! [in] The URL of an item to get. */ const char *url, /*! [in,out] A pointer to store the handle for this connection. */ void **handle, /*! [in,out] A buffer to store the media type of the item. */ char **contentType, /*! [in,out] A pointer to store the length of the item. */ int *contentLength, /*! [in,out] The status returned on receiving a response message. */ int *httpStatus, /*! [in] The time out value sent with the request during which a response * is expected from the server, failing which, an error is reported * back to the user. */ int timeout); /*! * \brief Gets a file specified in a URL through the specified proxy. * * The SDK allocates the memory for \b handle and \b contentType, the * application is responsible for freeing this memory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b url, \b handle, * \b contentType, \b contentLength or \b httpStatus * is not a valid pointer. * \li \c UPNP_E_INVALID_URL: The \b url is not a valid * URL. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * download this file. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting a * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. * \li \c UPNP_E_BAD_RESPONSE: A bad response was received from the * remote server. */ EXPORT_SPEC int UpnpOpenHttpGetProxy( /*! [in] The URL of an item to get. */ const char *url, /*! [in] The URL of the proxy. */ const char *proxy_str, /*! [in,out] A pointer to store the handle for this connection. */ void **handle, /*! [in,out] A buffer to store the media type of the item. */ char **contentType, /*! [in,out] A pointer to store the length of the item. */ int *contentLength, /*! [in,out] The status returned on receiving a response message. */ int *httpStatus, /*! [in] The time out value sent with the request during which a response * is expected from the server, failing which, an error is reported * back to the user. */ int timeout); /*! * \brief Gets specified number of bytes from a file specified in the URL. * * The number of bytes is specified through a low count and a high count which * are passed as a range of bytes for the request. The SDK allocates the memory * for \b handle and \b contentType, the application is responsible for freeing * this memory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b url, \b handle, * \b contentType, \b contentLength or \b httpStatus * is not a valid pointer. * \li \c UPNP_E_INVALID_URL: The \b url is not a valid * URL. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * download this file. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting a * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. * \li \c UPNP_E_BAD_RESPONSE: A bad response was received from the * remote server. */ EXPORT_SPEC int UpnpOpenHttpGetEx( /*! [in] The URL of the item to get. */ const char *url, /*! [in,out] A pointer to store the handle for this connection. */ void **handle, /*! [in,out] A buffer to store the media type of the item. */ char **contentType, /*! [in,out] A buffer to store the length of the item. */ int *contentLength, /*! [in,out] The status returned on receiving a response message from the remote server. */ int *httpStatus, /*! [in] An integer value representing the low end of a range to retrieve. */ int lowRange, /*! [in] An integer value representing the high end of a range to retrieve. */ int highRange, /*! [in] A time out value sent with the request during which a response is * expected from the server, failing which, an error is reported back * to the user. */ int timeout); /*! * \brief Gets specified number of bytes from a file specified in a URL. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b handle, \b buf * or \b size is not a valid pointer. * \li \c UPNP_E_BAD_RESPONSE: A bad response was received from the * remote server. * \li \c UPNP_E_BAD_HTTPMSG: Either the request or response was in * the incorrect format. * \li \c UPNP_E_CANCELED: another thread called UpnpCancelHttpGet. * * Note: In case of return values, the status code parameter of the passed * in handle value may provide additional information on the return * value. */ EXPORT_SPEC int UpnpReadHttpGet( /*! [in] The token created by the call to \b UpnpOpenHttpGet. */ void *handle, /*! [in,out] The buffer to store the read item. */ char *buf, /*! [in,out] The size of the buffer to be read. */ unsigned int *size, /*! [in] The time out value sent with the request during which a response is * expected from the server, failing which, an error is reported back to * the user. */ int timeout); /*! * \brief Retrieve progress information of a http-get transfer. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b handle, \b length * or \b total is not a valid pointer. */ EXPORT_SPEC int UpnpHttpGetProgress( /*! [in] The token created by the call to \b UpnpOpenHttpGet. */ void *handle, /*! [out] The number of bytes received. */ unsigned int *length, /*! [out] The content length. */ unsigned int *total); /*! * \brief Set the cancel flag of the \b handle parameter. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: \b handle is not a valid pointer. */ EXPORT_SPEC int UpnpCancelHttpGet( /*! [in] The handle of the connection created by the call to * \b UpnpOpenHttpGet. */ void *handle); /*! * \brief Closes the connection and frees memory that was allocated for the * \b handle parameter. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: \b handle is not a valid pointer. */ EXPORT_SPEC int UpnpCloseHttpGet( /*! [in] The handle of the connection created by the call to * \b UpnpOpenHttpGet. */ void *handle); /*! * \brief Makes an HTTP POST request message, opens a connection to the server * and sends the POST request to the server if the connection to the server * succeeds. * * The SDK allocates the memory for \b handle and \b contentType, the * application is responsible for freeing this memory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b url, \b handle * or \b contentType is not a valid pointer. * \li \c UPNP_E_INVALID_URL: The \b url is not a valid * URL. * \li \c UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * download this file. * \li \c UPNP_E_SOCKET_ERROR: Error occured allocating a socket and * resources or an error occurred binding a socket. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting a * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. */ EXPORT_SPEC int UpnpOpenHttpPost( /*! [in] The URL in which to send the POST request. */ const char *url, /*! [in,out] A pointer in which to store the handle for this connection. This * handle is required for futher operations over this connection. */ void **handle, /*! [in] A buffer to store the media type of content being sent. */ const char *contentType, /*! [in] The length of the content, in bytes, being posted. */ int contentLength, /*! [in] The time out value sent with the request during which a response * is expected from the receiver, failing which, an error is reported. */ int timeout); /*! * \brief Sends a request to a server to copy the contents of a buffer to the * URI specified in the \b UpnpOpenHttpPost call. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b handle, \b buf * or \b size is not a valid pointer. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. */ EXPORT_SPEC int UpnpWriteHttpPost( /*! [in] The handle of the connection created by the call to * \b UpnpOpenHttpPost. */ void *handle, /*! [in] The buffer to be posted. */ char *buf, /*! [in] The size, in bytes of \b buf. */ unsigned int *size, /*! [in] A timeout value sent with the request during which a response is * expected from the server, failing which, an error is reported. */ int timeout); /*! * \brief Sends and receives any pending data, closes the connection with the * server, and frees memory allocated during the \b UpnpOpenHttpPost call. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b handle, or * \b httpStatus is not a valid pointer. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. */ EXPORT_SPEC int UpnpCloseHttpPost( /*! [in] The handle of the connection to close, created by the call to * \b UpnpOpenHttpPost. */ void *handle, /*! [in,out] A pointer to a buffer to store the final status of the connection. */ int *httpStatus, /*! [in] A time out value sent with the request during which a response is * expected from the server, failing which, an error is reported. */ int timeout); /*! * \brief Downloads an XML document specified in a URL. * * The SDK parses the document and returns it in the form of a * DOM document. The application is responsible for freeing the DOM document. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_PARAM: Either \b url or \b xmlDoc * is not a valid pointer. * \li \c UPNP_E_INVALID_DESC: The XML document was not * found or it does not contain a valid XML description. * \li \c UPNP_E_INVALID_URL: The \b url is not a valid * URL. * \li \c UPNP_E_OUTOF_MEMORY: There are insufficient resources to * download the XML document. * \li \c UPNP_E_NETWORK_ERROR: A network error occurred. * \li \c UPNP_E_SOCKET_WRITE: An error or timeout occurred writing * to a socket. * \li \c UPNP_E_SOCKET_READ: An error or timeout occurred reading * from a socket. * \li \c UPNP_E_SOCKET_BIND: An error occurred binding a socket. * \li \c UPNP_E_SOCKET_CONNECT: An error occurred connecting the * socket. * \li \c UPNP_E_OUTOF_SOCKET: Too many sockets are currently * allocated. */ EXPORT_SPEC int UpnpDownloadXmlDoc( /*! [in] URL of the XML document. */ const char *url, /*! [out] A pointer in which to store the XML document. */ IXML_Document **xmlDoc); /*! @} Control Point HTTP API */ /****************************************************************************** ****************************************************************************** * * * W E B S E R V E R A P I * * * ****************************************************************************** ******************************************************************************/ /*! * \name Web Server API * * @{ */ /*! * \brief Sets the document root directory for the internal web server. * * This directory is considered the root directory (i.e. "/") of the web server. * * This function also activates or deactivates the web server. To disable the * web server, pass \c NULL for \b rootDir; to activate, pass a valid directory * string. * * \note This function is not available when the web server is not compiled * into the UPnP Library. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b rootDir is an invalid directory. */ EXPORT_SPEC int UpnpSetWebServerRootDir( /*! [in] Path of the root directory of the web server. */ const char *rootDir); /*! * \brief The type of handle returned by the web server for open requests. */ typedef void *UpnpWebFileHandle; /*! * \brief Get-info callback function prototype. */ typedef int (*VDCallback_GetInfo)( /*! [in] The name of the file to query. */ const char *filename, /*! [out] Pointer to a structure to store the information on the file. */ UpnpFileInfo *info); /*! * \brief Sets the get_info callback function to be used to access a virtual * directory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b callback is not a valid pointer. */ EXPORT_SPEC int UpnpVirtualDir_set_GetInfoCallback(VDCallback_GetInfo callback); /*! * \brief Open callback function prototype. */ typedef UpnpWebFileHandle (*VDCallback_Open)( /*! [in] The name of the file to open. */ const char *filename, /*! [in] The mode in which to open the file. * Valid values are \c UPNP_READ or \c UPNP_WRITE. */ enum UpnpOpenFileMode Mode); /*! * \brief Sets the open callback function to be used to access a virtual * directory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b callback is not a valid pointer. */ EXPORT_SPEC int UpnpVirtualDir_set_OpenCallback(VDCallback_Open callback); /*! * \brief Read callback function prototype. */ typedef int (*VDCallback_Read)( /*! [in] The handle of the file to read. */ UpnpWebFileHandle fileHnd, /*! [out] The buffer in which to place the data. */ char *buf, /*! [in] The size of the buffer (i.e. the number of bytes to read). */ size_t buflen); /*! * \brief Sets the read callback function to be used to access a virtual * directory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b callback is not a valid pointer. */ EXPORT_SPEC int UpnpVirtualDir_set_ReadCallback(VDCallback_Read callback); /*! * \brief Write callback function prototype. */ typedef int (*VDCallback_Write)( /*! [in] The handle of the file to write. */ UpnpWebFileHandle fileHnd, /*! [in] The buffer with the bytes to write. */ char *buf, /*! [in] The number of bytes to write. */ size_t buflen); /*! * \brief Sets the write callback function to be used to access a virtual * directory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b callback is not a valid pointer. */ EXPORT_SPEC int UpnpVirtualDir_set_WriteCallback(VDCallback_Write callback); /*! * \brief Seek callback function prototype. */ typedef int (*VDCallback_Seek) ( /*! [in] The handle of the file to move the file pointer. */ UpnpWebFileHandle fileHnd, /*! [in] The number of bytes to move in the file. Positive values * move foward and negative values move backward. Note that * this must be positive if the \b origin is \c SEEK_SET. */ off_t offset, /*! [in] The position to move relative to. It can be \c SEEK_CUR * to move relative to the current position, \c SEEK_END to * move relative to the end of the file, or \c SEEK_SET to * specify an absolute offset. */ int origin); /*! * \brief Sets the seek callback function to be used to access a virtual * directory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b callback is not a valid pointer. */ EXPORT_SPEC int UpnpVirtualDir_set_SeekCallback(VDCallback_Seek callback); /*! * \brief Close callback function prototype. */ typedef int (*VDCallback_Close)( /*! [in] The handle of the file to close. */ UpnpWebFileHandle fileHnd); /*! * \brief Sets the close callback function to be used to access a virtual * directory. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b callback is not a valid pointer. */ EXPORT_SPEC int UpnpVirtualDir_set_CloseCallback(VDCallback_Close callback); /*! * \brief Enables or disables the webserver. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b enable is not valid. */ EXPORT_SPEC int UpnpEnableWebserver( /*! [in] \c TRUE to enable, \c FALSE to disable. */ int enable); /*! * \brief Returns \c TRUE if the webserver is enabled, or \c FALSE if it is not. * * \return An integer representing one of the following: * \li \c TRUE: The webserver is enabled. * \li \c FALSE: The webserver is not enabled */ EXPORT_SPEC int UpnpIsWebserverEnabled(void); /*! * \brief Adds a virtual directory mapping. * * All webserver requests containing the given directory are read using * functions contained in a \b VirtualDirCallbacks structure registered * via \b UpnpSetVirtualDirCallbacks. * * \note This function is not available when the web server is not * compiled into the UPnP Library. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b dirName is not valid. */ EXPORT_SPEC int UpnpAddVirtualDir( /*! [in] The name of the new directory mapping to add. */ const char *dirName); /*! * \brief Removes a virtual directory mapping made with \b UpnpAddVirtualDir. * * \return An integer representing one of the following: * \li \c UPNP_E_SUCCESS: The operation completed successfully. * \li \c UPNP_E_INVALID_ARGUMENT: \b dirName is not valid. */ EXPORT_SPEC int UpnpRemoveVirtualDir( /*! [in] The name of the virtual directory mapping to remove. */ const char *dirName); /*! * \brief Removes all virtual directory mappings. */ EXPORT_SPEC void UpnpRemoveAllVirtualDirs(void); /* @} Web Server API */ #ifdef __cplusplus } #endif /* __cplusplus */ /* @} UPnPAPI UPnP API */ #endif /* UPNP_H */ libupnp-1.8.0~svn20100507/upnp/inc/Event.h0000644000175000017500000000264111347360466014660 00000000000000 #ifndef EVENT_H #define EVENT_H /*! * \file * * \brief UpnpEvent object declararion. * * \author Marcelo Roberto Jimenez */ /*! Returned along with a \b UPNP_EVENT_RECEIVED callback. */ typedef struct s_UpnpEvent UpnpEvent; #include "ixml.h" /* for IXML_Document */ #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpEvent *UpnpEvent_new(); /*! Destructor */ EXPORT_SPEC void UpnpEvent_delete(UpnpEvent *p); /*! Copy Constructor */ EXPORT_SPEC UpnpEvent *UpnpEvent_dup(const UpnpEvent *p); /*! Assignment operator */ EXPORT_SPEC void UpnpEvent_assign(UpnpEvent *p, const UpnpEvent *q); /*! The event sequence number. */ EXPORT_SPEC int UpnpEvent_get_EventKey(const UpnpEvent *p); EXPORT_SPEC void UpnpEvent_set_EventKey(UpnpEvent *p, int n); /*! The DOM tree representing the changes generating the event. */ EXPORT_SPEC IXML_Document *UpnpEvent_get_ChangedVariables(const UpnpEvent *p); EXPORT_SPEC void UpnpEvent_set_ChangedVariables(UpnpEvent *p, IXML_Document *d); /*! The subscription ID for this subscription. */ EXPORT_SPEC const UpnpString *UpnpEvent_get_SID(const UpnpEvent *p); EXPORT_SPEC const char *UpnpEvent_get_SID_cstr(const UpnpEvent *p); EXPORT_SPEC void UpnpEvent_set_SID(UpnpEvent *p, const UpnpString *s); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* EVENT_H */ libupnp-1.8.0~svn20100507/upnp/inc/UpnpGlobal.h0000644000175000017500000000524611336633540015640 00000000000000 #ifndef UPNPGLOBAL_H #define UPNPGLOBAL_H /*! * \file * * \brief Defines constants that for some reason are not defined on some systems. */ #if defined MYLIB_LARGEFILE_SENSITIVE && _FILE_OFFSET_BITS+0 != 64 #if defined __GNUC__ #warning libupnp requires largefile mode - use AC_SYS_LARGEFILE #else #error libupnp requires largefile mode - use AC_SYS_LARGEFILE #endif #endif #ifdef WIN32 /* * EXPORT_SPEC */ #ifdef UPNP_STATIC_LIB #define EXPORT_SPEC #else /* UPNP_STATIC_LIB */ #ifdef LIBUPNP_EXPORTS /*! set up declspec for dll export to make functions * visible to library users */ #define EXPORT_SPEC __declspec(dllexport) #else /* LIBUPNP_EXPORTS */ #define EXPORT_SPEC __declspec(dllimport) #endif /* LIBUPNP_EXPORTS */ #endif /* UPNP_STATIC_LIB */ /* * UPNP_INLINE * PRId64 * PRIzu */ #ifdef UPNP_USE_MSVCPP /* define some things the M$ VC++ doesn't know */ #define UPNP_INLINE typedef __int64 int64_t; #define PRId64 "I64d" #define PRIzu "lu" #endif /* UPNP_USE_MSVCPP */ #ifdef UPNP_USE_BCBPP /* define some things Borland Builder doesn't know */ #define UPNP_INLINE inline typedef __int64 int64_t; #warning The Borland C compiler is probably broken on PRId64, #warning please someone provide a proper fix here #define PRId64 "I64d" #define PRIzu "zu" #endif /* UPNP_USE_BCBPP */ #ifdef __GNUC__ #define UPNP_INLINE inline /* Note with PRIzu that in the case of Mingw32, it's the MS C * runtime printf which ends up getting called, not the glibc * printf, so it genuinely doesn't have "zu" */ #define PRIzu "lu" #endif /* __GNUC__ */ #else /*! * \brief Export functions on WIN32 DLLs. * * Every funtion that belongs to the library API must use this * definition upon declaration or it will not be exported on WIN32 * DLLs. */ #define EXPORT_SPEC /*! * \brief Declares an inline function. * * Surprisingly, there are some compilers that do not understand the * inline keyword. This definition makes the use of this keyword * portable to these systems. */ #define UPNP_INLINE inline /*! * \brief Supply the PRId64 printf() macro. * * MSVC still does not know about this. */ /* #define PRId64 PRId64 */ /*! * \brief Supply the PRIzu printf() macro. * * This macro was invented so that we can live a little longer with * MSVC lack of C99. "z" is the correct printf() size specifier for * the size_t type. */ #define PRIzu "zu" #endif /* * Defining this macro here gives some interesting information about unused * functions in the code. Of course, this should never go uncommented on a * release. */ /*#define inline*/ #endif /* UPNPGLOBAL_H */ libupnp-1.8.0~svn20100507/upnp/inc/StateVarComplete.h0000644000175000017500000000470111347360466017020 00000000000000 #ifndef STATEVARCOMPLETE_H #define STATEVARCOMPLETE_H /*! * \file * * \brief UpnpStateVarComplete object declararion. * * \author Marcelo Roberto Jimenez */ /*! Represents the reply for the current value of a state variable in an * asynchronous call. */ typedef struct s_UpnpStateVarComplete UpnpStateVarComplete; #include "ixml.h" /* for DOMString */ #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpStateVarComplete *UpnpStateVarComplete_new(); /*! Destructor */ EXPORT_SPEC void UpnpStateVarComplete_delete(UpnpStateVarComplete *p); /*! Copy Constructor */ EXPORT_SPEC UpnpStateVarComplete *UpnpStateVarComplete_dup(const UpnpStateVarComplete *p); /*! Assignment operator */ EXPORT_SPEC void UpnpStateVarComplete_assign(UpnpStateVarComplete *p, const UpnpStateVarComplete *q); /*! The result of the operation */ EXPORT_SPEC int UpnpStateVarComplete_get_ErrCode(const UpnpStateVarComplete *p); EXPORT_SPEC void UpnpStateVarComplete_set_ErrCode(UpnpStateVarComplete *p, int n); /*! The control URL for the service. */ EXPORT_SPEC const UpnpString *UpnpStateVarComplete_get_CtrlUrl(const UpnpStateVarComplete *p); EXPORT_SPEC const char *UpnpStateVarComplete_get_CtrlUrl_cstr(const UpnpStateVarComplete *p); EXPORT_SPEC void UpnpStateVarComplete_set_CtrlUrl(UpnpStateVarComplete *p, const UpnpString *s); EXPORT_SPEC void UpnpStateVarComplete_strcpy_CtrlUrl(UpnpStateVarComplete *p, const char *s); /*! The name of the variable. */ EXPORT_SPEC const UpnpString *UpnpStateVarComplete_get_StateVarName(const UpnpStateVarComplete *p); EXPORT_SPEC const char *UpnpStateVarComplete_get_StateVarName_cstr(const UpnpStateVarComplete *p); EXPORT_SPEC void UpnpStateVarComplete_set_StateVarName(UpnpStateVarComplete *p, const UpnpString *s); EXPORT_SPEC void UpnpStateVarComplete_strcpy_StateVarName(UpnpStateVarComplete *p, const char *s); /*! The current value of the variable. This needs to be allocated by * the caller. When finished with it, the SDK frees this \b DOMString. */ EXPORT_SPEC const DOMString UpnpStateVarComplete_get_CurrentVal(const UpnpStateVarComplete *p); EXPORT_SPEC const char *UpnpStateVarComplete_get_CurrentVal_cstr(const UpnpStateVarComplete *p); EXPORT_SPEC void UpnpStateVarComplete_set_CurrentVal(UpnpStateVarComplete *p, const DOMString s); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* STATEVARCOMPLETE_H */ libupnp-1.8.0~svn20100507/upnp/inc/Discovery.h0000644000175000017500000001111611347360466015543 00000000000000 #ifndef DISCOVERY_H #define DISCOVERY_H /*! * \file * * \brief UpnpDiscovery object declararion. * * \author Marcelo Roberto Jimenez */ /*! Returned in a \b UPNP_DISCOVERY_RESULT callback. */ typedef struct s_UpnpDiscovery UpnpDiscovery; #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpInet.h" /* for sockaddr, sockaddr_storage */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpDiscovery *UpnpDiscovery_new(); /*! Destructor */ EXPORT_SPEC void UpnpDiscovery_delete(UpnpDiscovery *p); /*! Copy Constructor */ EXPORT_SPEC UpnpDiscovery *UpnpDiscovery_dup(const UpnpDiscovery *p); /*! Assignment operator */ EXPORT_SPEC void UpnpDiscovery_assign(UpnpDiscovery *p, const UpnpDiscovery *q); /*! The result code of the \b UpnpSearchAsync call. */ EXPORT_SPEC int UpnpDiscovery_get_ErrCode(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_ErrCode(UpnpDiscovery *p, int n); /*! The expiration time of the advertisement. */ EXPORT_SPEC int UpnpDiscovery_get_Expires(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_Expires(UpnpDiscovery *p, int n); /*! The unique device identifier. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_DeviceID(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_DeviceID_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_DeviceID(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_DeviceID(UpnpDiscovery *p, const char *s); /*! The device type. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_DeviceType(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_DeviceType_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_DeviceType(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_DeviceType(UpnpDiscovery *p, const char *s); /*! The ServiceType. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_ServiceType(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_ServiceType_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_ServiceType(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_ServiceType(UpnpDiscovery *p, const char *s); /*! The service version. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_ServiceVer(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_ServiceVer_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_ServiceVer(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_ServiceVer(UpnpDiscovery *p, const char *s); /*! The URL to the UPnP description document for the device. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_Location(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_Location_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_Location(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_Location(UpnpDiscovery *p, const char *s); EXPORT_SPEC void UpnpDiscovery_strncpy_Location(UpnpDiscovery *p, const char *s, int n); /*! The operating system the device is running. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_Os(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_Os_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_Os(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_Os(UpnpDiscovery *p, const char *s); EXPORT_SPEC void UpnpDiscovery_strncpy_Os(UpnpDiscovery *p, const char *s, int n); /*! Date when the response was generated. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_Date(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_Date_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_Date(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_Date(UpnpDiscovery *p, const char *s); /*! Confirmation that the MAN header was understood by the device. */ EXPORT_SPEC const UpnpString *UpnpDiscovery_get_Ext(const UpnpDiscovery *p); EXPORT_SPEC const char *UpnpDiscovery_get_Ext_cstr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_Ext(UpnpDiscovery *p, const UpnpString *s); EXPORT_SPEC void UpnpDiscovery_strcpy_Ext(UpnpDiscovery *p, const char *s); EXPORT_SPEC void UpnpDiscovery_strncpy_Ext(UpnpDiscovery *p, const char *s, int n); /*! The host address of the device responding to the search. */ EXPORT_SPEC const struct sockaddr *UpnpDiscovery_get_DestAddr(const UpnpDiscovery *p); EXPORT_SPEC void UpnpDiscovery_set_DestAddr(UpnpDiscovery *p, const struct sockaddr *sa); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* DISCOVERY_H */ libupnp-1.8.0~svn20100507/upnp/inc/ActionComplete.h0000644000175000017500000000664011347360466016510 00000000000000 #ifndef ACTIONCOMPLETE_H #define ACTIONCOMPLETE_H /*! * \file * * \brief UpnpActionComplete object declararion. * * \author Marcelo Roberto Jimenez */ /*! * \brief The type of an UpnpActionComplete object. */ typedef struct s_UpnpActionComplete UpnpActionComplete; #include "ixml.h" /* for IXML_Document */ #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include "UpnpString.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! * \brief Constructor. * * \return Pointer to the newly created object. */ EXPORT_SPEC UpnpActionComplete *UpnpActionComplete_new(); /*! * \brief Destructor. */ EXPORT_SPEC void UpnpActionComplete_delete( /*! [in] \b this pointer. */ UpnpActionComplete *p); /*! * \brief Copy Constructor. */ EXPORT_SPEC UpnpActionComplete *UpnpActionComplete_dup( /*! [in] \b this pointer. */ const UpnpActionComplete *p); /*! * \brief Assignment operator. */ EXPORT_SPEC void UpnpActionComplete_assign( /*! [in] \b this pointer. */ UpnpActionComplete *p, /*! [in] \b that pointer. */ const UpnpActionComplete *q); /*! * \brief Error code getter. */ EXPORT_SPEC int UpnpActionComplete_get_ErrCode( /*! [in] \b this pointer. */ const UpnpActionComplete *p); /*! * \brief Error code setter. */ EXPORT_SPEC void UpnpActionComplete_set_ErrCode( /*! [in] \b this pointer. */ UpnpActionComplete *p, /*! [in] The error code to set. */ int n); /*! * \brief Control URL getter. * * \return The control URL string. */ EXPORT_SPEC const UpnpString *UpnpActionComplete_get_CtrlUrl( /*! [in] \b this pointer. */ const UpnpActionComplete *p); /*! * \brief Control URL getter as a C string * * \return The control URL string. */ EXPORT_SPEC const char *UpnpActionComplete_get_CtrlUrl_cstr( /*! [in] \b this pointer. */ const UpnpActionComplete *p); /*! * \brief Control URL setter. */ EXPORT_SPEC void UpnpActionComplete_set_CtrlUrl( /*! [in] \b this pointer. */ UpnpActionComplete *p, /*! [in] The control URL string to copy. */ const UpnpString *s); /*! * \brief Set the control URL from a null terminated C string. */ EXPORT_SPEC void UpnpActionComplete_strcpy_CtrlUrl( /*! [in] \b this pointer. */ UpnpActionComplete *p, /*! [in] The null terminated control URL C string to copy. */ const char *s); /*! * \brief ActionRequest document getter. * * \return A pointer to the document object. */ EXPORT_SPEC IXML_Document *UpnpActionComplete_get_ActionRequest( /*! [in] \b this pointer. */ const UpnpActionComplete *p); /*! * \brief ActionRequest document setter. * * \note The ActionComplete object takes ownership of the document parameter, * i.e. it is responsible for deleting it upon destruction. */ EXPORT_SPEC void UpnpActionComplete_set_ActionRequest( /*! [in] \b this pointer. */ UpnpActionComplete *p, /*! [in] Document to copy. */ IXML_Document *d); /*! * \brief ActionResult document getter. */ EXPORT_SPEC IXML_Document *UpnpActionComplete_get_ActionResult( /*! [in] \b this pointer. */ const UpnpActionComplete *p); /*! * \brief ActionResult document setter. * * \note The ActionComplete object takes ownership of the document parameter, * i.e. it is responsible for deleting it upon destruction. */ EXPORT_SPEC void UpnpActionComplete_set_ActionResult( /*! [in] \b this pointer. */ UpnpActionComplete *p, /*! [in] Document to copy. */ IXML_Document *d); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* ACTIONCOMPLETE_H */ libupnp-1.8.0~svn20100507/upnp/inc/upnpconfig.h.in0000644000175000017500000000675511021325543016350 00000000000000/* -*- C -*- */ /******************************************************************************* * * Copyright (c) 2006 Rémi Turboult * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef UPNP_CONFIG_H #define UPNP_CONFIG_H /*************************************************************************** * Library version ***************************************************************************/ /** The library version (string) e.g. "1.3.0" */ #undef UPNP_VERSION_STRING /** Major version of the library */ #undef UPNP_VERSION_MAJOR /** Minor version of the library */ #undef UPNP_VERSION_MINOR /** Patch version of the library */ #undef UPNP_VERSION_PATCH /** The library version (numeric) e.g. 10300 means version 1.3.0 */ #define UPNP_VERSION \ ((UPNP_VERSION_MAJOR*100 + UPNP_VERSION_MINOR)*100 + UPNP_VERSION_PATCH) /*************************************************************************** * Library optional features ***************************************************************************/ /* * The following defines can be tested in order to know which * optional features have been included in the installed library. */ /** Defined to 1 if the library has been compiled with DEBUG enabled * (i.e. configure --enable-debug) : file is available */ #undef UPNP_HAVE_DEBUG /** Defined to 1 if the library has been compiled with client API enabled * (i.e. configure --enable-client) */ #undef UPNP_HAVE_CLIENT /** Defined to 1 if the library has been compiled with device API enabled * (i.e. configure --enable-device) */ #undef UPNP_HAVE_DEVICE /** Defined to 1 if the library has been compiled with integrated web server * (i.e. configure --enable-webserver --enable-device) */ #undef UPNP_HAVE_WEBSERVER /** Defined to 1 if the library has been compiled with helper API * (i.e. configure --enable-tools) : file is available */ #undef UPNP_HAVE_TOOLS #endif /* UPNP_CONFIG_H */ libupnp-1.8.0~svn20100507/upnp/inc/FileInfo.h0000644000175000017500000000506511347360466015275 00000000000000 #ifndef FILEINFO_H #define FILEINFO_H /*! * \file * * \brief UpnpFileInfo object declararion. * * \author Marcelo Roberto Jimenez */ /*! Detailed description of this class should go here */ typedef struct s_UpnpFileInfo UpnpFileInfo; #include "ixml.h" /* for DOMString */ #include "UpnpGlobal.h" /* for EXPORT_SPEC */ #include /* for off_t */ #include /* for time_t */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Constructor */ EXPORT_SPEC UpnpFileInfo *UpnpFileInfo_new(); /*! Destructor */ EXPORT_SPEC void UpnpFileInfo_delete(UpnpFileInfo *p); /*! Copy Constructor */ EXPORT_SPEC UpnpFileInfo *UpnpFileInfo_dup(const UpnpFileInfo *p); /*! Assignment operator */ EXPORT_SPEC void UpnpFileInfo_assign(UpnpFileInfo *p, const UpnpFileInfo *q); /*! The length of the file. A length less than 0 indicates the size * is unknown, and data will be sent until 0 bytes are returned from * a read call. */ EXPORT_SPEC off_t UpnpFileInfo_get_FileLength(const UpnpFileInfo *p); EXPORT_SPEC void UpnpFileInfo_set_FileLength(UpnpFileInfo *p, off_t l); /*! The time at which the contents of the file was modified; * The time system is always local (not GMT). */ EXPORT_SPEC const time_t *UpnpFileInfo_get_LastModified(const UpnpFileInfo *p); EXPORT_SPEC void UpnpFileInfo_set_LastModified(UpnpFileInfo *p, const time_t *t); /*! If the file is a directory, \b is_directory contains * a non-zero value. For a regular file, it should be 0. */ EXPORT_SPEC int UpnpFileInfo_get_IsDirectory(const UpnpFileInfo *p); EXPORT_SPEC void UpnpFileInfo_set_IsDirectory(UpnpFileInfo *p, int b); /*! If the file or directory is readable, this contains * a non-zero value. If unreadable, it should be set to 0. */ EXPORT_SPEC int UpnpFileInfo_get_IsReadable(const UpnpFileInfo *p); EXPORT_SPEC void UpnpFileInfo_set_IsReadable(UpnpFileInfo *p, int b); /*! The content type of the file. */ EXPORT_SPEC const DOMString UpnpFileInfo_get_ContentType(const UpnpFileInfo *p); EXPORT_SPEC const char *UpnpFileInfo_get_ContentType_cstr(const UpnpFileInfo *p); EXPORT_SPEC void UpnpFileInfo_set_ContentType(UpnpFileInfo *p, const DOMString s); /*! Additional HTTP headers to return. Each header line should be * followed by "\r\n". */ EXPORT_SPEC const DOMString UpnpFileInfo_get_ExtraHeaders(const UpnpFileInfo *p); EXPORT_SPEC const char *UpnpFileInfo_get_ExtraHeaders_cstr(const UpnpFileInfo *p); EXPORT_SPEC void UpnpFileInfo_set_ExtraHeaders(UpnpFileInfo *p, const DOMString s); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* FILEINFO_H */ libupnp-1.8.0~svn20100507/upnp/inc/upnptools.h0000644000175000017500000002166511025042302015624 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef UPNP_TOOLS_H #define UPNP_TOOLS_H /*! * \file * * \defgroup UPnPTools Optional Tool API * * \brief Additional, optional utility API that can be helpful in writing * applications. * * This additional API can be compiled out in order to save code size in the * library. Refer to the file README for details. * * @{ */ #include "ixml.h" /* for IXML_Document */ /* Function declarations only if tools compiled into the library */ #if UPNP_HAVE_TOOLS #ifdef __cplusplus extern "C" { #endif /*! * \brief Converts an SDK error code into a string error message suitable for * display. The memory returned from this function should NOT be freed. * * \return An ASCII text string representation of the error message associated * with the error code or the string "Unknown error code" */ EXPORT_SPEC const char *UpnpGetErrorMessage( /*! [in] The SDK error code to convert. */ int errorcode); /*! * \brief Combines a base URL and a relative URL into a single absolute URL. * * The memory for \b AbsURL needs to be allocated by the caller and must * be large enough to hold the \b BaseURL and \b RelURL combined. * * \return An integer representing one of the following: * \li UPNP_E_SUCCESS: The operation completed successfully. * \li UPNP_E_INVALID_PARAM: \b RelURL is NULL. * \li UPNP_E_INVALID_URL: The \b BaseURL / \b RelURL * combination does not form a valid URL. * \li UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpResolveURL( /*! [in] The base URL to combine. */ const char *BaseURL, /*! [in] The relative URL to \b BaseURL. */ const char *RelURL, /*! [out] A pointer to a buffer to store the absolute URL. */ char *AbsURL); /*! * \brief Creates an action request packet based on its input parameters * (status variable name and value pair). * * Any number of input parameters can be passed to this function but every * input variable name should have a matching value argument. * * It is a wrapper function that calls makeAction() function to create the * action request. * * \return The action node of \b Upnp_Document type or NULL if the * operation failed. */ EXPORT_SPEC IXML_Document *UpnpMakeAction( /*! [in] Name of the action request or response. */ const char *ActionName, /*! [in] The service type. */ const char *ServType, /*! [in] Number of argument pairs to be passed. */ int NumArg, /*! [in] pointer to the first argument. */ const char *Arg, /*! [in] Argument list. */ ...); /*! * \brief Ceates an action response packet based on its output parameters * (status variable name and value pair). * * Any number of input parameters can be passed to this function but every * output variable name should have a matching value argument. * * It is a wrapper function that calls makeAction() function to create the * action request. * * \return The action node of \b Upnp_Document type or NULL if the * operation failed. */ EXPORT_SPEC IXML_Document *UpnpMakeActionResponse( /*! [in] The action name. */ const char *ActionName, /*! [in] The service type.. */ const char *ServType, /*! [in] The number of argument pairs passed. */ int NumArg, /*! [in] The status variable name and value pair. */ const char *Arg, /*! [in] Other status variable name and value pairs. */ ...); /*! * \brief Adds the argument in the action request. * * This API is specially suitable inside a loop to add any number input * parameters into an existing action. If no action document exists in the * beginning then a Upnp_Document variable initialized with NULL * should be passed as a parameter. * * It is a wrapper function that calls addToAction() function to add the * argument in the action request. * * \return An integer representing one of the following: * \li UPNP_E_SUCCESS: The operation completed successfully. * \li UPNP_E_INVALID_PARAM: One or more of the parameters are invalid. * \li UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpAddToAction( /*! [in,out] A pointer to store the action document node. */ IXML_Document **ActionDoc, /*! [in] The action name. */ const char *ActionName, /*! [in] The service type. */ const char *ServType, /*! [in] The status variable name. */ const char *ArgName, /*! [in] The status variable value. */ const char *ArgVal); /*! * \brief Creates an action response packet based on its output parameters * (status variable name and value pair). * * This API is especially suitable inside a loop to add any number of input * parameters into an existing action response. If no action document exists * in the beginning, a \b Upnp_Document variable initialized with NULL * should be passed as a parameter. * * It is a wrapper function that calls addToAction() function to add the * argument in the action request. * * \return An integer representing one of the following: * \li UPNP_E_SUCCESS: The operation completed successfully. * \li UPNP_E_INVALID_PARAM: One or more of the parameters are invalid. * \li UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpAddToActionResponse( /*! [in,out] Pointer to a document to store the action document node. */ IXML_Document **ActionResponse, /*! [in] The action name. */ const char *ActionName, /*! [in] The service type. */ const char *ServType, /*! [in] The status variable name. */ const char *ArgName, /*! [in] The status variable value. */ const char *ArgVal); /*! * \brief Creates a property set message packet. * * Any number of input parameters can be passed to this function but every * input variable name should have a matching value input argument. * * \return NULL on failure, or the property-set document node. */ EXPORT_SPEC IXML_Document *UpnpCreatePropertySet( /*! [in] The number of argument pairs passed. */ int NumArg, /*! [in] The status variable name and value pair. */ const char *Arg, /*! [in] Variable sized list with the rest of the parameters. */ ...); /*! * \brief Can be used when an application needs to transfer the status of many * variables at once. * * It can be used (inside a loop) to add some extra status variables into an * existing property set. If the application does not already have a property * set document, the application should create a variable initialized with * NULL and pass that as the first parameter. * * \return An integer representing one of the following: * \li UPNP_E_SUCCESS: The operation completed successfully. * \li UPNP_E_INVALID_PARAM: One or more of the parameters are invalid. * \li UPNP_E_OUTOF_MEMORY: Insufficient resources exist to * complete this operation. */ EXPORT_SPEC int UpnpAddToPropertySet( /*! [in,out] A pointer to the document containing the property set document node. */ IXML_Document **PropSet, /*! [in] The status variable name. */ const char *ArgName, /*! [in] The status variable value. */ const char *ArgVal); #ifdef __cplusplus } #endif /*! @} */ #endif /* UPNP_HAVE_TOOLS */ #endif /* UPNP_TOOLS_H */ libupnp-1.8.0~svn20100507/upnp/src/0000777000175000017500000000000011373047472013523 500000000000000libupnp-1.8.0~svn20100507/upnp/src/api/0000777000175000017500000000000011373047472014274 500000000000000libupnp-1.8.0~svn20100507/upnp/src/api/UpnpString.c0000644000175000017500000000564311365106163016467 00000000000000 /*! * \addtogroup UpnpString * * Due to its heavy use, this class is coded for efficiency, not for beauty. * Do not use this as example to other classes. Please take a look at any * other one. * * \todo Always alloc a minimum size like 64 bytes or so and when shrinking * do not perform a new memory allocation. * * @{ * * \file * * \brief UpnpString object implementation. */ #include "config.h" #include "UpnpString.h" #include /* for calloc(), free() */ #include /* for strlen(), strdup() */ /*! * \brief Internal implementation of the class UpnpString. * * \internal */ struct SUpnpString { /*! \brief Length of the string. */ int m_length; /*! \brief Pointer to a dynamically allocated area that holds the NULL * terminated string. */ char *m_string; }; UpnpString *UpnpString_new() { // All bytes are zero, and so is the length of the string. struct SUpnpString *p = calloc(1, sizeof (struct SUpnpString)); if (p == NULL) { goto error_handler1; } #if 0 p->m_length = 0; #endif // This byte is zero, calloc does initialize it. p->m_string = calloc(1, 1); if (p->m_string == NULL) { goto error_handler2; } return (UpnpString *)p; //free(p->m_string); error_handler2: free(p); error_handler1: return NULL; } void UpnpString_delete(UpnpString *p) { struct SUpnpString *q = (struct SUpnpString *)p; if (!q) return; q->m_length = 0; free(q->m_string); q->m_string = NULL; free(p); } UpnpString *UpnpString_dup(const UpnpString *p) { struct SUpnpString *q = calloc(1, sizeof (struct SUpnpString)); if (q == NULL) { goto error_handler1; } q->m_length = ((struct SUpnpString *)p)->m_length; q->m_string = strdup(((struct SUpnpString *)p)->m_string); if (q->m_string == NULL) { goto error_handler2; } return (UpnpString *)q; //free(q->m_string); error_handler2: free(q); error_handler1: return NULL; } void UpnpString_assign(UpnpString *p, const UpnpString *q) { if (p != q) { UpnpString_set_String(p, UpnpString_get_String(q)); } } int UpnpString_get_Length(const UpnpString *p) { return ((struct SUpnpString *)p)->m_length; } const char *UpnpString_get_String(const UpnpString *p) { return ((struct SUpnpString *)p)->m_string; } void UpnpString_set_String(UpnpString *p, const char *s) { free(((struct SUpnpString *)p)->m_string); ((struct SUpnpString *)p)->m_length = strlen(s); ((struct SUpnpString *)p)->m_string = strdup(s); } void UpnpString_set_StringN(UpnpString *p, const char *s, int n) { free(((struct SUpnpString *)p)->m_string); ((struct SUpnpString *)p)->m_length = n; ((struct SUpnpString *)p)->m_string = (char *)malloc(n+1); strncpy(((struct SUpnpString *)p)->m_string, s, n); ((struct SUpnpString *)p)->m_string[n] = 0; } void UpnpString_clear(UpnpString *p) { ((struct SUpnpString *)p)->m_length = 0; // No need to realloc now, will do later when needed ((struct SUpnpString *)p)->m_string[0] = 0; } /* @} UpnpString */ libupnp-1.8.0~svn20100507/upnp/src/api/SubscriptionRequest.c0000644000175000017500000001003011365106163020375 00000000000000 /*! * \file * * \brief UpnpSubscriptionRequest object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "SubscriptionRequest.h" #include /* for calloc(), free() */ #include /* for memset(), strlen(), strdup() */ struct SUpnpSubscriptionRequest { UpnpString *m_serviceId; UpnpString *m_UDN; UpnpString *m_SID; }; UpnpSubscriptionRequest *UpnpSubscriptionRequest_new() { struct SUpnpSubscriptionRequest *p = calloc(1, sizeof (struct SUpnpSubscriptionRequest)); p->m_serviceId = UpnpString_new(); p->m_UDN = UpnpString_new(); p->m_SID = UpnpString_new(); return (UpnpSubscriptionRequest *)p; } void UpnpSubscriptionRequest_delete(UpnpSubscriptionRequest *p) { struct SUpnpSubscriptionRequest *q = (struct SUpnpSubscriptionRequest *)p; if (!q) return; UpnpString_delete(q->m_serviceId); q->m_serviceId = NULL; UpnpString_delete(q->m_UDN); q->m_UDN = NULL; UpnpString_delete(q->m_SID); q->m_SID = NULL; free(p); } UpnpSubscriptionRequest *UpnpSubscriptionRequest_dup(const UpnpSubscriptionRequest *p) { UpnpSubscriptionRequest *q = UpnpSubscriptionRequest_new(); UpnpSubscriptionRequest_assign(q, p); return q; } void UpnpSubscriptionRequest_assign(UpnpSubscriptionRequest *p, const UpnpSubscriptionRequest *q) { if (p != q) { UpnpSubscriptionRequest_set_ServiceId(p, UpnpSubscriptionRequest_get_ServiceId(q)); UpnpSubscriptionRequest_set_UDN(p, UpnpSubscriptionRequest_get_UDN(q)); UpnpSubscriptionRequest_set_SID(p, UpnpSubscriptionRequest_get_SID(q)); } } const UpnpString *UpnpSubscriptionRequest_get_ServiceId(const UpnpSubscriptionRequest *p) { return ((struct SUpnpSubscriptionRequest *)p)->m_serviceId; } const char *UpnpSubscriptionRequest_get_ServiceId_cstr(const UpnpSubscriptionRequest *p) { return UpnpString_get_String(UpnpSubscriptionRequest_get_ServiceId(p)); } void UpnpSubscriptionRequest_set_ServiceId(UpnpSubscriptionRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpSubscriptionRequest *)p)->m_serviceId); ((struct SUpnpSubscriptionRequest *)p)->m_serviceId = UpnpString_dup(s); } void UpnpSubscriptionRequest_strcpy_ServiceId(UpnpSubscriptionRequest *p, const char *s) { UpnpString_delete(((struct SUpnpSubscriptionRequest *)p)->m_serviceId); ((struct SUpnpSubscriptionRequest *)p)->m_serviceId = UpnpString_new(); UpnpString_set_String(((struct SUpnpSubscriptionRequest *)p)->m_serviceId, s); } const UpnpString *UpnpSubscriptionRequest_get_UDN(const UpnpSubscriptionRequest *p) { return ((struct SUpnpSubscriptionRequest *)p)->m_UDN; } const char *UpnpSubscriptionRequest_get_UDN_cstr(const UpnpSubscriptionRequest *p) { return UpnpString_get_String(UpnpSubscriptionRequest_get_UDN(p)); } void UpnpSubscriptionRequest_set_UDN(UpnpSubscriptionRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpSubscriptionRequest *)p)->m_UDN); ((struct SUpnpSubscriptionRequest *)p)->m_UDN = UpnpString_dup(s); } void UpnpSubscriptionRequest_strcpy_UDN(UpnpSubscriptionRequest *p, const char *s) { UpnpString_delete(((struct SUpnpSubscriptionRequest *)p)->m_UDN); ((struct SUpnpSubscriptionRequest *)p)->m_UDN = UpnpString_new(); UpnpString_set_String(((struct SUpnpSubscriptionRequest *)p)->m_UDN, s); } const UpnpString *UpnpSubscriptionRequest_get_SID(const UpnpSubscriptionRequest *p) { return ((struct SUpnpSubscriptionRequest *)p)->m_SID; } const char *UpnpSubscriptionRequest_get_SID_cstr(const UpnpSubscriptionRequest *p) { return UpnpString_get_String(UpnpSubscriptionRequest_get_SID(p)); } void UpnpSubscriptionRequest_set_SID(UpnpSubscriptionRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpSubscriptionRequest *)p)->m_SID); ((struct SUpnpSubscriptionRequest *)p)->m_SID = UpnpString_dup(s); } void UpnpSubscriptionRequest_strcpy_SID(UpnpSubscriptionRequest *p, const char *s) { UpnpString_delete(((struct SUpnpSubscriptionRequest *)p)->m_SID); ((struct SUpnpSubscriptionRequest *)p)->m_SID = UpnpString_new(); UpnpString_set_String(((struct SUpnpSubscriptionRequest *)p)->m_SID, s); } libupnp-1.8.0~svn20100507/upnp/src/api/EventSubscribe.c0000644000175000017500000000666011365106163017301 00000000000000 /*! * \file * * \brief UpnpEventSubscribe object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "EventSubscribe.h" #include /* for calloc(), free() */ struct SEventSubscribe { int m_errCode; int m_timeOut; UpnpString *m_SID; UpnpString *m_publisherUrl; }; UpnpEventSubscribe *UpnpEventSubscribe_new() { struct SEventSubscribe *p = calloc(1, sizeof (struct SEventSubscribe)); #if 0 p->errCode = 0; p->timeOut = 0; #endif p->m_SID = UpnpString_new(); p->m_publisherUrl = UpnpString_new(); return (UpnpEventSubscribe *)p; } void UpnpEventSubscribe_delete(UpnpEventSubscribe *p) { struct SEventSubscribe *q = (struct SEventSubscribe *)p; if (!q) return; q->m_errCode = 0; q->m_timeOut = 0; UpnpString_delete(q->m_publisherUrl); q->m_publisherUrl = NULL; UpnpString_delete(q->m_SID); q->m_SID = NULL; free(p); } UpnpEventSubscribe *UpnpEventSubscribe_dup(const UpnpEventSubscribe *p) { UpnpEventSubscribe *q = UpnpEventSubscribe_new(); UpnpEventSubscribe_assign(q, p); return q; } void UpnpEventSubscribe_assign(UpnpEventSubscribe *p, const UpnpEventSubscribe *q) { if (p != q) { UpnpEventSubscribe_set_ErrCode(p, UpnpEventSubscribe_get_ErrCode(q)); UpnpEventSubscribe_set_TimeOut(p, UpnpEventSubscribe_get_TimeOut(q)); UpnpEventSubscribe_set_SID(p, UpnpEventSubscribe_get_SID(q)); UpnpEventSubscribe_set_PublisherUrl(p, UpnpEventSubscribe_get_PublisherUrl(q)); } } int UpnpEventSubscribe_get_ErrCode(const UpnpEventSubscribe *p) { return ((struct SEventSubscribe *)p)->m_errCode; } void UpnpEventSubscribe_set_ErrCode(UpnpEventSubscribe *p, int n) { ((struct SEventSubscribe *)p)->m_errCode = n; } int UpnpEventSubscribe_get_TimeOut(const UpnpEventSubscribe *p) { return ((struct SEventSubscribe *)p)->m_timeOut; } void UpnpEventSubscribe_set_TimeOut(UpnpEventSubscribe *p, int n) { ((struct SEventSubscribe *)p)->m_timeOut = n; } const UpnpString *UpnpEventSubscribe_get_SID(const UpnpEventSubscribe *p) { return ((struct SEventSubscribe *)p)->m_SID; } const char *UpnpEventSubscribe_get_SID_cstr(const UpnpEventSubscribe *p) { return UpnpString_get_String(UpnpEventSubscribe_get_SID(p)); } void UpnpEventSubscribe_set_SID(UpnpEventSubscribe *p, const UpnpString *s) { UpnpString_delete(((struct SEventSubscribe *)p)->m_SID); ((struct SEventSubscribe *)p)->m_SID = UpnpString_dup(s); } void UpnpEventSubscribe_strcpy_SID(UpnpEventSubscribe *p, const char *s) { UpnpString_delete(((struct SEventSubscribe *)p)->m_SID); ((struct SEventSubscribe *)p)->m_SID = UpnpString_new(); UpnpString_set_String(((struct SEventSubscribe *)p)->m_SID, s); } const UpnpString *UpnpEventSubscribe_get_PublisherUrl(const UpnpEventSubscribe *p) { return ((struct SEventSubscribe *)p)->m_publisherUrl; } const char *UpnpEventSubscribe_get_PublisherUrl_cstr(const UpnpEventSubscribe *p) { return UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(p)); } void UpnpEventSubscribe_set_PublisherUrl(UpnpEventSubscribe *p, const UpnpString *s) { UpnpString_delete(((struct SEventSubscribe *)p)->m_publisherUrl); ((struct SEventSubscribe *)p)->m_publisherUrl = UpnpString_dup(s); } void UpnpEventSubscribe_strcpy_PublisherUrl(UpnpEventSubscribe *p, const char *s) { UpnpString_delete(((struct SEventSubscribe *)p)->m_publisherUrl); ((struct SEventSubscribe *)p)->m_publisherUrl = UpnpString_new(); UpnpString_set_String(((struct SEventSubscribe *)p)->m_publisherUrl, s); } libupnp-1.8.0~svn20100507/upnp/src/api/upnpapi.c0000644000175000017500000030523211365106163016027 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "config.h" /*! * \file */ #include #include #include #include #include #ifdef WIN32 /* Do not include these files */ #else #include #if defined(__sun) #include #include #elif defined(BSD) && BSD >= 199306 #include /* Do not move or remove the include below for "sys/socket"! * Will break FreeBSD builds. */ #include #endif #include #include #include #include #include #include #include #include #include #endif #include "upnpapi.h" #include "httpreadwrite.h" #include "membuffer.h" #include "ssdplib.h" #include "soaplib.h" #include "ThreadPool.h" #include "sysdep.h" #include "uuid.h" /* Needed for GENA */ #include "gena.h" #include "miniserver.h" #include "service_table.h" #ifdef INTERNAL_WEB_SERVER #include "urlconfig.h" #include "VirtualDir.h" #include "webserver.h" #endif /* INTERNAL_WEB_SERVER */ /*! This structure is for virtual directory callbacks */ struct VirtualDirCallbacks virtualDirCallback; /*! Pointer to the virtual directory list. */ virtualDirList *pVirtualDirList; #ifdef INCLUDE_CLIENT_APIS /*! Mutex to synchronize the subscription handling at the client side. */ ithread_mutex_t GlobalClientSubscribeMutex; #endif /* INCLUDE_CLIENT_APIS */ /*! rwlock to synchronize handles (root device or control point handle). */ ithread_rwlock_t GlobalHndRWLock; /*! Mutex to synchronize the uuid creation process. */ ithread_mutex_t gUUIDMutex; /*! Initialization mutex. */ ithread_mutex_t gSDKInitMutex = PTHREAD_MUTEX_INITIALIZER; /*! Global timer thread. */ TimerThread gTimerThread; /*! Send thread pool. */ ThreadPool gSendThreadPool; /*! Receive thread pool. */ ThreadPool gRecvThreadPool; /*! Mini server thread pool. */ ThreadPool gMiniServerThreadPool; /*! Flag to indicate the state of web server */ WebServerState bWebServerState = WEB_SERVER_DISABLED; /*! Static buffer to contain interface name. (extern'ed in upnp.h) */ char gIF_NAME[LINE_SIZE] = { '\0' }; /*! Static buffer to contain interface IPv4 address. (extern'ed in upnp.h) */ char gIF_IPV4[22]/* INET_ADDRSTRLEN*/ = { '\0' }; /*! Static buffer to contain interface IPv6 address. (extern'ed in upnp.h) */ char gIF_IPV6[65]/* INET6_ADDRSTRLEN*/ = { '\0' }; /*! Contains interface index. (extern'ed in upnp.h) */ int gIF_INDEX = -1; /*! local IPv4 port for the mini-server */ unsigned short LOCAL_PORT_V4; /*! local IPv6 port for the mini-server */ unsigned short LOCAL_PORT_V6; /*! UPnP device and control point handle table */ void *HandleTable[NUM_HANDLE]; /*! a local dir which serves as webserver root */ extern membuffer gDocumentRootDir; /*! Maximum content-length (in bytes) that the SDK will process on an incoming * packet. Content-Length exceeding this size will be not processed and * error 413 (HTTP Error Code) will be returned to the remote end point. */ size_t g_maxContentLength = DEFAULT_SOAP_CONTENT_LENGTH; /*! Global variable to denote the state of Upnp SDK == 0 if uninitialized, * == 1 if initialized. */ int UpnpSdkInit = 0; /*! Global variable to denote the state of Upnp SDK client registration. * == 0 if unregistered, == 1 if registered. */ int UpnpSdkClientRegistered = 0; /*! Global variable to denote the state of Upnp SDK IPv4 device registration. * == 0 if unregistered, == 1 if registered. */ int UpnpSdkDeviceRegisteredV4 = 0; /*! Global variable to denote the state of Upnp SDK IPv6 device registration. * == 0 if unregistered, == 1 if registered. */ int UpnpSdkDeviceregisteredV6 = 0; /*! Global variable used in discovery notifications. */ Upnp_SID gUpnpSdkNLSuuid; /*! * \brief (Windows Only) Initializes the Windows Winsock library. * * \return UPNP_E_SUCCESS on success, UPNP_E_INIT_FAILED on failure. */ static int WinsockInit(void) { int retVal = UPNP_E_SUCCESS; #ifdef WIN32 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ retVal = UPNP_E_INIT_FAILED; goto exit_function; } /* Confirm that the WinSock DLL supports 2.2. * Note that if the DLL supports versions greater * than 2.2 in addition to 2.2, it will still return * 2.2 in wVersion since that is the version we * requested. */ if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { /* Tell the user that we could not find a usable * WinSock DLL. */ WSACleanup(); retVal = UPNP_E_INIT_FAILED; goto exit_function; } /* The WinSock DLL is acceptable. Proceed. */ exit_function: #else #endif return retVal; } /*! * \brief Initializes the global mutexes used by the UPnP SDK. * * \return UPNP_E_SUCCESS on success or UPNP_E_INIT_FAILED if a mutex could not * be initialized. */ static int UpnpInitMutexes(void) { #ifdef __CYGWIN__ /* On Cygwin, pthread_mutex_init() fails without this memset. */ /* TODO: Fix Cygwin so we don't need this memset(). */ memset(&GlobalHndRWLock, 0, sizeof(GlobalHndRWLock)); #endif if (ithread_rwlock_init(&GlobalHndRWLock, NULL) != 0) { return UPNP_E_INIT_FAILED; } if (ithread_mutex_init(&gUUIDMutex, NULL) != 0) { return UPNP_E_INIT_FAILED; } /* initialize subscribe mutex. */ #ifdef INCLUDE_CLIENT_APIS if (ithread_mutex_init(&GlobalClientSubscribeMutex, NULL) != 0) { return UPNP_E_INIT_FAILED; } #endif return UPNP_E_SUCCESS; } /*! * \brief Initializes the global threadm pools used by the UPnP SDK. * * \return UPNP_E_SUCCESS on success or UPNP_E_INIT_FAILED if a mutex could not * be initialized. */ static int UpnpInitThreadPools(void) { int ret = UPNP_E_SUCCESS; ThreadPoolAttr attr; TPAttrInit(&attr); TPAttrSetMaxThreads(&attr, MAX_THREADS); TPAttrSetMinThreads(&attr, MIN_THREADS); TPAttrSetJobsPerThread(&attr, JOBS_PER_THREAD); TPAttrSetIdleTime(&attr, THREAD_IDLE_TIME); TPAttrSetMaxJobsTotal(&attr, MAX_JOBS_TOTAL); if (ThreadPoolInit(&gSendThreadPool, &attr) != UPNP_E_SUCCESS) { ret = UPNP_E_INIT_FAILED; goto exit_function; } if (ThreadPoolInit(&gRecvThreadPool, &attr) != UPNP_E_SUCCESS) { ret = UPNP_E_INIT_FAILED; goto exit_function; } if (ThreadPoolInit(&gMiniServerThreadPool, &attr) != UPNP_E_SUCCESS) { ret = UPNP_E_INIT_FAILED; goto exit_function; } exit_function: if (ret != UPNP_E_SUCCESS) { UpnpSdkInit = 0; UpnpFinish(); } return ret; } /*! * \brief Performs the initial steps in initializing the UPnP SDK. * * \li Winsock library is initialized for the process (Windows specific). * \li The logging (for debug messages) is initialized. * \li Mutexes, Handle table and thread pools are allocated and initialized. * \li Callback functions for SOAP and GENA are set, if they're enabled. * \li The SDK timer thread is initialized. * * \return UPNP_E_SUCCESS on success. */ static int UpnpInitPreamble(void) { int retVal = UPNP_E_SUCCESS; int i; uuid_upnp nls_uuid; retVal = WinsockInit(); if (retVal != UPNP_E_SUCCESS) { return retVal; } /* needed by SSDP or other parts. */ srand((unsigned int)time(NULL)); /* Initialize debug output. */ retVal = UpnpInitLog(); if (retVal != UPNP_E_SUCCESS) { /* UpnpInitLog does not return a valid UPNP_E_*. */ return UPNP_E_INIT_FAILED; } UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "Inside UpnpInitPreamble\n" ); /* Initialize SDK global mutexes. */ retVal = UpnpInitMutexes(); if (retVal != UPNP_E_SUCCESS) { return retVal; } /* Create the NLS uuid. */ uuid_create(&nls_uuid); uuid_unpack(&nls_uuid, gUpnpSdkNLSuuid); /* Initializes the handle list. */ HandleLock(); for (i = 0; i < NUM_HANDLE; ++i) { HandleTable[i] = NULL; } HandleUnlock(); /* Initialize SDK global thread pools. */ retVal = UpnpInitThreadPools(); if (retVal != UPNP_E_SUCCESS) { return retVal; } #if EXCLUDE_SOAP == 0 SetSoapCallback(soap_device_callback); #endif #if EXCLUDE_GENA == 0 SetGenaCallback(genaCallback); #endif /* Initialize the SDK timer thread. */ retVal = TimerThreadInit( &gTimerThread, &gSendThreadPool ); if (retVal != UPNP_E_SUCCESS) { UpnpFinish(); return retVal; } return UPNP_E_SUCCESS; } /*! * \brief Finishes initializing the UPnP SDK. * \li The MiniServer is started, if enabled. * \li The WebServer is started, if enabled. * * \return UPNP_E_SUCCESS on success or UPNP_E_INIT_FAILED if a mutex could not * be initialized. */ static int UpnpInitStartServers( /*! [in] Local Port to listen for incoming connections. */ unsigned short DestPort) { int retVal = 0; UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "Entering UpnpInitStartServers\n" ); #if EXCLUDE_MINISERVER == 0 LOCAL_PORT_V4 = DestPort; LOCAL_PORT_V6 = DestPort; retVal = StartMiniServer(&LOCAL_PORT_V4, &LOCAL_PORT_V6); if (retVal != UPNP_E_SUCCESS) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "Miniserver failed to start"); UpnpFinish(); return retVal; } #endif #if EXCLUDE_WEB_SERVER == 0 membuffer_init(&gDocumentRootDir); retVal = UpnpEnableWebserver(WEB_SERVER_ENABLED); if (retVal != UPNP_E_SUCCESS) { UpnpFinish(); return retVal; } #endif UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Exiting UpnpInitStartServers\n"); return UPNP_E_SUCCESS; } int UpnpInit(const char *HostIP, unsigned short DestPort) { int retVal = UPNP_E_SUCCESS; /* Initializes the ithread library */ ithread_initialize_library(); ithread_mutex_lock(&gSDKInitMutex); /* Check if we're already initialized. */ if (UpnpSdkInit == 1) { retVal = UPNP_E_INIT; goto exit_function; } /* Perform initialization preamble. */ retVal = UpnpInitPreamble(); if (retVal != UPNP_E_SUCCESS) { goto exit_function; } UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "UpnpInit with HostIP=%s, DestPort=%d.\n", HostIP ? HostIP : "", DestPort); /* Verify HostIP, if provided, or find it ourselves. */ if (HostIP != NULL) { strncpy(gIF_IPV4, HostIP, sizeof(gIF_IPV4)); } else { if( getlocalhostname( gIF_IPV4, sizeof(gIF_IPV4) ) != UPNP_E_SUCCESS ) { retVal = UPNP_E_INIT_FAILED; goto exit_function; } } /* Set the UpnpSdkInit flag to 1 to indicate we're sucessfully initialized. */ UpnpSdkInit = 1; /* Finish initializing the SDK. */ retVal = UpnpInitStartServers(DestPort); if (retVal != UPNP_E_SUCCESS) { UpnpSdkInit = 0; goto exit_function; } UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Host Ip: %s Host Port: %d\n", gIF_IPV4, LOCAL_PORT_V4); exit_function: ithread_mutex_unlock(&gSDKInitMutex); return retVal; } int UpnpInit2(const char *IfName, unsigned short DestPort) { int retVal; /* Initializes the ithread library */ ithread_initialize_library(); ithread_mutex_lock(&gSDKInitMutex); /* Check if we're already initialized. */ if (UpnpSdkInit == 1) { retVal = UPNP_E_INIT; goto exit_function; } /* Perform initialization preamble. */ retVal = UpnpInitPreamble(); if (retVal != UPNP_E_SUCCESS) { goto exit_function; } UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "UpnpInit2 with IfName=%s, DestPort=%d.\n", IfName ? IfName : "", DestPort); /* Retrieve interface information (Addresses, index, etc). */ retVal = UpnpGetIfInfo( IfName ); if (retVal != UPNP_E_SUCCESS) { goto exit_function; } /* Set the UpnpSdkInit flag to 1 to indicate we're sucessfully initialized. */ UpnpSdkInit = 1; /* Finish initializing the SDK. */ retVal = UpnpInitStartServers(DestPort); if (retVal != UPNP_E_SUCCESS) { UpnpSdkInit = 0; goto exit_function; } exit_function: ithread_mutex_unlock(&gSDKInitMutex); return UPNP_E_SUCCESS; } int UpnpFinish(void) { #ifdef INCLUDE_DEVICE_APIS UpnpDevice_Handle device_handle; #endif #ifdef INCLUDE_CLIENT_APIS UpnpClient_Handle client_handle; #endif struct Handle_Info *temp; if (UpnpSdkInit != 1) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Inside UpnpFinish: UpnpSdkInit is %d\n", UpnpSdkInit); if (UpnpSdkInit == 1) { UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "UpnpFinish: UpnpSdkInit is ONE\n"); } PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool"); PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool"); PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool"); #ifdef INCLUDE_DEVICE_APIS if (GetDeviceHandleInfo(AF_INET, &device_handle, &temp) == HND_DEVICE ) { UpnpUnRegisterRootDevice(device_handle); } if (GetDeviceHandleInfo(AF_INET6, &device_handle, &temp) == HND_DEVICE ) { UpnpUnRegisterRootDevice(device_handle); } #endif #ifdef INCLUDE_CLIENT_APIS if (GetClientHandleInfo(&client_handle, &temp) == HND_CLIENT) { UpnpUnRegisterClient(client_handle); } #endif TimerThreadShutdown(&gTimerThread); StopMiniServer(); #if EXCLUDE_WEB_SERVER == 0 web_server_destroy(); #endif ThreadPoolShutdown(&gMiniServerThreadPool); PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool"); ThreadPoolShutdown(&gRecvThreadPool); PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool"); ThreadPoolShutdown(&gSendThreadPool); PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool"); #ifdef INCLUDE_CLIENT_APIS ithread_mutex_destroy(&GlobalClientSubscribeMutex); #endif ithread_rwlock_destroy(&GlobalHndRWLock); ithread_mutex_destroy(&gUUIDMutex); /* remove all virtual dirs */ UpnpRemoveAllVirtualDirs(); /* Clean-up ithread library resources */ ithread_cleanup_library(); UpnpSdkInit = 0; UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "Exiting UpnpFinish: UpnpSdkInit is :%d:\n", UpnpSdkInit); UpnpCloseLog(); return UPNP_E_SUCCESS; } unsigned short UpnpGetServerPort(void) { if (UpnpSdkInit != 1) { return 0; } return LOCAL_PORT_V4; } unsigned short UpnpGetServerPort6(void) { if (UpnpSdkInit != 1) { return 0; } return LOCAL_PORT_V6; } char *UpnpGetServerIpAddress(void) { if (UpnpSdkInit != 1) { return NULL; } return gIF_IPV4; } char *UpnpGetServerIp6Address(void) { if( UpnpSdkInit != 1 ) { return NULL; } return gIF_IPV6; } #ifdef INCLUDE_DEVICE_APIS int UpnpRegisterRootDevice( const char *DescUrl, Upnp_FunPtr Fun, const void *Cookie, UpnpDevice_Handle *Hnd) { struct Handle_Info *HInfo = NULL; int retVal = 0; int hasServiceTable = 0; HandleLock(); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpRegisterRootDevice\n"); if (UpnpSdkInit != 1) { retVal = UPNP_E_FINISH; goto exit_function; } if (Hnd == NULL || Fun == NULL || DescUrl == NULL || strlen(DescUrl) == 0) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } if (UpnpSdkDeviceRegisteredV4 == 1) { retVal = UPNP_E_ALREADY_REGISTERED; goto exit_function; } *Hnd = GetFreeHandle(); if (*Hnd == UPNP_E_OUTOF_HANDLE) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } HInfo = (struct Handle_Info *)malloc(sizeof (struct Handle_Info)); if (HInfo == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } HandleTable[*Hnd] = HInfo; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Root device URL is %s\n", DescUrl ); HInfo->aliasInstalled = 0; HInfo->HType = HND_DEVICE; strcpy(HInfo->DescURL, DescUrl); HInfo->Callback = Fun; HInfo->Cookie = (void *)Cookie; HInfo->MaxAge = DEFAULT_MAXAGE; HInfo->DeviceList = NULL; HInfo->ServiceList = NULL; HInfo->DescDocument = NULL; CLIENTONLY( ListInit(&HInfo->SsdpSearchList, NULL, NULL); ) CLIENTONLY( HInfo->ClientSubList = NULL; ) HInfo->MaxSubscriptions = UPNP_INFINITE; HInfo->MaxSubscriptionTimeOut = UPNP_INFINITE; HInfo->DeviceAf = AF_INET; retVal = UpnpDownloadXmlDoc(HInfo->DescURL, &(HInfo->DescDocument)); if (retVal != UPNP_E_SUCCESS) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice: error downloading Document: %d\n", retVal); CLIENTONLY( ListDestroy(&HInfo->SsdpSearchList, 0); ) FreeHandle(*Hnd); goto exit_function; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice: Valid Description\n" "UpnpRegisterRootDevice: DescURL : %s\n", HInfo->DescURL); HInfo->DeviceList = ixmlDocument_getElementsByTagName(HInfo->DescDocument, "device"); if (!HInfo->DeviceList) { CLIENTONLY( ListDestroy(&HInfo->SsdpSearchList, 0); ) ixmlDocument_free(HInfo->DescDocument); FreeHandle(*Hnd); UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice: No devices found for RootDevice\n"); retVal = UPNP_E_INVALID_DESC; goto exit_function; } HInfo->ServiceList = ixmlDocument_getElementsByTagName( HInfo->DescDocument, "serviceList"); if (!HInfo->ServiceList) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice: No services found for RootDevice\n"); } /* * GENA SET UP */ UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice: Gena Check\n"); hasServiceTable = getServiceTable( (IXML_Node *)HInfo->DescDocument, &HInfo->ServiceTable, HInfo->DescURL); if (hasServiceTable) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice: GENA Service Table\n" "Here are the known services:\n"); printServiceTable( &HInfo->ServiceTable, UPNP_ALL, API ); } else { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "\nUpnpRegisterRootDevice: Empty service table\n"); } UpnpSdkDeviceRegisteredV4 = 1; retVal = UPNP_E_SUCCESS; exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting RegisterRootDevice, return value == %d\n", retVal); HandleUnlock(); return retVal; } #endif /* INCLUDE_DEVICE_APIS */ /*! * \brief Fills the sockadr_in with miniserver information. */ static int GetDescDocumentAndURL( /* [in] pointer to server address structure. */ Upnp_DescType descriptionType, /* [in] . */ char *description, /* [in] . */ unsigned int bufferLen, /* [in] . */ int config_baseURL, /* [in] . */ int AddressFamily, /* [out] . */ IXML_Document **xmlDoc, /* [out] . */ char *descURL); #ifdef INCLUDE_DEVICE_APIS int UpnpRegisterRootDevice2( Upnp_DescType descriptionType, const char *description_const, size_t bufferLen, // ignored unless descType == UPNPREG_BUF_DESC int config_baseURL, Upnp_FunPtr Fun, const void *Cookie, UpnpDevice_Handle *Hnd) { struct Handle_Info *HInfo = NULL; int retVal = 0; int hasServiceTable = 0; char *description = (char *)description_const; HandleLock(); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpRegisterRootDevice2\n"); if (UpnpSdkInit != 1) { retVal = UPNP_E_FINISH; goto exit_function; } if (Hnd == NULL || Fun == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } if (UpnpSdkDeviceRegisteredV4 == 1) { retVal = UPNP_E_ALREADY_REGISTERED; goto exit_function; } *Hnd = GetFreeHandle(); if (*Hnd == UPNP_E_OUTOF_HANDLE) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } HInfo = (struct Handle_Info *)malloc(sizeof (struct Handle_Info)); if (HInfo == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } HandleTable[*Hnd] = HInfo; // prevent accidental removal of a non-existent alias HInfo->aliasInstalled = 0; retVal = GetDescDocumentAndURL( descriptionType, description, bufferLen, config_baseURL, AF_INET, &HInfo->DescDocument, HInfo->DescURL); if (retVal != UPNP_E_SUCCESS) { FreeHandle(*Hnd); goto exit_function; } HInfo->aliasInstalled = config_baseURL != 0; HInfo->HType = HND_DEVICE; HInfo->Callback = Fun; HInfo->Cookie = (void *)Cookie; HInfo->MaxAge = DEFAULT_MAXAGE; HInfo->DeviceList = NULL; HInfo->ServiceList = NULL; CLIENTONLY( ListInit(&HInfo->SsdpSearchList, NULL, NULL); ) CLIENTONLY( HInfo->ClientSubList = NULL; ) HInfo->MaxSubscriptions = UPNP_INFINITE; HInfo->MaxSubscriptionTimeOut = UPNP_INFINITE; HInfo->DeviceAf = AF_INET; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice2: Valid Description\n" "UpnpRegisterRootDevice2: DescURL : %s\n", HInfo->DescURL); HInfo->DeviceList = ixmlDocument_getElementsByTagName( HInfo->DescDocument, "device" ); if (!HInfo->DeviceList) { CLIENTONLY( ListDestroy(&HInfo->SsdpSearchList, 0); ) ixmlDocument_free(HInfo->DescDocument); FreeHandle(*Hnd); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice2: No devices found for RootDevice\n" ); retVal = UPNP_E_INVALID_DESC; goto exit_function; } HInfo->ServiceList = ixmlDocument_getElementsByTagName( HInfo->DescDocument, "serviceList" ); if (!HInfo->ServiceList) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice2: No services found for RootDevice\n"); } /* * GENA SET UP */ UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice2: Gena Check\n" ); hasServiceTable = getServiceTable( (IXML_Node *)HInfo->DescDocument, &HInfo->ServiceTable, HInfo->DescURL); if (hasServiceTable) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice2: GENA Service Table\n" "Here are the known services: \n"); printServiceTable(&HInfo->ServiceTable, UPNP_ALL, API); } else { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "\nUpnpRegisterRootDevice2: Empty service table\n"); } UpnpSdkDeviceRegisteredV4 = 1; retVal = UPNP_E_SUCCESS; exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting RegisterRootDevice2, return value == %d\n", retVal); HandleUnlock(); return retVal; } #endif /* INCLUDE_DEVICE_APIS */ #ifdef INCLUDE_DEVICE_APIS int UpnpRegisterRootDevice3( const char *DescUrl, Upnp_FunPtr Fun, const void *Cookie, UpnpDevice_Handle *Hnd, const int AddressFamily) { struct Handle_Info *HInfo; int retVal = 0; int hasServiceTable = 0; HandleLock(); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpRegisterRootDevice3\n"); if (UpnpSdkInit != 1) { retVal = UPNP_E_FINISH; goto exit_function; } if (Hnd == NULL || Fun == NULL || DescUrl == NULL || strlen(DescUrl) == 0 || (AddressFamily != AF_INET && AddressFamily != AF_INET6)) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } if ((AddressFamily == AF_INET && UpnpSdkDeviceRegisteredV4 == 1) || (AddressFamily == AF_INET6 && UpnpSdkDeviceregisteredV6 == 1)) { retVal = UPNP_E_ALREADY_REGISTERED; goto exit_function; } *Hnd = GetFreeHandle(); if (*Hnd == UPNP_E_OUTOF_HANDLE) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } HInfo = (struct Handle_Info *)malloc(sizeof (struct Handle_Info)); if (HInfo == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } HandleTable[*Hnd] = HInfo; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Root device URL is %s\n", DescUrl); HInfo->aliasInstalled = 0; HInfo->HType = HND_DEVICE; strcpy(HInfo->DescURL, DescUrl); HInfo->Callback = Fun; HInfo->Cookie = (void *)Cookie; HInfo->MaxAge = DEFAULT_MAXAGE; HInfo->DeviceList = NULL; HInfo->ServiceList = NULL; HInfo->DescDocument = NULL; CLIENTONLY( ListInit(&HInfo->SsdpSearchList, NULL, NULL); ) CLIENTONLY( HInfo->ClientSubList = NULL; ) HInfo->MaxSubscriptions = UPNP_INFINITE; HInfo->MaxSubscriptionTimeOut = UPNP_INFINITE; HInfo->DeviceAf = AddressFamily; retVal = UpnpDownloadXmlDoc(HInfo->DescURL, &(HInfo->DescDocument)); if (retVal != UPNP_E_SUCCESS) { CLIENTONLY( ListDestroy(&HInfo->SsdpSearchList, 0); ) FreeHandle(*Hnd); goto exit_function; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice3: Valid Description\n" "UpnpRegisterRootDevice3: DescURL : %s\n", HInfo->DescURL); HInfo->DeviceList = ixmlDocument_getElementsByTagName( HInfo->DescDocument, "device"); if (!HInfo->DeviceList) { CLIENTONLY( ListDestroy(&HInfo->SsdpSearchList, 0); ) ixmlDocument_free(HInfo->DescDocument); FreeHandle(*Hnd); UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice3: No devices found for RootDevice\n"); retVal = UPNP_E_INVALID_DESC; goto exit_function; } HInfo->ServiceList = ixmlDocument_getElementsByTagName( HInfo->DescDocument, "serviceList" ); if (!HInfo->ServiceList) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice3: No services found for RootDevice\n"); } /* * GENA SET UP */ UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice3: Gena Check\n" ); hasServiceTable = getServiceTable( (IXML_Node *)HInfo->DescDocument, &HInfo->ServiceTable, HInfo->DescURL); if (hasServiceTable) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "UpnpRegisterRootDevice3: GENA Service Table \n" "Here are the known services: \n" ); printServiceTable(&HInfo->ServiceTable, UPNP_ALL, API); } else { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "\nUpnpRegisterRootDevice3: Empty service table\n"); } if (AddressFamily == AF_INET) { UpnpSdkDeviceRegisteredV4 = 1; } else { UpnpSdkDeviceregisteredV6 = 1; } retVal = UPNP_E_SUCCESS; exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting RegisterRootDevice3, return value == %d\n", retVal); HandleUnlock(); return retVal; } #endif /* INCLUDE_DEVICE_APIS */ #ifdef INCLUDE_DEVICE_APIS int UpnpUnRegisterRootDevice(UpnpDevice_Handle Hnd) { int retVal = 0; struct Handle_Info *HInfo = NULL; if (UpnpSdkInit != 1) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Inside UpnpUnRegisterRootDevice\n"); #if EXCLUDE_GENA == 0 if( genaUnregisterDevice( Hnd ) != UPNP_E_SUCCESS ) return UPNP_E_INVALID_HANDLE; #endif HandleLock(); if( GetHandleInfo( Hnd, &HInfo ) == UPNP_E_INVALID_HANDLE ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); #if EXCLUDE_SSDP == 0 retVal = AdvertiseAndReply(-1, Hnd, 0, (struct sockaddr *)NULL, (char *)NULL, (char *)NULL, (char *)NULL, HInfo->MaxAge); #endif HandleLock(); if( GetHandleInfo( Hnd, &HInfo ) == UPNP_E_INVALID_HANDLE ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } //info = (struct Handle_Info *) HandleTable[Hnd]; ixmlNodeList_free( HInfo->DeviceList ); ixmlNodeList_free( HInfo->ServiceList ); ixmlDocument_free( HInfo->DescDocument ); CLIENTONLY( ListDestroy( &HInfo->SsdpSearchList, 0 ); ) #ifdef INTERNAL_WEB_SERVER if( HInfo->aliasInstalled ) { web_server_set_alias( NULL, NULL, 0, 0 ); } #endif // INTERNAL_WEB_SERVER if( HInfo->DeviceAf == AF_INET ) { UpnpSdkDeviceRegisteredV4 = 0; } else if( HInfo->DeviceAf == AF_INET6 ) { UpnpSdkDeviceregisteredV6 = 0; } FreeHandle(Hnd); HandleUnlock(); UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "Exiting UpnpUnRegisterRootDevice\n" ); return retVal; } #endif /* INCLUDE_DEVICE_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpRegisterClient( Upnp_FunPtr Fun, const void *Cookie, UpnpClient_Handle *Hnd) { struct Handle_Info *HInfo; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpRegisterClient \n" ); if( Fun == NULL || Hnd == NULL ) { return UPNP_E_INVALID_PARAM; } HandleLock(); if( UpnpSdkClientRegistered ) { HandleUnlock(); return UPNP_E_ALREADY_REGISTERED; } if( ( *Hnd = GetFreeHandle() ) == UPNP_E_OUTOF_HANDLE ) { HandleUnlock(); return UPNP_E_OUTOF_MEMORY; } HInfo = ( struct Handle_Info * )malloc( sizeof( struct Handle_Info ) ); if( HInfo == NULL ) { HandleUnlock(); return UPNP_E_OUTOF_MEMORY; } HInfo->HType = HND_CLIENT; HInfo->Callback = Fun; HInfo->Cookie = ( void * )Cookie; HInfo->ClientSubList = NULL; ListInit( &HInfo->SsdpSearchList, NULL, NULL ); #ifdef INCLUDE_DEVICE_APIS HInfo->MaxAge = 0; HInfo->MaxSubscriptions = UPNP_INFINITE; HInfo->MaxSubscriptionTimeOut = UPNP_INFINITE; #endif HandleTable[*Hnd] = HInfo; UpnpSdkClientRegistered = 1; HandleUnlock(); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpRegisterClient \n" ); return UPNP_E_SUCCESS; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpUnRegisterClient(UpnpClient_Handle Hnd) { struct Handle_Info *HInfo; ListNode *node = NULL; SsdpSearchArg *searchArg = NULL; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpUnRegisterClient \n" ); HandleLock(); if( !UpnpSdkClientRegistered ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); #if EXCLUDE_GENA == 0 if( genaUnregisterClient( Hnd ) != UPNP_E_SUCCESS ) return UPNP_E_INVALID_HANDLE; #endif HandleLock(); if( GetHandleInfo( Hnd, &HInfo ) == UPNP_E_INVALID_HANDLE ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } /* clean up search list */ node = ListHead( &HInfo->SsdpSearchList ); while( node != NULL ) { searchArg = ( SsdpSearchArg * ) node->item; if( searchArg ) { free( searchArg->searchTarget ); free( searchArg ); } ListDelNode( &HInfo->SsdpSearchList, node, 0 ); node = ListHead( &HInfo->SsdpSearchList ); } ListDestroy( &HInfo->SsdpSearchList, 0 ); FreeHandle(Hnd); UpnpSdkClientRegistered = 0; HandleUnlock(); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpUnRegisterClient \n" ); return UPNP_E_SUCCESS; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_DEVICE_APIS #ifdef INTERNAL_WEB_SERVER /*! * \brief Determines alias for given name which is a file name or URL. * * \return UPNP_E_SUCCESS on success, nonzero on failure. */ static int GetNameForAlias( /*! [in] Name of the file. */ char *name, /*! [out] Pointer to alias string. */ char **alias) { char *ext; char *al; ext = strrchr( name, '.' ); if( ext == NULL || strcasecmp( ext, ".xml" ) != 0 ) { return UPNP_E_EXT_NOT_XML; } al = strrchr( name, '/' ); if( al == NULL ) { *alias = name; } else { *alias = al; } return UPNP_E_SUCCESS; } /*! * \brief Fill the sockadr with IPv4 miniserver information. */ static void get_server_addr( /*! [out] pointer to server address structure. */ struct sockaddr *serverAddr) { struct sockaddr_in* sa4 = (struct sockaddr_in*)serverAddr; memset( serverAddr, 0, sizeof(struct sockaddr_storage) ); sa4->sin_family = AF_INET; inet_pton( AF_INET, gIF_IPV4, &sa4->sin_addr ); sa4->sin_port = htons( LOCAL_PORT_V4 ); } /*! * \brief Fill the sockadr with IPv6 miniserver information. */ static void get_server_addr6( /*! [out] pointer to server address structure. */ struct sockaddr *serverAddr) { struct sockaddr_in6* sa6 = (struct sockaddr_in6*)serverAddr; memset( serverAddr, 0, sizeof(struct sockaddr_storage) ); sa6->sin6_family = AF_INET6; inet_pton(AF_INET6, gIF_IPV6, &sa6->sin6_addr ); sa6->sin6_port = htons( LOCAL_PORT_V6 ); } static int GetDescDocumentAndURL( Upnp_DescType descriptionType, char *description, unsigned int bufferLen, int config_baseURL, int AddressFamily, IXML_Document **xmlDoc, char *descURL) { int retVal = 0; char *membuf = NULL; char aliasStr[LINE_SIZE]; char *temp_str = NULL; FILE *fp = NULL; off_t fileLen; size_t num_read; time_t last_modified; struct stat file_info; struct sockaddr_storage serverAddr; int rc = UPNP_E_SUCCESS; if (description == NULL) { return UPNP_E_INVALID_PARAM; } /* non-URL description must have configuration specified */ if (descriptionType != UPNPREG_URL_DESC && !config_baseURL) { return UPNP_E_INVALID_PARAM; } /* Get XML doc and last modified time */ if (descriptionType == UPNPREG_URL_DESC) { retVal = UpnpDownloadXmlDoc(description, xmlDoc); if (retVal != UPNP_E_SUCCESS) { return retVal; } last_modified = time(NULL); } else if (descriptionType == UPNPREG_FILENAME_DESC) { retVal = stat( description, &file_info ); if (retVal == -1) { return UPNP_E_FILE_NOT_FOUND; } fileLen = file_info.st_size; last_modified = file_info.st_mtime; fp = fopen(description, "rb"); if (fp == NULL) { return UPNP_E_FILE_NOT_FOUND; } membuf = (char *)malloc(fileLen + 1); if (membuf == NULL) { fclose(fp); return UPNP_E_OUTOF_MEMORY; } num_read = fread(membuf, 1, fileLen, fp); if (num_read != fileLen) { fclose(fp); free(membuf); return UPNP_E_FILE_READ_ERROR; } membuf[fileLen] = 0; fclose(fp); rc = ixmlParseBufferEx(membuf, xmlDoc); free(membuf); } else if (descriptionType == UPNPREG_BUF_DESC) { last_modified = time(NULL); rc = ixmlParseBufferEx(description, xmlDoc); } else { return UPNP_E_INVALID_PARAM; } if (rc != IXML_SUCCESS && descriptionType != UPNPREG_URL_DESC) { if (rc == IXML_INSUFFICIENT_MEMORY) { return UPNP_E_OUTOF_MEMORY; } else { return UPNP_E_INVALID_DESC; } } /* Determine alias */ if (config_baseURL) { if (descriptionType == UPNPREG_BUF_DESC) { strcpy( aliasStr, "description.xml" ); } else { /* URL or filename */ retVal = GetNameForAlias(description, &temp_str); if (retVal != UPNP_E_SUCCESS) { ixmlDocument_free(*xmlDoc); return retVal; } if (strlen(temp_str) > (LINE_SIZE - 1)) { ixmlDocument_free(*xmlDoc); free(temp_str); return UPNP_E_URL_TOO_BIG; } strcpy(aliasStr, temp_str); } if(AddressFamily == AF_INET) { get_server_addr((struct sockaddr *)&serverAddr); } else { get_server_addr6((struct sockaddr *)&serverAddr); } /* config */ retVal = configure_urlbase(*xmlDoc, (struct sockaddr *)&serverAddr, aliasStr, last_modified, descURL); if (retVal != UPNP_E_SUCCESS) { ixmlDocument_free(*xmlDoc); return retVal; } } else { /* Manual */ if (strlen(description) > (LINE_SIZE - 1)) { ixmlDocument_free(*xmlDoc); return UPNP_E_URL_TOO_BIG; } strcpy(descURL, description); } assert(*xmlDoc != NULL); return UPNP_E_SUCCESS; } #else /* INTERNAL_WEB_SERVER */ /* no web server */ static int GetDescDocumentAndURL( Upnp_DescType descriptionType, char *description, unsigned int bufferLen, int config_baseURL, int AddressFamily, IXML_Document **xmlDoc, char *descURL) { int retVal = 0; if (descriptionType != UPNPREG_URL_DESC || config_baseURL) { return UPNP_E_NO_WEB_SERVER; } if (description == NULL) { return UPNP_E_INVALID_PARAM; } if (strlen(description) > (LINE_SIZE - 1)) { return UPNP_E_URL_TOO_BIG; } strcpy(descURL, description); retVal = UpnpDownloadXmlDoc(description, xmlDoc); if (retVal != UPNP_E_SUCCESS) { return retVal; } return UPNP_E_SUCCESS; } #endif /* INTERNAL_WEB_SERVER */ #endif /* INCLUDE_DEVICE_APIS */ /******************************************************************************* * * SSDP interface * ******************************************************************************/ #ifdef INCLUDE_DEVICE_APIS #if EXCLUDE_SSDP == 0 int UpnpSendAdvertisement(UpnpDevice_Handle Hnd, int Exp) { struct Handle_Info *SInfo = NULL; int retVal = 0, *ptrMx; upnp_timeout *adEvent; ThreadPoolJob job; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSendAdvertisement \n" ); HandleLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } if( Exp < 1 ) Exp = DEFAULT_MAXAGE; SInfo->MaxAge = Exp; HandleUnlock(); retVal = AdvertiseAndReply( 1, Hnd, 0, ( struct sockaddr * )NULL, ( char * )NULL, ( char * )NULL, ( char * )NULL, Exp ); if( retVal != UPNP_E_SUCCESS ) return retVal; ptrMx = ( int * )malloc( sizeof( int ) ); if( ptrMx == NULL ) return UPNP_E_OUTOF_MEMORY; adEvent = ( upnp_timeout * ) malloc( sizeof( upnp_timeout ) ); if( adEvent == NULL ) { free( ptrMx ); return UPNP_E_OUTOF_MEMORY; } *ptrMx = Exp; adEvent->handle = Hnd; adEvent->Event = ptrMx; HandleLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { HandleUnlock(); free( adEvent ); free( ptrMx ); return UPNP_E_INVALID_HANDLE; } #ifdef SSDP_PACKET_DISTRIBUTE TPJobInit( &job, ( start_routine ) AutoAdvertise, adEvent ); TPJobSetFreeFunction( &job, ( free_routine ) free_upnp_timeout ); TPJobSetPriority( &job, MED_PRIORITY ); if( ( retVal = TimerThreadSchedule( &gTimerThread, ( ( Exp / 2 ) - ( AUTO_ADVERTISEMENT_TIME ) ), REL_SEC, &job, SHORT_TERM, &( adEvent->eventId ) ) ) != UPNP_E_SUCCESS ) { HandleUnlock(); free( adEvent ); free( ptrMx ); return retVal; } #else TPJobInit( &job, ( start_routine ) AutoAdvertise, adEvent ); TPJobSetFreeFunction( &job, ( free_routine ) free_upnp_timeout ); TPJobSetPriority( &job, MED_PRIORITY ); if( ( retVal = TimerThreadSchedule( &gTimerThread, Exp - AUTO_ADVERTISEMENT_TIME, REL_SEC, &job, SHORT_TERM, &( adEvent->eventId ) ) ) != UPNP_E_SUCCESS ) { HandleUnlock(); free( adEvent ); free( ptrMx ); return retVal; } #endif HandleUnlock(); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSendAdvertisement \n" ); return retVal; } #endif /* EXCLUDE_SSDP == 0 */ #endif /* INCLUDE_DEVICE_APIS */ #if EXCLUDE_SSDP == 0 #ifdef INCLUDE_CLIENT_APIS int UpnpSearchAsync( UpnpClient_Handle Hnd, int Mx, const char *Target_const, const void *Cookie_const ) { struct Handle_Info *SInfo = NULL; char *Target = ( char * )Target_const; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSearchAsync\n" ); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } if( Mx < 1 ) Mx = DEFAULT_MX; if( Target == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } HandleUnlock(); SearchByTarget( Mx, Target, ( void * )Cookie_const ); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSearchAsync \n" ); return UPNP_E_SUCCESS; } #endif /* INCLUDE_CLIENT_APIS */ #endif /******************************************************************************* * * GENA interface * ******************************************************************************/ #if EXCLUDE_GENA == 0 #ifdef INCLUDE_DEVICE_APIS int UpnpSetMaxSubscriptions(UpnpDevice_Handle Hnd, int MaxSubscriptions) { struct Handle_Info *SInfo = NULL; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSetMaxSubscriptions \n" ); HandleLock(); if( ( ( MaxSubscriptions != UPNP_INFINITE ) && ( MaxSubscriptions < 0 ) ) || ( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } SInfo->MaxSubscriptions = MaxSubscriptions; HandleUnlock(); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSetMaxSubscriptions \n" ); return UPNP_E_SUCCESS; } #endif /* INCLUDE_DEVICE_APIS */ #ifdef INCLUDE_DEVICE_APIS int UpnpSetMaxSubscriptionTimeOut(UpnpDevice_Handle Hnd, int MaxSubscriptionTimeOut) { struct Handle_Info *SInfo = NULL; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSetMaxSubscriptionTimeOut\n" ); HandleLock(); if( ( ( MaxSubscriptionTimeOut != UPNP_INFINITE ) && ( MaxSubscriptionTimeOut < 0 ) ) || ( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } SInfo->MaxSubscriptionTimeOut = MaxSubscriptionTimeOut; HandleUnlock(); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSetMaxSubscriptionTimeOut\n"); return UPNP_E_SUCCESS; } #endif /* INCLUDE_DEVICE_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpSubscribeAsync( UpnpClient_Handle Hnd, const char *EvtUrl_const, int TimeOut, Upnp_FunPtr Fun, const void *Cookie_const) { struct Handle_Info *SInfo = NULL; struct UpnpNonblockParam *Param; char *EvtUrl = ( char * )EvtUrl_const; ThreadPoolJob job; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSubscribeAsync\n"); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } if( EvtUrl == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } if( TimeOut != UPNP_INFINITE && TimeOut < 1 ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } if( Fun == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } HandleUnlock(); Param = (struct UpnpNonblockParam *) malloc(sizeof (struct UpnpNonblockParam)); if( Param == NULL ) { return UPNP_E_OUTOF_MEMORY; } Param->FunName = SUBSCRIBE; Param->Handle = Hnd; strcpy( Param->Url, EvtUrl ); Param->TimeOut = TimeOut; Param->Fun = Fun; Param->Cookie = (void *)Cookie_const; TPJobInit(&job, (start_routine)UpnpThreadDistribution, Param); TPJobSetFreeFunction(&job, (free_routine)free); TPJobSetPriority(&job, MED_PRIORITY); ThreadPoolAdd(&gSendThreadPool, &job, NULL); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSubscribeAsync\n"); return UPNP_E_SUCCESS; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpSubscribe( UpnpClient_Handle Hnd, const char *EvtUrl_const, int *TimeOut, Upnp_SID SubsId) { int retVal; struct Handle_Info *SInfo = NULL; UpnpString *EvtUrl = UpnpString_new(); UpnpString *SubsIdTmp = UpnpString_new(); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSubscribe\n"); if (UpnpSdkInit != 1) { retVal = UPNP_E_FINISH; goto exit_function; } if (EvtUrl == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } if (EvtUrl_const == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } UpnpString_set_String(EvtUrl, EvtUrl_const); if (SubsIdTmp == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } if (SubsId == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } UpnpString_set_String(SubsIdTmp, SubsId); if (TimeOut == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } HandleReadLock(); if (GetHandleInfo(Hnd, &SInfo) != HND_CLIENT) { HandleUnlock(); retVal = UPNP_E_INVALID_HANDLE; goto exit_function; } HandleUnlock(); retVal = genaSubscribe(Hnd, EvtUrl, TimeOut, SubsIdTmp); strcpy(SubsId, UpnpString_get_String(SubsIdTmp)); exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSubscribe, retVal=%d\n", retVal); UpnpString_delete(SubsIdTmp); UpnpString_delete(EvtUrl); return retVal; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpUnSubscribe(UpnpClient_Handle Hnd, const Upnp_SID SubsId) { struct Handle_Info *SInfo = NULL; int retVal; UpnpString *SubsIdTmp = UpnpString_new(); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpUnSubscribe\n"); if (UpnpSdkInit != 1) { retVal = UPNP_E_FINISH; goto exit_function; } if (SubsIdTmp == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } if (SubsId == NULL) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } UpnpString_set_String(SubsIdTmp, SubsId); HandleReadLock(); if (GetHandleInfo(Hnd, &SInfo) != HND_CLIENT) { HandleUnlock(); retVal = UPNP_E_INVALID_HANDLE; goto exit_function; } HandleUnlock(); retVal = genaUnSubscribe(Hnd, SubsIdTmp); exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpUnSubscribe, retVal=%d\n", retVal); UpnpString_delete(SubsIdTmp); return retVal; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpUnSubscribeAsync( UpnpClient_Handle Hnd, Upnp_SID SubsId, Upnp_FunPtr Fun, const void *Cookie_const) { int retVal; ThreadPoolJob job; struct Handle_Info *SInfo = NULL; struct UpnpNonblockParam *Param; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpUnSubscribeAsync\n"); if (UpnpSdkInit != 1) { retVal = UPNP_E_FINISH; goto exit_function; } if (SubsId == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } if (Fun == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } HandleReadLock(); if (GetHandleInfo(Hnd, &SInfo) != HND_CLIENT) { HandleUnlock(); retVal = UPNP_E_INVALID_HANDLE; goto exit_function; } HandleUnlock(); Param = (struct UpnpNonblockParam *)malloc(sizeof(struct UpnpNonblockParam)); if (Param == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } Param->FunName = UNSUBSCRIBE; Param->Handle = Hnd; strcpy( Param->SubsId, SubsId ); Param->Fun = Fun; Param->Cookie = (void *)Cookie_const; TPJobInit( &job, ( start_routine ) UpnpThreadDistribution, Param ); TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetPriority( &job, MED_PRIORITY ); ThreadPoolAdd( &gSendThreadPool, &job, NULL ); exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpUnSubscribeAsync\n"); return UPNP_E_SUCCESS; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpRenewSubscription( UpnpClient_Handle Hnd, int *TimeOut, const Upnp_SID SubsId) { struct Handle_Info *SInfo = NULL; int retVal; UpnpString *SubsIdTmp = UpnpString_new(); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpRenewSubscription\n"); if (UpnpSdkInit != 1) { return UPNP_E_FINISH; } if (SubsIdTmp == NULL) { retVal = UPNP_E_OUTOF_MEMORY; goto exit_function; } if (SubsId == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } UpnpString_set_String(SubsIdTmp, SubsId); if (TimeOut == NULL) { retVal = UPNP_E_INVALID_PARAM; goto exit_function; } HandleReadLock(); if (GetHandleInfo(Hnd, &SInfo) != HND_CLIENT) { HandleUnlock(); retVal = UPNP_E_INVALID_HANDLE; goto exit_function; } HandleUnlock(); retVal = genaRenewSubscription(Hnd, SubsIdTmp, TimeOut); exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpRenewSubscription, retVal=%d\n", retVal); UpnpString_delete(SubsIdTmp); return retVal; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_CLIENT_APIS int UpnpRenewSubscriptionAsync( UpnpClient_Handle Hnd, int TimeOut, Upnp_SID SubsId, Upnp_FunPtr Fun, const void *Cookie_const) { ThreadPoolJob job; struct Handle_Info *SInfo = NULL; struct UpnpNonblockParam *Param; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpRenewSubscriptionAsync\n"); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } if( TimeOut != UPNP_INFINITE && TimeOut < 1 ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } if( SubsId == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } if( Fun == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } HandleUnlock(); Param = ( struct UpnpNonblockParam * ) malloc( sizeof( struct UpnpNonblockParam ) ); if( Param == NULL ) { return UPNP_E_OUTOF_MEMORY; } Param->FunName = RENEW; Param->Handle = Hnd; strcpy( Param->SubsId, SubsId ); Param->Fun = Fun; Param->Cookie = ( void * )Cookie_const; Param->TimeOut = TimeOut; TPJobInit( &job, ( start_routine ) UpnpThreadDistribution, Param ); TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetPriority( &job, MED_PRIORITY ); ThreadPoolAdd( &gSendThreadPool, &job, NULL ); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpRenewSubscriptionAsync\n"); return UPNP_E_SUCCESS; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_DEVICE_APIS int UpnpNotify( UpnpDevice_Handle Hnd, const char *DevID_const, const char *ServName_const, const char **VarName_const, const char **NewVal_const, int cVariables) { struct Handle_Info *SInfo = NULL; int retVal; char *DevID = (char *)DevID_const; char *ServName = (char *)ServName_const; char **VarName = (char **)VarName_const; char **NewVal = (char **)NewVal_const; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpNotify\n"); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } if( DevID == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } if( ServName == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } if( VarName == NULL || NewVal == NULL || cVariables < 0 ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } HandleUnlock(); retVal = genaNotifyAll( Hnd, DevID, ServName, VarName, NewVal, cVariables ); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpNotify\n"); return retVal; } int UpnpNotifyExt( UpnpDevice_Handle Hnd, const char *DevID_const, const char *ServName_const, IXML_Document *PropSet) { struct Handle_Info *SInfo = NULL; int retVal; char *DevID = (char *)DevID_const; char *ServName = (char *)ServName_const; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpNotify \n" ); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } if( DevID == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } if( ServName == NULL ) { HandleUnlock(); return UPNP_E_INVALID_PARAM; } HandleUnlock(); retVal = genaNotifyAllExt( Hnd, DevID, ServName, PropSet ); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpNotify \n" ); return retVal; } #endif /* INCLUDE_DEVICE_APIS */ #ifdef INCLUDE_DEVICE_APIS int UpnpAcceptSubscription( UpnpDevice_Handle Hnd, const char *DevID_const, const char *ServName_const, const char **VarName_const, const char **NewVal_const, int cVariables, const Upnp_SID SubsId) { int ret = 0; int line = 0; struct Handle_Info *SInfo = NULL; char *DevID = (char *)DevID_const; char *ServName = (char *)ServName_const; char **VarName = (char **)VarName_const; char **NewVal = (char **)NewVal_const; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpAcceptSubscription\n"); if (UpnpSdkInit != 1) { line = __LINE__; ret = UPNP_E_FINISH; goto exit_function; } HandleReadLock(); if (GetHandleInfo(Hnd, &SInfo) != HND_DEVICE) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_HANDLE; goto exit_function; } if (DevID == NULL) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } if (ServName == NULL) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } if (SubsId == NULL) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } /* Now accepts an empty state list, so the code below is commented out */ #if 0 if (VarName == NULL || NewVal == NULL || cVariables < 0) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } #endif HandleUnlock(); line = __LINE__; ret = genaInitNotify( Hnd, DevID, ServName, VarName, NewVal, cVariables, SubsId); exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, line, "Exiting UpnpAcceptSubscription, ret = %d\n", ret); return ret; } int UpnpAcceptSubscriptionExt( UpnpDevice_Handle Hnd, const char *DevID_const, const char *ServName_const, IXML_Document *PropSet, Upnp_SID SubsId) { int ret = 0; int line = 0; struct Handle_Info *SInfo = NULL; char *DevID = (char *)DevID_const; char *ServName = (char *)ServName_const; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpAcceptSubscription\n"); if (UpnpSdkInit != 1) { line = __LINE__; ret = UPNP_E_FINISH; goto exit_function; } HandleReadLock(); if (GetHandleInfo(Hnd, &SInfo) != HND_DEVICE) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_HANDLE; goto exit_function; } if (DevID == NULL) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } if (ServName == NULL) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } if (SubsId == NULL) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } /* Now accepts an empty state list, so the code below is commented out */ #if 0 if (PropSet == NULL) { HandleUnlock(); line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto exit_function; } #endif HandleUnlock(); line = __LINE__; ret = genaInitNotifyExt(Hnd, DevID, ServName, PropSet, SubsId); exit_function: UpnpPrintf(UPNP_ALL, API, __FILE__, line, "Exiting UpnpAcceptSubscription, ret = %d.\n", ret); return ret; } #endif /* INCLUDE_DEVICE_APIS */ #endif /* EXCLUDE_GENA == 0 */ /******************************************************************************* * * SOAP interface * ******************************************************************************/ #if EXCLUDE_SOAP == 0 #ifdef INCLUDE_CLIENT_APIS int UpnpSendAction( UpnpClient_Handle Hnd, const char *ActionURL_const, const char *ServiceType_const, const char *DevUDN_const, IXML_Document *Action, IXML_Document **RespNodePtr) { struct Handle_Info *SInfo = NULL; int retVal = 0; char *ActionURL = (char *)ActionURL_const; char *ServiceType = (char *)ServiceType_const; /* udn not used? */ /*char *DevUDN = (char *)DevUDN_const;*/ if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSendAction\n"); if (DevUDN_const !=NULL) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "non NULL DevUDN is ignored\n"); } DevUDN_const = NULL; HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); if( ActionURL == NULL ) { return UPNP_E_INVALID_PARAM; } if( ServiceType == NULL || Action == NULL || RespNodePtr == NULL || DevUDN_const != NULL ) { return UPNP_E_INVALID_PARAM; } retVal = SoapSendAction( ActionURL, ServiceType, Action, RespNodePtr ); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSendAction\n"); return retVal; } int UpnpSendActionEx( UpnpClient_Handle Hnd, const char *ActionURL_const, const char *ServiceType_const, const char *DevUDN_const, IXML_Document *Header, IXML_Document *Action, IXML_Document **RespNodePtr) { struct Handle_Info *SInfo = NULL; int retVal = 0; char *ActionURL = (char *)ActionURL_const; char *ServiceType = (char *)ServiceType_const; /* udn not used? */ /*char *DevUDN = (char *)DevUDN_const;*/ if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSendActionEx\n"); if( Header == NULL ) { retVal = UpnpSendAction( Hnd, ActionURL_const, ServiceType_const, DevUDN_const, Action, RespNodePtr ); return retVal; } HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); if( ActionURL == NULL ) { return UPNP_E_INVALID_PARAM; } if( ServiceType == NULL || Action == NULL || RespNodePtr == NULL ) { return UPNP_E_INVALID_PARAM; } retVal = SoapSendActionEx( ActionURL, ServiceType, Header, Action, RespNodePtr ); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSendAction \n"); return retVal; } int UpnpSendActionAsync( UpnpClient_Handle Hnd, const char *ActionURL_const, const char *ServiceType_const, const char *DevUDN_const, IXML_Document *Act, Upnp_FunPtr Fun, const void *Cookie_const) { int rc; ThreadPoolJob job; struct Handle_Info *SInfo = NULL; struct UpnpNonblockParam *Param; DOMString tmpStr; char *ActionURL = (char *)ActionURL_const; char *ServiceType = (char *)ServiceType_const; /* udn not used? */ /*char *DevUDN = (char *)DevUDN_const;*/ if(UpnpSdkInit != 1) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSendActionAsync\n"); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); if( ActionURL == NULL ) { return UPNP_E_INVALID_PARAM; } if( ServiceType == NULL || Act == NULL || Fun == NULL || DevUDN_const != NULL ) { return UPNP_E_INVALID_PARAM; } tmpStr = ixmlPrintNode( ( IXML_Node * ) Act ); if( tmpStr == NULL ) { return UPNP_E_INVALID_ACTION; } Param = ( struct UpnpNonblockParam * ) malloc( sizeof( struct UpnpNonblockParam ) ); if( Param == NULL ) { return UPNP_E_OUTOF_MEMORY; } Param->FunName = ACTION; Param->Handle = Hnd; strcpy( Param->Url, ActionURL ); strcpy( Param->ServiceType, ServiceType ); rc = ixmlParseBufferEx( tmpStr, &( Param->Act ) ); if( rc != IXML_SUCCESS ) { free( Param ); ixmlFreeDOMString( tmpStr ); if( rc == IXML_INSUFFICIENT_MEMORY ) { return UPNP_E_OUTOF_MEMORY; } else { return UPNP_E_INVALID_ACTION; } } ixmlFreeDOMString( tmpStr ); Param->Cookie = ( void * )Cookie_const; Param->Fun = Fun; TPJobInit( &job, ( start_routine ) UpnpThreadDistribution, Param ); TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetPriority( &job, MED_PRIORITY ); ThreadPoolAdd( &gSendThreadPool, &job, NULL ); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSendActionAsync \n"); return UPNP_E_SUCCESS; } int UpnpSendActionExAsync( UpnpClient_Handle Hnd, const char *ActionURL_const, const char *ServiceType_const, const char *DevUDN_const, IXML_Document *Header, IXML_Document *Act, Upnp_FunPtr Fun, const void *Cookie_const) { struct Handle_Info *SInfo = NULL; struct UpnpNonblockParam *Param; DOMString tmpStr; DOMString headerStr = NULL; char *ActionURL = ( char * )ActionURL_const; char *ServiceType = ( char * )ServiceType_const; ThreadPoolJob job; int retVal = 0; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpSendActionExAsync\n"); if( Header == NULL ) { retVal = UpnpSendActionAsync( Hnd, ActionURL_const, ServiceType_const, DevUDN_const, Act, Fun, Cookie_const ); return retVal; } HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); if( ActionURL == NULL ) { return UPNP_E_INVALID_PARAM; } if( ServiceType == NULL || Act == NULL || Fun == NULL ) { return UPNP_E_INVALID_PARAM; } headerStr = ixmlPrintNode( ( IXML_Node * ) Header ); tmpStr = ixmlPrintNode( ( IXML_Node * ) Act ); if( tmpStr == NULL ) { return UPNP_E_INVALID_ACTION; } Param = ( struct UpnpNonblockParam * ) malloc( sizeof( struct UpnpNonblockParam ) ); if( Param == NULL ) { return UPNP_E_OUTOF_MEMORY; } Param->FunName = ACTION; Param->Handle = Hnd; strcpy( Param->Url, ActionURL ); strcpy( Param->ServiceType, ServiceType ); retVal = ixmlParseBufferEx( headerStr, &( Param->Header ) ); if( retVal != IXML_SUCCESS ) { ixmlFreeDOMString( tmpStr ); ixmlFreeDOMString( headerStr ); if( retVal == IXML_INSUFFICIENT_MEMORY ) { return UPNP_E_OUTOF_MEMORY; } else { return UPNP_E_INVALID_ACTION; } } retVal = ixmlParseBufferEx( tmpStr, &( Param->Act ) ); if( retVal != IXML_SUCCESS ) { ixmlFreeDOMString( tmpStr ); ixmlFreeDOMString( headerStr ); ixmlDocument_free( Param->Header ); if( retVal == IXML_INSUFFICIENT_MEMORY ) { return UPNP_E_OUTOF_MEMORY; } else { return UPNP_E_INVALID_ACTION; } } ixmlFreeDOMString( tmpStr ); ixmlFreeDOMString( headerStr ); Param->Cookie = ( void * )Cookie_const; Param->Fun = Fun; TPJobInit( &job, ( start_routine ) UpnpThreadDistribution, Param ); TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetPriority( &job, MED_PRIORITY ); ThreadPoolAdd( &gSendThreadPool, &job, NULL ); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpSendActionAsync\n"); return UPNP_E_SUCCESS; } int UpnpGetServiceVarStatusAsync( UpnpClient_Handle Hnd, const char *ActionURL_const, const char *VarName_const, Upnp_FunPtr Fun, const void *Cookie_const) { ThreadPoolJob job; struct Handle_Info *SInfo = NULL; struct UpnpNonblockParam *Param; char *ActionURL = (char *)ActionURL_const; char *VarName = (char *)VarName_const; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpGetServiceVarStatusAsync\n"); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); if( ActionURL == NULL ) { return UPNP_E_INVALID_PARAM; } if( VarName == NULL || Fun == NULL ) return UPNP_E_INVALID_PARAM; Param = ( struct UpnpNonblockParam * ) malloc( sizeof( struct UpnpNonblockParam ) ); if( Param == NULL ) { return UPNP_E_OUTOF_MEMORY; } Param->FunName = STATUS; Param->Handle = Hnd; strcpy( Param->Url, ActionURL ); strcpy( Param->VarName, VarName ); Param->Fun = Fun; Param->Cookie = ( void * )Cookie_const; TPJobInit( &job, ( start_routine ) UpnpThreadDistribution, Param ); TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetPriority( &job, MED_PRIORITY ); ThreadPoolAdd( &gSendThreadPool, &job, NULL ); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpGetServiceVarStatusAsync\n"); return UPNP_E_SUCCESS; } int UpnpGetServiceVarStatus( UpnpClient_Handle Hnd, const char *ActionURL_const, const char *VarName_const, DOMString *StVar) { struct Handle_Info *SInfo = NULL; int retVal = 0; char *StVarPtr; char *ActionURL = (char *)ActionURL_const; char *VarName = (char *)VarName_const; if(UpnpSdkInit != 1) { return UPNP_E_FINISH; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpGetServiceVarStatus\n"); HandleReadLock(); if( GetHandleInfo( Hnd, &SInfo ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INVALID_HANDLE; } HandleUnlock(); if( ActionURL == NULL ) { return UPNP_E_INVALID_PARAM; } if( VarName == NULL || StVar == NULL ) { return UPNP_E_INVALID_PARAM; } retVal = SoapGetServiceVarStatus( ActionURL, VarName, &StVarPtr ); *StVar = StVarPtr; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpGetServiceVarStatus \n"); return retVal; } #endif /* INCLUDE_CLIENT_APIS */ #endif /* EXCLUDE_SOAP */ /******************************************************************************* * * Client API * ******************************************************************************/ int UpnpOpenHttpPost( const char *url, void **handle, const char *contentType, int contentLength, int timeout) { return http_OpenHttpPost( url, handle, contentType, contentLength, timeout); } int UpnpWriteHttpPost( void *handle, char *buf, unsigned int *size, int timeout) { return http_WriteHttpPost(handle, buf, size, timeout); } int UpnpCloseHttpPost( void *handle, int *httpStatus, int timeout) { return http_CloseHttpPost(handle, httpStatus, timeout); } int UpnpOpenHttpGet( const char *url_str, void **Handle, char **contentType, int *contentLength, int *httpStatus, int timeout) { return http_OpenHttpGet( url_str, Handle, contentType, contentLength, httpStatus, timeout); } int UpnpOpenHttpGetProxy( const char *url_str, const char *proxy_str, void **Handle, char **contentType, int *contentLength, int *httpStatus, int timeout) { return http_OpenHttpGetProxy( url_str, proxy_str, Handle, contentType, contentLength, httpStatus, timeout); } int UpnpOpenHttpGetEx( const char *url_str, void **Handle, char **contentType, int *contentLength, int *httpStatus, int lowRange, int highRange, int timeout) { return http_OpenHttpGetEx( url_str, Handle, contentType, contentLength, httpStatus, lowRange, highRange, timeout); } int UpnpCancelHttpGet(void *Handle) { return http_CancelHttpGet(Handle); } int UpnpCloseHttpGet(void *Handle) { return http_CloseHttpGet(Handle); } int UpnpReadHttpGet(void *Handle, char *buf, unsigned int *size, int timeout) { return http_ReadHttpGet(Handle, buf, size, timeout); } int UpnpHttpGetProgress(void *Handle, unsigned int *length, unsigned int *total) { return http_HttpGetProgress(Handle, length, total); } int UpnpDownloadUrlItem(const char *url, char **outBuf, char *contentType) { int ret_code; int dummy; if( url == NULL || outBuf == NULL || contentType == NULL ) { return UPNP_E_INVALID_PARAM; } ret_code = http_Download( url, HTTP_DEFAULT_TIMEOUT, outBuf, &dummy, contentType ); if( ret_code > 0 ) { /* error reply was received */ ret_code = UPNP_E_INVALID_URL; } return ret_code; } int UpnpDownloadXmlDoc(const char *url, IXML_Document **xmlDoc) { int ret_code; char *xml_buf; char content_type[LINE_SIZE]; if (url == NULL || xmlDoc == NULL) { return UPNP_E_INVALID_PARAM; } ret_code = UpnpDownloadUrlItem(url, &xml_buf, content_type); if (ret_code != UPNP_E_SUCCESS) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "Error downloading document, retCode: %d\n", ret_code); return ret_code; } if (strncasecmp(content_type, "text/xml", strlen("text/xml"))) { UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Not text/xml\n"); /* Linksys WRT54G router returns * "CONTENT-TYPE: application/octet-stream". * Let's be nice to Linksys and try to parse document anyway. * If the data sended is not a xml file, ixmlParseBufferEx * will fail and the function will return UPNP_E_INVALID_DESC too. */ #if 0 free(xml_buf); return UPNP_E_INVALID_DESC; #endif } ret_code = ixmlParseBufferEx(xml_buf, xmlDoc); free(xml_buf); if (ret_code != IXML_SUCCESS) { if (ret_code == IXML_INSUFFICIENT_MEMORY) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "Out of memory, ixml error code: %d\n", ret_code); return UPNP_E_OUTOF_MEMORY; } else { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "Invalid Description, ixml error code: %d\n", ret_code); return UPNP_E_INVALID_DESC; } } else { #ifdef DEBUG xml_buf = ixmlPrintNode((IXML_Node *)*xmlDoc); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Printing the Parsed xml document \n %s\n", xml_buf); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "****************** END OF Parsed XML Doc *****************\n"); ixmlFreeDOMString(xml_buf); #endif UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpDownloadXmlDoc\n"); return UPNP_E_SUCCESS; } } int UpnpGetIfInfo(const char *IfName) { #ifdef WIN32 // ---------------------------------------------------- // WIN32 implementation will use the IpHlpAPI library. // ---------------------------------------------------- PIP_ADAPTER_ADDRESSES adapts = NULL; PIP_ADAPTER_ADDRESSES adapts_item; PIP_ADAPTER_UNICAST_ADDRESS uni_addr; SOCKADDR* ip_addr; struct in_addr v4_addr; struct in6_addr v6_addr; ULONG adapts_sz = 0; ULONG ret; int ifname_found = 0; int valid_addr_found = 0; // Get Adapters addresses required size. ret = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_DNS_SERVER, NULL, adapts, &adapts_sz ); if( ret != ERROR_BUFFER_OVERFLOW ) { UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, "GetAdaptersAddresses failed to find list of adapters\n" ); return UPNP_E_INIT; } // Allocate enough memory. adapts = (PIP_ADAPTER_ADDRESSES)malloc( adapts_sz ); if( adapts == NULL ) { return UPNP_E_OUTOF_MEMORY; } // Do the call that will actually return the info. ret = GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_DNS_SERVER, NULL, adapts, &adapts_sz ); if( ret != ERROR_SUCCESS ) { free( adapts ); UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, "GetAdaptersAddresses failed to find list of adapters\n" ); return UPNP_E_INIT; } // Copy interface name, if it was provided. if( IfName != NULL ) { if( strlen(IfName) > sizeof(gIF_NAME) ) return UPNP_E_INVALID_INTERFACE; strncpy( gIF_NAME, IfName, sizeof(gIF_NAME) ); ifname_found = 1; } adapts_item = adapts; while( adapts_item != NULL ) { if( adapts_item->Flags & IP_ADAPTER_NO_MULTICAST ) { continue; } if( ifname_found == 0 ) { // We have found a valid interface name. Keep it. strncpy( gIF_NAME, adapts_item->FriendlyName, sizeof(gIF_NAME) ); ifname_found = 1; } else { if( strncmp( gIF_NAME, adapts_item->FriendlyName, sizeof(gIF_NAME) ) != 0 ) { // This is not the interface we're looking for. continue; } } // Loop thru this adapter's unicast IP addresses. uni_addr = adapts_item->FirstUnicastAddress; while( uni_addr ) { ip_addr = uni_addr->Address.lpSockaddr; switch( ip_addr->sa_family ) { case AF_INET: memcpy( &v4_addr, &((struct sockaddr_in *)ip_addr)->sin_addr, sizeof(v4_addr) ); valid_addr_found = 1; break; case AF_INET6: // Only keep IPv6 link-local addresses. if( IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6 *)ip_addr)->sin6_addr) ) { memcpy( &v6_addr, &((struct sockaddr_in6 *)ip_addr)->sin6_addr, sizeof(v6_addr) ); valid_addr_found = 1; } break; default: if( valid_addr_found == 0 ) { // Address is not IPv4 or IPv6 and no valid address has // yet been found for this interface. Discard interface name. ifname_found = 0; } break; } // Next address. uni_addr = uni_addr->Next; } if( valid_addr_found == 1 ) { gIF_INDEX = adapts_item->IfIndex; break; } // Next adapter. adapts_item = adapts_item->Next; } // Failed to find a valid interface, or valid address. if( ifname_found == 0 || valid_addr_found == 0 ) { UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, "Failed to find an adapter with valid IP addresses for use.\n" ); return UPNP_E_INVALID_INTERFACE; } inet_ntop(AF_INET, &v4_addr, gIF_IPV4, sizeof(gIF_IPV4)); inet_ntop(AF_INET6, &v6_addr, gIF_IPV6, sizeof(gIF_IPV6)); #elif (defined(BSD) && BSD >= 199306) || defined(__FreeBSD_kernel__) struct ifaddrs *ifap, *ifa; struct in_addr v4_addr; struct in6_addr v6_addr; int ifname_found = 0; int valid_addr_found = 0; // Copy interface name, if it was provided. if( IfName != NULL ) { if( strlen(IfName) > sizeof(gIF_NAME) ) return UPNP_E_INVALID_INTERFACE; strncpy( gIF_NAME, IfName, sizeof(gIF_NAME) ); ifname_found = 1; } // Get system interface addresses. if( getifaddrs(&ifap) != 0 ) { UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, "getifaddrs failed to find list of addresses\n" ); return UPNP_E_INIT; } // cycle through available interfaces and their addresses. for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { // Skip LOOPBACK interfaces, DOWN interfaces and interfaces that // don't support MULTICAST. if( ( ifa->ifa_flags & IFF_LOOPBACK ) || ( !( ifa->ifa_flags & IFF_UP ) ) || ( !( ifa->ifa_flags & IFF_MULTICAST ) ) ) { continue; } if( ifname_found == 0 ) { // We have found a valid interface name. Keep it. strncpy( gIF_NAME, ifa->ifa_name, sizeof(gIF_NAME) ); ifname_found = 1; } else { if( strncmp( gIF_NAME, ifa->ifa_name, sizeof(gIF_NAME) ) != 0 ) { // This is not the interface we're looking for. continue; } } // Keep interface addresses for later. switch( ifa->ifa_addr->sa_family ) { case AF_INET: memcpy( &v4_addr, &((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr, sizeof(v4_addr) ); valid_addr_found = 1; break; case AF_INET6: // Only keep IPv6 link-local addresses. if( IN6_IS_ADDR_LINKLOCAL(&((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_addr) ) { memcpy( &v6_addr, &((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_addr, sizeof(v6_addr) ); valid_addr_found = 1; } break; default: if( valid_addr_found == 0 ) { // Address is not IPv4 or IPv6 and no valid address has // yet been found for this interface. Discard interface name. ifname_found = 0; } break; } } freeifaddrs(ifap); // Failed to find a valid interface, or valid address. if( ifname_found == 0 || valid_addr_found == 0 ) { UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, "Failed to find an adapter with valid IP addresses for use.\n" ); return UPNP_E_INVALID_INTERFACE; } inet_ntop(AF_INET, &v4_addr, gIF_IPV4, sizeof(gIF_IPV4)); inet_ntop(AF_INET6, &v6_addr, gIF_IPV6, sizeof(gIF_IPV6)); gIF_INDEX = if_nametoindex(gIF_NAME); #else char szBuffer[MAX_INTERFACES * sizeof( struct ifreq )]; struct ifconf ifConf; struct ifreq ifReq; FILE* inet6_procfd; int i; int LocalSock; struct in6_addr v6_addr; int if_idx; char addr6[8][5]; char buf[65]; // INET6_ADDRSTRLEN int ifname_found = 0; int valid_addr_found = 0; // Copy interface name, if it was provided. if( IfName != NULL ) { if( strlen(IfName) > sizeof(gIF_NAME) ) return UPNP_E_INVALID_INTERFACE; strncpy( gIF_NAME, IfName, sizeof(gIF_NAME) ); ifname_found = 1; } // Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. if( ( LocalSock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) < 0 ) { UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Can't create addrlist socket\n" ); return UPNP_E_INIT; } // Get the interface configuration information... ifConf.ifc_len = sizeof szBuffer; ifConf.ifc_ifcu.ifcu_buf = ( caddr_t ) szBuffer; if( ioctl( LocalSock, SIOCGIFCONF, &ifConf ) < 0 ) { UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "DiscoverInterfaces: SIOCGIFCONF returned error\n" ); return UPNP_E_INIT; } // Cycle through the list of interfaces looking for IP addresses. for( i = 0; i < ifConf.ifc_len ; ) { struct ifreq *pifReq = ( struct ifreq * )( ( caddr_t ) ifConf.ifc_req + i ); i += sizeof *pifReq; // See if this is the sort of interface we want to deal with. strcpy( ifReq.ifr_name, pifReq->ifr_name ); if( ioctl( LocalSock, SIOCGIFFLAGS, &ifReq ) < 0 ) { UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Can't get interface flags for %s:\n", ifReq.ifr_name ); } // Skip LOOPBACK interfaces, DOWN interfaces and interfaces that // don't support MULTICAST. if( ( ifReq.ifr_flags & IFF_LOOPBACK ) || ( !( ifReq.ifr_flags & IFF_UP ) ) || ( !( ifReq.ifr_flags & IFF_MULTICAST ) ) ) { continue; } if( ifname_found == 0 ) { // We have found a valid interface name. Keep it. strncpy( gIF_NAME, pifReq->ifr_name, sizeof(gIF_NAME) ); ifname_found = 1; } else { if( strncmp( gIF_NAME, pifReq->ifr_name, sizeof(gIF_NAME) ) != 0 ) { // This is not the interface we're looking for. continue; } } // Check address family. if( pifReq->ifr_addr.sa_family == AF_INET ) { // Copy interface name, IPv4 address and interface index. strncpy( gIF_NAME, pifReq->ifr_name, sizeof(gIF_NAME) ); inet_ntop(AF_INET, &((struct sockaddr_in*)&pifReq->ifr_addr)->sin_addr, gIF_IPV4, sizeof(gIF_IPV4)); gIF_INDEX = if_nametoindex(gIF_NAME); valid_addr_found = 1; break; } else { // Address is not IPv4 ifname_found = 0; } } close( LocalSock ); // Failed to find a valid interface, or valid address. if( ifname_found == 0 || valid_addr_found == 0 ) { UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, "Failed to find an adapter with valid IP addresses for use.\n" ); return UPNP_E_INVALID_INTERFACE; } // Try to get the IPv6 address for the same interface // from "/proc/net/if_inet6", if possible. inet6_procfd = fopen( "/proc/net/if_inet6", "r" ); if( inet6_procfd != NULL ) { while( fscanf(inet6_procfd, "%4s%4s%4s%4s%4s%4s%4s%4s %02x %*02x %*02x %*02x %*20s\n", addr6[0],addr6[1],addr6[2],addr6[3], addr6[4],addr6[5],addr6[6],addr6[7], &if_idx) != EOF) { // Get same interface as IPv4 address retrieved. if( gIF_INDEX == if_idx ) { snprintf(buf, sizeof(buf), "%s:%s:%s:%s:%s:%s:%s:%s", addr6[0],addr6[1],addr6[2],addr6[3], addr6[4],addr6[5],addr6[6],addr6[7]); // Validate formed address and check for link-local. if( inet_pton(AF_INET6, buf, &v6_addr) > 0 && IN6_IS_ADDR_LINKLOCAL(&v6_addr) ) { // Got valid IPv6 link-local adddress. strncpy( gIF_IPV6, buf, sizeof(gIF_IPV6) ); break; } } } fclose( inet6_procfd ); } #endif UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "Interface name=%s, index=%d, v4=%s, v6=%s\n", gIF_NAME, gIF_INDEX, gIF_IPV4, gIF_IPV6 ); return UPNP_E_SUCCESS; } /*! * \brief Schedule async functions in threadpool. */ #ifdef INCLUDE_CLIENT_APIS void UpnpThreadDistribution(struct UpnpNonblockParam *Param) { int errCode = 0; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside UpnpThreadDistribution \n"); switch ( Param->FunName ) { #if EXCLUDE_GENA == 0 case SUBSCRIBE: { UpnpEventSubscribe *evt = UpnpEventSubscribe_new(); /* Cast away constness */ UpnpString *Sid = (UpnpString *)UpnpEventSubscribe_get_SID(evt); UpnpEventSubscribe_strcpy_PublisherUrl(evt, Param->Url); errCode = genaSubscribe( Param->Handle, UpnpEventSubscribe_get_PublisherUrl(evt), (int *)&Param->TimeOut, Sid); UpnpEventSubscribe_set_ErrCode(evt, errCode); UpnpEventSubscribe_set_TimeOut(evt, Param->TimeOut); Param->Fun(UPNP_EVENT_SUBSCRIBE_COMPLETE, evt, Param->Cookie); UpnpEventSubscribe_delete(evt); free(Param); break; } case UNSUBSCRIBE: { UpnpEventSubscribe *evt = UpnpEventSubscribe_new(); UpnpEventSubscribe_strcpy_SID(evt, Param->SubsId); errCode = genaUnSubscribe( Param->Handle, UpnpEventSubscribe_get_SID(evt)); UpnpEventSubscribe_set_ErrCode(evt, errCode); UpnpEventSubscribe_strcpy_PublisherUrl(evt, ""); UpnpEventSubscribe_set_TimeOut(evt, 0); Param->Fun(UPNP_EVENT_UNSUBSCRIBE_COMPLETE, evt, Param->Cookie); UpnpEventSubscribe_delete(evt); free(Param); break; } case RENEW: { UpnpEventSubscribe *evt = UpnpEventSubscribe_new(); UpnpEventSubscribe_strcpy_SID(evt, Param->SubsId); errCode = genaRenewSubscription( Param->Handle, UpnpEventSubscribe_get_SID(evt), &Param->TimeOut); UpnpEventSubscribe_set_ErrCode(evt, errCode); UpnpEventSubscribe_set_TimeOut(evt, Param->TimeOut); Param->Fun(UPNP_EVENT_RENEWAL_COMPLETE, evt, Param->Cookie); UpnpEventSubscribe_delete(evt); free(Param); break; } #endif /* EXCLUDE_GENA == 0 */ #if EXCLUDE_SOAP == 0 case ACTION: { UpnpActionComplete *Evt = UpnpActionComplete_new(); IXML_Document *actionResult = NULL; int errCode = SoapSendAction( Param->Url, Param->ServiceType, Param->Act, &actionResult); UpnpActionComplete_set_ErrCode(Evt, errCode); UpnpActionComplete_set_ActionRequest(Evt, Param->Act); UpnpActionComplete_set_ActionResult(Evt, actionResult); UpnpActionComplete_strcpy_CtrlUrl(Evt, Param->Url); Param->Fun(UPNP_CONTROL_ACTION_COMPLETE, Evt, Param->Cookie); free(Param); UpnpActionComplete_delete(Evt); break; } case STATUS: { UpnpStateVarComplete *Evt = UpnpStateVarComplete_new(); DOMString currentVal = NULL; int errCode = SoapGetServiceVarStatus( Param->Url, Param->VarName, ¤tVal); UpnpStateVarComplete_set_ErrCode(Evt, errCode); UpnpStateVarComplete_strcpy_CtrlUrl(Evt, Param->Url); UpnpStateVarComplete_strcpy_StateVarName(Evt, Param->VarName); UpnpStateVarComplete_set_CurrentVal(Evt, currentVal); Param->Fun(UPNP_CONTROL_GET_VAR_COMPLETE, Evt, Param->Cookie); free(Param); UpnpStateVarComplete_delete(Evt); break; } #endif /* EXCLUDE_SOAP == 0 */ default: break; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting UpnpThreadDistribution\n"); } #endif /* INCLUDE_CLIENT_APIS */ /*! * \brief Get callback function ptr from a handle. * * \return Upnp_FunPtr */ Upnp_FunPtr GetCallBackFn(UpnpClient_Handle Hnd) { return ((struct Handle_Info *)HandleTable[Hnd])->Callback; } int GetFreeHandle() { /* Handle 0 is not used as NULL translates to 0 when passed as a handle */ int i = 1; while (i < NUM_HANDLE && HandleTable[i] != NULL) { ++i; } if (i == NUM_HANDLE) { return UPNP_E_OUTOF_HANDLE; } else { return i; } } /* Assumes at most one client */ Upnp_Handle_Type GetClientHandleInfo( UpnpClient_Handle *client_handle_out, struct Handle_Info **HndInfo) { Upnp_Handle_Type ret = HND_CLIENT; UpnpClient_Handle client; if (GetHandleInfo(1, HndInfo) == HND_CLIENT) { client = 1; } else if (GetHandleInfo(2, HndInfo) == HND_CLIENT) { client = 2; } else { client = -1; ret = HND_INVALID; } *client_handle_out = client; return ret; } Upnp_Handle_Type GetDeviceHandleInfo( const int AddressFamily, UpnpDevice_Handle *device_handle_out, struct Handle_Info **HndInfo) { /* Check if we've got a registered device of the address family specified. */ if ((AddressFamily == AF_INET && UpnpSdkDeviceRegisteredV4 == 0) || (AddressFamily == AF_INET6 && UpnpSdkDeviceregisteredV6 == 0)) { *device_handle_out = -1; return HND_INVALID; } /* Find it. */ for (*device_handle_out=1; *device_handle_out < NUM_HANDLE; (*device_handle_out)++) { if (GetHandleInfo(*device_handle_out, HndInfo) == HND_DEVICE) { if ((*HndInfo)->DeviceAf == AddressFamily) { return HND_DEVICE; } } } *device_handle_out = -1; return HND_INVALID; } Upnp_Handle_Type GetHandleInfo( UpnpClient_Handle Hnd, struct Handle_Info **HndInfo) { Upnp_Handle_Type ret = UPNP_E_INVALID_HANDLE; UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "GetHandleInfo: entering, Handle is %d\n", Hnd); if (Hnd < 1 || Hnd >= NUM_HANDLE) { UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "GetHandleInfo: Handle out of range\n"); } else if (HandleTable[Hnd] == NULL) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "GetHandleInfo: HandleTable[%d] is NULL\n", Hnd); } else if (HandleTable[Hnd] != NULL) { *HndInfo = (struct Handle_Info *)HandleTable[Hnd]; ret = ((struct Handle_Info *)*HndInfo)->HType; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "GetHandleInfo: exiting\n"); return ret; } int FreeHandle(int Upnp_Handle) { int ret = UPNP_E_INVALID_HANDLE; UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "FreeHandle: entering, Handle is %d\n", Upnp_Handle); if (Upnp_Handle < 1 || Upnp_Handle >= NUM_HANDLE) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "FreeHandle: Handle %d is out of range\n", Upnp_Handle); } else if (HandleTable[Upnp_Handle] == NULL) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "FreeHandle: HandleTable[%d] is NULL\n", Upnp_Handle); } else { free( HandleTable[Upnp_Handle] ); HandleTable[Upnp_Handle] = NULL; ret = UPNP_E_SUCCESS; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "FreeHandle: exiting, ret = %d.\n", ret); return ret; } int PrintHandleInfo(UpnpClient_Handle Hnd) { struct Handle_Info * HndInfo; if (HandleTable[Hnd] != NULL) { HndInfo = HandleTable[Hnd]; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Printing information for Handle_%d\n", Hnd); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "HType_%d\n", HndInfo->HType); #ifdef INCLUDE_DEVICE_APIS if(HndInfo->HType != HND_CLIENT) UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "DescURL_%s\n", HndInfo->DescURL); #endif /* INCLUDE_DEVICE_APIS */ } else { return UPNP_E_INVALID_HANDLE; } return UPNP_E_SUCCESS; } int getlocalhostname(char *out, const int out_len) { int ret = UPNP_E_SUCCESS; char tempstr[16]; const char *p = NULL; #ifdef WIN32 struct hostent *h = NULL; struct sockaddr_in LocalAddr; gethostname(out, out_len); h = gethostbyname(out); if (h != NULL) { memcpy(&LocalAddr.sin_addr, h->h_addr_list[0], 4); p = inet_ntop(AF_INET, &LocalAddr.sin_addr, tempstr, sizeof(tempstr)); if (p) { strncpy(out, p, out_len); } else { UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "getlocalhostname: inet_ntop returned error\n" ); ret = UPNP_E_INIT; } } else { UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "getlocalhostname: gethostbyname returned error\n" ); ret = UPNP_E_INIT; } #elif (defined(BSD) && BSD >= 199306) || defined(__FreeBSD_kernel__) struct ifaddrs *ifap, *ifa; if (getifaddrs(&ifap) != 0) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "DiscoverInterfaces: getifaddrs() returned error\n"); return UPNP_E_INIT; } /* cycle through available interfaces */ for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { /* Skip loopback, point-to-point and down interfaces, * except don't skip down interfaces * if we're trying to get a list of configurable interfaces. */ if ((ifa->ifa_flags & IFF_LOOPBACK) || (!( ifa->ifa_flags & IFF_UP))) { continue; } if (ifa->ifa_addr->sa_family == AF_INET) { /* We don't want the loopback interface. */ if (((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) { continue; } p = inet_ntop(AF_INET, &((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr, tempstr, sizeof(tempstr)); if (p) { strncpy(out, p, out_len); } else { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "getlocalhostname: inet_ntop returned error\n"); ret = UPNP_E_INIT; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside getlocalhostname: after strncpy %s\n", out); break; } } freeifaddrs(ifap); ret = ifa ? UPNP_E_SUCCESS : UPNP_E_INIT; #else char szBuffer[MAX_INTERFACES * sizeof (struct ifreq)]; struct ifconf ifConf; struct ifreq ifReq; int nResult; int i; int LocalSock; struct sockaddr_in LocalAddr; int j = 0; /* purify */ memset(&ifConf, 0, sizeof(ifConf)); memset(&ifReq, 0, sizeof(ifReq)); memset(szBuffer, 0, sizeof(szBuffer)); /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */ LocalSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (LocalSock < 0) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Can't create addrlist socket\n"); return UPNP_E_INIT; } /* Get the interface configuration information... */ ifConf.ifc_len = sizeof szBuffer; ifConf.ifc_ifcu.ifcu_buf = (caddr_t) szBuffer; nResult = ioctl(LocalSock, SIOCGIFCONF, &ifConf); if (nResult < 0) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "DiscoverInterfaces: SIOCGIFCONF returned error\n"); return UPNP_E_INIT; } /* Cycle through the list of interfaces looking for IP addresses. */ for (i = 0; i < ifConf.ifc_len && j < DEFAULT_INTERFACE; ) { struct ifreq *pifReq = (struct ifreq *)((caddr_t)ifConf.ifc_req + i); i += sizeof *pifReq; /* See if this is the sort of interface we want to deal with. */ strcpy(ifReq.ifr_name, pifReq->ifr_name); if (ioctl(LocalSock, SIOCGIFFLAGS, &ifReq) < 0) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Can't get interface flags for %s:\n", ifReq.ifr_name); } /* Skip loopback, point-to-point and down interfaces, * except don't skip down interfaces * if we're trying to get a list of configurable interfaces. */ if ((ifReq.ifr_flags & IFF_LOOPBACK) || (!(ifReq.ifr_flags & IFF_UP))) { continue; } if (pifReq->ifr_addr.sa_family == AF_INET) { /* Get a pointer to the address...*/ memcpy(&LocalAddr, &pifReq->ifr_addr, sizeof pifReq->ifr_addr); /* We don't want the loopback interface. */ if (LocalAddr.sin_addr.s_addr == htonl(INADDR_LOOPBACK)) { continue; } } /* increment j if we found an address which is not loopback * and is up */ j++; } close(LocalSock); p = inet_ntop(AF_INET, &LocalAddr.sin_addr, tempstr, sizeof(tempstr)); if (p) { strncpy(out, p, out_len); } else { UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "getlocalhostname: inet_ntop returned error\n" ); ret = UPNP_E_INIT; } UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside getlocalhostname: after strncpy %s\n", out); #endif return ret; } #ifdef INCLUDE_DEVICE_APIS #if EXCLUDE_SSDP == 0 void AutoAdvertise(void *input) { upnp_timeout *event = (upnp_timeout *)input; UpnpSendAdvertisement(event->handle, *((int *)event->Event)); free_upnp_timeout(event); } #endif /* EXCLUDE_SSDP == 0 */ #endif /* INCLUDE_DEVICE_APIS */ #ifdef INTERNAL_WEB_SERVER int UpnpSetWebServerRootDir(const char *rootDir) { if( UpnpSdkInit == 0 ) return UPNP_E_FINISH; if( ( rootDir == NULL ) || ( strlen( rootDir ) == 0 ) ) { return UPNP_E_INVALID_PARAM; } membuffer_destroy( &gDocumentRootDir ); return web_server_set_root_dir(rootDir); } #endif /* INTERNAL_WEB_SERVER */ int UpnpAddVirtualDir(const char *newDirName) { virtualDirList *pNewVirtualDir; virtualDirList *pLast; virtualDirList *pCurVirtualDir; char dirName[NAME_SIZE]; if( UpnpSdkInit != 1 ) { // SDK is not initialized return UPNP_E_FINISH; } if( ( newDirName == NULL ) || ( strlen( newDirName ) == 0 ) ) { return UPNP_E_INVALID_PARAM; } if( *newDirName != '/' ) { dirName[0] = '/'; strcpy( dirName + 1, newDirName ); } else { strcpy( dirName, newDirName ); } pCurVirtualDir = pVirtualDirList; while( pCurVirtualDir != NULL ) { // already has this entry if( strcmp( pCurVirtualDir->dirName, dirName ) == 0 ) { return UPNP_E_SUCCESS; } pCurVirtualDir = pCurVirtualDir->next; } pNewVirtualDir = ( virtualDirList * ) malloc( sizeof( virtualDirList ) ); if( pNewVirtualDir == NULL ) { return UPNP_E_OUTOF_MEMORY; } pNewVirtualDir->next = NULL; strcpy( pNewVirtualDir->dirName, dirName ); *( pNewVirtualDir->dirName + strlen( dirName ) ) = 0; if( pVirtualDirList == NULL ) { // first virtual dir pVirtualDirList = pNewVirtualDir; } else { pLast = pVirtualDirList; while( pLast->next != NULL ) { pLast = pLast->next; } pLast->next = pNewVirtualDir; } return UPNP_E_SUCCESS; } int UpnpRemoveVirtualDir(const char *dirName) { virtualDirList *pPrev; virtualDirList *pCur; int found = 0; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } if( dirName == NULL ) { return UPNP_E_INVALID_PARAM; } if( pVirtualDirList == NULL ) { return UPNP_E_INVALID_PARAM; } // // Handle the special case where the directory that we are // removing is the first and only one in the list. // if( ( pVirtualDirList->next == NULL ) && ( strcmp( pVirtualDirList->dirName, dirName ) == 0 ) ) { free( pVirtualDirList ); pVirtualDirList = NULL; return UPNP_E_SUCCESS; } pCur = pVirtualDirList; pPrev = pCur; while( pCur != NULL ) { if( strcmp( pCur->dirName, dirName ) == 0 ) { pPrev->next = pCur->next; free( pCur ); found = 1; break; } else { pPrev = pCur; pCur = pCur->next; } } if( found == 1 ) return UPNP_E_SUCCESS; else return UPNP_E_INVALID_PARAM; } void UpnpRemoveAllVirtualDirs(void) { virtualDirList *pCur; virtualDirList *pNext; if( UpnpSdkInit != 1 ) { return; } pCur = pVirtualDirList; while( pCur != NULL ) { pNext = pCur->next; free( pCur ); pCur = pNext; } pVirtualDirList = NULL; } int UpnpEnableWebserver(int enable) { int retVal; if( UpnpSdkInit != 1 ) { return UPNP_E_FINISH; } switch ( enable ) { #ifdef INTERNAL_WEB_SERVER case TRUE: if( ( retVal = web_server_init() ) != UPNP_E_SUCCESS ) { return retVal; } bWebServerState = WEB_SERVER_ENABLED; SetHTTPGetCallback( web_server_callback ); break; case FALSE: web_server_destroy(); bWebServerState = WEB_SERVER_DISABLED; SetHTTPGetCallback( NULL ); break; #endif /* INTERNAL_WEB_SERVER */ default: return UPNP_E_INVALID_PARAM; } return UPNP_E_SUCCESS; } /*! * \brief Checks if the webserver is enabled or disabled. * * \return 1, if webserver is enabled or 0, if webserver is disabled. */ int UpnpIsWebserverEnabled(void) { if (UpnpSdkInit != 1) { return 0; } return bWebServerState == WEB_SERVER_ENABLED; } int UpnpVirtualDir_set_GetInfoCallback(VDCallback_GetInfo callback) { int ret = UPNP_E_SUCCESS; if (!callback) { ret = UPNP_E_INVALID_PARAM; } else { virtualDirCallback.get_info = callback; } return ret; } int UpnpVirtualDir_set_OpenCallback(VDCallback_Open callback) { int ret = UPNP_E_SUCCESS; if (!callback) { ret = UPNP_E_INVALID_PARAM; } else { virtualDirCallback.open = callback; } return ret; } int UpnpVirtualDir_set_ReadCallback(VDCallback_Read callback) { int ret = UPNP_E_SUCCESS; if (!callback) { ret = UPNP_E_INVALID_PARAM; } else { virtualDirCallback.read = callback; } return ret; } int UpnpVirtualDir_set_WriteCallback(VDCallback_Write callback) { int ret = UPNP_E_SUCCESS; if (!callback) { ret = UPNP_E_INVALID_PARAM; } else { virtualDirCallback.write = callback; } return ret; } int UpnpVirtualDir_set_SeekCallback(VDCallback_Seek callback) { int ret = UPNP_E_SUCCESS; if (!callback) { ret = UPNP_E_INVALID_PARAM; } else { virtualDirCallback.seek = callback; } return ret; } int UpnpVirtualDir_set_CloseCallback(VDCallback_Close callback) { int ret = UPNP_E_SUCCESS; if (!callback) { ret = UPNP_E_INVALID_PARAM; } else { virtualDirCallback.close = callback; } return ret; } int UpnpSetContentLength( UpnpClient_Handle Hnd, int contentLength) { int errCode = UPNP_E_SUCCESS; struct Handle_Info *HInfo = NULL; do { if (UpnpSdkInit != 1) { errCode = UPNP_E_FINISH; break; } HandleLock(); errCode = GetHandleInfo(Hnd, &HInfo); if (errCode != HND_DEVICE) { errCode = UPNP_E_INVALID_HANDLE; break; } if (contentLength > MAX_SOAP_CONTENT_LENGTH) { errCode = UPNP_E_OUTOF_BOUNDS; break; } g_maxContentLength = contentLength; } while(0); HandleUnlock(); return errCode; } int UpnpSetMaxContentLength(size_t contentLength) { int errCode = UPNP_E_SUCCESS; do { if (UpnpSdkInit != 1) { errCode = UPNP_E_FINISH; break; } g_maxContentLength = contentLength; } while(0); return errCode; } libupnp-1.8.0~svn20100507/upnp/src/api/ActionRequest.c0000644000175000017500000001621011365106163017134 00000000000000 /*! * \file * * \brief UpnpActionRequest object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "ActionRequest.h" #include /* for calloc(), free() */ #include /* for memset(), strlen(), strdup() */ struct SUpnpActionRequest { int m_errCode; int m_socket; UpnpString *m_errStr; UpnpString *m_actionName; UpnpString *m_devUDN; UpnpString *m_serviceID; IXML_Document *m_actionRequest; IXML_Document *m_actionResult; IXML_Document *m_soapHeader; /* Variables should be declared with struct sockaddr_storage, * but users must only see a struct sockaddr pointer */ struct sockaddr_storage m_ctrlPtIPAddr; }; UpnpActionRequest *UpnpActionRequest_new() { struct SUpnpActionRequest *p = calloc(1, sizeof (struct SUpnpActionRequest)); #if 0 p->m_errCode = 0; p->m_socket = 0; #endif p->m_errStr = UpnpString_new(); p->m_actionName = UpnpString_new(); p->m_devUDN = UpnpString_new(); p->m_serviceID = UpnpString_new(); #if 0 p->m_actionRequest = NULL; p->m_actionResult = NULL; p->m_soapHeader = NULL; memset(&p->m_ctrlPtIPAddr, 0, sizeof (struct sockaddr_storage)); #endif return (UpnpActionRequest *)p; } void UpnpActionRequest_delete(UpnpActionRequest *p) { struct SUpnpActionRequest *q = (struct SUpnpActionRequest *)p; if (!q) return; q->m_errCode = 0; q->m_socket = 0; UpnpString_delete(q->m_errStr); q->m_errStr = NULL; UpnpString_delete(q->m_actionName); q->m_actionName = NULL; UpnpString_delete(q->m_devUDN); q->m_devUDN = NULL; UpnpString_delete(q->m_serviceID); q->m_serviceID = NULL; UpnpActionRequest_set_ActionRequest(p, NULL); UpnpActionRequest_set_ActionResult(p, NULL); UpnpActionRequest_set_SoapHeader(p, NULL); memset(&q->m_ctrlPtIPAddr, 0, sizeof (struct sockaddr_storage)); free(p); } UpnpActionRequest *UpnpActionRequest_dup(const UpnpActionRequest *p) { UpnpActionRequest *q = UpnpActionRequest_new(); UpnpActionRequest_assign(q, p); return q; } void UpnpActionRequest_assign(UpnpActionRequest *p, const UpnpActionRequest *q) { if (p != q) { UpnpActionRequest_set_ErrCode(p, UpnpActionRequest_get_ErrCode(q)); UpnpActionRequest_set_Socket(p, UpnpActionRequest_get_Socket(q)); UpnpActionRequest_set_ErrStr(p, UpnpActionRequest_get_ErrStr(q)); UpnpActionRequest_set_ActionName(p, UpnpActionRequest_get_ActionName(q)); UpnpActionRequest_set_DevUDN(p, UpnpActionRequest_get_DevUDN(q)); UpnpActionRequest_set_ServiceID(p, UpnpActionRequest_get_ServiceID(q)); UpnpActionRequest_set_ActionRequest(p, UpnpActionRequest_get_ActionRequest(q)); UpnpActionRequest_set_ActionResult(p, UpnpActionRequest_get_ActionResult(q)); UpnpActionRequest_set_CtrlPtIPAddr(p, UpnpActionRequest_get_CtrlPtIPAddr(q)); UpnpActionRequest_set_SoapHeader(p, UpnpActionRequest_get_SoapHeader(q)); } } int UpnpActionRequest_get_ErrCode(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_errCode; } void UpnpActionRequest_set_ErrCode(UpnpActionRequest *p, int n) { ((struct SUpnpActionRequest *)p)->m_errCode = n; } int UpnpActionRequest_get_Socket(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_socket; } void UpnpActionRequest_set_Socket(UpnpActionRequest *p, int n) { ((struct SUpnpActionRequest *)p)->m_socket = n; } const UpnpString *UpnpActionRequest_get_ErrStr(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_errStr; } const char *UpnpActionRequest_get_ErrStr_cstr(const UpnpActionRequest *p) { return UpnpString_get_String(UpnpActionRequest_get_ErrStr(p)); } void UpnpActionRequest_set_ErrStr(UpnpActionRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpActionRequest *)p)->m_errStr); ((struct SUpnpActionRequest *)p)->m_errStr = UpnpString_dup(s); } void UpnpActionRequest_strcpy_ErrStr(UpnpActionRequest *p, const char *s) { UpnpString_delete(((struct SUpnpActionRequest *)p)->m_errStr); ((struct SUpnpActionRequest *)p)->m_errStr = UpnpString_new(); UpnpString_set_String(((struct SUpnpActionRequest *)p)->m_errStr, s); } const UpnpString *UpnpActionRequest_get_ActionName(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_actionName; } const char *UpnpActionRequest_get_ActionName_cstr(const UpnpActionRequest *p) { return UpnpString_get_String(UpnpActionRequest_get_ActionName(p)); } void UpnpActionRequest_set_ActionName(UpnpActionRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpActionRequest *)p)->m_actionName); ((struct SUpnpActionRequest *)p)->m_actionName = UpnpString_dup(s); } void UpnpActionRequest_strcpy_ActionName(UpnpActionRequest *p, const char *s) { UpnpString_delete(((struct SUpnpActionRequest *)p)->m_actionName); ((struct SUpnpActionRequest *)p)->m_actionName = UpnpString_new(); UpnpString_set_String(((struct SUpnpActionRequest *)p)->m_actionName, s); } const UpnpString *UpnpActionRequest_get_DevUDN(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_devUDN; } const char *UpnpActionRequest_get_DevUDN_cstr(const UpnpActionRequest *p) { return UpnpString_get_String(UpnpActionRequest_get_DevUDN(p)); } void UpnpActionRequest_set_DevUDN(UpnpActionRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpActionRequest *)p)->m_devUDN); ((struct SUpnpActionRequest *)p)->m_devUDN = UpnpString_dup(s); } const UpnpString *UpnpActionRequest_get_ServiceID(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_serviceID; } const char *UpnpActionRequest_get_ServiceID_cstr(const UpnpActionRequest *p) { return UpnpString_get_String(UpnpActionRequest_get_ServiceID(p)); } void UpnpActionRequest_set_ServiceID(UpnpActionRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpActionRequest *)p)->m_serviceID); ((struct SUpnpActionRequest *)p)->m_serviceID = UpnpString_dup(s); } IXML_Document *UpnpActionRequest_get_ActionRequest(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_actionRequest; } void UpnpActionRequest_set_ActionRequest(UpnpActionRequest *p, IXML_Document *d) { ixmlDocument_free(((struct SUpnpActionRequest *)p)->m_actionRequest); ((struct SUpnpActionRequest *)p)->m_actionRequest = d; } IXML_Document *UpnpActionRequest_get_ActionResult(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_actionResult; } void UpnpActionRequest_set_ActionResult(UpnpActionRequest *p, IXML_Document *d) { ixmlDocument_free(((struct SUpnpActionRequest *)p)->m_actionResult); ((struct SUpnpActionRequest *)p)->m_actionResult = d; } const struct sockaddr *UpnpActionRequest_get_CtrlPtIPAddr(const UpnpActionRequest *p) { return (struct sockaddr *)&((struct SUpnpActionRequest *)p)->m_ctrlPtIPAddr; } void UpnpActionRequest_set_CtrlPtIPAddr(UpnpActionRequest *p, const struct sockaddr *ia) { ((struct SUpnpActionRequest *)p)->m_ctrlPtIPAddr = *(struct sockaddr_storage *)ia; } IXML_Document *UpnpActionRequest_get_SoapHeader(const UpnpActionRequest *p) { return ((struct SUpnpActionRequest *)p)->m_soapHeader; } void UpnpActionRequest_set_SoapHeader(UpnpActionRequest *p, IXML_Document *d) { ixmlDocument_free(((struct SUpnpActionRequest *)p)->m_soapHeader); ((struct SUpnpActionRequest *)p)->m_soapHeader = d; } libupnp-1.8.0~svn20100507/upnp/src/api/upnpdebug.c0000644000175000017500000001741011362564224016345 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "config.h" #include "ithread.h" #include "ixml.h" #include "upnp.h" #include "upnpdebug.h" #include #include #include #include /*! Mutex to synchronize all the log file opeartions in the debug mode */ static ithread_mutex_t GlobalDebugMutex; /*! Global log level */ static Upnp_LogLevel g_log_level = UPNP_DEFAULT_LOG_LEVEL; /*! File handle for the error log file */ static FILE *ErrFileHnd = NULL; /*! File handle for the information log file */ static FILE *InfoFileHnd = NULL; /*! Name of the error file */ static const char *errFileName = "IUpnpErrFile.txt"; /*! Name of the info file */ static const char *infoFileName = "IUpnpInfoFile.txt"; #ifdef DEBUG int UpnpInitLog(void) { ithread_mutex_init(&GlobalDebugMutex, NULL); if(DEBUG_TARGET == 1) { if((ErrFileHnd = fopen( errFileName, "a")) == NULL) { return -1; } if((InfoFileHnd = fopen( infoFileName, "a")) == NULL) { return -1; } } return UPNP_E_SUCCESS; } void UpnpSetLogLevel(Upnp_LogLevel log_level) { g_log_level = log_level; } void UpnpCloseLog(void) { if (DEBUG_TARGET == 1) { fflush(ErrFileHnd); fflush(InfoFileHnd); fclose(ErrFileHnd); fclose(InfoFileHnd); } ithread_mutex_destroy(&GlobalDebugMutex); } void UpnpSetLogFileNames( const char *ErrFileName, const char *InfoFileName) { if (ErrFileName) { errFileName = ErrFileName; } if (InfoFileName) { infoFileName = InfoFileName; } } int DebugAtThisLevel( Upnp_LogLevel DLevel, Dbg_Module Module) { int ret = DLevel <= g_log_level; ret &= DEBUG_ALL || (Module == SSDP && DEBUG_SSDP ) || (Module == SOAP && DEBUG_SOAP ) || (Module == GENA && DEBUG_GENA ) || (Module == TPOOL && DEBUG_TPOOL) || (Module == MSERV && DEBUG_MSERV) || (Module == DOM && DEBUG_DOM ) || (Module == HTTP && DEBUG_HTTP ); return ret; } void UpnpPrintf( Upnp_LogLevel DLevel, Dbg_Module Module, const char *DbgFileName, int DbgLineNo, const char *FmtStr, ...) { va_list ArgList; if (!DebugAtThisLevel(DLevel, Module)) { return; } ithread_mutex_lock(&GlobalDebugMutex); va_start(ArgList, FmtStr); if (!DEBUG_TARGET) { if (DbgFileName) { UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo); } vfprintf(stdout, FmtStr, ArgList); fflush(stdout); } else if (DLevel == 0) { if (DbgFileName) { UpnpDisplayFileAndLine(ErrFileHnd, DbgFileName, DbgLineNo); } vfprintf(ErrFileHnd, FmtStr, ArgList); fflush(ErrFileHnd); } else { if (DbgFileName) { UpnpDisplayFileAndLine(InfoFileHnd, DbgFileName, DbgLineNo); } vfprintf(InfoFileHnd, FmtStr, ArgList); fflush(InfoFileHnd); } va_end(ArgList); ithread_mutex_unlock(&GlobalDebugMutex); } FILE *GetDebugFile(Upnp_LogLevel DLevel, Dbg_Module Module) { FILE *ret; if (!DebugAtThisLevel(DLevel, Module)) { ret = NULL; } if (!DEBUG_TARGET) { ret = stdout; } else if (DLevel == 0) { ret = ErrFileHnd; } else { ret = InfoFileHnd; } return ret; } void UpnpDisplayFileAndLine( FILE *fd, const char *DbgFileName, int DbgLineNo) { #define NLINES 2 #define MAX_LINE_SIZE 512 #define NUMBER_OF_STARS 80 const char *lines[NLINES]; char buf[NLINES][MAX_LINE_SIZE]; int i; /* Initialize the pointer array */ for (i = 0; i < NLINES; i++) { lines[i] = buf[i]; } /* Put the debug lines in the buffer */ sprintf(buf[0], "DEBUG - THREAD ID: 0x%lX", #ifdef WIN32 (unsigned long int)ithread_self().p #else (unsigned long int)ithread_self() #endif ); if (DbgFileName) { sprintf(buf[1], "FILE: %s, LINE: %d", DbgFileName, DbgLineNo); } /* Show the lines centered */ UpnpDisplayBanner(fd, lines, NLINES, NUMBER_OF_STARS); fflush(fd); } void UpnpDisplayBanner( FILE * fd, const char **lines, size_t size, int starLength) { int leftMarginLength = starLength / 2 + 1; int rightMarginLength = starLength / 2 + 1; int i = 0; int LineSize = 0; int starLengthMinus2 = starLength - 2; char *leftMargin = ( char * )malloc( leftMarginLength ); char *rightMargin = ( char * )malloc( rightMarginLength ); char *stars = ( char * )malloc( starLength + 1 ); char *currentLine = ( char * )malloc( starLength + 1 ); const char *line = NULL; memset( stars, '*', starLength ); stars[starLength] = 0; memset( leftMargin, 0, leftMarginLength ); memset( rightMargin, 0, rightMarginLength ); fprintf( fd, "\n%s\n", stars ); for( i = 0; i < size; i++ ) { LineSize = strlen( lines[i] ); line = lines[i]; while( LineSize > starLengthMinus2 ) { memcpy( currentLine, line, starLengthMinus2 ); currentLine[starLengthMinus2] = 0; fprintf( fd, "*%s*\n", currentLine ); LineSize -= starLengthMinus2; line += starLengthMinus2; } leftMarginLength = (starLengthMinus2 - LineSize)/2; if( LineSize % 2 == 0 ) { rightMarginLength = leftMarginLength; } else { rightMarginLength = leftMarginLength + 1; } memset( leftMargin, ' ', leftMarginLength ); memset( rightMargin, ' ', rightMarginLength ); leftMargin[leftMarginLength] = 0; rightMargin[rightMarginLength] = 0; fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin ); } fprintf(fd, "%s\n\n", stars); free(currentLine); free(stars); free(rightMargin); free(leftMargin); } void PrintThreadPoolStats( ThreadPool *tp, const char *DbgFileName, int DbgLineNo, const char *msg) { ThreadPoolStats stats; ThreadPoolGetStats(tp, &stats); UpnpPrintf(UPNP_INFO, API, DbgFileName, DbgLineNo, "%s\n" "High Jobs pending: %d\n" "Med Jobs Pending: %d\n" "Low Jobs Pending: %d\n" "Average wait in High Q in milliseconds: %lf\n" "Average wait in Med Q in milliseconds: %lf\n" "Average wait in Low Q in milliseconds: %lf\n" "Max Threads Used: %d\n" "Worker Threads: %d\n" "Persistent Threads: %d\n" "Idle Threads: %d\n" "Total Threads: %d\n" "Total Work Time: %lf\n" "Total Idle Time: %lf\n", msg, stats.currentJobsHQ, stats.currentJobsMQ, stats.currentJobsLQ, stats.avgWaitHQ, stats.avgWaitMQ, stats.avgWaitLQ, stats.maxThreads, stats.workerThreads, stats.persistentThreads, stats.idleThreads, stats.totalThreads, stats.totalWorkTime, stats.totalIdleTime); } #endif /* DEBUG */ libupnp-1.8.0~svn20100507/upnp/src/api/StateVarRequest.c0000644000175000017500000001476011365106163017460 00000000000000 /*! * \file * * \brief UpnpStateVarRequest object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "StateVarRequest.h" #include /* for calloc(), free() */ #include /* for memset(), strlen(), strdup() */ struct SUpnpStateVarRequest { int m_errCode; int m_socket; UpnpString *m_errStr; UpnpString *m_devUDN; UpnpString *m_serviceID; UpnpString *m_stateVarName; /* Variables should be declared with struct sockaddr_storage, * but users must only see a struct sockaddr pointer */ struct sockaddr_storage m_ctrlPtIPAddr; DOMString m_currentVal; }; UpnpStateVarRequest *UpnpStateVarRequest_new() { struct SUpnpStateVarRequest *p = calloc(1, sizeof (struct SUpnpStateVarRequest)); #if 0 p->m_errCode = 0; p->m_socket = 0; #endif p->m_errStr = UpnpString_new(); p->m_devUDN = UpnpString_new(); p->m_serviceID = UpnpString_new(); p->m_stateVarName = UpnpString_new(); #if 0 memset(&q->m_ctrlPtIPAddr, 0, sizeof (struct sockaddr_storage)); p->m_currentVal = NULL; #endif return (UpnpStateVarRequest *)p; } void UpnpStateVarRequest_delete(UpnpStateVarRequest *p) { struct SUpnpStateVarRequest *q = (struct SUpnpStateVarRequest *)p; if (!q) return; q->m_errCode = 0; q->m_socket = 0; UpnpString_delete(q->m_errStr); q->m_errStr = NULL; UpnpString_delete(q->m_devUDN); q->m_devUDN = NULL; UpnpString_delete(q->m_serviceID); q->m_serviceID = NULL; UpnpString_delete(q->m_stateVarName); q->m_stateVarName = NULL; memset(&q->m_ctrlPtIPAddr, 0, sizeof (struct sockaddr_storage)); ixmlFreeDOMString(q->m_currentVal); q->m_currentVal = NULL; free(p); } UpnpStateVarRequest *UpnpStateVarRequest_dup(const UpnpStateVarRequest *p) { UpnpStateVarRequest *q = UpnpStateVarRequest_new(); UpnpStateVarRequest_assign(q, p); return q; } void UpnpStateVarRequest_assign(UpnpStateVarRequest *p, const UpnpStateVarRequest *q) { if (p != q) { UpnpStateVarRequest_set_ErrCode(p, UpnpStateVarRequest_get_ErrCode(q)); UpnpStateVarRequest_set_Socket(p, UpnpStateVarRequest_get_Socket(q)); UpnpStateVarRequest_set_ErrStr(p, UpnpStateVarRequest_get_ErrStr(q)); UpnpStateVarRequest_set_StateVarName(p, UpnpStateVarRequest_get_StateVarName(q)); UpnpStateVarRequest_set_DevUDN(p, UpnpStateVarRequest_get_DevUDN(q)); UpnpStateVarRequest_set_ServiceID(p, UpnpStateVarRequest_get_ServiceID(q)); UpnpStateVarRequest_set_CtrlPtIPAddr(p, UpnpStateVarRequest_get_CtrlPtIPAddr(q)); UpnpStateVarRequest_set_CurrentVal(p, UpnpStateVarRequest_get_CurrentVal(q)); } } int UpnpStateVarRequest_get_ErrCode(const UpnpStateVarRequest *p) { return ((struct SUpnpStateVarRequest *)p)->m_errCode; } void UpnpStateVarRequest_set_ErrCode(UpnpStateVarRequest *p, int n) { ((struct SUpnpStateVarRequest *)p)->m_errCode = n; } int UpnpStateVarRequest_get_Socket(const UpnpStateVarRequest *p) { return ((struct SUpnpStateVarRequest *)p)->m_socket; } void UpnpStateVarRequest_set_Socket(UpnpStateVarRequest *p, int n) { ((struct SUpnpStateVarRequest *)p)->m_socket = n; } const UpnpString *UpnpStateVarRequest_get_ErrStr(const UpnpStateVarRequest *p) { return ((struct SUpnpStateVarRequest *)p)->m_errStr; } const char *UpnpStateVarRequest_get_ErrStr_cstr(const UpnpStateVarRequest *p) { return UpnpString_get_String(UpnpStateVarRequest_get_ErrStr(p)); } void UpnpStateVarRequest_set_ErrStr(UpnpStateVarRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpStateVarRequest *)p)->m_errStr); ((struct SUpnpStateVarRequest *)p)->m_errStr = UpnpString_dup(s); } void UpnpStateVarRequest_strcpy_ErrStr(UpnpStateVarRequest *p, const char *s) { UpnpString_delete(((struct SUpnpStateVarRequest *)p)->m_errStr); ((struct SUpnpStateVarRequest *)p)->m_errStr = UpnpString_new(); UpnpString_set_String(((struct SUpnpStateVarRequest *)p)->m_errStr, s); } const UpnpString *UpnpStateVarRequest_get_DevUDN(const UpnpStateVarRequest *p) { return ((struct SUpnpStateVarRequest *)p)->m_devUDN; } const char *UpnpStateVarRequest_get_DevUDN_cstr(const UpnpStateVarRequest *p) { return UpnpString_get_String(UpnpStateVarRequest_get_DevUDN(p)); } void UpnpStateVarRequest_set_DevUDN(UpnpStateVarRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpStateVarRequest *)p)->m_devUDN); ((struct SUpnpStateVarRequest *)p)->m_devUDN = UpnpString_dup(s); } const UpnpString *UpnpStateVarRequest_get_ServiceID(const UpnpStateVarRequest *p) { return ((struct SUpnpStateVarRequest *)p)->m_serviceID; } const char *UpnpStateVarRequest_get_ServiceID_cstr(const UpnpStateVarRequest *p) { return UpnpString_get_String(UpnpStateVarRequest_get_ServiceID(p)); } void UpnpStateVarRequest_set_ServiceID(UpnpStateVarRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpStateVarRequest *)p)->m_serviceID); ((struct SUpnpStateVarRequest *)p)->m_serviceID = UpnpString_dup(s); } const UpnpString *UpnpStateVarRequest_get_StateVarName(const UpnpStateVarRequest *p) { return ((struct SUpnpStateVarRequest *)p)->m_stateVarName; } const char *UpnpStateVarRequest_get_StateVarName_cstr(const UpnpStateVarRequest *p) { return UpnpString_get_String(UpnpStateVarRequest_get_StateVarName(p)); } void UpnpStateVarRequest_set_StateVarName(UpnpStateVarRequest *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpStateVarRequest *)p)->m_stateVarName); ((struct SUpnpStateVarRequest *)p)->m_stateVarName = UpnpString_dup(s); } void UpnpStateVarRequest_strcpy_StateVarName(UpnpStateVarRequest *p, const char *s) { UpnpString_delete(((struct SUpnpStateVarRequest *)p)->m_errStr); ((struct SUpnpStateVarRequest *)p)->m_errStr = UpnpString_new(); UpnpString_set_String(((struct SUpnpStateVarRequest *)p)->m_errStr, s); } const struct sockaddr *UpnpStateVarRequest_get_CtrlPtIPAddr(const UpnpStateVarRequest *p) { return (struct sockaddr *)&((struct SUpnpStateVarRequest *)p)->m_ctrlPtIPAddr; } void UpnpStateVarRequest_set_CtrlPtIPAddr(UpnpStateVarRequest *p, const struct sockaddr *sa) { ((struct SUpnpStateVarRequest *)p)->m_ctrlPtIPAddr = *(struct sockaddr_storage *)sa; } const DOMString UpnpStateVarRequest_get_CurrentVal(const UpnpStateVarRequest *p) { return ((struct SUpnpStateVarRequest *)p)->m_currentVal; } const char *UpnpStateVarRequest_get_CurrentVal_cstr(const UpnpStateVarRequest *p) { return (const char *)UpnpStateVarRequest_get_CurrentVal(p); } void UpnpStateVarRequest_set_CurrentVal(UpnpStateVarRequest *p, const DOMString s) { ixmlFreeDOMString(((struct SUpnpStateVarRequest *)p)->m_currentVal); ((struct SUpnpStateVarRequest *)p)->m_currentVal = ixmlCloneDOMString(s); } libupnp-1.8.0~svn20100507/upnp/src/api/Event.c0000644000175000017500000000373211365106163015434 00000000000000 /*! * \file * * \brief UpnpEvent object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "Event.h" #include /* for calloc(), free() */ struct SUpnpEvent { int m_eventKey; IXML_Document *m_changedVariables; UpnpString *m_SID; }; UpnpEvent *UpnpEvent_new() { struct SUpnpEvent *p = calloc(1, sizeof (struct SUpnpEvent)); #if 0 p->m_eventKey = 0; p->m_changedVariables = NULL; #endif p->m_SID = UpnpString_new(); return (UpnpEvent *)p; } void UpnpEvent_delete(UpnpEvent *p) { struct SUpnpEvent *q = (struct SUpnpEvent *)p; if (!q) return; q->m_eventKey = 0; q->m_changedVariables = NULL; UpnpString_delete(q->m_SID); q->m_SID = NULL; free(p); } UpnpEvent *UpnpEvent_dup(const UpnpEvent *p) { UpnpEvent *q = UpnpEvent_new(); UpnpEvent_assign(q, p); return q; } void UpnpEvent_assign(UpnpEvent *p, const UpnpEvent *q) { if (p != q) { UpnpEvent_set_EventKey(p, UpnpEvent_get_EventKey(q)); UpnpEvent_set_ChangedVariables(p, UpnpEvent_get_ChangedVariables(q)); UpnpEvent_set_SID(p, UpnpEvent_get_SID(q)); } } int UpnpEvent_get_EventKey(const UpnpEvent *p) { return ((struct SUpnpEvent *)p)->m_eventKey; } void UpnpEvent_set_EventKey(UpnpEvent *p, int n) { ((struct SUpnpEvent *)p)->m_eventKey = n; } IXML_Document *UpnpEvent_get_ChangedVariables(const UpnpEvent *p) { return ((struct SUpnpEvent *)p)->m_changedVariables; } void UpnpEvent_set_ChangedVariables(UpnpEvent *p, IXML_Document *d) { ixmlDocument_free(((struct SUpnpEvent *)p)->m_changedVariables); ((struct SUpnpEvent *)p)->m_changedVariables = d; } const UpnpString *UpnpEvent_get_SID(const UpnpEvent *p) { return ((struct SUpnpEvent *)p)->m_SID; } const char *UpnpEvent_get_SID_cstr(const UpnpEvent *p) { return UpnpString_get_String(UpnpEvent_get_SID(p)); } void UpnpEvent_set_SID(UpnpEvent *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpEvent *)p)->m_SID); ((struct SUpnpEvent *)p)->m_SID = UpnpString_dup(s); } libupnp-1.8.0~svn20100507/upnp/src/api/StateVarComplete.c0000644000175000017500000001014011365106163017564 00000000000000 /*! * \file * * \brief UpnpStateVarComplete object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "StateVarComplete.h" #include /* for calloc(), free() */ #include /* for strlen(), strdup() */ struct SUpnpStateVarComplete { int m_errCode; UpnpString *m_ctrlUrl; UpnpString *m_stateVarName; DOMString m_currentVal; }; UpnpStateVarComplete *UpnpStateVarComplete_new() { struct SUpnpStateVarComplete *p = calloc(1, sizeof (struct SUpnpStateVarComplete)); #if 0 p->m_errCode = 0; #endif p->m_ctrlUrl = UpnpString_new(); p->m_stateVarName = UpnpString_new(); #if 0 p->m_currentVal = NULL; #endif return (UpnpStateVarComplete *)p; } void UpnpStateVarComplete_delete(UpnpStateVarComplete *p) { struct SUpnpStateVarComplete *q = (struct SUpnpStateVarComplete *)p; if (!q) return; q->m_errCode = 0; UpnpString_delete(q->m_ctrlUrl); q->m_ctrlUrl = NULL; UpnpString_delete(q->m_stateVarName); q->m_stateVarName = NULL; ixmlFreeDOMString(q->m_currentVal); q->m_currentVal = NULL; free(p); } UpnpStateVarComplete *UpnpStateVarComplete_dup(const UpnpStateVarComplete *p) { UpnpStateVarComplete *q = UpnpStateVarComplete_new(); UpnpStateVarComplete_assign(q, p); return q; } void UpnpStateVarComplete_assign(UpnpStateVarComplete *p, const UpnpStateVarComplete *q) { if (p != q) { UpnpStateVarComplete_set_ErrCode(p, UpnpStateVarComplete_get_ErrCode(q)); UpnpStateVarComplete_set_CtrlUrl(p, UpnpStateVarComplete_get_CtrlUrl(q)); UpnpStateVarComplete_set_StateVarName(p, UpnpStateVarComplete_get_StateVarName(q)); UpnpStateVarComplete_set_CurrentVal(p, UpnpStateVarComplete_get_CurrentVal(q)); } } int UpnpStateVarComplete_get_ErrCode(const UpnpStateVarComplete *p) { return ((struct SUpnpStateVarComplete *)p)->m_errCode; } void UpnpStateVarComplete_set_ErrCode(UpnpStateVarComplete *p, int n) { ((struct SUpnpStateVarComplete *)p)->m_errCode = n; } const UpnpString *UpnpStateVarComplete_get_CtrlUrl(const UpnpStateVarComplete *p) { return ((struct SUpnpStateVarComplete *)p)->m_ctrlUrl; } const char *UpnpStateVarComplete_get_CtrlUrl_cstr(const UpnpStateVarComplete *p) { return UpnpString_get_String(UpnpStateVarComplete_get_CtrlUrl(p)); } void UpnpStateVarComplete_set_CtrlUrl(UpnpStateVarComplete *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpStateVarComplete *)p)->m_ctrlUrl); ((struct SUpnpStateVarComplete *)p)->m_ctrlUrl = UpnpString_dup(s); } void UpnpStateVarComplete_strcpy_CtrlUrl(UpnpStateVarComplete *p, const char *s) { UpnpString_delete(((struct SUpnpStateVarComplete *)p)->m_ctrlUrl); ((struct SUpnpStateVarComplete *)p)->m_ctrlUrl = UpnpString_new(); UpnpString_set_String(((struct SUpnpStateVarComplete *)p)->m_ctrlUrl, s); } const UpnpString *UpnpStateVarComplete_get_StateVarName(const UpnpStateVarComplete *p) { return ((struct SUpnpStateVarComplete *)p)->m_stateVarName; } const char *UpnpStateVarComplete_get_StateVarName_cstr(const UpnpStateVarComplete *p) { return UpnpString_get_String(UpnpStateVarComplete_get_StateVarName(p)); } void UpnpStateVarComplete_set_StateVarName(UpnpStateVarComplete *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpStateVarComplete *)p)->m_stateVarName); ((struct SUpnpStateVarComplete *)p)->m_stateVarName = UpnpString_dup(s); } void UpnpStateVarComplete_strcpy_StateVarName(UpnpStateVarComplete *p, const char *s) { UpnpString_delete(((struct SUpnpStateVarComplete *)p)->m_ctrlUrl); ((struct SUpnpStateVarComplete *)p)->m_ctrlUrl = UpnpString_new(); UpnpString_set_String(((struct SUpnpStateVarComplete *)p)->m_ctrlUrl, s); } const DOMString UpnpStateVarComplete_get_CurrentVal(const UpnpStateVarComplete *p) { return ((struct SUpnpStateVarComplete *)p)->m_currentVal; } const char *UpnpStateVarComplete_get_CurrentVal_cstr(const UpnpStateVarComplete *p) { return (const char *)UpnpStateVarComplete_get_CurrentVal(p); } void UpnpStateVarComplete_set_CurrentVal(UpnpStateVarComplete *p, const DOMString s) { ixmlFreeDOMString(((struct SUpnpStateVarComplete *)p)->m_currentVal); ((struct SUpnpStateVarComplete *)p)->m_currentVal = ixmlCloneDOMString(s); } libupnp-1.8.0~svn20100507/upnp/src/api/Discovery.c0000644000175000017500000002352411365106163016323 00000000000000 /*! * \file * * \brief UpnpDiscovery object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "Discovery.h" #include /* for calloc(), free() */ #include /* for memset() */ struct SUpnpDiscovery { int m_errCode; int m_expires; UpnpString *m_deviceID; UpnpString *m_deviceType; UpnpString *m_serviceType; UpnpString *m_serviceVer; UpnpString *m_location; UpnpString *m_os; UpnpString *m_date; UpnpString *m_ext; /* Variables should be declared with struct sockaddr_storage, * but users must only see a struct sockaddr pointer */ struct sockaddr_storage m_destAddr; }; UpnpDiscovery *UpnpDiscovery_new() { struct SUpnpDiscovery *p = calloc(1, sizeof (struct SUpnpDiscovery)); #if 0 p->errCode = 0; p->m_expires = 0; #endif p->m_deviceID = UpnpString_new(); p->m_deviceType = UpnpString_new(); p->m_serviceType = UpnpString_new(); p->m_serviceVer = UpnpString_new(); p->m_location = UpnpString_new(); p->m_os = UpnpString_new(); p->m_date = UpnpString_new(); p->m_ext = UpnpString_new(); memset(&p->m_destAddr, 0, sizeof(struct sockaddr_storage)); return (UpnpDiscovery *)p; } void UpnpDiscovery_delete(UpnpDiscovery *p) { struct SUpnpDiscovery *q = (struct SUpnpDiscovery *)p; if (!q) return; q->m_errCode = 0; q->m_expires = 0; UpnpString_delete(q->m_deviceID); q->m_deviceID = NULL; UpnpString_delete(q->m_deviceType); q->m_deviceType = NULL; UpnpString_delete(q->m_serviceType); q->m_serviceType = NULL; UpnpString_delete(q->m_serviceVer); q->m_serviceVer = NULL; UpnpString_delete(q->m_location); q->m_location = NULL; UpnpString_delete(q->m_os); q->m_os = NULL; UpnpString_delete(q->m_date); q->m_date = NULL; UpnpString_delete(q->m_ext); q->m_ext = NULL; memset(&q->m_destAddr, 0, sizeof(struct sockaddr_storage)); free(p); } UpnpDiscovery *UpnpDiscovery_dup(const UpnpDiscovery *p) { UpnpDiscovery *q = UpnpDiscovery_new(); UpnpDiscovery_assign(q, p); return q; } void UpnpDiscovery_assign(UpnpDiscovery *p, const UpnpDiscovery *q) { if (p != q) { UpnpDiscovery_set_ErrCode(p, UpnpDiscovery_get_ErrCode(q)); UpnpDiscovery_set_Expires(p, UpnpDiscovery_get_Expires(q)); UpnpDiscovery_set_DeviceID(p, UpnpDiscovery_get_DeviceID(q)); UpnpDiscovery_set_DeviceType(p, UpnpDiscovery_get_DeviceType(q)); UpnpDiscovery_set_ServiceType(p, UpnpDiscovery_get_ServiceType(q)); UpnpDiscovery_set_ServiceVer(p, UpnpDiscovery_get_ServiceVer(q)); UpnpDiscovery_set_Location(p, UpnpDiscovery_get_Location(q)); UpnpDiscovery_set_Os(p, UpnpDiscovery_get_Os(q)); UpnpDiscovery_set_Date(p, UpnpDiscovery_get_Date(q)); UpnpDiscovery_set_Ext(p, UpnpDiscovery_get_Ext(q)); UpnpDiscovery_set_DestAddr(p, UpnpDiscovery_get_DestAddr(q)); } } int UpnpDiscovery_get_ErrCode(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_errCode; } void UpnpDiscovery_set_ErrCode(UpnpDiscovery *p, int n) { ((struct SUpnpDiscovery *)p)->m_errCode = n; } int UpnpDiscovery_get_Expires(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_expires; } void UpnpDiscovery_set_Expires(UpnpDiscovery *p, int n) { ((struct SUpnpDiscovery *)p)->m_expires = n; } const UpnpString *UpnpDiscovery_get_DeviceID(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_deviceID; } const char *UpnpDiscovery_get_DeviceID_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_DeviceID(p)); } void UpnpDiscovery_set_DeviceID(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_deviceID); ((struct SUpnpDiscovery *)p)->m_deviceID = UpnpString_dup(s); } void UpnpDiscovery_strcpy_DeviceID(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_deviceID); ((struct SUpnpDiscovery *)p)->m_deviceID = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_deviceID, s); } const UpnpString *UpnpDiscovery_get_DeviceType(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_deviceType; } const char *UpnpDiscovery_get_DeviceType_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_DeviceType(p)); } void UpnpDiscovery_set_DeviceType(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_deviceType); ((struct SUpnpDiscovery *)p)->m_deviceType = UpnpString_dup(s); } void UpnpDiscovery_strcpy_DeviceType(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_deviceID); ((struct SUpnpDiscovery *)p)->m_deviceID = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_deviceID, s); } const UpnpString *UpnpDiscovery_get_ServiceType(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_serviceType; } const char *UpnpDiscovery_get_ServiceType_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_ServiceType(p)); } void UpnpDiscovery_set_ServiceType(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_serviceType); ((struct SUpnpDiscovery *)p)->m_serviceType = UpnpString_dup(s); } void UpnpDiscovery_strcpy_ServiceType(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_serviceType); ((struct SUpnpDiscovery *)p)->m_serviceType = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_serviceType, s); } const UpnpString *UpnpDiscovery_get_ServiceVer(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_serviceVer; } const char *UpnpDiscovery_get_ServiceVer_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_ServiceVer(p)); } void UpnpDiscovery_set_ServiceVer(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_serviceVer); ((struct SUpnpDiscovery *)p)->m_serviceVer = UpnpString_dup(s); } void UpnpDiscovery_strcpy_ServiceVer(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_serviceVer); ((struct SUpnpDiscovery *)p)->m_serviceVer = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_serviceVer, s); } const UpnpString *UpnpDiscovery_get_Location(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_location; } const char *UpnpDiscovery_get_Location_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_Location(p)); } void UpnpDiscovery_set_Location(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_location); ((struct SUpnpDiscovery *)p)->m_location = UpnpString_dup(s); } void UpnpDiscovery_strcpy_Location(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_location); ((struct SUpnpDiscovery *)p)->m_location = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_location, s); } void UpnpDiscovery_strncpy_Location(UpnpDiscovery *p, const char *s, int n) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_location); ((struct SUpnpDiscovery *)p)->m_location = UpnpString_new(); UpnpString_set_StringN(((struct SUpnpDiscovery *)p)->m_location, s, n); } const UpnpString *UpnpDiscovery_get_Os(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_os; } const char *UpnpDiscovery_get_Os_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_Os(p)); } void UpnpDiscovery_set_Os(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_os); ((struct SUpnpDiscovery *)p)->m_os = UpnpString_dup(s); } void UpnpDiscovery_strcpy_Os(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_os); ((struct SUpnpDiscovery *)p)->m_os = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_os, s); } void UpnpDiscovery_strncpy_Os(UpnpDiscovery *p, const char *s, int n) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_os); ((struct SUpnpDiscovery *)p)->m_os = UpnpString_new(); UpnpString_set_StringN(((struct SUpnpDiscovery *)p)->m_os, s, n); } const UpnpString *UpnpDiscovery_get_Date(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_date; } const char *UpnpDiscovery_get_Date_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_Date(p)); } void UpnpDiscovery_set_Date(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_date); ((struct SUpnpDiscovery *)p)->m_date = UpnpString_dup(s); } void UpnpDiscovery_strcpy_Date(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_date); ((struct SUpnpDiscovery *)p)->m_date = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_date, s); } const UpnpString *UpnpDiscovery_get_Ext(const UpnpDiscovery *p) { return ((struct SUpnpDiscovery *)p)->m_ext; } const char *UpnpDiscovery_get_Ext_cstr(const UpnpDiscovery *p) { return UpnpString_get_String(UpnpDiscovery_get_Ext(p)); } void UpnpDiscovery_set_Ext(UpnpDiscovery *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_ext); ((struct SUpnpDiscovery *)p)->m_ext = UpnpString_dup(s); } void UpnpDiscovery_strcpy_Ext(UpnpDiscovery *p, const char *s) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_ext); ((struct SUpnpDiscovery *)p)->m_ext = UpnpString_new(); UpnpString_set_String(((struct SUpnpDiscovery *)p)->m_ext, s); } void UpnpDiscovery_strncpy_Ext(UpnpDiscovery *p, const char *s, int n) { UpnpString_delete(((struct SUpnpDiscovery *)p)->m_ext); ((struct SUpnpDiscovery *)p)->m_ext = UpnpString_new(); UpnpString_set_StringN(((struct SUpnpDiscovery *)p)->m_ext, s, n); } const struct sockaddr *UpnpDiscovery_get_DestAddr(const UpnpDiscovery *p) { return (struct sockaddr *)&((struct SUpnpDiscovery *)p)->m_destAddr; } void UpnpDiscovery_set_DestAddr(UpnpDiscovery *p, const struct sockaddr *sa) { ((struct SUpnpDiscovery *)p)->m_destAddr = *(struct sockaddr_storage *)sa; } libupnp-1.8.0~svn20100507/upnp/src/api/ActionComplete.c0000644000175000017500000000710311365106163017255 00000000000000 /*! * \file * * \brief UpnpActionComplete object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "ActionComplete.h" #include /* for calloc(), free() */ #include /* for strlen(), strdup() */ /*! * \brief Internal implementation of the UpnpActionComplete object. */ struct SUpnpActionComplete { /*! The result of the operation */ int m_errCode; /*! The control URL for service. */ UpnpString *m_ctrlUrl; /*! The DOM document describing the action. */ IXML_Document *m_actionRequest; /*! The DOM document describing the result of the action */ IXML_Document *m_actionResult; }; UpnpActionComplete *UpnpActionComplete_new() { struct SUpnpActionComplete *p = calloc(1, sizeof (struct SUpnpActionComplete)); #if 0 p->m_errCode = 0; #endif p->m_ctrlUrl = UpnpString_new(); #if 0 p->m_actionRequest = NULL; p->m_actionResult = NULL; #endif return (UpnpActionComplete *)p; } void UpnpActionComplete_delete(UpnpActionComplete *p) { struct SUpnpActionComplete *q = (struct SUpnpActionComplete *)p; if (!q) return; q->m_errCode = 0; UpnpString_delete(q->m_ctrlUrl); q->m_ctrlUrl = NULL; UpnpActionComplete_set_ActionRequest(p, NULL); UpnpActionComplete_set_ActionResult(p, NULL); free(p); } UpnpActionComplete *UpnpActionComplete_dup(const UpnpActionComplete *p) { UpnpActionComplete *q = UpnpActionComplete_new(); UpnpActionComplete_assign(q, p); return q; } void UpnpActionComplete_assign(UpnpActionComplete *p, const UpnpActionComplete *q) { if (p != q) { UpnpActionComplete_set_ErrCode(p, UpnpActionComplete_get_ErrCode(q)); UpnpActionComplete_set_CtrlUrl(p, UpnpActionComplete_get_CtrlUrl(q)); UpnpActionComplete_set_ActionRequest(p, UpnpActionComplete_get_ActionRequest(q)); UpnpActionComplete_set_ActionResult(p, UpnpActionComplete_get_ActionResult(q)); } } int UpnpActionComplete_get_ErrCode(const UpnpActionComplete *p) { return ((struct SUpnpActionComplete *)p)->m_errCode; } void UpnpActionComplete_set_ErrCode(UpnpActionComplete *p, int n) { ((struct SUpnpActionComplete *)p)->m_errCode = n; } const UpnpString *UpnpActionComplete_get_CtrlUrl(const UpnpActionComplete *p) { return ((struct SUpnpActionComplete *)p)->m_ctrlUrl; } const char *UpnpActionComplete_get_CtrlUrl_cstr(const UpnpActionComplete *p) { return UpnpString_get_String(UpnpActionComplete_get_CtrlUrl(p)); } void UpnpActionComplete_set_CtrlUrl(UpnpActionComplete *p, const UpnpString *s) { UpnpString_delete(((struct SUpnpActionComplete *)p)->m_ctrlUrl); ((struct SUpnpActionComplete *)p)->m_ctrlUrl = UpnpString_dup(s); } void UpnpActionComplete_strcpy_CtrlUrl(UpnpActionComplete *p, const char *s) { UpnpString_delete(((struct SUpnpActionComplete *)p)->m_ctrlUrl); ((struct SUpnpActionComplete *)p)->m_ctrlUrl = UpnpString_new(); UpnpString_set_String(((struct SUpnpActionComplete *)p)->m_ctrlUrl, s); } IXML_Document *UpnpActionComplete_get_ActionRequest(const UpnpActionComplete *p) { return ((struct SUpnpActionComplete *)p)->m_actionRequest; } void UpnpActionComplete_set_ActionRequest(UpnpActionComplete *p, IXML_Document *d) { ixmlDocument_free(((struct SUpnpActionComplete *)p)->m_actionRequest); ((struct SUpnpActionComplete *)p)->m_actionRequest = d; } IXML_Document *UpnpActionComplete_get_ActionResult(const UpnpActionComplete *p) { return ((struct SUpnpActionComplete *)p)->m_actionResult; } void UpnpActionComplete_set_ActionResult(UpnpActionComplete *p, IXML_Document *d) { ixmlDocument_free(((struct SUpnpActionComplete *)p)->m_actionResult); ((struct SUpnpActionComplete *)p)->m_actionResult = d; } libupnp-1.8.0~svn20100507/upnp/src/api/FileInfo.c0000644000175000017500000000676311365106163016055 00000000000000 /*! * \file * * \brief UpnpFileInfo object implementation. * * \author Marcelo Roberto Jimenez */ #include "config.h" #include "FileInfo.h" #include /* for calloc(), free() */ #include /* for strlen(), strdup() */ struct SUpnpFileInfo { off_t m_fileLength; time_t m_lastModified; int m_isDirectory; int m_isReadable; DOMString m_contentType; DOMString m_extraHeaders; }; UpnpFileInfo *UpnpFileInfo_new() { struct SUpnpFileInfo *p = calloc(1, sizeof (struct SUpnpFileInfo)); #if 0 p->m_fileLength = 0; p->m_lastModified = 0; p->m_isDirectory = 0; p->m_isReadable = 0; p->m_contentType = NULL; p->m_extraHeaders = NULL; #endif return (UpnpFileInfo *)p; } void UpnpFileInfo_delete(UpnpFileInfo *p) { struct SUpnpFileInfo *q = (struct SUpnpFileInfo *)p; if (!q) return; q->m_fileLength = 0; q->m_lastModified = 0; q->m_isDirectory = 0; q->m_isReadable = 0; ixmlFreeDOMString(q->m_contentType); q->m_contentType = NULL; ixmlFreeDOMString(q->m_extraHeaders); q->m_extraHeaders = NULL; free(p); } UpnpFileInfo *UpnpFileInfo_dup(const UpnpFileInfo *p) { UpnpFileInfo *q = UpnpFileInfo_new(); UpnpFileInfo_assign(q, p); return q; } void UpnpFileInfo_assign(UpnpFileInfo *p, const UpnpFileInfo *q) { if (p != q) { UpnpFileInfo_set_FileLength(p, UpnpFileInfo_get_FileLength(q)); UpnpFileInfo_set_LastModified(p, UpnpFileInfo_get_LastModified(q)); UpnpFileInfo_set_IsDirectory(p, UpnpFileInfo_get_IsDirectory(q)); UpnpFileInfo_set_IsReadable(p, UpnpFileInfo_get_IsReadable(q)); UpnpFileInfo_set_ContentType(p, UpnpFileInfo_get_ContentType(q)); UpnpFileInfo_set_ExtraHeaders(p, UpnpFileInfo_get_ExtraHeaders(q)); } } off_t UpnpFileInfo_get_FileLength(const UpnpFileInfo *p) { return ((struct SUpnpFileInfo *)p)->m_fileLength; } void UpnpFileInfo_set_FileLength(UpnpFileInfo *p, off_t l) { ((struct SUpnpFileInfo *)p)->m_fileLength = l; } const time_t *UpnpFileInfo_get_LastModified(const UpnpFileInfo *p) { return &((struct SUpnpFileInfo *)p)->m_lastModified; } void UpnpFileInfo_set_LastModified(UpnpFileInfo *p, const time_t *t) { ((struct SUpnpFileInfo *)p)->m_lastModified = *t; } int UpnpFileInfo_get_IsDirectory(const UpnpFileInfo *p) { return ((struct SUpnpFileInfo *)p)->m_isDirectory; } void UpnpFileInfo_set_IsDirectory(UpnpFileInfo *p, int b) { ((struct SUpnpFileInfo *)p)->m_isDirectory = b; } int UpnpFileInfo_get_IsReadable(const UpnpFileInfo *p) { return ((struct SUpnpFileInfo *)p)->m_isReadable; } void UpnpFileInfo_set_IsReadable(UpnpFileInfo *p, int b) { ((struct SUpnpFileInfo *)p)->m_isReadable = b; } const DOMString UpnpFileInfo_get_ContentType(const UpnpFileInfo *p) { return ((struct SUpnpFileInfo *)p)->m_contentType; } const char *UpnpFileInfo_get_ContentType_cstr(const UpnpFileInfo *p) { return (const char *)UpnpFileInfo_get_ContentType(p); } void UpnpFileInfo_set_ContentType(UpnpFileInfo *p, const DOMString s) { ixmlFreeDOMString(((struct SUpnpFileInfo *)p)->m_contentType); ((struct SUpnpFileInfo *)p)->m_contentType = ixmlCloneDOMString(s); } const DOMString UpnpFileInfo_get_ExtraHeaders(const UpnpFileInfo *p) { return ((struct SUpnpFileInfo *)p)->m_extraHeaders; } const char *UpnpFileInfo_get_ExtraHeaders_cstr(const UpnpFileInfo *p) { return (const char *)UpnpFileInfo_get_ExtraHeaders(p); } void UpnpFileInfo_set_ExtraHeaders(UpnpFileInfo *p, const DOMString s) { ixmlFreeDOMString(((struct SUpnpFileInfo *)p)->m_extraHeaders); ((struct SUpnpFileInfo *)p)->m_extraHeaders = ixmlCloneDOMString(s); } libupnp-1.8.0~svn20100507/upnp/src/api/upnptools.c0000644000175000017500000002775011347767013016433 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #include "config.h" /*! * \file */ #if EXCLUDE_DOM == 0 #include "upnp.h" #include "upnptools.h" #include "uri.h" #include #include /*! Maximum action header buffer length. */ #define HEADER_LENGTH 2000 /*! * \brief Structure to maintain a error code and string associated with the * error code. */ struct ErrorString { /*! Error code. */ int rc; /*! Error description. */ const char *rcError; }; /*! * \brief Array of error structures. */ struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"}, {UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"}, {UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"}, {UPNP_E_OUTOF_HANDLE, "UPNP_E_OUTOF_HANDLE"}, {UPNP_E_OUTOF_CONTEXT, "UPNP_E_OUTOF_CONTEXT"}, {UPNP_E_OUTOF_MEMORY, "UPNP_E_OUTOF_MEMORY"}, {UPNP_E_INIT, "UPNP_E_INIT"}, {UPNP_E_BUFFER_TOO_SMALL, "UPNP_E_BUFFER_TOO_SMALL"}, {UPNP_E_INVALID_DESC, "UPNP_E_INVALID_DESC"}, {UPNP_E_INVALID_URL, "UPNP_E_INVALID_URL"}, {UPNP_E_INVALID_SID, "UPNP_E_INVALID_SID"}, {UPNP_E_INVALID_DEVICE, "UPNP_E_INVALID_DEVICE"}, {UPNP_E_INVALID_SERVICE, "UPNP_E_INVALID_SERVICE"}, {UPNP_E_BAD_RESPONSE, "UPNP_E_BAD_RESPONSE"}, {UPNP_E_BAD_REQUEST, "UPNP_E_BAD_REQUEST"}, {UPNP_E_INVALID_ACTION, "UPNP_E_INVALID_ACTION"}, {UPNP_E_FINISH, "UPNP_E_FINISH"}, {UPNP_E_INIT_FAILED, "UPNP_E_INIT_FAILED"}, {UPNP_E_URL_TOO_BIG, "UPNP_E_URL_TOO_BIG"}, {UPNP_E_BAD_HTTPMSG, "UPNP_E_BAD_HTTPMSG"}, {UPNP_E_ALREADY_REGISTERED, "UPNP_E_ALREADY_REGISTERED"}, {UPNP_E_INVALID_INTERFACE, "UPNP_E_INVALID_INTERFACE"}, {UPNP_E_NETWORK_ERROR, "UPNP_E_NETWORK_ERROR"}, {UPNP_E_SOCKET_WRITE, "UPNP_E_SOCKET_WRITE"}, {UPNP_E_SOCKET_READ, "UPNP_E_SOCKET_READ"}, {UPNP_E_SOCKET_BIND, "UPNP_E_SOCKET_BIND"}, {UPNP_E_SOCKET_CONNECT, "UPNP_E_SOCKET_CONNECT"}, {UPNP_E_OUTOF_SOCKET, "UPNP_E_OUTOF_SOCKET"}, {UPNP_E_LISTEN, "UPNP_E_LISTEN"}, {UPNP_E_TIMEDOUT, "UPNP_E_TIMEDOUT"}, {UPNP_E_SOCKET_ERROR, "UPNP_E_SOCKET_ERROR"}, {UPNP_E_FILE_WRITE_ERROR, "UPNP_E_FILE_WRITE_ERROR"}, {UPNP_E_CANCELED, "UPNP_E_CANCELED"}, {UPNP_E_EVENT_PROTOCOL, "UPNP_E_EVENT_PROTOCOL"}, {UPNP_E_SUBSCRIBE_UNACCEPTED, "UPNP_E_SUBSCRIBE_UNACCEPTED"}, {UPNP_E_UNSUBSCRIBE_UNACCEPTED, "UPNP_E_UNSUBSCRIBE_UNACCEPTED"}, {UPNP_E_NOTIFY_UNACCEPTED, "UPNP_E_NOTIFY_UNACCEPTED"}, {UPNP_E_INVALID_ARGUMENT, "UPNP_E_INVALID_ARGUMENT"}, {UPNP_E_FILE_NOT_FOUND, "UPNP_E_FILE_NOT_FOUND"}, {UPNP_E_FILE_READ_ERROR, "UPNP_E_FILE_READ_ERROR"}, {UPNP_E_EXT_NOT_XML, "UPNP_E_EXT_NOT_XML"}, {UPNP_E_NO_WEB_SERVER, "UPNP_E_NO_WEB_SERVER"}, {UPNP_E_OUTOF_BOUNDS, "UPNP_E_OUTOF_BOUNDS"}, {UPNP_E_NOT_FOUND, "UPNP_E_NOT_FOUND"}, {UPNP_E_INTERNAL_ERROR, "UPNP_E_INTERNAL_ERROR"}, }; const char *UpnpGetErrorMessage(int rc) { int i; for (i = 0; i < sizeof (ErrorMessages) / sizeof (ErrorMessages[0]); ++i) { if (rc == ErrorMessages[i].rc) { return ErrorMessages[i].rcError; } } return "Unknown error code"; } /*! * \todo There is some unnecessary allocation and deallocation going on here * because of the way resolve_rel_url() was originally written and used. In the * future it would be nice to clean this up. */ int UpnpResolveURL( const char *BaseURL, const char *RelURL, char *AbsURL) { int ret = UPNP_E_SUCCESS; char *tempRel = NULL; if (RelURL == NULL) { ret = UPNP_E_INVALID_PARAM; goto ExitFunction; } tempRel = resolve_rel_url((char *)BaseURL, (char *)RelURL); if (tempRel) { strcpy(AbsURL, tempRel); free(tempRel); } else { ret = UPNP_E_INVALID_URL; } ExitFunction: return UPNP_E_SUCCESS; } /*! * \brief Adds the argument in the action request or response. * * This function creates the action request or response if it is a first * argument, otherwise it will add the argument in the document. * * \returns UPNP_E_SUCCESS if successful, otherwise the appropriate error. */ static int addToAction( /*! [in] flag to tell if the ActionDoc is for response or request. */ int response, /*! [in,out] Request or response document. */ IXML_Document **ActionDoc, /*! [in] Name of the action request or response. */ const char *ActionName, /*! [in] Service type. */ const char *ServType, /*! [in] Name of the argument. */ const char *ArgName, /*! [in] Value of the argument. */ const char *ArgValue) { char *ActBuff = NULL; IXML_Node *node = NULL; IXML_Element *Ele = NULL; IXML_Node *Txt = NULL; int rc = 0; if (ActionName == NULL || ServType == NULL) { return UPNP_E_INVALID_PARAM; } if (*ActionDoc == NULL) { ActBuff = (char *)malloc(HEADER_LENGTH); if (ActBuff == NULL) { return UPNP_E_OUTOF_MEMORY; } if (response) { sprintf(ActBuff, "\r\n", ActionName, ServType, ActionName); } else { sprintf(ActBuff, "\r\n", ActionName, ServType, ActionName); } rc = ixmlParseBufferEx(ActBuff, ActionDoc); free(ActBuff); if (rc != IXML_SUCCESS) { if (rc == IXML_INSUFFICIENT_MEMORY) { return UPNP_E_OUTOF_MEMORY; } else { return UPNP_E_INVALID_DESC; } } } if (ArgName != NULL /*&& ArgValue != NULL */) { node = ixmlNode_getFirstChild((IXML_Node *)*ActionDoc); Ele = ixmlDocument_createElement(*ActionDoc, ArgName); if(ArgValue) { Txt = ixmlDocument_createTextNode(*ActionDoc, ArgValue); ixmlNode_appendChild((IXML_Node *)Ele, Txt); } ixmlNode_appendChild(node, (IXML_Node *)Ele); } return UPNP_E_SUCCESS; } /*! * \brief Creates the action request or response from the argument list. * * \return Action request or response document if successful, otherwise * returns NULL */ static IXML_Document *makeAction( /*! [in] flag to tell if the ActionDoc is for response or request. */ int response, /*! [in] Name of the action request or response. */ const char *ActionName, /*! [in] Service type. */ const char *ServType, /*! [in] Number of arguments in the action request or response. */ int NumArg, /*! [in] pointer to the first argument. */ const char *Arg, /*! [in] Argument list. */ va_list ArgList) { const char *ArgName; const char *ArgValue; char *ActBuff; int Idx = 0; IXML_Document *ActionDoc; IXML_Node *node; IXML_Element *Ele; IXML_Node *Txt = NULL; if (ActionName == NULL || ServType == NULL) { return NULL; } ActBuff = (char *)malloc(HEADER_LENGTH); if (ActBuff == NULL) { return NULL; } if (response) { sprintf(ActBuff, "\r\n", ActionName, ServType, ActionName); } else { sprintf(ActBuff, "\r\n", ActionName, ServType, ActionName); } if (ixmlParseBufferEx(ActBuff, &ActionDoc) != IXML_SUCCESS) { free(ActBuff); return NULL; } free(ActBuff); if(ActionDoc == NULL) { return NULL; } if (NumArg > 0) { //va_start(ArgList, Arg); ArgName = Arg; for ( ; ; ) { ArgValue = va_arg(ArgList, const char *); if (ArgName != NULL) { node = ixmlNode_getFirstChild((IXML_Node *)ActionDoc); Ele = ixmlDocument_createElement(ActionDoc, ArgName); if (ArgValue) { Txt = ixmlDocument_createTextNode(ActionDoc, ArgValue); ixmlNode_appendChild((IXML_Node *)Ele, Txt); } ixmlNode_appendChild(node, (IXML_Node *)Ele); } if (++Idx < NumArg) { ArgName = va_arg(ArgList, const char *); } else { break; } } //va_end(ArgList); } return ActionDoc; } IXML_Document *UpnpMakeAction( const char *ActionName, const char *ServType, int NumArg, const char *Arg, ...) { va_list ArgList; IXML_Document *out = NULL; va_start(ArgList, Arg); out = makeAction(0, ActionName, ServType, NumArg, Arg, ArgList); va_end(ArgList); return out; } IXML_Document *UpnpMakeActionResponse( const char *ActionName, const char *ServType, int NumArg, const char *Arg, ...) { va_list ArgList; IXML_Document *out = NULL; va_start(ArgList, Arg); out = makeAction(1, ActionName, ServType, NumArg, Arg, ArgList); va_end(ArgList); return out; } int UpnpAddToAction( IXML_Document **ActionDoc, const char *ActionName, const char *ServType, const char *ArgName, const char *ArgValue) { return addToAction(0, ActionDoc, ActionName, ServType, ArgName, ArgValue); } int UpnpAddToActionResponse( IXML_Document **ActionResponse, const char *ActionName, const char *ServType, const char *ArgName, const char *ArgValue) { return addToAction(1, ActionResponse, ActionName, ServType, ArgName, ArgValue); } IXML_Document *UpnpCreatePropertySet( int NumArg, const char *Arg, ...) { va_list ArgList; int Idx = 0; char BlankDoc[] = "" ""; const char *ArgName, *ArgValue; IXML_Node *node; IXML_Element *Ele; IXML_Element *Ele1; IXML_Node *Txt; IXML_Document *PropSet; if(ixmlParseBufferEx(BlankDoc, &PropSet) != IXML_SUCCESS) { return NULL; } if (NumArg < 1) { return PropSet; } va_start(ArgList, Arg); ArgName = Arg; while (Idx++ != NumArg) { ArgValue = va_arg(ArgList, const char *); if (ArgName != NULL /*&& ArgValue != NULL */) { node = ixmlNode_getFirstChild((IXML_Node *)PropSet); Ele1 = ixmlDocument_createElement(PropSet, "e:property"); Ele = ixmlDocument_createElement(PropSet, ArgName); if (ArgValue) { Txt = ixmlDocument_createTextNode(PropSet, ArgValue); ixmlNode_appendChild((IXML_Node *)Ele, Txt); } ixmlNode_appendChild((IXML_Node *)Ele1, (IXML_Node *)Ele); ixmlNode_appendChild( node, (IXML_Node *)Ele1); } ArgName = va_arg(ArgList, const char *); } va_end(ArgList); return PropSet; } int UpnpAddToPropertySet( IXML_Document **PropSet, const char *ArgName, const char *ArgValue) { char BlankDoc[] = "" ""; IXML_Node *node; IXML_Element *Ele; IXML_Element *Ele1; IXML_Node *Txt; int rc; if (ArgName == NULL) { return UPNP_E_INVALID_PARAM; } if (*PropSet == NULL) { rc = ixmlParseBufferEx(BlankDoc, PropSet); if (rc != IXML_SUCCESS) { return UPNP_E_OUTOF_MEMORY; } } node = ixmlNode_getFirstChild((IXML_Node *)*PropSet); Ele1 = ixmlDocument_createElement(*PropSet, "e:property"); Ele = ixmlDocument_createElement(*PropSet, ArgName); if (ArgValue) { Txt = ixmlDocument_createTextNode(*PropSet, ArgValue); ixmlNode_appendChild((IXML_Node *)Ele, Txt); } ixmlNode_appendChild((IXML_Node *)Ele1, (IXML_Node *)Ele); ixmlNode_appendChild(node, (IXML_Node *)Ele1); return UPNP_E_SUCCESS; } #endif /* EXCLUDE_DOM == 0 */ libupnp-1.8.0~svn20100507/upnp/src/inc/0000777000175000017500000000000011373047472014274 500000000000000libupnp-1.8.0~svn20100507/upnp/src/inc/md5.h0000644000175000017500000000264211021325543015036 00000000000000/* MD5.H - header file for MD5C.C */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /* MD5 context. */ typedef struct { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD5_CTX; void MD5Init PROTO_LIST ((MD5_CTX *)); void MD5Update PROTO_LIST ((MD5_CTX *, unsigned char *, unsigned int)); void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *)); libupnp-1.8.0~svn20100507/upnp/src/inc/gmtdate.h0000644000175000017500000000711411021325543015775 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_UTIL_GMTDATE_H #define GENLIB_UTIL_GMTDATE_H #include #include #ifdef __cplusplus extern "C" { #endif // input: monthStr: 3-letter or full month // returns month=0..11 or -1 on failure // output: // charsRead - num chars that match the month // fullNameMatch - full name match(1) or 3-letter match(0) // int ParseMonth( IN const char* monthStr, OUT int* charsRead, OUT int* fullNameMatch ); // input: dayOfWeek: 3-letter or full day of week ("mon" etc) // returns dayOfWeek=0..6 or -1 on failure // output: // charsRead - num chars that match the month // fullNameMatch - full name match(1) or 3-letter match(0) // int ParseDayOfWeek( IN const char* dayOfWeek, OUT int* charsRead, OUT int* fullNameMatch ); // converts date to string format: RFC 1123 format: // Sun, 06 Nov 1994 08:49:37 GMT // String returned must be freed using free() function // returns NULL if date is NULL // // throws OutOfMemoryException char* DateToString( const struct tm* date ); // parses time in fmt hh:mm:ss, military fmt // returns 0 on success; -1 on error int ParseTime( const char* s, int* hour, int* minute, int* second ); // tries to parse date according to RFCs 1123, 850, or asctime() // format // params: // str - contains date/time in string format // dateTime - date and time obtained from 'str' // returns: 0 on success, -1 on error int ParseRFC850DateTime( IN const char* str, OUT struct tm* dateTime, OUT int* numCharsParsed ); int ParseRFC1123DateTime( IN const char* str, OUT struct tm* dateTime, OUT int* numCharsParsed ); int ParseAsctimeFmt( IN const char* str, OUT struct tm* dateTime, OUT int* numCharsParsed ); // parses any of these formats: 1123, 850 or asctime() int ParseDateTime( IN const char* str, OUT struct tm* dateTime, OUT int* numCharsParsed ); #ifdef __cplusplus } /* extern C */ #endif #endif /* GENLIB_UTIL_GMTDATE_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/httpparser.h0000644000175000017500000003772111025042302016544 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef GENLIB_NET_HTTP_HTTPPARSER_H #define GENLIB_NET_HTTP_HTTPPARSER_H /*! * \file */ #include "LinkedList.h" #include "membuffer.h" #include "uri.h" #include "util.h" ////// private types //////////// ////////////////////// // scanner /////////////////////// // Used to represent different types of tokens in input typedef enum // token_type_t { TT_IDENTIFIER, TT_WHITESPACE, TT_CRLF, TT_CTRL, // needed ?? TT_SEPARATOR, // ?? TT_QUOTEDSTRING, // ?? } token_type_t; typedef struct // scanner_t { membuffer* msg; // raw http msg size_t cursor; // current position in buffer xboolean entire_msg_loaded; // set this to TRUE if the entire msg is loaded in // in 'msg'; else FALSE if only partial msg in 'msg' // (default is FALSE) } scanner_t; typedef enum // parser_pos_t { POS_REQUEST_LINE, POS_RESPONSE_LINE, POS_HEADERS, POS_ENTITY, POS_COMPLETE, } parser_pos_t; #define ENTREAD_DETERMINE_READ_METHOD 1 #define ENTREAD_USING_CLEN 2 #define ENTREAD_USING_CHUNKED 3 #define ENTREAD_UNTIL_CLOSE 4 #define ENTREAD_CHUNKY_BODY 5 #define ENTREAD_CHUNKY_HEADERS 6 // end of private section ////////////////// // ################################################################################## // method in a HTTP request typedef enum // http_method_t { HTTPMETHOD_POST, HTTPMETHOD_MPOST, HTTPMETHOD_SUBSCRIBE, HTTPMETHOD_UNSUBSCRIBE, HTTPMETHOD_NOTIFY, HTTPMETHOD_GET, HTTPMETHOD_HEAD, HTTPMETHOD_MSEARCH, HTTPMETHOD_UNKNOWN, SOAPMETHOD_POST, //murari HTTPMETHOD_SIMPLEGET } http_method_t; // different types of HTTP headers #define HDR_UNKNOWN -1 #define HDR_CACHE_CONTROL 1 #define HDR_CALLBACK 2 #define HDR_CONTENT_LENGTH 3 #define HDR_CONTENT_TYPE 4 #define HDR_DATE 5 #define HDR_EXT 6 #define HDR_HOST 7 //#define HDR_IF_MODIFIED_SINCE 8 //#define HDR_IF_UNMODIFIED_SINCE 9 //#define HDR_LAST_MODIFIED 10 #define HDR_LOCATION 11 #define HDR_MAN 12 #define HDR_MX 13 #define HDR_NT 14 #define HDR_NTS 15 #define HDR_SERVER 16 #define HDR_SEQ 17 #define HDR_SID 18 #define HDR_SOAPACTION 19 #define HDR_ST 20 #define HDR_TIMEOUT 21 #define HDR_TRANSFER_ENCODING 22 #define HDR_USN 23 #define HDR_USER_AGENT 24 //Adding new header difinition//Beg_Murari #define HDR_ACCEPT 25 #define HDR_ACCEPT_ENCODING 26 #define HDR_ACCEPT_CHARSET 27 #define HDR_ACCEPT_LANGUAGE 28 #define HDR_ACCEPT_RANGE 29 #define HDR_CONTENT_ENCODING 30 #define HDR_CONTENT_LANGUAGE 31 #define HDR_CONTENT_LOCATION 32 #define HDR_CONTENT_RANGE 33 #define HDR_IF_RANGE 34 #define HDR_RANGE 35 #define HDR_TE 36 //End_Murari // status of parsing typedef enum // parse_status_t { PARSE_SUCCESS = 0, // msg was parsed successfully PARSE_INCOMPLETE, // need more data to continue PARSE_INCOMPLETE_ENTITY, // for responses that don't have length specified PARSE_FAILURE, // parse failed; check status code for details PARSE_OK, // done partial PARSE_NO_MATCH, // token not matched // private PARSE_CONTINUE_1 } parse_status_t; typedef struct // http_header_t { memptr name; // header name as a string int name_id; // header name id (for a selective group of headers only) membuffer value; // raw-value; could be multi-lined; min-length = 0 // private membuffer name_buf; } http_header_t; typedef struct // http_message_t { int initialized; // request only http_method_t method; uri_type uri; // response only http_method_t request_method; int status_code; membuffer status_msg; // fields used in both request or response messages xboolean is_request; // if TRUE, msg is a request, else response int major_version; // http major.minor version int minor_version; LinkedList headers; //NNS: dlist headers; // dlist memptr entity; // message body(entity) // private fields membuffer msg; // entire raw message char *urlbuf; // storage for url string } http_message_t; typedef struct // http_parser_t { http_message_t msg; int http_error_code; // read-only; in case of parse error, this // contains the HTTP error code (4XX or 5XX) // read-only; this is set to true if a NOTIFY request has no content-length. // used to read valid sspd notify msg. xboolean valid_ssdp_notify_hack; // private data -- don't touch parser_pos_t position; int ent_position; unsigned int content_length; int chunk_size; size_t entity_start_position; scanner_t scanner; } http_parser_t; //-------------------------------------------------- //////////////// functions ///////////////////////// //-------------------------------------------------- #ifdef __cplusplus extern "C" { #endif // __cplusplus /************************************************************************ * Function : httpmsg_init * * Parameters : * INOUT http_message_t* msg ; HTTP Message Object * * Description : Initialize and allocate memory for http message * * Return : void ; * * Note : ************************************************************************/ void httpmsg_init( INOUT http_message_t* msg ); /************************************************************************ * Function : httpmsg_destroy * * Parameters : * INOUT http_message_t* msg ; HTTP Message Object * * Description : Free memory allocated for the http message * * Return : void ; * * Note : ************************************************************************/ void httpmsg_destroy( INOUT http_message_t* msg ); /************************************************************************ * Function : httpmsg_find_hdr_str * * Parameters : * IN http_message_t* msg ; HTTP Message Object * IN const char* header_name ; Header name to be compared with * * Description : Compares the header name with the header names stored * in the linked list of messages * * Return : http_header_t* - Pointer to a header on success; * NULL on failure * * Note : ************************************************************************/ http_header_t* httpmsg_find_hdr_str( IN http_message_t* msg, IN const char* header_name ); /************************************************************************ * Function : httpmsg_find_hdr * * Parameters : * IN http_message_t* msg ; HTTP Message Object * IN int header_name_id ; Header Name ID to be compared with * OUT memptr* value ; Buffer to get the ouput to. * * Description : Finds header from a list, with the given 'name_id'. * * Return : http_header_t* - Pointer to a header on success; * * NULL on failure * * Note : ************************************************************************/ http_header_t* httpmsg_find_hdr( IN http_message_t* msg, IN int header_name_id, OUT memptr* value ); /************************************************************************ * Function: parser_request_init * * Parameters: * OUT http_parser_t* parser ; HTTP Parser object * * Description: Initializes parser object for a request * * Returns: * void ************************************************************************/ void parser_request_init( OUT http_parser_t* parser ); /************************************************************************ * Function: parser_response_init * * Parameters: * OUT http_parser_t* parser ; HTTP Parser object * IN http_method_t request_method ; Request method * * Description: Initializes parser object for a response * * Returns: * void ************************************************************************/ void parser_response_init( OUT http_parser_t* parser, IN http_method_t request_method ); /************************************************************************ * Function: parser_parse * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: The parser function. Depending on the position of the * parser object the actual parsing function is invoked * * Returns: * void ************************************************************************/ parse_status_t parser_parse(INOUT http_parser_t * parser); /************************************************************************ * Function: parser_parse_responseline * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Get HTTP Method, URL location and version information. * * Returns: * PARSE_OK * PARSE_SUCCESS * PARSE_FAILURE ************************************************************************/ parse_status_t parser_parse_responseline(INOUT http_parser_t *parser); /************************************************************************ * Function: parser_parse_headers * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Get HTTP Method, URL location and version information. * * Returns: * PARSE_OK * PARSE_SUCCESS * PARSE_FAILURE ************************************************************************/ parse_status_t parser_parse_headers(INOUT http_parser_t *parser); /************************************************************************ * Function: parser_parse_entity * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Determines method to read entity * * Returns: * PARSE_OK * PARSE_FAILURE * PARSE_COMPLETE -- no more reading to do ************************************************************************/ parse_status_t parser_parse_entity(INOUT http_parser_t *parser); /************************************************************************ * Function: parser_get_entity_read_method * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Determines method to read entity * * Returns: * PARSE_OK * PARSE_FAILURE * PARSE_COMPLETE -- no more reading to do ************************************************************************/ parse_status_t parser_get_entity_read_method( INOUT http_parser_t* parser ); /************************************************************************ * Function: parser_append * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser Object * IN const char* buf ; buffer to be appended to the parser * buffer * IN size_t buf_length ; Size of the buffer * * Description: The parser function. Depending on the position of the * parser object the actual parsing function is invoked * * Returns: * void ************************************************************************/ parse_status_t parser_append( INOUT http_parser_t* parser, IN const char* buf, IN size_t buf_length ); /************************************************************************ * Function: matchstr * * Parameters: * IN char *str ; String to be matched * IN size_t slen ; Length of the string * IN const char* fmt ; Pattern format * ... * * Description: Matches a variable parameter list with a string * and takes actions based on the data type specified. * * Returns: * PARSE_OK * PARSE_NO_MATCH -- failure to match pattern 'fmt' * PARSE_FAILURE -- 'str' is bad input ************************************************************************/ int matchstr( IN char *str, IN size_t slen, IN const char* fmt, ... ); // ==================================================== // misc functions /************************************************************************ * Function: raw_to_int * * Parameters: * IN memptr* raw_value ; Buffer to be converted * IN int base ; Base to use for conversion * * Description: Converts raw character data to long-integer value * * Returns: * int ************************************************************************/ int raw_to_int( IN memptr* raw_value, int base ); /************************************************************************ * Function: raw_find_str * * Parameters: * IN memptr* raw_value ; Buffer containg the string * IN const char* str ; Substring to be found * * Description: Find a substring from raw character string buffer * * Side effects: raw_value is transformed to lowercase. * * Returns: * int - index at which the substring is found. ************************************************************************/ int raw_find_str( IN memptr* raw_value, IN const char* str ); /************************************************************************ * Function: method_to_str * * Parameters: * IN http_method_t method ; HTTP method * * Description: A wrapper function that maps a method id to a method * nameConverts a http_method id stored in the HTTP Method * * Returns: * const char* ptr - Ptr to the HTTP Method * ************************************************************************/ const char* method_to_str( IN http_method_t method ); /*! * \brief Print the HTTP headers. */ #ifdef DEBUG void print_http_headers( /*! [in] HTTP Message object. */ http_message_t *hmsg ); #else static UPNP_INLINE void print_http_headers(http_message_t *hmsg) {} #endif #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* GENLIB_NET_HTTP_HTTPPARSER_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/uri.h0000644000175000017500000003164711360640053015161 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef GENLIB_NET_URI_H #define GENLIB_NET_URI_H /*! * \file */ #if !defined(WIN32) #include #endif #include "UpnpGlobal.h" /* for */ #include "UpnpInet.h" #include #include #include #include #include #if defined(BSD) #include #endif #include #include #ifdef WIN32 #else #include /* for inet_pton() */ #include /* for struct addrinfo */ #endif #ifdef WIN32 #define strncasecmp strnicmp #else /* Other systems have strncasecmp */ #endif #ifdef __cplusplus extern "C" { #endif #define HTTP_DATE_LENGTH 37 // length for HTTP DATE: //"DATE: Sun, 01 Jul 2000 08:15:23 GMT" #define SEPARATORS "()<>@,;:\\\"/[]?={} \t" #define MARK "-_.!~*'()" #define RESERVED ";/?:@&=+$,{}" //added {} for compatibility #define HTTP_SUCCESS 1 #define FALSE 0 #define TAB 9 #define CR 13 #define LF 10 #define SOCKET_BUFFER_SIZE 5000 enum hostType { HOSTNAME, IPv4address }; enum pathType { ABS_PATH, REL_PATH, OPAQUE_PART }; #ifdef WIN32 /* there is a conflict in windows with other symbols */ enum uriType { absolute, relative }; #else enum uriType { ABSOLUTE, RELATIVE }; #endif /*! * \brief Buffer used in parsinghttp messages, urls, etc. generally this simply * holds a pointer into a larger array. */ typedef struct TOKEN { const char *buff; size_t size; } token; /*! * \brief Represents a host port: e.g. "127.127.0.1:80" text is a token * pointing to the full string representation. */ typedef struct HOSTPORT { /*! Full host port. */ token text; /* Network Byte Order */ struct sockaddr_storage IPaddress; } hostport_type; /*! * \brief Represents a URI used in parse_uri and elsewhere */ typedef struct URI{ enum uriType type; token scheme; enum pathType path_type; token pathquery; token fragment; hostport_type hostport; } uri_type; /*! * \brief Represents a list of URLs as in the "callback" header of SUBSCRIBE * message in GENA. "char *" URLs holds dynamic memory. */ typedef struct URL_LIST { /*! */ int size; /*! All the urls, delimited by <> */ char *URLs; /*! */ uri_type *parsedURLs; } URL_list; /*! * \brief Replaces an escaped sequence with its unescaped version as in * http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs) * * Size of array is NOT checked (MUST be checked by caller) * * \note This function modifies the string. If the sequence is an escaped * sequence it is replaced, the other characters in the string are shifted * over, and NULL characters are placed at the end of the string. * * \return */ int replace_escaped( /*! [in] String of characters. */ char *in, /*! [in] Index at which to start checking the characters. */ int index, /*! [out] . */ size_t *max); /*! * \brief Copies one URL_list into another. * * This includes dynamically allocating the out->URLs field (the full string), * and the structures used to hold the parsedURLs. This memory MUST be freed * by the caller through: free_URL_list(&out). * * \return * \li HTTP_SUCCESS - On Success. * \li UPNP_E_OUTOF_MEMORY - On Failure to allocate memory. */ int copy_URL_list( /*! [in] Source URL list. */ URL_list *in, /*! [out] Destination URL list. */ URL_list *out); /*! * \brief Frees the memory associated with a URL_list. * * Frees the dynamically allocated members of of list. Does NOT free the * pointer to the list itself ( i.e. does NOT free(list)). */ void free_URL_list( /*! [in] URL list object. */ URL_list *list); /*! * \brief Function useful in debugging for printing a parsed uri. */ #ifdef DEBUG void print_uri( /*! [in] URI object to print. */ uri_type *in); #else static UPNP_INLINE void print_uri(uri_type *in) {} #endif /*! * \brief Function useful in debugging for printing a token. */ #ifdef DEBUG void print_token( /*! [in] Token object to print. */ token *in); #else static UPNP_INLINE void print_token(token * in) {} #endif /*! * \brief Compares buffer in the token object with the buffer in in2. * * \return * \li < 0, if string1 is less than string2. * \li == 0, if string1 is identical to string2 . * \li > 0, if string1 is greater than string2. */ int token_string_casecmp( /*! [in] Token object whose buffer is to be compared. */ token *in1, /*! [in] String of characters to compare with. */ char *in2); /*! * \brief Compares a null terminated string to a token (exact). * * \return * \li < 0, if string1 is less than string2. * \li == 0, if string1 is identical to string2 . * \li > 0, if string1 is greater than string2. */ int token_string_cmp( /*! [in] Token object whose buffer is to be compared. */ token *in1, /*! [in] String of characters to compare with. */ char *in2); /*! * \brief Compares two tokens. * * \return * \li < 0, if string1 is less than string2. * \li == 0, if string1 is identical to string2 . * \li > 0, if string1 is greater than string2. */ int token_cmp( /*! [in] First token object whose buffer is to be compared. */ token *in1, /*! [in] Second token object used for the comparison. */ token *in2); /*! * \brief Parses a string representing a host and port (e.g. "127.127.0.1:80" * or "localhost") and fills out a hostport_type struct with internet address * and a token representing the full host and port. * * Uses gethostbyname. */ int parse_hostport( /*! [in] String of characters representing host and port. */ const char *in, /*! [in] Sets a maximum limit. */ int max, /*! [out] Output parameter where the host and port are represented as * an internet address. */ hostport_type *out); /*! * \brief Removes http escaped characters such as: "%20" and replaces them with * their character representation. i.e. "hello%20foo" -> "hello foo". * * The input IS MODIFIED in place (shortened). Extra characters are replaced * with \b NULL. * * \return UPNP_E_SUCCESS. */ int remove_escaped_chars( /*! [in,out] String of characters to be modified. */ char *in, /*! [in,out] Size limit for the number of characters. */ size_t *size); /*! * \brief Removes ".", and ".." from a path. * * If a ".." can not be resolved (i.e. the .. would go past the root of the * path) an error is returned. * * The input IS modified in place.) * * \note Examples * char path[30]="/../hello"; * remove_dots(path, strlen(path)) -> UPNP_E_INVALID_URL * char path[30]="/./hello"; * remove_dots(path, strlen(path)) -> UPNP_E_SUCCESS, * in = "/hello" * char path[30]="/./hello/foo/../goodbye" -> * UPNP_E_SUCCESS, in = "/hello/goodbye" * * \return * \li UPNP_E_SUCCESS - On Success. * \li UPNP_E_OUTOF_MEMORY - On failure to allocate memory. * \li UPNP_E_INVALID_URL - Failure to resolve URL. */ int remove_dots( /*! [in] String of characters from which "dots" have to be removed. */ char *in, /*! [in] Size limit for the number of characters. */ size_t size); /*! * \brief resolves a relative url with a base url returning a NEW (dynamically * allocated with malloc) full url. * * If the base_url is \b NULL, then a copy of the rel_url is passed back if * the rel_url is absolute then a copy of the rel_url is passed back if neither * the base nor the rel_url are Absolute then NULL is returned. Otherwise it * tries and resolves the relative url with the base as described in * http://www.ietf.org/rfc/rfc2396.txt (RFCs explaining URIs). * * The resolution of '..' is NOT implemented, but '.' is resolved. * * \return */ char *resolve_rel_url( /*! [in] Base URL. */ char *base_url, /*! [in] Relative URL. */ char *rel_url); /*! * \brief Parses a uri as defined in http://www.ietf.org/rfc/rfc2396.txt * (RFC explaining URIs). * * Handles absolute, relative, and opaque uris. Parses into the following * pieces: scheme, hostport, pathquery, fragment (path and query are treated * as one token) * * Caller should check for the pieces they require. * * \return */ int parse_uri( /*! [in] Character string containing uri information to be parsed. */ const char *in, /*! [in] Maximum limit on the number of characters. */ int max, /*! [out] Output parameter which will have the parsed uri information. */ uri_type *out); /*! * \brief Same as parse_uri(), except that all strings are unescaped * (%XX replaced by chars). * * \note This modifies 'pathquery' and 'fragment' parts of the input. * * \return */ int parse_uri_and_unescape( /*! [in] Character string containing uri information to be parsed. */ char *in, /*! [in] Maximum limit on the number of characters. */ int max, /*! [out] Output parameter which will have the parsed uri information. */ uri_type *out); /*! * \brief * * \return */ int parse_token( /*! [in] . */ char *in, /*! [out] . */ token *out, /*! [in] . */ int max_size); /* Commented #defines, functions and typdefs */ #if 0 #define HTTP_E_BAD_URL UPNP_E_INVALID_URL #define HTTP_E_READ_SOCKET UPNP_E_SOCKET_READ #define HTTP_E_BIND_SOCKET UPNP_E_SOCKET_BIND #define HTTP_E_WRITE_SOCKET UPNP_E_SOCKET_WRITE #define HTTP_E_CONNECT_SOCKET UPNP_E_SOCKET_CONNECT #define HTTP_E_SOCKET UPNP_E_OUTOF_SOCKET #define HTTP_E_BAD_RESPONSE UPNP_E_BAD_RESPONSE #define HTTP_E_BAD_REQUEST UPNP_E_BAD_REQUEST #define HTTP_E_BAD_IP_ADDRESS UPNP_E_INVALID_URL #define RESPONSE_TIMEOUT 30 #endif #if 0 /*! * Buffer used to store data read from a socket during an http transfer in * function read_bytes. */ typedef struct SOCKET_BUFFER{ char buff[SOCKET_BUFFER_SIZE]; int size; struct SOCKET_BUFFER *next; } socket_buffer; typedef struct HTTP_HEADER { token header; token value; struct HTTP_HEADER * next; } http_header; typedef struct HTTP_STATUS_LINE{ token http_version; token status_code; token reason_phrase; } http_status; typedef struct HTTP_REQUEST_LINE { token http_version; uri_type request_uri; token method; } http_request; /*! * Represents a parsed HTTP_MESSAGE head_list is dynamically allocated */ typedef struct HTTP_MESSAGE { http_status status; http_request request; http_header * header_list; token content; } http_message; #endif #if 0 int transferHTTP( char *request, char *toSend, int toSendSize, char **out, char *Url); int transferHTTPRaw( char *toSend, int toSendSize, char **out, char *URL); /*! * \brief helper function. */ int transferHTTPparsedURL( char *request, char *toSend, int toSendSize, char **out, uri_type *URL); /*! * \brief assumes that char * out has enough space ( 38 characters) * outputs the current time in the following null terminated string: * "DATE: Sun, Jul 06 2000 08:53:01 GMT\r\n" */ void currentTmToHttpDate( char *out); int parse_http_response( char *in, http_message *out, int max_len); int parse_http_request( char *in, http_message *out, int max_len); void print_http_message( http_message *message); int search_for_header( http_message *in, char *header, token *out_value); void print_status_line( http_status *in); void print_request_line( http_request *in); int parse_http_line( char *in, int max_size); int parse_not_LWS( char *in, token *out, int max_size); int parse_LWS( char *in, int max_size); size_t write_bytes( int fd, char *bytes, size_t n, int timeout); void free_http_message( http_message *message); #endif #ifdef __cplusplus } #endif #endif /* GENLIB_NET_URI_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/unixutil.h0000644000175000017500000000404611042015421016224 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /* Unix-specific network utilities */ #ifndef GENLIB_NET_UNIXUTIL_H #define GENLIB_NET_UNIXUTIL_H #include "UpnpInet.h" #ifdef WIN32 typedef int socklen_t; #define EAFNOSUPPORT 97 #else #include #include #include #include #include #endif #endif /* GENLIB_NET_UNIXUTIL_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/gena_device.h0000644000175000017500000000531611021325543016603 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef GENA_DEVICE_H #define GENA_DEVICE_H /*! * \file */ #include "sock.h" /*! * \brief Handles a subscription request from a ctrl point. The socket is not * closed on return. */ void gena_process_subscription_request( /*! [in] Socket info of the device. */ SOCKINFO *info, /*! [in] Subscription request from the control point. */ http_message_t *request); /*! * \brief Handles a subscription renewal request from a ctrl point. * The connection is not destroyed on return. */ void gena_process_subscription_renewal_request( /*! [in] Socket info of the device. */ SOCKINFO *info, /*! [in] Subscription renewal request from the control point. */ http_message_t *request); /*! * \brief Handles a subscription cancellation request from a ctrl point. * The connection is not destroyed on return. */ void gena_process_unsubscribe_request( /*! [in] Socket info of the device. */ SOCKINFO *info, /*! [in] UNSUBSCRIBE request from the control point. */ http_message_t *request); #endif /* GENA_DEVICE_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/VirtualDir.h0000644000175000017500000000465411021325543016443 00000000000000 #ifndef VIRTUALDIR_H #define VIRTUALDIR_H /** The \b VirtualDirCallbacks structure contains the pointers to * file-related callback functions a device application can register to * virtualize URLs. */ struct VirtualDirCallbacks { /** Called by the web server to query information on a file. The callback * should return 0 on success or -1 on an error. */ VDCallback_GetInfo get_info; /** Called by the web server to open a file. The callback should return * a valid handle if the file can be opened. Otherwise, it should return * \c NULL to signify an error. */ VDCallback_Open open; /** Called by the web server to perform a sequential read from an open * file. The callback should copy \b buflen bytes from the file into * the buffer. * @return An integer representing one of the following: * \li 0: The file contains no more data (EOF). * \li > 0: A successful read of the number of bytes in the * return code. * \li < 0: An error occurred reading the file. */ VDCallback_Read read; /** Called by the web server to perform a sequential write to an open * file. The callback should write \b buflen bytes into the file from * the buffer. It should return the actual number of bytes written, * which might be less than \b buflen in the case of a write error. */ VDCallback_Write write; /** Called by the web server to move the file pointer, or offset, into * an open file. The \b origin parameter determines where to start * moving the file pointer. A value of \c SEEK_CUR moves the * file pointer relative to where it is. The \b offset parameter can * be either positive (move forward) or negative (move backward). * \c SEEK_END moves relative to the end of the file. A positive * \b offset extends the file. A negative \b offset moves backward * in the file. Finally, \c SEEK_SET moves to an absolute position in * the file. In this case, \b offset must be positive. The callback * should return 0 on a successful seek or a non-zero value on an error. */ VDCallback_Seek seek; /** Called by the web server to close a file opened via the \b open * callback. It should return 0 on success, or a non-zero value on an * error. */ VDCallback_Close close; }; typedef struct virtual_Dir_List { struct virtual_Dir_List *next; char dirName[NAME_SIZE]; } virtualDirList; #endif /* VIRTUALDIR_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/membuffer.h0000644000175000017500000002641711021325543016327 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_UTIL_MEMBUFFER_H #define GENLIB_UTIL_MEMBUFFER_H #include #include "util.h" #define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) ) #define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) ) // pointer to a chunk of memory typedef struct // memptr { char *buf; // start of memory (read/write) size_t length; // length of memory (read-only) } memptr; // maintains a block of dynamically allocated memory // note: Total length/capacity should not exceed MAX_INT typedef struct // membuffer { char *buf; // mem buffer; must not write beyond buf[length-1] (read/write) size_t length; // length of buffer (read-only) size_t capacity; // total allocated memory (read-only) size_t size_inc; // used to increase size; MUST be > 0; (read/write) // default value of size_inc #define MEMBUF_DEF_SIZE_INC 5 } membuffer; //-------------------------------------------------- //////////////// functions ///////////////////////// //-------------------------------------------------- #ifdef __cplusplus extern "C" { #endif // __cplusplus /************************************************************************ * Function : str_alloc * * Parameters : * IN const char* str ; input string object * IN size_t str_len ; input string length * * Description : Allocate memory and copy information from the input * string to the newly allocated memory. * * Return : char* ; * Pointer to the newly allocated memory. * NULL if memory cannot be allocated. * * Note : ************************************************************************/ char* str_alloc( IN const char* str, IN size_t str_len ); /************************************************************************ * Function : memptr_cmp * * Parameters : * IN memptr* m ; input memory object * IN const char* s ; constatnt string for the memory object to be * compared with * * Description : Compares characters of strings passed for number of * bytes. If equal for the number of bytes, the length of the bytes * determines which buffer is shorter. * * Return : int ; * < 0 string1 substring less than string2 substring * 0 string1 substring identical to string2 substring * > 0 string1 substring greater than string2 substring * * Note : ************************************************************************/ int memptr_cmp( IN memptr* m, IN const char* s ); /************************************************************************ * Function : memptr_cmp_nocase * * Parameters : * IN memptr* m ; input memory object * IN const char* s ; constatnt string for the memory object to be * compared with * * Description : Compares characters of 2 strings irrespective of the * case for a specific count of bytes If the character comparison * is the same the length of the 2 srings determines the shorter * of the 2 strings. * * Return : int ; * < 0 string1 substring less than string2 substring * 0 string1 substring identical to string2 substring * > 0 string1 substring greater than string2 substring * * Note : ************************************************************************/ int memptr_cmp_nocase( IN memptr* m, IN const char* s ); /************************************************************************ * Function : membuffer_set_size * * Parameters : * INOUT membuffer* m ; buffer whose size is to be modified * IN size_t new_length ; new size to which the buffer will be * modified * * Description : Increases or decreases buffer cap so that at least * 'new_length' bytes can be stored * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_OUTOF_MEMORY - On failure to allocate memory. * * Note : ************************************************************************/ int membuffer_set_size( INOUT membuffer* m, IN size_t new_length ); /************************************************************************ * Function : membuffer_init * * Parameters : * INOUT membuffer* m ; buffer to be initialized * * Description : Wrapper to membuffer_initialize(). * Set the size of the buffer to MEMBUF_DEF_SIZE_INC * Initializes m->buf to NULL, length=0 * * Return : void ; * * Note : ************************************************************************/ void membuffer_init( INOUT membuffer* m ); /************************************************************************ * Function : membuffer_destroy * * Parameters : * INOUT membuffer* m ; buffer to be destroyed * * Description : Free's memory allocated for membuffer* m. * * Return : void ; * * Note : ************************************************************************/ void membuffer_destroy( INOUT membuffer* m ); /************************************************************************ * Function : membuffer_assign * * Parameters : * INOUT membuffer* m ; buffer whose memory is to be allocated and * assigned. * IN const void* buf ; source buffer whose contents will be copied * IN size_t buf_len ; length of the source buffer * * Description : Allocate memory to membuffer* m and copy the contents * of the in parameter IN const void* buf. * * Return : int ; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * * Note : ************************************************************************/ int membuffer_assign( INOUT membuffer* m, IN const void* buf, IN size_t buf_len ); /************************************************************************ * Function : membuffer_assign_str * * Parameters : * INOUT membuffer* m ; buffer to be allocated and assigned * IN const char* c_str ; source buffer whose contents will be * copied * * Description : Wrapper function for membuffer_assign() * * Return : int ; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * * Note : ************************************************************************/ int membuffer_assign_str( INOUT membuffer* m, IN const char* c_str ); /************************************************************************ * Function : membuffer_append * * Parameters : * INOUT membuffer* m ; buffer whose memory is to be appended. * IN const void* buf ; source buffer whose contents will be * copied * IN size_t buf_len ; length of the source buffer * * Description : Invokes function to appends data from a constant buffer * to the buffer * * Return : int ; * * Note : ************************************************************************/ int membuffer_append( INOUT membuffer* m, IN const void* buf, IN size_t buf_len ); /************************************************************************ * Function : membuffer_append_str * * Parameters : * INOUT membuffer* m ; buffer whose memory is to be appended. * IN const char* c_str ; source buffer whose contents will be * copied * * Description : Invokes function to appends data from a constant string * to the buffer * * Return : int ; * * Note : ************************************************************************/ int membuffer_append_str( INOUT membuffer* m, IN const char* c_str ); /************************************************************************ * Function : membuffer_insert * * Parameters : * INOUT membuffer* m ; buffer whose memory size is to be increased * and appended. * IN const void* buf ; source buffer whose contents will be * copied * IN size_t buf_len ; size of the source buffer * int index ; index to determine the bounds while movinf the data * * Description : Allocates memory for the new data to be inserted. Does * memory management by moving the data from the existing memory to * the newly allocated memory and then appending the new data. * * Return : int ; * * Note : ************************************************************************/ int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, int index ); /************************************************************************ * Function : membuffer_delete * * Parameters : * INOUT membuffer* m ; buffer whose memory size is to be decreased * and copied to the odified location * IN int index ; index to determine bounds while moving data * IN size_t num_bytes ; number of bytes that the data needs to * shrink by * * Description : Shrink the size of the buffer depending on the current * size of the bufer and te input parameters. Move contents from the * old buffer to the new sized buffer. * * Return : void ; * * Note : ************************************************************************/ void membuffer_delete( INOUT membuffer* m, IN int index, IN size_t num_bytes ); /************************************************************************ * Function : membuffer_detach * * Parameters : * INOUT membuffer* m ; buffer to be returned and updated. * * Description : Detaches current buffer and returns it. The caller * must free the returned buffer using free(). * After this call, length becomes 0. * * Return : char* ; * a pointer to the current buffer * * Note : ************************************************************************/ char* membuffer_detach( INOUT membuffer* m ); /************************************************************************ * Function : membuffer_attach * * Parameters : * INOUT membuffer* m ; buffer to be updated * IN char* new_buf ; source buffer which will be assigned to the * buffer to be updated * IN size_t buf_len ; length of the source buffer * * Description : Free existing memory in membuffer and assign the new * buffer in its place. * * Return : void ; * * Note : 'new_buf' must be allocted using malloc or realloc so * that it can be freed using free() ************************************************************************/ void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len ); #ifdef __cplusplus } // extern "C" #endif // __cplusplus #endif // GENLIB_UTIL_H libupnp-1.8.0~svn20100507/upnp/src/inc/upnpapi.h0000644000175000017500000002027111360640052016024 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef UPNPAPI_H #define UPNPAPI_H /*! * \file */ #include "client_table.h" #include "upnp.h" #include "VirtualDir.h" /* for struct VirtualDirCallbacks */ #define MAX_INTERFACES 256 #define DEFAULT_INTERFACE 1 #define DEV_LIMIT 200 #define NUM_HANDLE 200 #define DEFAULT_MX 5 #define DEFAULT_MAXAGE 1800 #define DEFAULT_SOAP_CONTENT_LENGTH 16000 #define MAX_SOAP_CONTENT_LENGTH 32000 extern size_t g_maxContentLength; /* 30-second timeout */ #define UPNP_TIMEOUT 30 typedef enum {HND_INVALID=-1,HND_CLIENT,HND_DEVICE} Upnp_Handle_Type; /* Data to be stored in handle table for */ struct Handle_Info { /*! . */ Upnp_Handle_Type HType; /*! Callback function pointer. */ Upnp_FunPtr Callback; /*! . */ char *Cookie; /*! 0 = not installed; otherwise installed. */ int aliasInstalled; /* Device Only */ #ifdef INCLUDE_DEVICE_APIS /*! URL for the use of SSDP. */ char DescURL[LINE_SIZE]; /*! XML file path for device description. */ char DescXML[LINE_SIZE]; /* Advertisement timeout */ int MaxAge; /*! Description parsed in terms of DOM document. */ IXML_Document *DescDocument; /*! List of devices in the description document. */ IXML_NodeList *DeviceList; /*! List of services in the description document. */ IXML_NodeList *ServiceList; /*! Table holding subscriptions and URL information. */ service_table ServiceTable; /*! . */ int MaxSubscriptions; /*! . */ int MaxSubscriptionTimeOut; /*! Address family: AF_INET or AF_INET6. */ int DeviceAf; #endif /* Client only */ #ifdef INCLUDE_CLIENT_APIS /*! Client subscription list. */ ClientSubscription *ClientSubList; /*! Active SSDP searches. */ LinkedList SsdpSearchList; #endif }; extern ithread_rwlock_t GlobalHndRWLock; /*! * \brief Get handle information. * * \return HND_DEVICE, UPNP_E_INVALID_HANDLE */ Upnp_Handle_Type GetHandleInfo( /*! handle pointer (key for the client handle structure). */ int Hnd, /*! handle structure passed by this function. */ struct Handle_Info **HndInfo); #define HandleLock() HandleWriteLock() #define HandleWriteLock() \ UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a write lock"); \ ithread_rwlock_wrlock(&GlobalHndRWLock); \ UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Write lock acquired"); #define HandleReadLock() \ UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a read lock"); \ ithread_rwlock_rdlock(&GlobalHndRWLock); \ UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Read lock acquired"); #define HandleUnlock() \ UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \ ithread_rwlock_unlock(&GlobalHndRWLock); \ UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlocked rwlock"); /*! * \brief Get client handle info. * * \note The logic around the use of this function should be revised. * * \return HND_CLIENT, HND_INVALID */ Upnp_Handle_Type GetClientHandleInfo( /*! [in] client handle pointer (key for the client handle structure). */ int *client_handle_out, /*! [out] Client handle structure passed by this function. */ struct Handle_Info **HndInfo); /*! * \brief Retrieves the device handle and information of the first device of * the address family spcified. * * \return HND_DEVICE or HND_INVALID */ Upnp_Handle_Type GetDeviceHandleInfo( /*! [in] Address family. */ const int AddressFamily, /*! [out] Device handle pointer. */ int *device_handle_out, /*! [out] Device handle structure passed by this function. */ struct Handle_Info **HndInfo); extern char gIF_NAME[LINE_SIZE]; /*! INET_ADDRSTRLEN. */ extern char gIF_IPV4[22]; /*! INET6_ADDRSTRLEN. */ extern char gIF_IPV6[65]; extern int gIF_INDEX; extern unsigned short LOCAL_PORT_V4; extern unsigned short LOCAL_PORT_V6; /*! NLS uuid. */ extern Upnp_SID gUpnpSdkNLSuuid; extern TimerThread gTimerThread; extern ThreadPool gRecvThreadPool; extern ThreadPool gSendThreadPool; extern ThreadPool gMiniServerThreadPool; typedef enum { SUBSCRIBE, UNSUBSCRIBE, DK_NOTIFY, QUERY, ACTION, STATUS, DEVDESCRIPTION, SERVDESCRIPTION, MINI, RENEW } UpnpFunName; struct UpnpNonblockParam { UpnpFunName FunName; int Handle; int TimeOut; char VarName[NAME_SIZE]; char NewVal[NAME_SIZE]; char DevType[NAME_SIZE]; char DevId[NAME_SIZE]; char ServiceType[NAME_SIZE]; char ServiceVer[NAME_SIZE]; char Url[NAME_SIZE]; Upnp_SID SubsId; char *Cookie; Upnp_FunPtr Fun; IXML_Document *Header; IXML_Document *Act; struct DevDesc *Devdesc; }; extern virtualDirList *pVirtualDirList; extern struct VirtualDirCallbacks virtualDirCallback; typedef enum { WEB_SERVER_DISABLED, WEB_SERVER_ENABLED } WebServerState; #define E_HTTP_SYNTAX -6 /*! * \brief Retrieve interface information and keep it in global variables. * If NULL, we'll find the first suitable interface for operation. * * The interface must fulfill these requirements: * \li Be UP. * \li Not be LOOPBACK. * \li Support MULTICAST. * \li Have a valid IPv4 or IPv6 address. * * We'll retrieve the following information from the interface: * \li gIF_NAME -> Interface name (by input or found). * \li gIF_IPV4 -> IPv4 address (if any). * \li gIF_IPV6 -> IPv6 address (if any). * \li gIF_INDEX -> Interface index number. * * \return UPNP_E_SUCCESS on success. */ int UpnpGetIfInfo( /*! [in] Interface name (can be NULL). */ const char *IfName); /*! * \brief Initialize handle table. */ void InitHandleList(); /*! * \brief Get a free handle. * * \return On success, an integer greater than zero or UPNP_E_OUTOF_HANDLE on * failure. */ int GetFreeHandle(); /*! * \brief Free handle. * * \return UPNP_E_SUCCESS if successful or UPNP_E_INVALID_HANDLE if not */ int FreeHandle( /*! [in] Handle index. */ int Handle); void UpnpThreadDistribution(struct UpnpNonblockParam * Param); /*! * \brief This function is a timer thread scheduled by UpnpSendAdvertisement * to the send advetisement again. */ void AutoAdvertise( /*! [in] Information provided to the thread. */ void *input); /*! * \brief Get local IP address. * * Gets the ip address for the DEFAULT_INTERFACE interface which is up and not * a loopback. Assumes at most MAX_INTERFACES interfaces * * \return UPNP_E_SUCCESS if successful or UPNP_E_INIT. */ int getlocalhostname( /*! [out] IP address of the interface. */ char *out, /*! [in] Length of the output buffer. */ const int out_len); /*! * \brief Print handle info. * * \return UPNP_E_SUCCESS if successful, otherwise returns appropriate error. */ int PrintHandleInfo( /*! [in] Handle index. */ UpnpClient_Handle Hnd); extern WebServerState bWebServerState; #endif /* UPNPAPI_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/webserver.h0000644000175000017500000001222611021325543016354 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_NET_HTTP_WEBSERVER_H #define GENLIB_NET_HTTP_WEBSERVER_H #include #include "sock.h" #include "httpparser.h" #ifdef __cplusplus extern "C" { #endif struct SendInstruction { int IsVirtualFile; int IsChunkActive; int IsRangeActive; int IsTrailers; char RangeHeader[200]; off_t RangeOffset; off_t ReadSendSize; // Read from local source and send on the network. long RecvWriteSize; // Recv from the network and write into local file. //Later few more member could be added depending on the requirement. }; /************************************************************************ * Function: web_server_init * * Parameters: * none * * Description: Initilialize the different documents. Initialize the * memory for root directory for web server. Call to initialize global * XML document. Sets bWebServerState to WEB_SERVER_ENABLED * * Returns: * 0 - OK * UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here ************************************************************************/ int web_server_init(); /************************************************************************ * Function: web_server_destroy * * Parameters: * none * * Description: Release memory allocated for the global web server root * directory and the global XML document * Resets the flag bWebServerState to WEB_SERVER_DISABLED * * Returns: * void ************************************************************************/ void web_server_destroy(); /************************************************************************ * Function: web_server_set_alias * * Parameters: * alias_name: webserver name of alias; created by caller and freed by * caller (doesn't even have to be malloc()d .) * alias_content: the xml doc; this is allocated by the caller; and * freed by the web server * alias_content_length: length of alias body in bytes * last_modified: time when the contents of alias were last * changed (local time) * * Description: Replaces current alias with the given alias. To remove * the current alias, set alias_name to NULL. * * Returns: * 0 - OK * UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here ************************************************************************/ int web_server_set_alias( IN const char* alias_name, IN const char* alias_content, IN size_t alias_content_length, IN time_t last_modified); /************************************************************************ * Function: web_server_set_root_dir * * Parameters: * IN const char* root_dir ; String having the root directory for the * document * * Description: Assign the path specfied by the IN const char* root_dir * parameter to the global Document root directory. Also check for * path names ending in '/' * * Returns: * int ************************************************************************/ int web_server_set_root_dir(IN const char* root_dir); /************************************************************************ * Function: web_server_callback * * Parameters: * IN http_parser_t *parser, * INOUT http_message_t* req, * IN SOCKINFO *info * * Description: main entry point into web server; * handles HTTP GET and HEAD requests * * Returns: * void ************************************************************************/ void web_server_callback(IN http_parser_t *parser, IN http_message_t *req, INOUT SOCKINFO *info); #ifdef __cplusplus } // extern C #endif #endif // GENLIB_NET_HTTP_WEBSERVER_H libupnp-1.8.0~svn20100507/upnp/src/inc/global.h0000644000175000017500000000502011365106163015610 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef GLOBAL_H #define GLOBAL_H /* GLOBAL.H - RSAREF types and constants */ /* PROTOTYPES should be set to one if and only if the compiler supports function argument prototyping. The following makes PROTOTYPES default to 1 if it has not already been defined with C compiler flags. */ #ifndef PROTOTYPES #define PROTOTYPES 1 #endif /* POINTER defines a generic pointer type */ typedef unsigned char *POINTER; /* UINT2 defines a two byte word */ typedef unsigned short int UINT2; /* UINT4 defines a four byte word */ typedef unsigned long int UINT4; /* * PROTO_LIST is defined depending on how PROTOTYPES is defined above. * If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it * returns an empty list. */ #if PROTOTYPES #define PROTO_LIST(list) list #else #define PROTO_LIST(list) () #endif #endif /* GLOBAL_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/httpreadwrite.h0000644000175000017500000004600411021325543017237 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_NET_HTTP_HTTPREADWRITE_H #define GENLIB_NET_HTTP_HTTPREADWRITE_H #include "config.h" #include "util.h" #include "sock.h" #include "httpparser.h" // timeout in secs #define HTTP_DEFAULT_TIMEOUT 30 #ifdef __cplusplus #extern "C" { #endif int http_CancelHttpGet( IN void *Handle ); /************************************************************************ * Function: http_FixUrl * * Parameters: * IN uri_type* url; URL to be validated and fixed * OUT uri_type* fixed_url; URL after being fixed. * * Description: * Validates URL * * Returns: * UPNP_E_INVALID_URL * UPNP_E_SUCCESS ************************************************************************/ int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url ); /************************************************************************ * Function: http_FixStrUrl * * Parameters: * IN char* urlstr ; Character string as a URL * IN int urlstrlen ; Length of the character string * OUT uri_type* fixed_url ; Fixed and corrected URL * * Description: * Parses URL and then validates URL * * Returns: * UPNP_E_INVALID_URL * UPNP_E_SUCCESS ************************************************************************/ int http_FixStrUrl( IN const char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url ); /************************************************************************ * Function: http_Connect * * Parameters: * IN uri_type* destination_url; URL containing destination information * OUT uri_type *url; Fixed and corrected URL * * Description: * Gets destination address from URL and then connects to the remote end * * Returns: * socket descriptor on sucess * UPNP_E_OUTOF_SOCKET * UPNP_E_SOCKET_CONNECT on error ************************************************************************/ int http_Connect( IN uri_type* destination_url, OUT uri_type *url ); /************************************************************************ * Function: http_RecvMessage * * Parameters: * IN SOCKINFO *info; Socket information object * OUT http_parser_t* parser; HTTP parser object * IN http_method_t request_method; HTTP request method * IN OUT int* timeout_secs; time out * OUT int* http_error_code; HTTP error code returned * * Description: * Get the data on the socket and take actions based on the read data * to modify the parser objects buffer. If an error is reported while * parsing the data, the error code is passed in the http_errr_code * parameter * * Returns: * UPNP_E_BAD_HTTPMSG * UPNP_E_SUCCESS ************************************************************************/ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser, IN http_method_t request_method, IN OUT int* timeout_secs, OUT int* http_error_code ); /************************************************************************ * Function: http_SendMessage * * Parameters: * IN SOCKINFO *info ; Socket information object * IN OUT int * TimeOut ; time out value * IN const char* fmt, ... Pattern format to take actions upon * * Description: * Sends a message to the destination based on the * IN const char* fmt parameter * fmt types: * 'f': arg = const char * file name * 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length * E.g.: * char *buf = "POST /xyz.cgi http/1.1\r\n\r\n"; * char *filename = "foo.dat"; * int status = http_SendMessage( tcpsock, "mf", * buf, strlen(buf), // args for memory buffer * filename ); // arg for file * * Returns: * UPNP_E_OUTOF_MEMORY * UPNP_E_FILE_READ_ERROR * UPNP_E_SUCCESS ************************************************************************/ int http_SendMessage( IN SOCKINFO *info, IN OUT int* timeout_secs, IN const char* fmt, ... ); /************************************************************************ * Function: http_RequestAndResponse * * Parameters: * IN uri_type* destination; Destination URI object which contains * remote IP address among other elements * IN const char* request; Request to be sent * IN size_t request_length; Length of the request * IN http_method_t req_method; HTTP Request method * IN int timeout_secs; time out value * OUT http_parser_t* response; Parser object to receive the repsonse * * Description: * Initiates socket, connects to the destination, sends a * request and waits for the response from the remote end * * Returns: * UPNP_E_SOCKET_ERROR * UPNP_E_SOCKET_CONNECT * Error Codes returned by http_SendMessage * Error Codes returned by http_RecvMessage ************************************************************************/ int http_RequestAndResponse( IN uri_type* destination, IN const char* request, IN size_t request_length, IN http_method_t req_method, IN int timeout_secs, OUT http_parser_t* response ); /************************************************************************ * return codes: * 0 -- success * UPNP_E_OUTOF_MEMORY * UPNP_E_TIMEDOUT * UPNP_E_BAD_REQUEST * UPNP_E_BAD_RESPONSE * UPNP_E_INVALID_URL * UPNP_E_SOCKET_READ * UPNP_E_SOCKET_WRITE ************************************************************************/ /************************************************************************ * Function: http_Download * * Parameters: * IN const char* url_str; String as a URL * IN int timeout_secs; time out value * OUT char** document; buffer to store the document extracted * from the donloaded message. * OUT int* doc_length; length of the extracted document * OUT char* content_type; Type of content * * Description: * Download the document message and extract the document * from the message. * * Return: int * UPNP_E_SUCCESS * UPNP_E_INVALID_URL ************************************************************************/ int http_Download( IN const char* url, IN int timeout_secs, OUT char** document, OUT int* doc_length, OUT char* content_type ); /************************************************************************ * Function: http_WriteHttpPost * * Parameters: * IN void *Handle: Handle to the http post object * IN char *buf: Buffer to send to peer, if format used * is not UPNP_USING_CHUNKED, * IN unsigned int *size: Size of the data to be sent. * IN int timeout: time out value * * Description: * Formats data if format used is UPNP_USING_CHUNKED. * Writes data on the socket connected to the peer. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Parameter * -1 - On Socket Error. ************************************************************************/ int http_WriteHttpPost(IN void *Handle, IN char *buf, IN unsigned int *size, IN int timeout); /************************************************************************ * Function: http_CloseHttpPost * * Parameters: * IN void *Handle; Handle to the http post object * IN OUT int *httpStatus; HTTP status returned on receiving a * response message * IN int timeout; time out value * * Description: * Sends remaining data if using UPNP_USING_CHUNKED * format. Receives any more messages. Destroys socket and any socket * associated memory. Frees handle associated with the HTTP POST msg. * * Return: int * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter ************************************************************************/ int http_CloseHttpPost(IN void *Handle, IN OUT int *httpStatus, IN int timeout); /************************************************************************ * Function: http_OpenHttpPost * * Parameters: * IN const char *url_str; String as a URL * IN OUT void **Handle; Pointer to buffer to store HTTP * post handle * IN const char *contentType; Type of content * IN int contentLength; length of content * IN int timeout; time out value * * Description: * Makes the HTTP POST message, connects to the peer, * sends the HTTP POST request. Adds the post handle to buffer of * such handles * * Return : int; * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_SOCKET_CONNECT ************************************************************************/ int http_OpenHttpPost(IN const char *url_str, IN OUT void **Handle, IN const char *contentType, IN int contentLength, IN int timeout); /************************************************************************ * Function: http_ReadHttpGet * * Parameters: * IN void *Handle; Handle to the HTTP get object * IN OUT char *buf; Buffer to get the read and parsed data * IN OUT unsigned int *size; Size of the buffer passed * IN int timeout; time out value * * Description: * Parses already existing data, then gets new data. * Parses and extracts information from the new data. * * Return: int * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter * UPNP_E_BAD_RESPONSE * UPNP_E_BAD_HTTPMSG * UPNP_E_CANCELED ************************************************************************/ int http_ReadHttpGet( IN void *Handle, IN OUT char *buf, IN OUT unsigned int *size, IN int timeout); /************************************************************************ * Function: http_HttpGetProgress * * Parameters: * IN void *Handle; Handle to the HTTP get object * OUT unsigned int *length; Buffer to get the read and parsed data * OUT unsigned int *total; Size of tge buffer passed * * Description: * Extracts information from the Handle to the HTTP get object. * * Return: int * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter ************************************************************************/ int http_HttpGetProgress( IN void *Handle, OUT unsigned int *length, OUT unsigned int *total ); /************************************************************************ * Function: http_CloseHttpGet * * Parameters: * IN void *Handle; Handle to HTTP get object * * Description: * Clears the handle allocated for the HTTP GET operation * Clears socket states and memory allocated for socket operations. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Parameter ************************************************************************/ int http_CloseHttpGet(IN void *Handle); /************************************************************************ * Function: http_OpenHttpGet * * Parameters: * IN const char *url_str: String as a URL * IN OUT void **Handle: Pointer to buffer to store HTTP * post handle * IN OUT char **contentType: Type of content * OUT int *contentLength: length of content * OUT int *httpStatus: HTTP status returned on receiving a * response message * IN int timeout: time out value * * Description: * Makes the HTTP GET message, connects to the peer, * sends the HTTP GET request, gets the response and parses the * response. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Paramters * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_BAD_RESPONSE ************************************************************************/ int http_OpenHttpGet( IN const char *url_str, IN OUT void **Handle, IN OUT char **contentType, OUT int *contentLength, OUT int *httpStatus, IN int timeout); /************************************************************************ * Function: http_OpenHttpGetProxy * * Parameters: * IN const char *url_str; String as a URL * IN const char *proxy_str; String as a URL * IN OUT void **Handle; Pointer to buffer to store HTTP * post handle * IN OUT char **contentType; Type of content * OUT int *contentLength; length of content * OUT int *httpStatus; HTTP status returned on receiving a * response message * IN int timeout: time out value * * Description: * Makes the HTTP GET message, connects to the peer, * sends the HTTP GET request, gets the response and parses the response. * If a proxy URL is defined then the connection is made there. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Paramters * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_BAD_RESPONSE ************************************************************************/ int http_OpenHttpGetProxy(IN const char *url_str, IN const char *proxy_str, IN OUT void **Handle, IN OUT char **contentType, OUT int *contentLength, OUT int *httpStatus, IN int timeout); /************************************************************************ * Function: http_SendStatusResponse * * Parameters: * IN SOCKINFO *info; Socket information object * IN int http_status_code; error code returned while making * or sending the response message * IN int request_major_version; request major version * IN int request_minor_version; request minor version * * Description: * Generate a response message for the status query and send the * status response. * * Return: int * 0 -- success * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_WRITE * UPNP_E_TIMEDOUT ************************************************************************/ int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code, IN int request_major_version, IN int request_minor_version ); /************************************************************************ * Function: http_MakeMessage * * Parameters: * INOUT membuffer* buf; buffer with the contents of the * message * IN int http_major_version; HTTP major version * IN int http_minor_version; HTTP minor version * IN const char* fmt; Pattern format * ...; * * Description: * Generate an HTTP message based on the format that is specified * in the input parameters. * * fmt types: * 'B': arg = int status_code * appends content-length, content-type and HTML body * for given code * 'b': arg1 = const char* buf; * arg2 = size_t buf_length memory ptr * 'C': (no args) appends a HTTP CONNECTION: close header * depending on major,minor version * 'c': (no args) appends CRLF "\r\n" * 'D': (no args) appends HTTP DATE: header * 'd': arg = int number // appends decimal number * 'G': arg = range information // add range header * 'h': arg = off_t number // appends off_t number * 'K': (no args) // add chunky header * 'N': arg1 = off_t content_length // content-length header * 'q': arg1 = http_method_t // request start line and HOST header * arg2 = (uri_type *) * 'Q': arg1 = http_method_t; // start line of request * arg2 = char* url; * arg3 = size_t url_length * 'R': arg = int status_code // adds a response start line * 'S': (no args) appends HTTP SERVER: header * 's': arg = const char* C_string * 'T': arg = char * content_type; format * e.g: "text/html"; content-type header * 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt * 'U': (no args) appends HTTP USER-AGENT: header * 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent * * Return: int * 0 - On Success * UPNP_E_OUTOF_MEMORY * UPNP_E_INVALID_URL ************************************************************************/ int http_MakeMessage( INOUT membuffer* buf, IN int http_major_version, IN int http_minor_version, IN const char* fmt, ... ); /************************************************************************ * Function: http_CalcResponseVersion * * Parameters: * IN int request_major_vers; Request major version * IN int request_minor_vers; Request minor version * OUT int* response_major_vers; Response mojor version * OUT int* response_minor_vers; Response minor version * * Description: * Calculate HTTP response versions based on the request versions. * * Return: void ************************************************************************/ void http_CalcResponseVersion( IN int request_major_vers, IN int request_minor_vers, OUT int* response_major_vers, OUT int* response_minor_vers ); /************************************************************************ * Function: http_OpenHttpGetEx * * Parameters: * IN const char *url_str; String as a URL * IN OUT void **Handle; Pointer to buffer to store HTTP * post handle * IN OUT char **contentType; Type of content * OUT int *contentLength; length of content * OUT int *httpStatus; HTTP status returned on receiving a * response message * IN int timeout; time out value * * Description: * Makes the HTTP GET message, connects to the peer, * sends the HTTP GET request, gets the response and parses the * response. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Paramters * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_BAD_RESPONSE ************************************************************************/ int http_OpenHttpGetEx(IN const char *url_str, IN OUT void **Handle, IN OUT char **contentType, OUT int *contentLength, OUT int *httpStatus, IN int lowRange, IN int highRange, IN int timeout); /************************************************************************ * Function: get_sdk_info * * Parameters: * OUT char *info; buffer to store the operating system information * * Description: * Returns the server information for the operating system * * Return: * UPNP_INLINE void ************************************************************************/ void get_sdk_info( OUT char *info ); #ifdef __cplusplus } // #extern "C" #endif #endif // GENLIB_NET_HTTP_HTTPREADWRITE_H libupnp-1.8.0~svn20100507/upnp/src/inc/config.h0000644000175000017500000002522211042015421015607 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef INTERNAL_CONFIG_H #define INTERNAL_CONFIG_H #include "autoconfig.h" /*! * \name Compile time configuration options * * The Linux SDK for UPnP Devices contains some compile-time parameters * that effect the behavior of the SDK. All configuration options are * located in {\tt src/inc/config.h}. * * @{ */ /*! * \name THREAD_IDLE_TIME * * The {\tt THREAD_IDLE_TIME} constant determines when a thread will be * removed from the thread pool and returned to the operating system. When * a thread in the thread pool has been idle for this number of milliseconds * the thread will be released from the thread pool. The default value is * 5000 milliseconds (5 seconds). * * @{ */ #define THREAD_IDLE_TIME 5000 /* @} */ /*! * \name JOBS_PER_THREAD * * The {\tt JOBS_PER_THREAD} constant determines when a new thread will be * allocated to the thread pool inside the SDK. The thread pool will * try and maintain this jobs/thread ratio. When the jobs/thread ratio * becomes greater than this, then a new thread (up to the max) will be * allocated to the thread pool. The default ratio is 10 jobs/thread. * * @{ */ #define JOBS_PER_THREAD 10 /* @} */ /*! * \name MIN_THREADS * * The {\tt MIN_THREADS} constant defines the minimum number of threads the * thread pool inside the SDK will create. The thread pool will * always have this number of threads. These threads are used * for both callbacks into applications built on top of the SDK and also * for making connections to other control points and devices. This number * includes persistent threads. The default value is two threads. * * @{ */ #define MIN_THREADS 2 /* @} */ /*! * \name MAX_THREADS * * The {\tt MAX_THREADS} constant defines the maximum number of threads the * thread pool inside the SDK will create. These threads are used * for both callbacks into applications built on top of the library and also * for making connections to other control points and devices. It is not * recommended that this value be below 10, since the threads are * necessary for correct operation. This value can be increased for greater * performance in operation at the expense of greater memory overhead. The * default value is 12. * * @{ */ #define MAX_THREADS 12 /* @} */ /*! \name MAX_JOBS_TOTAL * * The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs * that can be queued. If this limit is reached further jobs will be thrown * to avoid memory exhaustion. The default value 100. * (Added by Axis.) * * @{ */ #define MAX_JOBS_TOTAL 100 /* @} */ /*! * \name DEFAULT_SOAP_CONTENT_LENGTH * * SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes. * This prevents devices that have a misbehaving web server to send * a large amount of data to the control point causing it to crash. * This can be adjusted dynamically with {\tt UpnpSetMaxContentLength}. * * @{ */ #define DEFAULT_SOAP_CONTENT_LENGTH 16000 /* @} */ /*! * \name NUM_SSDP_COPY * * This configuration parameter determines how many copies of each SSDP * advertisement and search packets will be sent. By default it will send two * copies of every packet. * * @{ */ #define NUM_SSDP_COPY 2 /* @} */ /*! * \name SSDP_PAUSE * * This configuration parameter determines the pause between identical SSDP * advertisement and search packets. The pause is measured in milliseconds * and defaults to 100. * * @{ */ #define SSDP_PAUSE 100 /* @} */ /*! * \name WEB_SERVER_BUF_SIZE * * This configuration parameter sets the maximum buffer size for the * webserver. The default value is 1MB. * * @{ */ #define WEB_SERVER_BUF_SIZE (1024*1024) /* @} */ /*! * \name AUTO_RENEW_TIME * * The {\tt AUTO_RENEW_TIME} is the time, in seconds, before a subscription * expires that the SDK automatically resubscribes. The default * value is 10 seconds. Setting this value too low can result in the * subscription renewal not making it to the device in time, causing the * subscription to timeout. In order to avoid continually resubscribing * the minimum subscription time is five seconds more than the auto renew * time. * * @{ */ #define AUTO_RENEW_TIME 10 /* @} */ /*! * \name CP_MINIMUM_SUBSCRIPTION_TIME * * The {\tt CP_MINIMUM_SUBSCRIPTION_TIME} is the minimum subscription time * allowed for a control point using the SDK. Subscribing for less than * this time automatically results in a subscription for this amount. The * default value is 5 seconds more than the {\tt AUTO_RENEW_TIME}, or 15 * seconds. * * @{ */ #define CP_MINIMUM_SUBSCRIPTION_TIME (AUTO_RENEW_TIME + 5) /* @} */ /*! * \name MAX_SEARCH_TIME * * The {\tt MAX_SEARCH_TIME} is the maximum time * allowed for an SSDP search by a control point. Searching for greater than * this time automatically results in a search for this amount. The default * value is 80 seconds. * * @{ */ #define MAX_SEARCH_TIME 80 /* @} */ /*! * \name MIN_SEARCH_TIME * * The {\tt MIN_SEARCH_TIME} is the minimumm time * allowed for an SSDP search by a control point. Searching for less than * this time automatically results in a search for this amount. The default * value is 2 seconds. * * @{ */ #define MIN_SEARCH_TIME 2 /* @} */ /*! * \name AUTO_ADVERTISEMENT_TIME * * The {\tt AUTO_ADVERTISEMENT_TIME} is the time, in seconds, before an * device advertisements expires before a renewed advertisement is sent. * The default time is 30 seconds. * * @{ */ #define AUTO_ADVERTISEMENT_TIME 30 /* @} */ /*! * \name SSDP_PACKET_DISTRIBUTE * * The {\tt SSDP_PACKET_DISTRIBUTE} enables the SSDP packets to be sent * at an interval equal to half of the expiration time of SSDP packets * minus the AUTO_ADVERTISEMENT_TIME. This is used to increase * the probability of SSDP packets reaching to control points. * It is recommended that this flag be turned on for embedded wireless * devices. * * @{ */ #define SSDP_PACKET_DISTRIBUTE 1 /* @} */ /*! * \name Module Exclusion * * Depending on the requirements, the user can selectively discard any of * the major modules like SOAP, GENA, SSDP or the Internal web server. By * default everything is included inside the SDK. By setting any of * the values below to 0, that component will not be included in the final * SDK. * \begin{itemize} * \item {\tt EXCLUDE_SOAP[0,1]} * \item {\tt EXCLUDE_GENA[0,1]} * \item {\tt EXCLUDE_SSDP[0,1]} * \item {\tt EXCLUDE_DOM [0,1]} * \item {\tt EXCLUDE_MINISERVER[0,1]} * \item {\tt EXCLUDE_WEB_SERVER[0,1]} * \item {\tt EXCLUDE_JNI[0,1]} * \end{itemize} * * @{ */ #define EXCLUDE_SSDP 0 #define EXCLUDE_SOAP 0 #define EXCLUDE_GENA 0 #define EXCLUDE_DOM 0 #define EXCLUDE_MINISERVER 0 #define EXCLUDE_WEB_SERVER 0 #ifdef USE_JNI # define EXCLUDE_JNI 0 #else # define EXCLUDE_JNI 1 #endif /* @} */ /*! * \name DEBUG_TARGET * * The user has the option to redirect the library output debug messages * to either the screen or to a log file. All the output messages with * debug level 0 will go to {\tt upnp.err} and messages with debug level * greater than zero will be redirected to {\tt upnp.out}. * * @{ */ #define DEBUG_TARGET 1 /* @} */ /*! * \name Other debugging features * * The UPnP SDK contains other features to aid in debugging: * see */ #define DEBUG_ALL 1 #define DEBUG_SSDP 0 #define DEBUG_SOAP 0 #define DEBUG_GENA 0 #define DEBUG_TPOOL 0 #define DEBUG_MSERV 0 #define DEBUG_DOM 0 #define DEBUG_HTTP 0 #define DEBUG_API 0 /* * @} Compile time configuration options */ /*************************************************************************** * Do not change, Internal purpose only!!! ***************************************************************************/ /*! * @{ */ /* * Set additional defines based on requested configuration */ /* configure --enable-client */ #if UPNP_HAVE_CLIENT # define INCLUDE_CLIENT_APIS 1 #endif /* configure --enable-device */ #if UPNP_HAVE_DEVICE # define INCLUDE_DEVICE_APIS 1 #endif /* configure --enable-webserver --enable-device */ #if UPNP_HAVE_WEBSERVER # define INTERNAL_WEB_SERVER 1 #endif #undef EXCLUDE_WEB_SERVER #undef EXCLUDE_MINISERVER #ifdef INTERNAL_WEB_SERVER # define EXCLUDE_WEB_SERVER 0 # define EXCLUDE_MINISERVER 0 #else # define EXCLUDE_WEB_SERVER 1 # define EXCLUDE_MINISERVER 1 #endif #if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1 # undef EXCLUDE_MINISERVER # define EXCLUDE_MINISERVER 1 # if INTERNAL_WEB_SERVER # error "conflicting settings: use configure --disable-webserver" # endif #endif #if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0 # undef EXCLUDE_MINISERVER # define EXCLUDE_MINISERVER 0 # if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER # error "conflicting settings : use configure --enable-webserver" # endif #endif #ifdef INCLUDE_CLIENT_APIS # define CLIENTONLY(x) x #else /* INCLUDE_CLIENT_APIS */ # define CLIENTONLY(x) #endif /* INCLUDE_CLIENT_APIS */ /* * @} */ #endif /* INTERNAL_CONFIG_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/miniserver.h0000644000175000017500000000763411021325543016542 00000000000000/************************************************************************ * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ************************************************************************/ #ifndef MINISERVER_H #define MINISERVER_H #include "sock.h" #include "httpparser.h" extern SOCKET gMiniServerStopSock; typedef struct MServerSockArray { /* socket for listening for miniserver requests */ SOCKET miniServerSock4; SOCKET miniServerSock6; /* socket for stopping miniserver */ SOCKET miniServerStopSock; /* socket for incoming advertisments and search requests */ SOCKET ssdpSock4; SOCKET ssdpSock6; SOCKET stopPort; SOCKET miniServerPort4; SOCKET miniServerPort6; /* socket for sending search requests and receiving search replies */ CLIENTONLY(SOCKET ssdpReqSock4;) CLIENTONLY(SOCKET ssdpReqSock6;) } MiniServerSockArray; typedef void (*MiniServerCallback)( IN http_parser_t *parser, IN http_message_t* request, IN SOCKINFO *info ); #ifdef __cplusplus extern "C" { #endif /*! * \brief Set HTTP Get Callback. */ void SetHTTPGetCallback( /*! [in] HTTP Callback to be invoked . */ MiniServerCallback callback); /*! * \brief Set SOAP Callback. */ #ifdef INCLUDE_DEVICE_APIS void SetSoapCallback( /*! [in] SOAP Callback to be invoked . */ MiniServerCallback callback); #else /* INCLUDE_DEVICE_APIS */ static inline void SetSoapCallback(MiniServerCallback callback) {} #endif /* INCLUDE_DEVICE_APIS */ /*! * \brief Set GENA Callback. */ void SetGenaCallback( /*! [in] GENA Callback to be invoked. */ MiniServerCallback callback); /*! * \brief Initialize the sockets functionality for the Miniserver. * * Initialize a thread pool job to run the MiniServer and the job to the * thread pool. * * If listen port is 0, port is dynamically picked. * * Use timer mechanism to start the MiniServer, failure to meet the * allowed delay aborts the attempt to launch the MiniServer. * * \return * \li On success: UPNP_E_SUCCESS. * \li On error: UPNP_E_XXX. */ int StartMiniServer( /*! [in,out] Port on which the server listens for incoming IPv4 connections. */ unsigned short *listen_port4, /*! [in,out] Port on which the server listens for incoming IPv6 connections. */ unsigned short *listen_port6); /*! * \brief Stop and Shutdown the MiniServer and free socket resources. * * \return Always returns 0. */ int StopMiniServer(); #ifdef __cplusplus } /* extern C */ #endif #endif /* MINISERVER_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/gena.h0000644000175000017500000002552211025042302015256 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef GENA_H #define GENA_H /*! * \file */ #include "config.h" #include #include #include "client_table.h" #include "httpparser.h" #include "miniserver.h" #include "service_table.h" #include "sock.h" #include "ThreadPool.h" #include "upnp.h" #include "UpnpString.h" #include "uri.h" #ifdef __cplusplus #define EXTERN_C extern "C" #else /* __cplusplus */ #ifndef EXTERN_C #define EXTERN_C #endif /* EXTERN_C */ #endif /* __cplusplus */ /*! * \brief XML version comment. Not used because it is not interopeable with * other UPnP vendors. */ #define XML_VERSION "\n" #define XML_PROPERTYSET_HEADER \ "\n" #define UNABLE_MEMORY "HTTP/1.1 500 Internal Server Error\r\n\r\n" #define UNABLE_SERVICE_UNKNOWN "HTTP/1.1 404 Not Found\r\n\r\n" #define UNABLE_SERVICE_NOT_ACCEPT "HTTP/1.1 503 Service Not Available\r\n\r\n" #define NOT_IMPLEMENTED "HTTP/1.1 501 Not Implemented\r\n\r\n" #define BAD_REQUEST "HTTP/1.1 400 Bad Request\r\n\r\n" #define INVALID_NT BAD_CALLBACK #define BAD_CALLBACK "HTTP/1.1 412 Precondition Failed\r\n\r\n" #define HTTP_OK_CRLF "HTTP/1.1 200 OK\r\n\r\n" #define HTTP_OK_STR "HTTP/1.1 200 OK\r\n" #define INVALID_SID BAD_CALLBACK #define MISSING_SID BAD_CALLBACK #define MAX_CONTENT_LENGTH 20 #define MAX_SECONDS 10 #define MAX_EVENTS 20 #define MAX_PORT_SIZE 10 #define GENA_E_BAD_RESPONSE UPNP_E_BAD_RESPONSE #define GENA_E_BAD_SERVICE UPNP_E_INVALID_SERVICE #define GENA_E_SUBSCRIPTION_UNACCEPTED UPNP_E_SUBSCRIBE_UNACCEPTED #define GENA_E_BAD_SID UPNP_E_INVALID_SID #define GENA_E_UNSUBSCRIBE_UNACCEPTED UPNP_E_UNSUBSCRIBE_UNACCEPTED #define GENA_E_NOTIFY_UNACCEPTED UPNP_E_NOTIFY_UNACCEPTED #define GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB -9 #define GENA_E_BAD_HANDLE UPNP_E_INVALID_HANDLE #define XML_ERROR -5 #define XML_SUCCESS UPNP_E_SUCCESS #define GENA_SUCCESS UPNP_E_SUCCESS #define CALLBACK_SUCCESS 0 #define DEFAULT_TIMEOUT 1801 extern ithread_mutex_t GlobalClientSubscribeMutex; /*! * \brief Locks the subscription. */ #define SubscribeLock() \ UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ "Trying Subscribe Lock"); \ ithread_mutex_lock(&GlobalClientSubscribeMutex); \ UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ "Subscribe Lock"); /*! * \brief Unlocks the subscription. */ #define SubscribeUnlock() \ UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ "Trying Subscribe UnLock"); \ ithread_mutex_unlock(&GlobalClientSubscribeMutex); \ UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ "Subscribe UnLock"); /*! * Structure to send NOTIFY message to all subscribed control points */ typedef struct NOTIFY_THREAD_STRUCT { char *headers; DOMString propertySet; char *servId; char *UDN; Upnp_SID sid; int eventKey; int *reference_count; UpnpDevice_Handle device_handle; } notify_thread_struct; /*! * \brief This is the callback function called by the miniserver to handle * incoming GENA requests. * * \return UPNP_E_SUCCESS if successful, otherwise appropriate error code. */ EXTERN_C void genaCallback( /*! [in] represents the parse state of the request */ http_parser_t *parser, /*! [in] HTTP message containing GENA request */ http_message_t* request, /*! [in,out] Structure containing information about the socket */ SOCKINFO *info); /*! * \brief This function subscribes to a PublisherURL (also mentioned as EventURL * in some places). * * It sends SUBSCRIBE http request to service processes request. Finally adds a * Subscription to the clients subscription list, if service responds with OK. * * \return UPNP_E_SUCCESS if service response is OK, otherwise returns the * appropriate error code */ #ifdef INCLUDE_CLIENT_APIS EXTERN_C int genaSubscribe( /*! [in] The client handle. */ UpnpClient_Handle client_handle, /*! [in] Of the form: "http://134.134.156.80:4000/RedBulb/Event */ const UpnpString *PublisherURL, /*! [in,out] requested Duration: * \li if -1, then "infinite". * \li in the OUT case: actual Duration granted by Service, * -1 for infinite. */ int *TimeOut, /*! [out] sid of subscription, memory passed in by caller. */ UpnpString *out_sid); #endif /* INCLUDE_CLIENT_APIS */ /*! * \brief Unsubscribes a SID. * * It first validates the SID and client_handle,copies the subscription, sends * UNSUBSCRIBE http request to service processes request and finally removes * the subscription. * * \return UPNP_E_SUCCESS if service response is OK, otherwise returns the * appropriate error code. */ #ifdef INCLUDE_CLIENT_APIS EXTERN_C int genaUnSubscribe( /*! [in] UPnP client handle. */ UpnpClient_Handle client_handle, /*! [in] The subscription ID. */ const UpnpString *in_sid); #endif /* INCLUDE_CLIENT_APIS */ /*! * \brief Unsubcribes all the outstanding subscriptions and cleans the * subscription list. * * This function is called when control point unregisters. * * \returns UPNP_E_SUCCESS if successful, otherwise returns the appropriate * error code. */ #ifdef INCLUDE_CLIENT_APIS EXTERN_C int genaUnregisterClient( /*! [in] Handle containing all the control point related information. */ UpnpClient_Handle client_handle); #endif /* INCLUDE_CLIENT_APIS */ /* * DEVICE */ /*! * \brief Cleans the service table of the device. * * \return UPNP_E_SUCCESS if successful, otherwise returns GENA_E_BAD_HANDLE */ #ifdef INCLUDE_DEVICE_APIS EXTERN_C int genaUnregisterDevice( /*! [in] Handle of the root device */ UpnpDevice_Handle device_handle); #endif /* INCLUDE_CLIENT_APIS */ /*! * \brief Renews a SID. * * It first validates the SID and client_handle and copies the subscription. * It sends RENEW (modified SUBSCRIBE) http request to service and processes * the response. * * \return UPNP_E_SUCCESS if service response is OK, otherwise the * appropriate error code. */ #ifdef INCLUDE_CLIENT_APIS EXTERN_C int genaRenewSubscription( /*! [in] Client handle. */ UpnpClient_Handle client_handle, /*! [in] Subscription ID. */ const UpnpString *in_sid, /*! [in,out] requested Duration, if -1, then "infinite". In the OUT case: * actual Duration granted by Service, -1 for infinite. */ int *TimeOut); #endif /* INCLUDE_CLIENT_APIS */ /*! * \brief Sends a notification to all the subscribed control points. * * \return int * * \note This function is similar to the genaNotifyAllExt. The only difference * is it takes event variable array instead of xml document. */ #ifdef INCLUDE_DEVICE_APIS EXTERN_C int genaNotifyAll( /*! [in] Device handle. */ UpnpDevice_Handle device_handle, /*! [in] Device udn. */ char *UDN, /*! [in] Service ID. */ char *servId, /*! [in] Array of varible names. */ char **VarNames, /*! [in] Array of variable values. */ char **VarValues, /*! [in] Number of variables. */ int var_count); #endif /* INCLUDE_DEVICE_APIS */ /*! * \brief Sends a notification to all the subscribed control points. * * \return int * * \note This function is similar to the genaNotifyAll. the only difference * is it takes the document instead of event variable array. */ #ifdef INCLUDE_DEVICE_APIS EXTERN_C int genaNotifyAllExt( /*! [in] Device handle. */ UpnpDevice_Handle device_handle, /*! [in] Device udn. */ char *UDN, /*! [in] Service ID. */ char *servId, /*! [in] XML document Event varible property set. */ IXML_Document *PropSet); #endif /* INCLUDE_DEVICE_APIS */ /*! * \brief Sends the intial state table dump to newly subscribed control point. * * \return GENA_E_SUCCESS if successful, otherwise the appropriate error code. * * \note No other event will be sent to this control point before the * intial state table dump. */ #ifdef INCLUDE_DEVICE_APIS EXTERN_C int genaInitNotify( /*! [in] Device handle. */ UpnpDevice_Handle device_handle, /*! [in] Device udn. */ char *UDN, /*! [in] Service ID. */ char *servId, /*! [in] Array of variable names. */ char **VarNames, /*! [in] Array of variable values. */ char **VarValues, /*! [in] Array size. */ int var_count, /*! [in] Subscription ID. */ const Upnp_SID sid); #endif /* INCLUDE_DEVICE_APIS */ /*! * \brief Similar to the genaInitNofity. The only difference is that it * takes the xml document for the state table and sends the intial state * table dump to newly subscribed control point. * * \return GENA_E_SUCCESS if successful, otherwise the appropriate error code. * * \note No other event will be sent to this control point before the * intial state table dump. */ #ifdef INCLUDE_DEVICE_APIS EXTERN_C int genaInitNotifyExt( /*! [in] Device handle. */ UpnpDevice_Handle device_handle, /*! [in] Device udn. */ char *UDN, /*! [in] Service ID. */ char *servId, /*! [in] Document of the state table. */ IXML_Document *PropSet, /*! [in] subscription ID. */ const Upnp_SID sid); #endif /* INCLUDE_DEVICE_APIS */ /*! * \brief Sends an error message to the control point in the case of incorrect * GENA requests. * * \return UPNP_E_SUCCESS if successful, otherwise appropriate error code. */ void error_respond( /*! [in] Structure containing information about the socket. */ SOCKINFO *info, /*! [in] error code that will be in the GENA response. */ int error_code, /*! [in] GENA request Packet. */ http_message_t* hmsg); #endif /* GENA_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/upnp_timeout.h0000644000175000017500000000415511025042302017073 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef UPNPTIMEOUT_H #define UPNPTIMEOUT_H /*! * \file */ /*! * The upnp_timeout structure definition. */ typedef struct UPNP_TIMEOUT { int EventType; int handle; int eventId; void *Event; } upnp_timeout; /*! * \brief Free memory associated with event and memory for any sub-elements. */ void free_upnp_timeout( /*! [in] Event which needs to be freed. */ upnp_timeout *event); #endif /* UPNPTIMEOUT_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/ssdplib.h0000644000175000017500000004054111360640052016012 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef SSDPLIB_H #define SSDPLIB_H #include "httpparser.h" #include "httpreadwrite.h" #include "miniserver.h" #include "UpnpInet.h" #include #include #include #include #include #ifdef WIN32 #else #include #include #include #include #include #include #include #endif /* Enumeration to define all different types of ssdp searches */ typedef enum SsdpSearchType{ SSDP_SERROR=-1, SSDP_ALL,SSDP_ROOTDEVICE, SSDP_DEVICEUDN, SSDP_DEVICETYPE, SSDP_SERVICE } SType; /* Enumeration to define all different type of ssdp messages */ typedef enum SsdpCmdType{ SSDP_ERROR=-1, SSDP_OK, SSDP_ALIVE, SSDP_BYEBYE, SSDP_SEARCH, SSDP_NOTIFY, SSDP_TIMEOUT } Cmd; /* Constant */ #define BUFSIZE 2500 #define SSDP_IP "239.255.255.250" #define SSDP_IPV6_LINKLOCAL "FF02::C" #define SSDP_PORT 1900 #define NUM_TRY 3 #define NUM_COPY 1 #define THREAD_LIMIT 50 #define COMMAND_LEN 300 /* can be overwritten by configure CFLAGS argument */ #ifndef X_USER_AGENT /** @name X_USER_AGENT * The {\tt X_USER_AGENT} constant specifies the value of the X-User-Agent: * HTTP header. The value "redsonic" is needed for the DSM-320. See * https://sourceforge.net/forum/message.php?msg_id=3166856 for more * information */ #define X_USER_AGENT "redsonic" #endif /* Error code */ #define NO_ERROR_FOUND 0 #define E_REQUEST_INVALID -3 #define E_RES_EXPIRED -4 #define E_MEM_ALLOC -5 #define E_HTTP_SYNTEX -6 #define E_SOCKET -7 #define RQST_TIMEOUT 20 /* Structure to store the SSDP information */ typedef struct SsdpEventStruct { enum SsdpCmdType Cmd; enum SsdpSearchType RequestType; int ErrCode; int MaxAge; int Mx; char UDN[LINE_SIZE]; char DeviceType[LINE_SIZE]; char ServiceType[LINE_SIZE]; //NT or ST char Location[LINE_SIZE]; char HostAddr[LINE_SIZE]; char Os[LINE_SIZE]; char Ext[LINE_SIZE]; char Date[LINE_SIZE]; struct sockaddr *DestAddr; void * Cookie; } Event; typedef void (* SsdpFunPtr)(Event *); typedef Event SsdpEvent ; typedef struct TData { int Mx; void * Cookie; char * Data; struct sockaddr_storage DestAddr; }ThreadData; typedef struct ssdpsearchreply { int MaxAge; UpnpDevice_Handle handle; struct sockaddr_storage dest_addr; SsdpEvent event; }SsdpSearchReply; typedef struct ssdpsearcharg { int timeoutEventId; char * searchTarget; void *cookie; enum SsdpSearchType requestType; } SsdpSearchArg; typedef struct { http_parser_t parser; struct sockaddr_storage dest_addr; } ssdp_thread_data; /* globals */ CLIENTONLY(extern SOCKET gSsdpReqSocket4;); CLIENTONLY(extern SOCKET gSsdpReqSocket6;); typedef int (*ParserFun)(char *, Event *); /************************************************************************ * Function : Make_Socket_NoBlocking * * Parameters: * IN int sock: socket * * Description: * This function to make ssdp socket non-blocking. * * Returns: int * 0 if successful else -1 ***************************************************************************/ int Make_Socket_NoBlocking (int sock); /************************************************************************ * Function : ssdp_handle_device_request * * Parameters: * IN void *data: * * Description: * This function handles the search request. It do the sanity checks of * the request and then schedules a thread to send a random time reply ( * random within maximum time given by the control point to reply). * * Returns: void * * 1 if successful else appropriate error ***************************************************************************/ #ifdef INCLUDE_DEVICE_APIS void ssdp_handle_device_request( IN http_message_t* hmsg, IN struct sockaddr* dest_addr ); #else static inline void ssdp_handle_device_request( IN http_message_t* hmsg, IN struct sockaddr* dest_addr ) {} #endif /************************************************************************ * Function : ssdp_handle_ctrlpt_msg * * Parameters: * IN http_message_t* hmsg: SSDP message from the device * IN struct sockaddr* dest_addr: Address of the device * IN xboolean timeout: timeout kept by the control point while sending * search message * IN void* cookie: Cookie stored by the control point application. * This cookie will be returned to the control point * in the callback * * Description: * This function handles the ssdp messages from the devices. These * messages includes the search replies, advertisement of device coming * alive and bye byes. * * Returns: void * ***************************************************************************/ void ssdp_handle_ctrlpt_msg( IN http_message_t* hmsg, IN struct sockaddr* dest_addr, IN xboolean timeout, IN void* cookie ); /************************************************************************ * Function : unique_service_name * * Parameters: * IN char *cmd: Service Name string * OUT SsdpEvent *Evt: The SSDP event structure partially filled * by all the function. * * Description: * This function fills the fields of the event structure like DeviceType, * Device UDN and Service Type * * Returns: int * 0 if successful else -1 ***************************************************************************/ int unique_service_name(char * cmd, SsdpEvent * Evt); /************************************************************************ * Function : get_ssdp_sockets * * Parameters: * OUT MiniServerSockArray *out: Arrays of SSDP sockets * * Description: * This function creates the ssdp sockets. It set their option to listen * for multicast traffic. * * Returns: int * return UPNP_E_SUCCESS if successful else returns appropriate error ***************************************************************************/ int get_ssdp_sockets(MiniServerSockArray *out); /************************************************************************ * Function : readFromSSDPSocket * * Parameters: * IN SOCKET socket: SSDP socket * * Description: * This function reads the data from the ssdp socket. * * Returns: void * ***************************************************************************/ void readFromSSDPSocket(SOCKET socket); /************************************************************************ * Function : ssdp_request_type1 * * Parameters: * IN char *cmd: command came in the ssdp request * * Description: * This function figures out the type of the SSDP search in the * in the request. * * Returns: enum SsdpSearchType * return appropriate search type else returns SSDP_ERROR ***************************************************************************/ enum SsdpSearchType ssdp_request_type1(IN char *cmd); /************************************************************************ * Function : ssdp_request_type * * Parameters: * IN char *cmd: command came in the ssdp request * OUT SsdpEvent *Evt: The event structure partially filled by * this function. * * Description: * This function starts filling the SSDP event structure based upon the * request received. * * Returns: int * 0 on success; -1 on error ***************************************************************************/ int ssdp_request_type(IN char * cmd, OUT SsdpEvent * Evt); /************************************************************************ * Function : SearchByTarget * * Parameters: * IN int Mx:Number of seconds to wait, to collect all the responses. * char *St: Search target. * void *Cookie: cookie provided by control point application. This * cokie will be returned to application in the callback. * * Description: * This function creates and send the search request for a specific URL. * * Returns: int * 1 if successful else appropriate error ***************************************************************************/ int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie); /************************************************************************ * Function : DeviceAdvertisement * * Parameters: * IN char *DevType : type of the device * IN int RootDev : flag to indicate if the device is root device * IN char *Udn : * IN char *Location: Location URL. * IN int Duration : Service duration in sec. * IN int AddressFamily: Device address family. * * Description: * This function creates the device advertisement request based on * the input parameter, and send it to the multicast channel. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int DeviceAdvertisement( IN char *DevType, IN int RootDev, IN char *Udn, IN char *Location, IN int Duration, IN int AddressFamily); /************************************************************************ * Function : DeviceShutdown * * Parameters: * IN char *DevType: Device Type. * IN int RootDev:1 means root device. * IN char *Udn: Device UDN * IN char *_Server: * IN char *Location: Location URL * IN int Duration :Device duration in sec. * IN int AddressFamily: Device address family. * * Description: * This function creates a HTTP device shutdown request packet * and sent it to the multicast channel through RequestHandler. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int DeviceShutdown( IN char *DevType, IN int RootDev, IN char *Udn, IN char *_Server, IN char *Location, IN int Duration, IN int AddressFamily); /************************************************************************ * Function : DeviceReply * * Parameters: * IN struct sockaddr *DestAddr: destination IP address. * IN char *DevType: Device type * IN int RootDev: 1 means root device 0 means embedded device. * IN char *Udn: Device UDN * IN char *Location: Location of Device description document. * IN int Duration :Life time of this device. * * Description: * This function creates the reply packet based on the input parameter, * and send it to the client address given in its input parameter DestAddr. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int DeviceReply( IN struct sockaddr *DestAddr, IN char *DevType, IN int RootDev, IN char *Udn, IN char *Location, IN int Duration); /************************************************************************ * Function : SendReply * * Parameters: * IN struct sockaddr *DestAddr: destination IP address. * IN char *DevType: Device type * IN int RootDev: 1 means root device 0 means embedded device. * IN char * Udn: Device UDN * IN char *_Server: * IN char *Location: Location of Device description document. * IN int Duration :Life time of this device. * IN int ByType: * * Description: * This function creates the reply packet based on the input parameter, * and send it to the client addesss given in its input parameter DestAddr. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int SendReply( IN struct sockaddr *DestAddr, IN char *DevType, IN int RootDev, IN char *Udn, IN char *Location, IN int Duration, IN int ByType ); /************************************************************************ * Function : ServiceAdvertisement * * Parameters: * IN char * Udn: Device UDN * IN char *ServType: Service Type. * IN char * Location: Location of Device description document. * IN int Duration: Life time of this device. * IN int AddressFamily: Device address family * * Description: * This function creates the advertisement packet based * on the input parameter, and send it to the multicast channel. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int ServiceAdvertisement( IN char *Udn, IN char *ServType, IN char *Location, IN int Duration, IN int AddressFamily); /************************************************************************ * Function : ServiceReply * * Parameters: * IN struct sockaddr *DestAddr: * IN char *Udn: Device UDN * IN char *ServType: Service Type. * IN char *Server: Not used * IN char *Location: Location of Device description document. * IN int Duration :Life time of this device. * * Description: * This function creates the advertisement packet based * on the input parameter, and send it to the multicast channel. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int ServiceReply( IN struct sockaddr *DestAddr, IN char *ServType, IN char *Udn, IN char *Location, IN int Duration); /************************************************************************ * Function : ServiceShutdown * * Parameters: * IN char *Udn: Device UDN * IN char *ServType: Service Type. * IN char *Location: Location of Device description document. * IN int Duration :Service duration in sec. * IN int AddressFamily: Device address family * * Description: * This function creates a HTTP service shutdown request packet * and sent it to the multicast channel through RequestHandler. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int ServiceShutdown( IN char *Udn, IN char *ServType, IN char *Location, IN int Duration, IN int AddressFamily); /************************************************************************ * Function : advertiseAndReplyThread * * Parameters: * IN void *data: Structure containing the search request * * Description: * This function is a wrapper function to reply the search request * coming from the control point. * * Returns: void * * always return NULL ***************************************************************************/ void *advertiseAndReplyThread(IN void * data); /************************************************************************ * Function : AdvertiseAndReply * * Parameters: * IN int AdFlag: -1 = Send shutdown, * 0 = send reply, * 1 = Send Advertisement * IN UpnpDevice_Handle Hnd: Device handle * IN enum SsdpSearchType SearchType:Search type for sending replies * IN struct sockaddr *DestAddr:Destination address * IN char *DeviceType:Device type * IN char *DeviceUDN:Device UDN * IN char *ServiceType:Service type * IN int Exp:Advertisement age * * Description: * This function to send SSDP advertisements, replies and shutdown messages. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int AdvertiseAndReply( IN int AdFlag, IN UpnpDevice_Handle Hnd, IN enum SsdpSearchType SearchType, IN struct sockaddr *DestAddr, IN char *DeviceType, IN char *DeviceUDN, IN char *ServiceType, int Exp); #endif /* SSDPLIB_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/urlconfig.h0000644000175000017500000000605211042015421016332 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef URLCONFIG_H #define URLCONFIG_H #include "UpnpInet.h" #ifdef WIN32 #else #include #include #endif /* functions available only if the web server is included */ #ifdef __cplusplus extern "C" { #endif /************************************************************************ * Function: configure_urlbase * * Parameters : * INOUT IXML_Document *doc ; IXML Description document * IN const struct sockaddr *serverAddr; socket address object * providing the IP address and port information * IN const char* alias ; string containing the alias * IN time_t last_modified ; time when the XML document was * downloaded * OUT char docURL[LINE_SIZE] ; buffer to hold the URL of the * document. * * Description : Configure the full URL for the description document. * Create the URL document and add alias, description information. * The doc is added to the web server to be served using the given * alias. * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_OUTOF_MEMORY - Default Error ****************************************************************************/ int configure_urlbase( INOUT IXML_Document *doc, IN const struct sockaddr* serverAddr, IN const char* alias, IN time_t last_modified, OUT char docURL[LINE_SIZE]); #ifdef __cplusplus } /* extern C */ #endif #endif /* URLCONFIG_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/sysdep.h0000644000175000017500000000430111365106163015660 00000000000000/* * Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. * Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & * Digital Equipment Corporation, Maynard, Mass. * Copyright (c) 1998 Microsoft. * To anyone who acknowledges that this file is provided "AS IS" * without any express or implied warranty: permission to use, copy, * modify, and distribute this file for any purpose is hereby * granted without fee, provided that the above copyright notices and * this notice appears in all source code copies, and that none of * the names of Open Software Foundation, Inc., Hewlett-Packard * Company, or Digital Equipment Corporation be used in advertising * or publicity pertaining to distribution of the software without * specific, written prior permission. Neither Open Software * Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment * Corporation makes any representations about the suitability of * this software for any purpose. */ #ifndef SYSDEP_H #define SYSDEP_H #include "ithread.h" /* change to point to where MD5 .h's live */ /* get MD5 sample implementation from RFC 1321 */ #include "global.h" #include "md5.h" #include #ifdef WIN32 /* Do not #include */ #else #include #endif /* set the following to the number of 100ns ticks of the actual resolution of your system's clock */ #define UUIDS_PER_TICK 1024 /* Set the following to a call to acquire a system wide global lock */ extern ithread_mutex_t gUUIDMutex; #define UUIDLock() ithread_mutex_lock(&gUUIDMutex) #define UUIDUnlock() ithread_mutex_unlock(&gUUIDMutex) typedef unsigned long unsigned32; typedef unsigned short unsigned16; typedef unsigned char unsigned8; typedef unsigned char byte; /* Set this to what your compiler uses for 64 bit data type */ #ifdef WIN32 #define unsigned64_t __int64 #else #define unsigned64_t unsigned long long #endif #define I64(C) C##LL typedef unsigned64_t uuid_time_t; typedef struct { char nodeID[6]; } uuid_node_t; void get_ieee_node_identifier(uuid_node_t *node); void get_system_time(uuid_time_t *uuid_time); void get_random_info(unsigned char seed[16]); #endif /* SYSDEP_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/soaplib.h0000644000175000017500000001201611021325543015776 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef SOAPLIB_H #define SOAPLIB_H // SOAP module API to be called in Upnp-Dk API /**************************************************************************** * Function : soap_device_callback * * Parameters : * IN http_parser_t *parser : Parsed request received by the device * IN http_message_t* request : HTTP request * INOUT SOCKINFO *info : socket info * * Description : This is a callback called by minisever after receiving * the request from the control point. This function will start * processing the request. It calls handle_invoke_action to handle the * SOAP action * * Return : void * * Note : ****************************************************************************/ void soap_device_callback( IN http_parser_t *parser, IN http_message_t* request, INOUT SOCKINFO *info ); /**************************************************************************** * Function : SoapSendAction * * Parameters : * IN char* action_url : device contrl URL * IN char *service_type : device service type * IN IXML_Document *action_node : SOAP action node * OUT IXML_Document **response_node : SOAP response node * * Description : This function is called by UPnP API to send the SOAP * action request and waits till it gets the response from the device * pass the response to the API layer * * Return : int * returns UPNP_E_SUCCESS if successful else returns appropriate error * Note : ****************************************************************************/ int SoapSendAction( IN char* action_url, IN char *service_type, IN IXML_Document *action_node, OUT IXML_Document **response_node ); /**************************************************************************** * Function : SoapSendActionEx * * Parameters : * IN char* action_url : device contrl URL * IN char *service_type : device service type IN IXML_Document *Header: Soap header * IN IXML_Document *action_node : SOAP action node ( SOAP body) * OUT IXML_Document **response_node : SOAP response node * * Description : This function is called by UPnP API to send the SOAP * action request and waits till it gets the response from the device * pass the response to the API layer. This action is similar to the * the SoapSendAction with only difference that it allows users to * pass the SOAP header along the SOAP body ( soap action request) * * Return : int * returns UPNP_E_SUCCESS if successful else returns appropriate error * Note : ****************************************************************************/ int SoapSendActionEx( IN char * ActionURL, IN char *ServiceType, IN IXML_Document *Header, IN IXML_Document *ActNode , OUT IXML_Document **RespNode) ; /**************************************************************************** * Function : SoapGetServiceVarStatus * * Parameters : * IN char * action_url : Address to send this variable * query message. * IN char *var_name : Name of the variable. * OUT char **var_value : Output value. * * Description : This function creates a status variable query message * send it to the specified URL. It also collect the response. * * Return : int * * Note : ****************************************************************************/ int SoapGetServiceVarStatus( IN char * ActionURL, IN DOMString VarName, OUT DOMString *StVar) ; extern const char* ContentTypeHeader; #endif //SOAPLIB_H libupnp-1.8.0~svn20100507/upnp/src/inc/netall.h0000644000175000017500000000337711021325543015636 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #include #include libupnp-1.8.0~svn20100507/upnp/src/inc/sock.h0000644000175000017500000001312111021325543015302 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef GENLIB_NET_SOCK_H #define GENLIB_NET_SOCK_H #include "util.h" #ifdef WIN32 /* Do not #include */ #else #include #endif /* Following variable is not defined under winsock.h */ #ifndef SD_RECEIVE #define SD_RECEIVE 0x00 #define SD_SEND 0x01 #define SD_BOTH 0x02 #endif typedef struct { /* handle/descriptor to a socket */ SOCKET socket; /* the following two fields are filled only in incoming requests; */ struct sockaddr_storage foreign_sockaddr; } SOCKINFO; #ifdef __cplusplus #extern "C" { #endif /************************************************************************ * Function : sock_init * * Parameters : * OUT SOCKINFO* info ; Socket Information Object * IN SOCKET sockfd ; Socket Descriptor * * Description : Assign the passed in socket descriptor to socket * descriptor in the SOCKINFO structure. * * Return : int; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * Note : ************************************************************************/ int sock_init(OUT SOCKINFO* info, IN SOCKET sockfd); /************************************************************************ * Function : sock_init_with_ip * * Parameters : * OUT SOCKINFO* info ; Socket Information Object * IN SOCKET sockfd ; Socket Descriptor * IN struct sockaddr* foreign_sockaddr; Remote socket address * * Description : Calls the sock_init function and assigns the passed in * IP address and port to the IP address and port in the SOCKINFO * structure. * * Return : int; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * * Note : ************************************************************************/ int sock_init_with_ip( OUT SOCKINFO* info, IN SOCKET sockfd, IN struct sockaddr *foreign_sockaddr); /************************************************************************ * Function : sock_read * * Parameters : * IN SOCKINFO *info ; Socket Information Object * OUT char* buffer ; Buffer to get data to * IN size_t bufsize ; Size of the buffer * IN int *timeoutSecs ; timeout value * * Description : Reads data on socket in sockinfo * * Return : int; * numBytes - On Success, no of bytes received * UPNP_E_TIMEDOUT - Timeout * UPNP_E_SOCKET_ERROR - Error on socket calls * * Note : ************************************************************************/ int sock_read( IN SOCKINFO *info, OUT char* buffer, IN size_t bufsize, INOUT int *timeoutSecs ); /************************************************************************ * Function : sock_write * * Parameters : * IN SOCKINFO *info ; Socket Information Object * IN char* buffer ; Buffer to send data from * IN size_t bufsize ; Size of the buffer * IN int *timeoutSecs ; timeout value * * Description : Writes data on the socket in sockinfo * * Return : int; * numBytes - On Success, no of bytes sent * UPNP_E_TIMEDOUT - Timeout * UPNP_E_SOCKET_ERROR - Error on socket calls * * Note : ************************************************************************/ int sock_write( IN SOCKINFO *info, IN char* buffer, IN size_t bufsize, INOUT int *timeoutSecs ); /************************************************************************ * Function : sock_destroy * * Parameters : * INOUT SOCKINFO* info ; Socket Information Object * int ShutdownMethod ; How to shutdown the socket. Used by * sockets's shutdown() * * Description : Shutsdown the socket using the ShutdownMethod to * indicate whether sends and receives on the socket will be * dis-allowed. After shutting down the socket, closesocket is called * to release system resources used by the socket calls. * * Return : int; * UPNP_E_SOCKET_ERROR on failure * UPNP_E_SUCCESS on success * * Note : ************************************************************************/ int sock_destroy(INOUT SOCKINFO* info, int); #ifdef __cplusplus } /* #extern "C" */ #endif #endif /* GENLIB_NET_SOCK_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/client_table.h0000644000175000017500000000365711365106163017013 00000000000000 #ifndef CLIENT_TABLE_H #define CLIENT_TABLE_H /*! * \file */ #ifdef __cplusplus extern "C" { #endif #include "ClientSubscription.h" #include "service_table.h" #include "upnp.h" #include "UpnpString.h" #include "upnp_timeout.h" #include "uri.h" #include "TimerThread.h" #include #include #include extern TimerThread gTimerThread; #ifdef INCLUDE_CLIENT_APIS /*! * \brief Free memory allocated for client subscription data. * * Remove timer thread associated with this subscription event. */ void free_client_subscription( /*! [in] Client subscription to be freed. */ ClientSubscription *sub); /*! * \brief Free the client subscription table. */ void freeClientSubList( /*! [in] Client subscription list to be freed. */ ClientSubscription *list); /*! * \brief Remove the client subscription matching the subscritpion id * represented by the const Upnp_SID sid parameter from the table and * update the table. */ void RemoveClientSubClientSID( /*! [in] Head of the subscription list. */ ClientSubscription **head, /*! [in] Subscription ID to be mactched. */ const UpnpString *sid); /*! * \brief Return the client subscription from the client table that matches * const Upnp_SID sid subscrition id value. * * \return The matching subscription. */ ClientSubscription *GetClientSubClientSID( /*! [in] Head of the subscription list. */ ClientSubscription *head, /*! [in] Subscription ID to be mactched. */ const UpnpString *sid); /*! * \brief Returns the client subscription from the client subscription table * that has the matching token *sid buffer value. * * \return The matching subscription. */ ClientSubscription *GetClientSubActualSID( /*! [in] Head of the subscription list. */ ClientSubscription *head, /*! [in] Subscription ID to be mactched. */ token *sid); #endif /* INCLUDE_CLIENT_APIS */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* CLIENT_TABLE_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/strintmap.h0000644000175000017500000000711411021325543016371 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_UTIL_STRINTMAP_H #define GENLIB_UTIL_STRINTMAP_H #include #include "util.h" // Util to map from a string to an integer and vice versa typedef struct // str_int_entry { char *name; // a value in string form int id; // same value in integer form } str_int_entry; #ifdef __cplusplus extern "C" { #endif /************************************************************************ * Function : map_str_to_int * * Parameters : * IN const char* name ; string containing the name to be matched * IN size_t name_len ; size of the string to be matched * IN str_int_entry* table ; table of entries that need to be * matched. * IN int num_entries ; number of entries in the table that need * to be searched. * IN xboolean case_sensitive ; whether the case should be case * sensitive or not * * Description : Match the given name with names from the entries in the * table. Returns the index of the table when the entry is found. * * Return : int ; * index - On Success * -1 - On failure * * Note : ************************************************************************/ int map_str_to_int( IN const char* name, IN size_t name_len, IN str_int_entry* table, IN int num_entries, IN xboolean case_sensitive ); /************************************************************************ * Function : map_int_to_str * * Parameters : * IN int id ; ID to be matched * IN str_int_entry* table ; table of entries that need to be * matched. * IN int num_entries ; number of entries in the table that need * to be searched. * * Description : Returns the index from the table where the id matches * the entry from the table. * * Return : int ; * * Note : ************************************************************************/ int map_int_to_str( IN int id, IN str_int_entry* table, IN int num_entries ); #ifdef __cplusplus } // extern C #endif #endif // GENLIB_UTIL_STRINTMAP_H libupnp-1.8.0~svn20100507/upnp/src/inc/util.h0000644000175000017500000001165511021325543015332 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef UTIL_H #define UTIL_H #include "upnp.h" // usually used to specify direction of parameters in functions #ifndef IN #define IN #endif #ifndef OUT #define OUT #endif #ifndef INOUT #define INOUT #endif #define GEMD_OUT_OF_MEMORY -1 #define EVENT_TIMEDOUT -2 #define EVENT_TERMINATE -3 // boolean type in C typedef char xboolean; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif /////////////////////////// // funcs #ifdef __cplusplus extern "C" { #endif /************************************************************************ * Function: logerror * * Parameters: * IN const char *fmt; format string * * Description: Log an error message. * * Return: void ************************************************************************/ void log_error( IN const char *fmt, ... ); /************************************************************************ * Function: linecopy * * Parameters: * OUT char dest[LINE_SIZE]; output buffer * IN const char *src; input buffer * * Description: Copy no of bytes spcified by the LINE_SIZE constant, * from the source buffer. Null terminate the destination buffer. * * Return: void ************************************************************************/ void linecopy( OUT char dest[LINE_SIZE], IN const char* src ); /************************************************************************ * Function: namecopy * * Parameters: * OUT char dest[NAME_SIZE]; output buffer * IN const char *src; input buffer * * Description: Copy no of bytes spcified by the NAME_SIZE constant, * from the source buffer. Null terminate the destination buffer * * Return: void ************************************************************************/ void namecopy( OUT char dest[NAME_SIZE], IN const char* src ); /************************************************************************ * Function: linecopylen * * Parameters: * OUT char dest[LINE_SIZE]; output buffer * IN const char *src; input buffer * IN size_t srclen; bytes to be copied. * * Description : Determine if the srclen passed in paramter is less than * the permitted LINE_SIZE. If it is use the passed parameter, if not * use the permitted LINE_SIZE as the length parameter * Copy no of bytes spcified by the LINE_SIZE constant, * from the source buffer. Null terminate the destination buffer * * Return: void ************************************************************************/ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen ); #ifdef __cplusplus } // extern C #endif /* Size of the errorBuffer variable, passed to the strerror_r() function */ #define ERROR_BUFFER_LEN 256 ////////////////////////////////// // C specific #ifndef __cplusplus #ifdef WIN32 #ifndef S_ISREG #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif #ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif #define EADDRINUSE WSAEADDRINUSE #define strcasecmp stricmp #define strncasecmp strnicmp #define sleep(a) Sleep((a)*1000) #define usleep(a) Sleep((a)/1000) #define strerror_r(a,b,c) (strerror_s((b),(c),(a))) #else #define max(a, b) (((a)>(b))? (a):(b)) #define min(a, b) (((a)<(b))? (a):(b)) #endif /* WIN32 */ #endif // __cplusplus #endif /* UTIL_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/uuid.h0000644000175000017500000000415111042015421015306 00000000000000/* * Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. * Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & * Digital Equipment Corporation, Maynard, Mass. * Copyright (c) 1998 Microsoft. * To anyone who acknowledges that this file is provided "AS IS" * without any express or implied warranty: permission to use, copy, * modify, and distribute this file for any purpose is hereby * granted without fee, provided that the above copyright notices and * this notice appears in all source code copies, and that none of * the names of Open Software Foundation, Inc., Hewlett-Packard * Company, or Digital Equipment Corporation be used in advertising * or publicity pertaining to distribution of the software without * specific, written prior permission. Neither Open Software * Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment * Corporation makes any representations about the suitability of * this software for any purpose. */ #include "sysdep.h" /*! . */ typedef struct _uuid_upnp { /*! . */ unsigned32 time_low; /*! . */ unsigned16 time_mid; /*! . */ unsigned16 time_hi_and_version; /*! . */ unsigned8 clock_seq_hi_and_reserved; /*! . */ unsigned8 clock_seq_low; /*! . */ byte node[6]; } uuid_upnp; /*! * \brief Generate a UUID. */ int uuid_create( /*! . */ uuid_upnp * id); /*! * \brief Out will be xxxx-xx-xx-xx-xxxxxx format. */ void uuid_unpack( /*! . */ uuid_upnp *u, /*! . */ char *out); /*! * \brief Create a UUID using a "name" from a "name space" */ void uuid_create_from_name( /*! Resulting UUID. */ uuid_upnp *uid, /*! UUID to serve as context, so identical names from different name * spaces generate different UUIDs. */ uuid_upnp nsid, /*! The name from which to generate a UUID. */ void *name, /*! The length of the name. */ int namelen ); /*! * \brief Compare two UUID's "lexically". * * \return * -1 u1 is lexically before u2 * 0 u1 is equal to u2 * 1 u1 is lexically after u2 * * \note Lexical ordering is not temporal ordering! */ int uuid_compare( /*! . */ uuid_upnp *u1, /*! . */ uuid_upnp *u2); libupnp-1.8.0~svn20100507/upnp/src/inc/service_table.h0000644000175000017500000002336511336633540017175 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef SERVICE_TABLE_H #define SERVICE_TABLE_H /*! * \file */ #ifdef __cplusplus extern "C" { #endif #include "config.h" #include "uri.h" #include "ixml.h" #include "upnp.h" #include "upnpdebug.h" #include #include #define SID_SIZE 41 #ifdef INCLUDE_DEVICE_APIS typedef struct SUBSCRIPTION { Upnp_SID sid; int eventKey; int ToSendEventKey; time_t expireTime; int active; URL_list DeliveryURLs; struct SUBSCRIPTION *next; } subscription; typedef struct SERVICE_INFO { DOMString serviceType; DOMString serviceId; char *SCPDURL ; char *controlURL; char *eventURL; DOMString UDN; int active; int TotalSubscriptions; subscription *subscriptionList; struct SERVICE_INFO *next; } service_info; typedef struct SERVICE_TABLE { DOMString URLBase; service_info *serviceList; service_info *endServiceList; } service_table; /* Functions for Subscriptions */ /*! * \brief Makes a copy of the subscription. * * \return HTTP_SUCCESS on Sucess. */ int copy_subscription( /*! [in] Source subscription. */ subscription *in, /*! [in] Destination subscription. */ subscription *out); /* * \brief Remove the subscription represented by the const Upnp_SID sid parameter * from the service table and update the service table. */ void RemoveSubscriptionSID( /*! [in] Subscription ID. */ Upnp_SID sid, /*! [in] Service object providing the list of subscriptions. */ service_info *service); /*! * \brief Return the subscription from the service table that matches * const Upnp_SID sid value. * * \return Pointer to the matching subscription node. */ subscription *GetSubscriptionSID( /*! [in] Subscription ID. */ const Upnp_SID sid, /*! [in] Service object providing the list of subscriptions. */ service_info *service); /*! * \brief Gets pointer to the first subscription node in the service table. * * \return Pointer to the first subscription node. */ subscription *GetFirstSubscription( /*! [in] Service object providing the list of subscriptions. */ service_info *service); /*! * \brief Get current and valid subscription from the service table. * * \return Pointer to the next subscription node. */ subscription *GetNextSubscription( /*! [in] Service object providing the list of subscriptions. */ service_info *service, /*! [in] Current subscription object. */ subscription *current); /*! * \brief Free's the memory allocated for storing the URL of the subscription. */ void freeSubscription( /*! [in] Subscription object to be freed. */ subscription *sub); /*! * \brief Free's memory allocated for all the subscriptions in the service table. */ void freeSubscriptionList( /*! [in] Head of the subscription list. */ subscription * head); /*! * \brief Traverses through the service table and returns a pointer to the * service node that matches a known service id and a known UDN. * * \return Pointer to the matching service_info node. */ service_info *FindServiceId( /*! [in] Service table. */ service_table *table, /*! [in] String representing the service id to be found among those * in the table. */ const char *serviceId, /*! [in] String representing the UDN to be found among those in the * table. */ const char *UDN); /*! * \brief Traverses the service table and finds the node whose event URL Path * matches a know value. * * \return Pointer to the service list node from the service table whose event * URL matches a known event URL. */ service_info *FindServiceEventURLPath( /*! [in] Service table. */ service_table *table, /*! [in] Event URL path used to find a service from the table. */ char *eventURLPath); /*! * \brief Traverses the service table and finds the node whose control URL Path * matches a know value. * * \return Pointer to the service list node from the service table whose control * URL Path matches a known value. */ service_info * FindServiceControlURLPath( /*! [in] Service table. */ service_table *table, /*! [in] Control URL path used to find a service from the table. */ const char *controlURLPath); /*! * \brief For debugging purposes prints information from the service passed * into the function. */ #ifdef DEBUG void printService( /*! [in] Service whose information is to be printed. */ service_info *service, /*! [in] Debug level specified to the print function. */ Upnp_LogLevel level, /*! [in] Debug module specified to the print function. */ Dbg_Module module); #else static UPNP_INLINE void printService( service_info *service, Upnp_LogLevel level, Dbg_Module module) {} #endif /*! * \brief For debugging purposes prints information of each service from the * service table passed into the function. */ #ifdef DEBUG void printServiceList( /*! [in] Service whose information is to be printed. */ service_info *service, /*! [in] Debug level specified to the print function. */ Upnp_LogLevel level, /*! [in] Debug module specified to the print function. */ Dbg_Module module); #else static UPNP_INLINE void printServiceList( service_info *service, Upnp_LogLevel level, Dbg_Module module) {} #endif /*! * \brief For debugging purposes prints the URL base of the table and information * of each service from the service table passed into the function. */ #ifdef DEBUG void printServiceTable( /*! [in] Service table to be printed. */ service_table *table, /*! [in] Debug level specified to the print function. */ Upnp_LogLevel level, /*! [in] Debug module specified to the print function. */ Dbg_Module module); #else static UPNP_INLINE void printServiceTable( service_table *table, Upnp_LogLevel level, Dbg_Module module) {} #endif /*! * \brief Free's memory allocated for the various components of the service * entry in the service table. */ void freeService( /*! [in] Service information that is to be freed. */ service_info *in); /*! * \brief Free's memory allocated for the various components of each service * entry in the service table. */ void freeServiceList( /*! [in] Head of the service list to be freed. */ service_info *head); /*! * \brief Free's dynamic memory in table (does not free table, only memory * within the structure). */ void freeServiceTable( /*! [in] Service table whose internal memory needs to be freed. */ service_table *table); /*! * \brief This function assumes that services for a particular root device are * placed linearly in the service table, and in the order in which they are * found in the description document all services for this root device are * removed from the list. * * \return An integer. */ int removeServiceTable( /*! [in] XML node information. */ IXML_Node *node, /*! [in] Service table from which services will be removed. */ service_table *in); /*! * \brief Add Service to the table. */ int addServiceTable( /*! [in] XML node information. */ IXML_Node *node, /*! [in] Service table that will be initialized with services. */ service_table *in, /*! [in] Default base URL on which the URL will be returned to the * service list. */ const char *DefaultURLBase); /*! * \brief Retrieve service from the table. * * \return An integer */ int getServiceTable( /*! [in] XML node information. */ IXML_Node *node, /*! [in] Output parameter which will contain the service list and URL. */ service_table *out, /*! [in] Default base URL on which the URL will be returned. */ const char *DefaultURLBase); /* Misc helper functions */ /*! * \brief Returns the clone of the element value. * * \note Value must be freed with DOMString_free. * * \return DOMString */ DOMString getElementValue( /*! [in] Input node which provides the list of child nodes. */ IXML_Node *node); /*! * \brief Traverses through a list of XML nodes to find the node with the * known element name. * * \return * \li 1 - On Success * \li 0 - On Failure */ int getSubElement( /*! [in] Sub element name to be searched for. */ const char *element_name, /*! [in] Input node which provides the list of child nodes. */ IXML_Node *node, /*! [out] Ouput node to which the matched child node is returned. */ IXML_Node **out); #endif /* INCLUDE_DEVICE_APIS */ #ifdef __cplusplus } #endif #endif /* SERVICE_TABLE */ libupnp-1.8.0~svn20100507/upnp/src/inc/server.h0000644000175000017500000000517611021325543015664 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_NET_HTTP_SERVER_H #define GENLIB_NET_HTTP_SERVER_H #ifdef __cplusplus #include int http_ServerCallback( IN HttpMessage& request, IN int sockfd ); // adds 'entity' to the alias list; the entity is referred using // // aliasRelURL: relative url for given entity // entity: entity to be served // actualAlias: [possibly] modified version of aliasResURL to resolve conflicts // returns: // 0 : success // HTTP_E_OUT_OF_MEMORY int http_AddAlias( IN const char* aliasRelURL, IN HttpEntity* entity, OUT xstring& actualAlias ); extern "C" { #endif /* __cplusplus */ void http_OldServerCallback( IN const char* msg, int sockfd ); void http_SetRootDir( const char* httpRootDir ); // removes a previously added entity // returns: // 0: success -- alias removed // -1: alias not found int http_RemoveAlias( IN const char* alias ); #ifdef __cplusplus } /* extern C */ #endif #endif /* GENLIB_NET_HTTP_SERVER_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/ClientSubscription.h0000644000175000017500000000600711365106163020201 00000000000000 #ifndef CLIENTSUBSCRIPTION_H #define CLIENTSUBSCRIPTION_H /*! * \file */ #ifdef __cplusplus extern "C" { #endif #include "UpnpString.h" #include #include #include #ifdef INCLUDE_CLIENT_APIS typedef struct s_ClientSubscription ClientSubscription; /*! * \brief Constructor. */ ClientSubscription *GenlibClientSubscription_new(); /*! * \brief Destructor. */ void GenlibClientSubscription_delete( /*! [in] The \b this pointer. */ ClientSubscription *p); /*! * \brief Copy Constructor. */ ClientSubscription *GenlibClientSubscription_dup( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief Assignment operator. */ void GenlibClientSubscription_assign( /*! [in] The \b this pointer. */ ClientSubscription *q, const ClientSubscription *p); /*! * \brief */ int GenlibClientSubscription_get_RenewEventId( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief */ void GenlibClientSubscription_set_RenewEventId( /*! [in] The \b this pointer. */ ClientSubscription *p, /*! [in] . */ int n); /*! * \brief */ const UpnpString *GenlibClientSubscription_get_SID( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief */ const char *GenlibClientSubscription_get_SID_cstr( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief */ void GenlibClientSubscription_set_SID( /*! [in] The \b this pointer. */ ClientSubscription *p, const UpnpString *s); /*! * \brief */ void GenlibClientSubscription_strcpy_SID( /*! [in] The \b this pointer. */ ClientSubscription *p, const char *s); /*! * \brief */ const UpnpString *GenlibClientSubscription_get_ActualSID( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief */ const char *GenlibClientSubscription_get_ActualSID_cstr( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief */ void GenlibClientSubscription_set_ActualSID( /*! [in] The \b this pointer. */ ClientSubscription *p, const UpnpString *s); /*! * \brief */ void GenlibClientSubscription_strcpy_ActualSID( /*! [in] The \b this pointer. */ ClientSubscription *p, const char *s); /*! * \brief */ const UpnpString *GenlibClientSubscription_get_EventURL( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief */ void GenlibClientSubscription_set_EventURL( /*! [in] The \b this pointer. */ ClientSubscription *p, const UpnpString *s); /*! * \brief */ void GenlibClientSubscription_strcpy_EventURL( /*! [in] The \b this pointer. */ ClientSubscription *p, const char *s); /*! * \brief */ ClientSubscription *GenlibClientSubscription_get_Next( /*! [in] The \b this pointer. */ const ClientSubscription *p); /*! * \brief */ void GenlibClientSubscription_set_Next( /*! [in] The \b this pointer. */ ClientSubscription *p, ClientSubscription *q); #endif /* INCLUDE_CLIENT_APIS */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* CLIENTSUBSCRIPTION_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/gena_ctrlpt.h0000644000175000017500000000443711021325543016657 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef GENA_CTRLPT_H #define GENA_CTRLPT_H /*! * \file */ #include "sock.h" /*! * \brief This function processes NOTIFY events that are sent by devices. * * Parameters: * IN SOCKINFO *info: Socket structure containing the device socket * information * IN http_message_t *event: The http message contains the GENA * notification * * \note called by genacallback() */ void gena_process_notification_event( /*! [in] Socket info of the device. */ SOCKINFO *info, /*! [in] The http message contains the GENA notification. */ http_message_t *event); #endif /* GENA_CTRLPT_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/inet_pton.h0000644000175000017500000000421511021325543016346 00000000000000 #ifndef INET_PTON #define INET_PTON #ifdef WIN32 #include "unixutil.h" #include #include #include /*! * \file * * \author: Paul Vixie, 1996. * * \brief Network support routines missing in WIN32. * * \warning Don't even consider trying to compile this on a system where * sizeof(int) < 4. sizeof(int) 4 is fine; all the world's not a VAX. * */ /*! * \brief format an IPv4 address * * \return `dst' (as a const) * * \note * \li (1) uses no statics * \li (2) takes a u_char* not an in_addr as input * */ extern const char *inet_ntop4(const u_char src, char *dst, socklen_t size); /*! * \brief convert IPv6 binary address into presentation (printable) format */ #ifdef INET_IPV6 extern const char *inet_ntop6(const u_char *src, char *dst, socklen_t size); #endif /* INET_IPV6 */ /*! * \brief like inet_aton() but without all the hexadecimal and shorthand. * * \return 1 if `src' is a valid dotted quad, else 0. * * \note does not touch `dst' unless it's returning 1. */ extern inet_pton4(const char *src,u_char *dst); /*! * \brief convert presentation level address to network order binary form. * * \return 1 if `src' is a valid [RFC1884 2.2] address, else 0. * * \note * \li (1) does not touch `dst' unless it's returning 1. * \li (2) :: in a full address is silently ignored. */ #ifdef INET_IPV6 extern int inet_pton6(const char *src, u_char *dst); #endif /* INET_IPV6 */ /*! * \brief convert a network format address to presentation format. * * \return * pointer to presentation format address (`dst'), or NULL (see errno). */ extern const char *inet_ntop(int af,const void *src,char *dst,socklen_t size); /*! * \brief convert from presentation format (which usually means ASCII printable) * to network format (which is usually some kind of binary format). * * \return * \li 1 if the address was valid for the specified address family * \li 0 if the address wasn't valid (`dst' is untouched in this case) * \li -1 if some other error occurred (`dst' is untouched in this case, too) */ extern int inet_pton(int af,const char *src,void *dst); #endif /* WIN32 */ #endif /* INET_PTON */ libupnp-1.8.0~svn20100507/upnp/src/inc/statuscodes.h0000644000175000017500000001016311021325543016707 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_NET_HTTP_STATUSCODES_H #define GENLIB_NET_HTTP_STATUSCODES_H // HTTP response status codes #define HTTP_CONTINUE 100 #define HTTP_SWITCHING_PROCOTOLS 101 #define HTTP_OK 200 #define HTTP_CREATED 201 #define HTTP_ACCEPTED 202 #define HTTP_NON_AUTHORATATIVE 203 #define HTTP_NO_CONTENT 204 #define HTTP_RESET_CONTENT 205 #define HTTP_PARTIAL_CONTENT 206 #define HTTP_MULTIPLE_CHOICES 300 #define HTTP_MOVED_PERMANENTLY 301 #define HTTP_FOUND 302 #define HTTP_SEE_OTHER 303 #define HTTP_NOT_MODIFIED 304 #define HTTP_USE_PROXY 305 #define HTTP_UNUSED_3XX 306 #define HTTP_TEMPORARY_REDIRECT 307 #define HTTP_BAD_REQUEST 400 #define HTTP_UNAUTHORIZED 401 #define HTTP_PAYMENT_REQD 402 #define HTTP_FORBIDDEN 403 #define HTTP_NOT_FOUND 404 #define HTTP_METHOD_NOT_ALLOWED 405 #define HTTP_NOT_ACCEPTABLE 406 #define HTTP_PROXY_AUTH_REQD 407 #define HTTP_REQUEST_TIMEOUT 408 #define HTTP_CONFLICT 409 #define HTTP_GONE 410 #define HTTP_LENGTH_REQUIRED 411 #define HTTP_PRECONDITION_FAILED 412 #define HTTP_REQ_ENTITY_TOO_LARGE 413 #define HTTP_REQ_URI_TOO_LONG 414 #define HTTP_UNSUPPORTED_MEDIA_TYPE 415 #define HTTP_REQUEST_RANGE_NOT_SATISFIABLE 416 #define HTTP_EXPECTATION_FAILED 417 #define HTTP_INTERNAL_SERVER_ERROR 500 #define HTTP_NOT_IMPLEMENTED 501 #define HTTP_BAD_GATEWAY 502 #define HTTP_SERVICE_UNAVAILABLE 503 #define HTTP_GATEWAY_TIMEOUT 504 #define HTTP_HTTP_VERSION_NOT_SUPPORTED 505 // *********** HTTP lib error codes ********** #define HTTP_E_OUT_OF_MEMORY -2 #define HTTP_E_BAD_MSG_FORMAT -3 #define HTTP_E_TIMEDOUT -4 #define HTTP_E_FILE_READ -5 // ******************************************* #ifdef __cplusplus extern "C" { #endif const char* http_GetCodeText( int statusCode ); #ifdef __cplusplus } // extern C #endif #endif /* GENLIB_NET_HTTP_STATUSCODES_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/parsetools.h0000644000175000017500000000471111021325543016543 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_NET_HTTP_PARSETOOLS_H #define GENLIB_NET_HTTP_PARSETOOLS_H #include "util.h" #include "httpparser.h" #ifdef __cplusplus extern "C" { #endif /************************************************************************ * Function: has_xml_content_type * * Parameters: * IN http_message_t* hmsg ; HTTP Message object * * Description: Find the header from the HTTP message and match the * header for xml data. * * Returns: * BOOLEAN ************************************************************************/ xboolean has_xml_content_type( IN http_message_t* hmsg ); #ifdef __cplusplus } // extern C #endif #endif // GENLIB_NET_HTTP_PARSETOOLS_H libupnp-1.8.0~svn20100507/upnp/src/inc/upnpclosesocket.h0000644000175000017500000000342311021325543017570 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef UPNPCLOSESOCKET_H #define UPNPCLOSESOCKET_H #define UpnpCloseSocket close #endif libupnp-1.8.0~svn20100507/upnp/src/inc/statcodes.h0000644000175000017500000001127611021325543016345 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #ifndef GENLIB_NET_HTTP_STATCODES_H #define GENLIB_NET_HTTP_STATCODES_H // HTTP response status codes #define HTTP_CONTINUE 100 #define HTTP_SWITCHING_PROCOTOLS 101 #define HTTP_OK 200 #define HTTP_CREATED 201 #define HTTP_ACCEPTED 202 #define HTTP_NON_AUTHORATATIVE 203 #define HTTP_NO_CONTENT 204 #define HTTP_RESET_CONTENT 205 #define HTTP_PARTIAL_CONTENT 206 #define HTTP_MULTIPLE_CHOICES 300 #define HTTP_MOVED_PERMANENTLY 301 #define HTTP_FOUND 302 #define HTTP_SEE_OTHER 303 #define HTTP_NOT_MODIFIED 304 #define HTTP_USE_PROXY 305 #define HTTP_UNUSED_3XX 306 #define HTTP_TEMPORARY_REDIRECT 307 #define HTTP_BAD_REQUEST 400 #define HTTP_UNAUTHORIZED 401 #define HTTP_PAYMENT_REQD 402 #define HTTP_FORBIDDEN 403 #define HTTP_NOT_FOUND 404 #define HTTP_METHOD_NOT_ALLOWED 405 #define HTTP_NOT_ACCEPTABLE 406 #define HTTP_PROXY_AUTH_REQD 407 #define HTTP_REQUEST_TIMEOUT 408 #define HTTP_CONFLICT 409 #define HTTP_GONE 410 #define HTTP_LENGTH_REQUIRED 411 #define HTTP_PRECONDITION_FAILED 412 #define HTTP_REQ_ENTITY_TOO_LARGE 413 #define HTTP_REQ_URI_TOO_LONG 414 #define HTTP_UNSUPPORTED_MEDIA_TYPE 415 #define HTTP_REQUEST_RANGE_NOT_SATISFIABLE 416 #define HTTP_EXPECTATION_FAILED 417 #define HTTP_INTERNAL_SERVER_ERROR 500 #define HTTP_NOT_IMPLEMENTED 501 #define HTTP_BAD_GATEWAY 502 #define HTTP_SERVICE_UNAVAILABLE 503 #define HTTP_GATEWAY_TIMEOUT 504 #define HTTP_HTTP_VERSION_NOT_SUPPORTED 505 // *********** HTTP lib error codes ********** #define HTTP_E_OUT_OF_MEMORY -2 #define HTTP_E_BAD_MSG_FORMAT -3 #define HTTP_E_TIMEDOUT -4 #define HTTP_E_FILE_READ -5 // ******************************************* #ifdef __cplusplus extern "C" { #endif /************************************************************************ * Function: http_get_code_text * * Parameters: * int statusCode ; Status code based on which the status table and * status message is returned * * Description: Return the right status message based on the passed in * int statusCode input parameter * * Returns: * const char* ptr - pointer to the status message string ************************************************************************/ const char* http_get_code_text( int statusCode ); #ifdef __cplusplus } // extern C #endif #endif /* GENLIB_NET_HTTP_STATCODES_H */ libupnp-1.8.0~svn20100507/upnp/src/inc/utilall.h0000644000175000017500000000337011021325543016016 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #include #include libupnp-1.8.0~svn20100507/upnp/src/gena/0000777000175000017500000000000011373047472014435 500000000000000libupnp-1.8.0~svn20100507/upnp/src/gena/gena_callback2.c0000644000175000017500000001133011021325543017307 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #include "config.h" #if EXCLUDE_GENA == 0 #include "gena.h" #include "gena_device.h" #include "gena_ctrlpt.h" #include "httpparser.h" #include "httpreadwrite.h" #include "statcodes.h" #include "unixutil.h" /************************************************************************ * Function : error_respond * * Parameters: * IN SOCKINFO *info: Structure containing information about the socket * IN int error_code: error code that will be in the GENA response * IN http_message_t* hmsg: GENA request Packet * * Description: * This function send an error message to the control point in the case * incorrect GENA requests. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ void error_respond( IN SOCKINFO * info, IN int error_code, IN http_message_t * hmsg ) { int major, minor; // retrieve the minor and major version from the GENA request http_CalcResponseVersion( hmsg->major_version, hmsg->minor_version, &major, &minor ); http_SendStatusResponse( info, error_code, major, minor ); } /************************************************************************ * Function : genaCallback * * Parameters: * IN http_parser_t *parser: represents the parse state of the request * IN http_message_t* request: HTTP message containing GENA request * INOUT SOCKINFO *info: Structure containing information about the socket * * Description: * This is the callback function called by the miniserver to handle * incoming GENA requests. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ void genaCallback( IN http_parser_t * parser, IN http_message_t * request, INOUT SOCKINFO * info ) { xboolean found_function = FALSE; if( request->method == HTTPMETHOD_SUBSCRIBE ) { #ifdef INCLUDE_DEVICE_APIS found_function = TRUE; if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) { // renew subscription gena_process_subscription_renewal_request ( info, request ); } else { // subscribe gena_process_subscription_request( info, request ); } UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__, "got subscription request\n" ); } else if( request->method == HTTPMETHOD_UNSUBSCRIBE ) { found_function = TRUE; // unsubscribe gena_process_unsubscribe_request( info, request ); #endif } else if( request->method == HTTPMETHOD_NOTIFY ) { #ifdef INCLUDE_CLIENT_APIS found_function = TRUE; // notify gena_process_notification_event( info, request ); #endif } if( !found_function ) { // handle missing functions of device or ctrl pt error_respond( info, HTTP_NOT_IMPLEMENTED, request ); } } #endif // EXCLUDE_GENA libupnp-1.8.0~svn20100507/upnp/src/gena/gena_device.c0000644000175000017500000012227311336633540016751 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /*! * \file */ #include "config.h" #if EXCLUDE_GENA == 0 #ifdef INCLUDE_DEVICE_APIS #include "gena.h" #include "httpparser.h" #include "httpreadwrite.h" #include "parsetools.h" #include "ssdplib.h" #include "statcodes.h" #include "sysdep.h" #include "unixutil.h" #include "upnpapi.h" #include "uuid.h" /*! * \brief Unregisters a device. * * \return UPNP_E_SUCCESS on success, GENA_E_BAD_HANDLE on failure. */ int genaUnregisterDevice( /*! [in] Device handle. */ UpnpDevice_Handle device_handle) { int ret = 0; struct Handle_Info *handle_info; HandleLock(); if (GetHandleInfo(device_handle, &handle_info) != HND_DEVICE) { UpnpPrintf(UPNP_CRITICAL, GENA, __FILE__, __LINE__, "genaUnregisterDevice: BAD Handle: %d\n", device_handle); ret = GENA_E_BAD_HANDLE; } else { freeServiceTable(&handle_info->ServiceTable); ret = UPNP_E_SUCCESS; } HandleUnlock(); return ret; } /*! * \brief Generates XML property set for notifications. * * \return UPNP_E_SUCCESS if successful else returns GENA_E_BAD_HANDLE. * * \note The XML_VERSION comment is NOT sent due to interoperability issues * with other UPnP vendors. */ static int GeneratePropertySet( /*! [in] Array of variable names (go in the event notify). */ char **names, /*! [in] Array of variable values (go in the event notify). */ char **values, /*! [in] number of variables. */ int count, /*! [out] PropertySet node in the string format. */ DOMString *out) { char *buffer; int counter = 0; int size = 0; int temp_counter = 0; /*size += strlen(XML_VERSION);*/ size += strlen(XML_PROPERTYSET_HEADER); size += strlen("\n\n"); for (temp_counter = 0, counter = 0; counter < count; counter++) { size += strlen( "\n\n" ); size += 2 * strlen(names[counter]) + strlen(values[counter]) + strlen("<>\n"); } buffer = (char *)malloc(size + 1); if (buffer == NULL) { return UPNP_E_OUTOF_MEMORY; } memset(buffer, 0, size + 1); /* strcpy(buffer,XML_VERSION); strcat(buffer, XML_PROPERTYSET_HEADER); */ strcpy(buffer, XML_PROPERTYSET_HEADER); for (counter = 0; counter < count; counter++) { strcat(buffer, "\n"); sprintf(&buffer[strlen(buffer)], "<%s>%s\n\n", names[counter], values[counter], names[counter]); } strcat(buffer, "\n\n"); *out = ixmlCloneDOMString(buffer); free(buffer); return XML_SUCCESS; } /*! * \brief Frees memory used in notify_threads if the reference count is 0, * otherwise decrements the refrence count. */ static void free_notify_struct( /*! [in] Notify structure. */ notify_thread_struct *input) { (*input->reference_count)--; if (*input->reference_count == 0) { free(input->headers); ixmlFreeDOMString(input->propertySet); free(input->servId); free(input->UDN); free(input->reference_count); } free(input); } /*! * \brief Sends the notify message and returns a reply. * * \return on success returns UPNP_E_SUCCESS, otherwise returns a UPNP error. * * \note called by genaNotify */ static UPNP_INLINE int notify_send_and_recv( /*! [in] subscription callback URL (URL of the control point). */ uri_type *destination_url, /*! [in] Common HTTP headers. */ membuffer *mid_msg, /*! [in] The evented XML. */ char *propertySet, /*! [out] The response from the control point. */ http_parser_t *response) { uri_type url; int conn_fd; membuffer start_msg; int ret_code; int err_code; int timeout; SOCKINFO info; // connect UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__, "gena notify to: %.*s\n", (int)destination_url->hostport.text.size, destination_url->hostport.text.buff ); conn_fd = http_Connect( destination_url, &url ); if( conn_fd < 0 ) { return conn_fd; // return UPNP error } if( ( ret_code = sock_init( &info, conn_fd ) ) != 0 ) { sock_destroy( &info, SD_BOTH ); return ret_code; } // make start line and HOST header membuffer_init( &start_msg ); if (http_MakeMessage( &start_msg, 1, 1, "q" "s", HTTPMETHOD_NOTIFY, &url, mid_msg->buf ) != 0 ) { membuffer_destroy( &start_msg ); sock_destroy( &info, SD_BOTH ); return UPNP_E_OUTOF_MEMORY; } timeout = HTTP_DEFAULT_TIMEOUT; // send msg (note +1 for propertyset; null-terminator is also sent) if( ( ret_code = http_SendMessage( &info, &timeout, "bb", start_msg.buf, start_msg.length, propertySet, strlen( propertySet ) + 1 ) ) != 0 ) { membuffer_destroy( &start_msg ); sock_destroy( &info, SD_BOTH ); return ret_code; } if( ( ret_code = http_RecvMessage( &info, response, HTTPMETHOD_NOTIFY, &timeout, &err_code ) ) != 0 ) { membuffer_destroy( &start_msg ); sock_destroy( &info, SD_BOTH ); httpmsg_destroy( &response->msg ); return ret_code; } sock_destroy( &info, SD_BOTH ); //should shutdown completely //when closing socket // sock_destroy( &info,SD_RECEIVE); membuffer_destroy( &start_msg ); return UPNP_E_SUCCESS; } /*! * \brief Function to Notify a particular subscription of a particular event. * * In general the service should NOT be blocked around this call (this may * cause deadlock with a client). * * NOTIFY http request is sent and the reply is processed. * * \return GENA_SUCCESS if the event was delivered, otherwise returns the * appropriate error code. */ static int genaNotify( /*! [in] Null terminated, includes all headers (including \\r\\n) except SID and SEQ. */ char *headers, /*! [in] The evented XML. */ char *propertySet, /*! [in] subscription to be Notified, assumes this is valid for life of function. */ subscription *sub) { int i; membuffer mid_msg; membuffer endmsg; uri_type *url; http_parser_t response; int return_code = -1; membuffer_init( &mid_msg ); // make 'end' msg (the part that won't vary with the destination) endmsg.size_inc = 30; if( http_MakeMessage( &mid_msg, 1, 1, "s" "ssc" "sdcc", headers, "SID: ", sub->sid, "SEQ: ", sub->ToSendEventKey ) != 0 ) { membuffer_destroy( &mid_msg ); return UPNP_E_OUTOF_MEMORY; } // send a notify to each url until one goes thru for( i = 0; i < sub->DeliveryURLs.size; i++ ) { url = &sub->DeliveryURLs.parsedURLs[i]; if( ( return_code = notify_send_and_recv( url, &mid_msg, propertySet, &response ) ) == UPNP_E_SUCCESS ) { break; } } membuffer_destroy( &mid_msg ); if( return_code == UPNP_E_SUCCESS ) { if( response.msg.status_code == HTTP_OK ) { return_code = GENA_SUCCESS; } else { if( response.msg.status_code == HTTP_PRECONDITION_FAILED ) { //Invalid SID gets removed return_code = GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB; } else { return_code = GENA_E_NOTIFY_UNACCEPTED; } } httpmsg_destroy( &response.msg ); } return return_code; } /*! * \brief Thread job to Notify a control point. * * It validates the subscription and copies the subscription. Also make sure * that events are sent in order. * * \note calls the genaNotify to do the actual work. */ static void genaNotifyThread( /*! [in] notify thread structure containing all the headers and property set info. */ void *input) { subscription *sub; service_info *service; subscription sub_copy; notify_thread_struct *in = ( notify_thread_struct * ) input; int return_code; struct Handle_Info *handle_info; ThreadPoolJob job; HandleReadLock(); //validate context if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { free_notify_struct( in ); HandleUnlock(); return; } if( ( ( service = FindServiceId( &handle_info->ServiceTable, in->servId, in->UDN ) ) == NULL ) || ( !service->active ) || ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL ) || ( ( copy_subscription( sub, &sub_copy ) != HTTP_SUCCESS ) ) ) { free_notify_struct( in ); HandleUnlock(); return; } //If the event is out of order push it back to the job queue if( in->eventKey != sub->ToSendEventKey ) { TPJobInit( &job, ( start_routine ) genaNotifyThread, input ); TPJobSetFreeFunction( &job, ( free_function ) free_notify_struct ); TPJobSetPriority( &job, MED_PRIORITY ); ThreadPoolAdd( &gSendThreadPool, &job, NULL ); freeSubscription( &sub_copy ); HandleUnlock(); return; } HandleUnlock(); //send the notify return_code = genaNotify( in->headers, in->propertySet, &sub_copy ); freeSubscription( &sub_copy ); HandleLock(); if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { free_notify_struct( in ); HandleUnlock(); return; } //validate context if( ( ( service = FindServiceId( &handle_info->ServiceTable, in->servId, in->UDN ) ) == NULL ) || ( !service->active ) || ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL ) ) { free_notify_struct( in ); HandleUnlock(); return; } sub->ToSendEventKey++; if( sub->ToSendEventKey < 0 ) //wrap to 1 for overflow sub->ToSendEventKey = 1; if( return_code == GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB ) { RemoveSubscriptionSID( in->sid, service ); } free_notify_struct( in ); HandleUnlock(); } /*! * \brief Allocates the GENA header. * * \note The header must be destroyed after with a call to free(), otherwise * there will be a memory leak. * * \return The constructed header. */ static char *AllocGenaHeaders( /*! [in] The property set string. */ const DOMString propertySet) { static const char *HEADER_LINE_1 = "CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n"; static const char *HEADER_LINE_2A = "CONTENT-LENGTH: "; static const char *HEADER_LINE_2B = "\r\n"; static const char *HEADER_LINE_3 = "NT: upnp:event\r\n"; static const char *HEADER_LINE_4 = "NTS: upnp:propchange\r\n"; char *headers = NULL; int headers_size = 0; int line = 0; headers_size = strlen(HEADER_LINE_1 ) + strlen(HEADER_LINE_2A) + MAX_CONTENT_LENGTH + strlen(HEADER_LINE_2B) + strlen(HEADER_LINE_3 ) + strlen(HEADER_LINE_4 ) + 1; headers = (char *)malloc(headers_size); if (headers == NULL) { line = __LINE__; goto ExitFunction; } sprintf(headers, "%s%s%"PRIzu"%s%s%s", HEADER_LINE_1, HEADER_LINE_2A, strlen(propertySet) + 1, HEADER_LINE_2B, HEADER_LINE_3, HEADER_LINE_4); ExitFunction: if (headers == NULL) { UpnpPrintf(UPNP_ALL, GENA, __FILE__, line, "AllocGenaHeaders(): Error UPNP_E_OUTOF_MEMORY\n"); } return headers; } int genaInitNotify( UpnpDevice_Handle device_handle, char *UDN, char *servId, char **VarNames, char **VarValues, int var_count, const Upnp_SID sid) { int ret = GENA_SUCCESS; int line = 0; int *reference_count = NULL; char *UDN_copy = NULL; char *servId_copy = NULL; DOMString propertySet = NULL; char *headers = NULL; notify_thread_struct *thread_struct = NULL; subscription *sub = NULL; service_info *service = NULL; struct Handle_Info *handle_info; ThreadPoolJob job; UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENA BEGIN INITIAL NOTIFY"); reference_count = (int *)malloc(sizeof (int)); if (reference_count == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } *reference_count = 0; UDN_copy = (char *)malloc(strlen(UDN) + 1); if (UDN_copy == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } servId_copy = (char *)malloc(strlen(servId) + 1); if (servId_copy == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } strcpy(UDN_copy, UDN); strcpy(servId_copy, servId); HandleLock(); if (GetHandleInfo(device_handle, &handle_info) != HND_DEVICE) { line = __LINE__; ret = GENA_E_BAD_HANDLE; goto ExitFunction; } service = FindServiceId(&handle_info->ServiceTable, servId, UDN); if (service == NULL) { line = __LINE__; ret = GENA_E_BAD_SERVICE; goto ExitFunction; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "FOUND SERVICE IN INIT NOTFY: UDN %s, ServID: %s", UDN, servId); sub = GetSubscriptionSID(sid, service); if (sub == NULL || sub->active) { line = __LINE__; ret = GENA_E_BAD_SID; goto ExitFunction; } UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s", sid); sub->active = 1; if (var_count <= 0) { line = __LINE__; ret = GENA_SUCCESS; goto ExitFunction; } ret = GeneratePropertySet(VarNames, VarValues, var_count, &propertySet); if (ret != XML_SUCCESS) { line = __LINE__; goto ExitFunction; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENERATED PROPERTY SET IN INIT NOTIFY: %s", propertySet); headers = AllocGenaHeaders(propertySet); if (headers == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } /* schedule thread for initial notification */ thread_struct = (notify_thread_struct *)malloc(sizeof (notify_thread_struct)); if (thread_struct == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; } else { *reference_count = 1; thread_struct->servId = servId_copy; thread_struct->UDN = UDN_copy; thread_struct->headers = headers; thread_struct->propertySet = propertySet; strcpy(thread_struct->sid, sid); thread_struct->eventKey = sub->eventKey++; thread_struct->reference_count = reference_count; thread_struct->device_handle = device_handle; TPJobInit(&job, (start_routine)genaNotifyThread, thread_struct); TPJobSetFreeFunction(&job, (free_routine)free_notify_struct); TPJobSetPriority(&job, MED_PRIORITY); ret = ThreadPoolAdd(&gSendThreadPool, &job, NULL); if (ret != 0) { if (ret == EOUTOFMEM) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; } } else { line = __LINE__; ret = GENA_SUCCESS; } } ExitFunction: if (ret != GENA_SUCCESS || var_count <= 0) { free(thread_struct); free(headers); ixmlFreeDOMString(propertySet); free(servId_copy); free(UDN_copy); free(reference_count); } HandleUnlock(); UpnpPrintf(UPNP_INFO, GENA, __FILE__, line, "GENA END INITIAL NOTIFY, ret = %d", ret); return ret; } int genaInitNotifyExt( UpnpDevice_Handle device_handle, char *UDN, char *servId, IXML_Document *PropSet, const Upnp_SID sid) { int ret = GENA_SUCCESS; int line = 0; int *reference_count = NULL; char *UDN_copy = NULL; char *servId_copy = NULL; DOMString propertySet = NULL; char *headers = NULL; notify_thread_struct *thread_struct = NULL; subscription *sub = NULL; service_info *service = NULL; struct Handle_Info *handle_info; ThreadPoolJob job; UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENA BEGIN INITIAL NOTIFY EXT"); reference_count = (int *)malloc(sizeof (int)); if (reference_count == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } *reference_count = 0; UDN_copy = (char *)malloc(strlen(UDN) + 1); if (UDN_copy == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } servId_copy = (char *)malloc(strlen(servId) + 1); if( servId_copy == NULL ) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } strcpy(UDN_copy, UDN); strcpy(servId_copy, servId); HandleLock(); if (GetHandleInfo(device_handle, &handle_info) != HND_DEVICE) { line = __LINE__; ret = GENA_E_BAD_HANDLE; goto ExitFunction; } service = FindServiceId(&handle_info->ServiceTable, servId, UDN); if (service == NULL) { line = __LINE__; ret = GENA_E_BAD_SERVICE; goto ExitFunction; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "FOUND SERVICE IN INIT NOTFY EXT: UDN %s, ServID: %s", UDN, servId); sub = GetSubscriptionSID(sid, service); if (sub == NULL || sub->active) { line = __LINE__; ret = GENA_E_BAD_SID; goto ExitFunction; } UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s", sid); sub->active = 1; if (PropSet == 0) { line = __LINE__; ret = GENA_SUCCESS; goto ExitFunction; } propertySet = ixmlPrintNode((IXML_Node *)PropSet); if (propertySet == NULL) { line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto ExitFunction; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENERATED PROPERTY SET IN INIT EXT NOTIFY: %s", propertySet); headers = AllocGenaHeaders(propertySet); if (headers == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } /* schedule thread for initial notification */ thread_struct = (notify_thread_struct *)malloc(sizeof (notify_thread_struct)); if (thread_struct == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; } else { *reference_count = 1; thread_struct->servId = servId_copy; thread_struct->UDN = UDN_copy; thread_struct->headers = headers; thread_struct->propertySet = propertySet; strcpy(thread_struct->sid, sid); thread_struct->eventKey = sub->eventKey++; thread_struct->reference_count = reference_count; thread_struct->device_handle = device_handle; TPJobInit(&job, (start_routine)genaNotifyThread, thread_struct); TPJobSetFreeFunction(&job, (free_routine)free_notify_struct); TPJobSetPriority(&job, MED_PRIORITY); ret = ThreadPoolAdd(&gSendThreadPool, &job, NULL); if (ret != 0) { if (ret == EOUTOFMEM) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; } } else { line = __LINE__; ret = GENA_SUCCESS; } } ExitFunction: if (ret != GENA_SUCCESS || PropSet == 0) { free(thread_struct); free(headers); ixmlFreeDOMString(propertySet); free(servId_copy); free(UDN_copy); free(reference_count); } HandleUnlock(); UpnpPrintf(UPNP_INFO, GENA, __FILE__, line, "GENA END INITIAL NOTIFY EXT, ret = %d", ret); return ret; } int genaNotifyAllExt( UpnpDevice_Handle device_handle, char *UDN, char *servId, IXML_Document *PropSet) { int ret = GENA_SUCCESS; int line = 0; int *reference_count = NULL; char *UDN_copy = NULL; char *servId_copy = NULL; DOMString propertySet = NULL; char *headers = NULL; notify_thread_struct *thread_struct = NULL; subscription *finger = NULL; service_info *service = NULL; struct Handle_Info *handle_info; ThreadPoolJob job; UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENA BEGIN NOTIFY ALL EXT"); reference_count = (int *)malloc(sizeof (int)); if (reference_count == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } *reference_count = 0; UDN_copy = (char *)malloc(strlen(UDN) + 1); if (UDN_copy == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } servId_copy = (char *)malloc(strlen(servId) + 1); if( servId_copy == NULL ) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } strcpy(UDN_copy, UDN); strcpy(servId_copy, servId); propertySet = ixmlPrintNode((IXML_Node *)PropSet); if (propertySet == NULL) { line = __LINE__; ret = UPNP_E_INVALID_PARAM; goto ExitFunction; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENERATED PROPERTY SET IN EXT NOTIFY: %s", propertySet); headers = AllocGenaHeaders(propertySet); if (headers == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } HandleLock(); if (GetHandleInfo(device_handle, &handle_info) != HND_DEVICE) { line = __LINE__; ret = GENA_E_BAD_HANDLE; } else { service = FindServiceId(&handle_info->ServiceTable, servId, UDN); if (service != NULL) { finger = GetFirstSubscription(service); while (finger) { thread_struct = (notify_thread_struct *)malloc(sizeof (notify_thread_struct)); if (thread_struct == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; break; } (*reference_count)++; thread_struct->reference_count = reference_count; thread_struct->UDN = UDN_copy; thread_struct->servId = servId_copy; thread_struct->headers = headers; thread_struct->propertySet = propertySet; strcpy(thread_struct->sid, finger->sid); thread_struct->eventKey = finger->eventKey++; thread_struct->device_handle = device_handle; /* if overflow, wrap to 1 */ if (finger->eventKey < 0) { finger->eventKey = 1; } TPJobInit(&job, (start_routine)genaNotifyThread, thread_struct); TPJobSetFreeFunction(&job, (free_routine)free_notify_struct); TPJobSetPriority(&job, MED_PRIORITY); ret = ThreadPoolAdd(&gSendThreadPool, &job, NULL); if (ret != 0) { line = __LINE__; if (ret == EOUTOFMEM) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; } break; } finger = GetNextSubscription(service, finger); } } else { line = __LINE__; ret = GENA_E_BAD_SERVICE; } } ExitFunction: if (ret != GENA_SUCCESS || *reference_count == 0) { free(headers); ixmlFreeDOMString(propertySet); free(servId_copy); free(UDN_copy); free(reference_count); } HandleUnlock(); UpnpPrintf(UPNP_INFO, GENA, __FILE__, line, "GENA END NOTIFY ALL EXT, ret = %d", ret); return ret; } int genaNotifyAll( UpnpDevice_Handle device_handle, char *UDN, char *servId, char **VarNames, char **VarValues, int var_count) { int ret = GENA_SUCCESS; int line = 0; int *reference_count = NULL; char *UDN_copy = NULL; char *servId_copy = NULL; DOMString propertySet = NULL; char *headers = NULL; notify_thread_struct *thread_struct = NULL; subscription *finger = NULL; service_info *service = NULL; struct Handle_Info *handle_info; ThreadPoolJob job; UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENA BEGIN NOTIFY ALL"); reference_count = (int *)malloc(sizeof (int)); if (reference_count == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } *reference_count = 0; UDN_copy = (char *)malloc(strlen(UDN) + 1); if (UDN_copy == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } servId_copy = (char *)malloc(strlen(servId) + 1); if( servId_copy == NULL ) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } strcpy(UDN_copy, UDN); strcpy(servId_copy, servId); ret = GeneratePropertySet(VarNames, VarValues, var_count, &propertySet); if (ret != XML_SUCCESS) { line = __LINE__; goto ExitFunction; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENERATED PROPERTY SET IN EXT NOTIFY: %s", propertySet); headers = AllocGenaHeaders(propertySet); if (headers == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; goto ExitFunction; } HandleLock(); if (GetHandleInfo(device_handle, &handle_info) != HND_DEVICE) { line = __LINE__; ret = GENA_E_BAD_HANDLE; } else { service = FindServiceId(&handle_info->ServiceTable, servId, UDN); if (service != NULL) { finger = GetFirstSubscription(service); while (finger) { thread_struct = (notify_thread_struct *)malloc(sizeof (notify_thread_struct)); if (thread_struct == NULL) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; break; } (*reference_count)++; thread_struct->reference_count = reference_count; thread_struct->UDN = UDN_copy; thread_struct->servId = servId_copy; thread_struct->headers = headers; thread_struct->propertySet = propertySet; strcpy(thread_struct->sid, finger->sid); thread_struct->eventKey = finger->eventKey++; thread_struct->device_handle = device_handle; /* if overflow, wrap to 1 */ if (finger->eventKey < 0) { finger->eventKey = 1; } TPJobInit(&job, (start_routine)genaNotifyThread, thread_struct); TPJobSetFreeFunction(&job, (free_routine)free_notify_struct); TPJobSetPriority(&job, MED_PRIORITY); ret = ThreadPoolAdd(&gSendThreadPool, &job, NULL); if (ret != 0) { line = __LINE__; if (ret == EOUTOFMEM) { line = __LINE__; ret = UPNP_E_OUTOF_MEMORY; } break; } finger = GetNextSubscription(service, finger); } } else { line = __LINE__; ret = GENA_E_BAD_SERVICE; } } ExitFunction: if (ret != GENA_SUCCESS || *reference_count == 0) { free(headers); ixmlFreeDOMString(propertySet); free(servId_copy); free(UDN_copy); free(reference_count); } HandleUnlock(); UpnpPrintf(UPNP_INFO, GENA, __FILE__, line, "GENA END NOTIFY ALL, ret = %d", ret); return ret; } /*! * \brief Returns OK message in the case of a subscription request. * * \return UPNP_E_SUCCESS if successful, otherwise the appropriate error code. */ static int respond_ok( /*! [in] Socket connection of request. */ SOCKINFO *info, /*! [in] Accepted duration. */ int time_out, /*! [in] Accepted subscription. */ subscription *sub, /*! [in] Http request. */ http_message_t *request) { int major; int minor; membuffer response; int return_code; char timeout_str[100]; int upnp_timeout = UPNP_TIMEOUT; http_CalcResponseVersion( request->major_version, request->minor_version, &major, &minor ); if( time_out >= 0 ) { sprintf( timeout_str, "TIMEOUT: Second-%d", time_out ); } else { strcpy( timeout_str, "TIMEOUT: Second-infinite" ); } membuffer_init( &response ); response.size_inc = 30; if( http_MakeMessage( &response, major, minor, "R" "D" "S" "N" "Xc" "ssc" "scc", HTTP_OK, (off_t)0, X_USER_AGENT, "SID: ", sub->sid, timeout_str ) != 0 ) { membuffer_destroy( &response ); error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); return UPNP_E_OUTOF_MEMORY; } return_code = http_SendMessage( info, &upnp_timeout, "b", response.buf, response.length ); membuffer_destroy( &response ); return return_code; } /*! * \brief Function to parse the Callback header value in subscription requests. * * Takes in a buffer containing URLS delimited by '<' and '>'. The entire buffer * is copied into dynamic memory and stored in the URL_list. Pointers to the * individual urls within this buffer are allocated and stored in the URL_list. * Only URLs with network addresses are considered (i.e. host:port or domain name). * * \return The number of URLs parsed if successful, otherwise UPNP_E_OUTOF_MEMORY. */ static int create_url_list( /*! [in] . */ memptr *url_list, /*! [out] . */ URL_list *out) { int URLcount = 0; int i; int return_code = 0; uri_type temp; token urls; token *URLS; urls.buff = url_list->buf; urls.size = url_list->length; URLS = &urls; out->size = 0; out->URLs = NULL; out->parsedURLs = NULL; for( i = 0; i < URLS->size; i++ ) { if( ( URLS->buff[i] == '<' ) && ( i + 1 < URLS->size ) ) { if( ( ( return_code = parse_uri( &URLS->buff[i + 1], URLS->size - i + 1, &temp ) ) == HTTP_SUCCESS ) && ( temp.hostport.text.size != 0 ) ) { URLcount++; } else { if( return_code == UPNP_E_OUTOF_MEMORY ) { return return_code; } } } } if( URLcount > 0 ) { out->URLs = ( char * )malloc( URLS->size + 1 ); out->parsedURLs = ( uri_type * ) malloc( sizeof( uri_type ) * URLcount ); if( ( out->URLs == NULL ) || ( out->parsedURLs == NULL ) ) { free( out->URLs ); free( out->parsedURLs ); out->URLs = NULL; out->parsedURLs = NULL; return UPNP_E_OUTOF_MEMORY; } memcpy( out->URLs, URLS->buff, URLS->size ); out->URLs[URLS->size] = 0; URLcount = 0; for( i = 0; i < URLS->size; i++ ) { if( ( URLS->buff[i] == '<' ) && ( i + 1 < URLS->size ) ) { if( ( ( return_code = parse_uri( &out->URLs[i + 1], URLS->size - i + 1, &out->parsedURLs[URLcount] ) ) == HTTP_SUCCESS ) && ( out->parsedURLs[URLcount].hostport.text.size != 0 ) ) { URLcount++; } else { if( return_code == UPNP_E_OUTOF_MEMORY ) { free( out->URLs ); free( out->parsedURLs ); out->URLs = NULL; out->parsedURLs = NULL; return return_code; } } } } } out->size = URLcount; return URLcount; } void gena_process_subscription_request( SOCKINFO *info, http_message_t *request) { UpnpSubscriptionRequest *request_struct = UpnpSubscriptionRequest_new(); Upnp_SID temp_sid; int return_code = 1; int time_out = 1801; service_info *service; subscription *sub; uuid_upnp uid; struct Handle_Info *handle_info; void *cookie; Upnp_FunPtr callback_fun; UpnpDevice_Handle device_handle; memptr nt_hdr; char *event_url_path = NULL; memptr callback_hdr; memptr timeout_hdr; UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "Subscription Request Received:\n"); if (httpmsg_find_hdr(request, HDR_NT, &nt_hdr) == NULL) { error_respond(info, HTTP_BAD_REQUEST, request); goto exit_function; } // check NT header // Windows Millenium Interoperability: // we accept either upnp:event, or upnp:propchange for the NT header if (memptr_cmp_nocase(&nt_hdr, "upnp:event") != 0) { error_respond(info, HTTP_PRECONDITION_FAILED, request); goto exit_function; } // if a SID is present then the we have a bad request "incompatible headers" if (httpmsg_find_hdr(request, HDR_SID, NULL) != NULL) { error_respond(info, HTTP_BAD_REQUEST, request); goto exit_function; } // look up service by eventURL event_url_path = str_alloc(request->uri.pathquery.buff, request->uri.pathquery.size); if (event_url_path == NULL) { error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request); goto exit_function; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "SubscriptionRequest for event URL path: %s\n", event_url_path); HandleLock(); // CURRENTLY, ONLY ONE DEVICE if (GetDeviceHandleInfo(info->foreign_sockaddr.ss_family , &device_handle, &handle_info) != HND_DEVICE) { free(event_url_path); error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request); HandleUnlock(); goto exit_function; } service = FindServiceEventURLPath(&handle_info->ServiceTable, event_url_path); free(event_url_path); if (service == NULL || !service->active) { error_respond(info, HTTP_NOT_FOUND, request); HandleUnlock(); goto exit_function; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "Subscription Request: Number of Subscriptions already %d\n " "Max Subscriptions allowed: %d\n", service->TotalSubscriptions, handle_info->MaxSubscriptions); // too many subscriptions if (handle_info->MaxSubscriptions != -1 && service->TotalSubscriptions >= handle_info->MaxSubscriptions) { error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request); HandleUnlock(); goto exit_function; } // generate new subscription sub = (subscription *)malloc(sizeof (subscription)); if (sub == NULL) { error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request); HandleUnlock(); goto exit_function; } sub->eventKey = 0; sub->ToSendEventKey = 0; sub->active = 0; sub->next = NULL; sub->DeliveryURLs.size = 0; sub->DeliveryURLs.URLs = NULL; sub->DeliveryURLs.parsedURLs = NULL; // check for valid callbacks if (httpmsg_find_hdr( request, HDR_CALLBACK, &callback_hdr) == NULL) { error_respond(info, HTTP_PRECONDITION_FAILED, request); freeSubscriptionList(sub); HandleUnlock(); goto exit_function; } return_code = create_url_list(&callback_hdr, &sub->DeliveryURLs); if (return_code == 0) { error_respond(info, HTTP_PRECONDITION_FAILED, request); freeSubscriptionList(sub); HandleUnlock(); goto exit_function; } if (return_code == UPNP_E_OUTOF_MEMORY) { error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request); freeSubscriptionList(sub); HandleUnlock(); goto exit_function; } // set the timeout if (httpmsg_find_hdr(request, HDR_TIMEOUT, &timeout_hdr) != NULL) { if (matchstr(timeout_hdr.buf, timeout_hdr.length, "%iSecond-%d%0", &time_out) == PARSE_OK) { // nothing } else if(memptr_cmp_nocase(&timeout_hdr, "Second-infinite") == 0) { // infinite timeout time_out = -1; } else { // default is > 1800 seconds time_out = DEFAULT_TIMEOUT; } } // replace infinite timeout with max timeout, if possible if (handle_info->MaxSubscriptionTimeOut != -1) { if (time_out == -1 || time_out > handle_info->MaxSubscriptionTimeOut) { time_out = handle_info->MaxSubscriptionTimeOut; } } if (time_out >= 0) { sub->expireTime = time(NULL) + time_out; } else { // infinite time sub->expireTime = 0; } // generate SID uuid_create(&uid); uuid_unpack(&uid, temp_sid); sprintf(sub->sid, "uuid:%s", temp_sid); // respond OK if (respond_ok(info, time_out, sub, request) != UPNP_E_SUCCESS) { freeSubscriptionList(sub); HandleUnlock(); goto exit_function; } // add to subscription list sub->next = service->subscriptionList; service->subscriptionList = sub; service->TotalSubscriptions++; // finally generate callback for init table dump UpnpSubscriptionRequest_strcpy_ServiceId(request_struct, service->serviceId); UpnpSubscriptionRequest_strcpy_UDN(request_struct, service->UDN); UpnpSubscriptionRequest_strcpy_SID(request_struct, sub->sid); // copy callback callback_fun = handle_info->Callback; cookie = handle_info->Cookie; HandleUnlock(); // make call back with request struct // in the future should find a way of mainting that the handle // is not unregistered in the middle of a callback callback_fun(UPNP_EVENT_SUBSCRIPTION_REQUEST, request_struct, cookie); exit_function: UpnpSubscriptionRequest_delete(request_struct); } void gena_process_subscription_renewal_request( SOCKINFO *info, http_message_t *request) { Upnp_SID sid; subscription *sub; int time_out = 1801; service_info *service; struct Handle_Info *handle_info; UpnpDevice_Handle device_handle; memptr temp_hdr; membuffer event_url_path; memptr timeout_hdr; // if a CALLBACK or NT header is present, then it is an error if( httpmsg_find_hdr( request, HDR_CALLBACK, NULL ) != NULL || httpmsg_find_hdr( request, HDR_NT, NULL ) != NULL ) { error_respond( info, HTTP_BAD_REQUEST, request ); return; } // get SID if( httpmsg_find_hdr( request, HDR_SID, &temp_hdr ) == NULL || temp_hdr.length > SID_SIZE ) { error_respond( info, HTTP_PRECONDITION_FAILED, request ); return; } memcpy( sid, temp_hdr.buf, temp_hdr.length ); sid[temp_hdr.length] = '\0'; // lookup service by eventURL membuffer_init( &event_url_path ); if( membuffer_append( &event_url_path, request->uri.pathquery.buff, request->uri.pathquery.size ) != 0 ) { error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); return; } HandleLock(); // CURRENTLY, ONLY SUPPORT ONE DEVICE if( GetDeviceHandleInfo( info->foreign_sockaddr.ss_family, &device_handle, &handle_info ) != HND_DEVICE ) { error_respond( info, HTTP_PRECONDITION_FAILED, request ); membuffer_destroy( &event_url_path ); HandleUnlock(); return; } service = FindServiceEventURLPath( &handle_info->ServiceTable, event_url_path.buf ); membuffer_destroy( &event_url_path ); // get subscription if( service == NULL || !service->active || ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ) { error_respond( info, HTTP_PRECONDITION_FAILED, request ); HandleUnlock(); return; } UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "Renew request: Number of subscriptions already: %d\n " "Max Subscriptions allowed:%d\n", service->TotalSubscriptions, handle_info->MaxSubscriptions ); // too many subscriptions if( handle_info->MaxSubscriptions != -1 && service->TotalSubscriptions > handle_info->MaxSubscriptions ) { error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); RemoveSubscriptionSID( sub->sid, service ); HandleUnlock(); return; } // set the timeout if( httpmsg_find_hdr( request, HDR_TIMEOUT, &timeout_hdr ) != NULL ) { if( matchstr( timeout_hdr.buf, timeout_hdr.length, "%iSecond-%d%0", &time_out ) == PARSE_OK ) { //nothing } else if( memptr_cmp_nocase( &timeout_hdr, "Second-infinite" ) == 0 ) { time_out = -1; // inifinite timeout } else { time_out = DEFAULT_TIMEOUT; // default is > 1800 seconds } } // replace infinite timeout with max timeout, if possible if( handle_info->MaxSubscriptionTimeOut != -1 ) { if( time_out == -1 || time_out > handle_info->MaxSubscriptionTimeOut ) { time_out = handle_info->MaxSubscriptionTimeOut; } } if( time_out == -1 ) { sub->expireTime = 0; } else { sub->expireTime = time( NULL ) + time_out; } if( respond_ok( info, time_out, sub, request ) != UPNP_E_SUCCESS ) { RemoveSubscriptionSID( sub->sid, service ); } HandleUnlock(); } void gena_process_unsubscribe_request( SOCKINFO *info, http_message_t *request) { Upnp_SID sid; service_info *service; struct Handle_Info *handle_info; UpnpDevice_Handle device_handle; memptr temp_hdr; membuffer event_url_path; // if a CALLBACK or NT header is present, then it is an error if( httpmsg_find_hdr( request, HDR_CALLBACK, NULL ) != NULL || httpmsg_find_hdr( request, HDR_NT, NULL ) != NULL ) { error_respond( info, HTTP_BAD_REQUEST, request ); return; } // get SID if( httpmsg_find_hdr( request, HDR_SID, &temp_hdr ) == NULL || temp_hdr.length > SID_SIZE ) { error_respond( info, HTTP_PRECONDITION_FAILED, request ); return; } memcpy( sid, temp_hdr.buf, temp_hdr.length ); sid[temp_hdr.length] = '\0'; // lookup service by eventURL membuffer_init( &event_url_path ); if( membuffer_append( &event_url_path, request->uri.pathquery.buff, request->uri.pathquery.size ) != 0 ) { error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); return; } HandleLock(); // CURRENTLY, ONLY SUPPORT ONE DEVICE if( GetDeviceHandleInfo( info->foreign_sockaddr.ss_family, &device_handle, &handle_info ) != HND_DEVICE ) { error_respond( info, HTTP_PRECONDITION_FAILED, request ); membuffer_destroy( &event_url_path ); HandleUnlock(); return; } service = FindServiceEventURLPath( &handle_info->ServiceTable, event_url_path.buf ); membuffer_destroy( &event_url_path ); // validate service if( service == NULL || !service->active || GetSubscriptionSID( sid, service ) == NULL ) { error_respond( info, HTTP_PRECONDITION_FAILED, request ); HandleUnlock(); return; } RemoveSubscriptionSID(sid, service); error_respond(info, HTTP_OK, request); // success HandleUnlock(); } #endif /* INCLUDE_DEVICE_APIS */ #endif /* EXCLUDE_GENA */ libupnp-1.8.0~svn20100507/upnp/src/gena/gena_ctrlpt.c0000644000175000017500000005213011365106163017012 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "config.h" /*! * \file */ #if EXCLUDE_GENA == 0 #ifdef INCLUDE_CLIENT_APIS #include "EventSubscribe.h" #include "gena.h" #include "httpparser.h" #include "httpreadwrite.h" #include "parsetools.h" #include "statcodes.h" #include "sysdep.h" #include "uuid.h" #include "upnpapi.h" extern ithread_mutex_t GlobalClientSubscribeMutex; /*! * \brief This is a thread function to send the renewal just before the * subscription times out. */ static void GenaAutoRenewSubscription( /*! [in] Thread data(upnp_timeout *) needed to send the renewal. */ IN void *input) { upnp_timeout *event = (upnp_timeout *) input; UpnpEventSubscribe *sub_struct = (UpnpEventSubscribe *)event->Event; void *cookie; Upnp_FunPtr callback_fun; struct Handle_Info *handle_info; int send_callback = 0; int eventType = 0; int timeout = 0; int errCode = 0; if (AUTO_RENEW_TIME == 0) { UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "GENA SUB EXPIRED"); UpnpEventSubscribe_set_ErrCode(sub_struct, UPNP_E_SUCCESS); send_callback = 1; eventType = UPNP_EVENT_SUBSCRIPTION_EXPIRED; } else { UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENA AUTO RENEW"); timeout = UpnpEventSubscribe_get_TimeOut(sub_struct); errCode = genaRenewSubscription( event->handle, UpnpEventSubscribe_get_SID(sub_struct), &timeout); UpnpEventSubscribe_set_ErrCode(sub_struct, errCode); UpnpEventSubscribe_set_TimeOut(sub_struct, timeout); if (errCode != UPNP_E_SUCCESS && errCode != GENA_E_BAD_SID && errCode != GENA_E_BAD_HANDLE) { send_callback = 1; eventType = UPNP_EVENT_AUTORENEWAL_FAILED; } } if (send_callback) { HandleReadLock(); if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) { HandleUnlock(); free_upnp_timeout(event); goto end_function; } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "HANDLE IS VALID"); // make callback callback_fun = handle_info->Callback; cookie = handle_info->Cookie; HandleUnlock(); callback_fun(eventType, event->Event, cookie); } free_upnp_timeout(event); end_function: return; } /*! * \brief Schedules a job to renew the subscription just before time out. * * \return GENA_E_SUCCESS if successful, otherwise returns the appropriate * error code. */ static int ScheduleGenaAutoRenew( /*! [in] Handle that also contains the subscription list. */ IN int client_handle, /*! [in] The time out value of the subscription. */ IN int TimeOut, /*! [in] Subscription being renewed. */ IN ClientSubscription *sub) { UpnpEventSubscribe *RenewEventStruct = NULL; upnp_timeout *RenewEvent = NULL; int return_code = GENA_SUCCESS; ThreadPoolJob job; if (TimeOut == UPNP_INFINITE) { return_code = GENA_SUCCESS; goto end_function; } RenewEventStruct = UpnpEventSubscribe_new(); if (RenewEventStruct == NULL) { return_code = UPNP_E_OUTOF_MEMORY; goto end_function; } RenewEvent = (upnp_timeout *) malloc(sizeof(upnp_timeout)); if (RenewEvent == NULL) { free(RenewEventStruct); return_code = UPNP_E_OUTOF_MEMORY; goto end_function; } // schedule expire event UpnpEventSubscribe_set_ErrCode(RenewEventStruct, UPNP_E_SUCCESS); UpnpEventSubscribe_set_TimeOut(RenewEventStruct, TimeOut); UpnpEventSubscribe_set_SID(RenewEventStruct, GenlibClientSubscription_get_SID(sub)); UpnpEventSubscribe_set_PublisherUrl(RenewEventStruct, GenlibClientSubscription_get_EventURL(sub)); // RenewEvent->EventType=UPNP_EVENT_SUBSCRIPTION_EXPIRE; RenewEvent->handle = client_handle; RenewEvent->Event = RenewEventStruct; TPJobInit(&job, (start_routine) GenaAutoRenewSubscription, RenewEvent); TPJobSetFreeFunction(&job, (free_routine)free_upnp_timeout); TPJobSetPriority(&job, MED_PRIORITY); // Schedule the job return_code = TimerThreadSchedule( &gTimerThread, TimeOut - AUTO_RENEW_TIME, REL_SEC, &job, SHORT_TERM, &(RenewEvent->eventId)); if (return_code != UPNP_E_SUCCESS) { free(RenewEvent); free(RenewEventStruct); goto end_function; } GenlibClientSubscription_set_RenewEventId(sub, RenewEvent->eventId); return_code = GENA_SUCCESS; end_function: return return_code; } /*! * \brief Sends the UNSUBCRIBE gena request and recieves the response from the * device and returns it as a parameter. * * \returns 0 if successful, otherwise returns the appropriate error code. */ static int gena_unsubscribe( /*! [in] Event URL of the service. */ IN const UpnpString *url, /*! [in] The subcription ID. */ IN const UpnpString *sid, /*! [out] The UNSUBCRIBE response from the device. */ OUT http_parser_t *response ) { int return_code; uri_type dest_url; membuffer request; // parse url return_code = http_FixStrUrl( UpnpString_get_String(url), UpnpString_get_Length(url), &dest_url); if (return_code != 0) { return return_code; } // make request msg membuffer_init(&request); request.size_inc = 30; return_code = http_MakeMessage( &request, 1, 1, "q" "ssc" "Uc", HTTPMETHOD_UNSUBSCRIBE, &dest_url, "SID: ", UpnpString_get_String(sid)); // Not able to make the message so destroy the existing buffer if (return_code != 0) { membuffer_destroy(&request); return return_code; } // send request and get reply return_code = http_RequestAndResponse( &dest_url, request.buf, request.length, HTTPMETHOD_UNSUBSCRIBE, HTTP_DEFAULT_TIMEOUT, response); membuffer_destroy(&request); if (return_code != 0) { httpmsg_destroy(&response->msg); } if (return_code == 0 && response->msg.status_code != HTTP_OK) { return_code = UPNP_E_UNSUBSCRIBE_UNACCEPTED; httpmsg_destroy(&response->msg); } return return_code; } /*! * \brief Subscribes or renew subscription. * * \return 0 if successful, otherwise returns the appropriate error code. */ static int gena_subscribe( /*! [in] URL of service to subscribe. */ IN const UpnpString *url, /*! [in,out] Subscription time desired (in secs). */ INOUT int *timeout, /*! [in] for renewal, this contains a currently held subscription SID. * For first time subscription, this must be NULL. */ IN const UpnpString *renewal_sid, /*! [out] SID returned by the subscription or renew msg. */ OUT UpnpString *sid) { int return_code; int parse_ret = 0; int local_timeout = CP_MINIMUM_SUBSCRIPTION_TIME; memptr sid_hdr; memptr timeout_hdr; char timeout_str[25]; membuffer request; uri_type dest_url; http_parser_t response; UpnpString_clear(sid); // request timeout to string if (timeout == NULL) { timeout = &local_timeout; } if (*timeout < 0) { strcpy(timeout_str, "infinite"); } else if(*timeout < CP_MINIMUM_SUBSCRIPTION_TIME) { sprintf(timeout_str, "%d", CP_MINIMUM_SUBSCRIPTION_TIME); } else { sprintf(timeout_str, "%d", *timeout); } // parse url return_code = http_FixStrUrl( UpnpString_get_String(url), UpnpString_get_Length(url), &dest_url); if (return_code != 0) { return return_code; } // make request msg membuffer_init(&request); request.size_inc = 30; if (renewal_sid) { // renew subscription return_code = http_MakeMessage( &request, 1, 1, "q" "ssc" "sscc", HTTPMETHOD_SUBSCRIBE, &dest_url, "SID: ", UpnpString_get_String(renewal_sid), "TIMEOUT: Second-", timeout_str ); } else { // subscribe if( dest_url.hostport.IPaddress.ss_family == AF_INET6 ) { return_code = http_MakeMessage( &request, 1, 1, "q" "sssdsc" "sc" "sscc", HTTPMETHOD_SUBSCRIBE, &dest_url, "CALLBACK: ", "NT: upnp:event", "TIMEOUT: Second-", timeout_str ); } else { return_code = http_MakeMessage( &request, 1, 1, "q" "sssdsc" "sc" "sscc", HTTPMETHOD_SUBSCRIBE, &dest_url, "CALLBACK: ", "NT: upnp:event", "TIMEOUT: Second-", timeout_str); } } if (return_code != 0) { return return_code; } // send request and get reply return_code = http_RequestAndResponse(&dest_url, request.buf, request.length, HTTPMETHOD_SUBSCRIBE, HTTP_DEFAULT_TIMEOUT, &response); membuffer_destroy(&request); if (return_code != 0) { httpmsg_destroy(&response.msg); return return_code; } if (response.msg.status_code != HTTP_OK) { httpmsg_destroy(&response.msg); return UPNP_E_SUBSCRIBE_UNACCEPTED; } // get SID and TIMEOUT if (httpmsg_find_hdr(&response.msg, HDR_SID, &sid_hdr) == NULL || sid_hdr.length == 0 || httpmsg_find_hdr( &response.msg, HDR_TIMEOUT, &timeout_hdr ) == NULL || timeout_hdr.length == 0 ) { httpmsg_destroy( &response.msg ); return UPNP_E_BAD_RESPONSE; } // save timeout parse_ret = matchstr(timeout_hdr.buf, timeout_hdr.length, "%iSecond-%d%0", timeout); if (parse_ret == PARSE_OK) { // nothing to do } else if (memptr_cmp_nocase(&timeout_hdr, "Second-infinite") == 0) { *timeout = -1; } else { httpmsg_destroy( &response.msg ); return UPNP_E_BAD_RESPONSE; } // save SID UpnpString_set_StringN(sid, sid_hdr.buf, sid_hdr.length); if (UpnpString_get_String(sid) == NULL) { httpmsg_destroy(&response.msg); return UPNP_E_OUTOF_MEMORY; } httpmsg_destroy(&response.msg); return UPNP_E_SUCCESS; } int genaUnregisterClient(UpnpClient_Handle client_handle) { ClientSubscription *sub_copy = GenlibClientSubscription_new(); int return_code = UPNP_E_SUCCESS; struct Handle_Info *handle_info = NULL; http_parser_t response; while (TRUE) { HandleLock(); if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { HandleUnlock(); return_code = GENA_E_BAD_HANDLE; goto exit_function; } if (handle_info->ClientSubList == NULL) { return_code = UPNP_E_SUCCESS; break; } GenlibClientSubscription_assign(sub_copy, handle_info->ClientSubList); RemoveClientSubClientSID( &handle_info->ClientSubList, GenlibClientSubscription_get_SID(sub_copy)); HandleUnlock(); return_code = gena_unsubscribe( GenlibClientSubscription_get_EventURL(sub_copy), GenlibClientSubscription_get_ActualSID(sub_copy), &response); if (return_code == 0) { httpmsg_destroy(&response.msg); } free_client_subscription(sub_copy); } freeClientSubList(handle_info->ClientSubList); HandleUnlock(); exit_function: GenlibClientSubscription_delete(sub_copy); return return_code; } #ifdef INCLUDE_CLIENT_APIS int genaUnSubscribe( UpnpClient_Handle client_handle, const UpnpString *in_sid) { ClientSubscription *sub = NULL; int return_code = GENA_SUCCESS; struct Handle_Info *handle_info; ClientSubscription *sub_copy = GenlibClientSubscription_new(); http_parser_t response; // validate handle and sid HandleLock(); if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { HandleUnlock(); return_code = GENA_E_BAD_HANDLE; goto exit_function; } sub = GetClientSubClientSID(handle_info->ClientSubList, in_sid); if (sub == NULL) { HandleUnlock(); return_code = GENA_E_BAD_SID; goto exit_function; } GenlibClientSubscription_assign(sub_copy, sub); HandleUnlock(); return_code = gena_unsubscribe( GenlibClientSubscription_get_EventURL(sub_copy), GenlibClientSubscription_get_ActualSID(sub_copy), &response); if (return_code == 0) { httpmsg_destroy(&response.msg); } free_client_subscription(sub_copy); HandleLock(); if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { HandleUnlock(); return_code = GENA_E_BAD_HANDLE; goto exit_function; } RemoveClientSubClientSID(&handle_info->ClientSubList, in_sid); HandleUnlock(); exit_function: GenlibClientSubscription_delete(sub_copy); return return_code; } #endif /* INCLUDE_CLIENT_APIS */ #ifdef INCLUDE_CLIENT_APIS int genaSubscribe( UpnpClient_Handle client_handle, const UpnpString *PublisherURL, int *TimeOut, UpnpString *out_sid) { int return_code = GENA_SUCCESS; ClientSubscription *newSubscription = GenlibClientSubscription_new(); uuid_upnp uid; Upnp_SID temp_sid; Upnp_SID temp_sid2; UpnpString *ActualSID = UpnpString_new(); UpnpString *EventURL = UpnpString_new(); struct Handle_Info *handle_info; UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "GENA SUBSCRIBE BEGIN"); UpnpString_clear(out_sid); HandleReadLock(); // validate handle if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { HandleUnlock(); return GENA_E_BAD_HANDLE; } HandleUnlock(); // subscribe SubscribeLock(); return_code = gena_subscribe(PublisherURL, TimeOut, NULL, ActualSID); HandleLock(); if (return_code != UPNP_E_SUCCESS) { UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__, "SUBSCRIBE FAILED in transfer error code: %d returned\n", return_code ); goto error_handler; } if(GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { return_code = GENA_E_BAD_HANDLE; goto error_handler; } // generate client SID uuid_create(&uid ); uuid_unpack(&uid, temp_sid); sprintf(temp_sid2, "uuid:%s", temp_sid); UpnpString_set_String(out_sid, temp_sid2); // create event url UpnpString_assign(EventURL, PublisherURL); // fill subscription if (newSubscription == NULL) { return_code = UPNP_E_OUTOF_MEMORY; goto error_handler; } GenlibClientSubscription_set_RenewEventId(newSubscription, -1); GenlibClientSubscription_set_SID(newSubscription, out_sid); GenlibClientSubscription_set_ActualSID(newSubscription, ActualSID); GenlibClientSubscription_set_EventURL(newSubscription, EventURL); GenlibClientSubscription_set_Next(newSubscription, handle_info->ClientSubList); handle_info->ClientSubList = newSubscription; // schedule expiration event return_code = ScheduleGenaAutoRenew(client_handle, *TimeOut, newSubscription); error_handler: if (return_code != UPNP_E_SUCCESS) { UpnpString_delete(ActualSID); UpnpString_delete(EventURL); GenlibClientSubscription_delete(newSubscription); } HandleUnlock(); SubscribeUnlock(); return return_code; } #endif /* INCLUDE_CLIENT_APIS */ int genaRenewSubscription( UpnpClient_Handle client_handle, const UpnpString *in_sid, int *TimeOut) { int return_code = GENA_SUCCESS; ClientSubscription *sub = NULL; ClientSubscription *sub_copy = GenlibClientSubscription_new(); struct Handle_Info *handle_info; UpnpString *ActualSID = UpnpString_new(); ThreadPoolJob tempJob; HandleLock(); // validate handle and sid if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { HandleUnlock(); return_code = GENA_E_BAD_HANDLE; goto exit_function; } sub = GetClientSubClientSID(handle_info->ClientSubList, in_sid); if (sub == NULL) { HandleUnlock(); return_code = GENA_E_BAD_SID; goto exit_function; } // remove old events if (TimerThreadRemove( &gTimerThread, GenlibClientSubscription_get_RenewEventId(sub), &tempJob) == 0 ) { free_upnp_timeout((upnp_timeout *)tempJob.arg); } UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "REMOVED AUTO RENEW EVENT"); GenlibClientSubscription_set_RenewEventId(sub, -1); GenlibClientSubscription_assign(sub_copy, sub); HandleUnlock(); return_code = gena_subscribe( GenlibClientSubscription_get_EventURL(sub_copy), TimeOut, GenlibClientSubscription_get_ActualSID(sub_copy), ActualSID); HandleLock(); if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) { HandleUnlock(); return_code = GENA_E_BAD_HANDLE; goto exit_function; } // we just called GetHandleInfo, so we don't check for return value //GetHandleInfo(client_handle, &handle_info); if (return_code != UPNP_E_SUCCESS) { // network failure (remove client sub) RemoveClientSubClientSID(&handle_info->ClientSubList, in_sid); free_client_subscription(sub_copy); HandleUnlock(); goto exit_function; } // get subscription sub = GetClientSubClientSID(handle_info->ClientSubList, in_sid); if (sub == NULL) { free_client_subscription(sub_copy); HandleUnlock(); return_code = GENA_E_BAD_SID; goto exit_function; } // store actual sid GenlibClientSubscription_set_ActualSID(sub, ActualSID); // start renew subscription timer return_code = ScheduleGenaAutoRenew(client_handle, *TimeOut, sub); if (return_code != GENA_SUCCESS) { RemoveClientSubClientSID( &handle_info->ClientSubList, GenlibClientSubscription_get_SID(sub)); } free_client_subscription(sub_copy); HandleUnlock(); exit_function: UpnpString_delete(ActualSID); GenlibClientSubscription_delete(sub_copy); return return_code; } void gena_process_notification_event( SOCKINFO *info, http_message_t *event) { UpnpEvent *event_struct = UpnpEvent_new(); IXML_Document *ChangedVars = NULL; int eventKey; token sid; ClientSubscription *subscription = NULL; struct Handle_Info *handle_info; void *cookie; Upnp_FunPtr callback; UpnpClient_Handle client_handle; memptr sid_hdr; memptr nt_hdr, nts_hdr; memptr seq_hdr; // get SID if (httpmsg_find_hdr(event, HDR_SID, &sid_hdr) == NULL) { error_respond(info, HTTP_PRECONDITION_FAILED, event); goto exit_function; } sid.buff = sid_hdr.buf; sid.size = sid_hdr.length; // get event key if (httpmsg_find_hdr(event, HDR_SEQ, &seq_hdr) == NULL || matchstr(seq_hdr.buf, seq_hdr.length, "%d%0", &eventKey) != PARSE_OK) { error_respond( info, HTTP_BAD_REQUEST, event ); goto exit_function; } // get NT and NTS headers if (httpmsg_find_hdr(event, HDR_NT, &nt_hdr) == NULL || httpmsg_find_hdr(event, HDR_NTS, &nts_hdr) == NULL) { error_respond( info, HTTP_BAD_REQUEST, event ); goto exit_function; } // verify NT and NTS headers if (memptr_cmp(&nt_hdr, "upnp:event") != 0 || memptr_cmp(&nts_hdr, "upnp:propchange") != 0) { error_respond(info, HTTP_PRECONDITION_FAILED, event); goto exit_function; } // parse the content (should be XML) if (!has_xml_content_type(event) || event->msg.length == 0 || ixmlParseBufferEx(event->entity.buf, &ChangedVars) != IXML_SUCCESS) { error_respond(info, HTTP_BAD_REQUEST, event); goto exit_function; } HandleLock(); // get client info if (GetClientHandleInfo(&client_handle, &handle_info) != HND_CLIENT) { error_respond(info, HTTP_PRECONDITION_FAILED, event); HandleUnlock(); goto exit_function; } // get subscription based on SID subscription = GetClientSubActualSID(handle_info->ClientSubList, &sid); if (subscription == NULL) { if (eventKey == 0) { // wait until we've finished processing a subscription // (if we are in the middle) // this is to avoid mistakenly rejecting the first event if we // receive it before the subscription response HandleUnlock(); // try and get Subscription Lock // (in case we are in the process of subscribing) SubscribeLock(); // get HandleLock again HandleLock(); if (GetClientHandleInfo(&client_handle, &handle_info) != HND_CLIENT) { error_respond(info, HTTP_PRECONDITION_FAILED, event); SubscribeUnlock(); HandleUnlock(); goto exit_function; } subscription = GetClientSubActualSID(handle_info->ClientSubList, &sid); if (subscription == NULL) { error_respond( info, HTTP_PRECONDITION_FAILED, event ); SubscribeUnlock(); HandleUnlock(); goto exit_function; } SubscribeUnlock(); } else { error_respond( info, HTTP_PRECONDITION_FAILED, event ); HandleUnlock(); goto exit_function; } } // success error_respond(info, HTTP_OK, event); // fill event struct UpnpEvent_set_EventKey(event_struct, eventKey); UpnpEvent_set_ChangedVariables(event_struct, ChangedVars); UpnpEvent_set_SID(event_struct, GenlibClientSubscription_get_SID(subscription)); // copy callback callback = handle_info->Callback; cookie = handle_info->Cookie; HandleUnlock(); // make callback with event struct // In future, should find a way of mainting // that the handle is not unregistered in the middle of a // callback callback(UPNP_EVENT_RECEIVED, event_struct, cookie); exit_function: ixmlDocument_free(ChangedVars); UpnpEvent_delete(event_struct); } #endif /* INCLUDE_CLIENT_APIS */ #endif /* EXCLUDE_GENA */ libupnp-1.8.0~svn20100507/upnp/src/soap/0000777000175000017500000000000011373047472014465 500000000000000libupnp-1.8.0~svn20100507/upnp/src/soap/soap_ctrlpt.c0000644000175000017500000007204311347360466017107 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #include "config.h" #ifdef INCLUDE_CLIENT_APIS #if EXCLUDE_SOAP == 0 #include #include #include #include #include #include "miniserver.h" #include "membuffer.h" #include "httpparser.h" #include "httpreadwrite.h" #include "statcodes.h" #include "parsetools.h" #include "upnpapi.h" #include "soaplib.h" #include "uri.h" #include "upnp.h" #include "unixutil.h" #define SOAP_ACTION_RESP 1 #define SOAP_VAR_RESP 2 //#define SOAP_ERROR_RESP 3 #define SOAP_ACTION_RESP_ERROR 3 #define SOAP_VAR_RESP_ERROR 4 /**************************************************************************** * Function : dom_cmp_name * * Parameters : * IN char *name : lookup name * IN IXML_Node *node : xml node * * Description : This function compares 'name' and node's name * * Return : int * 0 if both are equal; 1 if not equal, and UPNP_E_OUTOF_MEMORY * * Note : ****************************************************************************/ static int dom_cmp_name( IN char *name, IN IXML_Node * node ) { const DOMString node_name = NULL; memptr nameptr, dummy; int ret_code; assert( name ); assert( node ); node_name = ixmlNode_getNodeName( node ); if( node_name == NULL ) { return UPNP_E_OUTOF_MEMORY; } if( strcmp( name, node_name ) == 0 ) { ret_code = 0; } else if( matchstr( ( char * )node_name, strlen( node_name ), "%s:%s%0", &dummy, &nameptr ) == PARSE_OK && strcmp( nameptr.buf, name ) == 0 ) { ret_code = 0; } else { ret_code = 1; // names are not the same } return ret_code; } /**************************************************************************** * Function : dom_find_node * * Parameters : * IN char* node_name : name of the node * IN IXML_Node *start_node : complete xml node * OUT IXML_Node ** matching_node : matched node * * Description : This function goes thru each child of 'start_node' * looking for a node having the name 'node_name'. * * Return : int * return UPNP_E_SUCCESS if successful else returns appropriate error * * Note : ****************************************************************************/ static int dom_find_node( IN char *node_name, IN IXML_Node * start_node, OUT IXML_Node ** matching_node ) { IXML_Node *node; // invalid args if( node_name == NULL || start_node == NULL ) { return UPNP_E_NOT_FOUND; } node = ixmlNode_getFirstChild( start_node ); while( node != NULL ) { // match name if( dom_cmp_name( node_name, node ) == 0 ) { *matching_node = node; return UPNP_E_SUCCESS; } // free and next node node = ixmlNode_getNextSibling( node ); // next node } return UPNP_E_NOT_FOUND; } /**************************************************************************** * Function : dom_find_deep_node * * Parameters : * IN char* names[] : array of names * IN int num_names : size of array * IN IXML_Node *start_node : Node from where it should should be * searched * OUT IXML_Node ** matching_node : Node that matches the last name * of the array * * Description : This function searches for the node specifed by the last * name in the 'name' array. * * Return : int * return UPNP_E_SUCCESS if successful else returns appropriate error * Note : ****************************************************************************/ static int dom_find_deep_node( IN char *names[], IN int num_names, IN IXML_Node * start_node, OUT IXML_Node ** matching_node ) { int i; IXML_Node *node; IXML_Node *match_node; assert( num_names > 0 ); node = start_node; if( dom_cmp_name( names[0], start_node ) == 0 ) { if( num_names == 1 ) { *matching_node = start_node; return UPNP_E_SUCCESS; } } for( i = 1; i < num_names; i++ ) { if( dom_find_node( names[i], node, &match_node ) != UPNP_E_SUCCESS ) { return UPNP_E_NOT_FOUND; } if( i == num_names - 1 ) { *matching_node = match_node; return UPNP_E_SUCCESS; } node = match_node; // try again } return UPNP_E_NOT_FOUND; // this line not reached } /**************************************************************************** * Function : get_node_value * * Parameters : * IN IXML_Node *node : input node * * Description : This function returns the value of the text node * * Return : DOMString * string containing the node value * * Note :The given node must have a text node as its first child ****************************************************************************/ static const DOMString get_node_value( IN IXML_Node * node ) { IXML_Node *text_node = NULL; const DOMString text_value = NULL; text_node = ixmlNode_getFirstChild( node ); if( text_node == NULL ) { return NULL; } text_value = ixmlNode_getNodeValue( text_node ); return text_value; } /**************************************************************************** * Function : get_host_and_path * * Parameters : * IN char *ctrl_url : URL * OUT memptr *host : host string * OUT memptr *path : path string * OUT uri_type* url : URL type * * Description : This function retrives the host and path from the * control URL * * Return : int * returns 0 on sucess; -1 on error * * Note : ****************************************************************************/ static UPNP_INLINE int get_host_and_path( IN char *ctrl_url, OUT const memptr *host, OUT const memptr *path, OUT uri_type * url ) { if( parse_uri( ctrl_url, strlen( ctrl_url ), url ) != HTTP_SUCCESS ) { return -1; } // This is done to ensure that the buffer is kept const ((memptr *)host)->buf = (char *)url->hostport.text.buff; ((memptr *)host)->length = url->hostport.text.size; ((memptr *)path)->buf = (char *)url->pathquery.buff; ((memptr *)path)->length = url->pathquery.size; return 0; } /**************************************************************************** * Function : get_action_name * * Parameters : * IN char* action : string containing action name * OUT memptr* name : name of the action * * Description : This functions retirves the action name in the buffer * * Return : int * returns 0 on success; -1 on error * * Note : ****************************************************************************/ static UPNP_INLINE int get_action_name( IN char *action, OUT memptr * name ) { memptr dummy; int ret_code; ret_code = matchstr( action, strlen( action ), " <%s:%s", &dummy, name ); return ret_code == PARSE_OK ? 0 : -1; } /**************************************************************************** * Function : add_man_header * * Parameters : * INOUT membuffer* headers : HTTP header * * Description : This function adds "MAN" field in the HTTP header * * Return : int * returns 0 on success; UPNP_E_OUTOFMEMORY on error * * Note : ****************************************************************************/ static UPNP_INLINE int add_man_header( INOUT membuffer * headers ) { char *soap_action_hdr; char *man_hdr = "MAN: \"http://schemas.xmlsoap.org/soap/envelope/\"; " "ns=01\r\n01-"; // change POST to M-POST if( membuffer_insert( headers, "M-", 2, 0 ) != 0 ) { return UPNP_E_OUTOF_MEMORY; } soap_action_hdr = strstr( headers->buf, "SOAPACTION:" ); assert( soap_action_hdr != NULL ); // can't fail // insert MAN header if( membuffer_insert( headers, man_hdr, strlen( man_hdr ), soap_action_hdr - headers->buf ) != 0 ) { return UPNP_E_OUTOF_MEMORY; } return 0; } /**************************************************************************** * Function : soap_request_and_response * * Parameters : * IN membuffer* request : request that will be sent to the device * IN uri_type* destination_url : destination address string * OUT http_parser_t *response : response from the device * * Description : This function sends the control point's request to the * device and receives a response from it. * * Return : int * * Note : ****************************************************************************/ static int soap_request_and_response( IN membuffer * request, IN uri_type * destination_url, OUT http_parser_t * response ) { int ret_code; ret_code = http_RequestAndResponse( destination_url, request->buf, request->length, SOAPMETHOD_POST, UPNP_TIMEOUT, response ); if( ret_code != 0 ) { httpmsg_destroy( &response->msg ); return ret_code; } // method-not-allowed error if( response->msg.status_code == HTTP_METHOD_NOT_ALLOWED ) { ret_code = add_man_header( request ); // change to M-POST msg if( ret_code != 0 ) { return ret_code; } httpmsg_destroy( &response->msg ); // about to reuse response // try again ret_code = http_RequestAndResponse( destination_url, request->buf, request->length, HTTPMETHOD_MPOST, UPNP_TIMEOUT, response ); if( ret_code != 0 ) { httpmsg_destroy( &response->msg ); } } return ret_code; } /**************************************************************************** * Function : get_response_value * * Parameters : * IN http_message_t* hmsg : HTTP response message * IN int code : return code in the HTTP response * IN char*name : name of the action * OUT int *upnp_error_code : UPnP error code * OUT IXML_Node ** action_value : SOAP response node * OUT DOMString * str_value : state varible value ( in the case of * querry state variable request) * * Description : This function handles the response coming back from the * device. This function parses the response and gives back the SOAP * response node. * * Return : int * return the type of the SOAP message if successful else returns * appropriate error. * * Note : ****************************************************************************/ static int get_response_value( IN http_message_t * hmsg, IN int code, IN char *name, OUT int *upnp_error_code, OUT IXML_Node ** action_value, OUT DOMString * str_value ) { IXML_Node *node = NULL; IXML_Node *root_node = NULL; IXML_Node *error_node = NULL; IXML_Document *doc = NULL; char *node_str = NULL; const char *temp_str = NULL; DOMString error_node_str = NULL; int err_code; xboolean done = FALSE; char *names[5]; const DOMString nodeValue; err_code = UPNP_E_BAD_RESPONSE; // default error // only 200 and 500 status codes are relevant if( ( hmsg->status_code != HTTP_OK && hmsg->status_code != HTTP_INTERNAL_SERVER_ERROR ) || !has_xml_content_type( hmsg ) ) { goto error_handler; } if( ixmlParseBufferEx( hmsg->entity.buf, &doc ) != IXML_SUCCESS ) { goto error_handler; } root_node = ixmlNode_getFirstChild( ( IXML_Node * ) doc ); if( root_node == NULL ) { goto error_handler; } if( code == SOAP_ACTION_RESP ) { // // try reading soap action response // assert( action_value != NULL ); *action_value = NULL; names[0] = "Envelope"; names[1] = "Body"; names[2] = name; if( dom_find_deep_node( names, 3, root_node, &node ) == UPNP_E_SUCCESS ) { node_str = ixmlPrintNode( node ); if( node_str == NULL ) { err_code = UPNP_E_OUTOF_MEMORY; goto error_handler; } if( ixmlParseBufferEx( node_str, ( IXML_Document ** ) action_value ) != IXML_SUCCESS ) { err_code = UPNP_E_BAD_RESPONSE; goto error_handler; } err_code = SOAP_ACTION_RESP; done = TRUE; } } else if( code == SOAP_VAR_RESP ) { // try reading var response assert( str_value != NULL ); *str_value = NULL; names[0] = "Envelope"; names[1] = "Body"; names[2] = "QueryStateVariableResponse"; names[3] = "return"; if( dom_find_deep_node( names, 4, root_node, &node ) == UPNP_E_SUCCESS ) { nodeValue = get_node_value( node ); if( nodeValue == NULL ) { goto error_handler; } *str_value = ixmlCloneDOMString( nodeValue ); err_code = SOAP_VAR_RESP; done = TRUE; } } if( !done ) { // not action or var resp; read error code and description *str_value = NULL; names[0] = "Envelope"; names[1] = "Body"; names[2] = "Fault"; names[3] = "detail"; names[4] = "UPnPError"; if( dom_find_deep_node( names, 5, root_node, &error_node ) != UPNP_E_SUCCESS ) { goto error_handler; } if( dom_find_node( "errorCode", error_node, &node ) != UPNP_E_SUCCESS ) { goto error_handler; } temp_str = get_node_value( node ); if( temp_str == NULL ) { goto error_handler; } *upnp_error_code = atoi( temp_str ); if( *upnp_error_code < 400 ) { err_code = *upnp_error_code; goto error_handler; // bad SOAP error code } if( code == SOAP_VAR_RESP ) { if( dom_find_node( "errorDescription", error_node, &node ) != UPNP_E_SUCCESS ) { goto error_handler; } nodeValue = get_node_value( node ); if( nodeValue == NULL ) { goto error_handler; } *str_value = ixmlCloneDOMString( nodeValue ); if( *str_value == NULL ) { goto error_handler; } err_code = SOAP_VAR_RESP_ERROR; } else if( code == SOAP_ACTION_RESP ) { error_node_str = ixmlPrintNode( error_node ); if( error_node_str == NULL ) { err_code = UPNP_E_OUTOF_MEMORY; goto error_handler; } if( ixmlParseBufferEx( error_node_str, ( IXML_Document ** ) action_value ) != IXML_SUCCESS ) { err_code = UPNP_E_BAD_RESPONSE; goto error_handler; } err_code = SOAP_ACTION_RESP_ERROR; } } error_handler: ixmlDocument_free( doc ); ixmlFreeDOMString( node_str ); ixmlFreeDOMString( error_node_str ); return err_code; } /**************************************************************************** * Function : SoapSendAction * * Parameters : * IN char* action_url : device contrl URL * IN char *service_type : device service type * IN IXML_Document *action_node : SOAP action node * OUT IXML_Document **response_node : SOAP response node * * Description : This function is called by UPnP API to send the SOAP * action request and waits till it gets the response from the device * pass the response to the API layer * * Return : int * returns UPNP_E_SUCCESS if successful else returns appropriate error * Note : ****************************************************************************/ int SoapSendAction( IN char *action_url, IN char *service_type, IN IXML_Document * action_node, OUT IXML_Document ** response_node ) { char *action_str = NULL; memptr name; membuffer request; membuffer responsename; int err_code; int ret_code; http_parser_t response; uri_type url; int upnp_error_code; char *upnp_error_str; xboolean got_response = FALSE; off_t content_length; char *xml_start = "\r\n" ""; char *xml_end = "\r\n" "\r\n\r\n"; size_t xml_start_len; size_t xml_end_len; size_t action_str_len; *response_node = NULL; // init err_code = UPNP_E_OUTOF_MEMORY; // default error UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "Inside SoapSendAction():" ); // init membuffer_init( &request ); membuffer_init( &responsename ); // print action action_str = ixmlPrintNode( ( IXML_Node * ) action_node ); if( action_str == NULL ) { goto error_handler; } // get action name if( get_action_name( action_str, &name ) != 0 ) { err_code = UPNP_E_INVALID_ACTION; goto error_handler; } // parse url if( http_FixStrUrl( action_url, strlen( action_url ), &url ) != 0 ) { err_code = UPNP_E_INVALID_URL; goto error_handler; } UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "path=%.*s, hostport=%.*s\n", (int)url.pathquery.size, url.pathquery.buff, (int)url.hostport.text.size, url.hostport.text.buff ); xml_start_len = strlen( xml_start ); xml_end_len = strlen( xml_end ); action_str_len = strlen( action_str ); // make request msg request.size_inc = 50; content_length = xml_start_len + action_str_len + xml_end_len; if (http_MakeMessage( &request, 1, 1, "q" "N" "s" "sssbsc" "Uc" "b" "b" "b", SOAPMETHOD_POST, &url, content_length, ContentTypeHeader, "SOAPACTION: \"", service_type, "#", name.buf, name.length, "\"", xml_start, xml_start_len, action_str, action_str_len, xml_end, xml_end_len ) != 0 ) { goto error_handler; } ret_code = soap_request_and_response( &request, &url, &response ); got_response = TRUE; if( ret_code != UPNP_E_SUCCESS ) { err_code = ret_code; goto error_handler; } if( membuffer_append( &responsename, name.buf, name.length ) != 0 || membuffer_append_str( &responsename, "Response" ) != 0 ) { goto error_handler; } // get action node from the response ret_code = get_response_value( &response.msg, SOAP_ACTION_RESP, responsename.buf, &upnp_error_code, ( IXML_Node ** ) response_node, &upnp_error_str ); if( ret_code == SOAP_ACTION_RESP ) { err_code = UPNP_E_SUCCESS; } else if( ret_code == SOAP_ACTION_RESP_ERROR ) { err_code = upnp_error_code; } else { err_code = ret_code; } error_handler: ixmlFreeDOMString( action_str ); membuffer_destroy( &request ); membuffer_destroy( &responsename ); if( got_response ) { httpmsg_destroy( &response.msg ); } return err_code; } /**************************************************************************** * Function : SoapSendActionEx * * Parameters : * IN char* action_url : device contrl URL * IN char *service_type : device service type IN IXML_Document *Header: Soap header * IN IXML_Document *action_node : SOAP action node ( SOAP body) * OUT IXML_Document **response_node : SOAP response node * * Description : This function is called by UPnP API to send the SOAP * action request and waits till it gets the response from the device * pass the response to the API layer. This action is similar to the * the SoapSendAction with only difference that it allows users to * pass the SOAP header along the SOAP body ( soap action request) * * Return : int * returns UPNP_E_SUCCESS if successful else returns appropriate error * Note : ****************************************************************************/ int SoapSendActionEx( IN char *action_url, IN char *service_type, IN IXML_Document * header, IN IXML_Document * action_node, OUT IXML_Document ** response_node ) { char *xml_header_str = NULL; char *action_str = NULL; memptr name; membuffer request; membuffer responsename; int err_code; int ret_code; http_parser_t response; uri_type url; int upnp_error_code; char *upnp_error_str; xboolean got_response = FALSE; char *xml_start = "\r\n"; char *xml_header_start = "\r\n"; char *xml_header_end = "\r\n"; char *xml_body_start = ""; char *xml_end = "\r\n" "\r\n"; size_t xml_start_len; size_t xml_header_start_len; size_t xml_header_str_len; size_t xml_header_end_len; size_t xml_body_start_len; size_t action_str_len; size_t xml_end_len; off_t content_length; *response_node = NULL; // init err_code = UPNP_E_OUTOF_MEMORY; // default error UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "Inside SoapSendActionEx():" ); // init membuffer_init( &request ); membuffer_init( &responsename ); // header string xml_header_str = ixmlPrintNode( ( IXML_Node * ) header ); if( xml_header_str == NULL ) { goto error_handler; } // print action action_str = ixmlPrintNode( ( IXML_Node * ) action_node ); if( action_str == NULL ) { goto error_handler; } // get action name if( get_action_name( action_str, &name ) != 0 ) { err_code = UPNP_E_INVALID_ACTION; goto error_handler; } // parse url if( http_FixStrUrl( action_url, strlen( action_url ), &url ) != 0 ) { err_code = UPNP_E_INVALID_URL; goto error_handler; } UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "path=%.*s, hostport=%.*s\n", (int)url.pathquery.size, url.pathquery.buff, (int)url.hostport.text.size, url.hostport.text.buff ); xml_start_len = strlen( xml_start ); xml_body_start_len = strlen( xml_body_start ); xml_end_len = strlen( xml_end ); action_str_len = strlen( action_str ); xml_header_start_len = strlen( xml_header_start ); xml_header_end_len = strlen( xml_header_end ); xml_header_str_len = strlen( xml_header_str ); // make request msg request.size_inc = 50; content_length = xml_start_len + xml_header_start_len + xml_header_str_len + xml_header_end_len + xml_body_start_len + action_str_len + xml_end_len; if (http_MakeMessage( &request, 1, 1, "q" "N" "s" "sssbsc" "Uc" "b" "b" "b" "b" "b" "b" "b", SOAPMETHOD_POST, &url, content_length, ContentTypeHeader, "SOAPACTION: \"", service_type, "#", name.buf, name.length, "\"", xml_start, xml_start_len, xml_header_start, xml_header_start_len, xml_header_str, xml_header_str_len, xml_header_end, xml_header_end_len, xml_body_start, xml_body_start_len, action_str, action_str_len, xml_end, xml_end_len ) != 0 ) { goto error_handler; } ret_code = soap_request_and_response( &request, &url, &response ); got_response = TRUE; if( ret_code != UPNP_E_SUCCESS ) { err_code = ret_code; goto error_handler; } if( membuffer_append( &responsename, name.buf, name.length ) != 0 || membuffer_append_str( &responsename, "Response" ) != 0 ) { goto error_handler; } // get action node from the response ret_code = get_response_value( &response.msg, SOAP_ACTION_RESP, responsename.buf, &upnp_error_code, ( IXML_Node ** ) response_node, &upnp_error_str ); if( ret_code == SOAP_ACTION_RESP ) { err_code = UPNP_E_SUCCESS; } else if( ret_code == SOAP_ACTION_RESP_ERROR ) { err_code = upnp_error_code; } else { err_code = ret_code; } error_handler: ixmlFreeDOMString( action_str ); ixmlFreeDOMString( xml_header_str ); membuffer_destroy( &request ); membuffer_destroy( &responsename ); if( got_response ) { httpmsg_destroy( &response.msg ); } return err_code; } /**************************************************************************** * Function : SoapGetServiceVarStatus * * Parameters : * IN char * action_url : Address to send this variable * query message. * IN char *var_name : Name of the variable. * OUT char **var_value : Output value. * * Description : This function creates a status variable query message * send it to the specified URL. It also collect the response. * * Return : int * * Note : ****************************************************************************/ int SoapGetServiceVarStatus( IN char *action_url, IN char *var_name, OUT char **var_value ) { const memptr host; // value for HOST header const memptr path; // ctrl path in first line in msg uri_type url; membuffer request; int ret_code; http_parser_t response; int upnp_error_code; off_t content_length; char *xml_start = "\r\n" "\r\n" "\r\n" ""; char *xml_end = "\r\n" "\r\n" "\r\n" "\r\n"; *var_value = NULL; // return NULL in case of an error membuffer_init( &request ); // get host hdr and url path if( get_host_and_path( action_url, &host, &path, &url ) == -1 ) { return UPNP_E_INVALID_URL; } // make headers request.size_inc = 50; content_length = strlen( xml_start ) + strlen( var_name ) + strlen( xml_end ); if (http_MakeMessage( &request, 1, 1, "Q" "sbc" "N" "s" "sc" "Ucc" "sss", SOAPMETHOD_POST, path.buf, path.length, "HOST: ", host.buf, host.length, content_length, ContentTypeHeader, "SOAPACTION: \"urn:schemas-upnp-org:control-1-0#QueryStateVariable\"", xml_start, var_name, xml_end ) != 0 ) { return UPNP_E_OUTOF_MEMORY; } // send msg and get reply ret_code = soap_request_and_response( &request, &url, &response ); membuffer_destroy( &request ); if( ret_code != UPNP_E_SUCCESS ) { return ret_code; } // get variable value from the response ret_code = get_response_value( &response.msg, SOAP_VAR_RESP, NULL, &upnp_error_code, NULL, var_value ); httpmsg_destroy( &response.msg ); if( ret_code == SOAP_VAR_RESP ) { return UPNP_E_SUCCESS; } else if( ret_code == SOAP_VAR_RESP_ERROR ) { return upnp_error_code; } else { return ret_code; } } #endif // EXCLUDE_SOAP #endif // INCLUDE_CLIENT_APIS libupnp-1.8.0~svn20100507/upnp/src/soap/soap_common.c0000644000175000017500000000020611021325543017041 00000000000000 #include "config.h" #if EXCLUDE_SOAP == 0 #include "httpparser.h" #include "sock.h" #include "soaplib.h" #endif // EXCLUDE_SOAP libupnp-1.8.0~svn20100507/upnp/src/soap/soap_device.c0000644000175000017500000010154111347360465017031 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /*! * \file */ #include "config.h" #ifdef INCLUDE_DEVICE_APIS #if EXCLUDE_SOAP == 0 #define SOAP_BODY "Body" #define SOAP_URN "http:/""/schemas.xmlsoap.org/soap/envelope/" #define QUERY_STATE_VAR_URN "urn:schemas-upnp-org:control-1-0" #include "ActionRequest.h" #include "httpparser.h" #include "httpreadwrite.h" #include "parsetools.h" #include "soaplib.h" #include "ssdplib.h" #include "statcodes.h" #include "unixutil.h" #include "upnpapi.h" #ifdef WIN32 #define snprintf _snprintf #endif /*! timeout duration in secs for transmission/reception */ #define SOAP_TIMEOUT UPNP_TIMEOUT #define SREQ_HDR_NOT_FOUND -1 #define SREQ_BAD_HDR_FORMAT -2 #define SOAP_INVALID_ACTION 401 #define SOAP_INVALID_ARGS 402 #define SOAP_OUT_OF_SYNC 403 #define SOAP_INVALID_VAR 404 #define SOAP_ACTION_FAILED 501 static const char *Soap_Invalid_Action = "Invalid Action"; /*static const char* Soap_Invalid_Args = "Invalid Args"; */ static const char *Soap_Action_Failed = "Action Failed"; static const char *Soap_Invalid_Var = "Invalid Var"; const char *ContentTypeHeader = "CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n"; /**************************************************************************** * Function : get_request_type * * Parameters : * IN http_message_t* request : HTTP request * OUT memptr* action_name : SOAP action name * * Description : This function retrives the name of the SOAP action * * Return : int * 0 if successful else returns appropriate error. * Note : ****************************************************************************/ static UPNP_INLINE int get_request_type( IN http_message_t * request, OUT memptr * action_name ) { memptr value; memptr ns_value, dummy_quote; http_header_t *hdr; char save_char; char *s; membuffer soap_action_name; // find soapaction header // if( request->method == SOAPMETHOD_POST ) { if( httpmsg_find_hdr( request, HDR_SOAPACTION, &value ) == NULL ) { return SREQ_HDR_NOT_FOUND; } } else // M-POST { // get NS value from MAN header hdr = httpmsg_find_hdr( request, HDR_MAN, &value ); if( hdr == NULL ) { return SREQ_HDR_NOT_FOUND; } if( matchstr( value.buf, value.length, "%q%i ; ns = %s", &dummy_quote, &ns_value ) != 0 ) { return SREQ_BAD_HDR_FORMAT; } // create soapaction name header membuffer_init( &soap_action_name ); if( ( membuffer_assign( &soap_action_name, ns_value.buf, ns_value.length ) == UPNP_E_OUTOF_MEMORY ) || ( membuffer_append_str( &soap_action_name, "-SOAPACTION" ) == UPNP_E_OUTOF_MEMORY ) ) { membuffer_destroy( &soap_action_name ); return UPNP_E_OUTOF_MEMORY; } hdr = httpmsg_find_hdr_str( request, soap_action_name.buf ); membuffer_destroy( &soap_action_name ); if( hdr == NULL ) { return SREQ_HDR_NOT_FOUND; } value.buf = hdr->value.buf; value.length = hdr->value.length; } // determine type // save_char = value.buf[value.length]; value.buf[value.length] = '\0'; s = strchr( value.buf, '#' ); if( s == NULL ) { value.buf[value.length] = save_char; return SREQ_BAD_HDR_FORMAT; } s++; // move to value if( matchstr( s, value.length - ( s - value.buf ), "%s", action_name ) != PARSE_OK ) { value.buf[value.length] = save_char; return SREQ_BAD_HDR_FORMAT; } // action name or variable ? if( memptr_cmp( action_name, "QueryStateVariable" ) == 0 ) { // query variable action_name->buf = NULL; action_name->length = 0; } value.buf[value.length] = save_char; // restore return 0; } /**************************************************************************** * Function : send_error_response * * Parameters : * IN SOCKINFO *info : socket info * IN int error_code : error code * IN const char* err_msg : error message * IN http_message_t* hmsg : HTTP request * * Description : This function sends SOAP error response * * Return : void * * Note : ****************************************************************************/ static void send_error_response( IN SOCKINFO * info, IN int error_code, IN const char *err_msg, IN http_message_t * hmsg ) { off_t content_length; int timeout_secs = SOAP_TIMEOUT; int major, minor; const char *start_body = // "\n" required?? "\n" "\n" "\n" "s:Client\n" "UPnPError\n" "\n" "\n" ""; const char *mid_body = "\n" ""; const char *end_body = "\n" "\n" "\n" "\n" "\n" "\n"; char err_code_str[30]; membuffer headers; sprintf( err_code_str, "%d", error_code ); // calc body len content_length = strlen( start_body ) + strlen( err_code_str ) + strlen( mid_body ) + strlen( err_msg ) + strlen( end_body ); http_CalcResponseVersion( hmsg->major_version, hmsg->minor_version, &major, &minor ); // make headers membuffer_init( &headers ); if (http_MakeMessage( &headers, major, minor, "RNsDsSXcc" "sssss", 500, content_length, ContentTypeHeader, "EXT:\r\n", X_USER_AGENT, start_body, err_code_str, mid_body, err_msg, end_body ) != 0 ) { membuffer_destroy( &headers ); return; // out of mem } // send err msg http_SendMessage( info, &timeout_secs, "b", headers.buf, headers.length ); membuffer_destroy( &headers ); } /**************************************************************************** * Function : send_var_query_response * * Parameters : * IN SOCKINFO *info : socket info * IN const char* var_value : value of the state variable * IN http_message_t* hmsg : HTTP request * * Description : This function sends response of get var status * * Return : void * * Note : ****************************************************************************/ static UPNP_INLINE void send_var_query_response( IN SOCKINFO * info, IN const char *var_value, IN http_message_t * hmsg ) { off_t content_length; int timeout_secs = SOAP_TIMEOUT; int major; int minor; const char *start_body = "\n" "\n" "\n" ""; const char *end_body = "\n" "\n" "\n" "\n"; membuffer response; http_CalcResponseVersion( hmsg->major_version, hmsg->minor_version, &major, &minor ); content_length = strlen( start_body ) + strlen( var_value ) + strlen( end_body ); // make headers membuffer_init( &response ); if (http_MakeMessage( &response, major, minor, "RNsDsSXcc" "sss", HTTP_OK, content_length, ContentTypeHeader, "EXT:\r\n", X_USER_AGENT, start_body, var_value, end_body ) != 0 ) { membuffer_destroy( &response ); return; // out of mem } // send msg http_SendMessage( info, &timeout_secs, "b", response.buf, response.length ); membuffer_destroy( &response ); } /**************************************************************************** * Function : get_action_node * * Parameters : * IN IXML_Document *TempDoc : The root DOM node. * IN char *NodeName : IXML_Node name to be searched. * OUT IXML_Document ** RespNode : Response/Output node. * * Description : This function separates the action node from * the root DOM node. * * Return : static UPNP_INLINE int * 0 if successful, or -1 if fails. * * Note : ****************************************************************************/ static UPNP_INLINE int get_action_node( IN IXML_Document * TempDoc, IN char *NodeName, OUT IXML_Document ** RespNode ) { IXML_Node *EnvpNode = NULL; IXML_Node *BodyNode = NULL; IXML_Node *ActNode = NULL; DOMString ActNodeName = NULL; const DOMString nodeName; int ret_code = -1; // error, by default IXML_NodeList *nl = NULL; UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "get_action_node(): node name =%s\n ", NodeName ); *RespNode = NULL; // Got the Envelope node here EnvpNode = ixmlNode_getFirstChild( ( IXML_Node * ) TempDoc ); if( EnvpNode == NULL ) { goto error_handler; } nl = ixmlElement_getElementsByTagNameNS( ( IXML_Element * ) EnvpNode, "*", "Body" ); if( nl == NULL ) { goto error_handler; } BodyNode = ixmlNodeList_item( nl, 0 ); if( BodyNode == NULL ) { goto error_handler; } // Got action node here ActNode = ixmlNode_getFirstChild( BodyNode ); if( ActNode == NULL ) { goto error_handler; } //Test whether this is the action node nodeName = ixmlNode_getNodeName( ActNode ); if( nodeName == NULL ) { goto error_handler; } if( strstr( nodeName, NodeName ) == NULL ) { goto error_handler; } else { ActNodeName = ixmlPrintNode( ActNode ); if( ActNodeName == NULL ) { goto error_handler; } ret_code = ixmlParseBufferEx( ActNodeName, RespNode ); if( ret_code != IXML_SUCCESS ) { ixmlFreeDOMString( ActNodeName ); ret_code = -1; goto error_handler; } } ret_code = 0; // success error_handler: ixmlFreeDOMString( ActNodeName ); if( nl ) ixmlNodeList_free( nl ); return ret_code; } /**************************************************************************** * Function : check_soap_body * * Parameters : * IN IXML_Document *doc : soap body xml document * IN const char *urn : * IN const char *actionName : Name of the requested action * * Description : This function checks the soap body xml came in the * SOAP request. * * Return : int * UPNP_E_SUCCESS if successful else returns appropriate error * * Note : ****************************************************************************/ static int check_soap_body( IN IXML_Document * doc, IN const char *urn, IN const char *actionName ) { IXML_NodeList *nl = NULL; IXML_Node *bodyNode = NULL; IXML_Node *actionNode = NULL; const DOMString ns = NULL; const DOMString name = NULL; int ret_code = UPNP_E_INVALID_ACTION; nl = ixmlDocument_getElementsByTagNameNS( doc, SOAP_URN, SOAP_BODY ); if( nl ) { bodyNode = ixmlNodeList_item( nl, 0 ); if( bodyNode ) { actionNode = ixmlNode_getFirstChild( bodyNode ); if( actionNode ) { ns = ixmlNode_getNamespaceURI( actionNode ); name = ixmlNode_getLocalName( actionNode ); if (name && ns && !strcmp( actionName, name ) && !strcmp( urn, ns ) ) { ret_code = UPNP_E_SUCCESS; } } } ixmlNodeList_free( nl ); } return ret_code; } /**************************************************************************** * Function : check_soap_action_header * * Parameters : * IN http_message_t *request : HTTP request * IN const char *urn : * OUT char **actionName : name of the SOAP action * * Description : This function checks the HTTP header of the SOAP request * coming from the control point * * Return : static int * UPNP_E_SUCCESS if successful else returns appropriate error * * Note : ****************************************************************************/ static int check_soap_action_header( IN http_message_t * request, IN const char *urn, OUT char **actionName ) { memptr header_name; http_header_t *soap_action_header = NULL; char *ns_compare = NULL; int tempSize = 0; int ret_code = UPNP_E_SUCCESS; char *temp_header_value = NULL; char *temp = NULL; char *temp2 = NULL; //check soap action header soap_action_header = httpmsg_find_hdr( request, HDR_SOAPACTION, &header_name ); if( !soap_action_header ) { ret_code = UPNP_E_INVALID_ACTION; return ret_code; } if( soap_action_header->value.length <= 0 ) { ret_code = UPNP_E_INVALID_ACTION; return ret_code; } temp_header_value = ( char * )malloc( soap_action_header->value.length + 1 ); if( !temp_header_value ) { ret_code = UPNP_E_OUTOF_MEMORY; free( temp_header_value ); return ret_code; } strncpy( temp_header_value, soap_action_header->value.buf, soap_action_header->value.length ); temp_header_value[soap_action_header->value.length] = 0; temp = strchr( temp_header_value, '#' ); if( !temp ) { free( temp_header_value ); ret_code = UPNP_E_INVALID_ACTION; return ret_code; } ( *temp ) = 0; //temp make string //check to see if it is Query State Variable or //Service Action tempSize = strlen( urn ) + 2; ns_compare = ( char * )malloc( tempSize ); if( !ns_compare ) { ret_code = UPNP_E_OUTOF_MEMORY; free( temp_header_value ); return ret_code; } snprintf( ns_compare, tempSize, "\"%s", urn ); if( strcmp( temp_header_value, ns_compare ) ) { ret_code = UPNP_E_INVALID_ACTION; } else { ret_code = UPNP_E_SUCCESS; temp++; temp2 = strchr( temp, '\"' ); if( temp2 ) //remove ending " if present { ( *temp2 ) = 0; } if( *temp ) ( *actionName ) = strdup( temp ); if( !*actionName ) { ret_code = UPNP_E_OUTOF_MEMORY; } } free( temp_header_value ); free( ns_compare ); return ret_code; } /**************************************************************************** * Function : get_device_info * * Parameters : * IN http_message_t* request : HTTP request * IN int isQuery : flag for a querry * IN IXML_Document *actionDoc : action request document * OUT UpnpString *device_udn : Device UDN string * OUT UpnpString *service_id : Service ID string * OUT Upnp_FunPtr *callback : callback function of the device * application * OUT void** cookie : cookie stored by device application * * Description : This function retrives all the information needed to * process the incoming SOAP request. It finds the device and service info * and also the callback function to hand-over the request to the device * application. * * Return : int * UPNP_E_SUCCESS if successful else returns appropriate error * * Note : ****************************************************************************/ static int get_device_info( IN http_message_t *request, IN int isQuery, IN IXML_Document *actionDoc, IN int AddressFamily, OUT UpnpString *device_udn, OUT UpnpString *service_id, OUT Upnp_FunPtr *callback, OUT void **cookie ) { struct Handle_Info *device_info; int device_hnd; service_info *serv_info; char save_char; int ret_code = -1; // error by default const char *control_url; char *actionName = NULL; // null-terminate pathquery of url control_url = request->uri.pathquery.buff; save_char = control_url[request->uri.pathquery.size]; ((char *)control_url)[request->uri.pathquery.size] = '\0'; HandleLock(); if( GetDeviceHandleInfo( AddressFamily, &device_hnd, &device_info ) != HND_DEVICE ) { goto error_handler; } if( ( serv_info = FindServiceControlURLPath( &device_info->ServiceTable, control_url ) ) == NULL ) { goto error_handler; } if( isQuery ) { ret_code = check_soap_action_header( request, QUERY_STATE_VAR_URN, &actionName ); if( ( ret_code != UPNP_E_SUCCESS ) && ( ret_code != UPNP_E_OUTOF_MEMORY ) ) { ret_code = UPNP_E_INVALID_ACTION; goto error_handler; } //check soap body ret_code = check_soap_body( actionDoc, QUERY_STATE_VAR_URN, actionName ); free( actionName ); if( ret_code != UPNP_E_SUCCESS ) { goto error_handler; } } else { ret_code = check_soap_action_header( request, serv_info->serviceType, &actionName ); if( ( ret_code != UPNP_E_SUCCESS ) && ( ret_code != UPNP_E_OUTOF_MEMORY ) ) { ret_code = UPNP_E_INVALID_SERVICE; goto error_handler; } //check soap body ret_code = check_soap_body( actionDoc, serv_info->serviceType, actionName ); free( actionName ); if( ret_code != UPNP_E_SUCCESS ) { ret_code = UPNP_E_INVALID_SERVICE; goto error_handler; } } UpnpString_set_String( device_udn, serv_info->UDN ); UpnpString_set_String( service_id, serv_info->serviceId ); *callback = device_info->Callback; *cookie = device_info->Cookie; ret_code = 0; error_handler: ((char *)control_url)[request->uri.pathquery.size] = save_char; // restore HandleUnlock(); return ret_code; } /**************************************************************************** * Function : send_action_response * * Parameters : * IN SOCKINFO *info : socket info * IN IXML_Document *action_resp : The response document * IN http_message_t* request : action request document * * Description : This function sends the SOAP response * * Return : void * * Note : ****************************************************************************/ static UPNP_INLINE void send_action_response( IN SOCKINFO * info, IN IXML_Document * action_resp, IN http_message_t * request ) { char *xml_response = NULL; membuffer headers; int major, minor; int err_code; off_t content_length; int ret_code; int timeout_secs = SOAP_TIMEOUT; static char *start_body = // "" required?? "\n"; static char *end_body = " "; // init http_CalcResponseVersion( request->major_version, request->minor_version, &major, &minor ); membuffer_init( &headers ); err_code = UPNP_E_OUTOF_MEMORY; // one error only // get xml xml_response = ixmlPrintNode( ( IXML_Node * ) action_resp ); if( xml_response == NULL ) { goto error_handler; } content_length = strlen( start_body ) + strlen( xml_response ) + strlen( end_body ); // make headers if (http_MakeMessage( &headers, major, minor, "RNsDsSXcc", HTTP_OK, // status code content_length, ContentTypeHeader, "EXT:\r\n", X_USER_AGENT) != 0 ) { goto error_handler; } // send whole msg ret_code = http_SendMessage( info, &timeout_secs, "bbbb", headers.buf, headers.length, start_body, strlen( start_body ), xml_response, strlen( xml_response ), end_body, strlen( end_body ) ); if( ret_code != 0 ) { UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "Failed to send response: err code = %d\n", ret_code ); } err_code = 0; error_handler: ixmlFreeDOMString( xml_response ); membuffer_destroy( &headers ); if( err_code != 0 ) { // only one type of error to worry about - out of mem send_error_response( info, SOAP_ACTION_FAILED, "Out of memory", request ); } } /**************************************************************************** * Function : get_var_name * * Parameters : * IN IXML_Document *TempDoc : Document containing variable request * OUT char* VarName : Name of the state varible * * Description : This function finds the name of the state variable * asked in the SOAP request. * * Return : int * returns 0 if successful else returns -1. * Note : ****************************************************************************/ static UPNP_INLINE int get_var_name( IN IXML_Document * TempDoc, OUT char *VarName ) { IXML_Node *EnvpNode = NULL; IXML_Node *BodyNode = NULL; IXML_Node *StNode = NULL; IXML_Node *VarNameNode = NULL; IXML_Node *VarNode = NULL; const DOMString StNodeName = NULL; const DOMString Temp = NULL; int ret_val = -1; // Got the Envelop node here EnvpNode = ixmlNode_getFirstChild( ( IXML_Node * ) TempDoc ); if( EnvpNode == NULL ) { goto error_handler; } // Got Body here BodyNode = ixmlNode_getFirstChild( EnvpNode ); if( BodyNode == NULL ) { goto error_handler; } // Got action node here StNode = ixmlNode_getFirstChild( BodyNode ); if( StNode == NULL ) { goto error_handler; } //Test whether this is the action node StNodeName = ixmlNode_getNodeName( StNode ); if( StNodeName == NULL || strstr( StNodeName, "QueryStateVariable" ) == NULL ) { goto error_handler; } VarNameNode = ixmlNode_getFirstChild( StNode ); if( VarNameNode == NULL ) { goto error_handler; } VarNode = ixmlNode_getFirstChild( VarNameNode ); Temp = ixmlNode_getNodeValue( VarNode ); linecopy( VarName, Temp ); UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "Received query for variable name %s\n", VarName ); ret_val = 0; // success error_handler: return ret_val; } /**************************************************************************** * Function : handle_query_variable * * Parameters : * IN SOCKINFO *info : Socket info * IN http_message_t* request : HTTP request * IN IXML_Document *xml_doc : Document containing the variable request * SOAP message * * Description : This action handles the SOAP requests to querry the * state variables. This functionality has been deprecated in * the UPnP V1.0 architecture * * Return : void * * Note : ****************************************************************************/ static UPNP_INLINE void handle_query_variable( IN SOCKINFO *info, IN http_message_t *request, IN IXML_Document *xml_doc ) { UpnpStateVarRequest *variable = UpnpStateVarRequest_new(); Upnp_FunPtr soap_event_callback; void *cookie; char var_name[LINE_SIZE]; const char *err_str; int err_code; // get var name if( get_var_name( xml_doc, var_name ) != 0 ) { send_error_response( info, SOAP_INVALID_VAR, Soap_Invalid_Var, request ); return; } // get info for event err_code = get_device_info( request, 1, xml_doc, info->foreign_sockaddr.ss_family, (UpnpString *)UpnpStateVarRequest_get_DevUDN(variable), (UpnpString *)UpnpStateVarRequest_get_ServiceID(variable), &soap_event_callback, &cookie); if( err_code != 0 ) { send_error_response( info, SOAP_INVALID_VAR, Soap_Invalid_Var, request ); return; } UpnpStateVarRequest_set_ErrCode(variable, UPNP_E_SUCCESS); UpnpStateVarRequest_strcpy_StateVarName(variable, var_name); UpnpStateVarRequest_set_CtrlPtIPAddr(variable, (struct sockaddr *)&info->foreign_sockaddr); // send event soap_event_callback( UPNP_CONTROL_GET_VAR_REQUEST, variable, cookie ); UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, "Return from callback for var request\n" ); // validate, and handle result if( UpnpStateVarRequest_get_CurrentVal(variable) == NULL ) { err_code = SOAP_ACTION_FAILED; err_str = Soap_Action_Failed; send_error_response( info, SOAP_INVALID_VAR, Soap_Invalid_Var, request ); return; } if( UpnpStateVarRequest_get_ErrCode(variable) != UPNP_E_SUCCESS ) { if( UpnpString_get_Length(UpnpStateVarRequest_get_ErrStr(variable)) > 0 ) { err_code = SOAP_INVALID_VAR; err_str = Soap_Invalid_Var; } else { err_code = UpnpStateVarRequest_get_ErrCode(variable); err_str = UpnpStateVarRequest_get_ErrStr_cstr(variable); } send_error_response( info, err_code, err_str, request ); return; } // send response send_var_query_response( info, UpnpStateVarRequest_get_CurrentVal(variable), request ); UpnpStateVarRequest_delete(variable); } /**************************************************************************** * Function : handle_invoke_action * * Parameters : * IN SOCKINFO *info : Socket info * IN http_message_t* request : HTTP Request * IN memptr action_name : Name of the SOAP Action * IN IXML_Document *xml_doc : document containing the SOAP action * request * * Description : This functions handle the SOAP action request. It checks * the integrity of the SOAP action request and gives the call back to * the device application. * * Return : void * * Note : ****************************************************************************/ static void handle_invoke_action( IN SOCKINFO * info, IN http_message_t * request, IN memptr action_name, IN IXML_Document * xml_doc ) { char save_char; UpnpActionRequest *action = UpnpActionRequest_new(); UpnpString *devUDN = UpnpString_new(); UpnpString *serviceID = UpnpString_new(); IXML_Document *actionRequestDoc = NULL; IXML_Document *actionResultDoc = NULL; Upnp_FunPtr soap_event_callback; void *cookie = NULL; int err_code; const char *err_str; // null-terminate save_char = action_name.buf[action_name.length]; action_name.buf[action_name.length] = '\0'; // set default error err_code = SOAP_INVALID_ACTION; err_str = Soap_Invalid_Action; // get action node if( get_action_node( xml_doc, action_name.buf, &actionRequestDoc ) == -1 ) { goto error_handler; } // get device info for action event err_code = get_device_info( request, 0, xml_doc, info->foreign_sockaddr.ss_family, devUDN, serviceID, &soap_event_callback, &cookie ); if( err_code != UPNP_E_SUCCESS ) { goto error_handler; } UpnpActionRequest_set_ErrCode(action, UPNP_E_SUCCESS); UpnpActionRequest_strcpy_ErrStr(action, ""); UpnpActionRequest_strcpy_ActionName(action, action_name.buf); UpnpActionRequest_set_DevUDN(action, devUDN); UpnpActionRequest_set_ServiceID(action, serviceID); UpnpActionRequest_set_ActionRequest(action, actionRequestDoc); UpnpActionRequest_set_CtrlPtIPAddr(action, (struct sockaddr *)&info->foreign_sockaddr); UpnpPrintf(UPNP_INFO, SOAP, __FILE__, __LINE__, "Calling Callback\n"); soap_event_callback(UPNP_CONTROL_ACTION_REQUEST, action, cookie); err_code = UpnpActionRequest_get_ErrCode(action); if (err_code != UPNP_E_SUCCESS) { err_str = UpnpActionRequest_get_ErrStr_cstr(action); if (strlen(err_str) <= 0) { err_code = SOAP_ACTION_FAILED; err_str = Soap_Action_Failed; } goto error_handler; } // validate, and handle action error actionResultDoc = UpnpActionRequest_get_ActionResult(action); if (actionResultDoc == NULL) { err_code = SOAP_ACTION_FAILED; err_str = Soap_Action_Failed; goto error_handler; } // send response send_action_response(info, actionResultDoc, request); err_code = 0; // error handling and cleanup error_handler: action_name.buf[action_name.length] = save_char; // restore if( err_code != 0 ) { send_error_response( info, err_code, err_str, request ); } UpnpString_delete(serviceID); UpnpString_delete(devUDN); UpnpActionRequest_delete(action); } /**************************************************************************** * Function : soap_device_callback * * Parameters : * IN http_parser_t *parser : Parsed request received by the device * IN http_message_t* request : HTTP request * INOUT SOCKINFO *info : socket info * * Description : This is a callback called by minisever after receiving * the request from the control point. This function will start * processing the request. It calls handle_invoke_action to handle the * SOAP action * * Return : void * * Note : ****************************************************************************/ void soap_device_callback( IN http_parser_t * parser, IN http_message_t * request, INOUT SOCKINFO * info ) { int err_code; const char *err_str; memptr action_name; IXML_Document *xml_doc = NULL; // set default error err_code = SOAP_INVALID_ACTION; err_str = Soap_Invalid_Action; // validate: content-type == text/xml if( !has_xml_content_type( request ) ) { goto error_handler; } // type of request if( get_request_type( request, &action_name ) != 0 ) { goto error_handler; } // parse XML err_code = ixmlParseBufferEx( request->entity.buf, &xml_doc ); if( err_code != IXML_SUCCESS ) { if( err_code == IXML_INSUFFICIENT_MEMORY ) { err_code = UPNP_E_OUTOF_MEMORY; } else { err_code = SOAP_ACTION_FAILED; } err_str = "XML error"; goto error_handler; } if( action_name.length == 0 ) { // query var handle_query_variable( info, request, xml_doc ); } else { // invoke action handle_invoke_action( info, request, action_name, xml_doc ); } err_code = 0; // no error error_handler: ixmlDocument_free( xml_doc ); if( err_code != 0 ) { send_error_response( info, err_code, err_str, request ); } } #endif // EXCLUDE_SOAP #endif // INCLUDE_DEVICE_APIS libupnp-1.8.0~svn20100507/upnp/src/ssdp/0000777000175000017500000000000011373047472014474 500000000000000libupnp-1.8.0~svn20100507/upnp/src/ssdp/ssdp_ctrlpt.c0000644000175000017500000005002411042015421017074 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #include "config.h" #include "util.h" #ifdef INCLUDE_CLIENT_APIS #if EXCLUDE_SSDP == 0 #include "httpparser.h" #include "httpreadwrite.h" #include "ssdp_ResultData.h" #include "ssdplib.h" #include "statcodes.h" #include "unixutil.h" #include "upnpapi.h" #include "UpnpInet.h" #include "ThreadPool.h" #include #ifdef WIN32 #include #endif /* WIN32 */ /************************************************************************ * Function: send_search_result * * Parameters: * IN void *data: Search reply from the device * * Description: * This function sends a callback to the control point application with * a SEARCH result * * Returns: void * ***************************************************************************/ void send_search_result(IN void *data) { SSDPResultData *temp = (SSDPResultData *)data; SSDPResultData_Callback(temp); SSDPResultData_delete(temp); } /************************************************************************ * Function: ssdp_handle_ctrlpt_msg * * Parameters: * IN http_message_t *hmsg: * SSDP message from the device * IN struct sockaddr *dest_addr: * Address of the device * IN xboolean timeout: * timeout kept by the control point while * sending search message * IN void* cookie: * Cookie stored by the control point application. * This cookie will be returned to the control point * in the callback * * Description: * This function handles the ssdp messages from the devices. These * messages includes the search replies, advertisement of device coming * alive and bye byes. * * Returns: void * ***************************************************************************/ void ssdp_handle_ctrlpt_msg( IN http_message_t *hmsg, IN struct sockaddr *dest_addr, IN xboolean timeout, // only in search reply IN void *cookie) // only in search reply { int handle; struct Handle_Info *ctrlpt_info = NULL; memptr hdr_value; xboolean is_byebye; // byebye or alive UpnpDiscovery *param = UpnpDiscovery_new(); int expires; int ret; SsdpEvent event; xboolean nt_found; xboolean usn_found; xboolean st_found; char save_char; Upnp_EventType event_type; Upnp_FunPtr ctrlpt_callback; void *ctrlpt_cookie; ListNode *node = NULL; SsdpSearchArg *searchArg = NULL; int matched = 0; SSDPResultData *threadData = NULL; ThreadPoolJob job; // we are assuming that there can be only one client supported at a time HandleReadLock(); if ( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { HandleUnlock(); goto end_ssdp_handle_ctrlpt_msg; } // copy ctrlpt_callback = ctrlpt_info->Callback; ctrlpt_cookie = ctrlpt_info->Cookie; HandleUnlock(); // search timeout if ( timeout ) { ctrlpt_callback( UPNP_DISCOVERY_SEARCH_TIMEOUT, NULL, cookie ); goto end_ssdp_handle_ctrlpt_msg; } UpnpDiscovery_set_ErrCode(param, UPNP_E_SUCCESS); // MAX-AGE // assume error expires = -1; UpnpDiscovery_set_Expires(param, expires); if ( httpmsg_find_hdr( hmsg, HDR_CACHE_CONTROL, &hdr_value ) != NULL ) { ret = matchstr( hdr_value.buf, hdr_value.length, "%imax-age = %d%0", &expires ); UpnpDiscovery_set_Expires(param, expires); if( ret != PARSE_OK ) { goto end_ssdp_handle_ctrlpt_msg; } } // DATE if ( httpmsg_find_hdr( hmsg, HDR_DATE, &hdr_value ) != NULL ) { UpnpDiscovery_strcpy_Date(param, hdr_value.buf); } // dest addr UpnpDiscovery_set_DestAddr(param, dest_addr); // EXT if ( httpmsg_find_hdr( hmsg, HDR_EXT, &hdr_value ) != NULL ) { UpnpDiscovery_strncpy_Ext(param, hdr_value.buf, hdr_value.length); } // LOCATION if ( httpmsg_find_hdr( hmsg, HDR_LOCATION, &hdr_value ) != NULL ) { UpnpDiscovery_strncpy_Location(param, hdr_value.buf, hdr_value.length); } // SERVER / USER-AGENT if ( httpmsg_find_hdr( hmsg, HDR_SERVER, &hdr_value ) != NULL || httpmsg_find_hdr( hmsg, HDR_USER_AGENT, &hdr_value ) != NULL ) { UpnpDiscovery_strncpy_Os(param, hdr_value.buf, hdr_value.length); } // clear everything event.UDN[0] = '\0'; event.DeviceType[0] = '\0'; event.ServiceType[0] = '\0'; nt_found = FALSE; if ( httpmsg_find_hdr( hmsg, HDR_NT, &hdr_value ) != NULL ) { save_char = hdr_value.buf[hdr_value.length]; hdr_value.buf[hdr_value.length] = '\0'; nt_found = ( ssdp_request_type( hdr_value.buf, &event ) == 0 ); hdr_value.buf[hdr_value.length] = save_char; } usn_found = FALSE; if ( httpmsg_find_hdr( hmsg, HDR_USN, &hdr_value ) != NULL ) { save_char = hdr_value.buf[hdr_value.length]; hdr_value.buf[hdr_value.length] = '\0'; usn_found = ( unique_service_name( hdr_value.buf, &event ) == 0 ); hdr_value.buf[hdr_value.length] = save_char; } if ( nt_found || usn_found ) { UpnpDiscovery_strcpy_DeviceID( param, event.UDN); UpnpDiscovery_strcpy_DeviceType( param, event.DeviceType); UpnpDiscovery_strcpy_ServiceType(param, event.ServiceType); } // ADVERT. OR BYEBYE if( hmsg->is_request ) { // use NTS hdr to determine advert., or byebye if ( httpmsg_find_hdr( hmsg, HDR_NTS, &hdr_value ) == NULL ) { // error; NTS header not found goto end_ssdp_handle_ctrlpt_msg; } if ( memptr_cmp( &hdr_value, "ssdp:alive" ) == 0 ) { is_byebye = FALSE; } else if( memptr_cmp( &hdr_value, "ssdp:byebye" ) == 0 ) { is_byebye = TRUE; } else { // bad value goto end_ssdp_handle_ctrlpt_msg; } if ( is_byebye ) { // check device byebye if( !nt_found || !usn_found ) { // bad byebye goto end_ssdp_handle_ctrlpt_msg; } event_type = UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE; } else { // check advertisement // .Expires is valid if positive. This is for testing // only. Expires should be greater than 1800 (30 mins) if( !nt_found || !usn_found || UpnpString_get_Length(UpnpDiscovery_get_Location(param)) == 0 || UpnpDiscovery_get_Expires(param) <= 0 ) { // bad advertisement goto end_ssdp_handle_ctrlpt_msg; } event_type = UPNP_DISCOVERY_ADVERTISEMENT_ALIVE; } // call callback ctrlpt_callback( event_type, param, ctrlpt_cookie ); } else { // reply (to a SEARCH) // // only checking to see if there is a valid ST header st_found = FALSE; if( httpmsg_find_hdr( hmsg, HDR_ST, &hdr_value ) != NULL ) { save_char = hdr_value.buf[hdr_value.length]; hdr_value.buf[hdr_value.length] = '\0'; st_found = ssdp_request_type( hdr_value.buf, &event ) == 0; hdr_value.buf[hdr_value.length] = save_char; } if( hmsg->status_code != HTTP_OK || UpnpDiscovery_get_Expires(param) <= 0 || UpnpString_get_Length(UpnpDiscovery_get_Location(param)) == 0 || !usn_found || !st_found ) { // bad reply goto end_ssdp_handle_ctrlpt_msg; } // check each current search HandleLock(); if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { HandleUnlock(); goto end_ssdp_handle_ctrlpt_msg; } node = ListHead( &ctrlpt_info->SsdpSearchList ); // temporary add null termination //save_char = hdr_value.buf[ hdr_value.length ]; //hdr_value.buf[ hdr_value.length ] = '\0'; while( node != NULL ) { searchArg = node->item; matched = 0; // check for match of ST header and search target switch ( searchArg->requestType ) { case SSDP_ALL: matched = 1; break; case SSDP_ROOTDEVICE: matched = ( event.RequestType == SSDP_ROOTDEVICE ); break; case SSDP_DEVICEUDN: matched = !( strncmp( searchArg->searchTarget, hdr_value.buf, hdr_value.length ) ); break; case SSDP_DEVICETYPE: { int m = min( hdr_value.length, strlen( searchArg->searchTarget ) ); matched = !( strncmp( searchArg->searchTarget, hdr_value.buf, m ) ); break; } case SSDP_SERVICE: { int m = min( hdr_value.length, strlen( searchArg->searchTarget ) ); matched = !( strncmp( searchArg->searchTarget, hdr_value.buf, m ) ); break; } default: matched = 0; break; } if (matched) { // schedule call back threadData = SSDPResultData_new(); if (threadData != NULL) { SSDPResultData_set_Param(threadData, param); SSDPResultData_set_Cookie(threadData, searchArg->cookie); SSDPResultData_set_CtrlptCallback(threadData, ctrlpt_callback); TPJobInit(&job, (start_routine)send_search_result, threadData); TPJobSetPriority(&job, MED_PRIORITY); TPJobSetFreeFunction(&job, (free_routine)SSDPResultData_delete); ThreadPoolAdd(&gRecvThreadPool, &job, NULL); } } node = ListNext( &ctrlpt_info->SsdpSearchList, node ); } HandleUnlock(); //ctrlpt_callback( UPNP_DISCOVERY_SEARCH_RESULT, param, cookie ); } end_ssdp_handle_ctrlpt_msg: UpnpDiscovery_delete(param); } /************************************************************************ * Function : CreateClientRequestPacket * * Parameters: * IN char * RqstBuf:Output string in HTTP format. * IN char *SearchTarget:Search Target * IN int Mx dest_addr: Number of seconds to wait to * collect all the responses * IN int AddressFamily: search address family * * Description: * This function creates a HTTP search request packet * depending on the input parameter. * * Returns: void * ***************************************************************************/ static void CreateClientRequestPacket( IN char *RqstBuf, IN int Mx, IN char *SearchTarget, IN int AddressFamily ) { char TempBuf[COMMAND_LEN]; strcpy( RqstBuf, "M-SEARCH * HTTP/1.1\r\n" ); if (AddressFamily == AF_INET) { sprintf( TempBuf, "HOST: %s:%d\r\n", SSDP_IP, SSDP_PORT ); } else if (AddressFamily == AF_INET6) { sprintf( TempBuf, "HOST: [%s]:%d\r\n", SSDP_IPV6_LINKLOCAL, SSDP_PORT ); } strcat( RqstBuf, TempBuf ); strcat( RqstBuf, "MAN: \"ssdp:discover\"\r\n" ); if( Mx > 0 ) { sprintf( TempBuf, "MX: %d\r\n", Mx ); strcat( RqstBuf, TempBuf ); } if( SearchTarget != NULL ) { sprintf( TempBuf, "ST: %s\r\n", SearchTarget ); strcat( RqstBuf, TempBuf ); } strcat( RqstBuf, "\r\n" ); } /************************************************************************ * Function : searchExpired * * Parameters: * IN void * arg: * * Description: * This function * * Returns: void * ***************************************************************************/ void searchExpired( void *arg ) { int *id = ( int * )arg; int handle = -1; struct Handle_Info *ctrlpt_info = NULL; //remove search Target from list and call client back ListNode *node = NULL; SsdpSearchArg *item; Upnp_FunPtr ctrlpt_callback; void *cookie = NULL; int found = 0; HandleLock(); //remove search target from search list if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { free( id ); HandleUnlock(); return; } ctrlpt_callback = ctrlpt_info->Callback; node = ListHead( &ctrlpt_info->SsdpSearchList ); while( node != NULL ) { item = ( SsdpSearchArg * ) node->item; if( item->timeoutEventId == ( *id ) ) { free( item->searchTarget ); cookie = item->cookie; found = 1; item->searchTarget = NULL; free( item ); ListDelNode( &ctrlpt_info->SsdpSearchList, node, 0 ); break; } node = ListNext( &ctrlpt_info->SsdpSearchList, node ); } HandleUnlock(); if( found ) { ctrlpt_callback( UPNP_DISCOVERY_SEARCH_TIMEOUT, NULL, cookie ); } free( id ); } /************************************************************************ * Function : SearchByTarget * * Parameters: * IN int Mx:Number of seconds to wait, to collect all the responses. * IN char *St: Search target. * IN void *Cookie: cookie provided by control point application. * This cokie will be returned to application in the callback. * * Description: * This function implements the search request of the discovery phase. * A M-SEARCH request is sent on the SSDP channel for both IPv4 and * IPv6 addresses. The search target(ST) is required and must be one of * the following: * - "ssdp:all" : Search for all devices and services. * - "ssdp:rootdevice" : Search for root devices only. * - "uuid:" : Search for a particular device. * - "urn:schemas-upnp-org:device:" * - "urn:schemas-upnp-org:service:" * - "urn::device:" * - "urn::service:" * * Returns: int * 1 if successful else appropriate error ***************************************************************************/ int SearchByTarget( IN int Mx, IN char *St, IN void *Cookie ) { char errorBuffer[ERROR_BUFFER_LEN]; int socklen = sizeof( struct sockaddr_storage ); int *id = NULL; int ret = 0; char ReqBufv4[BUFSIZE]; char ReqBufv6[BUFSIZE]; struct sockaddr_storage __ss_v4; struct sockaddr_storage __ss_v6; struct sockaddr_in* destAddr4 = (struct sockaddr_in*)&__ss_v4; struct sockaddr_in6* destAddr6 = (struct sockaddr_in6*)&__ss_v6; fd_set wrSet; SsdpSearchArg *newArg = NULL; int timeTillRead = 0; int handle; struct Handle_Info *ctrlpt_info = NULL; enum SsdpSearchType requestType; unsigned long addrv4 = inet_addr( gIF_IPV4 ); int max_fd = 0; //ThreadData *ThData; ThreadPoolJob job; requestType = ssdp_request_type1( St ); if( requestType == SSDP_SERROR ) { return UPNP_E_INVALID_PARAM; } UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, "Inside SearchByTarget\n"); timeTillRead = Mx; if( timeTillRead < MIN_SEARCH_TIME ) { timeTillRead = MIN_SEARCH_TIME; } else if( timeTillRead > MAX_SEARCH_TIME ) { timeTillRead = MAX_SEARCH_TIME; } CreateClientRequestPacket( ReqBufv4, timeTillRead, St, AF_INET ); CreateClientRequestPacket( ReqBufv6, timeTillRead, St, AF_INET6 ); memset( &__ss_v4, 0, sizeof( __ss_v4 ) ); destAddr4->sin_family = AF_INET; inet_pton( AF_INET, SSDP_IP, &destAddr4->sin_addr ); destAddr4->sin_port = htons( SSDP_PORT ); memset( &__ss_v6, 0, sizeof( __ss_v6 ) ); destAddr6->sin6_family = AF_INET6; inet_pton( AF_INET6, SSDP_IPV6_LINKLOCAL, &destAddr6->sin6_addr ); destAddr6->sin6_port = htons( SSDP_PORT ); destAddr6->sin6_scope_id = gIF_INDEX; // add search criteria to list HandleLock(); if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { HandleUnlock(); return UPNP_E_INTERNAL_ERROR; } newArg = ( SsdpSearchArg * ) malloc( sizeof( SsdpSearchArg ) ); newArg->searchTarget = strdup( St ); newArg->cookie = Cookie; newArg->requestType = requestType; id = ( int * )malloc( sizeof( int ) ); TPJobInit( &job, ( start_routine ) searchExpired, id ); TPJobSetPriority( &job, MED_PRIORITY ); TPJobSetFreeFunction( &job, ( free_routine ) free ); // Schedule a timeout event to remove search Arg TimerThreadSchedule( &gTimerThread, timeTillRead, REL_SEC, &job, SHORT_TERM, id ); newArg->timeoutEventId = ( *id ); ListAddTail( &ctrlpt_info->SsdpSearchList, newArg ); HandleUnlock(); FD_ZERO( &wrSet ); if( gSsdpReqSocket4 != INVALID_SOCKET ) { setsockopt( gSsdpReqSocket4, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addrv4, sizeof (addrv4) ); FD_SET( gSsdpReqSocket4, &wrSet ); max_fd = max(max_fd, gSsdpReqSocket4); } if( gSsdpReqSocket6 != INVALID_SOCKET ) { setsockopt( gSsdpReqSocket6, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&gIF_INDEX, sizeof(gIF_INDEX) ); FD_SET( gSsdpReqSocket6, &wrSet ); max_fd = max(max_fd, gSsdpReqSocket6); } ret = select( max_fd + 1, NULL, &wrSet, NULL, NULL ); if( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "SSDP_LIB: Error in select(): %s\n", errorBuffer ); shutdown( gSsdpReqSocket4, SD_BOTH ); UpnpCloseSocket( gSsdpReqSocket4 ); shutdown( gSsdpReqSocket6, SD_BOTH ); UpnpCloseSocket( gSsdpReqSocket6 ); return UPNP_E_INTERNAL_ERROR; } if( gSsdpReqSocket6 != INVALID_SOCKET && FD_ISSET( gSsdpReqSocket6, &wrSet ) ) { int NumCopy = 0; while( NumCopy < NUM_SSDP_COPY ) { sendto( gSsdpReqSocket6, ReqBufv6, strlen( ReqBufv6 ), 0, (struct sockaddr *)&__ss_v6, socklen ); NumCopy++; imillisleep( SSDP_PAUSE ); } } if( gSsdpReqSocket4 != INVALID_SOCKET && FD_ISSET( gSsdpReqSocket4, &wrSet ) ) { int NumCopy = 0; while( NumCopy < NUM_SSDP_COPY ) { sendto( gSsdpReqSocket4, ReqBufv4, strlen( ReqBufv4 ), 0, (struct sockaddr *)&__ss_v4, socklen ); NumCopy++; imillisleep( SSDP_PAUSE ); } } return 1; } #endif // EXCLUDE_SSDP #endif // INCLUDE_CLIENT_APIS libupnp-1.8.0~svn20100507/upnp/src/ssdp/ssdp_ResultData.c0000644000175000017500000000407311365106163017653 00000000000000 #include "config.h" #include "ssdp_ResultData.h" #include // for calloc(), free() struct SSSDPResultData { UpnpDiscovery *m_param; void *m_cookie; Upnp_FunPtr m_ctrlpt_callback; }; SSDPResultData *SSDPResultData_new() { struct SSSDPResultData *p = calloc(1, sizeof (struct SSSDPResultData)); p->m_param = UpnpDiscovery_new(); #if 0 p->m_cookie = NULL; p->m_ctrlpt_callback = NULL; #endif return (SSDPResultData *)p; } void SSDPResultData_delete(SSDPResultData *p) { struct SSSDPResultData *q = (struct SSSDPResultData *)p; if (!q) return; UpnpDiscovery_delete(q->m_param); q->m_param = NULL; q->m_cookie = NULL; q->m_ctrlpt_callback = NULL; free(p); } SSDPResultData *SSDPResultData_dup(const SSDPResultData *p) { SSDPResultData *q = SSDPResultData_new(); SSDPResultData_assign(q, p); return q; } void SSDPResultData_assign(SSDPResultData *q, const SSDPResultData *p) { if (q != p) { SSDPResultData_set_Param(q, SSDPResultData_get_Param(p)); SSDPResultData_set_Cookie(q, SSDPResultData_get_Cookie(p)); SSDPResultData_set_CtrlptCallback(q, SSDPResultData_get_CtrlptCallback(p)); } } UpnpDiscovery *SSDPResultData_get_Param(const SSDPResultData *p) { return ((struct SSSDPResultData *)p)->m_param; } void SSDPResultData_set_Param(SSDPResultData *p, const UpnpDiscovery *d) { UpnpDiscovery_assign(((struct SSSDPResultData *)p)->m_param, d); } void *SSDPResultData_get_Cookie(const SSDPResultData *p) { return ((struct SSSDPResultData *)p)->m_cookie; } void SSDPResultData_set_Cookie(SSDPResultData *p, void *c) { ((struct SSSDPResultData *)p)->m_cookie = c; } Upnp_FunPtr SSDPResultData_get_CtrlptCallback(const SSDPResultData *p) { return ((struct SSSDPResultData *)p)->m_ctrlpt_callback; } void SSDPResultData_set_CtrlptCallback(SSDPResultData *p, Upnp_FunPtr f) { ((struct SSSDPResultData *)p)->m_ctrlpt_callback = f; } void SSDPResultData_Callback(const SSDPResultData *p) { struct SSSDPResultData *q = (struct SSSDPResultData *)p; q->m_ctrlpt_callback( UPNP_DISCOVERY_SEARCH_RESULT, q->m_param, q->m_cookie); } libupnp-1.8.0~svn20100507/upnp/src/ssdp/ssdp_ResultData.h0000644000175000017500000000207311021325543017650 00000000000000 #ifndef SSDP_RESULTDATA_H #define SSDP_RESULTDATA_H /** Structure to contain Discovery response */ typedef struct s_SSDPResultData SSDPResultData; #include "Discovery.h" /* for UpnpDiscovery */ #include "upnp.h" /* for Upnp_FunPtr */ /** Constructor */ SSDPResultData *SSDPResultData_new(); /** Destructor */ void SSDPResultData_delete(SSDPResultData *p); /** Copy Constructor */ SSDPResultData *SSDPResultData_dup(const SSDPResultData *p); /** Assignment operator */ void SSDPResultData_assign(SSDPResultData *q, const SSDPResultData *p); /** */ UpnpDiscovery *SSDPResultData_get_Param(const SSDPResultData *p); void SSDPResultData_set_Param(SSDPResultData *p, const UpnpDiscovery *d); /** */ void *SSDPResultData_get_Cookie(const SSDPResultData *p); void SSDPResultData_set_Cookie(SSDPResultData *p, void *c); /** */ Upnp_FunPtr SSDPResultData_get_CtrlptCallback(const SSDPResultData *p); void SSDPResultData_set_CtrlptCallback(SSDPResultData *p, Upnp_FunPtr f); /** */ void SSDPResultData_Callback(const SSDPResultData *p); #endif /* SSDP_RESULTDATA_H */ libupnp-1.8.0~svn20100507/upnp/src/ssdp/ssdp_device.c0000644000175000017500000007166411042015421017040 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #include "config.h" #ifdef INCLUDE_DEVICE_APIS #if EXCLUDE_SSDP == 0 #include "httpparser.h" #include "httpreadwrite.h" #include "ssdplib.h" #include "statcodes.h" #include "ThreadPool.h" #include "unixutil.h" #include "upnpapi.h" #include "UpnpInet.h" #include #include #include #define MSGTYPE_SHUTDOWN 0 #define MSGTYPE_ADVERTISEMENT 1 #define MSGTYPE_REPLY 2 /************************************************************************ * Function : advertiseAndReplyThread * * Parameters: * IN void *data: Structure containing the search request * * Description: * This function is a wrapper function to reply the search request * coming from the control point. * * Returns: void * * always return NULL ***************************************************************************/ void * advertiseAndReplyThread( IN void *data ) { SsdpSearchReply *arg = ( SsdpSearchReply * ) data; AdvertiseAndReply( 0, arg->handle, arg->event.RequestType, (struct sockaddr*)&arg->dest_addr, arg->event.DeviceType, arg->event.UDN, arg->event.ServiceType, arg->MaxAge ); free( arg ); return NULL; } /************************************************************************ * Function : ssdp_handle_device_request * * Parameters: * IN http_message_t *hmsg: SSDP search request from the control point * IN struct sockaddr *dest_addr: The address info of control point * * Description: * This function handles the search request. It do the sanity checks of * the request and then schedules a thread to send a random time reply ( * random within maximum time given by the control point to reply). * * Returns: void * * 1 if successful else appropriate error ***************************************************************************/ #ifdef INCLUDE_DEVICE_APIS void ssdp_handle_device_request( IN http_message_t *hmsg, IN struct sockaddr *dest_addr ) { #define MX_FUDGE_FACTOR 10 int handle; struct Handle_Info *dev_info = NULL; memptr hdr_value; int mx; char save_char; SsdpEvent event; int ret_code; SsdpSearchReply *threadArg = NULL; ThreadPoolJob job; int replyTime; int maxAge; // check man hdr if( httpmsg_find_hdr( hmsg, HDR_MAN, &hdr_value ) == NULL || memptr_cmp( &hdr_value, "\"ssdp:discover\"" ) != 0 ) { return; // bad or missing hdr } // MX header if( httpmsg_find_hdr( hmsg, HDR_MX, &hdr_value ) == NULL || ( mx = raw_to_int( &hdr_value, 10 ) ) < 0 ) { return; } // ST header if( httpmsg_find_hdr( hmsg, HDR_ST, &hdr_value ) == NULL ) { return; } save_char = hdr_value.buf[hdr_value.length]; hdr_value.buf[hdr_value.length] = '\0'; ret_code = ssdp_request_type( hdr_value.buf, &event ); hdr_value.buf[hdr_value.length] = save_char; // restore if( ret_code == -1 ) { return; // bad ST header } HandleLock(); // device info if( GetDeviceHandleInfo( dest_addr->sa_family, &handle, &dev_info ) != HND_DEVICE ) { HandleUnlock(); return; // no info found } maxAge = dev_info->MaxAge; HandleUnlock(); UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, "ssdp_handle_device_request with Cmd %d SEARCH\n", event.Cmd ); UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, "MAX-AGE = %d\n", maxAge ); UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, "MX = %d\n", event.Mx ); UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, "DeviceType = %s\n", event.DeviceType ); UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, "DeviceUuid = %s\n", event.UDN ); UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, "ServiceType = %s\n", event.ServiceType ); threadArg = ( SsdpSearchReply * ) malloc( sizeof( SsdpSearchReply ) ); if( threadArg == NULL ) { return; } threadArg->handle = handle; memcpy( &threadArg->dest_addr, dest_addr, sizeof(threadArg->dest_addr) ); threadArg->event = event; threadArg->MaxAge = maxAge; TPJobInit( &job, advertiseAndReplyThread, threadArg ); TPJobSetFreeFunction( &job, ( free_routine ) free ); //Subtract a percentage from the mx //to allow for network and processing delays // (i.e. if search is for 30 seconds, // respond withing 0 - 27 seconds) if( mx >= 2 ) { mx -= MAXVAL( 1, mx / MX_FUDGE_FACTOR ); } if( mx < 1 ) { mx = 1; } replyTime = rand() % mx; TimerThreadSchedule( &gTimerThread, replyTime, REL_SEC, &job, SHORT_TERM, NULL ); } #endif /************************************************************************ * Function : NewRequestHandler * * Parameters: * IN struct sockaddr *DestAddr: Ip address, to send the reply. * IN int NumPacket: Number of packet to be sent. * IN char **RqPacket:Number of packet to be sent. * * Description: * This function works as a request handler which passes the HTTP * request string to multicast channel then * * Returns: void * * 1 if successful else appropriate error ***************************************************************************/ static int NewRequestHandler( IN struct sockaddr *DestAddr, IN int NumPacket, IN char **RqPacket ) { char errorBuffer[ERROR_BUFFER_LEN]; SOCKET ReplySock; int socklen = sizeof( struct sockaddr_storage ); int NumCopy; int Index; unsigned long replyAddr = inet_addr( gIF_IPV4 ); int ttl = 4; // a/c to UPNP Spec int hops = 1; char buf_ntop[64]; ReplySock = socket( DestAddr->sa_family, SOCK_DGRAM, 0 ); if ( ReplySock == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "SSDP_LIB: New Request Handler:" "Error in socket(): %s\n", errorBuffer ); return UPNP_E_OUTOF_SOCKET; } if( DestAddr->sa_family == AF_INET ) { inet_ntop(AF_INET, &((struct sockaddr_in*)DestAddr)->sin_addr, buf_ntop, sizeof(buf_ntop)); setsockopt( ReplySock, IPPROTO_IP, IP_MULTICAST_IF, (char *)&replyAddr, sizeof (replyAddr) ); setsockopt( ReplySock, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl, sizeof (int) ); } else if( DestAddr->sa_family == AF_INET6 ) { inet_ntop(AF_INET6, &((struct sockaddr_in6*)DestAddr)->sin6_addr, buf_ntop, sizeof(buf_ntop)); setsockopt( ReplySock, IPPROTO_IPV6, IPV6_MULTICAST_IF, (char *)&gIF_INDEX, sizeof(gIF_INDEX) ); setsockopt( ReplySock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&hops, sizeof(hops) ); } else { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Invalid destination address specified." ); } for( Index = 0; Index < NumPacket; Index++ ) { int rc; // The reason to keep this loop is purely historical/documentation, // according to section 9.2 of HTTPU spec: // // "If a multicast resource would send a response(s) to any copy of the // request, it SHOULD send its response(s) to each copy of the request // it receives. It MUST NOT repeat its response(s) per copy of the // request." // // http://www.upnp.org/download/draft-goland-http-udp-04.txt // // So, NUM_COPY has been changed from 2 to 1. NumCopy = 0; while( NumCopy < NUM_COPY ) { UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, ">>> SSDP SEND to %s >>>\n%s\n", buf_ntop, *( RqPacket + Index ) ); rc = sendto( ReplySock, *( RqPacket + Index ), strlen( *( RqPacket + Index ) ), 0, DestAddr, socklen ); imillisleep( SSDP_PAUSE ); ++NumCopy; } } shutdown( ReplySock, SD_BOTH ); UpnpCloseSocket( ReplySock ); return UPNP_E_SUCCESS; } /************************************************************************ * Function : CreateServiceRequestPacket * * Parameters: * IN int msg_type : type of the message ( Search Reply, Advertisement * or Shutdown ) * IN char * nt : ssdp type * IN char * usn : unique service name ( go in the HTTP Header) * IN char * location :Location URL. * IN int duration :Service duration in sec. * OUT char** packet :Output buffer filled with HTTP statement. * IN int AddressFamily: Address family of the HTTP request. * * Description: * This function creates a HTTP request packet. Depending * on the input parameter it either creates a service advertisement * request or service shutdown request etc. * * Returns: void * ***************************************************************************/ void CreateServicePacket( IN int msg_type, IN char *nt, IN char *usn, IN char *location, IN int duration, OUT char **packet, IN int AddressFamily) { int ret_code; char *nts; membuffer buf; //Notf=0 means service shutdown, //Notf=1 means service advertisement, Notf =2 means reply membuffer_init( &buf ); buf.size_inc = 30; *packet = NULL; if( msg_type == MSGTYPE_REPLY ) { ret_code = http_MakeMessage( &buf, 1, 1, "R" "sdc" "D" "sc" "ssc" "ssc" "ssc" "S" "Xc" "ssc" "sscc", HTTP_OK, "CACHE-CONTROL: max-age=", duration, "EXT:", "LOCATION: ", location, "OPT: ", "\"http://schemas.upnp.org/upnp/1/0/\"; ns=01", "01-NLS: ", gUpnpSdkNLSuuid, X_USER_AGENT, "ST: ", nt, "USN: ", usn); if( ret_code != 0 ) { return; } } else if( msg_type == MSGTYPE_ADVERTISEMENT || msg_type == MSGTYPE_SHUTDOWN ) { if( msg_type == MSGTYPE_ADVERTISEMENT ) { nts = "ssdp:alive"; } else // shutdown { nts = "ssdp:byebye"; } // NOTE: The CACHE-CONTROL and LOCATION headers are not present in // a shutdown msg, but are present here for MS WinMe interop. ret_code = http_MakeMessage( &buf, 1, 1, "Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "ssc" "ssc" "S" "Xc" "sscc", HTTPMETHOD_NOTIFY, "*", (size_t)1, "HOST: ", (AddressFamily==AF_INET) ? SSDP_IP : "[" SSDP_IPV6_LINKLOCAL "]", ":", SSDP_PORT, "CACHE-CONTROL: max-age=", duration, "LOCATION: ", location, "OPT: ", "\"http://schemas.upnp.org/upnp/1/0/\"; ns=01", "01-NLS: ", gUpnpSdkNLSuuid, "NT: ", nt, "NTS: ", nts, X_USER_AGENT, "USN: ", usn ); if( ret_code != 0 ) { return; } } else { assert( 0 ); // unknown msg } *packet = membuffer_detach( &buf ); // return msg membuffer_destroy( &buf ); return; } /************************************************************************ * Function : DeviceAdvertisement * * Parameters: * IN char * DevType : type of the device * IN int RootDev: flag to indicate if the device is root device * IN char * nt : ssdp type * IN char * usn : unique service name * IN char * location :Location URL. * IN int duration :Service duration in sec. * * Description: * This function creates the device advertisement request based on * the input parameter, and send it to the multicast channel. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int DeviceAdvertisement( IN char *DevType, int RootDev, char *Udn, IN char *Location, IN int Duration, IN int AddressFamily) { struct sockaddr_storage __ss; struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; //char Mil_Nt[LINE_SIZE] char Mil_Usn[LINE_SIZE]; char *msgs[3]; int ret_code; UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "In function DeviceAdvertisement\n" ); memset( &__ss, 0, sizeof(__ss) ); if( AddressFamily == AF_INET ) { DestAddr4->sin_family = AF_INET; inet_pton( AF_INET, SSDP_IP, &DestAddr4->sin_addr ); DestAddr4->sin_port = htons( SSDP_PORT ); } else if( AddressFamily == AF_INET6 ) { DestAddr6->sin6_family = AF_INET6; inet_pton( AF_INET6, SSDP_IPV6_LINKLOCAL, &DestAddr6->sin6_addr ); DestAddr6->sin6_port = htons( SSDP_PORT ); DestAddr6->sin6_scope_id = gIF_INDEX; } else { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Invalid device address family.\n" ); } msgs[0] = NULL; msgs[1] = NULL; msgs[2] = NULL; //If deviceis a root device , here we need to //send 3 advertisement or reply if( RootDev ) { sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn ); CreateServicePacket( MSGTYPE_ADVERTISEMENT, "upnp:rootdevice", Mil_Usn, Location, Duration, &msgs[0], AddressFamily ); } // both root and sub-devices need to send these two messages // CreateServicePacket( MSGTYPE_ADVERTISEMENT, Udn, Udn, Location, Duration, &msgs[1], AddressFamily ); sprintf( Mil_Usn, "%s::%s", Udn, DevType ); CreateServicePacket( MSGTYPE_ADVERTISEMENT, DevType, Mil_Usn, Location, Duration, &msgs[2], AddressFamily ); // check error if( ( RootDev && msgs[0] == NULL ) || msgs[1] == NULL || msgs[2] == NULL ) { free( msgs[0] ); free( msgs[1] ); free( msgs[2] ); return UPNP_E_OUTOF_MEMORY; } // send packets if( RootDev ) { // send 3 msg types ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 3, &msgs[0] ); } else // sub-device { // send 2 msg types ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 2, &msgs[1] ); } // free msgs free( msgs[0] ); free( msgs[1] ); free( msgs[2] ); return ret_code; } /************************************************************************ * Function : SendReply * * Parameters: * IN struct sockaddr * DestAddr:destination IP address. * IN char *DevType: Device type * IN int RootDev: 1 means root device 0 means embedded device. * IN char * Udn: Device UDN * IN char * Location: Location of Device description document. * IN int Duration :Life time of this device. * IN int ByType: * * Description: * This function creates the reply packet based on the input parameter, * and send it to the client addesss given in its input parameter DestAddr. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int SendReply( IN struct sockaddr *DestAddr, IN char *DevType, IN int RootDev, IN char *Udn, IN char *Location, IN int Duration, IN int ByType ) { int ret_code; char *msgs[2]; int num_msgs; char Mil_Usn[LINE_SIZE]; int i; msgs[0] = NULL; msgs[1] = NULL; if( RootDev ) { // one msg for root device num_msgs = 1; sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn ); CreateServicePacket( MSGTYPE_REPLY, "upnp:rootdevice", Mil_Usn, Location, Duration, &msgs[0], DestAddr->sa_family ); } else { // two msgs for embedded devices num_msgs = 1; //NK: FIX for extra response when someone searches by udn if( !ByType ) { CreateServicePacket( MSGTYPE_REPLY, Udn, Udn, Location, Duration, &msgs[0], DestAddr->sa_family ); } else { sprintf( Mil_Usn, "%s::%s", Udn, DevType ); CreateServicePacket( MSGTYPE_REPLY, DevType, Mil_Usn, Location, Duration, &msgs[0], DestAddr->sa_family ); } } // check error for( i = 0; i < num_msgs; i++ ) { if( msgs[i] == NULL ) { free( msgs[0] ); return UPNP_E_OUTOF_MEMORY; } } // send msgs ret_code = NewRequestHandler( DestAddr, num_msgs, msgs ); for( i = 0; i < num_msgs; i++ ) { if( msgs[i] != NULL ) free( msgs[i] ); } return ret_code; } /************************************************************************ * Function : DeviceReply * * Parameters: * IN struct sockaddr *DestAddr:destination IP address. * IN char *DevType: Device type * IN int RootDev: 1 means root device 0 means embedded device. * IN char * Udn: Device UDN * IN char * Location: Location of Device description document. * IN int Duration :Life time of this device. * Description: * This function creates the reply packet based on the input parameter, * and send it to the client address given in its input parameter DestAddr. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int DeviceReply( IN struct sockaddr *DestAddr, IN char *DevType, IN int RootDev, IN char *Udn, IN char *Location, IN int Duration) { char *szReq[3], Mil_Nt[LINE_SIZE], Mil_Usn[LINE_SIZE]; int RetVal; szReq[0] = NULL; szReq[1] = NULL; szReq[2] = NULL; // create 2 or 3 msgs if( RootDev ) { // 3 replies for root device strcpy( Mil_Nt, "upnp:rootdevice" ); sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn ); CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn, Location, Duration, &szReq[0], DestAddr->sa_family ); } sprintf( Mil_Nt, "%s", Udn ); sprintf( Mil_Usn, "%s", Udn ); CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn, Location, Duration, &szReq[1], DestAddr->sa_family ); sprintf( Mil_Nt, "%s", DevType ); sprintf( Mil_Usn, "%s::%s", Udn, DevType ); CreateServicePacket( MSGTYPE_REPLY, Mil_Nt, Mil_Usn, Location, Duration, &szReq[2], DestAddr->sa_family ); // check error if( ( RootDev && szReq[0] == NULL ) || szReq[1] == NULL || szReq[2] == NULL ) { free( szReq[0] ); free( szReq[1] ); free( szReq[2] ); return UPNP_E_OUTOF_MEMORY; } // send replies if( RootDev ) { RetVal = NewRequestHandler( DestAddr, 3, szReq ); } else { RetVal = NewRequestHandler( DestAddr, 2, &szReq[1] ); } // free free( szReq[0] ); free( szReq[1] ); free( szReq[2] ); return RetVal; } /************************************************************************ * Function : ServiceAdvertisement * * Parameters: * IN char * Udn: Device UDN * IN char *ServType: Service Type. * IN char * Location: Location of Device description document. * IN int Duration :Life time of this device. * IN int AddressFamily: Device address family * Description: * This function creates the advertisement packet based * on the input parameter, and send it to the multicast channel. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int ServiceAdvertisement( IN char *Udn, IN char *ServType, IN char *Location, IN int Duration, IN int AddressFamily) { char Mil_Usn[LINE_SIZE]; char *szReq[1]; int RetVal; struct sockaddr_storage __ss; struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; memset( &__ss, 0, sizeof(__ss) ); if( AddressFamily == AF_INET ) { DestAddr4->sin_family = AF_INET; inet_pton( AF_INET, SSDP_IP, &DestAddr4->sin_addr ); DestAddr4->sin_port = htons( SSDP_PORT ); } else if( AddressFamily == AF_INET6 ) { DestAddr6->sin6_family = AF_INET6; inet_pton( AF_INET6, SSDP_IPV6_LINKLOCAL, &DestAddr6->sin6_addr ); DestAddr6->sin6_port = htons( SSDP_PORT ); DestAddr6->sin6_scope_id = gIF_INDEX; } else { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Invalid device address family.\n" ); } sprintf( Mil_Usn, "%s::%s", Udn, ServType ); //CreateServiceRequestPacket(1,szReq[0],Mil_Nt,Mil_Usn, //Server,Location,Duration); CreateServicePacket( MSGTYPE_ADVERTISEMENT, ServType, Mil_Usn, Location, Duration, &szReq[0], AddressFamily ); if( szReq[0] == NULL ) { return UPNP_E_OUTOF_MEMORY; } RetVal = NewRequestHandler( (struct sockaddr*)&__ss, 1, szReq ); free( szReq[0] ); return RetVal; } /************************************************************************ * Function : ServiceReply * * Parameters: * IN struct sockaddr *DestAddr: * IN char * Udn: Device UDN * IN char *ServType: Service Type. * IN char * Location: Location of Device description document. * IN int Duration :Life time of this device. * Description: * This function creates the advertisement packet based * on the input parameter, and send it to the multicast channel. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int ServiceReply( IN struct sockaddr *DestAddr, IN char *ServType, IN char *Udn, IN char *Location, IN int Duration ) { char Mil_Usn[LINE_SIZE]; char *szReq[1]; int RetVal; szReq[0] = NULL; sprintf( Mil_Usn, "%s::%s", Udn, ServType ); CreateServicePacket( MSGTYPE_REPLY, ServType, Mil_Usn, Location, Duration, &szReq[0], DestAddr->sa_family ); if( szReq[0] == NULL ) { return UPNP_E_OUTOF_MEMORY; } RetVal = NewRequestHandler( DestAddr, 1, szReq ); free( szReq[0] ); return RetVal; } /************************************************************************ * Function : ServiceShutdown * * Parameters: * IN char * Udn: Device UDN * IN char *ServType: Service Type. * IN char * Location: Location of Device description document. * IN int Duration :Service duration in sec. * IN int AddressFamily: Device address family * Description: * This function creates a HTTP service shutdown request packet * and sent it to the multicast channel through RequestHandler. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int ServiceShutdown( IN char *Udn, IN char *ServType, IN char *Location, IN int Duration, IN int AddressFamily) { char Mil_Usn[LINE_SIZE]; char *szReq[1]; struct sockaddr_storage __ss; struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; int RetVal; memset( &__ss, 0, sizeof(__ss) ); if( AddressFamily == AF_INET ) { DestAddr4->sin_family = AF_INET; inet_pton( AF_INET, SSDP_IP, &DestAddr4->sin_addr ); DestAddr4->sin_port = htons( SSDP_PORT ); } else if( AddressFamily == AF_INET6 ) { DestAddr6->sin6_family = AF_INET6; inet_pton( AF_INET6, SSDP_IPV6_LINKLOCAL, &DestAddr6->sin6_addr ); DestAddr6->sin6_port = htons( SSDP_PORT ); DestAddr6->sin6_scope_id = gIF_INDEX; } else { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Invalid device address family.\n" ); } //sprintf(Mil_Nt,"%s",ServType); sprintf( Mil_Usn, "%s::%s", Udn, ServType ); //CreateServiceRequestPacket(0,szReq[0],Mil_Nt,Mil_Usn, //Server,Location,Duration); CreateServicePacket( MSGTYPE_SHUTDOWN, ServType, Mil_Usn, Location, Duration, &szReq[0], AddressFamily ); if( szReq[0] == NULL ) { return UPNP_E_OUTOF_MEMORY; } RetVal = NewRequestHandler( (struct sockaddr*)&__ss, 1, szReq ); free( szReq[0] ); return RetVal; } /************************************************************************ * Function : DeviceShutdown * * Parameters: * IN char *DevType: Device Type. * IN int RootDev:1 means root device. * IN char * Udn: Device UDN * IN char * Location: Location URL * IN int Duration :Device duration in sec. * IN int AddressFamily: Device address family. * * Description: * This function creates a HTTP device shutdown request packet * and sent it to the multicast channel through RequestHandler. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int DeviceShutdown( IN char *DevType, IN int RootDev, IN char *Udn, IN char *_Server, IN char *Location, IN int Duration, IN int AddressFamily) { struct sockaddr_storage __ss; struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; char *msgs[3]; char Mil_Usn[LINE_SIZE]; int ret_code; msgs[0] = NULL; msgs[1] = NULL; msgs[2] = NULL; memset( &__ss, 0, sizeof(__ss) ); if( AddressFamily == AF_INET ) { DestAddr4->sin_family = AF_INET; inet_pton( AF_INET, SSDP_IP, &DestAddr4->sin_addr ); DestAddr4->sin_port = htons( SSDP_PORT ); } else if( AddressFamily == AF_INET6 ) { DestAddr6->sin6_family = AF_INET6; inet_pton( AF_INET6, SSDP_IPV6_LINKLOCAL, &DestAddr6->sin6_addr ); DestAddr6->sin6_port = htons( SSDP_PORT ); DestAddr6->sin6_scope_id = gIF_INDEX; } else { UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Invalid device address family.\n" ); } // root device has one extra msg if( RootDev ) { sprintf( Mil_Usn, "%s::upnp:rootdevice", Udn ); CreateServicePacket( MSGTYPE_SHUTDOWN, "upnp:rootdevice", Mil_Usn, Location, Duration, &msgs[0], AddressFamily ); } UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "In function DeviceShutdown\n" ); // both root and sub-devices need to send these two messages CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn, Location, Duration, &msgs[1], AddressFamily ); sprintf( Mil_Usn, "%s::%s", Udn, DevType ); CreateServicePacket( MSGTYPE_SHUTDOWN, DevType, Mil_Usn, Location, Duration, &msgs[2], AddressFamily ); // check error if( ( RootDev && msgs[0] == NULL ) || msgs[1] == NULL || msgs[2] == NULL ) { free( msgs[0] ); free( msgs[1] ); free( msgs[2] ); return UPNP_E_OUTOF_MEMORY; } // send packets if( RootDev ) { // send 3 msg types ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 3, &msgs[0] ); } else // sub-device { // send 2 msg types ret_code = NewRequestHandler( (struct sockaddr*)&__ss, 2, &msgs[1] ); } // free msgs free( msgs[0] ); free( msgs[1] ); free( msgs[2] ); return ret_code; } #endif // EXCLUDE_SSDP #endif // INCLUDE_DEVICE_APIS libupnp-1.8.0~svn20100507/upnp/src/ssdp/ssdp_server.c0000644000175000017500000011133211360640053017102 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #if !defined(WIN32) #include #endif #include "config.h" #if EXCLUDE_SSDP == 0 #include "membuffer.h" #include "ssdplib.h" #include #include "ThreadPool.h" #include "miniserver.h" #include "upnpapi.h" #include "httpparser.h" #include "httpreadwrite.h" #define MAX_TIME_TOREAD 45 CLIENTONLY( SOCKET gSsdpReqSocket4 = INVALID_SOCKET; ) CLIENTONLY( SOCKET gSsdpReqSocket6 = INVALID_SOCKET; ) void RequestHandler(); int create_ssdp_sock_v4( SOCKET* ssdpSock ); int create_ssdp_sock_v6( SOCKET* ssdpSock ); #if INCLUDE_CLIENT_APIS int create_ssdp_sock_reqv4( SOCKET* ssdpReqSock ); int create_ssdp_sock_reqv6( SOCKET* ssdpReqSock ); #endif Event ErrotEvt; enum Listener { Idle, Stopping, Running }; struct SSDPSockArray { // socket for incoming advertisments and search requests SOCKET ssdpSock; // socket for sending search requests and receiving search replies CLIENTONLY( int ssdpReqSock; ) }; #ifdef INCLUDE_DEVICE_APIS #if EXCLUDE_SSDP == 0 /************************************************************************ * Function : AdvertiseAndReply * * Parameters: * IN int AdFlag: * -1 = Send shutdown, * 0 = send reply, * 1 = Send Advertisement * IN UpnpDevice_Handle Hnd: Device handle * IN enum SsdpSearchType SearchType:Search type for sending replies * IN struct sockaddr *DestAddr:Destination address * IN char *DeviceType:Device type * IN char *DeviceUDN:Device UDN * IN char *ServiceType:Service type * IN int Exp:Advertisement age * * Description: * This function sends SSDP advertisements, replies and shutdown messages. * * Returns: int * UPNP_E_SUCCESS if successful else appropriate error ***************************************************************************/ int AdvertiseAndReply( IN int AdFlag, IN UpnpDevice_Handle Hnd, IN enum SsdpSearchType SearchType, IN struct sockaddr *DestAddr, IN char *DeviceType, IN char *DeviceUDN, IN char *ServiceType, int Exp) { int retVal = UPNP_E_SUCCESS; int i; int j; int defaultExp = DEFAULT_MAXAGE; struct Handle_Info *SInfo = NULL; char UDNstr[100]; char devType[100]; char servType[100]; IXML_NodeList *nodeList = NULL; IXML_NodeList *tmpNodeList = NULL; IXML_Node *tmpNode = NULL; IXML_Node *tmpNode2 = NULL; IXML_Node *textNode = NULL; const DOMString tmpStr; char SERVER[200]; const DOMString dbgStr; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Inside AdvertiseAndReply with AdFlag = %d\n", AdFlag); /* Use a read lock */ HandleReadLock(); if (GetHandleInfo(Hnd, &SInfo) != HND_DEVICE) { retVal = UPNP_E_INVALID_HANDLE; goto end_function; } defaultExp = SInfo->MaxAge; /* get server info */ get_sdk_info(SERVER); /* parse the device list and send advertisements/replies */ for (i = 0;; i++) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Entering new device list with i = %d\n\n", i); tmpNode = ixmlNodeList_item(SInfo->DeviceList, i); if (!tmpNode) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting new device list with i = %d\n\n", i); break; } dbgStr = ixmlNode_getNodeName(tmpNode); UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Extracting device type once for %s\n", dbgStr); ixmlNodeList_free(nodeList); nodeList = ixmlElement_getElementsByTagName( (IXML_Element *)tmpNode, "deviceType"); if (!nodeList) continue; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Extracting UDN for %s\n", dbgStr); dbgStr = ixmlNode_getNodeName(tmpNode); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Extracting device type\n"); tmpNode2 = ixmlNodeList_item(nodeList, 0); if (!tmpNode2) continue; textNode = ixmlNode_getFirstChild(tmpNode2); if (!textNode) continue; UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Extracting device type \n"); tmpStr = ixmlNode_getNodeValue(textNode); if (!tmpStr) continue; strcpy(devType, tmpStr); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "Extracting device type = %s\n", devType); if (!tmpNode) { UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "TempNode is NULL\n"); } dbgStr = ixmlNode_getNodeName(tmpNode); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Extracting UDN for %s\n", dbgStr); ixmlNodeList_free(nodeList); nodeList = ixmlElement_getElementsByTagName( (IXML_Element *)tmpNode, "UDN"); if (!nodeList) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UDN not found!\n"); continue; } tmpNode2 = ixmlNodeList_item(nodeList, 0); if (!tmpNode2) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UDN not found!\n"); continue; } textNode = ixmlNode_getFirstChild(tmpNode2); if (!textNode) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UDN not found!\n"); continue; } tmpStr = ixmlNode_getNodeValue(textNode); if (!tmpStr) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "UDN not found!\n"); continue; } strcpy(UDNstr, tmpStr); UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Sending UDNStr = %s \n", UDNstr); if (AdFlag) { /* send the device advertisement */ if (AdFlag == 1) { DeviceAdvertisement(devType, i == 0, UDNstr, SInfo->DescURL, Exp, SInfo->DeviceAf ); } else { /* AdFlag == -1 */ DeviceShutdown(devType, i == 0, UDNstr, SERVER, SInfo->DescURL, Exp, SInfo->DeviceAf ); } } else { switch (SearchType) { case SSDP_ALL: DeviceReply(DestAddr, devType, i == 0, UDNstr, SInfo->DescURL, defaultExp); break; case SSDP_ROOTDEVICE: if (i == 0) { SendReply(DestAddr, devType, 1, UDNstr, SInfo->DescURL, defaultExp, 0); } break; case SSDP_DEVICEUDN: { if (DeviceUDN && strlen(DeviceUDN) != 0) { if (strcasecmp(DeviceUDN, UDNstr)) { UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "DeviceUDN=%s and search " "UDN=%s did not match\n", UDNstr, DeviceUDN); break; } else { UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "DeviceUDN=%s and search " "UDN=%s MATCH\n", UDNstr, DeviceUDN); SendReply(DestAddr, devType, 0, UDNstr, SInfo->DescURL, defaultExp, 0); break; } } } case SSDP_DEVICETYPE: { if (!strncasecmp(DeviceType, devType, strlen(DeviceType))) { UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "DeviceType=%s and search devType=%s MATCH\n", devType, DeviceType); SendReply(DestAddr, devType, 0, UDNstr, SInfo->DescURL, defaultExp, 1); } else { UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "DeviceType=%s and search devType=%s" " DID NOT MATCH\n", devType, DeviceType); } break; } default: break; } } /* send service advertisements for services corresponding * to the same device */ UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Sending service Advertisement\n"); tmpNode = ixmlNodeList_item(SInfo->ServiceList, i); if (!tmpNode) continue; ixmlNodeList_free(nodeList); nodeList = ixmlElement_getElementsByTagName( (IXML_Element *)tmpNode, "service"); if (!nodeList) { UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "Service not found 3\n" ); continue; } for (j = 0;; j++) { tmpNode = ixmlNodeList_item(nodeList, j); if (!tmpNode) { break; } ixmlNodeList_free(tmpNodeList); tmpNodeList = ixmlElement_getElementsByTagName( (IXML_Element *)tmpNode, "serviceType"); if (!tmpNodeList) { UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__, "ServiceType not found \n"); continue; } tmpNode2 = ixmlNodeList_item(tmpNodeList, 0); if (!tmpNode2) continue; textNode = ixmlNode_getFirstChild(tmpNode2); if (!textNode) continue; /* servType is of format Servicetype:ServiceVersion */ tmpStr = ixmlNode_getNodeValue(textNode); if (!tmpStr) continue; strcpy(servType, tmpStr); UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "ServiceType = %s\n", servType); if (AdFlag) { if (AdFlag == 1) { ServiceAdvertisement(UDNstr, servType, SInfo->DescURL, Exp, SInfo->DeviceAf ); } else { /* AdFlag == -1 */ ServiceShutdown(UDNstr, servType, SInfo->DescURL, Exp, SInfo->DeviceAf ); } } else { switch (SearchType) { case SSDP_ALL: ServiceReply(DestAddr, servType, UDNstr, SInfo->DescURL, defaultExp); break; case SSDP_SERVICE: if (ServiceType) { if (!strncasecmp(ServiceType, servType, strlen(ServiceType))) { ServiceReply(DestAddr, servType, UDNstr, SInfo->DescURL, defaultExp); } } break; default: break; } } } ixmlNodeList_free(tmpNodeList); tmpNodeList = NULL; ixmlNodeList_free(nodeList); nodeList = NULL; } end_function: ixmlNodeList_free(tmpNodeList); ixmlNodeList_free(nodeList); UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, "Exiting AdvertiseAndReply.\n"); HandleUnlock(); return retVal; } #endif /* EXCLUDE_SSDP == 0 */ #endif /* INCLUDE_DEVICE_APIS */ /************************************************************************ * Function : Make_Socket_NoBlocking * * Parameters: * IN SOCKET sock: socket * * Description: * This function makes socket non-blocking. * * Returns: int * 0 if successful else -1 ***************************************************************************/ int Make_Socket_NoBlocking( SOCKET sock ) { #ifdef WIN32 u_long val=1; return ioctlsocket(sock, FIONBIO, &val); #else int val; val = fcntl( sock, F_GETFL, 0 ); if( fcntl( sock, F_SETFL, val | O_NONBLOCK ) == -1 ) { return -1; } #endif return 0; } /************************************************************************ * Function : unique_service_name * * Parameters: * IN char *cmd: Service Name string * OUT SsdpEvent *Evt: The SSDP event structure partially filled * by all the function. * * Description: * This function fills the fields of the event structure like DeviceType, * Device UDN and Service Type * * Returns: int * 0 if successful else -1 ***************************************************************************/ int unique_service_name(IN char *cmd, IN SsdpEvent *Evt) { char TempBuf[COMMAND_LEN]; char *TempPtr = NULL; char *Ptr = NULL; char *ptr1 = NULL; char *ptr2 = NULL; char *ptr3 = NULL; int CommandFound = 0; int length = 0; if( ( TempPtr = strstr( cmd, "uuid:schemas" ) ) != NULL ) { ptr1 = strstr( cmd, ":device" ); if( ptr1 != NULL ) { ptr2 = strstr( ptr1 + 1, ":" ); } else { return -1; } if( ptr2 != NULL ) { ptr3 = strstr( ptr2 + 1, ":" ); } else { return -1; } if( ptr3 != NULL ) { sprintf( Evt->UDN, "uuid:%s", ptr3 + 1 ); } else { return -1; } ptr1 = strstr( cmd, ":" ); if( ptr1 != NULL ) { strncpy( TempBuf, ptr1, ptr3 - ptr1 ); TempBuf[ptr3 - ptr1] = '\0'; sprintf( Evt->DeviceType, "urn%s", TempBuf ); } else { return -1; } return 0; } if( ( TempPtr = strstr( cmd, "uuid" ) ) != NULL ) { if( ( Ptr = strstr( cmd, "::" ) ) != NULL ) { strncpy( Evt->UDN, TempPtr, Ptr - TempPtr ); Evt->UDN[Ptr - TempPtr] = '\0'; } else { strcpy( Evt->UDN, TempPtr ); } CommandFound = 1; } if( strstr( cmd, "urn:" ) != NULL && strstr( cmd, ":service:" ) != NULL ) { if( ( TempPtr = strstr( cmd, "urn" ) ) != NULL ) { strcpy( Evt->ServiceType, TempPtr ); CommandFound = 1; } } if( strstr( cmd, "urn:" ) != NULL && strstr( cmd, ":device:" ) != NULL ) { if( ( TempPtr = strstr( cmd, "urn" ) ) != NULL ) { strcpy( Evt->DeviceType, TempPtr ); CommandFound = 1; } } if( ( TempPtr = strstr( cmd, "::upnp:rootdevice" ) ) != NULL ) { /* Everything before "::upnp::rootdevice" is the UDN. */ if( TempPtr != cmd ) { length = TempPtr - cmd; strncpy(Evt->UDN, cmd, length); Evt->UDN[length] = 0; CommandFound = 1; } } if( CommandFound == 0 ) { return -1; } return 0; } /************************************************************************ * Function : ssdp_request_type1 * * Parameters: * IN char *cmd: command came in the ssdp request * * Description: * This function figures out the type of the SSDP search in the * in the request. * * Returns: enum SsdpSearchType * return appropriate search type else returns SSDP_ERROR ***************************************************************************/ enum SsdpSearchType ssdp_request_type1( IN char *cmd ) { if( strstr( cmd, ":all" ) != NULL ) { return SSDP_ALL; } if( strstr( cmd, ":rootdevice" ) != NULL ) { return SSDP_ROOTDEVICE; } if( strstr( cmd, "uuid:" ) != NULL ) { return SSDP_DEVICEUDN; } if( ( strstr( cmd, "urn:" ) != NULL ) && ( strstr( cmd, ":device:" ) != NULL ) ) { return SSDP_DEVICETYPE; } if( ( strstr( cmd, "urn:" ) != NULL ) && ( strstr( cmd, ":service:" ) != NULL ) ) { return SSDP_SERVICE; } return SSDP_SERROR; } /************************************************************************ * Function : ssdp_request_type * * Parameters: * IN char *cmd: command came in the ssdp request * OUT SsdpEvent *Evt: The event structure partially filled by * this function. * * Description: * This function starts filling the SSDP event structure based upon the * request received. * * Returns: int * 0 on success; -1 on error ***************************************************************************/ int ssdp_request_type( IN char *cmd, OUT SsdpEvent * Evt ) { // clear event memset( Evt, 0, sizeof( SsdpEvent ) ); unique_service_name( cmd, Evt ); Evt->ErrCode = NO_ERROR_FOUND; if( ( Evt->RequestType = ssdp_request_type1( cmd ) ) == SSDP_SERROR ) { Evt->ErrCode = E_HTTP_SYNTEX; return -1; } return 0; } /************************************************************************ * Function : free_ssdp_event_handler_data * * Parameters: * IN void *the_data: ssdp_thread_data structure. This structure contains * SSDP request message. * * Description: * This function frees the ssdp request * * Returns: VOID * ***************************************************************************/ static void free_ssdp_event_handler_data( void *the_data ) { ssdp_thread_data *data = ( ssdp_thread_data * ) the_data; if( data != NULL ) { http_message_t *hmsg = &data->parser.msg; // free data httpmsg_destroy( hmsg ); free( data ); } } /************************************************************************ * Function : valid_ssdp_msg * * Parameters: * IN void *the_data: ssdp_thread_data structure. This structure contains * SSDP request message. * * Description: * This function do some quick checking of the ssdp msg * * Returns: xboolean * returns TRUE if msg is valid else FALSE ***************************************************************************/ static UPNP_INLINE xboolean valid_ssdp_msg( IN http_message_t * hmsg ) { memptr hdr_value; // check for valid methods - NOTIFY or M-SEARCH if( hmsg->method != HTTPMETHOD_NOTIFY && hmsg->method != HTTPMETHOD_MSEARCH && hmsg->request_method != HTTPMETHOD_MSEARCH ) { return FALSE; } if( hmsg->request_method != HTTPMETHOD_MSEARCH ) { // check PATH == * if( hmsg->uri.type != RELATIVE || strncmp( "*", hmsg->uri.pathquery.buff, hmsg->uri.pathquery.size ) != 0 ) { return FALSE; } // check HOST header if( ( httpmsg_find_hdr( hmsg, HDR_HOST, &hdr_value ) == NULL ) || ( ( memptr_cmp( &hdr_value, "239.255.255.250:1900" ) != 0 ) && ( memptr_cmp( &hdr_value, "[FF02::C]:1900" ) != 0 ) ) ) { UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "Invalid HOST header from SSDP message\n" ); return FALSE; } } return TRUE; // passed quick check } /************************************************************************ * Function : start_event_handler * * Parameters: * IN void *the_data: ssdp_thread_data structure. This structure contains * SSDP request message. * * Description: * This function parses the message and dispatches it to a handler * which handles the ssdp request msg * * Returns: int * 0 if successful -1 if error ***************************************************************************/ static UPNP_INLINE int start_event_handler( void *Data ) { http_parser_t *parser = NULL; parse_status_t status; ssdp_thread_data *data = ( ssdp_thread_data * ) Data; parser = &data->parser; status = parser_parse( parser ); if( status == PARSE_FAILURE ) { if( parser->msg.method != HTTPMETHOD_NOTIFY || !parser->valid_ssdp_notify_hack ) { UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "SSDP recvd bad msg code = %d\n", status ); // ignore bad msg, or not enuf mem goto error_handler; } // valid notify msg } else if( status != PARSE_SUCCESS ) { UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "SSDP recvd bad msg code = %d\n", status ); goto error_handler; } // check msg if( valid_ssdp_msg( &parser->msg ) != TRUE ) { goto error_handler; } return 0; //////// done; thread will free 'data' error_handler: free_ssdp_event_handler_data( data ); return -1; } /************************************************************************ * Function : ssdp_event_handler_thread * * Parameters: * IN void *the_data: ssdp_thread_data structure. This structure contains * SSDP request message. * * Description: * This function is a thread that handles SSDP requests. * * Returns: void * ***************************************************************************/ static void ssdp_event_handler_thread( void *the_data ) { ssdp_thread_data *data = ( ssdp_thread_data * ) the_data; http_message_t *hmsg = &data->parser.msg; if( start_event_handler( the_data ) != 0 ) { return; } // send msg to device or ctrlpt if( ( hmsg->method == HTTPMETHOD_NOTIFY ) || ( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) { CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, (struct sockaddr*)&data->dest_addr, FALSE, NULL );) } else { ssdp_handle_device_request( hmsg, (struct sockaddr*)&data->dest_addr ); } // free data free_ssdp_event_handler_data( data ); } /************************************************************************ * Function : readFromSSDPSocket * * Parameters: * IN SOCKET socket: SSDP socket * * Description: * This function reads the data from the ssdp socket. * * Returns: void * ***************************************************************************/ void readFromSSDPSocket( SOCKET socket ) { char *requestBuf = NULL; char staticBuf[BUFSIZE]; struct sockaddr_storage __ss; ThreadPoolJob job; ssdp_thread_data *data = NULL; socklen_t socklen = sizeof( __ss ); int byteReceived = 0; char ntop_buf[64]; requestBuf = staticBuf; //in case memory //can't be allocated, still drain the //socket using a static buffer data = ( ssdp_thread_data * ) malloc( sizeof( ssdp_thread_data ) ); if( data != NULL ) { //initialize parser #ifdef INCLUDE_CLIENT_APIS if( socket == gSsdpReqSocket4 || socket == gSsdpReqSocket6 ) { parser_response_init( &data->parser, HTTPMETHOD_MSEARCH ); } else { parser_request_init( &data->parser ); } #else parser_request_init( &data->parser ); #endif //set size of parser buffer if( membuffer_set_size( &data->parser.msg.msg, BUFSIZE ) == 0 ) { //use this as the buffer for recv requestBuf = data->parser.msg.msg.buf; } else { free( data ); data = NULL; } } byteReceived = recvfrom( socket, requestBuf, BUFSIZE - 1, 0, (struct sockaddr *)&__ss, &socklen ); if( byteReceived > 0 ) { requestBuf[byteReceived] = '\0'; if( __ss.ss_family == AF_INET ) inet_ntop( AF_INET, &((struct sockaddr_in*)&__ss)->sin_addr, ntop_buf, sizeof(ntop_buf) ); else if( __ss.ss_family == AF_INET6 ) inet_ntop( AF_INET6, &((struct sockaddr_in6*)&__ss)->sin6_addr, ntop_buf, sizeof(ntop_buf) ); else strncpy( ntop_buf, "", sizeof(ntop_buf) ); UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "Start of received response ----------------------------------------------------\n" "%s\n" "End of received response ------------------------------------------------------\n" "From host %s\n", requestBuf, ntop_buf ); UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__, "Start of received multicast packet --------------------------------------------\n" "%s\n" "End of received multicast packet ----------------------------------------------\n", requestBuf ); //add thread pool job to handle request if( data != NULL ) { data->parser.msg.msg.length += byteReceived; // null-terminate data->parser.msg.msg.buf[byteReceived] = 0; memcpy( &data->dest_addr, &__ss, sizeof(__ss) ); TPJobInit( &job, ( start_routine ) ssdp_event_handler_thread, data ); TPJobSetFreeFunction( &job, free_ssdp_event_handler_data ); TPJobSetPriority( &job, MED_PRIORITY ); if( ThreadPoolAdd( &gRecvThreadPool, &job, NULL ) != 0 ) { free_ssdp_event_handler_data( data ); } } } else { free_ssdp_event_handler_data( data ); } } /************************************************************************ * Function : get_ssdp_sockets * * Parameters: * OUT MiniServerSockArray *out: Array of SSDP sockets * * Description: * This function creates the IPv4 and IPv6 ssdp sockets required by the * control point and device operation. * * Returns: int * return UPNP_E_SUCCESS if successful else returns appropriate error ***************************************************************************/ int get_ssdp_sockets( MiniServerSockArray * out ) { int retVal; #if INCLUDE_CLIENT_APIS // Create the IPv4 socket for SSDP REQUESTS if( strlen( gIF_IPV4 ) > 0 ) { retVal = create_ssdp_sock_reqv4( &out->ssdpReqSock4 ); if( retVal != UPNP_E_SUCCESS ) { return retVal; } // For use by ssdp control point. gSsdpReqSocket4 = out->ssdpReqSock4; } else { out->ssdpReqSock4 = INVALID_SOCKET; } // Create the IPv6 socket for SSDP REQUESTS if( strlen( gIF_IPV6 ) > 0 ) { retVal = create_ssdp_sock_reqv6( &out->ssdpReqSock6 ); if( retVal != UPNP_E_SUCCESS ) { CLIENTONLY( shutdown( out->ssdpReqSock4, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( out->ssdpReqSock4 ); ) return retVal; } // For use by ssdp control point. gSsdpReqSocket6 = out->ssdpReqSock6; } else { out->ssdpReqSock6 = INVALID_SOCKET; } #endif /* INCLUDE_CLIENT_APIS */ // Create the IPv4 socket for SSDP if( strlen( gIF_IPV4 ) > 0 ) { retVal = create_ssdp_sock_v4( &out->ssdpSock4 ); if( retVal != UPNP_E_SUCCESS ) { CLIENTONLY( shutdown( out->ssdpReqSock4, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( out->ssdpReqSock4 ); ) CLIENTONLY( shutdown( out->ssdpReqSock6, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( out->ssdpReqSock6 ); ) return retVal; } } else { out->ssdpSock4 = INVALID_SOCKET; } // Create the IPv6 socket for SSDP if( strlen( gIF_IPV6 ) > 0 ) { retVal = create_ssdp_sock_v6( &out->ssdpSock6 ); if( retVal != UPNP_E_SUCCESS ) { shutdown( out->ssdpSock4, SD_BOTH ); UpnpCloseSocket( out->ssdpSock4 ); CLIENTONLY( shutdown( out->ssdpReqSock4, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( out->ssdpReqSock4 ); ) CLIENTONLY( shutdown( out->ssdpReqSock6, SD_BOTH ); ) CLIENTONLY( UpnpCloseSocket( out->ssdpReqSock6 ); ) return retVal; } } else { out->ssdpSock6 = INVALID_SOCKET; } return UPNP_E_SUCCESS; } #if INCLUDE_CLIENT_APIS /************************************************************************ * Function : create_ssdp_sock_reqv4 * * Parameters: * IN SOCKET* ssdpReqSock: SSDP IPv4 request socket to be created * * Description: * This function creates the SSDP IPv4 socket to be used by the control * point. * * Returns: * UPNP_E_SUCCESS on successful socket creation. ***************************************************************************/ int create_ssdp_sock_reqv4( SOCKET* ssdpReqSock ) { char errorBuffer[ERROR_BUFFER_LEN]; u_char ttl = 4; *ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ); if ( *ssdpReqSock == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in socket(): %s\n", errorBuffer ); return UPNP_E_OUTOF_SOCKET; } setsockopt( *ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof (ttl) ); // just do it, regardless if fails or not. Make_Socket_NoBlocking( *ssdpReqSock ); return UPNP_E_SUCCESS; } /************************************************************************ * Function : create_ssdp_sock_reqv6 * * Parameters: * IN SOCKET* ssdpReqSock: SSDP IPv6 request socket to be created * * Description: * This function creates the SSDP IPv6 socket to be used by the control * point. * * Returns: void * ***************************************************************************/ int create_ssdp_sock_reqv6( SOCKET* ssdpReqSock ) { char errorBuffer[ERROR_BUFFER_LEN]; char hops = 1; *ssdpReqSock = socket( AF_INET6, SOCK_DGRAM, 0 ); if ( *ssdpReqSock == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in socket(): %s\n", errorBuffer ); return UPNP_E_OUTOF_SOCKET; } // MUST use scoping of IPv6 addresses to control the propagation os SSDP // messages instead of relying on the Hop Limit (Equivalent to the TTL // limit in IPv4). setsockopt( *ssdpReqSock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops) ); // just do it, regardless if fails or not. Make_Socket_NoBlocking( *ssdpReqSock ); return UPNP_E_SUCCESS; } #endif /* INCLUDE_CLIENT_APIS */ /************************************************************************ * Function : create_ssdp_sock_v4 * * Parameters: * IN SOCKET* ssdpSock: SSDP IPv4 socket to be created * * Description: * This function ... * * Returns: void * ***************************************************************************/ int create_ssdp_sock_v4( SOCKET* ssdpSock ) { char errorBuffer[ERROR_BUFFER_LEN]; int onOff; u_char ttl = 4; struct ip_mreq ssdpMcastAddr; struct sockaddr_storage __ss; struct sockaddr_in *ssdpAddr4 = (struct sockaddr_in *)&__ss; int ret = 0; struct in_addr addr; *ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ); if ( *ssdpSock == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in socket(): %s\n", errorBuffer ); return UPNP_E_OUTOF_SOCKET; } onOff = 1; ret = setsockopt( *ssdpSock, SOL_SOCKET, SO_REUSEADDR, (char*)&onOff, sizeof(onOff) ); if ( ret == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() SO_REUSEADDR: %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_ERROR; } #if defined(BSD) || defined(__OSX__) || defined(__APPLE__) onOff = 1; ret = setsockopt( *ssdpSock, SOL_SOCKET, SO_REUSEPORT, (char *)&onOff, sizeof(onOff) ); if ( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() SO_REUSEPORT: %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_ERROR; } #endif /* BSD */ memset( &__ss, 0, sizeof( __ss ) ); ssdpAddr4->sin_family = AF_INET; ssdpAddr4->sin_addr.s_addr = htonl( INADDR_ANY ); ssdpAddr4->sin_port = htons( SSDP_PORT ); ret = bind( *ssdpSock, (struct sockaddr *)ssdpAddr4, sizeof(*ssdpAddr4) ); if ( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in bind(), addr=0x%08X, port=%d: %s\n", INADDR_ANY, SSDP_PORT, errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_BIND; } memset( (void *)&ssdpMcastAddr, 0, sizeof (struct ip_mreq) ); ssdpMcastAddr.imr_interface.s_addr = inet_addr( gIF_IPV4 ); ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP ); ret = setsockopt( *ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ssdpMcastAddr, sizeof(struct ip_mreq) ); if ( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() IP_ADD_MEMBERSHIP (join multicast group): %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_ERROR; } /* Set multicast interface. */ memset( (void *)&addr, 0, sizeof (struct in_addr) ); addr.s_addr = inet_addr(gIF_IPV4); ret = setsockopt(*ssdpSock, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addr, sizeof addr); if ( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, "Error in setsockopt() IP_MULTICAST_IF (set multicast interface): %s\n", errorBuffer ); /* This is probably not a critical error, so let's continue. */ } /* result is not checked becuase it will fail in WinMe and Win9x. */ ret = setsockopt( *ssdpSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof (ttl) ); onOff = 1; ret = setsockopt( *ssdpSock, SOL_SOCKET, SO_BROADCAST, (char*)&onOff, sizeof(onOff) ); if( ret == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() SO_BROADCAST (set broadcast): %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_NETWORK_ERROR; } return UPNP_E_SUCCESS; } /************************************************************************ * Function : create_ssdp_sock_v6 * * Parameters: * IN SOCKET* ssdpSock: SSDP IPv6 socket to be created * * Description: * This function ... * * Returns: void * ***************************************************************************/ int create_ssdp_sock_v6( SOCKET* ssdpSock ) { char errorBuffer[ERROR_BUFFER_LEN]; struct ipv6_mreq ssdpMcastAddr; struct sockaddr_storage __ss; struct sockaddr_in6 *ssdpAddr6 = (struct sockaddr_in6 *)&__ss; int onOff; int ret = 0; *ssdpSock = socket( AF_INET6, SOCK_DGRAM, 0 ); if ( *ssdpSock == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in socket(): %s\n", errorBuffer ); return UPNP_E_OUTOF_SOCKET; } onOff = 1; ret = setsockopt( *ssdpSock, SOL_SOCKET, SO_REUSEADDR, (char*)&onOff, sizeof(onOff) ); if ( ret == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() SO_REUSEADDR: %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_ERROR; } #if defined(BSD) || defined(__OSX__) || defined(__APPLE__) onOff = 1; ret = setsockopt( *ssdpSock, SOL_SOCKET, SO_REUSEPORT, (char*)&onOff, sizeof (onOff) ); if ( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() SO_REUSEPORT: %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_ERROR; } #endif /* BSD */ memset( &__ss, 0, sizeof( __ss ) ); ssdpAddr6->sin6_family = AF_INET6; ssdpAddr6->sin6_addr = in6addr_any; ssdpAddr6->sin6_scope_id = gIF_INDEX; ssdpAddr6->sin6_port = htons( SSDP_PORT ); ret = bind( *ssdpSock, (struct sockaddr *)ssdpAddr6, sizeof(*ssdpAddr6) ); if ( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in bind(), addr=0x%032lX, port=%d: %s\n", 0lu, SSDP_PORT, errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_BIND; } memset( (void *)&ssdpMcastAddr, 0, sizeof(ssdpMcastAddr) ); ssdpMcastAddr.ipv6mr_interface = gIF_INDEX; inet_pton( AF_INET6, SSDP_IPV6_LINKLOCAL, &ssdpMcastAddr.ipv6mr_multiaddr ); ret = setsockopt( *ssdpSock, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&ssdpMcastAddr, sizeof(ssdpMcastAddr) ); if ( ret == -1 ) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() IPV6_JOIN_GROUP (join multicast group): %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_SOCKET_ERROR; } onOff = 1; ret = setsockopt( *ssdpSock, SOL_SOCKET, SO_BROADCAST, (char*)&onOff, sizeof(onOff) ); if( ret == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in setsockopt() SO_BROADCAST (set broadcast): %s\n", errorBuffer ); shutdown( *ssdpSock, SD_BOTH ); UpnpCloseSocket( *ssdpSock ); return UPNP_E_NETWORK_ERROR; } return UPNP_E_SUCCESS; } #endif /* EXCLUDE_SSDP */ libupnp-1.8.0~svn20100507/upnp/src/uuid/0000777000175000017500000000000011373047472014471 500000000000000libupnp-1.8.0~svn20100507/upnp/src/uuid/md5.c0000644000175000017500000002471211021325543015230 00000000000000/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ #include "config.h" #include "global.h" #include "md5.h" /* Constants for MD5Transform routine. */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64])); static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int)); static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int)); static void MD5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int)); static void MD5_memset PROTO_LIST((POINTER, int, unsigned int)); static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) <<(n)) | ((x) >> (32-(n)))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { \ (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void MD5Init(MD5_CTX * context) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) { unsigned int i; unsigned int index; unsigned int partLen; /* Compute number of bytes mod 64 */ index = (unsigned int)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) { context->count[1]++; } context->count[1] += ((UINT4)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); MD5Transform(context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) { MD5Transform(context->state, &input[i]); } index = 0; } else { i = 0; } /* Buffer remaining input */ MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen - i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ void MD5Final(unsigned char digest[16], MD5_CTX *context) { unsigned char bits[8]; unsigned int index; unsigned int padLen; /* Save number of bits */ Encode(bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (unsigned int)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update(context, PADDING, padLen); /* Append length (before padding) */ MD5Update(context, bits, 8); /* Store state in digest */ Encode(digest, context->state, 16); /* Zeroize sensitive information. */ MD5_memset((POINTER)context, 0, sizeof(*context)); } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform(UINT4 state[4], unsigned char block[64]) { UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode( x, block, 64 ); /* Round 1 */ FF( a, b, c, d, x[0], S11, 0xd76aa478 ); /* 1 */ FF( d, a, b, c, x[1], S12, 0xe8c7b756 ); /* 2 */ FF( c, d, a, b, x[2], S13, 0x242070db ); /* 3 */ FF( b, c, d, a, x[3], S14, 0xc1bdceee ); /* 4 */ FF( a, b, c, d, x[4], S11, 0xf57c0faf ); /* 5 */ FF( d, a, b, c, x[5], S12, 0x4787c62a ); /* 6 */ FF( c, d, a, b, x[6], S13, 0xa8304613 ); /* 7 */ FF( b, c, d, a, x[7], S14, 0xfd469501 ); /* 8 */ FF( a, b, c, d, x[8], S11, 0x698098d8 ); /* 9 */ FF( d, a, b, c, x[9], S12, 0x8b44f7af ); /* 10 */ FF( c, d, a, b, x[10], S13, 0xffff5bb1 ); /* 11 */ FF( b, c, d, a, x[11], S14, 0x895cd7be ); /* 12 */ FF( a, b, c, d, x[12], S11, 0x6b901122 ); /* 13 */ FF( d, a, b, c, x[13], S12, 0xfd987193 ); /* 14 */ FF( c, d, a, b, x[14], S13, 0xa679438e ); /* 15 */ FF( b, c, d, a, x[15], S14, 0x49b40821 ); /* 16 */ /* Round 2 */ GG( a, b, c, d, x[1], S21, 0xf61e2562 ); /* 17 */ GG( d, a, b, c, x[6], S22, 0xc040b340 ); /* 18 */ GG( c, d, a, b, x[11], S23, 0x265e5a51 ); /* 19 */ GG( b, c, d, a, x[0], S24, 0xe9b6c7aa ); /* 20 */ GG( a, b, c, d, x[5], S21, 0xd62f105d ); /* 21 */ GG( d, a, b, c, x[10], S22, 0x2441453 ); /* 22 */ GG( c, d, a, b, x[15], S23, 0xd8a1e681 ); /* 23 */ GG( b, c, d, a, x[4], S24, 0xe7d3fbc8 ); /* 24 */ GG( a, b, c, d, x[9], S21, 0x21e1cde6 ); /* 25 */ GG( d, a, b, c, x[14], S22, 0xc33707d6 ); /* 26 */ GG( c, d, a, b, x[3], S23, 0xf4d50d87 ); /* 27 */ GG( b, c, d, a, x[8], S24, 0x455a14ed ); /* 28 */ GG( a, b, c, d, x[13], S21, 0xa9e3e905 ); /* 29 */ GG( d, a, b, c, x[2], S22, 0xfcefa3f8 ); /* 30 */ GG( c, d, a, b, x[7], S23, 0x676f02d9 ); /* 31 */ GG( b, c, d, a, x[12], S24, 0x8d2a4c8a ); /* 32 */ /* Round 3 */ HH( a, b, c, d, x[5], S31, 0xfffa3942 ); /* 33 */ HH( d, a, b, c, x[8], S32, 0x8771f681 ); /* 34 */ HH( c, d, a, b, x[11], S33, 0x6d9d6122 ); /* 35 */ HH( b, c, d, a, x[14], S34, 0xfde5380c ); /* 36 */ HH( a, b, c, d, x[1], S31, 0xa4beea44 ); /* 37 */ HH( d, a, b, c, x[4], S32, 0x4bdecfa9 ); /* 38 */ HH( c, d, a, b, x[7], S33, 0xf6bb4b60 ); /* 39 */ HH( b, c, d, a, x[10], S34, 0xbebfbc70 ); /* 40 */ HH( a, b, c, d, x[13], S31, 0x289b7ec6 ); /* 41 */ HH( d, a, b, c, x[0], S32, 0xeaa127fa ); /* 42 */ HH( c, d, a, b, x[3], S33, 0xd4ef3085 ); /* 43 */ HH( b, c, d, a, x[6], S34, 0x4881d05 ); /* 44 */ HH( a, b, c, d, x[9], S31, 0xd9d4d039 ); /* 45 */ HH( d, a, b, c, x[12], S32, 0xe6db99e5 ); /* 46 */ HH( c, d, a, b, x[15], S33, 0x1fa27cf8 ); /* 47 */ HH( b, c, d, a, x[2], S34, 0xc4ac5665 ); /* 48 */ /* Round 4 */ II( a, b, c, d, x[0], S41, 0xf4292244 ); /* 49 */ II( d, a, b, c, x[7], S42, 0x432aff97 ); /* 50 */ II( c, d, a, b, x[14], S43, 0xab9423a7 ); /* 51 */ II( b, c, d, a, x[5], S44, 0xfc93a039 ); /* 52 */ II( a, b, c, d, x[12], S41, 0x655b59c3 ); /* 53 */ II( d, a, b, c, x[3], S42, 0x8f0ccc92 ); /* 54 */ II( c, d, a, b, x[10], S43, 0xffeff47d ); /* 55 */ II( b, c, d, a, x[1], S44, 0x85845dd1 ); /* 56 */ II( a, b, c, d, x[8], S41, 0x6fa87e4f ); /* 57 */ II( d, a, b, c, x[15], S42, 0xfe2ce6e0 ); /* 58 */ II( c, d, a, b, x[6], S43, 0xa3014314 ); /* 59 */ II( b, c, d, a, x[13], S44, 0x4e0811a1 ); /* 60 */ II( a, b, c, d, x[4], S41, 0xf7537e82 ); /* 61 */ II( d, a, b, c, x[11], S42, 0xbd3af235 ); /* 62 */ II( c, d, a, b, x[2], S43, 0x2ad7d2bb ); /* 63 */ II( b, c, d, a, x[9], S44, 0xeb86d391 ); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ MD5_memset( ( POINTER ) x, 0, sizeof( x ) ); } /* Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4. */ static void Encode(unsigned char *output, UINT4 *input, unsigned int len) { unsigned int i; unsigned int j; for (i = 0, j = 0; j < len; ++i, j += 4) { output[j+0] = (unsigned char)((input[i] >> 0) & 0xff); output[j+1] = (unsigned char)((input[i] >> 8) & 0xff); output[j+2] = (unsigned char)((input[i] >> 16) & 0xff); output[j+3] = (unsigned char)((input[i] >> 24) & 0xff); } } /* Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4. */ static void Decode(UINT4 *output, unsigned char *input, unsigned int len) { unsigned int i; unsigned int j; for (i = 0, j = 0; j < len; ++i, j += 4) { output[i] = (((UINT4)input[j+0]) << 0) | (((UINT4)input[j+1]) << 8) | (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24); } } /* Note: Replace for loop with standard memcpy if possible. */ static void MD5_memcpy(POINTER output, POINTER input, unsigned int len) { unsigned int i; for (i = 0; i < len; ++i) { output[i] = input[i]; } } /* Note: Replace for loop with standard memset if possible. */ static void MD5_memset(POINTER output, int value, unsigned int len) { unsigned int i; for (i = 0; i < len; ++i) { ((char *)output)[i] = (char)value; } } libupnp-1.8.0~svn20100507/upnp/src/uuid/sysdep.c0000644000175000017500000001060611365106163016055 00000000000000/* ** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. ** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & ** Digital Equipment Corporation, Maynard, Mass. ** Copyright (c) 1998 Microsoft. ** To anyone who acknowledges that this file is provided "AS IS" ** without any express or implied warranty: permission to use, copy, ** modify, and distribute this file for any purpose is hereby ** granted without fee, provided that the above copyright notices and ** this notice appears in all source code copies, and that none of ** the names of Open Software Foundation, Inc., Hewlett-Packard ** Company, or Digital Equipment Corporation be used in advertising ** or publicity pertaining to distribution of the software without ** specific, written prior permission. Neither Open Software ** Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment ** Corporation makes any representations about the suitability of ** this software for any purpose. */ #include "config.h" #include "sysdep.h" #include "UpnpInet.h" #include #include /*-----------------------------------------------------------------------------*/ /* system dependent call to get IEEE node ID. This sample implementation generates a random node ID */ void get_ieee_node_identifier(uuid_node_t *node) { unsigned char seed[16]; static int inited = 0; static uuid_node_t saved_node; if (!inited) { get_random_info(seed); seed[0] |= 0x80; memcpy(&saved_node, seed, sizeof (uuid_node_t)); inited = 1; }; *node = saved_node; }; /*-----------------------------------------------------------------------------*/ /* system dependent call to get the current system time. Returned as 100ns ticks since Oct 15, 1582, but resolution may be less than 100ns. */ #ifdef WIN32 void get_system_time( uuid_time_t * uuid_time ) { ULARGE_INTEGER time; GetSystemTimeAsFileTime( ( FILETIME * ) & time ); /* NT keeps time in FILETIME format which is 100ns ticks since Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582. The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec) + 18 years and 5 leap days. */ time.QuadPart += ( unsigned __int64 )( 1000 * 1000 * 10 ) // seconds * ( unsigned __int64 )( 60 * 60 * 24 ) // days * ( unsigned __int64 )( 17 + 30 + 31 + 365 * 18 + 5 ); // # of days *uuid_time = time.QuadPart; }; /*-----------------------------------------------------------------------------*/ void get_random_info(char seed[16]) { MD5_CTX c; typedef struct { MEMORYSTATUS m; SYSTEM_INFO s; FILETIME t; LARGE_INTEGER pc; DWORD tc; DWORD l; char hostname[MAX_COMPUTERNAME_LENGTH + 1]; } randomness; randomness r; /* Initialize memory area so that valgrind does not complain */ memset(&r, 0, sizeof r); /* memory usage stats */ GlobalMemoryStatus( &r.m ); /* random system stats */ GetSystemInfo( &r.s ); /* 100ns resolution (nominally) time of day */ GetSystemTimeAsFileTime( &r.t ); /* high resolution performance counter */ QueryPerformanceCounter( &r.pc ); /* milliseconds since last boot */ r.tc = GetTickCount(); r.l = MAX_COMPUTERNAME_LENGTH + 1; GetComputerName( r.hostname, &r.l ); /* MD5 it */ MD5Init(&c); MD5Update(&c, &r, sizeof r); MD5Final(seed, &c); }; #else /* WIN32 */ /*-----------------------------------------------------------------------------*/ void get_system_time(uuid_time_t *uuid_time) { struct timeval tp; gettimeofday( &tp, ( struct timezone * )0 ); /* Offset between UUID formatted times and Unix formatted times. UUID UTC base time is October 15, 1582. Unix base time is January 1, 1970. */ *uuid_time = ( tp.tv_sec * 10000000 ) + ( tp.tv_usec * 10 ) + I64( 0x01B21DD213814000 ); }; /*-----------------------------------------------------------------------------*/ void get_random_info(unsigned char seed[16]) { MD5_CTX c; typedef struct { //struct sysinfo s; struct timeval t; char hostname[257]; } randomness; randomness r; /* Initialize memory area so that valgrind does not complain */ memset(&r, 0, sizeof r); /* Get some random stuff */ gettimeofday(&r.t, (struct timezone *)0); gethostname(r.hostname, 256 ); /* MD5 it */ MD5Init(&c); MD5Update(&c, (unsigned char *)&r, sizeof r); MD5Final(seed, &c); }; #endif /* WIN32 */ libupnp-1.8.0~svn20100507/upnp/src/uuid/uuid.c0000644000175000017500000002504511365106163015517 00000000000000/************************************************************************** * * Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. * Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & * Digital Equipment Corporation, Maynard, Mass. * Copyright (c) 1998 Microsoft. * To anyone who acknowledges that this file is provided "AS IS" * without any express or implied warranty: permission to use, copy, * modify, and distribute this file for any purpose is hereby * granted without fee, provided that the above copyright notices and * this notice appears in all source code copies, and that none of * the names of Open Software Foundation, Inc., Hewlett-Packard * Company, or Digital Equipment Corporation be used in advertising * or publicity pertaining to distribution of the software without * specific, written prior permission. Neither Open Software * Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment * Corporation makes any representations about the suitability of * this software for any purpose. * **************************************************************************/ #include "config.h" #include "uuid.h" #include "UpnpInet.h" #include #include #include #include /* various forward declarations */ static int read_state( unsigned16 * clockseq, uuid_time_t * timestamp, uuid_node_t * node ); static void write_state( unsigned16 clockseq, uuid_time_t timestamp, uuid_node_t node ); static void format_uuid_v1( uuid_upnp * uid, unsigned16 clockseq, uuid_time_t timestamp, uuid_node_t node ); static void format_uuid_v3( uuid_upnp * uid, unsigned char hash[16] ); static void get_current_time( uuid_time_t * timestamp ); static unsigned16 true_random( void ); /*-----------------------------------------------------------------------------*/ /* uuid_create -- generator a UUID */ int uuid_create(uuid_upnp *uid) { uuid_time_t timestamp; uuid_time_t last_time; unsigned16 clockseq; uuid_node_t node; uuid_node_t last_node; int f; /* acquire system wide lock so we're alone */ UUIDLock(); /* get current time */ get_current_time(×tamp); /* get node ID */ get_ieee_node_identifier(&node); /* get saved state from NV storage */ f = read_state(&clockseq, &last_time, &last_node); /* if no NV state, or if clock went backwards, or node ID changed (e.g., net card swap) change clockseq */ if (!f || memcmp(&node, &last_node, sizeof(uuid_node_t))) { clockseq = true_random(); } else if (timestamp < last_time) { clockseq++; } /* stuff fields into the UUID */ format_uuid_v1(uid, clockseq, timestamp, node); /* save the state for next time */ write_state(clockseq, timestamp, node); UUIDUnlock(); return 1; }; /*-----------------------------------------------------------------------------*/ void uuid_unpack(uuid_upnp *u, char *out) { sprintf(out, "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x", (unsigned int)u->time_low, u->time_mid, u->time_hi_and_version, u->clock_seq_hi_and_reserved, u->clock_seq_low, u->node[0], u->node[1], u->node[2], u->node[3], u->node[4], u->node[5]); }; /*-----------------------------------------------------------------------------*/ /* format_uuid_v1 -- make a UUID from the timestamp, clockseq, and node ID */ void format_uuid_v1( uuid_upnp * uid, unsigned16 clock_seq, uuid_time_t timestamp, uuid_node_t node ) { /* Construct a version 1 uuid with the information we've gathered * plus a few constants. */ uid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF); uid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF); uid->time_hi_and_version = (unsigned short)((timestamp >> 48) & 0x0FFF); uid->time_hi_and_version |= (1 << 12); uid->clock_seq_low = clock_seq & 0xFF; uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8; uid->clock_seq_hi_and_reserved |= 0x80; memcpy( &uid->node, &node, sizeof uid->node ); }; /*-----------------------------------------------------------------------------*/ /* data type for UUID generator persistent state */ typedef struct { uuid_time_t ts; /* saved timestamp */ uuid_node_t node; /* saved node ID */ unsigned16 cs; /* saved clock sequence */ } uuid_state; static uuid_state st; static int stateInited = 0; /*-----------------------------------------------------------------------------*/ /* read_state -- read UUID generator state from non-volatile store */ int read_state( unsigned16 * clockseq, uuid_time_t * timestamp, uuid_node_t * node ) { if( !stateInited ) { return 0; }; *clockseq = st.cs; *timestamp = st.ts; *node = st.node; return 1; }; /*-----------------------------------------------------------------------------*/ /* write_state -- save UUID generator state back to non-volatile storage */ void write_state( unsigned16 clockseq, uuid_time_t timestamp, uuid_node_t node ) { static uuid_time_t next_save; if( !stateInited ) { next_save = timestamp; stateInited = 1; }; /* always save state to volatile shared state */ st.cs = clockseq; st.ts = timestamp; st.node = node; if( timestamp >= next_save ) { /* schedule next save for 10 seconds from now */ next_save = timestamp + ( 10 * 10 * 1000 * 1000 ); }; }; /*-----------------------------------------------------------------------------*/ /* get-current_time -- get time as 60 bit 100ns ticks since whenever. Compensate for the fact that real clock resolution is less than 100ns. */ void get_current_time( uuid_time_t * timestamp ) { uuid_time_t time_now; static uuid_time_t time_last; static unsigned16 uuids_this_tick; static int inited = 0; if( !inited ) { uuids_this_tick = UUIDS_PER_TICK; inited = 1; }; while( 1 ) { get_system_time( &time_now ); /* if clock reading changed since last UUID generated... */ if( time_last != time_now ) { /* reset count of uuids gen'd with this clock reading */ uuids_this_tick = 0; break; }; if( uuids_this_tick < UUIDS_PER_TICK ) { uuids_this_tick++; break; }; /* going too fast for our clock; spin */ }; /* add the count of uuids to low order bits of the clock reading */ *timestamp = time_now + uuids_this_tick; time_last = *timestamp; }; /*-----------------------------------------------------------------------------*/ /* true_random -- generate a crypto-quality random number. This sample doesn't do that. */ static unsigned16 true_random( void ) { static int inited = 0; uuid_time_t time_now; if( !inited ) { get_system_time( &time_now ); time_now = time_now / UUIDS_PER_TICK; srand( ( unsigned int )( ( ( time_now >> 32 ) ^ time_now ) & 0xffffffff ) ); inited = 1; }; return ( rand() ); } /*-----------------------------------------------------------------------------*/ /* uuid_create_from_name -- create a UUID using a "name" from a "name space" */ void uuid_create_from_name( uuid_upnp * uid, /* resulting UUID */ uuid_upnp nsid, /* UUID to serve as context, so identical names from different name spaces generate different UUIDs */ void *name, /* the name from which to generate a UUID */ int namelen /* the length of the name */ ) { MD5_CTX c; unsigned char hash[16]; uuid_upnp net_nsid; /* context UUID in network byte order */ /* put name space ID in network byte order so it hashes the same no matter what endian machine we're on */ net_nsid = nsid; net_nsid.time_low=htonl( net_nsid.time_low ); net_nsid.time_mid=htons( net_nsid.time_mid ); net_nsid.time_hi_and_version=htons( net_nsid.time_hi_and_version ); MD5Init( &c ); MD5Update( &c, (unsigned char *)&net_nsid, sizeof(uuid_upnp) ); MD5Update( &c, name, namelen ); MD5Final( hash, &c ); /* the hash is in network byte order at this point */ format_uuid_v3( uid, hash ); }; /*-----------------------------------------------------------------------------*/ /* format_uuid_v3 -- make a UUID from a (pseudo)random 128 bit number */ void format_uuid_v3( uuid_upnp * uid, unsigned char hash[16] ) { /* Construct a version 3 uuid with the (pseudo-)random number * plus a few constants. */ memcpy( uid, hash, sizeof( uuid_upnp ) ); /* convert UUID to local byte order */ uid->time_low=ntohl( uid->time_low ); uid->time_mid=ntohs( uid->time_mid ); uid->time_hi_and_version=ntohs( uid->time_hi_and_version ); /* put in the variant and version bits */ uid->time_hi_and_version &= 0x0FFF; uid->time_hi_and_version |= ( 3 << 12 ); uid->clock_seq_hi_and_reserved &= 0x3F; uid->clock_seq_hi_and_reserved |= 0x80; }; /*-----------------------------------------------------------------------------*/ /* uuid_compare -- Compare two UUID's "lexically" and return -1 u1 is lexically before u2 0 u1 is equal to u2 1 u1 is lexically after u2 Note: lexical ordering is not temporal ordering! */ int uuid_compare( uuid_upnp * u1, uuid_upnp * u2 ) { int i; #define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1; CHECK( u1->time_low, u2->time_low ); CHECK( u1->time_mid, u2->time_mid ); CHECK( u1->time_hi_and_version, u2->time_hi_and_version ); CHECK( u1->clock_seq_hi_and_reserved, u2->clock_seq_hi_and_reserved ); CHECK( u1->clock_seq_low, u2->clock_seq_low ) for( i = 0; i < 6; i++ ) { if( u1->node[i] < u2->node[i] ) return -1; if( u1->node[i] > u2->node[i] ) return 1; } return 0; }; libupnp-1.8.0~svn20100507/upnp/src/urlconfig/0000777000175000017500000000000011373047472015513 500000000000000libupnp-1.8.0~svn20100507/upnp/src/urlconfig/urlconfig.c0000644000175000017500000003366011042015421017551 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #include "config.h" #include "membuffer.h" #include "unixutil.h" #include "upnp.h" #include "upnpdebug.h" #include "UpnpInet.h" #include "uri.h" #include "urlconfig.h" #include "util.h" #include "webserver.h" #include #include #ifdef WIN32 #else #include #include #include #endif /************************************************************************ * Function : addrToString * * Parameters : * IN const struct sockaddr* addr ; socket address object with * the IP Address and port information * OUT char ipaddr_port[] ; character array which will hold the * IP Address in a string format. * * Description : Converts an Internet address to a string and stores it * a buffer. * * Return : void ; * * Note : ************************************************************************/ static UPNP_INLINE void addrToString( IN const struct sockaddr *addr, OUT char ipaddr_port[] ) { char buf_ntop[64]; if( addr->sa_family == AF_INET ) { struct sockaddr_in* sa4 = (struct sockaddr_in*)addr; inet_ntop(AF_INET, &sa4->sin_addr, buf_ntop, sizeof(buf_ntop) ); sprintf( ipaddr_port, "%s:%d", buf_ntop, ntohs( sa4->sin_port ) ); } else if( addr->sa_family == AF_INET6 ) { struct sockaddr_in6* sa6 = (struct sockaddr_in6*)addr; inet_ntop(AF_INET6, &sa6->sin6_addr, buf_ntop, sizeof(buf_ntop) ); sprintf( ipaddr_port, "[%s]:%d", buf_ntop, ntohs( sa6->sin6_port ) ); } } /************************************************************************ * Function : calc_alias * * Parameters : * IN const char* alias ; String containing the alias * IN const char* rootPath ; String containing the root path * OUT char** newAlias ; String pointer to hold the modified new * alias * * Description : Determine alias based urlbase's root path. * * Return : int ; * UPNP_E_SUCCESS - On Success. * UPNP_E_OUTOF_MEMORY - On Failure to allocate memory for new alias * * Note : 'newAlias' should be freed using free() ************************************************************************/ static UPNP_INLINE int calc_alias( IN const char *alias, IN const char *rootPath, OUT char **newAlias ) { const char *aliasPtr; size_t root_len; char *temp_str; size_t new_alias_len; char *alias_temp; assert( rootPath ); assert( alias ); // add / suffix, if missing root_len = strlen( rootPath ); if( root_len == 0 || rootPath[root_len - 1] != '/' ) { temp_str = "/"; } else { temp_str = ""; // suffix already present } // discard / prefix, if present if( alias[0] == '/' ) { aliasPtr = alias + 1; } else { aliasPtr = alias; } new_alias_len = root_len + strlen( temp_str ) + strlen( aliasPtr ); alias_temp = ( char * )malloc( new_alias_len + 1 ); if( alias_temp == NULL ) { return UPNP_E_OUTOF_MEMORY; } strcpy( alias_temp, rootPath ); strcat( alias_temp, temp_str ); strcat( alias_temp, aliasPtr ); *newAlias = alias_temp; return UPNP_E_SUCCESS; } /************************************************************************ * Function : calc_descURL * * Parameters : * IN const char* ipPortStr ; String containing the port number * IN const char* alias ; String containing the alias * OUT char descURL[LINE_SIZE] ; buffer to hold the calculated * description URL * * Description : Determines the description URL * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_URL_TOO_BIG - length of the URL is determined to be to * exceeding the limit. * * Note : ************************************************************************/ static UPNP_INLINE int calc_descURL( IN const char *ipPortStr, IN const char *alias, OUT char descURL[LINE_SIZE] ) { size_t len; const char *http_scheme = "http://"; assert( ipPortStr != NULL && strlen( ipPortStr ) > 0 ); assert( alias != NULL && strlen( alias ) > 0 ); len = strlen( http_scheme ) + strlen( ipPortStr ) + strlen( alias ); if( len > ( LINE_SIZE - 1 ) ) { return UPNP_E_URL_TOO_BIG; } strcpy( descURL, http_scheme ); strcat( descURL, ipPortStr ); strcat( descURL, alias ); UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "desc url: %s\n", descURL ); return UPNP_E_SUCCESS; } /************************************************************************ * Function : config_description_doc * * Parameters : * INOUT IXML_Document *doc ;IMXL description document to be * configured * IN const char* ip_str ; string containing the IP port number * OUT char** root_path_str ; buffer to hold the root path * of the configured description document * INOUT IXML_Document *doc : Description document * IN const char* ip_str : ipaddress string * OUT char** root_path_str : root path string * * Description : Configure the description document. Add the standard * format and then add information from the root device and any * child nodes. * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_OUTOF_MEMORY - Default Error * UPNP_E_INVALID_DESC - Invalid child node * UPNP_E_INVALID_URL - Invalid node information * * Note : ************************************************************************/ static int config_description_doc( INOUT IXML_Document * doc, IN const char *ip_str, OUT char **root_path_str ) { xboolean addNew = FALSE; IXML_NodeList *baseList; IXML_Element *element = NULL; IXML_Element *newElement = NULL; IXML_Node *textNode = NULL; IXML_Node *rootNode = NULL; IXML_Node *urlbase_node = NULL; char *urlBaseStr = "URLBase"; const DOMString domStr = NULL; uri_type uri; int err_code; int len; membuffer url_str; membuffer root_path; membuffer_init( &url_str ); membuffer_init( &root_path ); err_code = UPNP_E_OUTOF_MEMORY; // default error baseList = ixmlDocument_getElementsByTagName( doc, urlBaseStr ); if( baseList == NULL ) { // urlbase not found -- create new one addNew = TRUE; element = ixmlDocument_createElement( doc, urlBaseStr ); if( element == NULL ) { goto error_handler; } if( membuffer_append_str( &url_str, "http://" ) != 0 || membuffer_append_str( &url_str, ip_str ) != 0 || membuffer_append_str( &url_str, "/" ) != 0 || membuffer_append_str( &root_path, "/" ) != 0 ) { goto error_handler; } rootNode = ixmlNode_getFirstChild( ( IXML_Node * ) doc ); if( rootNode == NULL ) { err_code = UPNP_E_INVALID_DESC; goto error_handler; } err_code = ixmlNode_appendChild( rootNode, ( IXML_Node * ) element ); if( err_code != IXML_SUCCESS ) { goto error_handler; } textNode = ixmlDocument_createTextNode( doc, ( char * )url_str.buf ); if( textNode == NULL ) { goto error_handler; } err_code = ixmlNode_appendChild( ( IXML_Node * ) element, textNode ); if( err_code != IXML_SUCCESS ) { goto error_handler; } } else { // urlbase found urlbase_node = ixmlNodeList_item( baseList, 0 ); assert( urlbase_node != NULL ); textNode = ixmlNode_getFirstChild( urlbase_node ); if( textNode == NULL ) { err_code = UPNP_E_INVALID_DESC; goto error_handler; } domStr = ixmlNode_getNodeValue( textNode ); if( domStr == NULL ) { err_code = UPNP_E_INVALID_URL; goto error_handler; } len = parse_uri( domStr, strlen( domStr ), &uri ); if( len < 0 || uri.type != ABSOLUTE ) { err_code = UPNP_E_INVALID_URL; goto error_handler; } if( membuffer_assign( &url_str, uri.scheme.buff, uri.scheme.size ) != 0 || membuffer_append_str( &url_str, "://" ) != 0 || membuffer_append_str( &url_str, ip_str ) != 0 ) { goto error_handler; } // add leading '/' if missing from relative path if( ( uri.pathquery.size > 0 && uri.pathquery.buff[0] != '/' ) || ( uri.pathquery.size == 0 ) ) { if( membuffer_append_str( &url_str, "/" ) != 0 || membuffer_append_str( &root_path, "/" ) != 0 ) { goto error_handler; } } if( membuffer_append( &url_str, uri.pathquery.buff, uri.pathquery.size ) != 0 || membuffer_append( &root_path, uri.pathquery.buff, uri.pathquery.size ) != 0 ) { goto error_handler; } // add trailing '/' if missing if( url_str.buf[url_str.length - 1] != '/' ) { if( membuffer_append( &url_str, "/", 1 ) != 0 ) { goto error_handler; } } err_code = ixmlNode_setNodeValue( textNode, url_str.buf ); if( err_code != IXML_SUCCESS ) { goto error_handler; } } *root_path_str = membuffer_detach( &root_path ); // return path err_code = UPNP_E_SUCCESS; error_handler: if( err_code != UPNP_E_SUCCESS ) { ixmlElement_free( newElement ); } ixmlNodeList_free( baseList ); membuffer_destroy( &root_path ); membuffer_destroy( &url_str ); return err_code; } /************************************************************************ * Function : configure_urlbase * * Parameters : * INOUT IXML_Document *doc ; IXML Description document * IN const struct sockaddr* serverAddr ; socket address object * providing the IP address and port information * IN const char* alias ; string containing the alias * IN time_t last_modified ; time when the XML document was * downloaded * OUT char docURL[LINE_SIZE] ; buffer to hold the URL of the * document. * INOUT IXML_Document *doc:dom document whose urlbase is to be modified * IN const struct sockaddr* serverAddr : ip address and port of * the miniserver * IN const char* alias : a name to be used for the temp; e.g.:"foo.xml" * IN time_t last_modified : time * OUT char docURL[LINE_SIZE] : document URL * * Description : Configure the full URL for the description document. * Create the URL document and add alias, description information. * The doc is added to the web server to be served using the given * alias. * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_OUTOF_MEMORY - Default Error * * Note : ************************************************************************/ int configure_urlbase( INOUT IXML_Document * doc, IN const struct sockaddr *serverAddr, IN const char *alias, IN time_t last_modified, OUT char docURL[LINE_SIZE] ) { char *root_path = NULL; char *new_alias = NULL; char *xml_str = NULL; int err_code; char ipaddr_port[LINE_SIZE]; err_code = UPNP_E_OUTOF_MEMORY; // default error // get IP address and port addrToString( serverAddr, ipaddr_port ); // config url-base in 'doc' err_code = config_description_doc( doc, ipaddr_port, &root_path ); if( err_code != UPNP_E_SUCCESS ) { goto error_handler; } // calc alias err_code = calc_alias( alias, root_path, &new_alias ); if( err_code != UPNP_E_SUCCESS ) { goto error_handler; } // calc full url for desc doc err_code = calc_descURL( ipaddr_port, new_alias, docURL ); if( err_code != UPNP_E_SUCCESS ) { goto error_handler; } // xml doc to str xml_str = ixmlPrintDocument( doc ); if( xml_str == NULL ) { goto error_handler; } UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "desc url: %s\n", docURL ); UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, "doc = %s\n", xml_str ); // store in web server err_code = web_server_set_alias( new_alias, xml_str, strlen( xml_str ), last_modified ); error_handler: free( root_path ); free( new_alias ); if( err_code != UPNP_E_SUCCESS ) { ixmlFreeDOMString( xml_str ); } return err_code; } libupnp-1.8.0~svn20100507/upnp/src/genlib/0000777000175000017500000000000011373047471014762 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/net/0000777000175000017500000000000011373047472015551 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/net/uri/0000777000175000017500000000000011373047472016350 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/net/uri/uri.c0000644000175000017500000004726511360640052017232 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /*! * \file * * \brief Contains functions for uri, url parsing utility. */ #ifdef __FreeBSD__ #include #if __FreeBSD_version < 601103 #include #endif #endif #include #include "config.h" #include "uri.h" #include "upnpapi.h" /*! * \brief Returns a 1 if a char is a RESERVED char as defined in * http://www.ietf.org/rfc/rfc2396.txt RFC explaining URIs). * * \return 1 if char is a RESERVED char. */ static int is_reserved( /*! [in] Char to be matched for RESERVED characters. */ char in) { if (strchr(RESERVED, in)) { return 1; } else { return 0; } } /*! * \brief Returns a 1 if a char is a MARK char as defined in * http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs). * * \return 1 if char is a MARKED char. */ int is_mark( /*! [in] Char to be matched for MARKED characters. */ char in) { if (strchr(MARK, in)) { return 1; } else { return 0; } } /*! * \brief Returns a 1 if a char is an UNRESERVED char as defined in * http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs). * * \return 1 if char is a UNRESERVED char. */ int is_unreserved( /*! [in] Char to be matched for UNRESERVED characters. */ char in) { if (isalnum(in) || is_mark(in)) { return 1; } else { return 0; } } /*! * \brief Returns a 1 if a char[3] sequence is ESCAPED as defined in * http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs). * * Size of array is NOT checked (MUST be checked by caller). * * \return 1 if char is a ESCAPED char. */ int is_escaped( /*! [in] Char sequence to be matched for ESCAPED characters. */ const char *in) { if (in[0] == '%' && isxdigit(in[1]) && isxdigit(in[2])) { return 1; } else { return 0; } } int replace_escaped(char *in, int index, size_t *max) { int tempInt = 0; char tempChar = 0; int i = 0; int j = 0; if (in[index] == '%' && isxdigit(in[index + 1]) && isxdigit(in[index + 2])) { /* Note the "%2x", makes sure that we convert a maximum of two * characters. */ if (sscanf(&in[index + 1], "%2x", &tempInt) != 1) { return 0; } tempChar = ( char )tempInt; for (i = index + 3, j = index; j < *max; i++, j++) { in[j] = tempChar; if (i < *max) { tempChar = in[i]; } else { tempChar = 0; } } *max -= 2; return 1; } else { return 0; } } /*! * \brief Parses a string of uric characters starting at in[0] as defined in * http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs). * * \return */ static int parse_uric( /*! [in] String of characters. */ const char *in, /*! [in] Maximum limit. */ int max, /*! [out] Token object where the string of characters is copied. */ token *out) { int i = 0; while (i < max && (is_unreserved(in[i]) || is_reserved(in[i]) || ((i + 2 < max) && is_escaped(&in[i])))) { i++; } out->size = i; out->buff = in; return i; } /*! * \brief Tokens are generally pointers into other strings. This copies the * offset and size from a token (in) relative to one string (in_base) into * a token (out) relative to another string (out_base). */ static void copy_token( /*! [in] Source token. */ const token *in, /*! [in] . */ const char *in_base, /*! [out] Destination token. */ token *out, /*! [in] . */ char *out_base) { out->size = in->size; out->buff = out_base + (in->buff - in_base); } int copy_URL_list(URL_list *in, URL_list *out) { int len = strlen( in->URLs ) + 1; int i = 0; out->URLs = NULL; out->parsedURLs = NULL; out->size = 0; out->URLs = ( char * )malloc( len ); out->parsedURLs = ( uri_type * ) malloc( sizeof( uri_type ) * in->size ); if( ( out->URLs == NULL ) || ( out->parsedURLs == NULL ) ) return UPNP_E_OUTOF_MEMORY; memcpy( out->URLs, in->URLs, len ); for( i = 0; i < in->size; i++ ) { //copy the parsed uri out->parsedURLs[i].type = in->parsedURLs[i].type; copy_token( &in->parsedURLs[i].scheme, in->URLs, &out->parsedURLs[i].scheme, out->URLs ); out->parsedURLs[i].path_type = in->parsedURLs[i].path_type; copy_token( &in->parsedURLs[i].pathquery, in->URLs, &out->parsedURLs[i].pathquery, out->URLs ); copy_token( &in->parsedURLs[i].fragment, in->URLs, &out->parsedURLs[i].fragment, out->URLs ); copy_token( &in->parsedURLs[i].hostport.text, in->URLs, &out->parsedURLs[i].hostport.text, out->URLs ); memcpy( &out->parsedURLs[i].hostport.IPaddress, &in->parsedURLs[i].hostport.IPaddress, sizeof(struct sockaddr_storage) ); } out->size = in->size; return HTTP_SUCCESS; } void free_URL_list(URL_list *list) { if (list->URLs) { free(list->URLs); } if (list->parsedURLs) { free(list->parsedURLs); } list->size = 0; } #ifdef DEBUG void print_uri(uri_type *in) { print_token(&in->scheme); print_token(&in->hostport.text); print_token(&in->pathquery); print_token(&in->fragment); } #endif /* DEBUG */ #ifdef DEBUG void print_token(token * in) { int i = 0; printf( "Token Size : %"PRIzu"\n\'", in->size ); for( i = 0; i < in->size; i++ ) { putchar( in->buff[i] ); } putchar( '\'' ); putchar( '\n' ); } #endif /* DEBUG */ int token_string_casecmp(token *in1, char *in2) { int in2_length = strlen(in2); if (in1->size != in2_length) { return 1; } else { return strncasecmp(in1->buff, in2, in1->size); } } int token_string_cmp(token * in1, char *in2) { int in2_length = strlen(in2); if (in1->size != in2_length) { return 1; } else { return strncmp(in1->buff, in2, in1->size); } } int token_cmp(token *in1, token *in2) { if (in1->size != in2->size) { return 1; } else { return memcmp(in1->buff, in2->buff, in1->size); } } int parse_hostport( const char *in, int max, hostport_type *out) { char workbuf[256]; char* c; struct sockaddr_in* sai4 = (struct sockaddr_in*)&out->IPaddress; struct sockaddr_in6* sai6 = (struct sockaddr_in6*)&out->IPaddress; char *srvname = NULL; char *srvport = NULL; char *last_dot = NULL; unsigned short int port; int af = AF_UNSPEC; int hostport_size; int has_port = 0; int ret; memset( out, 0, sizeof(hostport_type) ); // Work on a copy of the input string. strncpy( workbuf, in, sizeof(workbuf) ); c = workbuf; if( *c == '[' ) { // IPv6 addresses are enclosed in square brackets. srvname = ++c; while( *c != '\0' && *c != ']' ) { c++; } if( *c == '\0' ) { // did not find closing bracket. return UPNP_E_INVALID_URL; } // NULL terminate the srvname and then increment c. *c++ = '\0'; // overwrite the ']' if( *c == ':' ) { has_port = 1; c++; } af = AF_INET6; } else { // IPv4 address -OR- host name. srvname = c; while( (*c != ':') && (*c != '/') && ( (isalnum(*c)) || (*c == '.') || (*c == '-') ) ) { if( *c == '.' ) last_dot = c; c++; } has_port = (*c == ':') ? 1 : 0; // NULL terminate the srvname *c = '\0'; if( has_port == 1 ) c++; if( last_dot != NULL && isdigit(*(last_dot+1)) ) { // Must be an IPv4 address. af = AF_INET; } else { // Must be a host name. struct addrinfo hints, *res, *res0; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; ret = getaddrinfo(srvname, NULL, &hints, &res0); if( ret == 0 ) { for (res = res0; res; res = res->ai_next) { if( res->ai_family == AF_INET || res->ai_family == AF_INET6 ) { // Found a valid IPv4 or IPv6 address. memcpy( &out->IPaddress, res->ai_addr, res->ai_addrlen ); break; } } freeaddrinfo(res0); if( res == NULL ) { // Didn't find an AF_INET or AF_INET6 address. return UPNP_E_INVALID_URL; } } else { // getaddrinfo failed. return UPNP_E_INVALID_URL; } } } // Check if a port is specified. if( has_port == 1 ) { // Port is specified. srvport = c; while( *c != '\0' && isdigit(*c) ) { c++; } port = (unsigned short int)atoi(srvport); if( port == 0 ) { // Bad port number. return UPNP_E_INVALID_URL; } } else { // Port was not specified, use default port. port = 80; } // The length of the host and port string can be calculated by // subtracting pointers. hostport_size = (int)(c - workbuf); // Fill in the 'out' information. if( af == AF_INET ) { sai4->sin_family = AF_INET; sai4->sin_port = htons(port); ret = inet_pton(AF_INET, srvname, &sai4->sin_addr); } else if( af == AF_INET6 ) { sai6->sin6_family = AF_INET6; sai6->sin6_port = htons(port); sai6->sin6_scope_id = gIF_INDEX; ret = inet_pton(AF_INET6, srvname, &sai6->sin6_addr); } else { // IP address was set by the hostname (getaddrinfo). // Override port: if( out->IPaddress.ss_family == AF_INET ) sai4->sin_port = htons(port); else sai6->sin6_port = htons(port); ret = 1; } /* Check if address was converted successfully. */ if (ret <= 0) { return UPNP_E_INVALID_URL; } out->text.size = hostport_size; out->text.buff = in; return hostport_size; } /*! * \brief parses a uri scheme starting at in[0] as defined in * http://www.ietf.org/rfc/rfc2396.txt (RFC explaining URIs). * * (e.g. "http:" -> scheme= "http"). * * \note String MUST include ':' within the max charcters. * * \return */ static int parse_scheme( /*! [in] String of characters representing a scheme. */ const char *in, /*! [in] Maximum number of characters. */ int max, /*! [out] Output parameter whose buffer is filled in with the scheme. */ token *out) { int i = 0; out->size = 0; out->buff = NULL; if( ( max == 0 ) || ( !isalpha( in[0] ) ) ) return FALSE; i++; while( ( i < max ) && ( in[i] != ':' ) ) { if( !( isalnum( in[i] ) || ( in[i] == '+' ) || ( in[i] == '-' ) || ( in[i] == '.' ) ) ) return FALSE; i++; } if( i < max ) { out->size = i; out->buff = &in[0]; return i; } return FALSE; } int remove_escaped_chars(INOUT char *in, INOUT size_t *size ) { int i = 0; for( i = 0; i < *size; i++ ) { replace_escaped( in, i, size ); } return UPNP_E_SUCCESS; } int remove_dots(char *in, size_t size) { char *copyTo = in; char *copyFrom = in; char *max = in + size; char **Segments = NULL; int lastSegment = -1; Segments = malloc( sizeof( char * ) * size ); if( Segments == NULL ) return UPNP_E_OUTOF_MEMORY; Segments[0] = NULL; UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "REMOVE_DOTS: before: %s\n", in ); while( ( copyFrom < max ) && ( *copyFrom != '?' ) && ( *copyFrom != '#' ) ) { if( ( ( *copyFrom ) == '.' ) && ( ( copyFrom == in ) || ( *( copyFrom - 1 ) == '/' ) ) ) { if( ( copyFrom + 1 == max ) || ( *( copyFrom + 1 ) == '/' ) ) { copyFrom += 2; continue; } else if( ( *( copyFrom + 1 ) == '.' ) && ( ( copyFrom + 2 == max ) || ( *( copyFrom + 2 ) == '/' ) ) ) { copyFrom += 3; if( lastSegment > 0 ) { copyTo = Segments[--lastSegment]; } else { free( Segments ); //TRACE("ERROR RESOLVING URL, ../ at ROOT"); return UPNP_E_INVALID_URL; } continue; } } if( ( *copyFrom ) == '/' ) { lastSegment++; Segments[lastSegment] = copyTo + 1; } ( *copyTo ) = ( *copyFrom ); copyTo++; copyFrom++; } if( copyFrom < max ) { while( copyFrom < max ) { ( *copyTo ) = ( *copyFrom ); copyTo++; copyFrom++; } } ( *copyTo ) = 0; free( Segments ); UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, "REMOVE_DOTS: after: %s\n", in ); return UPNP_E_SUCCESS; } char *resolve_rel_url(char *base_url, char *rel_url) { uri_type base; uri_type rel; char temp_path = '/'; int i = 0; char *finger = NULL; char *last_slash = NULL; char *out = NULL; char *out_finger = NULL; if( base_url && rel_url ) { out = ( char * )malloc( strlen( base_url ) + strlen( rel_url ) + 2 ); out_finger = out; } else { if( rel_url ) return strdup( rel_url ); else return NULL; } if( out == NULL ) { return NULL; } if( ( parse_uri( rel_url, strlen( rel_url ), &rel ) ) == HTTP_SUCCESS ) { if( rel.type == ABSOLUTE ) { strcpy( out, rel_url ); } else { if( ( parse_uri( base_url, strlen( base_url ), &base ) == HTTP_SUCCESS ) && ( base.type == ABSOLUTE ) ) { if( strlen( rel_url ) == 0 ) { strcpy( out, base_url ); } else { memcpy( out, base.scheme.buff, base.scheme.size ); out_finger += base.scheme.size; ( *out_finger ) = ':'; out_finger++; if( rel.hostport.text.size > 0 ) { sprintf( out_finger, "%s", rel_url ); } else { if( base.hostport.text.size > 0 ) { memcpy( out_finger, "//", 2 ); out_finger += 2; memcpy( out_finger, base.hostport.text.buff, base.hostport.text.size ); out_finger += base.hostport.text.size; } if( rel.path_type == ABS_PATH ) { strcpy( out_finger, rel_url ); } else { if( base.pathquery.size == 0 ) { base.pathquery.size = 1; base.pathquery.buff = &temp_path; } finger = out_finger; last_slash = finger; i = 0; while( ( i < base.pathquery.size ) && ( base.pathquery.buff[i] != '?' ) ) { ( *finger ) = base.pathquery.buff[i]; if( base.pathquery.buff[i] == '/' ) last_slash = finger + 1; i++; finger++; } i = 0; strcpy( last_slash, rel_url ); if( remove_dots( out_finger, strlen( out_finger ) ) != UPNP_E_SUCCESS ) { free(out); /* free(rel_url); */ return NULL; } } } } } else { free(out); /* free(rel_url); */ return NULL; } } } else { free(out); /* free(rel_url); */ return NULL; } /* free(rel_url); */ return out; } int parse_uri(const char *in, int max, uri_type *out) { int begin_path = 0; int begin_hostport = 0; int begin_fragment = 0; if( ( begin_hostport = parse_scheme( in, max, &out->scheme ) ) ) { out->type = ABSOLUTE; out->path_type = OPAQUE_PART; begin_hostport++; } else { out->type = RELATIVE; out->path_type = REL_PATH; } if( ( ( begin_hostport + 1 ) < max ) && ( in[begin_hostport] == '/' ) && ( in[begin_hostport + 1] == '/' ) ) { begin_hostport += 2; if( ( begin_path = parse_hostport( &in[begin_hostport], max - begin_hostport, &out->hostport ) ) >= 0 ) { begin_path += begin_hostport; } else return begin_path; } else { memset( &out->hostport, 0, sizeof(out->hostport) ); begin_path = begin_hostport; } begin_fragment = parse_uric( &in[begin_path], max - begin_path, &out->pathquery ) + begin_path; if( ( out->pathquery.size ) && ( out->pathquery.buff[0] == '/' ) ) { out->path_type = ABS_PATH; } if( ( begin_fragment < max ) && ( in[begin_fragment] == '#' ) ) { begin_fragment++; parse_uric( &in[begin_fragment], max - begin_fragment, &out->fragment ); } else { out->fragment.buff = NULL; out->fragment.size = 0; } return HTTP_SUCCESS; } int parse_uri_and_unescape(char *in, int max, uri_type *out) { int ret = parse_uri(in, max, out); if (ret != HTTP_SUCCESS) { return ret; } if (out->pathquery.size > 0) { remove_escaped_chars((char *)out->pathquery.buff, &out->pathquery.size); } if (out->fragment.size > 0) { remove_escaped_chars((char *)out->fragment.buff, &out->fragment.size); } return HTTP_SUCCESS; } libupnp-1.8.0~svn20100507/upnp/src/genlib/net/http/0000777000175000017500000000000011373047472016530 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/net/http/httpparser.c0000644000175000017500000022241611025042301020767 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /* * \file * * \brief Contains functions for scanner and parser for http messages. */ #define _GNU_SOURCE // For strcasestr() in string.h #include "config.h" #include "strintmap.h" #include "httpparser.h" #include "statcodes.h" #include "unixutil.h" #include "upnpdebug.h" #include #include #include #include #include #include /* entity positions */ #define NUM_HTTP_METHODS 9 static str_int_entry Http_Method_Table[NUM_HTTP_METHODS] = { {"GET", HTTPMETHOD_GET}, {"HEAD", HTTPMETHOD_HEAD}, {"M-POST", HTTPMETHOD_MPOST}, {"M-SEARCH", HTTPMETHOD_MSEARCH}, {"NOTIFY", HTTPMETHOD_NOTIFY}, {"POST", HTTPMETHOD_POST}, {"SUBSCRIBE", HTTPMETHOD_SUBSCRIBE}, {"UNSUBSCRIBE", HTTPMETHOD_UNSUBSCRIBE}, {"POST", SOAPMETHOD_POST}, }; #define NUM_HTTP_HEADER_NAMES 33 str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = { {"ACCEPT", HDR_ACCEPT}, {"ACCEPT-CHARSET", HDR_ACCEPT_CHARSET}, {"ACCEPT-ENCODING", HDR_ACCEPT_ENCODING}, {"ACCEPT-LANGUAGE", HDR_ACCEPT_LANGUAGE}, {"ACCEPT-RANGES", HDR_ACCEPT_RANGE}, {"CACHE-CONTROL", HDR_CACHE_CONTROL}, {"CALLBACK", HDR_CALLBACK}, {"CONTENT-ENCODING", HDR_CONTENT_ENCODING}, {"CONTENT-LANGUAGE", HDR_CONTENT_LANGUAGE}, {"CONTENT-LENGTH", HDR_CONTENT_LENGTH}, {"CONTENT-LOCATION", HDR_CONTENT_LOCATION}, {"CONTENT-RANGE", HDR_CONTENT_RANGE}, {"CONTENT-TYPE", HDR_CONTENT_TYPE}, {"DATE", HDR_DATE}, {"EXT", HDR_EXT}, {"HOST", HDR_HOST}, {"IF-RANGE", HDR_IF_RANGE}, {"LOCATION", HDR_LOCATION}, {"MAN", HDR_MAN}, {"MX", HDR_MX}, {"NT", HDR_NT}, {"NTS", HDR_NTS}, {"RANGE", HDR_RANGE}, {"SEQ", HDR_SEQ}, {"SERVER", HDR_SERVER}, {"SID", HDR_SID}, {"SOAPACTION", HDR_SOAPACTION}, {"ST", HDR_ST}, {"TE", HDR_TE}, {"TIMEOUT", HDR_TIMEOUT}, {"TRANSFER-ENCODING", HDR_TRANSFER_ENCODING}, {"USER-AGENT", HDR_USER_AGENT}, {"USN", HDR_USN} }; /***********************************************************************/ /************* scanner *************/ /***********************************************************************/ #define TOKCHAR_CR 0xD #define TOKCHAR_LF 0xA /************************************************************************ * Function : scanner_init * * Parameters : * OUT scanner_t* scanner ; Scanner Object to be initialized * IN membuffer* bufptr ; Buffer to be copied * * Description : Intialize scanner * * Return : void ; * * Note : ************************************************************************/ static UPNP_INLINE void scanner_init( OUT scanner_t *scanner, IN membuffer *bufptr ) { scanner->cursor = 0; scanner->msg = bufptr; scanner->entire_msg_loaded = FALSE; } /************************************************************************ * Function : is_separator_char * * Parameters : * IN char c ; character to be tested against used separator values * * Description : Finds the separator character. * * Return : xboolean ; * * Note : ************************************************************************/ static UPNP_INLINE xboolean is_separator_char( IN char c ) { return strchr( " \t()<>@,;:\\\"/[]?={}", c ) != NULL; } /************************************************************************ * Function : is_identifier_char * * Parameters : * IN char c ; character to be tested for separator values * * Description : Calls the function to indentify separator character * * Return : xboolean ; * * Note : ************************************************************************/ static UPNP_INLINE xboolean is_identifier_char( IN char c ) { return ( c >= 32 && c <= 126 ) && !is_separator_char( c ); } /************************************************************************ * Function : is_control_char * * Parameters : * IN char c ; character to be tested for a control character * * Description : Determines if the passed value is a control character * * Return : xboolean ; * * Note : ************************************************************************/ static UPNP_INLINE xboolean is_control_char( IN char c ) { return ( ( c >= 0 && c <= 31 ) || ( c == 127 ) ); } /************************************************************************ * Function : is_qdtext_char * * Parameters : * IN char cc ; character to be tested for CR/LF * * Description : Checks to see if the passed in value is CR/LF * * Return : xboolean ; * * Note : ************************************************************************/ static UPNP_INLINE xboolean is_qdtext_char( IN char cc ) { unsigned char c = ( unsigned char )cc; // we don't check for this; it's checked in get_token() assert( c != '"' ); if( ( c >= 32 && c != 127 ) || ( c == TOKCHAR_CR || c == TOKCHAR_LF || c == '\t' ) ) { return TRUE; } else { return FALSE; } } /************************************************************************ * Function : scanner_get_token * * Parameters : * INOUT scanner_t* scanner ; Scanner Object * OUT memptr* token ; Token * OUT token_type_t* tok_type ; Type of token * * Description : reads next token from the input stream * note: 0 and is used as a marker, and will not be valid in a quote * * Return : parse_status_t ; * PARSE_OK * PARSE_INCOMPLETE -- not enuf chars to get a token * PARSE_FAILURE -- bad msg format * * Note : ************************************************************************/ static parse_status_t scanner_get_token( INOUT scanner_t * scanner, OUT memptr * token, OUT token_type_t * tok_type ) { char *cursor; char *null_terminator; // point to null-terminator in buffer char c; token_type_t token_type; xboolean got_end_quote; assert( scanner ); assert( token ); assert( tok_type ); // point to next char in buffer cursor = scanner->msg->buf + scanner->cursor; null_terminator = scanner->msg->buf + scanner->msg->length; // not enough chars in input to parse if( cursor == null_terminator ) { return PARSE_INCOMPLETE; } c = *cursor; if( is_identifier_char( c ) ) { // scan identifier token->buf = cursor++; token_type = TT_IDENTIFIER; while( is_identifier_char( *cursor ) ) { cursor++; } if( !scanner->entire_msg_loaded && cursor == null_terminator ) { // possibly more valid chars return PARSE_INCOMPLETE; } // calc token length token->length = cursor - token->buf; } else if( c == ' ' || c == '\t' ) { token->buf = cursor++; token_type = TT_WHITESPACE; while( *cursor == ' ' || *cursor == '\t' ) { cursor++; } if( !scanner->entire_msg_loaded && cursor == null_terminator ) { // possibly more chars return PARSE_INCOMPLETE; } token->length = cursor - token->buf; } else if( c == TOKCHAR_CR ) { // scan CRLF token->buf = cursor++; if( cursor == null_terminator ) { // not enuf info to determine CRLF return PARSE_INCOMPLETE; } if( *cursor != TOKCHAR_LF ) { // couldn't match CRLF; match as CR token_type = TT_CTRL; // ctrl char token->length = 1; } else { // got CRLF token->length = 2; token_type = TT_CRLF; cursor++; } } else if( c == TOKCHAR_LF ) // accept \n as CRLF { token->buf = cursor++; token->length = 1; token_type = TT_CRLF; } else if( c == '"' ) { // quoted text token->buf = cursor++; token_type = TT_QUOTEDSTRING; got_end_quote = FALSE; while( cursor < null_terminator ) { c = *cursor++; if( c == '"' ) { got_end_quote = TRUE; break; } else if( c == '\\' ) { if( cursor < null_terminator ) { c = *cursor++; //if ( !(c > 0 && c <= 127) ) if( c == 0 ) { return PARSE_FAILURE; } } // else, while loop handles incomplete buf } else if( is_qdtext_char( c ) ) { // just accept char } else { // bad quoted text return PARSE_FAILURE; } } if( got_end_quote ) { token->length = cursor - token->buf; } else // incomplete { assert( cursor == null_terminator ); return PARSE_INCOMPLETE; } } else if( is_separator_char( c ) ) { // scan separator token->buf = cursor++; token_type = TT_SEPARATOR; token->length = 1; } else if( is_control_char( c ) ) { // scan ctrl char token->buf = cursor++; token_type = TT_CTRL; token->length = 1; } else { return PARSE_FAILURE; } scanner->cursor += token->length; // move to next token *tok_type = token_type; return PARSE_OK; } /************************************************************************ * Function : scanner_get_str * * Parameters : * IN scanner_t* scanner ; Scanner Object * * Description : returns ptr to next char in string * * Return : char* ; * * Note : ************************************************************************/ static UPNP_INLINE char * scanner_get_str( IN scanner_t * scanner ) { return scanner->msg->buf + scanner->cursor; } /************************************************************************ * Function : scanner_pushback * * Parameters : * INOUT scanner_t* scanner ; Scanner Object * IN size_t pushback_bytes ; Bytes to be moved back * * Description : Move back by a certain number of bytes. * This is used to put back one or more tokens back into the input * * Return : void ; * * Note : ************************************************************************/ #ifdef WIN32 #pragma message ("The only use of the function 'scanner_pushback()' in the code is commented out.") #pragma message ("'scanner_pushback()' is a candidate for removal.") #else #warning The only use of the function 'scanner_pushback()' in the code is commented out. #warning 'scanner_pushback()' is a candidate for removal. #endif static UPNP_INLINE void scanner_pushback( INOUT scanner_t * scanner, IN size_t pushback_bytes ) { scanner->cursor -= pushback_bytes; } /***********************************************************************/ /************* end of scanner **************/ /***********************************************************************/ /***********************************************************************/ /************* parser **************/ /***********************************************************************/ /***********************************************************************/ /************* http_message_t **************/ /***********************************************************************/ /************************************************************************ * Function : httpmsg_compare * * Parameters : * void* param1 ; * void* param2 ; * * Description : Compares name id in the http headers. * * Return : int ; * * Note : ************************************************************************/ static int httpmsg_compare( void *param1, void *param2 ) { assert( param1 != NULL ); assert( param2 != NULL ); return ( ( http_header_t * ) param1 )->name_id == ( ( http_header_t * ) param2 )->name_id; } /************************************************************************ * Function : httpheader_free * * Parameters : * void *msg ; * * Description : Free memory allocated for the http header * * Return : void ; * * Note : ************************************************************************/ static void httpheader_free( void *msg ) { http_header_t *hdr = ( http_header_t * ) msg; membuffer_destroy( &hdr->name_buf ); membuffer_destroy( &hdr->value ); free( hdr ); } /************************************************************************ * Function : httpmsg_init * * Parameters : * INOUT http_message_t* msg ; HTTP Message Object * * Description : Initialize and allocate memory for http message * * Return : void ; * * Note : ************************************************************************/ void httpmsg_init( INOUT http_message_t * msg ) { msg->initialized = 1; msg->entity.buf = NULL; msg->entity.length = 0; ListInit( &msg->headers, httpmsg_compare, httpheader_free ); membuffer_init( &msg->msg ); membuffer_init( &msg->status_msg ); } /************************************************************************ * Function : httpmsg_destroy * * Parameters : * INOUT http_message_t* msg ; HTTP Message Object * * Description : Free memory allocated for the http message * * Return : void ; * * Note : ************************************************************************/ void httpmsg_destroy( INOUT http_message_t * msg ) { assert( msg != NULL ); if( msg->initialized == 1 ) { ListDestroy( &msg->headers, 1 ); membuffer_destroy( &msg->msg ); membuffer_destroy( &msg->status_msg ); free( msg->urlbuf ); msg->initialized = 0; } } /************************************************************************ * Function : httpmsg_find_hdr_str * * Parameters : * IN http_message_t* msg ; HTTP Message Object * IN const char* header_name ; Header name to be compared with * * Description : Compares the header name with the header names stored * in the linked list of messages * * Return : http_header_t* - Pointer to a header on success; * NULL on failure * * Note : ************************************************************************/ http_header_t * httpmsg_find_hdr_str( IN http_message_t * msg, IN const char *header_name ) { http_header_t *header; ListNode *node; node = ListHead( &msg->headers ); while( node != NULL ) { header = ( http_header_t * ) node->item; if( memptr_cmp_nocase( &header->name, header_name ) == 0 ) { return header; } node = ListNext( &msg->headers, node ); } return NULL; } /************************************************************************ * Function : httpmsg_find_hdr * * Parameters : * IN http_message_t* msg ; HTTP Message Object * IN int header_name_id ; Header Name ID to be compared with * OUT memptr* value ; Buffer to get the ouput to. * * Description : Finds header from a list, with the given 'name_id'. * * Return : http_header_t* - Pointer to a header on success; * NULL on failure * * Note : ************************************************************************/ http_header_t * httpmsg_find_hdr( IN http_message_t * msg, IN int header_name_id, OUT memptr * value ) { http_header_t header; // temp header for searching ListNode *node; http_header_t *data; header.name_id = header_name_id; node = ListFind( &msg->headers, NULL, &header ); if( node == NULL ) { return NULL; } data = ( http_header_t * ) node->item; if( value != NULL ) { value->buf = data->value.buf; value->length = data->value.length; } return data; } /***********************************************************************/ /************* http_parser_t **************/ /***********************************************************************/ /************************************************************************ * Function : skip_blank_lines * * Parameters : * INOUT scanner_t* scanner ; Scanner Object * * Description : skips blank lines at the start of a msg. * * Return : int ; * * Note : ************************************************************************/ static UPNP_INLINE int skip_blank_lines( INOUT scanner_t * scanner ) { memptr token; token_type_t tok_type; parse_status_t status; // skip ws, crlf do { status = scanner_get_token( scanner, &token, &tok_type ); } while( status == PARSE_OK && ( tok_type == TT_WHITESPACE || tok_type == TT_CRLF ) ); if( status == PARSE_OK ) { // pushback a non-whitespace token scanner->cursor -= token.length; //scanner_pushback( scanner, token.length ); } return status; } /************************************************************************ * Function : skip_lws * * Parameters : * INOUT scanner_t* scanner ; Scanner Object * * Description : skip linear whitespace. * * Return : int ; * PARSE_OK: (LWS)* removed from input * PARSE_FAILURE: bad input * PARSE_INCOMPLETE: incomplete input * * Note : ************************************************************************/ static UPNP_INLINE int skip_lws( INOUT scanner_t * scanner ) { memptr token; token_type_t tok_type; parse_status_t status; size_t save_pos; xboolean matched; do { save_pos = scanner->cursor; matched = FALSE; // get CRLF or WS status = scanner_get_token( scanner, &token, &tok_type ); if( status == PARSE_OK ) { if( tok_type == TT_CRLF ) { // get WS status = scanner_get_token( scanner, &token, &tok_type ); } if( status == PARSE_OK && tok_type == TT_WHITESPACE ) { matched = TRUE; } else { // did not match LWS; pushback token(s) scanner->cursor = save_pos; } } } while( matched ); // if entire msg is loaded, ignore an 'incomplete' warning if( status == PARSE_INCOMPLETE && scanner->entire_msg_loaded ) { status = PARSE_OK; } return status; } /************************************************************************ * Function : match_non_ws_string * * Parameters : * INOUT scanner_t* scanner ; Scanner Object * OUT memptr* str ; Buffer to get the scanner buffer contents. * * Description : Match a string without whitespace or CRLF (%S) * * Return : UPNP_INLINE parse_status_t ; * PARSE_OK * PARSE_NO_MATCH * PARSE_FAILURE * PARSE_INCOMPLETE * * Note : ************************************************************************/ static UPNP_INLINE parse_status_t match_non_ws_string( INOUT scanner_t * scanner, OUT memptr * str ) { memptr token; token_type_t tok_type; parse_status_t status; xboolean done = FALSE; size_t save_cursor; save_cursor = scanner->cursor; str->length = 0; str->buf = scanner_get_str( scanner ); // point to next char in input while( !done ) { status = scanner_get_token( scanner, &token, &tok_type ); if( status == PARSE_OK && tok_type != TT_WHITESPACE && tok_type != TT_CRLF ) { // append non-ws token str->length += token.length; } else { done = TRUE; } } if( status == PARSE_OK ) { // last token was WS; push it back in scanner->cursor -= token.length; } // tolerate 'incomplete' msg if( status == PARSE_OK || ( status == PARSE_INCOMPLETE && scanner->entire_msg_loaded ) ) { if( str->length == 0 ) { // no strings found return PARSE_NO_MATCH; } else { return PARSE_OK; } } else { // error -- pushback tokens scanner->cursor = save_cursor; return status; } } /************************************************************************ * Function : match_raw_value * * Parameters : * INOUT scanner_t* scanner ; Scanner Object * OUT memptr* raw_value ; Buffer to get the scanner buffer * contents * * Description : Matches a raw value in a the input; value's length * can be 0 or more. Whitespace after value is trimmed. On success, * scanner points the CRLF that ended the value * * Return : parse_status_t ; * PARSE_OK * PARSE_INCOMPLETE * PARSE_FAILURE * * Note : ************************************************************************/ static UPNP_INLINE parse_status_t match_raw_value( INOUT scanner_t * scanner, OUT memptr * raw_value ) { memptr token; token_type_t tok_type; parse_status_t status; xboolean done = FALSE; xboolean saw_crlf = FALSE; size_t pos_at_crlf = 0; size_t save_pos; char c; save_pos = scanner->cursor; // value points to start of input raw_value->buf = scanner_get_str( scanner ); raw_value->length = 0; while( !done ) { status = scanner_get_token( scanner, &token, &tok_type ); if( status == PARSE_OK ) { if( !saw_crlf ) { if( tok_type == TT_CRLF ) { // CRLF could end value saw_crlf = TRUE; // save input position at start of CRLF pos_at_crlf = scanner->cursor - token.length; } // keep appending value raw_value->length += token.length; } else // already seen CRLF { if( tok_type == TT_WHITESPACE ) { // start again; forget CRLF saw_crlf = FALSE; raw_value->length += token.length; } else { // non-ws means value ended just before CRLF done = TRUE; // point to the crlf which ended the value scanner->cursor = pos_at_crlf; } } } else { // some kind of error; restore scanner position scanner->cursor = save_pos; done = TRUE; } } if( status == PARSE_OK ) { // trim whitespace on right side of value while( raw_value->length > 0 ) { // get last char c = raw_value->buf[raw_value->length - 1]; if( c != ' ' && c != '\t' && c != TOKCHAR_CR && c != TOKCHAR_LF ) { // done; no more whitespace break; } // remove whitespace raw_value->length--; } } return status; } /************************************************************************ * Function: match_int * * Parameters: * INOUT scanner_t* scanner ; Scanner Object * IN int base : Base of number in the string; * valid values: 10 or 16 * OUT int* value ; Number stored here * * Description: Matches an unsigned integer value in the input. The * integer is returned in 'value'. Except for PARSE_OK result, the * scanner's cursor is moved back to its original position on error. * * Returns: * PARSE_OK * PARSE_NO_MATCH -- got different kind of token * PARSE_FAILURE -- bad input * PARSE_INCOMPLETE ************************************************************************/ static UPNP_INLINE int match_int( INOUT scanner_t * scanner, IN int base, OUT int *value ) { memptr token; token_type_t tok_type; parse_status_t status; long num; char *end_ptr; size_t save_pos; save_pos = scanner->cursor; status = scanner_get_token( scanner, &token, &tok_type ); if( status == PARSE_OK ) { if( tok_type == TT_IDENTIFIER ) { errno = 0; num = strtol( token.buf, &end_ptr, base ); if( ( num < 0 ) // all and only those chars in token should be used for num || ( end_ptr != token.buf + token.length ) || ( ( num == LONG_MIN || num == LONG_MAX ) && ( errno == ERANGE ) ) ) { status = PARSE_NO_MATCH; } *value = num; // save result } else { status = PARSE_NO_MATCH; // token must be an identifier } } if( status != PARSE_OK ) { // restore scanner position for bad values scanner->cursor = save_pos; } return status; } /************************************************************************ * Function: read_until_crlf * * Parameters: * INOUT scanner_t* scanner ;Scanner Object * OUT memptr* str ; Buffer to copy scanner buffer contents to * * Description: Reads data until end of line; the crlf at the end of * line is not consumed. On error, scanner is not restored. On * success, 'str' points to a string that runs until eol * * Returns: * PARSE_OK * PARSE_FAILURE * PARSE_INCOMPLETE ************************************************************************/ static UPNP_INLINE int read_until_crlf( INOUT scanner_t * scanner, OUT memptr * str ) { memptr token; token_type_t tok_type; parse_status_t status; size_t start_pos; start_pos = scanner->cursor; str->buf = scanner_get_str( scanner ); // read until we hit a crlf do { status = scanner_get_token( scanner, &token, &tok_type ); } while( status == PARSE_OK && tok_type != TT_CRLF ); if( status == PARSE_OK ) { // pushback crlf in stream scanner->cursor -= token.length; // str should include all strings except crlf at the end str->length = scanner->cursor - start_pos; } return status; } /************************************************************************ * Function: skip_to_end_of_header * * Parameters: * INOUT scanner_t* scanner ; Scanner Object * * Description: Skip to end of header * * Returns: * PARSE_OK * PARSE_FAILURE * PARSE_INCOMPLETE ************************************************************************/ #ifdef WIN32 #pragma message("There are currently no uses of the function 'skip_to_end_of_header()' in the code.") #pragma message("'skip_to_end_of_header()' is a candidate for removal.") #else #warning There are currently no uses of the function 'skip_to_end_of_header()' in the code. #warning 'skip_to_end_of_header()' is a candidate for removal. #endif static UPNP_INLINE int skip_to_end_of_header( INOUT scanner_t * scanner ) { memptr dummy_raw_value; parse_status_t status; status = match_raw_value( scanner, &dummy_raw_value ); return status; } /************************************************************************ * Function: match_char * * Parameters: * INOUT scanner_t* scanner ; Scanner Object * IN char c ; Character to be compared with * IN xboolean case_sensitive; Flag indicating whether * comparison should be case sensitive * * Description: Compares a character to the next char in the scanner; * on error, scanner chars are not restored * * Returns: * PARSE_OK * PARSE_NO_MATCH * PARSE_INCOMPLETE ************************************************************************/ static UPNP_INLINE parse_status_t match_char( INOUT scanner_t * scanner, IN char c, IN xboolean case_sensitive ) { char scan_char; if( scanner->cursor >= scanner->msg->length ) { return PARSE_INCOMPLETE; } // read next char from scanner scan_char = scanner->msg->buf[scanner->cursor++]; if( case_sensitive ) { return c == scan_char ? PARSE_OK : PARSE_NO_MATCH; } else { return tolower( c ) == tolower( scan_char ) ? PARSE_OK : PARSE_NO_MATCH; } } //////////////////////////////////////////////////////////////////////// // args for ... // %d, int * (31-bit positive integer) // %x, int * (31-bit postive number encoded as hex) // %s, memptr* (simple identifier) // %q, memptr* (quoted string) // %S, memptr* (non-whitespace string) // %R, memptr* (raw value) // %U, uri_type* (url) // %L, memptr* (string until end of line) // %P, int * (current index of the string being scanned) // // no args for // ' ' LWS* // \t whitespace // "%%" matches '%' // "% " matches ' ' // %c matches CRLF // %i ignore case in literal matching // %n case-sensitive matching in literals // %w optional whitespace; (similar to '\t', // except whitespace is optional) // %0 (zero) match null-terminator char '\0' // (can only be used as last char in fmt) // use only in matchstr(), not match() // other chars match literally // // returns: // PARSE_OK // PARSE_INCOMPLETE // PARSE_FAILURE -- bad input // PARSE_NO_MATCH -- input does not match pattern /************************************************************************ * Function : vfmatch * * Parameters : * INOUT scanner_t* scanner ; Scanner Object * IN const char* fmt ; Pattern Format * va_list argp ; List of variable arguments * * Description : Extracts variable parameters depending on the passed * in format parameter. Parses data also based on the passed in * format parameter. * * Return : int ; * PARSE_OK * PARSE_INCOMPLETE * PARSE_FAILURE - bad input * PARSE_NO_MATCH - input does not match pattern * * Note : ************************************************************************/ static int vfmatch( INOUT scanner_t * scanner, IN const char *fmt, va_list argp ) { char c; const char *fmt_ptr = fmt; parse_status_t status; memptr *str_ptr; memptr temp_str; int *int_ptr; uri_type *uri_ptr; size_t save_pos; int stat; xboolean case_sensitive = TRUE; memptr token; token_type_t tok_type; int base; assert( scanner != NULL ); assert( fmt != NULL ); // save scanner pos; to aid error recovery save_pos = scanner->cursor; status = PARSE_OK; while( ( ( c = *fmt_ptr++ ) != 0 ) && ( status == PARSE_OK ) ) { if( c == '%' ) { c = *fmt_ptr++; switch ( c ) { case 'R': // raw value str_ptr = va_arg( argp, memptr * ); assert( str_ptr != NULL ); status = match_raw_value( scanner, str_ptr ); break; case 's': // simple identifier str_ptr = va_arg( argp, memptr * ); assert( str_ptr != NULL ); status = scanner_get_token( scanner, str_ptr, &tok_type ); if( status == PARSE_OK && tok_type != TT_IDENTIFIER ) { // not an identifier status = PARSE_NO_MATCH; } break; case 'c': // crlf status = scanner_get_token( scanner, &token, &tok_type ); if( status == PARSE_OK && tok_type != TT_CRLF ) { // not CRLF token status = PARSE_NO_MATCH; } break; case 'd': // integer case 'x': // hex number int_ptr = va_arg( argp, int * ); assert( int_ptr != NULL ); base = ( c == 'd' ? 10 : 16 ); status = match_int( scanner, base, int_ptr ); break; case 'S': // non-whitespace string case 'U': // uri if( c == 'S' ) { str_ptr = va_arg( argp, memptr * ); } else { str_ptr = &temp_str; } assert( str_ptr != NULL ); status = match_non_ws_string( scanner, str_ptr ); if( c == 'U' && status == PARSE_OK ) { uri_ptr = va_arg( argp, uri_type * ); assert( uri_ptr != NULL ); stat = parse_uri( str_ptr->buf, str_ptr->length, uri_ptr ); if( stat != HTTP_SUCCESS ) { status = PARSE_NO_MATCH; } } break; case 'L': // string till eol str_ptr = va_arg( argp, memptr * ); assert( str_ptr != NULL ); status = read_until_crlf( scanner, str_ptr ); break; case ' ': // match space case '%': // match percentage symbol status = match_char( scanner, c, case_sensitive ); break; case 'n': // case-sensitive match case_sensitive = TRUE; break; case 'i': // ignore case case_sensitive = FALSE; break; case 'q': // quoted string str_ptr = ( memptr * ) va_arg( argp, memptr * ); status = scanner_get_token( scanner, str_ptr, &tok_type ); if( status == PARSE_OK && tok_type != TT_QUOTEDSTRING ) { status = PARSE_NO_MATCH; // not a quoted string } break; case 'w': // optional whitespace status = scanner_get_token( scanner, &token, &tok_type ); if( status == PARSE_OK && tok_type != TT_WHITESPACE ) { // restore non-whitespace token scanner->cursor -= token.length; } break; case 'P': // current pos of scanner int_ptr = va_arg( argp, int * ); assert( int_ptr != NULL ); *int_ptr = scanner->cursor; break; // valid only in matchstr() case '0': // end of msg? // check that we are 1 beyond last char if( scanner->cursor == scanner->msg->length && scanner->msg->buf[scanner->cursor] == '\0' ) { status = PARSE_OK; } else { status = PARSE_NO_MATCH; } break; default: assert( 0 ); // unknown option } } else { switch ( c ) { case ' ': // LWS* status = skip_lws( scanner ); break; case '\t': // Whitespace status = scanner_get_token( scanner, &token, &tok_type ); if( status == PARSE_OK && tok_type != TT_WHITESPACE ) { // not whitespace token status = PARSE_NO_MATCH; } break; default: // match characters { status = match_char( scanner, c, case_sensitive ); } } } } if( status != PARSE_OK ) { // on error, restore original scanner pos scanner->cursor = save_pos; } return status; } /************************************************************************ * Function: match * * Parameters: * INOUT scanner_t* scanner ; Scanner Object * IN const char* fmt; Pattern format * ... * * Description: matches a variable parameter list and takes necessary * actions based on the data type specified. * * Returns: * PARSE_OK * PARSE_NO_MATCH * PARSE_INCOMPLETE ************************************************************************/ static int match( INOUT scanner_t * scanner, IN const char *fmt, ... ) { int ret_code; va_list args; va_start( args, fmt ); ret_code = vfmatch( scanner, fmt, args ); va_end( args ); return ret_code; } /************************************************************************ * Function: matchstr * * Parameters: * IN char *str ; String to be matched * IN size_t slen ; Length of the string * IN const char* fmt ; Pattern format * ... * * Description: Matches a variable parameter list with a string * and takes actions based on the data type specified. * * Returns: * PARSE_OK * PARSE_NO_MATCH -- failure to match pattern 'fmt' * PARSE_FAILURE -- 'str' is bad input ************************************************************************/ int matchstr( IN char *str, IN size_t slen, IN const char *fmt, ... ) { int ret_code; char save_char; scanner_t scanner; membuffer buf; va_list arg_list; // null terminate str save_char = str[slen]; str[slen] = '\0'; membuffer_init( &buf ); // under no circumstances should this buffer be modifed because its memory // might have not come from malloc() membuffer_attach( &buf, str, slen ); scanner_init( &scanner, &buf ); scanner.entire_msg_loaded = TRUE; va_start( arg_list, fmt ); ret_code = vfmatch( &scanner, fmt, arg_list ); va_end( arg_list ); // restore str str[slen] = save_char; // don't destroy buf return ret_code; } /************************************************************************ * Function: parser_init * * Parameters: * OUT http_parser_t* parser ; HTTP Parser object * * Description: Initializes the parser object. * * Returns: * void ************************************************************************/ static UPNP_INLINE void parser_init( OUT http_parser_t * parser ) { memset( parser, 0, sizeof( http_parser_t ) ); parser->http_error_code = HTTP_BAD_REQUEST; // err msg by default parser->ent_position = ENTREAD_DETERMINE_READ_METHOD; parser->valid_ssdp_notify_hack = FALSE; httpmsg_init( &parser->msg ); scanner_init( &parser->scanner, &parser->msg.msg ); } /************************************************************************ * Function: parser_parse_requestline * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Get HTTP Method, URL location and version information. * * Returns: * PARSE_OK * PARSE_SUCCESS * PARSE_FAILURE ************************************************************************/ static parse_status_t parser_parse_requestline( INOUT http_parser_t * parser ) { parse_status_t status; http_message_t *hmsg = &parser->msg; memptr method_str; memptr version_str; int index; char save_char; int num_scanned; memptr url_str; assert( parser->position == POS_REQUEST_LINE ); status = skip_blank_lines( &parser->scanner ); if( status != PARSE_OK ) { return status; } //simple get http 0.9 as described in http 1.0 spec status = match( &parser->scanner, "%s\t%S%w%c", &method_str, &url_str ); if( status == PARSE_OK ) { index = map_str_to_int( method_str.buf, method_str.length, Http_Method_Table, NUM_HTTP_METHODS, TRUE ); if( index < 0 ) { // error; method not found parser->http_error_code = HTTP_NOT_IMPLEMENTED; return PARSE_FAILURE; } if( Http_Method_Table[index].id != HTTPMETHOD_GET ) { parser->http_error_code = HTTP_BAD_REQUEST; return PARSE_FAILURE; } hmsg->method = HTTPMETHOD_SIMPLEGET; // store url hmsg->urlbuf = str_alloc( url_str.buf, url_str.length ); if( hmsg->urlbuf == NULL ) { // out of mem parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } if( parse_uri( hmsg->urlbuf, url_str.length, &hmsg->uri ) != HTTP_SUCCESS ) { return PARSE_FAILURE; } parser->position = POS_COMPLETE; // move to headers return PARSE_SUCCESS; } status = match( &parser->scanner, "%s\t%S\t%ihttp%w/%w%L%c", &method_str, &url_str, &version_str ); if( status != PARSE_OK ) { return status; } // store url hmsg->urlbuf = str_alloc( url_str.buf, url_str.length ); if( hmsg->urlbuf == NULL ) { // out of mem parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } if( parse_uri( hmsg->urlbuf, url_str.length, &hmsg->uri ) != HTTP_SUCCESS ) { return PARSE_FAILURE; } // scan version save_char = version_str.buf[version_str.length]; version_str.buf[version_str.length] = '\0'; // null-terminate num_scanned = sscanf( version_str.buf, "%d . %d", &hmsg->major_version, &hmsg->minor_version ); version_str.buf[version_str.length] = save_char; // restore if( num_scanned != 2 || hmsg->major_version < 0 || hmsg->minor_version < 0 ) { // error; bad http version return PARSE_FAILURE; } index = map_str_to_int( method_str.buf, method_str.length, Http_Method_Table, NUM_HTTP_METHODS, TRUE ); if( index < 0 ) { // error; method not found parser->http_error_code = HTTP_NOT_IMPLEMENTED; return PARSE_FAILURE; } hmsg->method = Http_Method_Table[index].id; parser->position = POS_HEADERS; // move to headers return PARSE_OK; } /************************************************************************ * Function: parser_parse_responseline * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Get HTTP Method, URL location and version information. * * Returns: * PARSE_OK * PARSE_SUCCESS * PARSE_FAILURE ************************************************************************/ parse_status_t parser_parse_responseline( INOUT http_parser_t * parser ) { parse_status_t status; http_message_t *hmsg = &parser->msg; memptr line; char save_char; int num_scanned; int i; char *p; assert( parser->position == POS_RESPONSE_LINE ); status = skip_blank_lines( &parser->scanner ); if( status != PARSE_OK ) { return status; } // response line //status = match( &parser->scanner, "%ihttp%w/%w%d\t.\t%d\t%d\t%L%c", // &hmsg->major_version, &hmsg->minor_version, // &hmsg->status_code, &hmsg->status_msg ); status = match( &parser->scanner, "%ihttp%w/%w%L%c", &line ); if( status != PARSE_OK ) { return status; } save_char = line.buf[line.length]; line.buf[line.length] = '\0'; // null-terminate // scan http version and ret code num_scanned = sscanf( line.buf, "%d . %d %d", &hmsg->major_version, &hmsg->minor_version, &hmsg->status_code ); line.buf[line.length] = save_char; // restore if( num_scanned != 3 || hmsg->major_version < 0 || hmsg->minor_version < 0 || hmsg->status_code < 0 ) { // bad response line return PARSE_FAILURE; } // // point to status msg // p = line.buf; // skip 3 ints for( i = 0; i < 3; i++ ) { // go to start of num while( !isdigit( *p ) ) { p++; } // skip int while( isdigit( *p ) ) { p++; } } // whitespace must exist after status code if( *p != ' ' && *p != '\t' ) { return PARSE_FAILURE; } // skip whitespace while( *p == ' ' || *p == '\t' ) { p++; } // now, p is at start of status msg if( membuffer_assign( &hmsg->status_msg, p, line.length - ( p - line.buf ) ) != 0 ) { // out of mem parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } parser->position = POS_HEADERS; // move to headers return PARSE_OK; } /************************************************************************ * Function: parser_parse_headers * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Get HTTP Method, URL location and version information. * * Returns: * PARSE_OK * PARSE_SUCCESS * PARSE_FAILURE ************************************************************************/ parse_status_t parser_parse_headers( INOUT http_parser_t * parser ) { parse_status_t status; memptr token; memptr hdr_value; token_type_t tok_type; scanner_t *scanner = &parser->scanner; size_t save_pos; http_header_t *header; int header_id; int ret = 0; int index; http_header_t *orig_header; char save_char; int ret2; assert( parser->position == POS_HEADERS || parser->ent_position == ENTREAD_CHUNKY_HEADERS ); while( TRUE ) { save_pos = scanner->cursor; // // check end of headers // status = scanner_get_token( scanner, &token, &tok_type ); if( status != PARSE_OK ) { return status; } if( tok_type == TT_CRLF ) { // end of headers if( ( parser->msg.is_request ) && ( parser->msg.method == HTTPMETHOD_POST ) ) { parser->position = POS_COMPLETE; //post entity parsing //is handled separately return PARSE_SUCCESS; } parser->position = POS_ENTITY; // read entity next return PARSE_OK; } // // not end; read header // if( tok_type != TT_IDENTIFIER ) { return PARSE_FAILURE; // didn't see header name } status = match( scanner, " : %R%c", &hdr_value ); if( status != PARSE_OK ) { // pushback tokens; useful only on INCOMPLETE error scanner->cursor = save_pos; return status; } // // add header // // find header index = map_str_to_int( token.buf, token.length, Http_Header_Names, NUM_HTTP_HEADER_NAMES, FALSE ); if( index != -1 ) { //Check if it is a soap header if( Http_Header_Names[index].id == HDR_SOAPACTION ) { parser->msg.method = SOAPMETHOD_POST; } header_id = Http_Header_Names[index].id; orig_header = httpmsg_find_hdr( &parser->msg, header_id, NULL ); } else { header_id = HDR_UNKNOWN; save_char = token.buf[token.length]; token.buf[token.length] = '\0'; orig_header = httpmsg_find_hdr_str( &parser->msg, token.buf ); token.buf[token.length] = save_char; // restore } if( orig_header == NULL ) { // // add new header // header = ( http_header_t * ) malloc( sizeof( http_header_t ) ); if( header == NULL ) { parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } membuffer_init( &header->name_buf ); membuffer_init( &header->value ); // value can be 0 length if( hdr_value.length == 0 ) { hdr_value.buf = "\0"; hdr_value.length = 1; } // save in header in buffers if( membuffer_assign ( &header->name_buf, token.buf, token.length ) != 0 || membuffer_assign( &header->value, hdr_value.buf, hdr_value.length ) != 0 ) { // not enuf mem free (header); parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } header->name.buf = header->name_buf.buf; header->name.length = header->name_buf.length; header->name_id = header_id; ListAddTail( &parser->msg.headers, header ); //NNS: ret = dlist_append( &parser->msg.headers, header ); /** TODO: remove that? */ if( ret == UPNP_E_OUTOF_MEMORY ) { parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } /** end of remove that? */ } else if( hdr_value.length > 0 ) { // // append value to existing header // // append space ret = membuffer_append_str( &orig_header->value, ", " ); // append continuation of header value ret2 = membuffer_append( &orig_header->value, hdr_value.buf, hdr_value.length ); if( ret == UPNP_E_OUTOF_MEMORY || ret2 == UPNP_E_OUTOF_MEMORY ) { // not enuf mem parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } } } // end while } //////////////////////////////////////////////////////////////////////// #ifdef HIGHLY_UNLIKELY // ************** static parse_status_t parser_parse_headers_old( INOUT http_parser_t * parser ) { parse_status_t status; memptr token; memptr hdr_value; token_type_t tok_type; scanner_t *scanner = &parser->scanner; size_t save_pos; http_header_t *header; int header_id; int ret = 0; int index; http_header_t *orig_header; char save_char; int ret2, ret3; assert( parser->position == POS_HEADERS || parser->ent_position == ENTREAD_CHUNKY_HEADERS ); while( TRUE ) { save_pos = scanner->cursor; // // check end of headers // status = scanner_get_token( scanner, &token, &tok_type ); if( status != PARSE_OK ) { return status; } if( tok_type == TT_CRLF ) { // end of headers parser->position = POS_ENTITY; // read entity next return PARSE_OK; } // // not end; read header // if( tok_type != TT_IDENTIFIER ) { return PARSE_FAILURE; // didn't see header name } status = match( scanner, " : %R%c", &hdr_value ); if( status != PARSE_OK ) { // pushback tokens; useful only on INCOMPLETE error scanner->cursor = save_pos; return status; } // // add header // // find header index = map_str_to_int( token.buf, token.length, Http_Header_Names, NUM_HTTP_HEADER_NAMES, FALSE ); if( index != -1 ) { header_id = Http_Header_Names[index].id; orig_header = httpmsg_find_hdr( &parser->msg, header_id, NULL ); } else { header_id = HDR_UNKNOWN; save_char = token.buf[token.length]; token.buf[token.length] = '\0'; orig_header = httpmsg_find_hdr_str( &parser->msg, token.buf ); token.buf[token.length] = save_char; // restore } if( orig_header == NULL ) { // // add new header // header = ( http_header_t * ) malloc( sizeof( http_header_t ) ); if( header == NULL ) { parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } membuffer_init( &header->multi_hdr_buf ); header->name = token; header->value = hdr_value; header->name_id = header_id; ret = dlist_append( &parser->msg.headers, header ); if( ret == UPNP_E_OUTOF_MEMORY ) { parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } } else if( hdr_value.length > 0 ) { // // append value to existing header // if( orig_header->multi_hdr_buf.buf == NULL ) { // store in buffer ret = membuffer_append( &orig_header->multi_hdr_buf, orig_header->value.buf, orig_header->value.length ); } // append space ret2 = membuffer_append( &orig_header->multi_hdr_buf, ", ", 2 ); // append continuation of header value ret3 = membuffer_append( &orig_header->multi_hdr_buf, hdr_value.buf, hdr_value.length ); if( ret == UPNP_E_OUTOF_MEMORY || ret2 == UPNP_E_OUTOF_MEMORY || ret3 == UPNP_E_OUTOF_MEMORY ) { // not enuf mem parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } // header value points to allocated buf orig_header->value.buf = orig_header->multi_hdr_buf.buf; orig_header->value.length = orig_header->multi_hdr_buf.length; } } // end while } #endif // ****************************** /************************************************************************ * Function: parser_parse_entity_using_clen * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: reads entity using content-length * * Returns: * PARSE_INCOMPLETE * PARSE_FAILURE -- entity length > content-length value * PARSE_SUCCESS ************************************************************************/ static UPNP_INLINE parse_status_t parser_parse_entity_using_clen( INOUT http_parser_t * parser ) { //int entity_length; assert( parser->ent_position == ENTREAD_USING_CLEN ); // determine entity (i.e. body) length so far //entity_length = parser->msg.msg.length - parser->entity_start_position; parser->msg.entity.length = parser->msg.msg.length - parser->entity_start_position; if( parser->msg.entity.length < parser->content_length ) { // more data to be read return PARSE_INCOMPLETE; } else { if( parser->msg.entity.length > parser->content_length ) { // silently discard extra data parser->msg.msg.buf[parser->entity_start_position + parser->content_length] = '\0'; } // save entity length parser->msg.entity.length = parser->content_length; // save entity start ptr; (the very last thing to do) parser->msg.entity.buf = parser->msg.msg.buf + parser->entity_start_position; // done reading entity parser->position = POS_COMPLETE; return PARSE_SUCCESS; } } /************************************************************************ * Function: parser_parse_chunky_body * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Read data in the chunks * * Returns: * PARSE_INCOMPLETE * PARSE_FAILURE -- entity length > content-length value * PARSE_SUCCESS ************************************************************************/ static UPNP_INLINE parse_status_t parser_parse_chunky_body( INOUT http_parser_t * parser ) { parse_status_t status; size_t save_pos; // if 'chunk_size' of bytes have been read; read next chunk if( ( int )( parser->msg.msg.length - parser->scanner.cursor ) >= parser->chunk_size ) { // move to next chunk parser->scanner.cursor += parser->chunk_size; save_pos = parser->scanner.cursor; //discard CRLF status = match( &parser->scanner, "%c" ); if( status != PARSE_OK ) { parser->scanner.cursor -= parser->chunk_size; //move back //parser->scanner.cursor = save_pos; return status; } membuffer_delete( &parser->msg.msg, save_pos, ( parser->scanner.cursor - save_pos ) ); parser->scanner.cursor = save_pos; parser->msg.entity.length += parser->chunk_size; //update temp parser->ent_position = ENTREAD_USING_CHUNKED; return PARSE_CONTINUE_1; } else { return PARSE_INCOMPLETE; // need more data for chunk } } /************************************************************************ * Function: parser_parse_chunky_headers * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Read headers at the end of the chunked entity * * Returns: * PARSE_INCOMPLETE * PARSE_FAILURE -- entity length > content-length value * PARSE_SUCCESS ************************************************************************/ static UPNP_INLINE parse_status_t parser_parse_chunky_headers( INOUT http_parser_t * parser ) { parse_status_t status; size_t save_pos; save_pos = parser->scanner.cursor; status = parser_parse_headers( parser ); if( status == PARSE_OK ) { // finally, done with the whole msg parser->position = POS_COMPLETE; // save entity start ptr as the very last thing to do parser->msg.entity.buf = parser->msg.msg.buf + parser->entity_start_position; membuffer_delete( &parser->msg.msg, save_pos, ( parser->scanner.cursor - save_pos ) ); parser->scanner.cursor = save_pos; return PARSE_SUCCESS; } else { return status; } } /************************************************************************ * Function: parser_parse_chunky_entity * * Parameters: * INOUT http_parser_t* parser - HTTP Parser Object * * Description: Read headers at the end of the chunked entity * * Returns: * PARSE_INCOMPLETE * PARSE_FAILURE -- entity length > content-length value * PARSE_SUCCESS * PARSE_CONTINUE_1 ************************************************************************/ static UPNP_INLINE parse_status_t parser_parse_chunky_entity( INOUT http_parser_t * parser ) { scanner_t *scanner = &parser->scanner; parse_status_t status; size_t save_pos; memptr dummy; assert( parser->ent_position == ENTREAD_USING_CHUNKED ); save_pos = scanner->cursor; // get size of chunk, discard extension, discard CRLF status = match( scanner, "%x%L%c", &parser->chunk_size, &dummy ); if( status != PARSE_OK ) { scanner->cursor = save_pos; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "CHUNK COULD NOT BE PARSED\n" ); return status; } // remove chunk info just matched; just retain data membuffer_delete( &parser->msg.msg, save_pos, ( scanner->cursor - save_pos ) ); scanner->cursor = save_pos; // adjust scanner too if( parser->chunk_size == 0 ) { // done reading entity; determine length of entity parser->msg.entity.length = parser->scanner.cursor - parser->entity_start_position; // read entity headers parser->ent_position = ENTREAD_CHUNKY_HEADERS; } else { // read chunk body parser->ent_position = ENTREAD_CHUNKY_BODY; } return PARSE_CONTINUE_1; // continue to reading body } /************************************************************************ * Function: parser_parse_entity_until_close * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Read headers at the end of the chunked entity * * Returns: * PARSE_INCOMPLETE_ENTITY ************************************************************************/ static UPNP_INLINE parse_status_t parser_parse_entity_until_close( INOUT http_parser_t * parser ) { size_t cursor; assert( parser->ent_position == ENTREAD_UNTIL_CLOSE ); // eat any and all data cursor = parser->msg.msg.length; // update entity length parser->msg.entity.length = cursor - parser->entity_start_position; // update pointer parser->msg.entity.buf = parser->msg.msg.buf + parser->entity_start_position; parser->scanner.cursor = cursor; return PARSE_INCOMPLETE_ENTITY; // add anything } /************************************************************************ * Function: parser_get_entity_read_method * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Determines method to read entity * * Returns: * PARSE_OK * PARSE_FAILURE * PARSE_COMPLETE -- no more reading to do ************************************************************************/ UPNP_INLINE parse_status_t parser_get_entity_read_method( INOUT http_parser_t * parser ) { http_message_t *hmsg = &parser->msg; int response_code; memptr hdr_value; assert( parser->ent_position == ENTREAD_DETERMINE_READ_METHOD ); // entity points to start of msg body parser->msg.entity.buf = scanner_get_str( &parser->scanner ); parser->msg.entity.length = 0; // remember start of body parser->entity_start_position = parser->scanner.cursor; // std http rules for determining content length // * no body for 1xx, 204, 304 and HEAD, GET, // SUBSCRIBE, UNSUBSCRIBE if( hmsg->is_request ) { switch ( hmsg->method ) { case HTTPMETHOD_HEAD: case HTTPMETHOD_GET: //case HTTPMETHOD_POST: case HTTPMETHOD_SUBSCRIBE: case HTTPMETHOD_UNSUBSCRIBE: case HTTPMETHOD_MSEARCH: // no body; mark as done parser->position = POS_COMPLETE; return PARSE_SUCCESS; break; default: ; // do nothing } } else // response { response_code = hmsg->status_code; if( response_code == 204 || response_code == 304 || ( response_code >= 100 && response_code <= 199 ) || hmsg->request_method == HTTPMETHOD_HEAD || hmsg->request_method == HTTPMETHOD_MSEARCH || hmsg->request_method == HTTPMETHOD_SUBSCRIBE || hmsg->request_method == HTTPMETHOD_UNSUBSCRIBE || hmsg->request_method == HTTPMETHOD_NOTIFY ) { parser->position = POS_COMPLETE; return PARSE_SUCCESS; } } // * transfer-encoding -- used to indicate chunked data if( httpmsg_find_hdr( hmsg, HDR_TRANSFER_ENCODING, &hdr_value ) ) { if( raw_find_str( &hdr_value, "chunked" ) >= 0 ) { // read method to use chunked transfer encoding parser->ent_position = ENTREAD_USING_CHUNKED; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "Found Chunked Encoding ....\n" ); return PARSE_CONTINUE_1; } } // * use content length if( httpmsg_find_hdr( hmsg, HDR_CONTENT_LENGTH, &hdr_value ) ) { parser->content_length = raw_to_int( &hdr_value, 10 ); if( parser->content_length < 0 ) { // bad content-length return PARSE_FAILURE; } parser->ent_position = ENTREAD_USING_CLEN; return PARSE_CONTINUE_1; } // * multi-part/byteranges not supported (yet) // * read until connection is closed if( hmsg->is_request ) { // set hack flag for NOTIFY methods; if set to true this is // a valid SSDP notify msg if( hmsg->method == HTTPMETHOD_NOTIFY ) { parser->valid_ssdp_notify_hack = TRUE; } parser->http_error_code = HTTP_LENGTH_REQUIRED; return PARSE_FAILURE; } parser->ent_position = ENTREAD_UNTIL_CLOSE; return PARSE_CONTINUE_1; } /************************************************************************ * Function: parser_parse_entity * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: Determines method to read entity * * Returns: * PARSE_OK * PARSE_FAILURE * PARSE_COMPLETE -- no more reading to do ************************************************************************/ UPNP_INLINE parse_status_t parser_parse_entity( INOUT http_parser_t * parser ) { parse_status_t status = PARSE_OK; assert( parser->position == POS_ENTITY ); do { switch ( parser->ent_position ) { case ENTREAD_USING_CLEN: status = parser_parse_entity_using_clen( parser ); break; case ENTREAD_USING_CHUNKED: status = parser_parse_chunky_entity( parser ); break; case ENTREAD_CHUNKY_BODY: status = parser_parse_chunky_body( parser ); break; case ENTREAD_CHUNKY_HEADERS: status = parser_parse_chunky_headers( parser ); break; case ENTREAD_UNTIL_CLOSE: status = parser_parse_entity_until_close( parser ); break; case ENTREAD_DETERMINE_READ_METHOD: status = parser_get_entity_read_method( parser ); break; default: assert( 0 ); } } while( status == PARSE_CONTINUE_1 ); return status; } /************************************************************************ * Function: parser_request_init * * Parameters: * OUT http_parser_t* parser ; HTTP Parser object * * Description: Initializes parser object for a request * * Returns: * void ************************************************************************/ void parser_request_init( OUT http_parser_t * parser ) { parser_init( parser ); parser->msg.is_request = TRUE; parser->position = POS_REQUEST_LINE; } /************************************************************************ * Function: parser_response_init * * Parameters: * OUT http_parser_t* parser ; HTTP Parser object * IN http_method_t request_method ; Request method * * Description: Initializes parser object for a response * * Returns: * void ************************************************************************/ void parser_response_init( OUT http_parser_t * parser, IN http_method_t request_method ) { parser_init( parser ); parser->msg.is_request = FALSE; parser->msg.request_method = request_method; parser->position = POS_RESPONSE_LINE; } /************************************************************************ * Function: parser_parse * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser object * * Description: The parser function. Depending on the position of the * parser object the actual parsing function is invoked * * Returns: * void ************************************************************************/ parse_status_t parser_parse( INOUT http_parser_t * parser ) { parse_status_t status; //takes an http_parser_t with memory already allocated //in the message assert( parser != NULL ); do { switch ( parser->position ) { case POS_ENTITY: status = parser_parse_entity( parser ); break; case POS_HEADERS: status = parser_parse_headers( parser ); break; case POS_REQUEST_LINE: status = parser_parse_requestline( parser ); break; case POS_RESPONSE_LINE: status = parser_parse_responseline( parser ); break; default: { status = PARSE_FAILURE; assert( 0 ); } } } while( status == PARSE_OK ); return status; } /************************************************************************ * Function: parser_append * * Parameters: * INOUT http_parser_t* parser ; HTTP Parser Object * IN const char* buf ; buffer to be appended to the parser * buffer * IN size_t buf_length ; Size of the buffer * * Description: The parser function. Depending on the position of the * parser object the actual parsing function is invoked * * Returns: * void ************************************************************************/ parse_status_t parser_append( INOUT http_parser_t * parser, IN const char *buf, IN size_t buf_length ) { int ret_code; assert( parser != NULL ); assert( buf != NULL ); // append data to buffer ret_code = membuffer_append( &parser->msg.msg, buf, buf_length ); if( ret_code != 0 ) { // set failure status parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } return parser_parse( parser ); } /************************************************************************ ********** end of parser *********** ************************************************************************/ /************************************************************************ * Function: raw_to_int * * Parameters: * IN memptr* raw_value ; Buffer to be converted * IN int base ; Base to use for conversion * * Description: Converts raw character data to long-integer value * * Returns: * int ************************************************************************/ int raw_to_int( IN memptr * raw_value, IN int base ) { long num; char *end_ptr; if( raw_value->length == 0 ) { return -1; } errno = 0; num = strtol( raw_value->buf, &end_ptr, base ); if( ( num < 0 ) // all and only those chars in token should be used for num || ( end_ptr != raw_value->buf + raw_value->length ) || ( ( num == LONG_MIN || num == LONG_MAX ) && ( errno == ERANGE ) ) ) { return -1; } return num; } /************************************************************************ * Function: raw_find_str * * Parameters: * IN memptr* raw_value ; Buffer containg the string * IN const char* str ; Substring to be found * * Description: Find a substring from raw character string buffer * * Side effects: raw_value is transformed to lowercase. * * Returns: * int - index at which the substring is found. ************************************************************************/ int raw_find_str( IN memptr *raw_value, IN const char *str ) { char c; char *ptr; int i = 0; // save c = raw_value->buf[raw_value->length]; // Make it lowercase for (i = 0; raw_value->buf[i]; ++i) { raw_value->buf[i] = tolower(raw_value->buf[i]); } // null-terminate raw_value->buf[raw_value->length] = 0; // Find the substring position ptr = strstr( raw_value->buf, str ); // restore the "length" byte raw_value->buf[raw_value->length] = c; if( ptr == 0 ) { return -1; } // return index return ptr - raw_value->buf; } /************************************************************************ * Function: method_to_str * * Parameters: * IN http_method_t method ; HTTP method * * Description: A wrapper function that maps a method id to a method * nameConverts a http_method id stored in the HTTP Method * * Returns: * const char* ptr - Ptr to the HTTP Method ************************************************************************/ const char * method_to_str( IN http_method_t method ) { int index; index = map_int_to_str( method, Http_Method_Table, NUM_HTTP_METHODS ); assert( index != -1 ); return index == -1 ? NULL : Http_Method_Table[index].name; } #ifdef DEBUG void print_http_headers(http_message_t *hmsg) { ListNode *node; /* NNS: dlist_node *node; */ http_header_t *header; /* print start line */ if( hmsg->is_request ) { printf( "method = %d, version = %d.%d, url = %.*s\n", hmsg->method, hmsg->major_version, hmsg->minor_version, (int)hmsg->uri.pathquery.size, hmsg->uri.pathquery.buff); } else { printf( "resp status = %d, version = %d.%d, status msg = %.*s\n", hmsg->status_code, hmsg->major_version, hmsg->minor_version, (int)hmsg->status_msg.length, hmsg->status_msg.buf); } /* print headers */ node = ListHead( &hmsg->headers ); /* NNS: node = dlist_first_node( &hmsg->headers ); */ while( node != NULL ) { header = ( http_header_t * ) node->item; /* NNS: header = (http_header_t *)node->data; */ printf( "hdr name: %.*s, value: %.*s\n", (int)header->name.length, header->name.buf, (int)header->value.length, header->value.buf ); node = ListNext( &hmsg->headers, node ); /* NNS: node = dlist_next( &hmsg->headers, node ); */ } } #endif libupnp-1.8.0~svn20100507/upnp/src/genlib/net/http/webserver.c0000644000175000017500000015115511025042301020600 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ /****************************************************************************** * Purpose: This file defines the Web Server and has functions to carry out * operations of the Web Server. ******************************************************************************/ #include "config.h" #include "webserver.h" #include "FileInfo.h" #include "httpparser.h" #include "httpreadwrite.h" #include "ithread.h" #include "membuffer.h" #include "ssdplib.h" #include "statcodes.h" #include "strintmap.h" #include "unixutil.h" #include "upnp.h" #include "upnpapi.h" #include "util.h" #include "VirtualDir.h" #include #include #include #ifdef UPNP_USE_BCBPP /* Do not #include */ /* Do not #include */ #else #include #include #endif /* !UPNP_USE_BCBPP */ #ifdef WIN32 /* Do not #include */ #else #include #endif /* Response Types */ enum resp_type { RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC, RESP_POST }; // mapping of file extension to content-type of document struct document_type_t { const char *file_ext; const char *content_type; const char *content_subtype; }; struct xml_alias_t { membuffer name; // name of DOC from root; e.g.: /foo/bar/mydesc.xml membuffer doc; // the XML document contents time_t last_modified; int *ct; }; static const char *gMediaTypes[] = { NULL, // 0 "audio", // 1 "video", // 2 "image", // 3 "application", // 4 "text" // 5 }; /* Defines */ // index into 'gMediaTypes' #define AUDIO_STR "\1" #define VIDEO_STR "\2" #define IMAGE_STR "\3" #define APPLICATION_STR "\4" #define TEXT_STR "\5" // int index #define APPLICATION_INDEX 4 #define TEXT_INDEX 5 // general #define NUM_MEDIA_TYPES 69 #define NUM_HTTP_HEADER_NAMES 33 // sorted by file extension; must have 'NUM_MEDIA_TYPES' extensions static const char *gEncodedMediaTypes = "aif\0" AUDIO_STR "aiff\0" "aifc\0" AUDIO_STR "aiff\0" "aiff\0" AUDIO_STR "aiff\0" "asf\0" VIDEO_STR "x-ms-asf\0" "asx\0" VIDEO_STR "x-ms-asf\0" "au\0" AUDIO_STR "basic\0" "avi\0" VIDEO_STR "msvideo\0" "bmp\0" IMAGE_STR "bmp\0" "dcr\0" APPLICATION_STR "x-director\0" "dib\0" IMAGE_STR "bmp\0" "dir\0" APPLICATION_STR "x-director\0" "dxr\0" APPLICATION_STR "x-director\0" "gif\0" IMAGE_STR "gif\0" "hta\0" TEXT_STR "hta\0" "htm\0" TEXT_STR "html\0" "html\0" TEXT_STR "html\0" "jar\0" APPLICATION_STR "java-archive\0" "jfif\0" IMAGE_STR "pjpeg\0" "jpe\0" IMAGE_STR "jpeg\0" "jpeg\0" IMAGE_STR "jpeg\0" "jpg\0" IMAGE_STR "jpeg\0" "js\0" APPLICATION_STR "x-javascript\0" "kar\0" AUDIO_STR "midi\0" "m3u\0" AUDIO_STR "mpegurl\0" "mid\0" AUDIO_STR "midi\0" "midi\0" AUDIO_STR "midi\0" "mov\0" VIDEO_STR "quicktime\0" "mp2v\0" VIDEO_STR "x-mpeg2\0" "mp3\0" AUDIO_STR "mpeg\0" "mpe\0" VIDEO_STR "mpeg\0" "mpeg\0" VIDEO_STR "mpeg\0" "mpg\0" VIDEO_STR "mpeg\0" "mpv\0" VIDEO_STR "mpeg\0" "mpv2\0" VIDEO_STR "x-mpeg2\0" "pdf\0" APPLICATION_STR "pdf\0" "pjp\0" IMAGE_STR "jpeg\0" "pjpeg\0" IMAGE_STR "jpeg\0" "plg\0" TEXT_STR "html\0" "pls\0" AUDIO_STR "scpls\0" "png\0" IMAGE_STR "png\0" "qt\0" VIDEO_STR "quicktime\0" "ram\0" AUDIO_STR "x-pn-realaudio\0" "rmi\0" AUDIO_STR "mid\0" "rmm\0" AUDIO_STR "x-pn-realaudio\0" "rtf\0" APPLICATION_STR "rtf\0" "shtml\0" TEXT_STR "html\0" "smf\0" AUDIO_STR "midi\0" "snd\0" AUDIO_STR "basic\0" "spl\0" APPLICATION_STR "futuresplash\0" "ssm\0" APPLICATION_STR "streamingmedia\0" "swf\0" APPLICATION_STR "x-shockwave-flash\0" "tar\0" APPLICATION_STR "tar\0" "tcl\0" APPLICATION_STR "x-tcl\0" "text\0" TEXT_STR "plain\0" "tif\0" IMAGE_STR "tiff\0" "tiff\0" IMAGE_STR "tiff\0" "txt\0" TEXT_STR "plain\0" "ulw\0" AUDIO_STR "basic\0" "wav\0" AUDIO_STR "wav\0" "wax\0" AUDIO_STR "x-ms-wax\0" "wm\0" VIDEO_STR "x-ms-wm\0" "wma\0" AUDIO_STR "x-ms-wma\0" "wmv\0" VIDEO_STR "x-ms-wmv\0" "wvx\0" VIDEO_STR "x-ms-wvx\0" "xbm\0" IMAGE_STR "x-xbitmap\0" "xml\0" TEXT_STR "xml\0" "xsl\0" TEXT_STR "xml\0" "z\0" APPLICATION_STR "x-compress\0" "zip\0" APPLICATION_STR "zip\0" "\0"; // *** end *** /************************************************************************ module variables - Globals, static and externs ************************************************************************/ static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES]; membuffer gDocumentRootDir; // a local dir which serves as webserver root static struct xml_alias_t gAliasDoc; // XML document static ithread_mutex_t gWebMutex; extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES]; /************************************************************************ * Function: has_xml_content_type * * Parameters: * none * * Description: decodes list and stores it in gMediaTypeList * * Returns: * void ************************************************************************/ static UPNP_INLINE void media_list_init( void ) { int i; const char *s = gEncodedMediaTypes; struct document_type_t *doc_type; for( i = 0; *s != '\0'; i++ ) { doc_type = &gMediaTypeList[i]; doc_type->file_ext = s; s += strlen( s ) + 1; // point to type doc_type->content_type = gMediaTypes[( int )*s]; // set cont-type s++; // point to subtype doc_type->content_subtype = s; s += strlen( s ) + 1; // next entry } assert( i == NUM_MEDIA_TYPES ); } /************************************************************************ * Function: has_xml_content_type * * Parameters: * IN const char* extension ; * OUT const char** con_type, * OUT const char** con_subtype * * Description: Based on the extension, returns the content type and * content subtype * * Returns: * 0 on success; * -1 on error ************************************************************************/ static UPNP_INLINE int search_extension( IN const char *extension, OUT const char **con_type, OUT const char **con_subtype ) { int top, mid, bot; int cmp; top = 0; bot = NUM_MEDIA_TYPES - 1; while( top <= bot ) { mid = ( top + bot ) / 2; cmp = strcasecmp( extension, gMediaTypeList[mid].file_ext ); if( cmp > 0 ) { top = mid + 1; // look below mid } else if( cmp < 0 ) { bot = mid - 1; // look above mid } else // cmp == 0 { *con_type = gMediaTypeList[mid].content_type; *con_subtype = gMediaTypeList[mid].content_subtype; return 0; } } return -1; } /************************************************************************ * Function: get_content_type * * Parameters: * IN const char* filename, * OUT UpnpFileInfo *fileInfo * * Description: Based on the extension, sets the content type of fileInfo * based on type and content subtype. If content type and sub type * are not found, unknown types are used * * Returns: * 0 - On Sucess * UPNP_E_OUTOF_MEMORY - on memory allocation failures ************************************************************************/ UPNP_INLINE int get_content_type( IN const char *filename, OUT UpnpFileInfo *fileInfo) { const char *extension; const char *type; const char *subtype; xboolean ctype_found = FALSE; char *temp = NULL; int length = 0; UpnpFileInfo_set_ContentType(fileInfo, NULL); // get ext extension = strrchr( filename, '.' ); if (extension != NULL) { if( search_extension( extension + 1, &type, &subtype ) == 0 ) { ctype_found = TRUE; } } if (!ctype_found) { // unknown content type type = gMediaTypes[APPLICATION_INDEX]; subtype = "octet-stream"; } length = strlen( type ) + strlen( "/" ) + strlen( subtype ) + 1; temp = ( char * )malloc( length ); if (!temp) { return UPNP_E_OUTOF_MEMORY; } sprintf( temp, "%s/%s", type, subtype ); UpnpFileInfo_set_ContentType(fileInfo, temp); free(temp); if (!UpnpFileInfo_get_ContentType(fileInfo)) { return UPNP_E_OUTOF_MEMORY; } return 0; } /************************************************************************ * Function: glob_alias_init * * Parameters: * none * * Description: Initialize the global XML document. Allocate buffers * for the XML document * * Returns: * void ************************************************************************/ static UPNP_INLINE void glob_alias_init( void ) { struct xml_alias_t *alias = &gAliasDoc; membuffer_init( &alias->doc ); membuffer_init( &alias->name ); alias->ct = NULL; alias->last_modified = 0; } /************************************************************************ * Function: is_valid_alias * * Parameters: * IN const struct xml_alias_t* alias ; XML alias object * * Description: Check for the validity of the XML object buffer * * Returns: * BOOLEAN ************************************************************************/ static UPNP_INLINE xboolean is_valid_alias( IN const struct xml_alias_t *alias ) { return alias->doc.buf != NULL; } /************************************************************************ * Function: alias_grab * * Parameters: * OUT struct xml_alias_t* alias ; XML alias object * * Description: Copy the contents of the global XML document into the * local OUT parameter * * Returns: * void ************************************************************************/ static void alias_grab( OUT struct xml_alias_t *alias ) { ithread_mutex_lock( &gWebMutex ); assert( is_valid_alias( &gAliasDoc ) ); memcpy( alias, &gAliasDoc, sizeof( struct xml_alias_t ) ); *alias->ct = *alias->ct + 1; ithread_mutex_unlock( &gWebMutex ); } /************************************************************************ * Function: alias_release * * Parameters: * IN struct xml_alias_t* alias ; XML alias object * * Description: Release the XML document referred to by the IN parameter * Free the allocated buffers associated with this object * * Returns: * void ************************************************************************/ static void alias_release( IN struct xml_alias_t *alias ) { ithread_mutex_lock( &gWebMutex ); // ignore invalid alias if( !is_valid_alias( alias ) ) { ithread_mutex_unlock( &gWebMutex ); return; } assert( alias->ct > 0 ); *alias->ct = *alias->ct - 1; if( *alias->ct <= 0 ) { membuffer_destroy( &alias->doc ); membuffer_destroy( &alias->name ); free( alias->ct ); } ithread_mutex_unlock( &gWebMutex ); } /************************************************************************ * Function: web_server_set_alias * * Parameters: * alias_name: webserver name of alias; created by caller and freed by * caller (doesn't even have to be malloc()d .) * alias_content: the xml doc; this is allocated by the caller; and * freed by the web server * alias_content_length: length of alias body in bytes * last_modified: time when the contents of alias were last * changed (local time) * * Description: Replaces current alias with the given alias. To remove * the current alias, set alias_name to NULL. * * Returns: * 0 - OK * UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here ************************************************************************/ int web_server_set_alias( IN const char *alias_name, IN const char *alias_content, IN size_t alias_content_length, IN time_t last_modified ) { int ret_code; struct xml_alias_t alias; alias_release( &gAliasDoc ); if( alias_name == NULL ) { // don't serve aliased doc anymore return 0; } assert( alias_content != NULL ); membuffer_init( &alias.doc ); membuffer_init( &alias.name ); alias.ct = NULL; do { // insert leading /, if missing if( *alias_name != '/' ) { if( membuffer_assign_str( &alias.name, "/" ) != 0 ) { break; // error; out of mem } } ret_code = membuffer_append_str( &alias.name, alias_name ); if( ret_code != 0 ) { break; // error } if( ( alias.ct = ( int * )malloc( sizeof( int ) ) ) == NULL ) { break; // error } *alias.ct = 1; membuffer_attach( &alias.doc, ( char * )alias_content, alias_content_length ); alias.last_modified = last_modified; // save in module var ithread_mutex_lock( &gWebMutex ); gAliasDoc = alias; ithread_mutex_unlock( &gWebMutex ); return 0; } while( FALSE ); // error handler // free temp alias membuffer_destroy( &alias.name ); membuffer_destroy( &alias.doc ); free( alias.ct ); return UPNP_E_OUTOF_MEMORY; } int web_server_init() { int ret = 0; if (bWebServerState == WEB_SERVER_DISABLED) { // decode media list media_list_init(); membuffer_init(&gDocumentRootDir); glob_alias_init(); pVirtualDirList = NULL; // Initialize callbacks virtualDirCallback.get_info = NULL; virtualDirCallback.open = NULL; virtualDirCallback.read = NULL; virtualDirCallback.write = NULL; virtualDirCallback.seek = NULL; virtualDirCallback.close = NULL; if (ithread_mutex_init(&gWebMutex, NULL) == -1) { ret = UPNP_E_OUTOF_MEMORY; } else { bWebServerState = WEB_SERVER_ENABLED; } } return ret; } /************************************************************************ * Function: web_server_destroy * * Parameters: * none * * Description: Release memory allocated for the global web server root * directory and the global XML document * Resets the flag bWebServerState to WEB_SERVER_DISABLED * * Returns: * void ************************************************************************/ void web_server_destroy( void ) { int ret; if( bWebServerState == WEB_SERVER_ENABLED ) { membuffer_destroy( &gDocumentRootDir ); alias_release( &gAliasDoc ); ithread_mutex_lock( &gWebMutex ); memset( &gAliasDoc, 0, sizeof( struct xml_alias_t ) ); ithread_mutex_unlock( &gWebMutex ); ret = ithread_mutex_destroy( &gWebMutex ); assert( ret == 0 ); bWebServerState = WEB_SERVER_DISABLED; } } /************************************************************************ * Function: get_file_info * * Parameters: * IN const char *filename; Filename having the description document * OUT UpnpFileInfo *info; File information object having file * attributes such as filelength, when was the file last * modified, whether a file or a directory and whether the * file or directory is readable. * * Description: Release memory allocated for the global web server root * directory and the global XML document * Resets the flag bWebServerState to WEB_SERVER_DISABLED * * Returns: * int ************************************************************************/ static int get_file_info( IN const char *filename, OUT UpnpFileInfo *info) { int code; struct stat s; FILE *fp; int rc = 0; UpnpFileInfo_set_ContentType(info, NULL); code = stat(filename, &s); if (code == -1) { return -1; } if (S_ISDIR(s.st_mode)) { UpnpFileInfo_set_IsDirectory(info, TRUE); } else if (S_ISREG(s.st_mode)) { UpnpFileInfo_set_IsDirectory(info, FALSE); } else { return -1; } // check readable fp = fopen(filename, "r"); UpnpFileInfo_set_IsReadable(info, fp != NULL); if (fp) { fclose(fp); } UpnpFileInfo_set_FileLength(info, s.st_size); UpnpFileInfo_set_LastModified(info, &s.st_mtime); rc = get_content_type(filename, info); UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "file info: %s, length: %lld, last_mod=%s readable=%d\n", filename, (long long)UpnpFileInfo_get_FileLength(info), asctime(gmtime(UpnpFileInfo_get_LastModified(info))), UpnpFileInfo_get_IsReadable(info)); return rc; } /************************************************************************ * Function: web_server_set_root_dir * * Parameters: * IN const char* root_dir ; String having the root directory for the * document * * Description: Assign the path specfied by the IN const char* root_dir * parameter to the global Document root directory. Also check for * path names ending in '/' * * Returns: * int ************************************************************************/ int web_server_set_root_dir( IN const char *root_dir ) { int index; int ret; ret = membuffer_assign_str( &gDocumentRootDir, root_dir ); if( ret != 0 ) { return ret; } // remove trailing '/', if any if( gDocumentRootDir.length > 0 ) { index = gDocumentRootDir.length - 1; // last char if( gDocumentRootDir.buf[index] == '/' ) { membuffer_delete( &gDocumentRootDir, index, 1 ); } } return 0; } /************************************************************************ * Function: get_alias * * Parameters: * IN const char *request_file; request file passed in to be compared with * OUT struct xml_alias_t* alias ; xml alias object which has a file name * stored * OUT UpnpFileInfo *info; File information object which will be * filled up if the file comparison succeeds * * Description: Compare the files names between the one on the XML alias * the one passed in as the input parameter. If equal extract file * information * * Returns: * TRUE - On Success * FALSE if request is not an alias ************************************************************************/ static UPNP_INLINE xboolean get_alias( IN const char *request_file, OUT struct xml_alias_t *alias, OUT UpnpFileInfo *info) { int cmp = strcmp(alias->name.buf, request_file); if (cmp == 0) { // fill up info UpnpFileInfo_set_FileLength(info, alias->doc.length); UpnpFileInfo_set_IsDirectory(info, FALSE); UpnpFileInfo_set_IsReadable(info, TRUE); UpnpFileInfo_set_LastModified(info, &alias->last_modified); } return cmp == 0; } /************************************************************************ * Function: isFileInVirtualDir * * Parameters: * IN char *filePath ; directory path to be tested for virtual directory * * Description: Compares filePath with paths from the list of virtual * directory lists * * Returns: * BOOLEAN ************************************************************************/ int isFileInVirtualDir( IN char *filePath ) { virtualDirList *pCurVirtualDir; int webDirLen; pCurVirtualDir = pVirtualDirList; while( pCurVirtualDir != NULL ) { webDirLen = strlen( pCurVirtualDir->dirName ); if( pCurVirtualDir->dirName[webDirLen - 1] == '/' ) { if( strncmp( pCurVirtualDir->dirName, filePath, webDirLen ) == 0 ) return TRUE; } else { if( ( strncmp( pCurVirtualDir->dirName, filePath, webDirLen ) == 0 ) && ( filePath[webDirLen] == '/' || filePath[webDirLen] == '\0' || filePath[webDirLen] == '?' ) ) return TRUE; } pCurVirtualDir = pCurVirtualDir->next; } return FALSE; } /************************************************************************ * Function: ToUpperCase * * Parameters: * INOUT char * Str ; Input string to be converted * * Description: Converts input string to upper case * * Returns: * int ************************************************************************/ int ToUpperCase( char *Str ) { int i; for( i = 0; i < ( int )strlen( Str ); i++ ) Str[i] = toupper( Str[i] ); return 1; } /************************************************************************ * Function: StrStr * * Parameters: * IN char * S1 ; Input string * IN char * S2 ; Input sub-string * * Description: Finds a substring from a string * * Returns: * char * ptr - pointer to the first occurence of S2 in S1 ************************************************************************/ char * StrStr( char *S1, char *S2 ) { char *Str1, *Str2; char *Ptr, *Ret; int Pos; Str1 = ( char * )malloc( strlen( S1 ) + 2 ); if(!Str1) return NULL; Str2 = ( char * )malloc( strlen( S2 ) + 2 ); if (!Str2) { free(Str1); return NULL; } strcpy( Str1, S1 ); strcpy( Str2, S2 ); ToUpperCase( Str1 ); ToUpperCase( Str2 ); Ptr = strstr( Str1, Str2 ); if( Ptr == NULL ) return NULL; Pos = Ptr - Str1; Ret = S1 + Pos; free( Str1 ); free( Str2 ); return Ret; } /************************************************************************ * Function: StrTok * * Parameters: * IN char ** Src ; String containing the token * IN char * del ; Set of delimiter characters * * Description: Finds next token in a string * * Returns: * char * ptr - pointer to the first occurence of S2 in S1 ************************************************************************/ char * StrTok( char **Src, char *Del ) { char *TmpPtr, *RetPtr; if( *Src != NULL ) { RetPtr = *Src; TmpPtr = strstr( *Src, Del ); if( TmpPtr != NULL ) { *TmpPtr = '\0'; *Src = TmpPtr + strlen( Del ); } else *Src = NULL; return RetPtr; } return NULL; } /************************************************************************ * Function: GetNextRange * * Parameters: * IN char ** SrcRangeStr ; string containing the token / range * OUT int * FirstByte ; gets the first byte of the token * OUT int * LastByte ; gets the last byte of the token * * Description: Returns a range of integers from a string * * Returns: int ; * always returns 1; ************************************************************************/ int GetNextRange( char **SrcRangeStr, off_t *FirstByte, off_t *LastByte ) { char *Ptr; char *Tok; int i; int64_t F = -1; int64_t L = -1; int Is_Suffix_byte_Range = 1; if( *SrcRangeStr == NULL ) { return -1; } Tok = StrTok( SrcRangeStr, "," ); if( ( Ptr = strstr( Tok, "-" ) ) == NULL ) { return -1; } *Ptr = ' '; sscanf( Tok, "%"SCNd64"%"SCNd64, &F, &L ); if( F == -1 || L == -1 ) { *Ptr = '-'; for( i = 0; i < ( int )strlen( Tok ); i++ ) { if( Tok[i] == '-' ) { break; } else if( isdigit( Tok[i] ) ) { Is_Suffix_byte_Range = 0; break; } } if( Is_Suffix_byte_Range ) { *FirstByte = (off_t)L; *LastByte = (off_t)F; return 1; } } *FirstByte = (off_t)F; *LastByte = (off_t)L; return 1; } /************************************************************************ * Function: CreateHTTPRangeResponseHeader * * Parameters: * char * ByteRangeSpecifier ; String containing the range * long FileLength ; Length of the file * OUT struct SendInstruction * Instr ; SendInstruction object * where the range operations will be stored * * Description: Fills in the Offset, read size and contents to send out * as an HTTP Range Response * * Returns: * HTTP_BAD_REQUEST * UPNP_E_OUTOF_MEMORY * HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_OK ************************************************************************/ int CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, off_t FileLength, OUT struct SendInstruction *Instr ) { off_t FirstByte, LastByte; char *RangeInput, *Ptr; Instr->IsRangeActive = 1; Instr->ReadSendSize = FileLength; if( !ByteRangeSpecifier ) return HTTP_BAD_REQUEST; RangeInput = malloc( strlen( ByteRangeSpecifier ) + 1 ); if( !RangeInput ) return UPNP_E_OUTOF_MEMORY; strcpy( RangeInput, ByteRangeSpecifier ); //CONTENT-RANGE: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT if( StrStr( RangeInput, "bytes" ) == NULL || ( Ptr = StrStr( RangeInput, "=" ) ) == NULL ) { free( RangeInput ); Instr->IsRangeActive = 0; return HTTP_BAD_REQUEST; } //Jump = Ptr = Ptr + 1; if( FileLength < 0 ) { free( RangeInput ); return HTTP_REQUEST_RANGE_NOT_SATISFIABLE; } if( GetNextRange( &Ptr, &FirstByte, &LastByte ) != -1 ) { if( FileLength < FirstByte ) { free( RangeInput ); return HTTP_REQUEST_RANGE_NOT_SATISFIABLE; } if( FirstByte >= 0 && LastByte >= 0 && LastByte >= FirstByte ) { if( LastByte >= FileLength ) LastByte = FileLength - 1; Instr->RangeOffset = FirstByte; Instr->ReadSendSize = LastByte - FirstByte + 1; sprintf( Instr->RangeHeader, "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", (int64_t)FirstByte, (int64_t)LastByte, (int64_t)FileLength ); //Data between two range. } else if( FirstByte >= 0 && LastByte == -1 && FirstByte < FileLength ) { Instr->RangeOffset = FirstByte; Instr->ReadSendSize = FileLength - FirstByte; sprintf( Instr->RangeHeader, "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", (int64_t)FirstByte, (int64_t)(FileLength - 1), (int64_t)FileLength ); } else if( FirstByte == -1 && LastByte > 0 ) { if( LastByte >= FileLength ) { Instr->RangeOffset = 0; Instr->ReadSendSize = FileLength; sprintf( Instr->RangeHeader, "CONTENT-RANGE: bytes 0-%"PRId64"/%"PRId64"\r\n", (int64_t)(FileLength - 1), (int64_t)FileLength ); } else { Instr->RangeOffset = FileLength - LastByte; Instr->ReadSendSize = LastByte; sprintf( Instr->RangeHeader, "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", (int64_t)(FileLength - LastByte + 1), (int64_t)FileLength, (int64_t)FileLength ); } } else { free( RangeInput ); return HTTP_REQUEST_RANGE_NOT_SATISFIABLE; } } else { free( RangeInput ); return HTTP_REQUEST_RANGE_NOT_SATISFIABLE; } free( RangeInput ); return HTTP_OK; } /************************************************************************ * Function: CheckOtherHTTPHeaders * * Parameters: * IN http_message_t * Req ; HTTP Request message * OUT struct SendInstruction * RespInstr ; Send Instruction object to * data for the response * int FileSize ; Size of the file containing the request document * * Description: Get header id from the request parameter and take * appropriate action based on the ids. * as an HTTP Range Response * * Returns: * HTTP_BAD_REQUEST * UPNP_E_OUTOF_MEMORY * HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_OK ************************************************************************/ int CheckOtherHTTPHeaders( IN http_message_t * Req, OUT struct SendInstruction *RespInstr, off_t FileSize ) { http_header_t *header; ListNode *node; //NNS: dlist_node* node; int index, RetCode = HTTP_OK; char *TmpBuf; TmpBuf = ( char * )malloc( LINE_SIZE ); if( !TmpBuf ) return UPNP_E_OUTOF_MEMORY; node = ListHead( &Req->headers ); while( node != NULL ) { header = ( http_header_t * ) node->item; // find header type. index = map_str_to_int( ( const char * )header->name.buf, header->name.length, Http_Header_Names, NUM_HTTP_HEADER_NAMES, FALSE ); if( header->value.length >= LINE_SIZE ) { free( TmpBuf ); TmpBuf = ( char * )malloc( header->value.length + 1 ); if( !TmpBuf ) return UPNP_E_OUTOF_MEMORY; } memcpy( TmpBuf, header->value.buf, header->value.length ); TmpBuf[header->value.length] = '\0'; if( index >= 0 ) switch ( Http_Header_Names[index].id ) { case HDR_TE: //Request { RespInstr->IsChunkActive = 1; if( strlen( TmpBuf ) > strlen( "gzip" ) ) { if( StrStr( TmpBuf, "trailers" ) != NULL ) { //means client will accept trailer RespInstr->IsTrailers = 1; } } } break; case HDR_CONTENT_LENGTH: { RespInstr->RecvWriteSize = atoi( TmpBuf ); break; } case HDR_RANGE: if( ( RetCode = CreateHTTPRangeResponseHeader( TmpBuf, FileSize, RespInstr ) ) != HTTP_OK ) { free( TmpBuf ); return RetCode; } break; default: /* TODO */ /* header.value is the value. */ /* case HDR_CONTENT_TYPE: //return 1; case HDR_CONTENT_LANGUAGE://return 1; case HDR_LOCATION: //return 1; case HDR_CONTENT_LOCATION://return 1; case HDR_ACCEPT: //return 1; case HDR_ACCEPT_CHARSET://return 1; case HDR_ACCEPT_LANGUAGE://return 1; case HDR_USER_AGENT: break;//return 1; */ //Header check for encoding /* case HDR_ACCEPT_RANGE: //Server capability. case HDR_CONTENT_RANGE://Response. case HDR_IF_RANGE: */ //Header check for encoding /* case HDR_ACCEPT_ENCODING: if(StrStr(TmpBuf, "identity")) { break; } else return -1; case HDR_CONTENT_ENCODING: case HDR_TRANSFER_ENCODING: //Response */ break; } node = ListNext( &Req->headers, node ); } free( TmpBuf ); return RetCode; } /************************************************************************ * Function: process_request * * Parameters: * IN http_message_t *req ; HTTP Request message * OUT enum resp_type *rtype ; Tpye of response * OUT membuffer *headers ; * OUT membuffer *filename ; Get filename from request document * OUT struct xml_alias_t *alias ; Xml alias document from the * request document, * OUT struct SendInstruction * RespInstr ; Send Instruction object * where the response is set up. * * Description: Processes the request and returns the result in the OUT * parameters * * Returns: * HTTP_BAD_REQUEST * UPNP_E_OUTOF_MEMORY * HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_OK ************************************************************************/ static int process_request( IN http_message_t * req, OUT enum resp_type *rtype, OUT membuffer * headers, OUT membuffer * filename, OUT struct xml_alias_t *alias, OUT struct SendInstruction *RespInstr ) { int code; int err_code; char *request_doc; UpnpFileInfo *finfo; xboolean using_alias; xboolean using_virtual_dir; uri_type *url; char *temp_str; int resp_major; int resp_minor; xboolean alias_grabbed; size_t dummy; const char *extra_headers; print_http_headers( req ); url = &req->uri; assert( req->method == HTTPMETHOD_GET || req->method == HTTPMETHOD_HEAD || req->method == HTTPMETHOD_POST || req->method == HTTPMETHOD_SIMPLEGET ); // init request_doc = NULL; finfo = UpnpFileInfo_new(); alias_grabbed = FALSE; err_code = HTTP_INTERNAL_SERVER_ERROR; // default error using_virtual_dir = FALSE; using_alias = FALSE; http_CalcResponseVersion( req->major_version, req->minor_version, &resp_major, &resp_minor ); // // remove dots // request_doc = malloc( url->pathquery.size + 1 ); if( request_doc == NULL ) { goto error_handler; // out of mem } memcpy( request_doc, url->pathquery.buff, url->pathquery.size ); request_doc[url->pathquery.size] = '\0'; dummy = url->pathquery.size; remove_escaped_chars( request_doc, &dummy ); code = remove_dots( request_doc, url->pathquery.size ); if( code != 0 ) { err_code = HTTP_FORBIDDEN; goto error_handler; } if( *request_doc != '/' ) { // no slash err_code = HTTP_BAD_REQUEST; goto error_handler; } if( isFileInVirtualDir( request_doc ) ) { using_virtual_dir = TRUE; RespInstr->IsVirtualFile = 1; if( membuffer_assign_str( filename, request_doc ) != 0 ) { goto error_handler; } } else { /* try using alias */ if (is_valid_alias(&gAliasDoc)) { alias_grab(alias); alias_grabbed = TRUE; using_alias = get_alias(request_doc, alias, finfo); if (using_alias == TRUE) { UpnpFileInfo_set_ContentType(finfo, "text/xml; charset=\"utf-8\""); if (UpnpFileInfo_get_ContentType(finfo) == NULL) { goto error_handler; } } } } if (using_virtual_dir) { if (req->method != HTTPMETHOD_POST) { // get file info if (virtualDirCallback.get_info(filename->buf, finfo) != 0) { err_code = HTTP_NOT_FOUND; goto error_handler; } // try index.html if req is a dir if (UpnpFileInfo_get_IsDirectory(finfo)) { if (filename->buf[filename->length - 1] == '/') { temp_str = "index.html"; } else { temp_str = "/index.html"; } if ( membuffer_append_str(filename, temp_str) != 0) { goto error_handler; } // get info if (virtualDirCallback.get_info(filename->buf, finfo) != UPNP_E_SUCCESS || UpnpFileInfo_get_IsDirectory(finfo)) { err_code = HTTP_NOT_FOUND; goto error_handler; } } // not readable if (!UpnpFileInfo_get_IsReadable(finfo)) { err_code = HTTP_FORBIDDEN; goto error_handler; } // finally, get content type // if ( get_content_type(filename->buf, &content_type) != 0 ) //{ // goto error_handler; // } } } else if (!using_alias) { if( gDocumentRootDir.length == 0 ) { goto error_handler; } // // get file name // // filename str if( membuffer_assign_str( filename, gDocumentRootDir.buf ) != 0 || membuffer_append_str( filename, request_doc ) != 0 ) { goto error_handler; // out of mem } // remove trailing slashes while( filename->length > 0 && filename->buf[filename->length - 1] == '/' ) { membuffer_delete( filename, filename->length - 1, 1 ); } if( req->method != HTTPMETHOD_POST ) { // get info on file if (get_file_info(filename->buf, finfo) != 0) { err_code = HTTP_NOT_FOUND; goto error_handler; } // try index.html if req is a dir if (UpnpFileInfo_get_IsDirectory(finfo)) { if( filename->buf[filename->length - 1] == '/' ) { temp_str = "index.html"; } else { temp_str = "/index.html"; } if( membuffer_append_str( filename, temp_str ) != 0 ) { goto error_handler; } // get info if (get_file_info(filename->buf, finfo) != 0 || UpnpFileInfo_get_IsDirectory(finfo)) { err_code = HTTP_NOT_FOUND; goto error_handler; } } // not readable if (!UpnpFileInfo_get_IsReadable(finfo)) { err_code = HTTP_FORBIDDEN; goto error_handler; } } // finally, get content type // if ( get_content_type(filename->buf, &content_type) != 0 ) // { // goto error_handler; // } } RespInstr->ReadSendSize = UpnpFileInfo_get_FileLength(finfo); // Check other header field. err_code = CheckOtherHTTPHeaders(req, RespInstr, UpnpFileInfo_get_FileLength(finfo)); if ( err_code != HTTP_OK ) { goto error_handler; } if( req->method == HTTPMETHOD_POST ) { *rtype = RESP_POST; err_code = UPNP_E_SUCCESS; goto error_handler; } extra_headers = UpnpFileInfo_get_ExtraHeaders(finfo); if (!extra_headers) { extra_headers = ""; } if( RespInstr->IsRangeActive && RespInstr->IsChunkActive ) { // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Transfer-Encoding: chunked if (http_MakeMessage( headers, resp_major, resp_minor, "R" "T" "GKD" "s" "tcS" "Xc" "sCc", HTTP_PARTIAL_CONTENT, // status code UpnpFileInfo_get_ContentType(finfo), // content type RespInstr, // range info "LAST-MODIFIED: ", UpnpFileInfo_get_LastModified(finfo), X_USER_AGENT, extra_headers) != 0 ) { goto error_handler; } } else if( RespInstr->IsRangeActive && !RespInstr->IsChunkActive ) { // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Transfer-Encoding: chunked if (http_MakeMessage( headers, resp_major, resp_minor, "R" "N" "T" "GD" "s" "tcS" "Xc" "sCc", HTTP_PARTIAL_CONTENT, // status code RespInstr->ReadSendSize, // content length UpnpFileInfo_get_ContentType(finfo), // content type RespInstr, // range info "LAST-MODIFIED: ", UpnpFileInfo_get_LastModified(finfo), X_USER_AGENT, extra_headers) != 0 ) { goto error_handler; } } else if( !RespInstr->IsRangeActive && RespInstr->IsChunkActive ) { // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Transfer-Encoding: chunked if (http_MakeMessage( headers, resp_major, resp_minor, "RK" "TD" "s" "tcS" "Xc" "sCc", HTTP_OK, // status code UpnpFileInfo_get_ContentType(finfo), // content type "LAST-MODIFIED: ", UpnpFileInfo_get_LastModified(finfo), X_USER_AGENT, extra_headers) != 0 ) { goto error_handler; } } else { // !RespInstr->IsRangeActive && !RespInstr->IsChunkActive if (RespInstr->ReadSendSize >= 0) { // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Transfer-Encoding: chunked if (http_MakeMessage( headers, resp_major, resp_minor, "R" "N" "TD" "s" "tcS" "Xc" "sCc", HTTP_OK, // status code RespInstr->ReadSendSize, // content length UpnpFileInfo_get_ContentType(finfo), // content type "LAST-MODIFIED: ", UpnpFileInfo_get_LastModified(finfo), X_USER_AGENT, extra_headers) != 0 ) { goto error_handler; } } else { // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Transfer-Encoding: chunked if (http_MakeMessage( headers, resp_major, resp_minor, "R" "TD" "s" "tcS" "b" "Xc" "sCc", HTTP_OK, // status code UpnpFileInfo_get_ContentType(finfo), // content type "LAST-MODIFIED: ", UpnpFileInfo_get_LastModified(finfo), X_USER_AGENT, extra_headers) != 0 ) { goto error_handler; } } } if( req->method == HTTPMETHOD_HEAD ) { *rtype = RESP_HEADERS; } else if( using_alias ) { // GET xml *rtype = RESP_XMLDOC; } else if( using_virtual_dir ) { *rtype = RESP_WEBDOC; } else { // GET filename *rtype = RESP_FILEDOC; } // simple get http 0.9 as specified in http 1.0 // don't send headers if( req->method == HTTPMETHOD_SIMPLEGET ) { membuffer_destroy( headers ); } err_code = UPNP_E_SUCCESS; error_handler: free(request_doc); UpnpFileInfo_delete(finfo); if (err_code != UPNP_E_SUCCESS && alias_grabbed) { alias_release(alias); } return err_code; } /************************************************************************ * Function: http_RecvPostMessage * * Parameters: * http_parser_t* parser ; HTTP Parser object * IN SOCKINFO *info ; Socket Information object * char * filename ; File where received data is copied to * struct SendInstruction * Instr ; Send Instruction object which gives * information whether the file is a virtual file or not. * * Description: Receives the HTTP post message * * Returns: * HTTP_INTERNAL_SERVER_ERROR * HTTP_UNAUTHORIZED * HTTP_REQUEST_RANGE_NOT_SATISFIABLE * HTTP_OK ************************************************************************/ int http_RecvPostMessage( http_parser_t *parser, IN SOCKINFO *info, char *filename, struct SendInstruction *Instr ) { unsigned int Data_Buf_Size = 1024; char Buf[1024]; int Timeout = 0; long Num_Write = 0; FILE *Fp; parse_status_t status = PARSE_OK; xboolean ok_on_close = FALSE; unsigned int entity_offset = 0; int num_read = 0; int ret_code = 0; if( Instr && Instr->IsVirtualFile ) { Fp = (virtualDirCallback.open)( filename, UPNP_WRITE ); if( Fp == NULL ) { return HTTP_INTERNAL_SERVER_ERROR; } } else { Fp = fopen( filename, "wb" ); if( Fp == NULL ) { return HTTP_UNAUTHORIZED; } } parser->position = POS_ENTITY; do { //first parse what has already been gotten if( parser->position != POS_COMPLETE ) { status = parser_parse_entity( parser ); } if( status == PARSE_INCOMPLETE_ENTITY ) { // read until close ok_on_close = TRUE; } else if( ( status != PARSE_SUCCESS ) && ( status != PARSE_CONTINUE_1 ) && ( status != PARSE_INCOMPLETE ) ) { //error fclose( Fp ); return HTTP_BAD_REQUEST; } //read more if necessary entity while( ( ( entity_offset + Data_Buf_Size ) > parser->msg.entity.length ) && ( parser->position != POS_COMPLETE ) ) { num_read = sock_read( info, Buf, sizeof( Buf ), &Timeout ); if( num_read > 0 ) { // append data to buffer ret_code = membuffer_append( &parser->msg.msg, Buf, num_read ); if( ret_code != 0 ) { // set failure status parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return HTTP_INTERNAL_SERVER_ERROR; } status = parser_parse_entity( parser ); if( status == PARSE_INCOMPLETE_ENTITY ) { // read until close ok_on_close = TRUE; } else if( ( status != PARSE_SUCCESS ) && ( status != PARSE_CONTINUE_1 ) && ( status != PARSE_INCOMPLETE ) ) { return HTTP_BAD_REQUEST; } } else if( num_read == 0 ) { if( ok_on_close ) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "<<< (RECVD) <<<\n%s\n-----------------\n", parser->msg.msg.buf ); print_http_headers( &parser->msg ); parser->position = POS_COMPLETE; } else { // partial msg parser->http_error_code = HTTP_BAD_REQUEST; // or response return HTTP_BAD_REQUEST; } } else { return num_read; } } if( ( entity_offset + Data_Buf_Size ) > parser->msg.entity.length ) { Data_Buf_Size = parser->msg.entity.length - entity_offset; } memcpy( Buf, &parser->msg.msg.buf[parser->entity_start_position + entity_offset], Data_Buf_Size ); entity_offset += Data_Buf_Size; if( Instr->IsVirtualFile ) { Num_Write = virtualDirCallback.write( Fp, Buf, Data_Buf_Size ); if( Num_Write < 0 ) { virtualDirCallback.close( Fp ); return HTTP_INTERNAL_SERVER_ERROR; } } else { Num_Write = fwrite( Buf, 1, Data_Buf_Size, Fp ); if( Num_Write < 0 ) { fclose( Fp ); return HTTP_INTERNAL_SERVER_ERROR; } } } while( ( parser->position != POS_COMPLETE ) || ( entity_offset != parser->msg.entity.length ) ); if( Instr->IsVirtualFile ) { virtualDirCallback.close( Fp ); } else { fclose( Fp ); } /* while(TotalByteReceived < Instr->RecvWriteSize && (NumReceived = sock_read(info,Buf, Data_Buf_Size,&Timeout) ) > 0 ) { TotalByteReceived = TotalByteReceived + NumReceived; Num_Write = virtualDirCallback.write(Fp, Buf, NumReceived); if (ferror(Fp)) { virtualDirCallback.close(Fp); return HTTP_INTERNAL_SERVER_ERROR; } } if(TotalByteReceived < Instr->RecvWriteSize) { return HTTP_INTERNAL_SERVER_ERROR; } virtualDirCallback.close(Fp); } */ return HTTP_OK; } /************************************************************************ * Function: web_server_callback * * Parameters: * IN http_parser_t *parser ; HTTP Parser Object * INOUT http_message_t* req ; HTTP Message request * IN SOCKINFO *info ; Socket information object * * Description: main entry point into web server; * handles HTTP GET and HEAD requests * * Returns: * void ************************************************************************/ void web_server_callback( IN http_parser_t * parser, INOUT http_message_t * req, IN SOCKINFO * info ) { int ret; int timeout = 0; enum resp_type rtype = 0; membuffer headers; membuffer filename; struct xml_alias_t xmldoc; struct SendInstruction RespInstr; //Initialize instruction header. RespInstr.IsVirtualFile = 0; RespInstr.IsChunkActive = 0; RespInstr.IsRangeActive = 0; RespInstr.IsTrailers = 0; // init membuffer_init( &headers ); membuffer_init( &filename ); //Process request should create the different kind of header depending on the //the type of request. ret = process_request( req, &rtype, &headers, &filename, &xmldoc, &RespInstr ); if( ret != UPNP_E_SUCCESS ) { // send error code http_SendStatusResponse( info, ret, req->major_version, req->minor_version ); } else { // // send response switch ( rtype ) { case RESP_FILEDOC: // send file, I = further instruction to send data. http_SendMessage( info, &timeout, "Ibf", &RespInstr, headers.buf, headers.length, filename.buf ); break; case RESP_XMLDOC: // send xmldoc , I = further instruction to send data. http_SendMessage( info, &timeout, "Ibb", &RespInstr, headers.buf, headers.length, xmldoc.doc.buf, xmldoc.doc.length ); alias_release( &xmldoc ); break; case RESP_WEBDOC: //, I = further instruction to send data. /* http_SendVirtualDirDoc( info, &timeout, "Ibf",&RespInstr, headers.buf, headers.length, filename.buf ); */ http_SendMessage( info, &timeout, "Ibf", &RespInstr, headers.buf, headers.length, filename.buf ); break; case RESP_HEADERS: // headers only http_SendMessage( info, &timeout, "b", headers.buf, headers.length ); break; case RESP_POST: // headers only ret = http_RecvPostMessage( parser, info, filename.buf, &RespInstr ); //Send response. http_MakeMessage( &headers, 1, 1, "RTDSXcCc", ret, "text/html", X_USER_AGENT ); http_SendMessage( info, &timeout, "b", headers.buf, headers.length ); break; default: assert( 0 ); } } UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "webserver: request processed...\n" ); membuffer_destroy( &headers ); membuffer_destroy( &filename ); } libupnp-1.8.0~svn20100507/upnp/src/genlib/net/http/httpreadwrite.c0000644000175000017500000022117211042015420021460 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /************************************************************************ * Purpose: This file defines the functionality making use of the http * It defines functions to receive messages, process messages, send * messages ************************************************************************/ #include "config.h" #include "httpreadwrite.h" #include "unixutil.h" #include "upnp.h" #include "upnpapi.h" #include "membuffer.h" #include "uri.h" #include "statcodes.h" #include "sock.h" #include "UpnpInet.h" #include "webserver.h" #include #include #ifndef UPNP_USE_BCBPP #ifndef UPNP_USE_MSVCPP #include #include #endif #endif #ifdef WIN32 #include #else #include #include #include #include #include #include #include #include #endif /* * Please, do not change these to const int while MSVC cannot understand * const int in array dimensions. */ /* const int CHUNK_HEADER_SIZE = 10; const int CHUNK_TAIL_SIZE = 10; */ #define CHUNK_HEADER_SIZE 10 #define CHUNK_TAIL_SIZE 10 /************************************************************************ * Function: http_FixUrl * * Parameters: * IN uri_type* url; URL to be validated and fixed * OUT uri_type* fixed_url; URL after being fixed. * * Description: * Validates URL * * Returns: * UPNP_E_INVALID_URL * UPNP_E_SUCCESS ************************************************************************/ int http_FixUrl( IN uri_type * url, OUT uri_type * fixed_url ) { char *temp_path = "/"; *fixed_url = *url; if( token_string_casecmp( &fixed_url->scheme, "http" ) != 0 ) { return UPNP_E_INVALID_URL; } if( fixed_url->hostport.text.size == 0 ) { return UPNP_E_INVALID_URL; } // set pathquery to "/" if it is empty if( fixed_url->pathquery.size == 0 ) { fixed_url->pathquery.buff = temp_path; fixed_url->pathquery.size = 1; } return UPNP_E_SUCCESS; } /************************************************************************ * Function: http_FixStrUrl * * Parameters: * IN const char* urlstr; Character string as a URL * IN int urlstrlen; Length of the character string * OUT uri_type* fixed_url; Fixed and corrected URL * * Description: * Parses URL and then validates URL * * Returns: * UPNP_E_INVALID_URL * UPNP_E_SUCCESS ************************************************************************/ int http_FixStrUrl( IN const char *urlstr, IN int urlstrlen, OUT uri_type * fixed_url ) { uri_type url; if( parse_uri( urlstr, urlstrlen, &url ) != HTTP_SUCCESS ) { return UPNP_E_INVALID_URL; } return http_FixUrl( &url, fixed_url ); } /************************************************************************ * Function: http_Connect * * Parameters: * IN uri_type* destination_url; URL containing destination information * OUT uri_type *url; Fixed and corrected URL * * Description: * Gets destination address from URL and then connects to the remote end * * Returns: * socket descriptor on sucess * UPNP_E_OUTOF_SOCKET * UPNP_E_SOCKET_CONNECT on error ************************************************************************/ int http_Connect( IN uri_type * destination_url, OUT uri_type * url ) { int connfd; http_FixUrl( destination_url, url ); connfd = socket( url->hostport.IPaddress.ss_family, SOCK_STREAM, 0 ); if( connfd == -1 ) { return UPNP_E_OUTOF_SOCKET; } if( connect( connfd, ( struct sockaddr * )&url->hostport.IPaddress, sizeof( url->hostport.IPaddress ) ) == -1 ) { #ifdef WIN32 UpnpPrintf(UPNP_CRITICAL, HTTP, __FILE__, __LINE__, "connect error: %d\n", WSAGetLastError()); #endif shutdown( connfd, SD_BOTH ); UpnpCloseSocket( connfd ); return UPNP_E_SOCKET_CONNECT; } return connfd; } /*! * \brief Get the data on the socket and take actions based on the read data to * modify the parser objects buffer. * * If an error is reported while parsing the data, the error code is passed in * the http_errr_code parameter. * * Parameters: * IN SOCKINFO *info; Socket information object * OUT http_parser_t* parser; HTTP parser object * IN http_method_t request_method; HTTP request method * IN OUT int* timeout_secs; time out * OUT int* http_error_code; HTTP error code returned * * \return * UPNP_E_SUCCESS * UPNP_E_BAD_HTTPMSG */ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t *parser, IN http_method_t request_method, IN OUT int *timeout_secs, OUT int *http_error_code) { int ret = UPNP_E_SUCCESS; int line = 0; parse_status_t status; int num_read; xboolean ok_on_close = FALSE; char buf[2 * 1024]; if (request_method == HTTPMETHOD_UNKNOWN) { parser_request_init(parser); } else { parser_response_init(parser, request_method); } while (TRUE) { num_read = sock_read(info, buf, sizeof buf, timeout_secs); if (num_read > 0) { // got data status = parser_append(parser, buf, num_read); if (status == PARSE_SUCCESS) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "<<< (RECVD) <<<\n%s\n-----------------\n", parser->msg.msg.buf ); print_http_headers( &parser->msg ); if (parser->content_length > (unsigned int)g_maxContentLength) { *http_error_code = HTTP_REQ_ENTITY_TOO_LARGE; line = __LINE__; ret = UPNP_E_OUTOF_BOUNDS; goto ExitFunction; } line = __LINE__; ret = 0; goto ExitFunction; } else if (status == PARSE_FAILURE) { *http_error_code = parser->http_error_code; line = __LINE__; ret = UPNP_E_BAD_HTTPMSG; goto ExitFunction; } else if (status == PARSE_INCOMPLETE_ENTITY) { // read until close ok_on_close = TRUE; } else if (status == PARSE_CONTINUE_1) { // Web post request. line = __LINE__; ret = PARSE_SUCCESS; goto ExitFunction; } } else if (num_read == 0) { if (ok_on_close) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "<<< (RECVD) <<<\n%s\n-----------------\n", parser->msg.msg.buf ); print_http_headers(&parser->msg); line = __LINE__; ret = 0; goto ExitFunction; } else { // partial msg *http_error_code = HTTP_BAD_REQUEST; // or response line = __LINE__; ret = UPNP_E_BAD_HTTPMSG; goto ExitFunction; } } else { *http_error_code = parser->http_error_code; line = __LINE__; ret = num_read; goto ExitFunction; } } ExitFunction: if (ret != UPNP_E_SUCCESS) { UpnpPrintf(UPNP_ALL, HTTP, __FILE__, line, "(http_RecvMessage): Error %d, http_error_code = %d.\n", ret, *http_error_code); } return ret; } /************************************************************************ * Function: http_SendMessage * * Parameters: * IN SOCKINFO *info ; Socket information object * IN OUT int * TimeOut ; time out value * IN const char* fmt, ... Pattern format to take actions upon * * Description: * Sends a message to the destination based on the * IN const char* fmt parameter * fmt types: * 'f': arg = const char * file name * 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length * E.g.: * char *buf = "POST /xyz.cgi http/1.1\r\n\r\n"; * char *filename = "foo.dat"; * int status = http_SendMessage( tcpsock, "mf", * buf, strlen(buf), // args for memory buffer * filename ); // arg for file * * Returns: * UPNP_E_OUTOF_MEMORY * UPNP_E_FILE_READ_ERROR * UPNP_E_SUCCESS ************************************************************************/ int http_SendMessage( IN SOCKINFO * info, IN OUT int *TimeOut, IN const char *fmt, ... ) { char c; char *buf = NULL; size_t buf_length; char *filename = NULL; FILE *Fp; int num_read; int num_written; off_t amount_to_be_read = 0; va_list argp; char *file_buf = NULL; char *ChunkBuf = NULL; struct SendInstruction *Instr = NULL; char Chunk_Header[CHUNK_HEADER_SIZE]; int RetVal = 0; // 10 byte allocated for chunk header. int Data_Buf_Size = WEB_SERVER_BUF_SIZE; va_start( argp, fmt ); while( ( c = *fmt++ ) != 0 ) { if( c == 'I' ) { Instr = va_arg(argp, struct SendInstruction *); assert( Instr ); if( Instr->ReadSendSize >= 0 ) { amount_to_be_read = Instr->ReadSendSize; } else { amount_to_be_read = Data_Buf_Size; } if( amount_to_be_read < WEB_SERVER_BUF_SIZE ) { Data_Buf_Size = amount_to_be_read; } ChunkBuf = (char *)malloc( Data_Buf_Size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE); if( !ChunkBuf ) { return UPNP_E_OUTOF_MEMORY; } file_buf = ChunkBuf + CHUNK_HEADER_SIZE; } else if( c == 'f' ) { // file name filename = va_arg(argp, char *); if( Instr && Instr->IsVirtualFile ) { Fp = (virtualDirCallback.open)( filename, UPNP_READ ); } else { Fp = fopen( filename, "rb" ); } if( Fp == NULL ) { free( ChunkBuf ); return UPNP_E_FILE_READ_ERROR; } if( Instr && Instr->IsRangeActive && Instr->IsVirtualFile ) { if( virtualDirCallback.seek( Fp, Instr->RangeOffset, SEEK_CUR ) != 0 ) { free( ChunkBuf ); return UPNP_E_FILE_READ_ERROR; } } else if( Instr && Instr->IsRangeActive ) { if( fseeko( Fp, Instr->RangeOffset, SEEK_CUR ) != 0 ) { free( ChunkBuf ); return UPNP_E_FILE_READ_ERROR; } } while( amount_to_be_read ) { if( Instr ) { int n = (amount_to_be_read >= Data_Buf_Size) ? Data_Buf_Size : amount_to_be_read; if( Instr->IsVirtualFile ) { num_read = virtualDirCallback.read( Fp, file_buf, n ); } else { num_read = fread( file_buf, 1, n, Fp ); } amount_to_be_read = amount_to_be_read - num_read; if( Instr->ReadSendSize < 0 ) { // read until close amount_to_be_read = Data_Buf_Size; } } else { num_read = fread( file_buf, 1, Data_Buf_Size, Fp ); } if( num_read == 0 ) { // EOF so no more to send. if( Instr && Instr->IsChunkActive ) { char *str = "0\r\n\r\n"; num_written = sock_write(info, str, strlen(str), TimeOut); } else { RetVal = UPNP_E_FILE_READ_ERROR; } goto Cleanup_File; } // Create chunk for the current buffer. if( Instr && Instr->IsChunkActive ) { // Copy CRLF at the end of the chunk memcpy( file_buf + num_read, "\r\n", 2 ); // Hex length for the chunk size. sprintf( Chunk_Header, "%x", num_read ); //itoa(num_read,Chunk_Header,16); strcat( Chunk_Header, "\r\n" ); // Copy the chunk size header memcpy( file_buf - strlen( Chunk_Header ), Chunk_Header, strlen( Chunk_Header ) ); // on the top of the buffer. //file_buf[num_read+strlen(Chunk_Header)] = NULL; //printf("Sending %s\n",file_buf-strlen(Chunk_Header)); num_written = sock_write( info, file_buf - strlen( Chunk_Header ), num_read + strlen( Chunk_Header ) + 2, TimeOut ); if( num_written != num_read + ( int )strlen( Chunk_Header ) + 2 ) { // Send error nothing we can do. goto Cleanup_File; } } else { // write data num_written = sock_write( info, file_buf, num_read, TimeOut ); UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, ">>> (SENT) >>>\n%.*s\n------------\n", ( int )num_written, file_buf ); // Send error nothing we can do if( num_written != num_read ) { goto Cleanup_File; } } } // while Cleanup_File: va_end( argp ); if( Instr && Instr->IsVirtualFile ) { virtualDirCallback.close( Fp ); } else { fclose( Fp ); } free( ChunkBuf ); return RetVal; } else if( c == 'b' ) { // memory buffer buf = va_arg(argp, char *); buf_length = va_arg(argp, size_t); if( buf_length > 0 ) { num_written = sock_write( info, buf, buf_length, TimeOut ); UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, ">>> (SENT) >>>\n" "%.*s\nbuf_length=%d, num_written=%d\n" "------------\n", (int)buf_length, buf, (int)buf_length, num_written ); if( (size_t)num_written != buf_length ) { goto end; } } } } end: va_end( argp ); free( ChunkBuf ); return 0; } /************************************************************************ * Function: http_RequestAndResponse * * Parameters: * IN uri_type* destination; Destination URI object which contains * remote IP address among other elements * IN const char* request; Request to be sent * IN size_t request_length; Length of the request * IN http_method_t req_method; HTTP Request method * IN int timeout_secs; time out value * OUT http_parser_t* response; Parser object to receive the repsonse * * Description: * Initiates socket, connects to the destination, sends a * request and waits for the response from the remote end * * Returns: * UPNP_E_SOCKET_ERROR * UPNP_E_SOCKET_CONNECT * Error Codes returned by http_SendMessage * Error Codes returned by http_RecvMessage ************************************************************************/ int http_RequestAndResponse( IN uri_type * destination, IN const char *request, IN size_t request_length, IN http_method_t req_method, IN int timeout_secs, OUT http_parser_t * response ) { int tcp_connection; int ret_code; int http_error_code; SOCKINFO info; tcp_connection = socket( destination->hostport.IPaddress.ss_family, SOCK_STREAM, 0 ); if( tcp_connection == -1 ) { parser_response_init( response, req_method ); return UPNP_E_SOCKET_ERROR; } if( sock_init( &info, tcp_connection ) != UPNP_E_SUCCESS ) { sock_destroy( &info, SD_BOTH ); parser_response_init( response, req_method ); return UPNP_E_SOCKET_ERROR; } // connect ret_code = connect( info.socket, ( struct sockaddr * )&destination->hostport. IPaddress, sizeof( struct sockaddr_storage ) ); if( ret_code == -1 ) { sock_destroy( &info, SD_BOTH ); parser_response_init( response, req_method ); return UPNP_E_SOCKET_CONNECT; } // send request ret_code = http_SendMessage( &info, &timeout_secs, "b", request, request_length ); if( ret_code != 0 ) { sock_destroy( &info, SD_BOTH ); parser_response_init( response, req_method ); return ret_code; } // recv response ret_code = http_RecvMessage( &info, response, req_method, &timeout_secs, &http_error_code ); sock_destroy( &info, SD_BOTH ); //should shutdown completely return ret_code; } /************************************************************************ * Function: http_Download * * Parameters: * IN const char* url_str; String as a URL * IN int timeout_secs; time out value * OUT char** document; buffer to store the document extracted * from the donloaded message. * OUT int* doc_length; length of the extracted document * OUT char* content_type; Type of content * * Description: * Download the document message and extract the document * from the message. * * Return: int * UPNP_E_SUCCESS * UPNP_E_INVALID_URL ************************************************************************/ int http_Download( IN const char *url_str, IN int timeout_secs, OUT char **document, OUT int *doc_length, OUT char *content_type ) { int ret_code; uri_type url; char *msg_start; char *entity_start; char *hoststr; char *temp; http_parser_t response; size_t msg_length; size_t hostlen; memptr ctype; size_t copy_len; membuffer request; char *urlPath = alloca( strlen( url_str ) + 1 ); //ret_code = parse_uri( (char*)url_str, strlen(url_str), &url ); UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n", url_str ); ret_code = http_FixStrUrl( ( char * )url_str, strlen( url_str ), &url ); if( ret_code != UPNP_E_SUCCESS ) { return ret_code; } // make msg membuffer_init( &request ); strcpy( urlPath, url_str ); hoststr = strstr( urlPath, "//" ); if( hoststr == NULL ) { return UPNP_E_INVALID_URL; } hoststr += 2; temp = strchr( hoststr, '/' ); if( temp == NULL ) { return UPNP_E_INVALID_URL; } *temp = '\0'; hostlen = strlen( hoststr ); *temp = '/'; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen ); ret_code = http_MakeMessage( &request, 1, 1, "Q" "s" "bcDCUc", HTTPMETHOD_GET, url.pathquery.buff, url.pathquery.size, "HOST: ", hoststr, hostlen ); if( ret_code != 0 ) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Makemessage failed\n" ); membuffer_destroy( &request ); return ret_code; } UpnpPrintf(UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Buffer:\n%s\n" "----------END--------\n", request.buf); // get doc msg ret_code = http_RequestAndResponse( &url, request.buf, request.length, HTTPMETHOD_GET, timeout_secs, &response ); if( ret_code != 0 ) { httpmsg_destroy( &response.msg ); membuffer_destroy( &request ); return ret_code; } UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" ); print_http_headers( &response.msg ); // optional content-type if( content_type ) { if( httpmsg_find_hdr( &response.msg, HDR_CONTENT_TYPE, &ctype ) == NULL ) { *content_type = '\0'; // no content-type } else { // safety copy_len = ctype.length < LINE_SIZE - 1 ? ctype.length : LINE_SIZE - 1; memcpy( content_type, ctype.buf, copy_len ); content_type[copy_len] = '\0'; } } // // extract doc from msg // if( ( *doc_length = ( int )response.msg.entity.length ) == 0 ) { // 0-length msg *document = NULL; } else if( response.msg.status_code == HTTP_OK ) { //LEAK_FIX_MK // copy entity entity_start = response.msg.entity.buf; // what we want msg_length = response.msg.msg.length; // save for posterity msg_start = membuffer_detach( &response.msg.msg ); // whole msg // move entity to the start; copy null-terminator too memmove( msg_start, entity_start, *doc_length + 1 ); // save mem for body only *document = realloc( msg_start, *doc_length + 1 ); //LEAK_FIX_MK // *document = Realloc( msg_start,msg_length, *doc_length + 1 );//LEAK_FIX_MK // shrink can't fail assert( ( int )msg_length > *doc_length ); assert( *document != NULL ); } if( response.msg.status_code == HTTP_OK ) { ret_code = 0; // success } else { // server sent error msg (not requested doc) ret_code = response.msg.status_code; } httpmsg_destroy( &response.msg ); membuffer_destroy( &request ); return ret_code; } typedef struct HTTPPOSTHANDLE { SOCKINFO sock_info; int contentLength; } http_post_handle_t; /************************************************************************ * Function: MakePostMessage * * Parameters: * const char *url_str; String as a URL * membuffer *request; Buffer containing the request * uri_type *url; URI object containing the scheme, * path query token, etc. * int contentLength; length of content * const char *contentType; Type of content * * Description: * Makes the message for the HTTP POST message * * Returns: * UPNP_E_INVALID_URL * UPNP_E_INVALID_PARAM * UPNP_E_SUCCESS ************************************************************************/ int MakePostMessage( const char *url_str, membuffer * request, uri_type * url, int contentLength, const char *contentType ) { int ret_code = 0; char *urlPath = alloca( strlen( url_str ) + 1 ); size_t hostlen = 0; char *hoststr, *temp; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n", url_str ); ret_code = http_FixStrUrl( ( char * )url_str, strlen( url_str ), url ); if( ret_code != UPNP_E_SUCCESS ) { return ret_code; } // make msg membuffer_init( request ); strcpy( urlPath, url_str ); hoststr = strstr( urlPath, "//" ); if( hoststr == NULL ) { return UPNP_E_INVALID_URL; } hoststr += 2; temp = strchr( hoststr, '/' ); if( temp == NULL ) { return UPNP_E_INVALID_URL; } *temp = '\0'; hostlen = strlen( hoststr ); *temp = '/'; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen ); if( contentLength >= 0 ) { ret_code = http_MakeMessage( request, 1, 1, "Q" "s" "bcDCU" "T" "Nc", HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, "HOST: ", hoststr, hostlen, contentType, (off_t)contentLength ); } else if( contentLength == UPNP_USING_CHUNKED ) { ret_code = http_MakeMessage( request, 1, 1, "Q" "s" "bcDCU" "TKc", HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, "HOST: ", hoststr, hostlen, contentType ); } else if( contentLength == UPNP_UNTIL_CLOSE ) { ret_code = http_MakeMessage( request, 1, 1, "Q" "s" "bcDCU" "Tc", HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, "HOST: ", hoststr, hostlen, contentType ); } else { ret_code = UPNP_E_INVALID_PARAM; } if( ret_code != 0 ) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Makemessage failed\n" ); membuffer_destroy( request ); return ret_code; } UpnpPrintf(UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Buffer:\n%s\n" "----------END--------\n", request->buf); return UPNP_E_SUCCESS; } /************************************************************************ * Function: http_WriteHttpPost * * Parameters: * IN void *Handle: Handle to the http post object * IN char *buf: Buffer to send to peer, if format used * is not UPNP_USING_CHUNKED, * IN unsigned int *size: Size of the data to be sent. * IN int timeout: time out value * * Description: * Formats data if format used is UPNP_USING_CHUNKED. * Writes data on the socket connected to the peer. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Parameter * -1 - On Socket Error. ************************************************************************/ int http_WriteHttpPost( IN void *Handle, IN char *buf, IN unsigned int *size, IN int timeout ) { http_post_handle_t *handle = ( http_post_handle_t * ) Handle; char *tempbuf = NULL; int tempbufSize = 0; int freeTempbuf = 0; int numWritten = 0; if( ( !handle ) || ( !size ) || ( ( ( *size ) > 0 ) && !buf ) || ( ( *size ) < 0 ) ) { if(size) ( *size ) = 0; return UPNP_E_INVALID_PARAM; } if( handle->contentLength == UPNP_USING_CHUNKED ) { if( ( *size ) ) { int tempSize = 0; tempbuf = ( char * )malloc( *size + CHUNK_HEADER_SIZE + CHUNK_TAIL_SIZE ); if ( tempbuf == NULL) { return UPNP_E_OUTOF_MEMORY; } // begin chunk sprintf( tempbuf, "%x\r\n", ( *size ) ); tempSize = strlen( tempbuf ); memcpy( tempbuf + tempSize, buf, ( *size ) ); memcpy( tempbuf + tempSize + ( *size ), "\r\n", 2 ); // end of chunk tempbufSize = tempSize + ( *size ) + 2; freeTempbuf = 1; } } else { tempbuf = buf; tempbufSize = ( *size ); } numWritten = sock_write( &handle->sock_info, tempbuf, tempbufSize, &timeout ); //(*size) = sock_write(&handle->sock_info,tempbuf,tempbufSize,&timeout); if( freeTempbuf ) { free( tempbuf ); } if( numWritten < 0 ) { ( *size ) = 0; return numWritten; } else { ( *size ) = numWritten; return UPNP_E_SUCCESS; } } /************************************************************************ * Function: http_CloseHttpPost * * Parameters: * IN void *Handle; Handle to the http post object * IN OUT int *httpStatus; HTTP status returned on receiving a * response message * IN int timeout; time out value * * Description: * Sends remaining data if using UPNP_USING_CHUNKED * format. Receives any more messages. Destroys socket and any socket * associated memory. Frees handle associated with the HTTP POST msg. * * Return: int * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter ************************************************************************/ int http_CloseHttpPost( IN void *Handle, IN OUT int *httpStatus, IN int timeout ) { int retc = 0; http_parser_t response; int http_error_code; http_post_handle_t *handle = Handle; if( ( !handle ) || ( !httpStatus ) ) { return UPNP_E_INVALID_PARAM; } if( handle->contentLength == UPNP_USING_CHUNKED ) { retc = sock_write( &handle->sock_info, "0\r\n\r\n", strlen( "0\r\n\r\n" ), &timeout ); //send last chunk } //read response parser_response_init( &response, HTTPMETHOD_POST ); retc = http_RecvMessage( &handle->sock_info, &response, HTTPMETHOD_POST, &timeout, &http_error_code ); ( *httpStatus ) = http_error_code; sock_destroy( &handle->sock_info, SD_BOTH ); //should shutdown completely httpmsg_destroy( &response.msg ); free( handle ); return retc; } /************************************************************************ * Function: http_OpenHttpPost * * Parameters: * IN const char *url_str; String as a URL * IN OUT void **Handle; Pointer to buffer to store HTTP * post handle * IN const char *contentType; Type of content * IN int contentLength; length of content * IN int timeout; time out value * * Description: * Makes the HTTP POST message, connects to the peer, * sends the HTTP POST request. Adds the post handle to buffer of * such handles * * Return : int; * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_SOCKET_CONNECT ************************************************************************/ int http_OpenHttpPost( IN const char *url_str, IN OUT void **Handle, IN const char *contentType, IN int contentLength, IN int timeout ) { int ret_code; int tcp_connection; membuffer request; http_post_handle_t *handle = NULL; uri_type url; if( ( !url_str ) || ( !Handle ) || ( !contentType ) ) { return UPNP_E_INVALID_PARAM; } ( *Handle ) = handle; if( ( ret_code = MakePostMessage( url_str, &request, &url, contentLength, contentType ) ) != UPNP_E_SUCCESS ) { return ret_code; } handle = ( http_post_handle_t * ) malloc( sizeof( http_post_handle_t ) ); if( handle == NULL ) { return UPNP_E_OUTOF_MEMORY; } handle->contentLength = contentLength; tcp_connection = socket( url.hostport.IPaddress.ss_family, SOCK_STREAM, 0 ); if( tcp_connection == -1 ) { ret_code = UPNP_E_SOCKET_ERROR; goto errorHandler; } if( sock_init( &handle->sock_info, tcp_connection ) != UPNP_E_SUCCESS ) { sock_destroy( &handle->sock_info, SD_BOTH ); ret_code = UPNP_E_SOCKET_ERROR; goto errorHandler; } ret_code = connect( handle->sock_info.socket, ( struct sockaddr * )&url.hostport.IPaddress, sizeof( struct sockaddr_storage ) ); if( ret_code == -1 ) { sock_destroy( &handle->sock_info, SD_BOTH ); ret_code = UPNP_E_SOCKET_CONNECT; goto errorHandler; } // send request ret_code = http_SendMessage( &handle->sock_info, &timeout, "b", request.buf, request.length ); if( ret_code != 0 ) { sock_destroy( &handle->sock_info, SD_BOTH ); } errorHandler: membuffer_destroy( &request ); ( *Handle ) = handle; return ret_code; } typedef struct HTTPGETHANDLE { http_parser_t response; SOCKINFO sock_info; int entity_offset; int cancel; } http_get_handle_t; /************************************************************************ * Function: MakeGetMessage * * Parameters: * const char *url_str ; String as a URL * const char *proxy_str ; String as a URL of proxy to use * membuffer *request ; Buffer containing the request * uri_type *url ; URI object containing the scheme, path * query token, etc. * * Description: * Makes the message for the HTTP GET method * * Returns: * UPNP_E_INVALID_URL * Error Codes returned by http_MakeMessage * UPNP_E_SUCCESS ************************************************************************/ int MakeGetMessage( const char *url_str, const char *proxy_str, membuffer * request, uri_type * url ) { int ret_code; char *urlPath = alloca( strlen( url_str ) + 1 ); size_t querylen = 0; const char *querystr; size_t hostlen = 0; char *hoststr, *temp; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n", url_str ); ret_code = http_FixStrUrl( ( char * )url_str, strlen( url_str ), url ); if( ret_code != UPNP_E_SUCCESS ) { return ret_code; } // make msg membuffer_init( request ); strcpy( urlPath, url_str ); hoststr = strstr( urlPath, "//" ); if( hoststr == NULL ) { return UPNP_E_INVALID_URL; } hoststr += 2; temp = strchr( hoststr, '/' ); if( temp == NULL ) { return UPNP_E_INVALID_URL; } *temp = '\0'; hostlen = strlen( hoststr ); *temp = '/'; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen ); if( proxy_str ) { querystr = url_str; querylen = strlen( querystr ); } else { querystr = url->pathquery.buff; querylen = url->pathquery.size; } ret_code = http_MakeMessage( request, 1, 1, "Q" "s" "bcDCUc", HTTPMETHOD_GET, querystr, querylen, "HOST: ", hoststr, hostlen ); if( ret_code != 0 ) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Makemessage failed\n" ); membuffer_destroy( request ); return ret_code; } UpnpPrintf(UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Buffer:\n%s\n" "----------END--------\n", request->buf); return UPNP_E_SUCCESS; } /************************************************************************ * Function: ReadResponseLineAndHeaders * * Parameters: * IN SOCKINFO *info; Socket information object * IN OUT http_parser_t *parser; HTTP Parser object * IN OUT int *timeout_secs; time out value * IN OUT int *http_error_code; HTTP errror code returned * * Description: * Parses already exiting data. If not complete reads more * data on the connected socket. The read data is then parsed. The * same methid is carried out for headers. * * Return: int * PARSE_OK - On Success * PARSE_FAILURE - Failure to parse data correctly * UPNP_E_BAD_HTTPMSG - Socker read() returns an error ************************************************************************/ int ReadResponseLineAndHeaders( IN SOCKINFO * info, IN OUT http_parser_t * parser, IN OUT int *timeout_secs, IN OUT int *http_error_code ) { parse_status_t status; int num_read; char buf[2 * 1024]; int done = 0; int ret_code = 0; //read response line status = parser_parse_responseline( parser ); if( status == PARSE_OK ) { done = 1; } else if( status == PARSE_INCOMPLETE ) { done = 0; } else { //error return status; } while( !done ) { num_read = sock_read( info, buf, sizeof( buf ), timeout_secs ); if( num_read > 0 ) { // append data to buffer ret_code = membuffer_append( &parser->msg.msg, buf, num_read ); if( ret_code != 0 ) { // set failure status parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } status = parser_parse_responseline( parser ); if( status == PARSE_OK ) { done = 1; } else if( status == PARSE_INCOMPLETE ) { done = 0; } else { //error return status; } } else if( num_read == 0 ) { // partial msg *http_error_code = HTTP_BAD_REQUEST; // or response return UPNP_E_BAD_HTTPMSG; } else { *http_error_code = parser->http_error_code; return num_read; } } done = 0; status = parser_parse_headers( parser ); if( ( status == PARSE_OK ) && ( parser->position == POS_ENTITY ) ) { done = 1; } else if( status == PARSE_INCOMPLETE ) { done = 0; } else { //error return status; } //read headers while( !done ) { num_read = sock_read( info, buf, sizeof( buf ), timeout_secs ); if( num_read > 0 ) { // append data to buffer ret_code = membuffer_append( &parser->msg.msg, buf, num_read ); if( ret_code != 0 ) { // set failure status parser->http_error_code = HTTP_INTERNAL_SERVER_ERROR; return PARSE_FAILURE; } status = parser_parse_headers( parser ); if( ( status == PARSE_OK ) && ( parser->position == POS_ENTITY ) ) { done = 1; } else if( status == PARSE_INCOMPLETE ) { done = 0; } else { //error return status; } } else if( num_read == 0 ) { // partial msg *http_error_code = HTTP_BAD_REQUEST; // or response return UPNP_E_BAD_HTTPMSG; } else { *http_error_code = parser->http_error_code; return num_read; } } return PARSE_OK; } /************************************************************************ * Function: http_ReadHttpGet * * Parameters: * IN void *Handle; Handle to the HTTP get object * IN OUT char *buf; Buffer to get the read and parsed data * IN OUT unsigned int *size; Size of the buffer passed * IN int timeout; time out value * * Description: * Parses already existing data, then gets new data. * Parses and extracts information from the new data. * * Return: int * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter * UPNP_E_BAD_RESPONSE * UPNP_E_BAD_HTTPMSG * UPNP_E_CANCELED ************************************************************************/ int http_ReadHttpGet( IN void *Handle, IN OUT char *buf, IN OUT unsigned int *size, IN int timeout ) { http_get_handle_t *handle = Handle; parse_status_t status; int num_read; xboolean ok_on_close = FALSE; char tempbuf[2 * 1024]; int ret_code = 0; if( ( !handle ) || ( !size ) || ( ( ( *size ) > 0 ) && !buf ) || ( ( *size ) < 0 ) ) { if(size) ( *size ) = 0; return UPNP_E_INVALID_PARAM; } //first parse what has already been gotten if( handle->response.position != POS_COMPLETE ) { status = parser_parse_entity( &handle->response ); } else { status = PARSE_SUCCESS; } if( status == PARSE_INCOMPLETE_ENTITY ) { // read until close ok_on_close = TRUE; } else if( ( status != PARSE_SUCCESS ) && ( status != PARSE_CONTINUE_1 ) && ( status != PARSE_INCOMPLETE ) ) { //error ( *size ) = 0; return UPNP_E_BAD_RESPONSE; } //read more if necessary entity while( ( ( handle->entity_offset + ( *size ) ) > handle->response.msg.entity.length ) && ( ! handle->cancel ) && ( handle->response.position != POS_COMPLETE ) ) { num_read = sock_read( &handle->sock_info, tempbuf, sizeof( tempbuf ), &timeout ); if( num_read > 0 ) { // append data to buffer ret_code = membuffer_append( &handle->response.msg.msg, tempbuf, num_read ); if( ret_code != 0 ) { // set failure status handle->response.http_error_code = HTTP_INTERNAL_SERVER_ERROR; ( *size ) = 0; return PARSE_FAILURE; } status = parser_parse_entity( &handle->response ); if( status == PARSE_INCOMPLETE_ENTITY ) { // read until close ok_on_close = TRUE; } else if( ( status != PARSE_SUCCESS ) && ( status != PARSE_CONTINUE_1 ) && ( status != PARSE_INCOMPLETE ) ) { //error ( *size ) = 0; return UPNP_E_BAD_RESPONSE; } } else if( num_read == 0 ) { if( ok_on_close ) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "<<< (RECVD) <<<\n%s\n-----------------\n", handle->response.msg.msg.buf ); handle->response.position = POS_COMPLETE; } else { // partial msg ( *size ) = 0; handle->response.http_error_code = HTTP_BAD_REQUEST; // or response return UPNP_E_BAD_HTTPMSG; } } else { ( *size ) = 0; return num_read; } } if( ( handle->entity_offset + ( *size ) ) > handle->response.msg.entity.length ) { ( *size ) = handle->response.msg.entity.length - handle->entity_offset; } memcpy( buf, &handle->response.msg.msg.buf[handle-> response.entity_start_position + handle->entity_offset], ( *size ) ); handle->entity_offset += ( *size ); if ( handle->cancel ) return UPNP_E_CANCELED; return UPNP_E_SUCCESS; } /************************************************************************ * Function: http_HttpGetProgress * * Parameters: * IN void *Handle; Handle to the HTTP get object * OUT unsigned int *length; Buffer to get the read and parsed data * OUT unsigned int *total; Size of tge buffer passed * * Description: * Extracts information from the Handle to the HTTP get object. * * Return: int * UPNP_E_SUCCESS - On Sucess * UPNP_E_INVALID_PARAM - Invalid Parameter ************************************************************************/ int http_HttpGetProgress( IN void *Handle, OUT unsigned int *length, OUT unsigned int *total ) { http_get_handle_t *handle = Handle; if( ( !handle ) || ( !length ) || ( !total ) ) { return UPNP_E_INVALID_PARAM; } *length = handle->response.msg.entity.length; *total = handle->response.content_length; return UPNP_E_SUCCESS; } /************************************************************************ * Function: http_CancelHttpGet * * Parameters: * IN void *Handle; Handle to HTTP get object * * Description: * Set the cancel flag of the HttpGet handle * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Parameter ************************************************************************/ int http_CancelHttpGet( IN void *Handle ) { http_get_handle_t *handle = Handle; if( !handle ) { return UPNP_E_INVALID_PARAM; } handle->cancel = 1; return UPNP_E_SUCCESS; } /************************************************************************ * Function: http_CloseHttpGet * * Parameters: * IN void *Handle; Handle to HTTP get object * * Description: * Clears the handle allocated for the HTTP GET operation * Clears socket states and memory allocated for socket operations. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Parameter ************************************************************************/ int http_CloseHttpGet( IN void *Handle ) { http_get_handle_t *handle = Handle; if( !handle ) { return UPNP_E_INVALID_PARAM; } sock_destroy( &handle->sock_info, SD_BOTH ); //should shutdown completely httpmsg_destroy( &handle->response.msg ); handle->entity_offset = 0; free( handle ); return UPNP_E_SUCCESS; } /************************************************************************ * Function: http_OpenHttpGet * * Parameters: * IN const char *url_str: String as a URL * IN OUT void **Handle: Pointer to buffer to store HTTP * post handle * IN OUT char **contentType: Type of content * OUT int *contentLength: length of content * OUT int *httpStatus: HTTP status returned on receiving a * response message * IN int timeout: time out value * * Description: * Makes the HTTP GET message, connects to the peer, * sends the HTTP GET request, gets the response and parses the * response. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Paramters * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_BAD_RESPONSE ************************************************************************/ int http_OpenHttpGet( IN const char *url_str, IN OUT void **Handle, IN OUT char **contentType, OUT int *contentLength, OUT int *httpStatus, IN int timeout ) { return http_OpenHttpGetProxy(url_str, NULL, Handle, contentType, contentLength, httpStatus, timeout); } /************************************************************************ * Function: http_OpenHttpGetProxy * * Parameters: * IN const char *url_str; String as a URL * IN const char *proxy_str; String as a URL * IN OUT void **Handle; Pointer to buffer to store HTTP * post handle * IN OUT char **contentType; Type of content * OUT int *contentLength; length of content * OUT int *httpStatus; HTTP status returned on receiving a * response message * IN int timeout: time out value * * Description: * Makes the HTTP GET message, connects to the peer, * sends the HTTP GET request, gets the response and parses the response. * If a proxy URL is defined then the connection is made there. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Paramters * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_BAD_RESPONSE ************************************************************************/ int http_OpenHttpGetProxy( IN const char *url_str, IN const char *proxy_str, IN OUT void **Handle, IN OUT char **contentType, OUT int *contentLength, OUT int *httpStatus, IN int timeout ) { int ret_code; int http_error_code; memptr ctype; int tcp_connection; membuffer request; http_get_handle_t *handle = NULL; uri_type url; uri_type proxy; uri_type *peer; parse_status_t status; if( ( !url_str ) || ( !Handle ) || ( !contentType ) || ( !httpStatus ) ) { return UPNP_E_INVALID_PARAM; } ( *httpStatus ) = 0; ( *Handle ) = handle; ( *contentType ) = NULL; ( *contentLength ) = 0; if( ( ret_code = MakeGetMessage( url_str, proxy_str, &request, &url ) ) != UPNP_E_SUCCESS ) { return ret_code; } if( proxy_str ) { ret_code = http_FixStrUrl( ( char * )proxy_str, strlen( proxy_str ), &proxy ); peer = &proxy; } else { peer = &url; } handle = ( http_get_handle_t * ) malloc( sizeof( http_get_handle_t ) ); if( handle == NULL ) { return UPNP_E_OUTOF_MEMORY; } handle->entity_offset = 0; handle->cancel = 0; parser_response_init( &handle->response, HTTPMETHOD_GET ); tcp_connection = socket( peer->hostport.IPaddress.ss_family, SOCK_STREAM, 0 ); if( tcp_connection == -1 ) { ret_code = UPNP_E_SOCKET_ERROR; goto errorHandler; } if( sock_init( &handle->sock_info, tcp_connection ) != UPNP_E_SUCCESS ) { sock_destroy( &handle->sock_info, SD_BOTH ); ret_code = UPNP_E_SOCKET_ERROR; goto errorHandler; } ret_code = connect( handle->sock_info.socket, ( struct sockaddr * )&peer->hostport.IPaddress, sizeof( struct sockaddr_storage ) ); if( ret_code == -1 ) { sock_destroy( &handle->sock_info, SD_BOTH ); ret_code = UPNP_E_SOCKET_CONNECT; goto errorHandler; } // send request ret_code = http_SendMessage( &handle->sock_info, &timeout, "b", request.buf, request.length ); if( ret_code != 0 ) { sock_destroy( &handle->sock_info, SD_BOTH ); goto errorHandler; } status = ReadResponseLineAndHeaders( &handle->sock_info, &handle->response, &timeout, &http_error_code ); if( status != PARSE_OK ) { ret_code = UPNP_E_BAD_RESPONSE; goto errorHandler; } status = parser_get_entity_read_method( &handle->response ); if( ( status != PARSE_CONTINUE_1 ) && ( status != PARSE_SUCCESS ) ) { ret_code = UPNP_E_BAD_RESPONSE; goto errorHandler; } ( *httpStatus ) = handle->response.msg.status_code; ret_code = UPNP_E_SUCCESS; if( httpmsg_find_hdr( &handle->response.msg, HDR_CONTENT_TYPE, &ctype ) == NULL ) { *contentType = NULL; // no content-type } else { *contentType = ctype.buf; } if( handle->response.position == POS_COMPLETE ) { ( *contentLength ) = 0; } else if( handle->response.ent_position == ENTREAD_USING_CHUNKED ) { ( *contentLength ) = UPNP_USING_CHUNKED; } else if( handle->response.ent_position == ENTREAD_USING_CLEN ) { ( *contentLength ) = handle->response.content_length; } else if( handle->response.ent_position == ENTREAD_UNTIL_CLOSE ) { ( *contentLength ) = UPNP_UNTIL_CLOSE; } errorHandler: ( *Handle ) = handle; membuffer_destroy( &request ); if( ret_code != UPNP_E_SUCCESS ) { httpmsg_destroy( &handle->response.msg ); } return ret_code; } /************************************************************************ * Function: http_SendStatusResponse * * Parameters: * IN SOCKINFO *info; Socket information object * IN int http_status_code; error code returned while making * or sending the response message * IN int request_major_version; request major version * IN int request_minor_version; request minor version * * Description: * Generate a response message for the status query and send the * status response. * * Return: int * 0 -- success * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_WRITE * UPNP_E_TIMEDOUT ************************************************************************/ int http_SendStatusResponse( IN SOCKINFO * info, IN int http_status_code, IN int request_major_version, IN int request_minor_version ) { int response_major, response_minor; membuffer membuf; int ret; int timeout; http_CalcResponseVersion( request_major_version, request_minor_version, &response_major, &response_minor ); membuffer_init( &membuf ); membuf.size_inc = 70; ret = http_MakeMessage( &membuf, response_major, response_minor, "RSCB", http_status_code, // response start line http_status_code ); // body if( ret == 0 ) { timeout = HTTP_DEFAULT_TIMEOUT; ret = http_SendMessage( info, &timeout, "b", membuf.buf, membuf.length ); } membuffer_destroy( &membuf ); return ret; } /************************************************************************ * Function: http_MakeMessage * * Parameters: * INOUT membuffer* buf; buffer with the contents of the * message * IN int http_major_version; HTTP major version * IN int http_minor_version; HTTP minor version * IN const char* fmt; Pattern format * ...; * * Description: * Generate an HTTP message based on the format that is specified * in the input parameters. * * fmt types: * 'B': arg = int status_code * appends content-length, content-type and HTML body * for given code * 'b': arg1 = const char* buf; * arg2 = size_t buf_length memory ptr * 'C': (no args) appends a HTTP CONNECTION: close header * depending on major,minor version * 'c': (no args) appends CRLF "\r\n" * 'D': (no args) appends HTTP DATE: header * 'd': arg = int number // appends decimal number * 'G': arg = range information // add range header * 'h': arg = off_t number // appends off_t number * 'K': (no args) // add chunky header * 'N': arg1 = off_t content_length // content-length header * 'q': arg1 = http_method_t // request start line and HOST header * arg2 = (uri_type *) * 'Q': arg1 = http_method_t; // start line of request * arg2 = char* url; * arg3 = size_t url_length * 'R': arg = int status_code // adds a response start line * 'S': (no args) appends HTTP SERVER: header * 's': arg = const char* C_string * 'T': arg = char * content_type; format * e.g: "text/html"; content-type header * 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt * 'U': (no args) appends HTTP USER-AGENT: header * 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent * * Return: int * 0 - On Success * UPNP_E_OUTOF_MEMORY * UPNP_E_INVALID_URL ************************************************************************/ int http_MakeMessage( INOUT membuffer * buf, IN int http_major_version, IN int http_minor_version, IN const char *fmt, ... ) { char c; char *s = NULL; size_t num; off_t bignum; size_t length; time_t *loc_time; time_t curr_time; struct tm *date; char *start_str, *end_str; int status_code; const char *status_msg; http_method_t method; const char *method_str; const char *url_str; const char *temp_str; uri_type url; uri_type *uri_ptr; int error_code = UPNP_E_OUTOF_MEMORY; va_list argp; char tempbuf[200]; const char *weekday_str = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; const char *month_str = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0" "Jul\0Aug\0Sep\0Oct\0Nov\0Dec"; va_start( argp, fmt ); while( ( c = *fmt++ ) != 0 ) { if( c == 's' ) { // C string s = ( char * )va_arg( argp, char * ); assert( s ); UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s); if( membuffer_append( buf, s, strlen( s ) ) != 0 ) { goto error_handler; } } else if( c == 'K' ) { // Add Chunky header if( membuffer_append ( buf, "TRANSFER-ENCODING: chunked\r\n", strlen( "Transfer-Encoding: chunked\r\n" ) ) != 0 ) { goto error_handler; } } else if( c == 'G' ) { // Add Range header struct SendInstruction *RespInstr; RespInstr = (struct SendInstruction *) va_arg( argp, struct SendInstruction *); assert( RespInstr ); // connection header if( membuffer_append ( buf, RespInstr->RangeHeader, strlen( RespInstr->RangeHeader ) ) != 0 ) { goto error_handler; } } else if( c == 'b' ) { // mem buffer s = ( char * )va_arg( argp, char * ); UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__, "Adding a char Buffer starting with: %c\n", s[0]); assert( s ); length = ( size_t ) va_arg( argp, size_t ); if( membuffer_append( buf, s, length ) != 0 ) { goto error_handler; } } else if( c == 'c' ) { // crlf if( membuffer_append( buf, "\r\n", 2 ) != 0 ) { goto error_handler; } } else if( c == 'd' ) { // integer num = ( int )va_arg( argp, int ); sprintf( tempbuf, "%"PRIzu, num ); if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { goto error_handler; } } else if( c == 'h' ) { // off_t bignum = ( off_t )va_arg( argp, off_t ); sprintf( tempbuf, "%"PRId64, (int64_t)bignum ); if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { goto error_handler; } } else if( c == 't' || c == 'D' ) { // date if( c == 'D' ) { // header start_str = "DATE: "; end_str = "\r\n"; curr_time = time( NULL ); date = gmtime( &curr_time ); } else { // date value only start_str = end_str = ""; loc_time = ( time_t * ) va_arg( argp, time_t * ); assert( loc_time ); date = gmtime( loc_time ); } sprintf( tempbuf, "%s%s, %02d %s %d %02d:%02d:%02d GMT%s", start_str, &weekday_str[date->tm_wday * 4], date->tm_mday, &month_str[date->tm_mon * 4], date->tm_year + 1900, date->tm_hour, date->tm_min, date->tm_sec, end_str ); if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { goto error_handler; } } else if( c == 'C' ) { if( ( http_major_version > 1 ) || ( http_major_version == 1 && http_minor_version == 1 ) ) { // connection header if( membuffer_append_str( buf, "CONNECTION: close\r\n" ) != 0 ) { goto error_handler; } } } else if( c == 'N' ) { // content-length header bignum = ( off_t )va_arg( argp, off_t ); assert( bignum >= 0 ); if (http_MakeMessage( buf, http_major_version, http_minor_version, "shc", "CONTENT-LENGTH: ", bignum ) != 0 ) { goto error_handler; } } else if( c == 'S' || c == 'U' ) { // SERVER or USER-AGENT header temp_str = ( c == 'S' ) ? "SERVER: " : "USER-AGENT: "; get_sdk_info( tempbuf ); if (http_MakeMessage( buf, http_major_version, http_minor_version, "ss", temp_str, tempbuf ) != 0 ) { goto error_handler; } } else if( c == 'X' ) { // C string s = ( char * )va_arg( argp, char * ); assert( s ); if( membuffer_append_str( buf, "X-User-Agent: ") != 0 ) { goto error_handler; } if( membuffer_append( buf, s, strlen( s ) ) != 0 ) { goto error_handler; } } else if( c == 'R' ) { // response start line // e.g.: 'HTTP/1.1 200 OK' // // code status_code = ( int )va_arg( argp, int ); assert( status_code > 0 ); sprintf( tempbuf, "HTTP/%d.%d %d ", http_major_version, http_minor_version, status_code ); // str status_msg = http_get_code_text( status_code ); if (http_MakeMessage( buf, http_major_version, http_minor_version, "ssc", tempbuf, status_msg ) != 0 ) { goto error_handler; } } else if( c == 'B' ) { // body of a simple reply // status_code = ( int )va_arg( argp, int ); sprintf( tempbuf, "%s%d %s%s", "

", status_code, http_get_code_text( status_code ), "

" ); bignum = strlen( tempbuf ); if (http_MakeMessage( buf, http_major_version, http_minor_version, "NTcs", bignum, // content-length "text/html", // content-type tempbuf ) != 0 // body ) { goto error_handler; } } else if( c == 'Q' ) { // request start line // GET /foo/bar.html HTTP/1.1\r\n method = ( http_method_t ) va_arg( argp, http_method_t ); method_str = method_to_str( method ); url_str = ( const char * )va_arg( argp, const char * ); num = ( size_t )va_arg( argp, size_t ); // length of url_str if (http_MakeMessage( buf, http_major_version, http_minor_version, "ssbsdsdc", method_str, // method " ", url_str, num, // url " HTTP/", http_major_version, ".", http_minor_version ) != 0 ) { goto error_handler; } } else if( c == 'q' ) { // request start line and HOST header method = ( http_method_t ) va_arg( argp, http_method_t ); uri_ptr = ( uri_type * ) va_arg( argp, uri_type * ); assert( uri_ptr ); if( http_FixUrl( uri_ptr, &url ) != 0 ) { error_code = UPNP_E_INVALID_URL; goto error_handler; } if (http_MakeMessage( buf, http_major_version, http_minor_version, "Q" "sbc", method, url.pathquery.buff, url.pathquery.size, "HOST: ", url.hostport.text.buff, url.hostport.text.size ) != 0 ) { goto error_handler; } } else if( c == 'T' ) { // content type header temp_str = ( const char * )va_arg( argp, const char * ); // type/subtype format if (http_MakeMessage( buf, http_major_version, http_minor_version, "ssc", "CONTENT-TYPE: ", temp_str ) != 0 ) { goto error_handler; } } else { assert( 0 ); } } return 0; error_handler: va_end( argp ); membuffer_destroy( buf ); return error_code; } /************************************************************************ * Function: http_CalcResponseVersion * * Parameters: * IN int request_major_vers; Request major version * IN int request_minor_vers; Request minor version * OUT int* response_major_vers; Response mojor version * OUT int* response_minor_vers; Response minor version * * Description: * Calculate HTTP response versions based on the request versions. * * Return: void ************************************************************************/ void http_CalcResponseVersion( IN int request_major_vers, IN int request_minor_vers, OUT int *response_major_vers, OUT int *response_minor_vers ) { if( ( request_major_vers > 1 ) || ( request_major_vers == 1 && request_minor_vers >= 1 ) ) { *response_major_vers = 1; *response_minor_vers = 1; } else { *response_major_vers = request_major_vers; *response_minor_vers = request_minor_vers; } } /************************************************************************ * Function: MakeGetMessageEx * * Parameters: * const char *url_str; String as a URL * membuffer *request; Buffer containing the request * uri_type *url; URI object containing the scheme, path * query token, etc. * * Description: * Makes the message for the HTTP GET method * * Returns: * UPNP_E_INVALID_URL * Error Codes returned by http_MakeMessage * UPNP_E_SUCCESS ************************************************************************/ int MakeGetMessageEx( const char *url_str, membuffer * request, uri_type * url, struct SendInstruction *pRangeSpecifier ) { int errCode = UPNP_E_SUCCESS; char *urlPath = NULL; size_t hostlen = 0; char *hoststr, *temp; do { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n", url_str ); if( ( errCode = http_FixStrUrl( ( char * )url_str, strlen( url_str ), url ) ) != UPNP_E_SUCCESS ) { break; } // make msg membuffer_init( request ); urlPath = alloca( strlen( url_str ) + 1 ); if( !urlPath ) { errCode = UPNP_E_OUTOF_MEMORY; break; } memset( urlPath, 0, strlen( url_str ) + 1 ); strcpy( urlPath, url_str ); hoststr = strstr( urlPath, "//" ); if( hoststr == NULL ) { errCode = UPNP_E_INVALID_URL; break; } hoststr += 2; temp = strchr( hoststr, '/' ); if( temp == NULL ) { errCode = UPNP_E_INVALID_URL; break; } *temp = '\0'; hostlen = strlen( hoststr ); *temp = '/'; UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen ); errCode = http_MakeMessage( request, 1, 1, "Q" "s" "bc" "GDCUc", HTTPMETHOD_GET, url->pathquery.buff, url->pathquery.size, "HOST: ", hoststr, hostlen, pRangeSpecifier ); if( errCode != 0 ) { UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Makemessage failed\n" ); membuffer_destroy( request ); return errCode; } } while( 0 ); UpnpPrintf(UPNP_INFO, HTTP, __FILE__, __LINE__, "HTTP Buffer:\n%s\n" "----------END--------\n", request->buf); return errCode; } #define SIZE_RANGE_BUFFER 50 /************************************************************************ * Function: http_OpenHttpGetEx * * Parameters: * IN const char *url_str; String as a URL * IN OUT void **Handle; Pointer to buffer to store HTTP * post handle * IN OUT char **contentType; Type of content * OUT int *contentLength; length of content * OUT int *httpStatus; HTTP status returned on receiving a * response message * IN int timeout; time out value * * Description: * Makes the HTTP GET message, connects to the peer, * sends the HTTP GET request, gets the response and parses the * response. * * Return: int * UPNP_E_SUCCESS - On Success * UPNP_E_INVALID_PARAM - Invalid Paramters * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * UPNP_E_BAD_RESPONSE ************************************************************************/ int http_OpenHttpGetEx( IN const char *url_str, IN OUT void **Handle, IN OUT char **contentType, OUT int *contentLength, OUT int *httpStatus, IN int lowRange, IN int highRange, IN int timeout ) { int http_error_code; memptr ctype; int tcp_connection; membuffer request; http_get_handle_t *handle = NULL; uri_type url; parse_status_t status; int errCode = UPNP_E_SUCCESS; // char rangeBuf[SIZE_RANGE_BUFFER]; struct SendInstruction rangeBuf; do { // Checking Input parameters if( ( !url_str ) || ( !Handle ) || ( !contentType ) || ( !httpStatus ) ) { errCode = UPNP_E_INVALID_PARAM; break; } // Initialize output parameters ( *httpStatus ) = 0; ( *Handle ) = handle; ( *contentType ) = NULL; ( *contentLength ) = 0; if( lowRange > highRange ) { errCode = UPNP_E_INTERNAL_ERROR; break; } memset( &rangeBuf, 0, sizeof( rangeBuf ) ); sprintf( rangeBuf.RangeHeader, "Range: bytes=%d-%d\r\n", lowRange, highRange ); membuffer_init( &request ); if( ( errCode = MakeGetMessageEx( url_str, &request, &url, &rangeBuf ) ) != UPNP_E_SUCCESS ) { break; } handle = ( http_get_handle_t * ) malloc( sizeof( http_get_handle_t ) ); if( handle == NULL ) { errCode = UPNP_E_OUTOF_MEMORY; break; } memset( handle, 0, sizeof( *handle ) ); handle->entity_offset = 0; parser_response_init( &handle->response, HTTPMETHOD_GET ); tcp_connection = socket( url.hostport.IPaddress.ss_family, SOCK_STREAM, 0 ); if( tcp_connection == -1 ) { errCode = UPNP_E_SOCKET_ERROR; free( handle ); break; } if( sock_init( &handle->sock_info, tcp_connection ) != UPNP_E_SUCCESS ) { sock_destroy( &handle->sock_info, SD_BOTH ); errCode = UPNP_E_SOCKET_ERROR; free( handle ); break; } errCode = connect( handle->sock_info.socket, ( struct sockaddr * )&url.hostport.IPaddress, sizeof( struct sockaddr_storage ) ); if( errCode == -1 ) { sock_destroy( &handle->sock_info, SD_BOTH ); errCode = UPNP_E_SOCKET_CONNECT; free( handle ); break; } // send request errCode = http_SendMessage( &handle->sock_info, &timeout, "b", request.buf, request.length ); if( errCode != UPNP_E_SUCCESS ) { sock_destroy( &handle->sock_info, SD_BOTH ); free( handle ); break; } status = ReadResponseLineAndHeaders( &handle->sock_info, &handle->response, &timeout, &http_error_code ); if( status != PARSE_OK ) { errCode = UPNP_E_BAD_RESPONSE; free( handle ); break; } status = parser_get_entity_read_method( &handle->response ); if( ( status != PARSE_CONTINUE_1 ) && ( status != PARSE_SUCCESS ) ) { errCode = UPNP_E_BAD_RESPONSE; free( handle ); break; } ( *httpStatus ) = handle->response.msg.status_code; errCode = UPNP_E_SUCCESS; if( httpmsg_find_hdr( &handle->response.msg, HDR_CONTENT_TYPE, &ctype ) == NULL ) { *contentType = NULL; // no content-type } else { *contentType = ctype.buf; } if( handle->response.position == POS_COMPLETE ) { ( *contentLength ) = 0; } else if( handle->response.ent_position == ENTREAD_USING_CHUNKED ) { ( *contentLength ) = UPNP_USING_CHUNKED; } else if( handle->response.ent_position == ENTREAD_USING_CLEN ) { ( *contentLength ) = handle->response.content_length; } else if( handle->response.ent_position == ENTREAD_UNTIL_CLOSE ) { ( *contentLength ) = UPNP_UNTIL_CLOSE; } ( *Handle ) = handle; } while( 0 ); membuffer_destroy( &request ); return errCode; } /************************************************************************ * Function: get_sdk_info * * Parameters: * OUT char *info; buffer to store the operating system information * * Description: * Returns the server information for the operating system * * Return: * UPNP_INLINE void ************************************************************************/ // 'info' should have a size of at least 100 bytes void get_sdk_info( OUT char *info ) { #ifdef WIN32 OSVERSIONINFO versioninfo; versioninfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx(&versioninfo)!=0) { sprintf( info, "%d.%d.%d %d/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION"\r\n", versioninfo.dwMajorVersion, versioninfo.dwMinorVersion, versioninfo.dwBuildNumber, versioninfo.dwPlatformId, versioninfo.szCSDVersion ); } else { *info = '\0'; } #else int ret_code; struct utsname sys_info; ret_code = uname( &sys_info ); if( ret_code == -1 ) { *info = '\0'; } sprintf( info, "%s/%s, UPnP/1.0, Portable SDK for UPnP devices/"PACKAGE_VERSION "\r\n", sys_info.sysname, sys_info.release ); #endif } libupnp-1.8.0~svn20100507/upnp/src/genlib/net/http/parsetools.c0000644000175000017500000000573011021325543020774 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// /************************************************************************ * Purpose: This file a function to extract the header information from * * an http message and then matches the data with XML data. * ************************************************************************/ #include "config.h" #include #include "util.h" #include "membuffer.h" #include "httpparser.h" #include "statcodes.h" #include "parsetools.h" /************************************************************************ * Function: has_xml_content_type * * Parameters: * IN http_message_t* hmsg ; HTTP Message object * * Description: Find the header from the HTTP message and match the * header for xml data. * * Returns: * BOOLEAN ************************************************************************/ xboolean has_xml_content_type( IN http_message_t * hmsg ) { memptr hdr_value; assert( hmsg ); // find 'content-type' header which must have text/xml if( httpmsg_find_hdr( hmsg, HDR_CONTENT_TYPE, &hdr_value ) != NULL && matchstr( hdr_value.buf, hdr_value.length, "%itext%w/%wxml" ) == PARSE_OK ) { return TRUE; } return FALSE; } libupnp-1.8.0~svn20100507/upnp/src/genlib/net/http/statcodes.c0000644000175000017500000001570111021325543020571 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// /************************************************************************ * Purpose: This file defines status codes, buffers to store the status * * messages and functions to manipulate those buffers * ************************************************************************/ #include "config.h" #include #include #include "util.h" #include "statcodes.h" #ifdef WIN32 #include "unixutil.h" #endif #define NUM_1XX_CODES 2 static const char *Http1xxCodes[NUM_1XX_CODES]; static const char *Http1xxStr = "Continue\0" "Switching Protocols\0"; #define NUM_2XX_CODES 7 static const char *Http2xxCodes[NUM_2XX_CODES]; static const char *Http2xxStr = "OK\0" "Created\0" "Accepted\0" "Non-Authoratative Information\0" "No Content\0" "Reset Content\0" "Partial Content\0"; #define NUM_3XX_CODES 8 static const char *Http3xxCodes[NUM_3XX_CODES]; static const char *Http3xxStr = "Multiple Choices\0" "Moved Permanently\0" "Found\0" "See Other\0" "Not Modified\0" "Use Proxy\0" "\0" "Temporary Redirect\0"; #define NUM_4XX_CODES 18 static const char *Http4xxCodes[NUM_4XX_CODES]; static const char *Http4xxStr = "Bad Request\0" "Unauthorized\0" "Payment Required\0" "Forbidden\0" "Not Found\0" "Method Not Allowed\0" "Not Acceptable\0" "Proxy Authentication Required\0" "Request Timeout\0" "Conflict\0" "Gone\0" "Length Required\0" "Precondition Failed\0" "Request Entity Too Large\0" "Request-URI Too Long\0" "Unsupported Media Type\0" "Requested Range Not Satisfiable\0" "Expectation Failed\0"; #define NUM_5XX_CODES 6 static const char *Http5xxCodes[NUM_5XX_CODES]; static const char *Http5xxStr = "Internal Server Error\0" "Not Implemented\0" "Bad Gateway\0" "Service Unavailable\0" "Gateway Timeout\0" "HTTP Version Not Supported\0"; static xboolean gInitialized = FALSE; /************************************************************************ ************************* Functions ************************************* ************************************************************************/ /************************************************************************ * Function: init_table * * Parameters: * IN const char* encoded_str ; status code encoded string * OUT const char *table[] ; table to store the encoded status code * strings * IN int tbl_size ; size of the table * * Description: Initializing table representing an array of string * pointers with the individual strings that are comprised in the * input const char* encoded_str parameter. * * Returns: * void ************************************************************************/ static UPNP_INLINE void init_table( IN const char *encoded_str, OUT const char *table[], IN int tbl_size ) { int i; const char *s = encoded_str; for( i = 0; i < tbl_size; i++ ) { table[i] = s; s += strlen( s ) + 1; // next entry } } /************************************************************************ * Function: init_tables * * Parameters: * none * * Description: Initializing tables with HTTP strings and different HTTP * codes. * * Returns: * void ************************************************************************/ static UPNP_INLINE void init_tables( void ) { init_table( Http1xxStr, Http1xxCodes, NUM_1XX_CODES ); init_table( Http2xxStr, Http2xxCodes, NUM_2XX_CODES ); init_table( Http3xxStr, Http3xxCodes, NUM_3XX_CODES ); init_table( Http4xxStr, Http4xxCodes, NUM_4XX_CODES ); init_table( Http5xxStr, Http5xxCodes, NUM_5XX_CODES ); gInitialized = TRUE; // mark only after complete } /************************************************************************ * Function: http_get_code_text * * Parameters: * int statusCode ; Status code based on which the status table and * status message is returned * * Description: Return the right status message based on the passed in * int statusCode input parameter * * Returns: * const char* ptr - pointer to the status message string ************************************************************************/ const char * http_get_code_text( int statusCode ) { int index; int table_num; if( !gInitialized ) { init_tables(); } if( statusCode < 100 && statusCode >= 600 ) { return NULL; } index = statusCode % 100; table_num = statusCode / 100; if( table_num == 1 && index < NUM_1XX_CODES ) { return Http1xxCodes[index]; } if( table_num == 2 && index < NUM_2XX_CODES ) { return Http2xxCodes[index]; } if( table_num == 3 && index < NUM_3XX_CODES ) { return Http3xxCodes[index]; } if( table_num == 4 && index < NUM_4XX_CODES ) { return Http4xxCodes[index]; } if( table_num == 5 && index < NUM_5XX_CODES ) { return Http5xxCodes[index]; } return NULL; } libupnp-1.8.0~svn20100507/upnp/src/genlib/net/sock.c0000644000175000017500000002243111021325543016556 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ /************************************************************************ * Purpose: This file implements the sockets functionality ************************************************************************/ #include "config.h" #include "sock.h" #include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */ #include "upnp.h" #include #include #include #include #ifndef MSG_NOSIGNAL #define MSG_NOSIGNAL 0 #endif /************************************************************************ * Function : sock_init * * Parameters : * OUT SOCKINFO* info ; Socket Information Object * IN SOCKET sockfd ; Socket Descriptor * * Description : Assign the passed in socket descriptor to socket * descriptor in the SOCKINFO structure. * * Return : int; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * * Note : ************************************************************************/ int sock_init( OUT SOCKINFO * info, IN SOCKET sockfd ) { assert( info ); memset( info, 0, sizeof( SOCKINFO ) ); info->socket = sockfd; return UPNP_E_SUCCESS; } /************************************************************************ * Function : sock_init_with_ip * * Parameters : * OUT SOCKINFO* info ; Socket Information Object * IN SOCKET sockfd ; Socket Descriptor * IN struct sockaddr* foreign_sockaddr; remote socket address. * * Description : Calls the sock_init function and assigns the passed in * IP address and port to the IP address and port in the SOCKINFO * structure. * * Return : int; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * UPNP_E_SOCKET_ERROR * * Note : ************************************************************************/ int sock_init_with_ip( OUT SOCKINFO * info, IN SOCKET sockfd, IN struct sockaddr* foreign_sockaddr ) { int ret; ret = sock_init( info, sockfd ); if( ret != UPNP_E_SUCCESS ) { return ret; } memcpy( &info->foreign_sockaddr, foreign_sockaddr, sizeof( info->foreign_sockaddr) ); return UPNP_E_SUCCESS; } /************************************************************************ * Function : sock_destroy * * Parameters : * INOUT SOCKINFO* info ; Socket Information Object * int ShutdownMethod ; How to shutdown the socket. Used by * sockets's shutdown() * * Description : Shutsdown the socket using the ShutdownMethod to * indicate whether sends and receives on the socket will be * dis-allowed. After shutting down the socket, closesocket is called * to release system resources used by the socket calls. * * Return : int; * UPNP_E_SOCKET_ERROR on failure * UPNP_E_SUCCESS on success * * Note : ************************************************************************/ int sock_destroy( INOUT SOCKINFO * info, int ShutdownMethod ) { if( info->socket != INVALID_SOCKET ) { shutdown( info->socket, ShutdownMethod ); if( UpnpCloseSocket( info->socket ) == -1 ) { return UPNP_E_SOCKET_ERROR; } } return UPNP_E_SUCCESS; } /************************************************************************ * Function : sock_read_write * * Parameters : * IN SOCKINFO *info ; Socket Information Object * OUT char* buffer ; Buffer to get data to or send data from * IN size_t bufsize ; Size of the buffer * IN int *timeoutSecs ; timeout value * IN xboolean bRead ; Boolean value specifying read or write option * * Description : Receives or sends data. Also returns the time taken * to receive or send data. * * Return :int ; * numBytes - On Success, no of bytes received or sent * UPNP_E_TIMEDOUT - Timeout * UPNP_E_SOCKET_ERROR - Error on socket calls * * Note : ************************************************************************/ static int sock_read_write( IN SOCKINFO * info, OUT char *buffer, IN size_t bufsize, IN int *timeoutSecs, IN xboolean bRead ) { int retCode; fd_set readSet; fd_set writeSet; struct timeval timeout; int numBytes; time_t start_time = time( NULL ); SOCKET sockfd = info->socket; long bytes_sent = 0, byte_left = 0, num_written; if( *timeoutSecs < 0 ) { return UPNP_E_TIMEDOUT; } FD_ZERO( &readSet ); FD_ZERO( &writeSet ); if( bRead ) { FD_SET( sockfd, &readSet ); } else { FD_SET( sockfd, &writeSet ); } timeout.tv_sec = *timeoutSecs; timeout.tv_usec = 0; while( TRUE ) { if( *timeoutSecs == 0 ) { retCode = select( sockfd + 1, &readSet, &writeSet, NULL, NULL ); } else { retCode = select( sockfd + 1, &readSet, &writeSet, NULL, &timeout ); } if( retCode == 0 ) { return UPNP_E_TIMEDOUT; } if( retCode == -1 ) { if( errno == EINTR ) continue; return UPNP_E_SOCKET_ERROR; // error } else { break; // read or write } } #ifdef SO_NOSIGPIPE { int old; int set = 1; socklen_t olen = sizeof(old); getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen); setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set)); #endif if( bRead ) { // read data numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL); } else { byte_left = bufsize; bytes_sent = 0; while( byte_left > 0 ) { // write data num_written = send( sockfd, buffer + bytes_sent, byte_left, MSG_DONTROUTE|MSG_NOSIGNAL); if( num_written == -1 ) { #ifdef SO_NOSIGPIPE setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen); #endif return num_written; } byte_left = byte_left - num_written; bytes_sent += num_written; } numBytes = bytes_sent; } #ifdef SO_NOSIGPIPE setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen); } #endif if( numBytes < 0 ) { return UPNP_E_SOCKET_ERROR; } // subtract time used for reading/writing if( *timeoutSecs != 0 ) { *timeoutSecs -= time( NULL ) - start_time; } return numBytes; } /************************************************************************ * Function : sock_read * * Parameters : * IN SOCKINFO *info ; Socket Information Object * OUT char* buffer ; Buffer to get data to * IN size_t bufsize ; Size of the buffer * IN int *timeoutSecs ; timeout value * * Description : Calls sock_read_write() for reading data on the * socket * * Return : int; * Values returned by sock_read_write() * * Note : ************************************************************************/ int sock_read( IN SOCKINFO * info, OUT char *buffer, IN size_t bufsize, INOUT int *timeoutSecs ) { return sock_read_write( info, buffer, bufsize, timeoutSecs, TRUE ); } /************************************************************************ * Function : sock_write * * Parameters : * IN SOCKINFO *info ; Socket Information Object * IN char* buffer ; Buffer to send data from * IN size_t bufsize ; Size of the buffer * IN int *timeoutSecs ; timeout value * * Description : Calls sock_read_write() for writing data on the * socket * * Return : int; * sock_read_write() * * Note : ************************************************************************/ int sock_write( IN SOCKINFO * info, IN char *buffer, IN size_t bufsize, INOUT int *timeoutSecs ) { return sock_read_write( info, buffer, bufsize, timeoutSecs, FALSE ); } libupnp-1.8.0~svn20100507/upnp/src/genlib/util/0000777000175000017500000000000011373047472015740 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/util/membuffer.c0000644000175000017500000004054111365106163017766 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /************************************************************************ * Purpose: This file contains functions that operate on memory and * buffers, allocation, re-allocation, and modification of the memory ************************************************************************/ #include "config.h" #include #include #include #include #include "upnp.h" #include "unixutil.h" /************************************************************************ * string * ************************************************************************/ /************************************************************************ * Function : str_alloc * * Parameters : * IN const char* str ; input string object * IN size_t str_len ; input string length * * Description : Allocate memory and copy information from the input * string to the newly allocated memory. * * Return : char* ; * Pointer to the newly allocated memory. * NULL if memory cannot be allocated. * * Note : ************************************************************************/ char * str_alloc( IN const char *str, IN size_t str_len ) { char *s; s = ( char * )malloc( str_len + 1 ); if( s == NULL ) { return NULL; // no mem } memcpy( s, str, str_len ); s[str_len] = '\0'; return s; } /************************************************************************ * memptr * ************************************************************************/ /************************************************************************ * Function : memptr_cmp * * Parameters : * IN memptr* m ; input memory object * IN const char* s ; constatnt string for the memory object to be * compared with * * Description : Compares characters of strings passed for number of * bytes. If equal for the number of bytes, the length of the bytes * determines which buffer is shorter. * * Return : int ; * < 0 string1 substring less than string2 substring * 0 string1 substring identical to string2 substring * > 0 string1 substring greater than string2 substring * * Note : ************************************************************************/ int memptr_cmp( IN memptr * m, IN const char *s ) { int cmp; cmp = strncmp( m->buf, s, m->length ); if( cmp == 0 && m->length < strlen( s ) ) { // both strings equal for 'm->length' chars // if m is shorter than s, then s is greater return -1; } return cmp; } /************************************************************************ * Function : memptr_cmp_nocase * * Parameters : * IN memptr* m ; input memory object * IN const char* s ; constatnt string for the memory object to be * compared with * * Description : Compares characters of 2 strings irrespective of the * case for a specific count of bytes If the character comparison * is the same the length of the 2 srings determines the shorter * of the 2 strings. * * Return : int ; * < 0 string1 substring less than string2 substring * 0 string1 substring identical to string2 substring * > 0 string1 substring greater than string2 substring * * Note : ************************************************************************/ int memptr_cmp_nocase( IN memptr * m, IN const char *s ) { int cmp; cmp = strncasecmp( m->buf, s, m->length ); if( cmp == 0 && m->length < strlen( s ) ) { // both strings equal for 'm->length' chars // if m is shorter than s, then s is greater return -1; } return cmp; } /************************************************************************ * membuffer * ************************************************************************/ /************************************************************************ * Function : membuffer_initialize * * Parameters : * INOUT membuffer* m ; buffer to be initialized * * Description : Initialize the buffer * * Return : void ; * * Note : ************************************************************************/ static UPNP_INLINE void membuffer_initialize( INOUT membuffer * m ) { m->buf = NULL; m->length = 0; m->capacity = 0; } /************************************************************************ * Function : membuffer_set_size * * Parameters : * INOUT membuffer* m ; buffer whose size is to be modified * IN size_t new_length ; new size to which the buffer will be * modified * * Description : Increases or decreases buffer cap so that at least * 'new_length' bytes can be stored * * Return : int ; * UPNP_E_SUCCESS - On Success * UPNP_E_OUTOF_MEMORY - On failure to allocate memory. * * Note : ************************************************************************/ int membuffer_set_size( INOUT membuffer * m, IN size_t new_length ) { size_t diff; size_t alloc_len; char *temp_buf; if( new_length >= m->length ) // increase length { // need more mem? if( new_length <= m->capacity ) { return 0; // have enough mem; done } diff = new_length - m->length; alloc_len = MAXVAL( m->size_inc, diff ) + m->capacity; } else // decrease length { assert( new_length <= m->length ); // if diff is 0..m->size_inc, don't free if( ( m->capacity - new_length ) <= m->size_inc ) { return 0; } alloc_len = new_length + m->size_inc; } assert( alloc_len >= new_length ); temp_buf = realloc( m->buf, alloc_len + 1 ); //LEAK_FIX_MK //temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );//LEAK_FIX_MK if( temp_buf == NULL ) { // try smaller size alloc_len = new_length; temp_buf = realloc( m->buf, alloc_len + 1 ); //LEAK_FIX_MK //temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );//LEAK_FIX_MK if( temp_buf == NULL ) { return UPNP_E_OUTOF_MEMORY; } } // save m->buf = temp_buf; m->capacity = alloc_len; return 0; } /************************************************************************ * Function : membuffer_init * * Parameters : * INOUT membuffer* m ; buffer to be initialized * * Description : Wrapper to membuffer_initialize(). * Set the size of the buffer to MEMBUF_DEF_SIZE_INC * Initializes m->buf to NULL, length=0 * * Return : void ; * * Note : ************************************************************************/ void membuffer_init( INOUT membuffer * m ) { assert( m != NULL ); m->size_inc = MEMBUF_DEF_SIZE_INC; membuffer_initialize( m ); } /************************************************************************ * Function : membuffer_destroy * * Parameters : * INOUT membuffer* m ; buffer to be destroyed * * Description : Free's memory allocated for membuffer* m. * * Return : void ; * * Note : ************************************************************************/ void membuffer_destroy( INOUT membuffer * m ) { if( m == NULL ) { return; } free( m->buf ); membuffer_init( m ); } /************************************************************************ * Function : membuffer_assign * * Parameters : * INOUT membuffer* m ; buffer whose memory is to be allocated and * assigned. * IN const void* buf ; source buffer whose contents will be copied * IN size_t buf_len ; length of the source buffer * * Description : Allocate memory to membuffer* m and copy the contents * of the in parameter IN const void* buf. * * Return : int ; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * * Note : ************************************************************************/ int membuffer_assign( INOUT membuffer * m, IN const void *buf, IN size_t buf_len ) { int return_code; assert( m != NULL ); // set value to null if( buf == NULL ) { membuffer_destroy( m ); return 0; } // alloc mem return_code = membuffer_set_size( m, buf_len ); if( return_code != 0 ) { return return_code; } // copy if( buf_len ) { memcpy( m->buf, buf, buf_len ); m->buf[buf_len] = 0; // null-terminate } m->length = buf_len; return 0; } /************************************************************************ * Function : membuffer_assign_str * * Parameters : * INOUT membuffer* m ; buffer to be allocated and assigned * IN const char* c_str ; source buffer whose contents will be * copied * * Description : Wrapper function for membuffer_assign() * * Return : int ; * UPNP_E_SUCCESS * UPNP_E_OUTOF_MEMORY * * Note : ************************************************************************/ int membuffer_assign_str( INOUT membuffer * m, IN const char *c_str ) { return membuffer_assign( m, c_str, strlen( c_str ) ); } /************************************************************************ * Function : membuffer_append * * Parameters : * INOUT membuffer* m ; buffer whose memory is to be appended. * IN const void* buf ; source buffer whose contents will be * copied * IN size_t buf_len ; length of the source buffer * * Description : Invokes function to appends data from a constant buffer * to the buffer * * Return : int ; * * Note : ************************************************************************/ int membuffer_append( INOUT membuffer * m, IN const void *buf, IN size_t buf_len ) { assert( m != NULL ); return membuffer_insert( m, buf, buf_len, m->length ); } /************************************************************************ * Function : membuffer_append_str * * Parameters : * INOUT membuffer* m ; buffer whose memory is to be appended. * IN const char* c_str ; source buffer whose contents will be * copied * * Description : Invokes function to appends data from a constant string * to the buffer * * Return : int ; * * Note : ************************************************************************/ int membuffer_append_str( INOUT membuffer * m, IN const char *c_str ) { return membuffer_insert( m, c_str, strlen( c_str ), m->length ); } /************************************************************************ * Function : membuffer_insert * * Parameters : * INOUT membuffer* m ; buffer whose memory size is to be increased * and appended. * IN const void* buf ; source buffer whose contents will be * copied * IN size_t buf_len ; size of the source buffer * int index ; index to determine the bounds while movinf the data * * Description : Allocates memory for the new data to be inserted. Does * memory management by moving the data from the existing memory to * the newly allocated memory and then appending the new data. * * Return : int ; * * Note : ************************************************************************/ int membuffer_insert( INOUT membuffer * m, IN const void *buf, IN size_t buf_len, int index ) { int return_code; assert( m != NULL ); if( index < 0 || index > ( int )m->length ) return UPNP_E_OUTOF_BOUNDS; if( buf == NULL || buf_len == 0 ) { return 0; } // alloc mem return_code = membuffer_set_size( m, m->length + buf_len ); if( return_code != 0 ) { return return_code; } // insert data // move data to right of insertion point memmove( m->buf + index + buf_len, m->buf + index, m->length - index ); memcpy( m->buf + index, buf, buf_len ); m->length += buf_len; m->buf[m->length] = 0; // null-terminate return 0; } /************************************************************************ * Function : membuffer_delete * * Parameters : * INOUT membuffer* m ; buffer whose memory size is to be decreased * and copied to the odified location * IN int index ; index to determine bounds while moving data * IN size_t num_bytes ; number of bytes that the data needs to * shrink by * * Description : Shrink the size of the buffer depending on the current * size of the bufer and te input parameters. Move contents from the * old buffer to the new sized buffer. * * Return : void ; * * Note : ************************************************************************/ void membuffer_delete( INOUT membuffer * m, IN int index, IN size_t num_bytes ) { int return_value; int new_length; size_t copy_len; assert( m != NULL ); if (!m) return; if( m->length == 0 ) { return; } assert( index >= 0 && index < ( int )m->length ); // shrink count if it goes beyond buffer if( index + num_bytes > m->length ) { num_bytes = m->length - ( size_t ) index; copy_len = 0; // every thing at and after index purged } else { // calc num bytes after deleted string copy_len = m->length - ( index + num_bytes ); } memmove( m->buf + index, m->buf + index + num_bytes, copy_len ); new_length = m->length - num_bytes; return_value = membuffer_set_size( m, new_length ); // trim buffer assert( return_value == 0 ); // shrinking should always work // don't modify until buffer is set m->length = new_length; m->buf[new_length] = 0; } /************************************************************************ * Function : membuffer_detach * * Parameters : * INOUT membuffer* m ; buffer to be returned and updated. * * Description : Detaches current buffer and returns it. The caller * must free the returned buffer using free(). * After this call, length becomes 0. * * Return : char* ; * a pointer to the current buffer * * Note : ************************************************************************/ char * membuffer_detach( INOUT membuffer * m ) { char *buf; assert( m != NULL ); buf = m->buf; // free all membuffer_initialize( m ); return buf; } /************************************************************************ * Function : membuffer_attach * * Parameters : * INOUT membuffer* m ; buffer to be updated * IN char* new_buf ; source buffer which will be assigned to the * buffer to be updated * IN size_t buf_len ; length of the source buffer * * Description : Free existing memory in membuffer and assign the new * buffer in its place. * * Return : void ; * * Note : 'new_buf' must be allocted using malloc or realloc so * that it can be freed using free() ************************************************************************/ void membuffer_attach( INOUT membuffer * m, IN char *new_buf, IN size_t buf_len ) { assert( m != NULL ); membuffer_destroy( m ); m->buf = new_buf; m->length = buf_len; m->capacity = buf_len; } libupnp-1.8.0~svn20100507/upnp/src/genlib/util/upnp_timeout.c0000644000175000017500000000402411025042301020524 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /*! * \file * * \brief Contains a function for freeing the memory associated with a upnp * time out event. */ #include "config.h" #include "upnp_timeout.h" #include /* for free() */ void free_upnp_timeout(upnp_timeout *event) { if (event) { if (event->Event) { free(event->Event); } free(event); } } libupnp-1.8.0~svn20100507/upnp/src/genlib/util/strintmap.c0000644000175000017500000001110011021325543020016 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// /************************************************************************ * Purpose: This file contains string to integer and integer to string * conversion functions ************************************************************************/ #include "config.h" #include "strintmap.h" #include "membuffer.h" /************************************************************************ * Function : map_str_to_int * * Parameters : * IN const char* name ; string containing the name to be matched * IN size_t name_len ; size of the string to be matched * IN str_int_entry* table ; table of entries that need to be * matched. * IN int num_entries ; number of entries in the table that need * to be searched. * IN xboolean case_sensitive ; whether the case should be case * sensitive or not * * Description : Match the given name with names from the entries in the * table. Returns the index of the table when the entry is found. * * Return : int ; * index - On Success * -1 - On failure * * Note : ************************************************************************/ int map_str_to_int( IN const char *name, IN size_t name_len, IN str_int_entry * table, IN int num_entries, IN xboolean case_sensitive ) { int top, mid, bot; int cmp; memptr name_ptr; name_ptr.buf = ( char * )name; name_ptr.length = name_len; top = 0; bot = num_entries - 1; while( top <= bot ) { mid = ( top + bot ) / 2; if( case_sensitive ) { //cmp = strcmp( name, table[mid].name ); cmp = memptr_cmp( &name_ptr, table[mid].name ); } else { //cmp = strcasecmp( name, table[mid].name ); cmp = memptr_cmp_nocase( &name_ptr, table[mid].name ); } if( cmp > 0 ) { top = mid + 1; // look below mid } else if( cmp < 0 ) { bot = mid - 1; // look above mid } else // cmp == 0 { return mid; // match; return table index } } return -1; // header name not found } /************************************************************************ * Function : map_int_to_str * * Parameters : * IN int id ; ID to be matched * IN str_int_entry* table ; table of entries that need to be * matched. * IN int num_entries ; number of entries in the table that need * to be searched. * * Description : Returns the index from the table where the id matches * the entry from the table. * * Return : int ; * * Note : ************************************************************************/ int map_int_to_str( IN int id, IN str_int_entry * table, IN int num_entries ) { int i; for( i = 0; i < num_entries; i++ ) { if( table[i].id == id ) { return i; } } return -1; } libupnp-1.8.0~svn20100507/upnp/src/genlib/util/util.c0000644000175000017500000001017611025042301016756 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /************************************************************************ * Purpose: This file contains functions for copying strings based on * different options. ************************************************************************/ #include "config.h" #include "upnp.h" #include "util.h" #include /************************************************************************ * Function : linecopy * * Parameters : * OUT char dest[LINE_SIZE] ; output buffer * IN const char* src ; input buffer * * Description : Copy no of bytes spcified by the LINE_SIZE constant, * from the source buffer. Null terminate the destination buffer * * Return : void ; * * Note : ************************************************************************/ void linecopy( OUT char dest[LINE_SIZE], IN const char *src ) { strncpy( dest, src, LINE_SIZE - 1 ); dest[LINE_SIZE - 1] = '\0'; // null-terminate if len(src) >= LINE_SIZE } /************************************************************************ * Function : namecopy * * Parameters : * OUT char dest[NAME_SIZE] ; output buffer * IN const char* src ; input buffer * * Description : Copy no of bytes spcified by the NAME_SIZE constant, * from the source buffer. Null terminate the destination buffer * * Return : void ; * * Note : ************************************************************************/ void namecopy( OUT char dest[NAME_SIZE], IN const char *src ) { strncpy( dest, src, NAME_SIZE - 1 ); dest[NAME_SIZE - 1] = '\0'; // null-terminate if len(src) >= NAME_SIZE } /************************************************************************ * Function : linecopylen * * Parameters : * OUT char dest[LINE_SIZE] ; output buffer * IN const char* src ; input buffer * IN size_t srclen ; bytes to be copied. * * Description : Determine if the srclen passed in paramter is less than * the permitted LINE_SIZE. If it is use the passed parameter, if not * use the permitted LINE_SIZE as the length parameter * Copy no of bytes spcified by the LINE_SIZE constant, * from the source buffer. Null terminate the destination buffer * * Return : void ; * * Note : ************************************************************************/ void linecopylen( OUT char dest[LINE_SIZE], IN const char *src, IN size_t srclen ) { int len; len = srclen < ( LINE_SIZE - 1 ) ? srclen : ( LINE_SIZE - 1 ); strncpy( dest, src, len ); dest[len] = '\0'; } libupnp-1.8.0~svn20100507/upnp/src/genlib/miniserver/0000777000175000017500000000000011373047472017146 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/miniserver/miniserver.c0000644000175000017500000007036311372263256021421 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #include "config.h" /*! * \file * * \brief This file implements the functionality and utility functions * used by the Miniserver module. * * The miniserver is a central point for processing all network requests. * It is made of: * - The SSDP sockets for discovery. * - The HTTP listeners for description / control / eventing. * */ #include "miniserver.h" #include "httpreadwrite.h" #include "ithread.h" #include "ssdplib.h" #include "statcodes.h" #include "ThreadPool.h" #include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */ #include "upnpapi.h" #include "util.h" #include #include #include #include #include #include #define APPLICATION_LISTENING_PORT 49152 struct mserv_request_t { /*! Connection handle. */ int connfd; struct sockaddr_storage foreign_sockaddr; }; typedef enum { MSERV_IDLE, MSERV_RUNNING, MSERV_STOPPING } MiniServerState; unsigned short miniStopSockPort; //////////////////////////////////////////////////////////////////////////// // module vars static MiniServerCallback gGetCallback = NULL; static MiniServerCallback gSoapCallback = NULL; static MiniServerCallback gGenaCallback = NULL; static MiniServerState gMServState = MSERV_IDLE; void SetHTTPGetCallback(MiniServerCallback callback) { gGetCallback = callback; } #ifdef INCLUDE_DEVICE_APIS void SetSoapCallback(MiniServerCallback callback) { gSoapCallback = callback; } #endif /* INCLUDE_DEVICE_APIS */ void SetGenaCallback(MiniServerCallback callback) { gGenaCallback = callback; } #ifdef INTERNAL_WEB_SERVER /*! * \brief Based on the type pf message, appropriate callback is issued. * * \return 0 on Success or HTTP_INTERNAL_SERVER_ERROR if Callback is NULL. */ static int dispatch_request( /*! [in] Socket Information object. */ IN SOCKINFO *info, /*! [in] HTTP parser object. */ http_parser_t *hparser) { MiniServerCallback callback; switch (hparser->msg.method) { /* Soap Call */ case SOAPMETHOD_POST: case HTTPMETHOD_MPOST: callback = gSoapCallback; break; /* Gena Call */ case HTTPMETHOD_NOTIFY: case HTTPMETHOD_SUBSCRIBE: case HTTPMETHOD_UNSUBSCRIBE: UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver %d: got GENA msg\n", info->socket); callback = gGenaCallback; break; /* HTTP server call */ case HTTPMETHOD_GET: case HTTPMETHOD_POST: case HTTPMETHOD_HEAD: case HTTPMETHOD_SIMPLEGET: callback = gGetCallback; break; default: callback = NULL; } if (callback == NULL) { return HTTP_INTERNAL_SERVER_ERROR; } callback(hparser, &hparser->msg, info); return 0; } /*! * \brief Send Error Message. */ static UPNP_INLINE void handle_error( /*! [in] Socket Information object. */ SOCKINFO *info, /*! [in] HTTP Error Code. */ int http_error_code, /*! [in] Major Version Number. */ int major, /*! [in] Minor Version Number. */ int minor) { http_SendStatusResponse(info, http_error_code, major, minor); } /*! * \brief Free memory assigned for handling request and unitialize socket * functionality. */ static void free_handle_request_arg( /*! [in] Request Message to be freed. */ void *args) { struct mserv_request_t *request = (struct mserv_request_t *)args; shutdown(request->connfd, SD_BOTH); UpnpCloseSocket(request->connfd); free(request); } /*! * \brief Receive the request and dispatch it for handling. */ static void handle_request( /*! [in] Request Message to be handled. */ void *args) { SOCKINFO info; int http_error_code; int ret_code; int major = 1; int minor = 1; http_parser_t parser; http_message_t *hmsg = NULL; int timeout = HTTP_DEFAULT_TIMEOUT; struct mserv_request_t *request = (struct mserv_request_t *)args; int connfd = request->connfd; UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver %d: READING\n", connfd ); //parser_request_init( &parser ); ////LEAK_FIX_MK hmsg = &parser.msg; ret_code = sock_init_with_ip( &info, connfd, (struct sockaddr *)&request->foreign_sockaddr); if (ret_code != UPNP_E_SUCCESS) { free(request); httpmsg_destroy(hmsg); return; } // read ret_code = http_RecvMessage( &info, &parser, HTTPMETHOD_UNKNOWN, &timeout, &http_error_code); if (ret_code != 0) { goto error_handler; } UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver %d: PROCESSING...\n", connfd); // dispatch http_error_code = dispatch_request( &info, &parser ); if (http_error_code != 0) { goto error_handler; } http_error_code = 0; error_handler: if (http_error_code > 0) { if (hmsg) { major = hmsg->major_version; minor = hmsg->minor_version; } handle_error(&info, http_error_code, major, minor); } UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver %d: COMPLETE\n", connfd); sock_destroy(&info, SD_BOTH); // should shutdown completely httpmsg_destroy(hmsg); free(request); } /*! * \brief Initilize the thread pool to handle a request, sets priority for the * job and adds the job to the thread pool. */ static UPNP_INLINE void schedule_request_job( /*! [in] Socket Descriptor on which connection is accepted. */ int connfd, /*! [in] Clients Address information. */ struct sockaddr *clientAddr) { struct mserv_request_t *request; ThreadPoolJob job; request = (struct mserv_request_t *)malloc(sizeof (struct mserv_request_t)); if (request == NULL) { UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, "mserv %d: out of memory\n", connfd ); shutdown( connfd, SD_BOTH ); UpnpCloseSocket( connfd ); return; } request->connfd = connfd; memcpy(&request->foreign_sockaddr, clientAddr, sizeof(request->foreign_sockaddr)); TPJobInit(&job, (start_routine)handle_request, (void *)request); TPJobSetFreeFunction(&job, free_handle_request_arg); TPJobSetPriority(&job, MED_PRIORITY); if (ThreadPoolAdd(&gMiniServerThreadPool, &job, NULL) != 0) { UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "mserv %d: cannot schedule request\n", connfd); free(request); shutdown(connfd, SD_BOTH); UpnpCloseSocket(connfd); return; } } #endif /*! * \brief Run the miniserver. * * The MiniServer accepts a new request and schedules a thread to handle the * new request. Checks for socket state and invokes appropriate read and * shutdown actions for the Miniserver and SSDP sockets. */ static void RunMiniServer( /*! [in] Socket Array. */ MiniServerSockArray *miniSock) { char errorBuffer[ERROR_BUFFER_LEN]; struct sockaddr_storage clientAddr; socklen_t clientLen; SOCKET connectHnd; SOCKET miniServStopSock = miniSock->miniServerStopSock; SOCKET ssdpSock4 = miniSock->ssdpSock4; SOCKET ssdpSock6 = miniSock->ssdpSock6; #ifdef INTERNAL_WEB_SERVER SOCKET miniServSock4 = miniSock->miniServerSock4; SOCKET miniServSock6 = miniSock->miniServerSock6; #endif /* INTERNAL_WEB_SERVER */ #ifdef INCLUDE_CLIENT_APIS SOCKET ssdpReqSock4 = miniSock->ssdpReqSock4; SOCKET ssdpReqSock6 = miniSock->ssdpReqSock6; #endif /* INCLUDE_CLIENT_APIS */ char buf_ntop[64]; fd_set expSet; fd_set rdSet; unsigned int maxMiniSock = 0; int byteReceived; char requestBuf[256]; int ret = 0; #ifdef INTERNAL_WEB_SERVER if (miniServSock4 != INVALID_SOCKET) { maxMiniSock = max(maxMiniSock, miniServSock4); } if (miniServSock6 != INVALID_SOCKET) { maxMiniSock = max(maxMiniSock, miniServSock6); } #endif /* INTERNAL_WEB_SERVER */ if (ssdpSock4 != INVALID_SOCKET) { maxMiniSock = max(maxMiniSock, ssdpSock4); } if (ssdpSock6 != INVALID_SOCKET) { maxMiniSock = max(maxMiniSock, ssdpSock6); } #ifdef INCLUDE_CLIENT_APIS if (ssdpReqSock4 != INVALID_SOCKET) { maxMiniSock = max(maxMiniSock, ssdpReqSock4); } if (ssdpReqSock6 != INVALID_SOCKET) { maxMiniSock = max(maxMiniSock, ssdpReqSock6); } #endif /* INCLUDE_CLIENT_APIS */ maxMiniSock = max(maxMiniSock, miniServStopSock); ++maxMiniSock; gMServState = MSERV_RUNNING; while(TRUE) { FD_ZERO(&rdSet); FD_ZERO(&expSet); FD_SET(miniServStopSock, &expSet); FD_SET(miniServStopSock, &rdSet); #ifdef INTERNAL_WEB_SERVER if(miniServSock4 != INVALID_SOCKET) { FD_SET(miniServSock4, &rdSet); } if(miniServSock6 != INVALID_SOCKET) { FD_SET(miniServSock6, &rdSet); } #endif /* INTERNAL_WEB_SERVER */ if(ssdpSock4 != INVALID_SOCKET) { FD_SET(ssdpSock4, &rdSet); } if(ssdpSock6 != INVALID_SOCKET) { FD_SET(ssdpSock6, &rdSet); } #ifdef INCLUDE_CLIENT_APIS if(ssdpReqSock4 != INVALID_SOCKET) { FD_SET(ssdpReqSock4, &rdSet); } if(ssdpReqSock6 != INVALID_SOCKET) { FD_SET(ssdpReqSock6, &rdSet); } #endif /* INCLUDE_CLIENT_APIS */ ret = select(maxMiniSock, &rdSet, NULL, &expSet, NULL); if (ret == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in select(): %s\n", errorBuffer); /* Avoid 100% CPU in case of repeated error in select() */ isleep(1); continue; } else { #ifdef INTERNAL_WEB_SERVER if (miniServSock6 != INVALID_SOCKET && FD_ISSET(miniServSock6, &rdSet)) { clientLen = sizeof( clientAddr ); connectHnd = accept(miniServSock6, (struct sockaddr *)&clientAddr, &clientLen); if (connectHnd == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver: Error in accept(): %s\n", errorBuffer); continue; } schedule_request_job( connectHnd, (struct sockaddr *)&clientAddr); } if (miniServSock4 != INVALID_SOCKET && FD_ISSET(miniServSock4, &rdSet)) { clientLen = sizeof(clientAddr); connectHnd = accept(miniServSock4, (struct sockaddr *)&clientAddr, &clientLen); if (connectHnd == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver: Error in accept(): %s\n", errorBuffer); continue; } schedule_request_job( connectHnd, (struct sockaddr *)&clientAddr); } #endif /* INTERNAL_WEB_SERVER */ #ifdef INCLUDE_CLIENT_APIS // ssdp if (ssdpReqSock6 != INVALID_SOCKET && FD_ISSET(ssdpReqSock6, &rdSet)) { readFromSSDPSocket(ssdpReqSock6); } if (ssdpReqSock4 != INVALID_SOCKET && FD_ISSET( ssdpReqSock4, &rdSet)) { readFromSSDPSocket(ssdpReqSock4); } #endif /* INCLUDE_CLIENT_APIS */ if (ssdpSock6 != INVALID_SOCKET && FD_ISSET(ssdpSock6, &rdSet)) { readFromSSDPSocket(ssdpSock6); } if (ssdpSock4 != INVALID_SOCKET && FD_ISSET(ssdpSock4, &rdSet)) { readFromSSDPSocket(ssdpSock4); } if (FD_ISSET( miniServStopSock, &rdSet)) { clientLen = sizeof(clientAddr); memset((char *)&clientAddr, 0, sizeof(clientAddr)); byteReceived = recvfrom(miniServStopSock, requestBuf, 25, 0, (struct sockaddr *)&clientAddr, &clientLen); if (byteReceived > 0) { requestBuf[byteReceived] = '\0'; inet_ntop(AF_INET, &((struct sockaddr_in*)&clientAddr)->sin_addr, buf_ntop, sizeof(buf_ntop)); UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, "Received response: %s From host %s \n", requestBuf, buf_ntop ); UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__, "Received multicast packet: \n %s\n", requestBuf); if (NULL != strstr(requestBuf, "ShutDown")) { break; } } } } } #ifdef INTERNAL_WEB_SERVER shutdown(miniServSock4, SD_BOTH); UpnpCloseSocket(miniServSock4); shutdown(miniServSock6, SD_BOTH); UpnpCloseSocket(miniServSock6); #endif /* INTERNAL_WEB_SERVER */ shutdown(miniServStopSock, SD_BOTH); UpnpCloseSocket(miniServStopSock); shutdown(ssdpSock4, SD_BOTH); UpnpCloseSocket(ssdpSock4); shutdown(ssdpSock6, SD_BOTH); UpnpCloseSocket(ssdpSock6); #ifdef INCLUDE_CLIENT_APIS shutdown(ssdpReqSock4, SD_BOTH); UpnpCloseSocket(ssdpReqSock4); shutdown(ssdpReqSock6, SD_BOTH); UpnpCloseSocket(ssdpReqSock6); #endif /* INCLUDE_CLIENT_APIS */ free(miniSock); gMServState = MSERV_IDLE; return; } /*! * \brief Returns port to which socket, sockfd, is bound. * * \return -1 on error; check errno, otherwise > 0 means port number. */ static int get_port( /*! [in] Socket descriptor. */ int sockfd) { struct sockaddr_storage sockinfo; socklen_t len; int code; int port = 0; len = sizeof(sockinfo); code = getsockname(sockfd, (struct sockaddr *)&sockinfo, &len); if (code == -1) { return -1; } if (sockinfo.ss_family == AF_INET) { port = ntohs(((struct sockaddr_in*)&sockinfo)->sin_port); } else if(sockinfo.ss_family == AF_INET6) { port = ntohs(((struct sockaddr_in6*)&sockinfo)->sin6_port); } UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "sockfd = %d, .... port = %d\n", sockfd, port); return port; } #ifdef INTERNAL_WEB_SERVER /*! * \brief Creates a STREAM socket, binds to INADDR_ANY and listens for * incoming connecttions. Returns the actual port which the sockets * sub-system returned. * * Also creates a DGRAM socket, binds to the loop back address and * returns the port allocated by the socket sub-system. * * \return * \li UPNP_E_OUTOF_SOCKET: Failed to create a socket. * \li UPNP_E_SOCKET_BIND: Bind() failed. * \li UPNP_E_LISTEN: Listen() failed. * \li UPNP_E_INTERNAL_ERROR: Port returned by the socket layer is < 0. * \li UPNP_E_SUCCESS: Success. */ static int get_miniserver_sockets( /*! [in] Socket Array. */ MiniServerSockArray *out, /*! [in] port on which the server is listening for incoming IPv4 connections. */ unsigned short listen_port4, /*! [in] port on which the server is listening for incoming IPv6 connections. */ unsigned short listen_port6) { char errorBuffer[ERROR_BUFFER_LEN]; struct sockaddr_storage __ss_v4; struct sockaddr_storage __ss_v6; struct sockaddr_in* serverAddr4 = (struct sockaddr_in*)&__ss_v4; struct sockaddr_in6* serverAddr6 = (struct sockaddr_in6*)&__ss_v6; SOCKET listenfd4, listenfd6; int ret_code; unsigned short actual_port4, actual_port6; int reuseaddr_on = 0; int sockError = UPNP_E_SUCCESS; int errCode = 0; // Create listen socket for IPv4/IPv6. An error here may indicate // that we don't have an IPv4/IPv6 stack. listenfd4 = socket(AF_INET, SOCK_STREAM, 0); listenfd6 = socket(AF_INET6, SOCK_STREAM, 0); if (listenfd4 == INVALID_SOCKET && listenfd6 == INVALID_SOCKET) { return UPNP_E_OUTOF_SOCKET; } // As per the IANA specifications for the use of ports by applications // override the listen port passed in with the first available if (listen_port4 < APPLICATION_LISTENING_PORT) { listen_port4 = APPLICATION_LISTENING_PORT; } if (listen_port6 < APPLICATION_LISTENING_PORT) { listen_port6 = APPLICATION_LISTENING_PORT; } memset(&__ss_v4, 0, sizeof (__ss_v4)); serverAddr4->sin_family = AF_INET; serverAddr4->sin_addr.s_addr = htonl(INADDR_ANY); memset(&__ss_v6, 0, sizeof (__ss_v6)); serverAddr6->sin6_family = AF_INET6; serverAddr6->sin6_addr = in6addr_any; // Getting away with implementation of re-using address:port and instead // choosing to increment port numbers. // Keeping the re-use address code as an optional behaviour that can be // turned on if necessary. // TURN ON the reuseaddr_on option to use the option. if (reuseaddr_on) { // THIS IS ALLOWS US TO BIND AGAIN IMMEDIATELY // AFTER OUR SERVER HAS BEEN CLOSED // THIS MAY CAUSE TCP TO BECOME LESS RELIABLE // HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "get_miniserver_sockets: resuseaddr set\n"); if (listenfd4 != INVALID_SOCKET) { sockError = setsockopt(listenfd4, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseaddr_on, sizeof (int)); if (sockError == -1) { shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); return UPNP_E_SOCKET_BIND; } serverAddr4->sin_port = htons(listen_port4); sockError = bind(listenfd4, (struct sockaddr *)&__ss_v4, sizeof (__ss_v4)); if (sockError == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, "get_miniserver_sockets: Error in IPv4 bind(): %s\n", errorBuffer); shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); /* Bind failed */ return UPNP_E_SOCKET_BIND; } } if(listenfd6 != INVALID_SOCKET) { sockError = setsockopt(listenfd6, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuseaddr_on, sizeof (int)); if (sockError == -1) { shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); return UPNP_E_SOCKET_BIND; } serverAddr6->sin6_port = htons(listen_port6); sockError = bind(listenfd6, (struct sockaddr *)&__ss_v6, sizeof (__ss_v6)); if (sockError == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "get_miniserver_sockets: Error in IPv6 bind(): %s\n", errorBuffer); shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); /* Bind failed */ return UPNP_E_SOCKET_BIND; } } } else { if (listenfd4 != INVALID_SOCKET) { unsigned short orig_listen_port4 = listen_port4; do { serverAddr4->sin_port = htons(listen_port4++); sockError = bind(listenfd4, (struct sockaddr *)serverAddr4, sizeof(*serverAddr4)); if (sockError == -1) { #ifdef WIN32 errCode = WSAGetLastError(); #else errCode = errno; #endif if (errno == EADDRINUSE) { errCode = 1; } } else { errCode = 0; } } while ( errCode != 0 && (listen_port4 >= orig_listen_port4) ); if (sockError == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "get_miniserver_sockets: Error in IPv4 bind(): %s\n", errorBuffer); shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); return UPNP_E_SOCKET_BIND; // bind failed } } if (listenfd6 != INVALID_SOCKET) { unsigned short orig_listen_port6 = listen_port6; do { serverAddr6->sin6_port = htons(listen_port6++); sockError = bind(listenfd6, (struct sockaddr *)serverAddr6, sizeof(*serverAddr6)); if (sockError == -1) { #ifdef WIN32 errCode = WSAGetLastError(); #else errCode = errno; #endif if (errno == EADDRINUSE) { errCode = 1; } } else { errCode = 0; } } while (errCode != 0 && (listen_port6 >= orig_listen_port6)); if (sockError == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "get_miniserver_sockets: Error in IPv6 bind(): %s\n", errorBuffer); shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); /* Bind failied */ return UPNP_E_SOCKET_BIND; } } } UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, "get_miniserver_sockets: bind successful\n" ); if (listenfd4 != INVALID_SOCKET) { ret_code = listen(listenfd4, SOMAXCONN); if (ret_code == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "mserv start: Error in IPv4 listen(): %s\n", errorBuffer); shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); return UPNP_E_LISTEN; } actual_port4 = get_port(listenfd4); if (actual_port4 <= 0) { shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); return UPNP_E_INTERNAL_ERROR; } out->miniServerPort4 = actual_port4; } if (listenfd6 != INVALID_SOCKET) { ret_code = listen(listenfd6, SOMAXCONN); if (ret_code == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, MSERV, __FILE__, __LINE__, "mserv start: Error in IPv6 listen(): %s\n", errorBuffer); shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); return UPNP_E_LISTEN; } actual_port6 = get_port(listenfd6); if (actual_port6 <= 0) { shutdown(listenfd4, SD_BOTH); UpnpCloseSocket(listenfd4); shutdown(listenfd6, SD_BOTH); UpnpCloseSocket(listenfd6); return UPNP_E_INTERNAL_ERROR; } out->miniServerPort6 = actual_port6; } out->miniServerSock4 = listenfd4; out->miniServerSock6 = listenfd6; return UPNP_E_SUCCESS; } #endif /* INTERNAL_WEB_SERVER */ /*! * \brief Creates the miniserver STOP socket. This socket is created and * listened on to know when it is time to stop the Miniserver. * * \return * \li UPNP_E_OUTOF_SOCKET: Failed to create a socket. * \li UPNP_E_SOCKET_BIND: Bind() failed. * \li UPNP_E_INTERNAL_ERROR: Port returned by the socket layer is < 0. * \li UPNP_E_SUCCESS: Success. */ static int get_miniserver_stopsock( /*! [in] Miniserver Socket Array. */ MiniServerSockArray *out) { char errorBuffer[ERROR_BUFFER_LEN]; struct sockaddr_in stop_sockaddr; int miniServerStopSock = 0; int ret = 0; miniServerStopSock = socket(AF_INET, SOCK_DGRAM, 0); if (miniServerStopSock == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_CRITICAL, MSERV, __FILE__, __LINE__, "Error in socket(): %s\n", errorBuffer); return UPNP_E_OUTOF_SOCKET; } // bind to local socket memset(&stop_sockaddr, 0, sizeof (stop_sockaddr)); stop_sockaddr.sin_family = AF_INET; stop_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ret = bind(miniServerStopSock, (struct sockaddr *)&stop_sockaddr, sizeof(stop_sockaddr)); if (ret == -1) { UpnpPrintf(UPNP_CRITICAL, MSERV, __FILE__, __LINE__, "Error in binding localhost!!!\n"); shutdown(miniServerStopSock, SD_BOTH); UpnpCloseSocket(miniServerStopSock); return UPNP_E_SOCKET_BIND; } miniStopSockPort = get_port( miniServerStopSock ); if (miniStopSockPort <= 0) { shutdown(miniServerStopSock, SD_BOTH); UpnpCloseSocket(miniServerStopSock); return UPNP_E_INTERNAL_ERROR; } out->miniServerStopSock = miniServerStopSock; out->stopPort = miniStopSockPort; return UPNP_E_SUCCESS; } int StartMiniServer( /*! [in,out] Port on which the server listens for incoming IPv4 connections. */ unsigned short *listen_port4, /*! [in,out] Port on which the server listens for incoming IPv6 connections. */ unsigned short *listen_port6) { int ret_code; int count; int max_count = 10000; MiniServerSockArray *miniSocket; ThreadPoolJob job; if (gMServState != MSERV_IDLE) { return UPNP_E_INTERNAL_ERROR; // miniserver running } miniSocket = (MiniServerSockArray *)malloc(sizeof (MiniServerSockArray)); if (miniSocket == NULL) { return UPNP_E_OUTOF_MEMORY; } memset(miniSocket, 0, sizeof (*miniSocket)); #ifdef INTERNAL_WEB_SERVER // V4 and V6 http listeners. ret_code = get_miniserver_sockets(miniSocket, *listen_port4, *listen_port6); if (ret_code != UPNP_E_SUCCESS) { free(miniSocket); return ret_code; } #endif // Stop socket (To end miniserver processing). ret_code = get_miniserver_stopsock(miniSocket); if (ret_code != UPNP_E_SUCCESS) { #ifdef INTERNAL_WEB_SERVER shutdown(miniSocket->miniServerSock4, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock4); shutdown(miniSocket->miniServerSock6, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock6); #endif free(miniSocket); return ret_code; } // SSDP socket for discovery / advertising. ret_code = get_ssdp_sockets(miniSocket); if (ret_code != UPNP_E_SUCCESS) { #ifdef INTERNAL_WEB_SERVER shutdown(miniSocket->miniServerSock4, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock4); shutdown(miniSocket->miniServerSock6, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock6); #endif shutdown(miniSocket->miniServerStopSock, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerStopSock); free(miniSocket); return ret_code; } TPJobInit(&job, (start_routine)RunMiniServer, (void *)miniSocket); TPJobSetPriority(&job, MED_PRIORITY); TPJobSetFreeFunction(&job, (free_routine)free); ret_code = ThreadPoolAddPersistent(&gMiniServerThreadPool, &job, NULL); if (ret_code < 0) { #ifdef INTERNAL_WEB_SERVER shutdown(miniSocket->miniServerSock4, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock4); shutdown(miniSocket->miniServerSock6, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock6); #endif shutdown(miniSocket->miniServerStopSock, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerStopSock); shutdown(miniSocket->ssdpSock4, SD_BOTH); UpnpCloseSocket(miniSocket->ssdpSock4); shutdown(miniSocket->ssdpSock6, SD_BOTH); UpnpCloseSocket(miniSocket->ssdpSock6); #ifdef INCLUDE_CLIENT_APIS shutdown(miniSocket->ssdpReqSock4, SD_BOTH ); UpnpCloseSocket(miniSocket->ssdpReqSock4 ); shutdown(miniSocket->ssdpReqSock6, SD_BOTH ); UpnpCloseSocket(miniSocket->ssdpReqSock6 ); #endif return UPNP_E_OUTOF_MEMORY; } // wait for miniserver to start count = 0; while (gMServState != MSERV_RUNNING && count < max_count) { usleep(50 * 1000); // 0.05s count++; } // taking too long to start that thread if (count >= max_count) { #ifdef INTERNAL_WEB_SERVER shutdown(miniSocket->miniServerSock4, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock4); shutdown(miniSocket->miniServerSock6, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerSock6); #endif shutdown(miniSocket->miniServerStopSock, SD_BOTH); UpnpCloseSocket(miniSocket->miniServerStopSock); shutdown(miniSocket->ssdpSock4, SD_BOTH); UpnpCloseSocket(miniSocket->ssdpSock4); shutdown(miniSocket->ssdpSock6, SD_BOTH); UpnpCloseSocket(miniSocket->ssdpSock6); #ifdef INCLUDE_CLIENT_APIS shutdown(miniSocket->ssdpReqSock4, SD_BOTH); UpnpCloseSocket(miniSocket->ssdpReqSock4); shutdown(miniSocket->ssdpReqSock6, SD_BOTH); UpnpCloseSocket(miniSocket->ssdpReqSock6); #endif return UPNP_E_INTERNAL_ERROR; } #ifdef INTERNAL_WEB_SERVER *listen_port4 = miniSocket->miniServerPort4; *listen_port6 = miniSocket->miniServerPort6; #endif return UPNP_E_SUCCESS; } int StopMiniServer() { char errorBuffer[ERROR_BUFFER_LEN]; int socklen = sizeof (struct sockaddr_in); SOCKET sock; struct sockaddr_in ssdpAddr; char buf[256] = "ShutDown"; int bufLen = strlen(buf); if(gMServState == MSERV_RUNNING) { gMServState = MSERV_STOPPING; } else { return 0; } sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) { strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN); UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, "SSDP_SERVER: StopSSDPServer: Error in socket() %s\n", errorBuffer); return 0; } while(gMServState != MSERV_IDLE) { ssdpAddr.sin_family = AF_INET; ssdpAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ssdpAddr.sin_port = htons(miniStopSockPort); sendto(sock, buf, bufLen, 0, (struct sockaddr *)&ssdpAddr, socklen); usleep(1000); if (gMServState == MSERV_IDLE) { break; } isleep(1); } shutdown(sock, SD_BOTH); UpnpCloseSocket(sock); return 0; } libupnp-1.8.0~svn20100507/upnp/src/genlib/service_table/0000777000175000017500000000000011373047472017572 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/service_table/service_table.c0000644000175000017500000010273511336633540022465 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /************************************************************************ * Purpose: This file defines the functions for services. It defines * functions for adding and removing services to and from the service table, * adding and accessing subscription and other attributes pertaining to the * service ************************************************************************/ #include "config.h" #include "service_table.h" #ifdef INCLUDE_DEVICE_APIS /************************************************************************ * Function : copy_subscription * * Parameters : * subscription *in ; Source subscription * subscription *out ; Destination subscription * * Description : Makes a copy of the subscription * * Return : int ; * HTTP_SUCCESS - On Sucess * * Note : ************************************************************************/ int copy_subscription( subscription * in, subscription * out ) { int return_code = HTTP_SUCCESS; memcpy( out->sid, in->sid, SID_SIZE ); out->sid[SID_SIZE] = 0; out->eventKey = in->eventKey; out->ToSendEventKey = in->ToSendEventKey; out->expireTime = in->expireTime; out->active = in->active; if( ( return_code = copy_URL_list( &in->DeliveryURLs, &out->DeliveryURLs ) ) != HTTP_SUCCESS ) return return_code; out->next = NULL; return HTTP_SUCCESS; } /************************************************************************ * Function : RemoveSubscriptionSID * * Parameters : * Upnp_SID sid ; subscription ID * service_info * service ; service object providing the list of * subscriptions * * Description : Remove the subscription represented by the * const Upnp_SID sid parameter from the service table and update * the service table. * * Return : void ; * * Note : ************************************************************************/ void RemoveSubscriptionSID( Upnp_SID sid, service_info * service ) { subscription *finger = service->subscriptionList; subscription *previous = NULL; while( finger ) { if( !( strcmp( sid, finger->sid ) ) ) { if( previous ) previous->next = finger->next; else service->subscriptionList = finger->next; finger->next = NULL; freeSubscriptionList( finger ); finger = NULL; service->TotalSubscriptions--; } else { previous = finger; finger = finger->next; } } } subscription *GetSubscriptionSID(const Upnp_SID sid, service_info *service) { subscription *next = service->subscriptionList; subscription *previous = NULL; subscription *found = NULL; time_t current_time; while( ( next ) && ( found == NULL ) ) { if( !strcmp( next->sid, sid ) ) found = next; else { previous = next; next = next->next; } } if( found ) { //get the current_time time( ¤t_time ); if( ( found->expireTime != 0 ) && ( found->expireTime < current_time ) ) { if( previous ) previous->next = found->next; else service->subscriptionList = found->next; found->next = NULL; freeSubscriptionList( found ); found = NULL; service->TotalSubscriptions--; } } return found; } subscription *GetNextSubscription(service_info *service, subscription *current) { time_t current_time; subscription *next = NULL; subscription *previous = NULL; int notDone = 1; // get the current_time time( ¤t_time ); while( ( notDone ) && ( current ) ) { previous = current; current = current->next; if( current == NULL ) { notDone = 0; next = current; } else if( ( current->expireTime != 0 ) && ( current->expireTime < current_time ) ) { previous->next = current->next; current->next = NULL; freeSubscriptionList( current ); current = previous; service->TotalSubscriptions--; } else if( current->active ) { notDone = 0; next = current; } } return next; } subscription *GetFirstSubscription(service_info *service) { subscription temp; subscription *next = NULL; temp.next = service->subscriptionList; next = GetNextSubscription(service, &temp); service->subscriptionList = temp.next; // service->subscriptionList = next; return next; } void freeSubscription(subscription *sub) { if (sub) { free_URL_list(&sub->DeliveryURLs); } } /************************************************************************ * Function : freeSubscriptionList * * Parameters : * subscription * head ; head of the subscription list * * Description : Free's memory allocated for all the subscriptions * in the service table. * * Return : void ; * * Note : ************************************************************************/ void freeSubscriptionList( subscription * head ) { subscription *next = NULL; while( head ) { next = head->next; freeSubscription( head ); free( head ); head = next; } } /************************************************************************ * Function : FindServiceId * * Parameters : * service_table *table ; service table * const char * serviceId ;string representing the service id * to be found among those in the table * const char * UDN ; string representing the UDN * to be found among those in the table * * Description : Traverses through the service table and returns a * pointer to the service node that matches a known service id * and a known UDN * * Return : service_info * - pointer to the matching service_info node; * * Note : ************************************************************************/ service_info * FindServiceId( service_table * table, const char *serviceId, const char *UDN ) { service_info *finger = NULL; if( table ) { finger = table->serviceList; while( finger ) { if( ( !strcmp( serviceId, finger->serviceId ) ) && ( !strcmp( UDN, finger->UDN ) ) ) { return finger; } finger = finger->next; } } return NULL; } /************************************************************************ * Function : FindServiceEventURLPath * * Parameters : * service_table *table ; service table * char * eventURLPath ; event URL path used to find a service * from the table * * Description : Traverses the service table and finds the node whose * event URL Path matches a know value * * Return : service_info * - pointer to the service list node from the * service table whose event URL matches a known event URL; * * Note : ************************************************************************/ service_info * FindServiceEventURLPath( service_table * table, char *eventURLPath ) { service_info *finger = NULL; uri_type parsed_url; uri_type parsed_url_in; if( ( table ) && ( parse_uri ( eventURLPath, strlen( eventURLPath ), &parsed_url_in ) ) ) { finger = table->serviceList; while( finger ) { if( finger->eventURL ) if( ( parse_uri ( finger->eventURL, strlen( finger->eventURL ), &parsed_url ) ) ) { if( !token_cmp ( &parsed_url.pathquery, &parsed_url_in.pathquery ) ) return finger; } finger = finger->next; } } return NULL; } /************************************************************************ * Function : FindServiceControlURLPath * * Parameters : * service_table * table ; service table * char * controlURLPath ; control URL path used to find a service * from the table * * Description : Traverses the service table and finds the node whose * control URL Path matches a know value * * Return : service_info * - pointer to the service list node from the * service table whose control URL Path matches a known value; * * Note : ************************************************************************/ service_info * FindServiceControlURLPath( service_table * table, const char *controlURLPath ) { service_info *finger = NULL; uri_type parsed_url; uri_type parsed_url_in; if( ( table ) && ( parse_uri ( controlURLPath, strlen( controlURLPath ), &parsed_url_in ) ) ) { finger = table->serviceList; while( finger ) { if( finger->controlURL ) if( ( parse_uri ( finger->controlURL, strlen( finger->controlURL ), &parsed_url ) ) ) { if( !token_cmp ( &parsed_url.pathquery, &parsed_url_in.pathquery ) ) return finger; } finger = finger->next; } } return NULL; } /************************************************************************ * Function : printService * * Parameters : * service_info *service ;Service whose information is to be printed * Upnp_LogLevel level ; Debug level specified to the print function * Dbg_Module module ; Debug module specified to the print function * * Description : For debugging purposes prints information from the * service passed into the function. * * Return : void ; * * Note : ************************************************************************/ #ifdef DEBUG void printService( service_info *service, Upnp_LogLevel level, Dbg_Module module ) { if( service ) { if( service->serviceType ) { UpnpPrintf( level, module, __FILE__, __LINE__, "serviceType: %s\n", service->serviceType ); } if( service->serviceId ) { UpnpPrintf( level, module, __FILE__, __LINE__, "serviceId: %s\n", service->serviceId ); } if( service->SCPDURL ) { UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n", service->SCPDURL ); } if( service->controlURL ) { UpnpPrintf( level, module, __FILE__, __LINE__, "controlURL: %s\n", service->controlURL ); } if( service->eventURL ) { UpnpPrintf( level, module, __FILE__, __LINE__, "eventURL: %s\n", service->eventURL ); } if( service->UDN ) { UpnpPrintf( level, module, __FILE__, __LINE__, "UDN: %s\n\n", service->UDN ); } if( service->active ) { UpnpPrintf( level, module, __FILE__, __LINE__, "Service is active\n" ); } else { UpnpPrintf( level, module, __FILE__, __LINE__, "Service is inactive\n" ); } } } #endif /************************************************************************ * Function : printServiceList * * Parameters : * service_info *service ; Service whose information is to be printed * Upnp_LogLevel level ; Debug level specified to the print function * Dbg_Module module ; Debug module specified to the print function * * Description : For debugging purposes prints information of each * service from the service table passed into the function. * * Return : void ; * * Note : ************************************************************************/ #ifdef DEBUG void printServiceList( service_info * service, Upnp_LogLevel level, Dbg_Module module ) { while( service ) { if( service->serviceType ) { UpnpPrintf( level, module, __FILE__, __LINE__, "serviceType: %s\n", service->serviceType ); } if( service->serviceId ) { UpnpPrintf( level, module, __FILE__, __LINE__, "serviceId: %s\n", service->serviceId ); } if( service->SCPDURL ) { UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n", service->SCPDURL ); } if( service->controlURL ) { UpnpPrintf( level, module, __FILE__, __LINE__, "controlURL: %s\n", service->controlURL ); } if( service->eventURL ) { UpnpPrintf( level, module, __FILE__, __LINE__, "eventURL: %s\n", service->eventURL ); } if( service->UDN ) { UpnpPrintf( level, module, __FILE__, __LINE__, "UDN: %s\n\n", service->UDN ); } if( service->active ) { UpnpPrintf( level, module, __FILE__, __LINE__, "Service is active\n" ); } else { UpnpPrintf( level, module, __FILE__, __LINE__, "Service is inactive\n" ); } service = service->next; } } #endif /************************************************************************ * Function : printServiceTable * * Parameters : * service_table * table ; Service table to be printed * Upnp_LogLevel level ; Debug level specified to the print function * Dbg_Module module ; Debug module specified to the print function * * Description : For debugging purposes prints the URL base of the table * and information of each service from the service table passed into * the function. * * Return : void ; * * Note : ************************************************************************/ #ifdef DEBUG void printServiceTable( service_table * table, Upnp_LogLevel level, Dbg_Module module ) { UpnpPrintf( level, module, __FILE__, __LINE__, "URL_BASE: %s\n", table->URLBase ); UpnpPrintf( level, module, __FILE__, __LINE__, "Services: \n" ); printServiceList( table->serviceList, level, module );} #endif /************************************************************************ * Function : freeService * * Parameters : * service_info *in ; service information that is to be freed * * Description : Free's memory allocated for the various components * of the service entry in the service table. * * Return : void ; * * Note : ************************************************************************/ void freeService( service_info * in ) { if( in ) { if( in->serviceType ) ixmlFreeDOMString( in->serviceType ); if( in->serviceId ) ixmlFreeDOMString( in->serviceId ); if( in->SCPDURL ) free( in->SCPDURL ); if( in->controlURL ) free( in->controlURL ); if( in->eventURL ) free( in->eventURL ); if( in->UDN ) ixmlFreeDOMString( in->UDN ); if( in->subscriptionList ) freeSubscriptionList( in->subscriptionList ); in->TotalSubscriptions = 0; free( in ); } } /************************************************************************ * Function : freeServiceList * * Parameters : * service_info * head ; Head of the service list to be freed * * Description : Free's memory allocated for the various components * of each service entry in the service table. * * Return : void ; * * Note : ************************************************************************/ void freeServiceList( service_info * head ) { service_info *next = NULL; while( head ) { if( head->serviceType ) ixmlFreeDOMString( head->serviceType ); if( head->serviceId ) ixmlFreeDOMString( head->serviceId ); if( head->SCPDURL ) free( head->SCPDURL ); if( head->controlURL ) free( head->controlURL ); if( head->eventURL ) free( head->eventURL ); if( head->UDN ) ixmlFreeDOMString( head->UDN ); if( head->subscriptionList ) freeSubscriptionList( head->subscriptionList ); head->TotalSubscriptions = 0; next = head->next; free( head ); head = next; } } /************************************************************************ * Function : freeServiceTable * * Parameters : * service_table * table ; Service table whose memory needs to be * freed * * Description : Free's dynamic memory in table. * (does not free table, only memory within the structure) * * Return : void ; * * Note : ************************************************************************/ void freeServiceTable( service_table * table ) { ixmlFreeDOMString( table->URLBase ); freeServiceList( table->serviceList ); table->serviceList = NULL; table->endServiceList = NULL; } /************************************************************************ * Function : getElementValue * * Parameters : * IXML_Node *node ; Input node which provides the list of child * nodes * * Description : Returns the clone of the element value * * Return : DOMString ; * * Note : value must be freed with DOMString_free ************************************************************************/ DOMString getElementValue( IXML_Node * node ) { IXML_Node *child = ( IXML_Node * ) ixmlNode_getFirstChild( node ); const DOMString temp = NULL; if( ( child != 0 ) && ( ixmlNode_getNodeType( child ) == eTEXT_NODE ) ) { temp = ixmlNode_getNodeValue( child ); return ixmlCloneDOMString( temp ); } else { return NULL; } } /************************************************************************ * Function : getSubElement * * Parameters : * const char *element_name ; sub element name to be searched for * IXML_Node *node ; Input node which provides the list of child * nodes * IXML_Node **out ; Ouput node to which the matched child node is * returned. * * Description : Traverses through a list of XML nodes to find the * node with the known element name. * * Return : int ; * 1 - On Success * 0 - On Failure * * Note : ************************************************************************/ int getSubElement( const char *element_name, IXML_Node * node, IXML_Node ** out ) { const DOMString NodeName = NULL; int found = 0; IXML_Node *child = ( IXML_Node * ) ixmlNode_getFirstChild( node ); ( *out ) = NULL; while( ( child != NULL ) && ( !found ) ) { switch ( ixmlNode_getNodeType( child ) ) { case eELEMENT_NODE: NodeName = ixmlNode_getNodeName( child ); if( !strcmp( NodeName, element_name ) ) { ( *out ) = child; found = 1; return found; } break; default: break; } child = ( IXML_Node * ) ixmlNode_getNextSibling( child ); } return found; } /************************************************************************ * Function : getServiceList * * Parameters : * IXML_Node *node ; XML node information * service_info **end ; service added is returned to the output * parameter * char * URLBase ; provides Base URL to resolve relative URL * * Description : Returns pointer to service info after getting the * sub-elements of the service info. * * Return : service_info * - pointer to the service info node ; * * Note : ************************************************************************/ service_info * getServiceList( IXML_Node * node, service_info ** end, char *URLBase ) { IXML_Node *serviceList = NULL; IXML_Node *current_service = NULL; IXML_Node *UDN = NULL; IXML_Node *serviceType = NULL; IXML_Node *serviceId = NULL; IXML_Node *SCPDURL = NULL; IXML_Node *controlURL = NULL; IXML_Node *eventURL = NULL; DOMString tempDOMString = NULL; service_info *head = NULL; service_info *current = NULL; service_info *previous = NULL; IXML_NodeList *serviceNodeList = NULL; int NumOfServices = 0; int i = 0; int fail = 0; if( getSubElement( "UDN", node, &UDN ) && getSubElement( "serviceList", node, &serviceList ) ) { serviceNodeList = ixmlElement_getElementsByTagName( ( IXML_Element * ) serviceList, "service" ); if( serviceNodeList != NULL ) { NumOfServices = ixmlNodeList_length( serviceNodeList ); for( i = 0; i < NumOfServices; i++ ) { current_service = ixmlNodeList_item( serviceNodeList, i ); fail = 0; if( current ) { current->next = ( service_info * ) malloc( sizeof( service_info ) ); previous = current; current = current->next; } else { head = ( service_info * ) malloc( sizeof( service_info ) ); current = head; } if( !current ) { freeServiceList( head ); return NULL; } current->next = NULL; current->controlURL = NULL; current->eventURL = NULL; current->serviceType = NULL; current->serviceId = NULL; current->SCPDURL = NULL; current->active = 1; current->subscriptionList = NULL; current->TotalSubscriptions = 0; if( !( current->UDN = getElementValue( UDN ) ) ) fail = 1; if( ( !getSubElement( "serviceType", current_service, &serviceType ) ) || ( !( current->serviceType = getElementValue( serviceType ) ) ) ) fail = 1; if( ( !getSubElement( "serviceId", current_service, &serviceId ) ) || ( ! ( current->serviceId = getElementValue( serviceId ) ) ) ) fail = 1; if( ( ! ( getSubElement ( "SCPDURL", current_service, &SCPDURL ) ) ) || ( !( tempDOMString = getElementValue( SCPDURL ) ) ) || ( ! ( current->SCPDURL = resolve_rel_url( URLBase, tempDOMString ) ) ) ) fail = 1; ixmlFreeDOMString( tempDOMString ); tempDOMString = NULL; if( ( ! ( getSubElement ( "controlURL", current_service, &controlURL ) ) ) || ( !( tempDOMString = getElementValue( controlURL ) ) ) || ( ! ( current->controlURL = resolve_rel_url( URLBase, tempDOMString ) ) ) ) { UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "BAD OR MISSING CONTROL URL" ); UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "CONTROL URL SET TO NULL IN SERVICE INFO" ); current->controlURL = NULL; fail = 0; } ixmlFreeDOMString( tempDOMString ); tempDOMString = NULL; if( ( ! ( getSubElement ( "eventSubURL", current_service, &eventURL ) ) ) || ( !( tempDOMString = getElementValue( eventURL ) ) ) || ( ! ( current->eventURL = resolve_rel_url( URLBase, tempDOMString ) ) ) ) { UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "BAD OR MISSING EVENT URL" ); UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "EVENT URL SET TO NULL IN SERVICE INFO" ); current->eventURL = NULL; fail = 0; } ixmlFreeDOMString( tempDOMString ); tempDOMString = NULL; if( fail ) { freeServiceList( current ); if( previous ) previous->next = NULL; else head = NULL; current = previous; } } ixmlNodeList_free( serviceNodeList ); } ( *end ) = current; return head; } else return NULL; } /************************************************************************ * Function : getAllServiceList * * Parameters : * IXML_Node *node ; XML node information * char * URLBase ; provides Base URL to resolve relative URL * service_info **out_end ; service added is returned to the output * parameter * * Description : Returns pointer to service info after getting the * sub-elements of the service info. * * Return : service_info * ; * * Note : ************************************************************************/ service_info * getAllServiceList( IXML_Node * node, char *URLBase, service_info ** out_end ) { service_info *head = NULL; service_info *end = NULL; service_info *next_end = NULL; IXML_NodeList *deviceList = NULL; IXML_Node *currentDevice = NULL; int NumOfDevices = 0; int i = 0; ( *out_end ) = NULL; deviceList = ixmlElement_getElementsByTagName( ( IXML_Element * ) node, "device" ); if( deviceList != NULL ) { NumOfDevices = ixmlNodeList_length( deviceList ); for( i = 0; i < NumOfDevices; i++ ) { currentDevice = ixmlNodeList_item( deviceList, i ); if( head ) { end->next = getServiceList( currentDevice, &next_end, URLBase ); end = next_end; } else head = getServiceList( currentDevice, &end, URLBase ); } ixmlNodeList_free( deviceList ); } ( *out_end ) = end; return head; } /************************************************************************ * Function : removeServiceTable * * Parameters : * IXML_Node *node ; XML node information * service_table *in ; service table from which services will be * removed * * Description : This function assumes that services for a particular * root device are placed linearly in the service table, and in the * order in which they are found in the description document * all services for this root device are removed from the list * * Return : int ; * * Note : ************************************************************************/ int removeServiceTable( IXML_Node * node, service_table * in ) { IXML_Node *root = NULL; IXML_Node *currentUDN = NULL; DOMString UDN = NULL; IXML_NodeList *deviceList = NULL; IXML_Node *currentDevice = NULL; service_info *current_service = NULL; service_info *start_search = NULL; service_info *prev_service = NULL; int NumOfDevices = 0; int i = 0; if( getSubElement( "root", node, &root ) ) { current_service = in->serviceList; start_search = in->serviceList; deviceList = ixmlElement_getElementsByTagName( ( IXML_Element * ) root, "device" ); if( deviceList != NULL ) { NumOfDevices = ixmlNodeList_length( deviceList ); for( i = 0; i < NumOfDevices; i++ ) { currentDevice = ixmlNodeList_item( deviceList, i ); if( ( start_search ) && ( ( getSubElement( "UDN", node, ¤tUDN ) ) && ( UDN = getElementValue( currentUDN ) ) ) ) { current_service = start_search; //Services are put in the service table in the order in which they appear in the //description document, therefore we go through the list only once to remove a particular //root device while( ( current_service ) && ( strcmp( current_service->UDN, UDN ) ) ) { current_service = current_service->next; prev_service = current_service->next; } while( ( current_service ) && ( !strcmp( current_service->UDN, UDN ) ) ) { if( prev_service ) { prev_service->next = current_service->next; } else { in->serviceList = current_service->next; } if( current_service == in->endServiceList ) in->endServiceList = prev_service; start_search = current_service->next; freeService( current_service ); current_service = start_search; } } } ixmlNodeList_free( deviceList ); } } return 1; } /************************************************************************ * Function : addServiceTable * * Parameters : * IXML_Node *node ; XML node information * service_table *in ; service table that will be initialized with * services * const char *DefaultURLBase ; Default base URL on which the URL * will be returned to the service list. * * Description : Add Service to the table. * * Return : int ; * * Note : ************************************************************************/ int addServiceTable( IXML_Node * node, service_table * in, const char *DefaultURLBase ) { IXML_Node *root = NULL; IXML_Node *URLBase = NULL; service_info *tempEnd = NULL; if( in->URLBase ) { free( in->URLBase ); in->URLBase = NULL; } if( getSubElement( "root", node, &root ) ) { if( getSubElement( "URLBase", root, &URLBase ) ) { in->URLBase = getElementValue( URLBase ); } else { if( DefaultURLBase ) { in->URLBase = ixmlCloneDOMString( DefaultURLBase ); } else { in->URLBase = ixmlCloneDOMString( "" ); } } if( ( in->endServiceList->next = getAllServiceList( root, in->URLBase, &tempEnd ) ) ) { in->endServiceList = tempEnd; return 1; } } return 0; } /************************************************************************ * Function : getServiceTable * * Parameters : * IXML_Node *node ; XML node information * service_table *out ; output parameter which will contain the * service list and URL * const char *DefaultURLBase ; Default base URL on which the URL * will be returned. * * Description : Retrieve service from the table * * Return : int ; * * Note : ************************************************************************/ int getServiceTable( IXML_Node * node, service_table * out, const char *DefaultURLBase ) { IXML_Node *root = NULL; IXML_Node *URLBase = NULL; if( getSubElement( "root", node, &root ) ) { if( getSubElement( "URLBase", root, &URLBase ) ) { out->URLBase = getElementValue( URLBase ); } else { if( DefaultURLBase ) { out->URLBase = ixmlCloneDOMString( DefaultURLBase ); } else { out->URLBase = ixmlCloneDOMString( "" ); } } if( ( out->serviceList = getAllServiceList( root, out->URLBase, &out->endServiceList ) ) ) { return 1; } } return 0; } #endif // INCLUDE_DEVICE_APIS libupnp-1.8.0~svn20100507/upnp/src/genlib/client_table/0000777000175000017500000000000011373047472017410 500000000000000libupnp-1.8.0~svn20100507/upnp/src/genlib/client_table/client_table.c0000644000175000017500000000533211365106163022112 00000000000000 /************************************************************************ * Purpose: This file defines the functions for clients. It defines * functions for adding and removing clients to and from the client table, * adding and accessing subscription and other attributes pertaining to the * client ************************************************************************/ #include "config.h" #include "client_table.h" #ifdef INCLUDE_CLIENT_APIS #include // for calloc(), free() void free_client_subscription(ClientSubscription *sub) { upnp_timeout *event; ThreadPoolJob tempJob; if (sub) { int renewEventId = GenlibClientSubscription_get_RenewEventId(sub); GenlibClientSubscription_strcpy_ActualSID(sub, ""); GenlibClientSubscription_strcpy_EventURL(sub, ""); if (renewEventId != -1) { // do not remove timer event of copy // invalid timer event id if (TimerThreadRemove(&gTimerThread, renewEventId, &tempJob) == 0) { event = (upnp_timeout *)tempJob.arg; free_upnp_timeout(event); } } GenlibClientSubscription_set_RenewEventId(sub, -1); } } void freeClientSubList(ClientSubscription *list) { ClientSubscription *next; while (list) { free_client_subscription(list); next = GenlibClientSubscription_get_Next(list); GenlibClientSubscription_delete(list); list = next; } } void RemoveClientSubClientSID(ClientSubscription **head, const UpnpString *sid) { ClientSubscription *finger = *head; ClientSubscription *previous = NULL; int found = 0; while (finger) { found = !strcmp( UpnpString_get_String(sid), GenlibClientSubscription_get_SID_cstr(finger)); if (found) { if (previous) { GenlibClientSubscription_set_Next(previous, GenlibClientSubscription_get_Next(finger)); } else { *head = GenlibClientSubscription_get_Next(finger); } GenlibClientSubscription_set_Next(finger, NULL); freeClientSubList(finger); finger = NULL; } else { previous = finger; finger = GenlibClientSubscription_get_Next(finger); } } } ClientSubscription *GetClientSubClientSID(ClientSubscription *head, const UpnpString *sid) { ClientSubscription *next = head; int found = 0; while (next) { found = !strcmp( GenlibClientSubscription_get_SID_cstr(next), UpnpString_get_String(sid)); if(found) { break; } else { next = GenlibClientSubscription_get_Next(next); } } return next; } ClientSubscription *GetClientSubActualSID(ClientSubscription *head, token *sid) { ClientSubscription *next = head; while (next) { if (!memcmp( GenlibClientSubscription_get_ActualSID_cstr(next), sid->buff, sid->size)) { break; } else { next = GenlibClientSubscription_get_Next(next); } } return next; } #endif /* INCLUDE_CLIENT_APIS */ libupnp-1.8.0~svn20100507/upnp/src/genlib/client_table/ClientSubscription.c0000644000175000017500000001225311365106163023310 00000000000000 /************************************************************************ * Purpose: This file defines the functions for clients. It defines * functions for adding and removing clients to and from the client table, * adding and accessing subscription and other attributes pertaining to the * client ************************************************************************/ #include "config.h" #include "ClientSubscription.h" #ifdef INCLUDE_CLIENT_APIS #include // for calloc(), free() struct SClientSubscription { int m_renewEventId; UpnpString *m_SID; UpnpString *m_actualSID; UpnpString *m_eventURL; struct SClientSubscription *m_next; }; ClientSubscription *GenlibClientSubscription_new() { struct SClientSubscription *p = calloc(1, sizeof (struct SClientSubscription)); #if 0 p->renewEventId = 0; #endif p->m_SID = UpnpString_new(); p->m_actualSID = UpnpString_new(); p->m_eventURL = UpnpString_new(); p->m_next = NULL; return (ClientSubscription *)p; } void GenlibClientSubscription_delete(ClientSubscription *p) { struct SClientSubscription *q = (struct SClientSubscription *)p; if (!q) return; q->m_renewEventId = 0; UpnpString_delete(q->m_SID); q->m_SID = NULL; UpnpString_delete(q->m_actualSID); q->m_actualSID = NULL; UpnpString_delete(q->m_eventURL); q->m_eventURL = NULL; q->m_next = NULL; free(p); } ClientSubscription *GenlibClientSubscription_dup(const ClientSubscription *p) { ClientSubscription *q = GenlibClientSubscription_new(); GenlibClientSubscription_assign(q, p); return q; } void GenlibClientSubscription_assign(ClientSubscription *q, const ClientSubscription *p) { if (q != p) { /*struct SClientSubscription *_p = (struct SClientSubscription *)p;*/ struct SClientSubscription *_q = (struct SClientSubscription *)q; // Do not copy RenewEventId _q->m_renewEventId = -1; GenlibClientSubscription_set_SID(q, GenlibClientSubscription_get_SID(p)); GenlibClientSubscription_set_ActualSID(q, GenlibClientSubscription_get_ActualSID(p)); GenlibClientSubscription_set_EventURL(q, GenlibClientSubscription_get_EventURL(p)); // Do not copy m_next _q->m_next = NULL; } } int GenlibClientSubscription_get_RenewEventId(const ClientSubscription *p) { return ((struct SClientSubscription *)p)->m_renewEventId; } void GenlibClientSubscription_set_RenewEventId(ClientSubscription *p, int n) { ((struct SClientSubscription *)p)->m_renewEventId = n; } const UpnpString *GenlibClientSubscription_get_SID(const ClientSubscription *p) { return ((struct SClientSubscription *)p)->m_SID; } const char *GenlibClientSubscription_get_SID_cstr(const ClientSubscription *p) { return UpnpString_get_String(GenlibClientSubscription_get_SID(p)); } void GenlibClientSubscription_set_SID(ClientSubscription *p, const UpnpString *s) { UpnpString_delete(((struct SClientSubscription *)p)->m_SID); ((struct SClientSubscription *)p)->m_SID = UpnpString_dup(s); } void GenlibClientSubscription_strcpy_SID(ClientSubscription *p, const char *s) { UpnpString_delete(((struct SClientSubscription *)p)->m_SID); ((struct SClientSubscription *)p)->m_SID = UpnpString_new(); UpnpString_set_String(((struct SClientSubscription *)p)->m_SID, s); } const UpnpString *GenlibClientSubscription_get_ActualSID(const ClientSubscription *p) { return ((struct SClientSubscription *)p)->m_actualSID; } const char *GenlibClientSubscription_get_ActualSID_cstr(const ClientSubscription *p) { return UpnpString_get_String(GenlibClientSubscription_get_ActualSID(p)); } void GenlibClientSubscription_set_ActualSID(ClientSubscription *p, const UpnpString *s) { UpnpString_delete(((struct SClientSubscription *)p)->m_actualSID); ((struct SClientSubscription *)p)->m_actualSID = UpnpString_dup(s); } void GenlibClientSubscription_strcpy_ActualSID(ClientSubscription *p, const char *s) { UpnpString_delete(((struct SClientSubscription *)p)->m_actualSID); ((struct SClientSubscription *)p)->m_actualSID = UpnpString_new(); UpnpString_set_String(((struct SClientSubscription *)p)->m_actualSID, s); } const UpnpString *GenlibClientSubscription_get_EventURL(const ClientSubscription *p) { return ((struct SClientSubscription *)p)->m_eventURL; } const char *GenlibClientSubscription_get_EventURL_cstr(const ClientSubscription *p) { return UpnpString_get_String(GenlibClientSubscription_get_EventURL(p)); } void GenlibClientSubscription_set_EventURL(ClientSubscription *p, const UpnpString *s) { UpnpString_delete(((struct SClientSubscription *)p)->m_eventURL); ((struct SClientSubscription *)p)->m_eventURL = UpnpString_dup(s); } void GenlibClientSubscription_strcpy_EventURL(ClientSubscription *p, const char *s) { UpnpString_delete(((struct SClientSubscription *)p)->m_eventURL); ((struct SClientSubscription *)p)->m_eventURL = UpnpString_new(); UpnpString_set_String(((struct SClientSubscription *)p)->m_eventURL, s); } ClientSubscription *GenlibClientSubscription_get_Next(const ClientSubscription *p) { return (ClientSubscription *)(((struct SClientSubscription *)p)->m_next); } void GenlibClientSubscription_set_Next(ClientSubscription *p, ClientSubscription *q) { ((struct SClientSubscription *)p)->m_next = (struct SClientSubscription *)q; } #endif /* INCLUDE_CLIENT_APIS */ libupnp-1.8.0~svn20100507/upnp/src/inet_pton.c0000644000175000017500000001500211021325543015564 00000000000000/* * Copyright (c) 1996-1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ /* This file is WIN32 only */ #ifdef WIN32 #include "inet_pton.h" static const char *inet_ntop4(const u_char *src, char *dst, socklen_t size) { char tmp[sizeof ("255.255.255.255") + 1] = "\0"; int octet; int i; i = 0; for (octet = 0; octet <= 3; octet++) { if (src[octet]>255) { //__set_errno (ENOSPC); return (NULL); } tmp[i++] = '0' + src[octet] / 100; if (tmp[i - 1] == '0') { tmp[i - 1] = '0' + (src[octet] / 10 % 10); if (tmp[i - 1] == '0') i--; } else { tmp[i++] = '0' + (src[octet] / 10 % 10); } tmp[i++] = '0' + src[octet] % 10; tmp[i++] = '.'; } tmp[i - 1] = '\0'; if ((socklen_t)strlen(tmp)>size) { //__set_errno (ENOSPC); return (NULL); } return strcpy(dst, tmp); } #ifdef INET_IPV6 static const char *inet_ntop6(const u_char *src, char *dst, socklen_t size) { /* * Note that int32_t and int16_t need only be "at least" large enough * to contain a value of the specified size. On some systems, like * Crays, there is no such thing as an integer variable with 16 bits. * Keep this in mind if you think this function should have been coded * to use pointer overlays. All the world's not a VAX. */ char tmp[sizeof ("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")], *tp; struct { int base, len; } best, cur; u_int words[8]; int i; /* * Preprocess: * Copy the input (bytewise) array into a wordwise array. * Find the longest run of 0x00's in src[] for :: shorthanding. */ memset(words, '\0', sizeof words); for (i = 0; i < 16; i += 2) words[i / 2] = (src[i] << 8) | src[i + 1]; best.base = -1; cur.base = -1; for (i = 0; i < 8; i++) { if (words[i] == 0) { if (cur.base == -1) cur.base = i, cur.len = 1; else cur.len++; } else { if (cur.base != -1) { if (best.base == -1 || cur.len best.len) best = cur; cur.base = -1; } } } if (cur.base != -1) { if (best.base == -1 || cur.len best.len) best = cur; } if (best.base != -1 && best.len < 2) best.base = -1; /* * Format the result. */ tp = tmp; for (i = 0; i < 8; i++) { /* Are we inside the best run of 0x00's? */ if (best.base != -1 && i >= best.base && i < (best.base + best.len)) { if (i == best.base) *tp++ = ':'; continue; } /* Are we following an initial run of 0x00s or any real hex? */ if (i != 0) *tp++ = ':'; /* Is this address an encapsulated IPv4? */ if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) return (NULL); tp += strlen(tp); break; } tp += SPRINTF((tp, "%x", words[i])); } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == 8) *tp++ = ':'; *tp++ = '\0'; /* * Check for overflow, copy, and we're done. */ if ((socklen_t)(tp - tmp) size) { //__set_errno (ENOSPC); return (NULL); } return strcpy(dst, tmp); } #endif /* INET_IPV6 */ static int inet_pton4(const char *src,u_char *dst) { int saw_digit, octets, ch; u_char tmp[4], *tp; saw_digit = 0; octets = 0; *(tp = tmp) = 0; while ((ch = *src++) != '\0') { if (ch >= '0' && ch <= '9') { u_int new = *tp * 10 + (ch - '0'); if (new>255) return (0); *tp = new; if (! saw_digit) { if (++octets>4) return (0); saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return (0); *++tp = 0; saw_digit = 0; } else return (0); } if (octets < 4) return (0); memcpy(dst, tmp, 4); return 1; } #ifdef INET_IPV6 static int inet_pton6(const char *src, u_char *dst) { static const char xdigits[] = "0123456789abcdef"; u_char tmp[16], *tp, *endp, *colonp; const char *curtok; int ch, saw_xdigit; u_int val; tp = memset(tmp, '\0', 16); endp = tp + 16; colonp = NULL; /* Leading :: requires some special handling. */ if (*src == ':') if (*++src != ':') return (0); curtok = src; saw_xdigit = 0; val = 0; while ((ch = tolower (*src++)) != '\0') { const char *pch; pch = strchr(xdigits, ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (val 0xffff) return (0); saw_xdigit = 1; continue; } if (ch == ':') { curtok = src; if (!saw_xdigit) { if (colonp) return (0); colonp = tp; continue; } else if (*src == '\0') { return (0); } if (tp + 2 endp) return (0); *tp++ = (u_char) (val >8) & 0xff; *tp++ = (u_char) val & 0xff; saw_xdigit = 0; val = 0; continue; } if (ch == '.' && ((tp + 4) <= endp) && inet_pton4(curtok, tp) 0) { tp += 4; saw_xdigit = 0; break; /* '\0' was seen by inet_pton4(). */ } return (0); } if (saw_xdigit) { if (tp + 2 endp) return (0); *tp++ = (u_char) (val >8) & 0xff; *tp++ = (u_char) val & 0xff; } if (colonp != NULL) { /* * Since some memmove()'s erroneously fail to handle * overlapping regions, we'll do the shift by hand. */ const int n = tp - colonp; int i; if (tp == endp) return (0); for (i = 1; i <= n; i++) { endp[- i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return (0); memcpy(dst, tmp, 16); return (1); } #endif /* INET_IPV6 */ const char *inet_ntop(int af,const void *src,char *dst,socklen_t size) { switch (af) { case AF_INET: return (inet_ntop4(src, dst, size)); #ifdef INET_IPV6 case AF_INET6: return (inet_ntop6(src, dst, size)); #endif default: /*__set_errno(EAFNOSUPPORT);*/ return NULL; } /* NOTREACHED */ } int inet_pton(int af,const char *src,void *dst) { switch (af) { case AF_INET: return (inet_pton4(src, dst)); #ifdef INET_IPV6 case AF_INET6: return (inet_pton6(src, dst)); #endif default: /*__set_errno(EAFNOSUPPORT);*/ return -1; } /* NOTREACHED */ } #endif /* WIN32 */ libupnp-1.8.0~svn20100507/upnp/src/win_dll.c0000644000175000017500000000050611021325543015220 00000000000000// upnpLib.cpp : Defines the entry point for the DLL application. // #ifdef WIN32 #include BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { if (ul_reason_for_call == DLL_PROCESS_ATTACH) { } return TRUE; } #endif libupnp-1.8.0~svn20100507/upnp/test/0000777000175000017500000000000011373047472013713 500000000000000libupnp-1.8.0~svn20100507/upnp/test/test_init.c0000644000175000017500000000743611021325542015772 00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006 Rémi Turboult // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #include "upnp.h" #include #include #if UPNP_HAVE_TOOLS # include "upnptools.h" #endif int main (int argc, char* argv[]) { int rc; int a, b, c; /* * Check library version (and formats) */ printf ("\n"); printf ("UPNP_VERSION_STRING = \"%s\"\n", UPNP_VERSION_STRING); printf ("UPNP_VERSION_MAJOR = %d\n", UPNP_VERSION_MAJOR); printf ("UPNP_VERSION_MINOR = %d\n", UPNP_VERSION_MINOR); printf ("UPNP_VERSION_PATCH = %d\n", UPNP_VERSION_PATCH); printf ("UPNP_VERSION = %d\n", UPNP_VERSION); if ( sscanf (UPNP_VERSION_STRING, "%d.%d.%d", &a, &b, &c) != 3 || a != UPNP_VERSION_MAJOR || b != UPNP_VERSION_MINOR || c != UPNP_VERSION_PATCH ) { printf ("** ERROR malformed UPNP_VERSION_STRING\n"); exit (EXIT_FAILURE); // ----------> } /* * Check library optional features */ printf ("\n"); #if UPNP_HAVE_DEBUG printf ("UPNP_HAVE_DEBUG \t= yes\n"); #else printf ("UPNP_HAVE_DEBUG \t= no\n"); #endif #if UPNP_HAVE_CLIENT printf ("UPNP_HAVE_CLIENT\t= yes\n"); #else printf ("UPNP_HAVE_CLIENT\t= no\n"); #endif #if UPNP_HAVE_DEVICE printf ("UPNP_HAVE_DEVICE\t= yes\n"); #else printf ("UPNP_HAVE_DEVICE\t= no\n"); #endif #if UPNP_HAVE_WEBSERVER printf ("UPNP_HAVE_WEBSERVER\t= yes\n"); #else printf ("UPNP_HAVE_WEBSERVER\t= no\n"); #endif #if UPNP_HAVE_TOOLS printf ("UPNP_HAVE_TOOLS \t= yes\n"); #else printf ("UPNP_HAVE_TOOLS \t= no\n"); #endif /* * Test library initialisation */ printf ("\n"); printf ("Initializing UPnP ... \n"); rc = UpnpInit (NULL, 0); if ( UPNP_E_SUCCESS == rc ) { const char* ip_address = UpnpGetServerIpAddress(); unsigned short port = UpnpGetServerPort(); printf ("UPnP Initialized OK ip=%s, port=%d\n", (ip_address ? ip_address : "UNKNOWN"), port); } else { printf ("** ERROR UpnpInit(): %d", rc); #if UPNP_HAVE_TOOLS printf (" %s", UpnpGetErrorMessage (rc)); #endif printf ("\n"); exit (EXIT_FAILURE); // ----------> } (void) UpnpFinish(); printf ("\n"); exit (EXIT_SUCCESS); } libupnp-1.8.0~svn20100507/upnp/LICENSE0000644000175000017500000000273311021325542013645 00000000000000Copyright (c) 2000-2003 Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. libupnp-1.8.0~svn20100507/upnp/Makefile.am0000644000175000017500000000726411365106163014707 00000000000000# # "Makefile.am" for "libupnp/upnp" # # Copyright (C) 2005 RĂ©mi Turboult # SUBDIRS = doc . sample AM_CPPFLAGS = \ -I$(srcdir)/inc \ -I$(top_srcdir)/threadutil/inc \ -I$(top_srcdir)/ixml/inc LDADD = \ libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la upnpincludedir = $(includedir)/upnp upnpinclude_HEADERS = \ inc/ActionComplete.h \ inc/ActionRequest.h \ inc/Discovery.h \ inc/Event.h \ inc/EventSubscribe.h \ inc/FileInfo.h \ inc/StateVarComplete.h \ inc/StateVarRequest.h \ inc/SubscriptionRequest.h \ inc/UpnpString.h \ inc/upnp.h \ inc/upnpdebug.h \ inc/UpnpGlobal.h \ inc/UpnpInet.h nodist_upnpinclude_HEADERS = inc/upnpconfig.h if ENABLE_TOOLS upnpinclude_HEADERS += inc/upnptools.h endif lib_LTLIBRARIES = libupnp.la libupnp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/src/inc libupnp_la_LDFLAGS = \ -version-info $(LT_VERSION_UPNP) \ -export-symbols-regex '^Upnp.*' \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la libupnp_la_SOURCES = \ src/inc/config.h \ src/inc/client_table.h \ src/inc/ClientSubscription.h \ src/inc/gena.h \ src/inc/gena_ctrlpt.h \ src/inc/gena_device.h \ src/inc/global.h \ src/inc/gmtdate.h \ src/inc/httpparser.h \ src/inc/httpreadwrite.h \ src/inc/md5.h \ src/inc/membuffer.h \ src/inc/miniserver.h \ src/inc/netall.h \ src/inc/parsetools.h \ src/inc/server.h \ src/inc/service_table.h \ src/inc/soaplib.h \ src/inc/sock.h \ src/inc/statcodes.h \ src/inc/statuscodes.h \ src/inc/strintmap.h \ src/inc/ssdplib.h \ src/inc/sysdep.h \ src/inc/unixutil.h \ src/inc/upnpapi.h \ src/inc/upnpclosesocket.h \ src/inc/upnp_timeout.h \ src/inc/uri.h \ src/inc/urlconfig.h \ src/inc/util.h \ src/inc/utilall.h \ src/inc/uuid.h \ src/inc/VirtualDir.h \ src/inc/webserver.h # ssdp libupnp_la_SOURCES += \ src/ssdp/ssdp_ResultData.c \ src/ssdp/ssdp_ResultData.h \ src/ssdp/ssdp_device.c \ src/ssdp/ssdp_ctrlpt.c \ src/ssdp/ssdp_server.c # soap libupnp_la_SOURCES += \ src/soap/soap_device.c \ src/soap/soap_ctrlpt.c \ src/soap/soap_common.c # genlib libupnp_la_SOURCES += \ src/genlib/miniserver/miniserver.c \ src/genlib/client_table/client_table.c \ src/genlib/client_table/ClientSubscription.c \ src/genlib/service_table/service_table.c \ src/genlib/util/membuffer.c \ src/genlib/util/strintmap.c \ src/genlib/util/upnp_timeout.c \ src/genlib/util/util.c \ src/genlib/net/sock.c \ src/genlib/net/http/httpparser.c \ src/genlib/net/http/httpreadwrite.c \ src/genlib/net/http/statcodes.c \ src/genlib/net/http/webserver.c \ src/genlib/net/http/parsetools.c \ src/genlib/net/uri/uri.c # gena libupnp_la_SOURCES += \ src/gena/gena_device.c \ src/gena/gena_ctrlpt.c \ src/gena/gena_callback2.c # api libupnp_la_SOURCES += \ src/api/ActionComplete.c \ src/api/ActionRequest.c \ src/api/Discovery.c \ src/api/Event.c \ src/api/EventSubscribe.c \ src/api/FileInfo.c \ src/api/StateVarComplete.c \ src/api/StateVarRequest.c \ src/api/SubscriptionRequest.c \ src/api/UpnpString.c \ src/api/upnpapi.c if ENABLE_TOOLS libupnp_la_SOURCES += src/api/upnptools.c endif if ENABLE_DEBUG libupnp_la_SOURCES += src/api/upnpdebug.c endif # uuid libupnp_la_SOURCES += \ src/uuid/md5.c \ src/uuid/sysdep.c \ src/uuid/uuid.c # urlconfig libupnp_la_SOURCES += src/urlconfig/urlconfig.c # inet_pton (needed on Win32, compiles to nothing elsewhere) libupnp_la_SOURCES += \ src/inet_pton.c \ src/inc/inet_pton.h # check / distcheck tests check_PROGRAMS = test_init TESTS = test_init test_init_SOURCES = test/test_init.c EXTRA_DIST = \ LICENSE \ m4/libupnp.m4 \ src/win_dll.c CLEANFILES = \ IUpnpErrFile.txt \ IUpnpInfoFile.txt libupnp-1.8.0~svn20100507/upnp/Makefile.in0000644000175000017500000030603111365107137014714 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ # # "Makefile.am" for "libupnp/upnp" # # Copyright (C) 2005 RĂ©mi Turboult # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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@ @ENABLE_TOOLS_TRUE@am__append_1 = inc/upnptools.h @ENABLE_TOOLS_TRUE@am__append_2 = src/api/upnptools.c @ENABLE_DEBUG_TRUE@am__append_3 = src/api/upnpdebug.c check_PROGRAMS = test_init$(EXEEXT) TESTS = test_init$(EXEEXT) subdir = upnp DIST_COMMON = $(am__upnpinclude_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/autoconfig.h \ $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = 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 = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(upnpincludedir)" \ "$(DESTDIR)$(upnpincludedir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) libupnp_la_LIBADD = am__libupnp_la_SOURCES_DIST = src/inc/config.h src/inc/client_table.h \ src/inc/ClientSubscription.h src/inc/gena.h \ src/inc/gena_ctrlpt.h src/inc/gena_device.h src/inc/global.h \ src/inc/gmtdate.h src/inc/httpparser.h src/inc/httpreadwrite.h \ src/inc/md5.h src/inc/membuffer.h src/inc/miniserver.h \ src/inc/netall.h src/inc/parsetools.h src/inc/server.h \ src/inc/service_table.h src/inc/soaplib.h src/inc/sock.h \ src/inc/statcodes.h src/inc/statuscodes.h src/inc/strintmap.h \ src/inc/ssdplib.h src/inc/sysdep.h src/inc/unixutil.h \ src/inc/upnpapi.h src/inc/upnpclosesocket.h \ src/inc/upnp_timeout.h src/inc/uri.h src/inc/urlconfig.h \ src/inc/util.h src/inc/utilall.h src/inc/uuid.h \ src/inc/VirtualDir.h src/inc/webserver.h \ src/ssdp/ssdp_ResultData.c src/ssdp/ssdp_ResultData.h \ src/ssdp/ssdp_device.c src/ssdp/ssdp_ctrlpt.c \ src/ssdp/ssdp_server.c src/soap/soap_device.c \ src/soap/soap_ctrlpt.c src/soap/soap_common.c \ src/genlib/miniserver/miniserver.c \ src/genlib/client_table/client_table.c \ src/genlib/client_table/ClientSubscription.c \ src/genlib/service_table/service_table.c \ src/genlib/util/membuffer.c src/genlib/util/strintmap.c \ src/genlib/util/upnp_timeout.c src/genlib/util/util.c \ src/genlib/net/sock.c src/genlib/net/http/httpparser.c \ src/genlib/net/http/httpreadwrite.c \ src/genlib/net/http/statcodes.c \ src/genlib/net/http/webserver.c \ src/genlib/net/http/parsetools.c src/genlib/net/uri/uri.c \ src/gena/gena_device.c src/gena/gena_ctrlpt.c \ src/gena/gena_callback2.c src/api/ActionComplete.c \ src/api/ActionRequest.c src/api/Discovery.c src/api/Event.c \ src/api/EventSubscribe.c src/api/FileInfo.c \ src/api/StateVarComplete.c src/api/StateVarRequest.c \ src/api/SubscriptionRequest.c src/api/UpnpString.c \ src/api/upnpapi.c src/api/upnptools.c src/api/upnpdebug.c \ src/uuid/md5.c src/uuid/sysdep.c src/uuid/uuid.c \ src/urlconfig/urlconfig.c src/inet_pton.c src/inc/inet_pton.h am__dirstamp = $(am__leading_dot)dirstamp @ENABLE_TOOLS_TRUE@am__objects_1 = src/api/libupnp_la-upnptools.lo @ENABLE_DEBUG_TRUE@am__objects_2 = src/api/libupnp_la-upnpdebug.lo am_libupnp_la_OBJECTS = src/ssdp/libupnp_la-ssdp_ResultData.lo \ src/ssdp/libupnp_la-ssdp_device.lo \ src/ssdp/libupnp_la-ssdp_ctrlpt.lo \ src/ssdp/libupnp_la-ssdp_server.lo \ src/soap/libupnp_la-soap_device.lo \ src/soap/libupnp_la-soap_ctrlpt.lo \ src/soap/libupnp_la-soap_common.lo \ src/genlib/miniserver/libupnp_la-miniserver.lo \ src/genlib/client_table/libupnp_la-client_table.lo \ src/genlib/client_table/libupnp_la-ClientSubscription.lo \ src/genlib/service_table/libupnp_la-service_table.lo \ src/genlib/util/libupnp_la-membuffer.lo \ src/genlib/util/libupnp_la-strintmap.lo \ src/genlib/util/libupnp_la-upnp_timeout.lo \ src/genlib/util/libupnp_la-util.lo \ src/genlib/net/libupnp_la-sock.lo \ src/genlib/net/http/libupnp_la-httpparser.lo \ src/genlib/net/http/libupnp_la-httpreadwrite.lo \ src/genlib/net/http/libupnp_la-statcodes.lo \ src/genlib/net/http/libupnp_la-webserver.lo \ src/genlib/net/http/libupnp_la-parsetools.lo \ src/genlib/net/uri/libupnp_la-uri.lo \ src/gena/libupnp_la-gena_device.lo \ src/gena/libupnp_la-gena_ctrlpt.lo \ src/gena/libupnp_la-gena_callback2.lo \ src/api/libupnp_la-ActionComplete.lo \ src/api/libupnp_la-ActionRequest.lo \ src/api/libupnp_la-Discovery.lo src/api/libupnp_la-Event.lo \ src/api/libupnp_la-EventSubscribe.lo \ src/api/libupnp_la-FileInfo.lo \ src/api/libupnp_la-StateVarComplete.lo \ src/api/libupnp_la-StateVarRequest.lo \ src/api/libupnp_la-SubscriptionRequest.lo \ src/api/libupnp_la-UpnpString.lo src/api/libupnp_la-upnpapi.lo \ $(am__objects_1) $(am__objects_2) src/uuid/libupnp_la-md5.lo \ src/uuid/libupnp_la-sysdep.lo src/uuid/libupnp_la-uuid.lo \ src/urlconfig/libupnp_la-urlconfig.lo \ src/libupnp_la-inet_pton.lo libupnp_la_OBJECTS = $(am_libupnp_la_OBJECTS) libupnp_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libupnp_la_LDFLAGS) $(LDFLAGS) -o $@ am_test_init_OBJECTS = test/test_init.$(OBJEXT) test_init_OBJECTS = $(am_test_init_OBJECTS) test_init_LDADD = $(LDADD) test_init_DEPENDENCIES = libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/upnp/inc depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libupnp_la_SOURCES) $(test_init_SOURCES) DIST_SOURCES = $(am__libupnp_la_SOURCES_DIST) $(test_init_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive nodist_upnpincludeHEADERS_INSTALL = $(INSTALL_HEADER) am__upnpinclude_HEADERS_DIST = inc/ActionComplete.h \ inc/ActionRequest.h inc/Discovery.h inc/Event.h \ inc/EventSubscribe.h inc/FileInfo.h inc/StateVarComplete.h \ inc/StateVarRequest.h inc/SubscriptionRequest.h \ inc/UpnpString.h inc/upnp.h inc/upnpdebug.h inc/UpnpGlobal.h \ inc/UpnpInet.h inc/upnptools.h upnpincludeHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(nodist_upnpinclude_HEADERS) $(upnpinclude_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = doc . sample AM_CPPFLAGS = \ -I$(srcdir)/inc \ -I$(top_srcdir)/threadutil/inc \ -I$(top_srcdir)/ixml/inc LDADD = \ libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la upnpincludedir = $(includedir)/upnp upnpinclude_HEADERS = inc/ActionComplete.h inc/ActionRequest.h \ inc/Discovery.h inc/Event.h inc/EventSubscribe.h \ inc/FileInfo.h inc/StateVarComplete.h inc/StateVarRequest.h \ inc/SubscriptionRequest.h inc/UpnpString.h inc/upnp.h \ inc/upnpdebug.h inc/UpnpGlobal.h inc/UpnpInet.h \ $(am__append_1) nodist_upnpinclude_HEADERS = inc/upnpconfig.h lib_LTLIBRARIES = libupnp.la libupnp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/src/inc libupnp_la_LDFLAGS = \ -version-info $(LT_VERSION_UPNP) \ -export-symbols-regex '^Upnp.*' \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la # ssdp # soap # genlib # gena # api # uuid # urlconfig # inet_pton (needed on Win32, compiles to nothing elsewhere) libupnp_la_SOURCES = src/inc/config.h src/inc/client_table.h \ src/inc/ClientSubscription.h src/inc/gena.h \ src/inc/gena_ctrlpt.h src/inc/gena_device.h src/inc/global.h \ src/inc/gmtdate.h src/inc/httpparser.h src/inc/httpreadwrite.h \ src/inc/md5.h src/inc/membuffer.h src/inc/miniserver.h \ src/inc/netall.h src/inc/parsetools.h src/inc/server.h \ src/inc/service_table.h src/inc/soaplib.h src/inc/sock.h \ src/inc/statcodes.h src/inc/statuscodes.h src/inc/strintmap.h \ src/inc/ssdplib.h src/inc/sysdep.h src/inc/unixutil.h \ src/inc/upnpapi.h src/inc/upnpclosesocket.h \ src/inc/upnp_timeout.h src/inc/uri.h src/inc/urlconfig.h \ src/inc/util.h src/inc/utilall.h src/inc/uuid.h \ src/inc/VirtualDir.h src/inc/webserver.h \ src/ssdp/ssdp_ResultData.c src/ssdp/ssdp_ResultData.h \ src/ssdp/ssdp_device.c src/ssdp/ssdp_ctrlpt.c \ src/ssdp/ssdp_server.c src/soap/soap_device.c \ src/soap/soap_ctrlpt.c src/soap/soap_common.c \ src/genlib/miniserver/miniserver.c \ src/genlib/client_table/client_table.c \ src/genlib/client_table/ClientSubscription.c \ src/genlib/service_table/service_table.c \ src/genlib/util/membuffer.c src/genlib/util/strintmap.c \ src/genlib/util/upnp_timeout.c src/genlib/util/util.c \ src/genlib/net/sock.c src/genlib/net/http/httpparser.c \ src/genlib/net/http/httpreadwrite.c \ src/genlib/net/http/statcodes.c \ src/genlib/net/http/webserver.c \ src/genlib/net/http/parsetools.c src/genlib/net/uri/uri.c \ src/gena/gena_device.c src/gena/gena_ctrlpt.c \ src/gena/gena_callback2.c src/api/ActionComplete.c \ src/api/ActionRequest.c src/api/Discovery.c src/api/Event.c \ src/api/EventSubscribe.c src/api/FileInfo.c \ src/api/StateVarComplete.c src/api/StateVarRequest.c \ src/api/SubscriptionRequest.c src/api/UpnpString.c \ src/api/upnpapi.c $(am__append_2) $(am__append_3) \ src/uuid/md5.c src/uuid/sysdep.c src/uuid/uuid.c \ src/urlconfig/urlconfig.c src/inet_pton.c src/inc/inet_pton.h test_init_SOURCES = test/test_init.c EXTRA_DIST = \ LICENSE \ m4/libupnp.m4 \ src/win_dll.c CLEANFILES = \ IUpnpErrFile.txt \ IUpnpInfoFile.txt all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign upnp/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign upnp/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 install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done src/ssdp/$(am__dirstamp): @$(MKDIR_P) src/ssdp @: > src/ssdp/$(am__dirstamp) src/ssdp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/ssdp/$(DEPDIR) @: > src/ssdp/$(DEPDIR)/$(am__dirstamp) src/ssdp/libupnp_la-ssdp_ResultData.lo: src/ssdp/$(am__dirstamp) \ src/ssdp/$(DEPDIR)/$(am__dirstamp) src/ssdp/libupnp_la-ssdp_device.lo: src/ssdp/$(am__dirstamp) \ src/ssdp/$(DEPDIR)/$(am__dirstamp) src/ssdp/libupnp_la-ssdp_ctrlpt.lo: src/ssdp/$(am__dirstamp) \ src/ssdp/$(DEPDIR)/$(am__dirstamp) src/ssdp/libupnp_la-ssdp_server.lo: src/ssdp/$(am__dirstamp) \ src/ssdp/$(DEPDIR)/$(am__dirstamp) src/soap/$(am__dirstamp): @$(MKDIR_P) src/soap @: > src/soap/$(am__dirstamp) src/soap/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/soap/$(DEPDIR) @: > src/soap/$(DEPDIR)/$(am__dirstamp) src/soap/libupnp_la-soap_device.lo: src/soap/$(am__dirstamp) \ src/soap/$(DEPDIR)/$(am__dirstamp) src/soap/libupnp_la-soap_ctrlpt.lo: src/soap/$(am__dirstamp) \ src/soap/$(DEPDIR)/$(am__dirstamp) src/soap/libupnp_la-soap_common.lo: src/soap/$(am__dirstamp) \ src/soap/$(DEPDIR)/$(am__dirstamp) src/genlib/miniserver/$(am__dirstamp): @$(MKDIR_P) src/genlib/miniserver @: > src/genlib/miniserver/$(am__dirstamp) src/genlib/miniserver/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/genlib/miniserver/$(DEPDIR) @: > src/genlib/miniserver/$(DEPDIR)/$(am__dirstamp) src/genlib/miniserver/libupnp_la-miniserver.lo: \ src/genlib/miniserver/$(am__dirstamp) \ src/genlib/miniserver/$(DEPDIR)/$(am__dirstamp) src/genlib/client_table/$(am__dirstamp): @$(MKDIR_P) src/genlib/client_table @: > src/genlib/client_table/$(am__dirstamp) src/genlib/client_table/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/genlib/client_table/$(DEPDIR) @: > src/genlib/client_table/$(DEPDIR)/$(am__dirstamp) src/genlib/client_table/libupnp_la-client_table.lo: \ src/genlib/client_table/$(am__dirstamp) \ src/genlib/client_table/$(DEPDIR)/$(am__dirstamp) src/genlib/client_table/libupnp_la-ClientSubscription.lo: \ src/genlib/client_table/$(am__dirstamp) \ src/genlib/client_table/$(DEPDIR)/$(am__dirstamp) src/genlib/service_table/$(am__dirstamp): @$(MKDIR_P) src/genlib/service_table @: > src/genlib/service_table/$(am__dirstamp) src/genlib/service_table/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/genlib/service_table/$(DEPDIR) @: > src/genlib/service_table/$(DEPDIR)/$(am__dirstamp) src/genlib/service_table/libupnp_la-service_table.lo: \ src/genlib/service_table/$(am__dirstamp) \ src/genlib/service_table/$(DEPDIR)/$(am__dirstamp) src/genlib/util/$(am__dirstamp): @$(MKDIR_P) src/genlib/util @: > src/genlib/util/$(am__dirstamp) src/genlib/util/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/genlib/util/$(DEPDIR) @: > src/genlib/util/$(DEPDIR)/$(am__dirstamp) src/genlib/util/libupnp_la-membuffer.lo: \ src/genlib/util/$(am__dirstamp) \ src/genlib/util/$(DEPDIR)/$(am__dirstamp) src/genlib/util/libupnp_la-strintmap.lo: \ src/genlib/util/$(am__dirstamp) \ src/genlib/util/$(DEPDIR)/$(am__dirstamp) src/genlib/util/libupnp_la-upnp_timeout.lo: \ src/genlib/util/$(am__dirstamp) \ src/genlib/util/$(DEPDIR)/$(am__dirstamp) src/genlib/util/libupnp_la-util.lo: src/genlib/util/$(am__dirstamp) \ src/genlib/util/$(DEPDIR)/$(am__dirstamp) src/genlib/net/$(am__dirstamp): @$(MKDIR_P) src/genlib/net @: > src/genlib/net/$(am__dirstamp) src/genlib/net/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/genlib/net/$(DEPDIR) @: > src/genlib/net/$(DEPDIR)/$(am__dirstamp) src/genlib/net/libupnp_la-sock.lo: src/genlib/net/$(am__dirstamp) \ src/genlib/net/$(DEPDIR)/$(am__dirstamp) src/genlib/net/http/$(am__dirstamp): @$(MKDIR_P) src/genlib/net/http @: > src/genlib/net/http/$(am__dirstamp) src/genlib/net/http/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/genlib/net/http/$(DEPDIR) @: > src/genlib/net/http/$(DEPDIR)/$(am__dirstamp) src/genlib/net/http/libupnp_la-httpparser.lo: \ src/genlib/net/http/$(am__dirstamp) \ src/genlib/net/http/$(DEPDIR)/$(am__dirstamp) src/genlib/net/http/libupnp_la-httpreadwrite.lo: \ src/genlib/net/http/$(am__dirstamp) \ src/genlib/net/http/$(DEPDIR)/$(am__dirstamp) src/genlib/net/http/libupnp_la-statcodes.lo: \ src/genlib/net/http/$(am__dirstamp) \ src/genlib/net/http/$(DEPDIR)/$(am__dirstamp) src/genlib/net/http/libupnp_la-webserver.lo: \ src/genlib/net/http/$(am__dirstamp) \ src/genlib/net/http/$(DEPDIR)/$(am__dirstamp) src/genlib/net/http/libupnp_la-parsetools.lo: \ src/genlib/net/http/$(am__dirstamp) \ src/genlib/net/http/$(DEPDIR)/$(am__dirstamp) src/genlib/net/uri/$(am__dirstamp): @$(MKDIR_P) src/genlib/net/uri @: > src/genlib/net/uri/$(am__dirstamp) src/genlib/net/uri/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/genlib/net/uri/$(DEPDIR) @: > src/genlib/net/uri/$(DEPDIR)/$(am__dirstamp) src/genlib/net/uri/libupnp_la-uri.lo: \ src/genlib/net/uri/$(am__dirstamp) \ src/genlib/net/uri/$(DEPDIR)/$(am__dirstamp) src/gena/$(am__dirstamp): @$(MKDIR_P) src/gena @: > src/gena/$(am__dirstamp) src/gena/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/gena/$(DEPDIR) @: > src/gena/$(DEPDIR)/$(am__dirstamp) src/gena/libupnp_la-gena_device.lo: src/gena/$(am__dirstamp) \ src/gena/$(DEPDIR)/$(am__dirstamp) src/gena/libupnp_la-gena_ctrlpt.lo: src/gena/$(am__dirstamp) \ src/gena/$(DEPDIR)/$(am__dirstamp) src/gena/libupnp_la-gena_callback2.lo: src/gena/$(am__dirstamp) \ src/gena/$(DEPDIR)/$(am__dirstamp) src/api/$(am__dirstamp): @$(MKDIR_P) src/api @: > src/api/$(am__dirstamp) src/api/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/api/$(DEPDIR) @: > src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-ActionComplete.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-ActionRequest.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-Discovery.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-Event.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-EventSubscribe.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-FileInfo.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-StateVarComplete.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-StateVarRequest.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-SubscriptionRequest.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-UpnpString.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-upnpapi.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-upnptools.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/api/libupnp_la-upnpdebug.lo: src/api/$(am__dirstamp) \ src/api/$(DEPDIR)/$(am__dirstamp) src/uuid/$(am__dirstamp): @$(MKDIR_P) src/uuid @: > src/uuid/$(am__dirstamp) src/uuid/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/uuid/$(DEPDIR) @: > src/uuid/$(DEPDIR)/$(am__dirstamp) src/uuid/libupnp_la-md5.lo: src/uuid/$(am__dirstamp) \ src/uuid/$(DEPDIR)/$(am__dirstamp) src/uuid/libupnp_la-sysdep.lo: src/uuid/$(am__dirstamp) \ src/uuid/$(DEPDIR)/$(am__dirstamp) src/uuid/libupnp_la-uuid.lo: src/uuid/$(am__dirstamp) \ src/uuid/$(DEPDIR)/$(am__dirstamp) src/urlconfig/$(am__dirstamp): @$(MKDIR_P) src/urlconfig @: > src/urlconfig/$(am__dirstamp) src/urlconfig/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/urlconfig/$(DEPDIR) @: > src/urlconfig/$(DEPDIR)/$(am__dirstamp) src/urlconfig/libupnp_la-urlconfig.lo: src/urlconfig/$(am__dirstamp) \ src/urlconfig/$(DEPDIR)/$(am__dirstamp) src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/libupnp_la-inet_pton.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) libupnp.la: $(libupnp_la_OBJECTS) $(libupnp_la_DEPENDENCIES) $(libupnp_la_LINK) -rpath $(libdir) $(libupnp_la_OBJECTS) $(libupnp_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test/$(am__dirstamp): @$(MKDIR_P) test @: > test/$(am__dirstamp) test/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) test/$(DEPDIR) @: > test/$(DEPDIR)/$(am__dirstamp) test/test_init.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) test_init$(EXEEXT): $(test_init_OBJECTS) $(test_init_DEPENDENCIES) @rm -f test_init$(EXEEXT) $(LINK) $(test_init_OBJECTS) $(test_init_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/api/libupnp_la-ActionComplete.$(OBJEXT) -rm -f src/api/libupnp_la-ActionComplete.lo -rm -f src/api/libupnp_la-ActionRequest.$(OBJEXT) -rm -f src/api/libupnp_la-ActionRequest.lo -rm -f src/api/libupnp_la-Discovery.$(OBJEXT) -rm -f src/api/libupnp_la-Discovery.lo -rm -f src/api/libupnp_la-Event.$(OBJEXT) -rm -f src/api/libupnp_la-Event.lo -rm -f src/api/libupnp_la-EventSubscribe.$(OBJEXT) -rm -f src/api/libupnp_la-EventSubscribe.lo -rm -f src/api/libupnp_la-FileInfo.$(OBJEXT) -rm -f src/api/libupnp_la-FileInfo.lo -rm -f src/api/libupnp_la-StateVarComplete.$(OBJEXT) -rm -f src/api/libupnp_la-StateVarComplete.lo -rm -f src/api/libupnp_la-StateVarRequest.$(OBJEXT) -rm -f src/api/libupnp_la-StateVarRequest.lo -rm -f src/api/libupnp_la-SubscriptionRequest.$(OBJEXT) -rm -f src/api/libupnp_la-SubscriptionRequest.lo -rm -f src/api/libupnp_la-UpnpString.$(OBJEXT) -rm -f src/api/libupnp_la-UpnpString.lo -rm -f src/api/libupnp_la-upnpapi.$(OBJEXT) -rm -f src/api/libupnp_la-upnpapi.lo -rm -f src/api/libupnp_la-upnpdebug.$(OBJEXT) -rm -f src/api/libupnp_la-upnpdebug.lo -rm -f src/api/libupnp_la-upnptools.$(OBJEXT) -rm -f src/api/libupnp_la-upnptools.lo -rm -f src/gena/libupnp_la-gena_callback2.$(OBJEXT) -rm -f src/gena/libupnp_la-gena_callback2.lo -rm -f src/gena/libupnp_la-gena_ctrlpt.$(OBJEXT) -rm -f src/gena/libupnp_la-gena_ctrlpt.lo -rm -f src/gena/libupnp_la-gena_device.$(OBJEXT) -rm -f src/gena/libupnp_la-gena_device.lo -rm -f src/genlib/client_table/libupnp_la-ClientSubscription.$(OBJEXT) -rm -f src/genlib/client_table/libupnp_la-ClientSubscription.lo -rm -f src/genlib/client_table/libupnp_la-client_table.$(OBJEXT) -rm -f src/genlib/client_table/libupnp_la-client_table.lo -rm -f src/genlib/miniserver/libupnp_la-miniserver.$(OBJEXT) -rm -f src/genlib/miniserver/libupnp_la-miniserver.lo -rm -f src/genlib/net/http/libupnp_la-httpparser.$(OBJEXT) -rm -f src/genlib/net/http/libupnp_la-httpparser.lo -rm -f src/genlib/net/http/libupnp_la-httpreadwrite.$(OBJEXT) -rm -f src/genlib/net/http/libupnp_la-httpreadwrite.lo -rm -f src/genlib/net/http/libupnp_la-parsetools.$(OBJEXT) -rm -f src/genlib/net/http/libupnp_la-parsetools.lo -rm -f src/genlib/net/http/libupnp_la-statcodes.$(OBJEXT) -rm -f src/genlib/net/http/libupnp_la-statcodes.lo -rm -f src/genlib/net/http/libupnp_la-webserver.$(OBJEXT) -rm -f src/genlib/net/http/libupnp_la-webserver.lo -rm -f src/genlib/net/libupnp_la-sock.$(OBJEXT) -rm -f src/genlib/net/libupnp_la-sock.lo -rm -f src/genlib/net/uri/libupnp_la-uri.$(OBJEXT) -rm -f src/genlib/net/uri/libupnp_la-uri.lo -rm -f src/genlib/service_table/libupnp_la-service_table.$(OBJEXT) -rm -f src/genlib/service_table/libupnp_la-service_table.lo -rm -f src/genlib/util/libupnp_la-membuffer.$(OBJEXT) -rm -f src/genlib/util/libupnp_la-membuffer.lo -rm -f src/genlib/util/libupnp_la-strintmap.$(OBJEXT) -rm -f src/genlib/util/libupnp_la-strintmap.lo -rm -f src/genlib/util/libupnp_la-upnp_timeout.$(OBJEXT) -rm -f src/genlib/util/libupnp_la-upnp_timeout.lo -rm -f src/genlib/util/libupnp_la-util.$(OBJEXT) -rm -f src/genlib/util/libupnp_la-util.lo -rm -f src/libupnp_la-inet_pton.$(OBJEXT) -rm -f src/libupnp_la-inet_pton.lo -rm -f src/soap/libupnp_la-soap_common.$(OBJEXT) -rm -f src/soap/libupnp_la-soap_common.lo -rm -f src/soap/libupnp_la-soap_ctrlpt.$(OBJEXT) -rm -f src/soap/libupnp_la-soap_ctrlpt.lo -rm -f src/soap/libupnp_la-soap_device.$(OBJEXT) -rm -f src/soap/libupnp_la-soap_device.lo -rm -f src/ssdp/libupnp_la-ssdp_ResultData.$(OBJEXT) -rm -f src/ssdp/libupnp_la-ssdp_ResultData.lo -rm -f src/ssdp/libupnp_la-ssdp_ctrlpt.$(OBJEXT) -rm -f src/ssdp/libupnp_la-ssdp_ctrlpt.lo -rm -f src/ssdp/libupnp_la-ssdp_device.$(OBJEXT) -rm -f src/ssdp/libupnp_la-ssdp_device.lo -rm -f src/ssdp/libupnp_la-ssdp_server.$(OBJEXT) -rm -f src/ssdp/libupnp_la-ssdp_server.lo -rm -f src/urlconfig/libupnp_la-urlconfig.$(OBJEXT) -rm -f src/urlconfig/libupnp_la-urlconfig.lo -rm -f src/uuid/libupnp_la-md5.$(OBJEXT) -rm -f src/uuid/libupnp_la-md5.lo -rm -f src/uuid/libupnp_la-sysdep.$(OBJEXT) -rm -f src/uuid/libupnp_la-sysdep.lo -rm -f src/uuid/libupnp_la-uuid.$(OBJEXT) -rm -f src/uuid/libupnp_la-uuid.lo -rm -f test/test_init.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libupnp_la-inet_pton.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-ActionComplete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-ActionRequest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-Discovery.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-Event.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-EventSubscribe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-FileInfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-StateVarComplete.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-StateVarRequest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-SubscriptionRequest.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-UpnpString.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-upnpapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-upnpdebug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/api/$(DEPDIR)/libupnp_la-upnptools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/gena/$(DEPDIR)/libupnp_la-gena_callback2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/gena/$(DEPDIR)/libupnp_la-gena_ctrlpt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/gena/$(DEPDIR)/libupnp_la-gena_device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/client_table/$(DEPDIR)/libupnp_la-ClientSubscription.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/client_table/$(DEPDIR)/libupnp_la-client_table.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/miniserver/$(DEPDIR)/libupnp_la-miniserver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/net/$(DEPDIR)/libupnp_la-sock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/net/http/$(DEPDIR)/libupnp_la-httpparser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/net/http/$(DEPDIR)/libupnp_la-httpreadwrite.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/net/http/$(DEPDIR)/libupnp_la-parsetools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/net/http/$(DEPDIR)/libupnp_la-statcodes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/net/http/$(DEPDIR)/libupnp_la-webserver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/net/uri/$(DEPDIR)/libupnp_la-uri.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/service_table/$(DEPDIR)/libupnp_la-service_table.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/util/$(DEPDIR)/libupnp_la-membuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/util/$(DEPDIR)/libupnp_la-strintmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/util/$(DEPDIR)/libupnp_la-upnp_timeout.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/genlib/util/$(DEPDIR)/libupnp_la-util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/soap/$(DEPDIR)/libupnp_la-soap_common.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/soap/$(DEPDIR)/libupnp_la-soap_ctrlpt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/soap/$(DEPDIR)/libupnp_la-soap_device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ResultData.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ctrlpt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ssdp/$(DEPDIR)/libupnp_la-ssdp_device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/ssdp/$(DEPDIR)/libupnp_la-ssdp_server.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/urlconfig/$(DEPDIR)/libupnp_la-urlconfig.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/uuid/$(DEPDIR)/libupnp_la-md5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/uuid/$(DEPDIR)/libupnp_la-sysdep.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/uuid/$(DEPDIR)/libupnp_la-uuid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/test_init.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< src/ssdp/libupnp_la-ssdp_ResultData.lo: src/ssdp/ssdp_ResultData.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/ssdp/libupnp_la-ssdp_ResultData.lo -MD -MP -MF src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ResultData.Tpo -c -o src/ssdp/libupnp_la-ssdp_ResultData.lo `test -f 'src/ssdp/ssdp_ResultData.c' || echo '$(srcdir)/'`src/ssdp/ssdp_ResultData.c @am__fastdepCC_TRUE@ mv -f src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ResultData.Tpo src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ResultData.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/ssdp/ssdp_ResultData.c' object='src/ssdp/libupnp_la-ssdp_ResultData.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/ssdp/libupnp_la-ssdp_ResultData.lo `test -f 'src/ssdp/ssdp_ResultData.c' || echo '$(srcdir)/'`src/ssdp/ssdp_ResultData.c src/ssdp/libupnp_la-ssdp_device.lo: src/ssdp/ssdp_device.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/ssdp/libupnp_la-ssdp_device.lo -MD -MP -MF src/ssdp/$(DEPDIR)/libupnp_la-ssdp_device.Tpo -c -o src/ssdp/libupnp_la-ssdp_device.lo `test -f 'src/ssdp/ssdp_device.c' || echo '$(srcdir)/'`src/ssdp/ssdp_device.c @am__fastdepCC_TRUE@ mv -f src/ssdp/$(DEPDIR)/libupnp_la-ssdp_device.Tpo src/ssdp/$(DEPDIR)/libupnp_la-ssdp_device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/ssdp/ssdp_device.c' object='src/ssdp/libupnp_la-ssdp_device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/ssdp/libupnp_la-ssdp_device.lo `test -f 'src/ssdp/ssdp_device.c' || echo '$(srcdir)/'`src/ssdp/ssdp_device.c src/ssdp/libupnp_la-ssdp_ctrlpt.lo: src/ssdp/ssdp_ctrlpt.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/ssdp/libupnp_la-ssdp_ctrlpt.lo -MD -MP -MF src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ctrlpt.Tpo -c -o src/ssdp/libupnp_la-ssdp_ctrlpt.lo `test -f 'src/ssdp/ssdp_ctrlpt.c' || echo '$(srcdir)/'`src/ssdp/ssdp_ctrlpt.c @am__fastdepCC_TRUE@ mv -f src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ctrlpt.Tpo src/ssdp/$(DEPDIR)/libupnp_la-ssdp_ctrlpt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/ssdp/ssdp_ctrlpt.c' object='src/ssdp/libupnp_la-ssdp_ctrlpt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/ssdp/libupnp_la-ssdp_ctrlpt.lo `test -f 'src/ssdp/ssdp_ctrlpt.c' || echo '$(srcdir)/'`src/ssdp/ssdp_ctrlpt.c src/ssdp/libupnp_la-ssdp_server.lo: src/ssdp/ssdp_server.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/ssdp/libupnp_la-ssdp_server.lo -MD -MP -MF src/ssdp/$(DEPDIR)/libupnp_la-ssdp_server.Tpo -c -o src/ssdp/libupnp_la-ssdp_server.lo `test -f 'src/ssdp/ssdp_server.c' || echo '$(srcdir)/'`src/ssdp/ssdp_server.c @am__fastdepCC_TRUE@ mv -f src/ssdp/$(DEPDIR)/libupnp_la-ssdp_server.Tpo src/ssdp/$(DEPDIR)/libupnp_la-ssdp_server.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/ssdp/ssdp_server.c' object='src/ssdp/libupnp_la-ssdp_server.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/ssdp/libupnp_la-ssdp_server.lo `test -f 'src/ssdp/ssdp_server.c' || echo '$(srcdir)/'`src/ssdp/ssdp_server.c src/soap/libupnp_la-soap_device.lo: src/soap/soap_device.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/soap/libupnp_la-soap_device.lo -MD -MP -MF src/soap/$(DEPDIR)/libupnp_la-soap_device.Tpo -c -o src/soap/libupnp_la-soap_device.lo `test -f 'src/soap/soap_device.c' || echo '$(srcdir)/'`src/soap/soap_device.c @am__fastdepCC_TRUE@ mv -f src/soap/$(DEPDIR)/libupnp_la-soap_device.Tpo src/soap/$(DEPDIR)/libupnp_la-soap_device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/soap/soap_device.c' object='src/soap/libupnp_la-soap_device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/soap/libupnp_la-soap_device.lo `test -f 'src/soap/soap_device.c' || echo '$(srcdir)/'`src/soap/soap_device.c src/soap/libupnp_la-soap_ctrlpt.lo: src/soap/soap_ctrlpt.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/soap/libupnp_la-soap_ctrlpt.lo -MD -MP -MF src/soap/$(DEPDIR)/libupnp_la-soap_ctrlpt.Tpo -c -o src/soap/libupnp_la-soap_ctrlpt.lo `test -f 'src/soap/soap_ctrlpt.c' || echo '$(srcdir)/'`src/soap/soap_ctrlpt.c @am__fastdepCC_TRUE@ mv -f src/soap/$(DEPDIR)/libupnp_la-soap_ctrlpt.Tpo src/soap/$(DEPDIR)/libupnp_la-soap_ctrlpt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/soap/soap_ctrlpt.c' object='src/soap/libupnp_la-soap_ctrlpt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/soap/libupnp_la-soap_ctrlpt.lo `test -f 'src/soap/soap_ctrlpt.c' || echo '$(srcdir)/'`src/soap/soap_ctrlpt.c src/soap/libupnp_la-soap_common.lo: src/soap/soap_common.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/soap/libupnp_la-soap_common.lo -MD -MP -MF src/soap/$(DEPDIR)/libupnp_la-soap_common.Tpo -c -o src/soap/libupnp_la-soap_common.lo `test -f 'src/soap/soap_common.c' || echo '$(srcdir)/'`src/soap/soap_common.c @am__fastdepCC_TRUE@ mv -f src/soap/$(DEPDIR)/libupnp_la-soap_common.Tpo src/soap/$(DEPDIR)/libupnp_la-soap_common.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/soap/soap_common.c' object='src/soap/libupnp_la-soap_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/soap/libupnp_la-soap_common.lo `test -f 'src/soap/soap_common.c' || echo '$(srcdir)/'`src/soap/soap_common.c src/genlib/miniserver/libupnp_la-miniserver.lo: src/genlib/miniserver/miniserver.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/miniserver/libupnp_la-miniserver.lo -MD -MP -MF src/genlib/miniserver/$(DEPDIR)/libupnp_la-miniserver.Tpo -c -o src/genlib/miniserver/libupnp_la-miniserver.lo `test -f 'src/genlib/miniserver/miniserver.c' || echo '$(srcdir)/'`src/genlib/miniserver/miniserver.c @am__fastdepCC_TRUE@ mv -f src/genlib/miniserver/$(DEPDIR)/libupnp_la-miniserver.Tpo src/genlib/miniserver/$(DEPDIR)/libupnp_la-miniserver.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/miniserver/miniserver.c' object='src/genlib/miniserver/libupnp_la-miniserver.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/miniserver/libupnp_la-miniserver.lo `test -f 'src/genlib/miniserver/miniserver.c' || echo '$(srcdir)/'`src/genlib/miniserver/miniserver.c src/genlib/client_table/libupnp_la-client_table.lo: src/genlib/client_table/client_table.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/client_table/libupnp_la-client_table.lo -MD -MP -MF src/genlib/client_table/$(DEPDIR)/libupnp_la-client_table.Tpo -c -o src/genlib/client_table/libupnp_la-client_table.lo `test -f 'src/genlib/client_table/client_table.c' || echo '$(srcdir)/'`src/genlib/client_table/client_table.c @am__fastdepCC_TRUE@ mv -f src/genlib/client_table/$(DEPDIR)/libupnp_la-client_table.Tpo src/genlib/client_table/$(DEPDIR)/libupnp_la-client_table.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/client_table/client_table.c' object='src/genlib/client_table/libupnp_la-client_table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/client_table/libupnp_la-client_table.lo `test -f 'src/genlib/client_table/client_table.c' || echo '$(srcdir)/'`src/genlib/client_table/client_table.c src/genlib/client_table/libupnp_la-ClientSubscription.lo: src/genlib/client_table/ClientSubscription.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/client_table/libupnp_la-ClientSubscription.lo -MD -MP -MF src/genlib/client_table/$(DEPDIR)/libupnp_la-ClientSubscription.Tpo -c -o src/genlib/client_table/libupnp_la-ClientSubscription.lo `test -f 'src/genlib/client_table/ClientSubscription.c' || echo '$(srcdir)/'`src/genlib/client_table/ClientSubscription.c @am__fastdepCC_TRUE@ mv -f src/genlib/client_table/$(DEPDIR)/libupnp_la-ClientSubscription.Tpo src/genlib/client_table/$(DEPDIR)/libupnp_la-ClientSubscription.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/client_table/ClientSubscription.c' object='src/genlib/client_table/libupnp_la-ClientSubscription.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/client_table/libupnp_la-ClientSubscription.lo `test -f 'src/genlib/client_table/ClientSubscription.c' || echo '$(srcdir)/'`src/genlib/client_table/ClientSubscription.c src/genlib/service_table/libupnp_la-service_table.lo: src/genlib/service_table/service_table.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/service_table/libupnp_la-service_table.lo -MD -MP -MF src/genlib/service_table/$(DEPDIR)/libupnp_la-service_table.Tpo -c -o src/genlib/service_table/libupnp_la-service_table.lo `test -f 'src/genlib/service_table/service_table.c' || echo '$(srcdir)/'`src/genlib/service_table/service_table.c @am__fastdepCC_TRUE@ mv -f src/genlib/service_table/$(DEPDIR)/libupnp_la-service_table.Tpo src/genlib/service_table/$(DEPDIR)/libupnp_la-service_table.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/service_table/service_table.c' object='src/genlib/service_table/libupnp_la-service_table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/service_table/libupnp_la-service_table.lo `test -f 'src/genlib/service_table/service_table.c' || echo '$(srcdir)/'`src/genlib/service_table/service_table.c src/genlib/util/libupnp_la-membuffer.lo: src/genlib/util/membuffer.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/util/libupnp_la-membuffer.lo -MD -MP -MF src/genlib/util/$(DEPDIR)/libupnp_la-membuffer.Tpo -c -o src/genlib/util/libupnp_la-membuffer.lo `test -f 'src/genlib/util/membuffer.c' || echo '$(srcdir)/'`src/genlib/util/membuffer.c @am__fastdepCC_TRUE@ mv -f src/genlib/util/$(DEPDIR)/libupnp_la-membuffer.Tpo src/genlib/util/$(DEPDIR)/libupnp_la-membuffer.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/util/membuffer.c' object='src/genlib/util/libupnp_la-membuffer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/util/libupnp_la-membuffer.lo `test -f 'src/genlib/util/membuffer.c' || echo '$(srcdir)/'`src/genlib/util/membuffer.c src/genlib/util/libupnp_la-strintmap.lo: src/genlib/util/strintmap.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/util/libupnp_la-strintmap.lo -MD -MP -MF src/genlib/util/$(DEPDIR)/libupnp_la-strintmap.Tpo -c -o src/genlib/util/libupnp_la-strintmap.lo `test -f 'src/genlib/util/strintmap.c' || echo '$(srcdir)/'`src/genlib/util/strintmap.c @am__fastdepCC_TRUE@ mv -f src/genlib/util/$(DEPDIR)/libupnp_la-strintmap.Tpo src/genlib/util/$(DEPDIR)/libupnp_la-strintmap.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/util/strintmap.c' object='src/genlib/util/libupnp_la-strintmap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/util/libupnp_la-strintmap.lo `test -f 'src/genlib/util/strintmap.c' || echo '$(srcdir)/'`src/genlib/util/strintmap.c src/genlib/util/libupnp_la-upnp_timeout.lo: src/genlib/util/upnp_timeout.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/util/libupnp_la-upnp_timeout.lo -MD -MP -MF src/genlib/util/$(DEPDIR)/libupnp_la-upnp_timeout.Tpo -c -o src/genlib/util/libupnp_la-upnp_timeout.lo `test -f 'src/genlib/util/upnp_timeout.c' || echo '$(srcdir)/'`src/genlib/util/upnp_timeout.c @am__fastdepCC_TRUE@ mv -f src/genlib/util/$(DEPDIR)/libupnp_la-upnp_timeout.Tpo src/genlib/util/$(DEPDIR)/libupnp_la-upnp_timeout.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/util/upnp_timeout.c' object='src/genlib/util/libupnp_la-upnp_timeout.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/util/libupnp_la-upnp_timeout.lo `test -f 'src/genlib/util/upnp_timeout.c' || echo '$(srcdir)/'`src/genlib/util/upnp_timeout.c src/genlib/util/libupnp_la-util.lo: src/genlib/util/util.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/util/libupnp_la-util.lo -MD -MP -MF src/genlib/util/$(DEPDIR)/libupnp_la-util.Tpo -c -o src/genlib/util/libupnp_la-util.lo `test -f 'src/genlib/util/util.c' || echo '$(srcdir)/'`src/genlib/util/util.c @am__fastdepCC_TRUE@ mv -f src/genlib/util/$(DEPDIR)/libupnp_la-util.Tpo src/genlib/util/$(DEPDIR)/libupnp_la-util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/util/util.c' object='src/genlib/util/libupnp_la-util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/util/libupnp_la-util.lo `test -f 'src/genlib/util/util.c' || echo '$(srcdir)/'`src/genlib/util/util.c src/genlib/net/libupnp_la-sock.lo: src/genlib/net/sock.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/net/libupnp_la-sock.lo -MD -MP -MF src/genlib/net/$(DEPDIR)/libupnp_la-sock.Tpo -c -o src/genlib/net/libupnp_la-sock.lo `test -f 'src/genlib/net/sock.c' || echo '$(srcdir)/'`src/genlib/net/sock.c @am__fastdepCC_TRUE@ mv -f src/genlib/net/$(DEPDIR)/libupnp_la-sock.Tpo src/genlib/net/$(DEPDIR)/libupnp_la-sock.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/net/sock.c' object='src/genlib/net/libupnp_la-sock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/net/libupnp_la-sock.lo `test -f 'src/genlib/net/sock.c' || echo '$(srcdir)/'`src/genlib/net/sock.c src/genlib/net/http/libupnp_la-httpparser.lo: src/genlib/net/http/httpparser.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/net/http/libupnp_la-httpparser.lo -MD -MP -MF src/genlib/net/http/$(DEPDIR)/libupnp_la-httpparser.Tpo -c -o src/genlib/net/http/libupnp_la-httpparser.lo `test -f 'src/genlib/net/http/httpparser.c' || echo '$(srcdir)/'`src/genlib/net/http/httpparser.c @am__fastdepCC_TRUE@ mv -f src/genlib/net/http/$(DEPDIR)/libupnp_la-httpparser.Tpo src/genlib/net/http/$(DEPDIR)/libupnp_la-httpparser.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/net/http/httpparser.c' object='src/genlib/net/http/libupnp_la-httpparser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/net/http/libupnp_la-httpparser.lo `test -f 'src/genlib/net/http/httpparser.c' || echo '$(srcdir)/'`src/genlib/net/http/httpparser.c src/genlib/net/http/libupnp_la-httpreadwrite.lo: src/genlib/net/http/httpreadwrite.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/net/http/libupnp_la-httpreadwrite.lo -MD -MP -MF src/genlib/net/http/$(DEPDIR)/libupnp_la-httpreadwrite.Tpo -c -o src/genlib/net/http/libupnp_la-httpreadwrite.lo `test -f 'src/genlib/net/http/httpreadwrite.c' || echo '$(srcdir)/'`src/genlib/net/http/httpreadwrite.c @am__fastdepCC_TRUE@ mv -f src/genlib/net/http/$(DEPDIR)/libupnp_la-httpreadwrite.Tpo src/genlib/net/http/$(DEPDIR)/libupnp_la-httpreadwrite.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/net/http/httpreadwrite.c' object='src/genlib/net/http/libupnp_la-httpreadwrite.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/net/http/libupnp_la-httpreadwrite.lo `test -f 'src/genlib/net/http/httpreadwrite.c' || echo '$(srcdir)/'`src/genlib/net/http/httpreadwrite.c src/genlib/net/http/libupnp_la-statcodes.lo: src/genlib/net/http/statcodes.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/net/http/libupnp_la-statcodes.lo -MD -MP -MF src/genlib/net/http/$(DEPDIR)/libupnp_la-statcodes.Tpo -c -o src/genlib/net/http/libupnp_la-statcodes.lo `test -f 'src/genlib/net/http/statcodes.c' || echo '$(srcdir)/'`src/genlib/net/http/statcodes.c @am__fastdepCC_TRUE@ mv -f src/genlib/net/http/$(DEPDIR)/libupnp_la-statcodes.Tpo src/genlib/net/http/$(DEPDIR)/libupnp_la-statcodes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/net/http/statcodes.c' object='src/genlib/net/http/libupnp_la-statcodes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/net/http/libupnp_la-statcodes.lo `test -f 'src/genlib/net/http/statcodes.c' || echo '$(srcdir)/'`src/genlib/net/http/statcodes.c src/genlib/net/http/libupnp_la-webserver.lo: src/genlib/net/http/webserver.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/net/http/libupnp_la-webserver.lo -MD -MP -MF src/genlib/net/http/$(DEPDIR)/libupnp_la-webserver.Tpo -c -o src/genlib/net/http/libupnp_la-webserver.lo `test -f 'src/genlib/net/http/webserver.c' || echo '$(srcdir)/'`src/genlib/net/http/webserver.c @am__fastdepCC_TRUE@ mv -f src/genlib/net/http/$(DEPDIR)/libupnp_la-webserver.Tpo src/genlib/net/http/$(DEPDIR)/libupnp_la-webserver.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/net/http/webserver.c' object='src/genlib/net/http/libupnp_la-webserver.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/net/http/libupnp_la-webserver.lo `test -f 'src/genlib/net/http/webserver.c' || echo '$(srcdir)/'`src/genlib/net/http/webserver.c src/genlib/net/http/libupnp_la-parsetools.lo: src/genlib/net/http/parsetools.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/net/http/libupnp_la-parsetools.lo -MD -MP -MF src/genlib/net/http/$(DEPDIR)/libupnp_la-parsetools.Tpo -c -o src/genlib/net/http/libupnp_la-parsetools.lo `test -f 'src/genlib/net/http/parsetools.c' || echo '$(srcdir)/'`src/genlib/net/http/parsetools.c @am__fastdepCC_TRUE@ mv -f src/genlib/net/http/$(DEPDIR)/libupnp_la-parsetools.Tpo src/genlib/net/http/$(DEPDIR)/libupnp_la-parsetools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/net/http/parsetools.c' object='src/genlib/net/http/libupnp_la-parsetools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/net/http/libupnp_la-parsetools.lo `test -f 'src/genlib/net/http/parsetools.c' || echo '$(srcdir)/'`src/genlib/net/http/parsetools.c src/genlib/net/uri/libupnp_la-uri.lo: src/genlib/net/uri/uri.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/genlib/net/uri/libupnp_la-uri.lo -MD -MP -MF src/genlib/net/uri/$(DEPDIR)/libupnp_la-uri.Tpo -c -o src/genlib/net/uri/libupnp_la-uri.lo `test -f 'src/genlib/net/uri/uri.c' || echo '$(srcdir)/'`src/genlib/net/uri/uri.c @am__fastdepCC_TRUE@ mv -f src/genlib/net/uri/$(DEPDIR)/libupnp_la-uri.Tpo src/genlib/net/uri/$(DEPDIR)/libupnp_la-uri.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/genlib/net/uri/uri.c' object='src/genlib/net/uri/libupnp_la-uri.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/genlib/net/uri/libupnp_la-uri.lo `test -f 'src/genlib/net/uri/uri.c' || echo '$(srcdir)/'`src/genlib/net/uri/uri.c src/gena/libupnp_la-gena_device.lo: src/gena/gena_device.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/gena/libupnp_la-gena_device.lo -MD -MP -MF src/gena/$(DEPDIR)/libupnp_la-gena_device.Tpo -c -o src/gena/libupnp_la-gena_device.lo `test -f 'src/gena/gena_device.c' || echo '$(srcdir)/'`src/gena/gena_device.c @am__fastdepCC_TRUE@ mv -f src/gena/$(DEPDIR)/libupnp_la-gena_device.Tpo src/gena/$(DEPDIR)/libupnp_la-gena_device.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/gena/gena_device.c' object='src/gena/libupnp_la-gena_device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/gena/libupnp_la-gena_device.lo `test -f 'src/gena/gena_device.c' || echo '$(srcdir)/'`src/gena/gena_device.c src/gena/libupnp_la-gena_ctrlpt.lo: src/gena/gena_ctrlpt.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/gena/libupnp_la-gena_ctrlpt.lo -MD -MP -MF src/gena/$(DEPDIR)/libupnp_la-gena_ctrlpt.Tpo -c -o src/gena/libupnp_la-gena_ctrlpt.lo `test -f 'src/gena/gena_ctrlpt.c' || echo '$(srcdir)/'`src/gena/gena_ctrlpt.c @am__fastdepCC_TRUE@ mv -f src/gena/$(DEPDIR)/libupnp_la-gena_ctrlpt.Tpo src/gena/$(DEPDIR)/libupnp_la-gena_ctrlpt.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/gena/gena_ctrlpt.c' object='src/gena/libupnp_la-gena_ctrlpt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/gena/libupnp_la-gena_ctrlpt.lo `test -f 'src/gena/gena_ctrlpt.c' || echo '$(srcdir)/'`src/gena/gena_ctrlpt.c src/gena/libupnp_la-gena_callback2.lo: src/gena/gena_callback2.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/gena/libupnp_la-gena_callback2.lo -MD -MP -MF src/gena/$(DEPDIR)/libupnp_la-gena_callback2.Tpo -c -o src/gena/libupnp_la-gena_callback2.lo `test -f 'src/gena/gena_callback2.c' || echo '$(srcdir)/'`src/gena/gena_callback2.c @am__fastdepCC_TRUE@ mv -f src/gena/$(DEPDIR)/libupnp_la-gena_callback2.Tpo src/gena/$(DEPDIR)/libupnp_la-gena_callback2.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/gena/gena_callback2.c' object='src/gena/libupnp_la-gena_callback2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/gena/libupnp_la-gena_callback2.lo `test -f 'src/gena/gena_callback2.c' || echo '$(srcdir)/'`src/gena/gena_callback2.c src/api/libupnp_la-ActionComplete.lo: src/api/ActionComplete.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-ActionComplete.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-ActionComplete.Tpo -c -o src/api/libupnp_la-ActionComplete.lo `test -f 'src/api/ActionComplete.c' || echo '$(srcdir)/'`src/api/ActionComplete.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-ActionComplete.Tpo src/api/$(DEPDIR)/libupnp_la-ActionComplete.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/ActionComplete.c' object='src/api/libupnp_la-ActionComplete.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-ActionComplete.lo `test -f 'src/api/ActionComplete.c' || echo '$(srcdir)/'`src/api/ActionComplete.c src/api/libupnp_la-ActionRequest.lo: src/api/ActionRequest.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-ActionRequest.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-ActionRequest.Tpo -c -o src/api/libupnp_la-ActionRequest.lo `test -f 'src/api/ActionRequest.c' || echo '$(srcdir)/'`src/api/ActionRequest.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-ActionRequest.Tpo src/api/$(DEPDIR)/libupnp_la-ActionRequest.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/ActionRequest.c' object='src/api/libupnp_la-ActionRequest.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-ActionRequest.lo `test -f 'src/api/ActionRequest.c' || echo '$(srcdir)/'`src/api/ActionRequest.c src/api/libupnp_la-Discovery.lo: src/api/Discovery.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-Discovery.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-Discovery.Tpo -c -o src/api/libupnp_la-Discovery.lo `test -f 'src/api/Discovery.c' || echo '$(srcdir)/'`src/api/Discovery.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-Discovery.Tpo src/api/$(DEPDIR)/libupnp_la-Discovery.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/Discovery.c' object='src/api/libupnp_la-Discovery.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-Discovery.lo `test -f 'src/api/Discovery.c' || echo '$(srcdir)/'`src/api/Discovery.c src/api/libupnp_la-Event.lo: src/api/Event.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-Event.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-Event.Tpo -c -o src/api/libupnp_la-Event.lo `test -f 'src/api/Event.c' || echo '$(srcdir)/'`src/api/Event.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-Event.Tpo src/api/$(DEPDIR)/libupnp_la-Event.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/Event.c' object='src/api/libupnp_la-Event.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-Event.lo `test -f 'src/api/Event.c' || echo '$(srcdir)/'`src/api/Event.c src/api/libupnp_la-EventSubscribe.lo: src/api/EventSubscribe.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-EventSubscribe.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-EventSubscribe.Tpo -c -o src/api/libupnp_la-EventSubscribe.lo `test -f 'src/api/EventSubscribe.c' || echo '$(srcdir)/'`src/api/EventSubscribe.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-EventSubscribe.Tpo src/api/$(DEPDIR)/libupnp_la-EventSubscribe.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/EventSubscribe.c' object='src/api/libupnp_la-EventSubscribe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-EventSubscribe.lo `test -f 'src/api/EventSubscribe.c' || echo '$(srcdir)/'`src/api/EventSubscribe.c src/api/libupnp_la-FileInfo.lo: src/api/FileInfo.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-FileInfo.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-FileInfo.Tpo -c -o src/api/libupnp_la-FileInfo.lo `test -f 'src/api/FileInfo.c' || echo '$(srcdir)/'`src/api/FileInfo.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-FileInfo.Tpo src/api/$(DEPDIR)/libupnp_la-FileInfo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/FileInfo.c' object='src/api/libupnp_la-FileInfo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-FileInfo.lo `test -f 'src/api/FileInfo.c' || echo '$(srcdir)/'`src/api/FileInfo.c src/api/libupnp_la-StateVarComplete.lo: src/api/StateVarComplete.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-StateVarComplete.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-StateVarComplete.Tpo -c -o src/api/libupnp_la-StateVarComplete.lo `test -f 'src/api/StateVarComplete.c' || echo '$(srcdir)/'`src/api/StateVarComplete.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-StateVarComplete.Tpo src/api/$(DEPDIR)/libupnp_la-StateVarComplete.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/StateVarComplete.c' object='src/api/libupnp_la-StateVarComplete.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-StateVarComplete.lo `test -f 'src/api/StateVarComplete.c' || echo '$(srcdir)/'`src/api/StateVarComplete.c src/api/libupnp_la-StateVarRequest.lo: src/api/StateVarRequest.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-StateVarRequest.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-StateVarRequest.Tpo -c -o src/api/libupnp_la-StateVarRequest.lo `test -f 'src/api/StateVarRequest.c' || echo '$(srcdir)/'`src/api/StateVarRequest.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-StateVarRequest.Tpo src/api/$(DEPDIR)/libupnp_la-StateVarRequest.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/StateVarRequest.c' object='src/api/libupnp_la-StateVarRequest.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-StateVarRequest.lo `test -f 'src/api/StateVarRequest.c' || echo '$(srcdir)/'`src/api/StateVarRequest.c src/api/libupnp_la-SubscriptionRequest.lo: src/api/SubscriptionRequest.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-SubscriptionRequest.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-SubscriptionRequest.Tpo -c -o src/api/libupnp_la-SubscriptionRequest.lo `test -f 'src/api/SubscriptionRequest.c' || echo '$(srcdir)/'`src/api/SubscriptionRequest.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-SubscriptionRequest.Tpo src/api/$(DEPDIR)/libupnp_la-SubscriptionRequest.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/SubscriptionRequest.c' object='src/api/libupnp_la-SubscriptionRequest.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-SubscriptionRequest.lo `test -f 'src/api/SubscriptionRequest.c' || echo '$(srcdir)/'`src/api/SubscriptionRequest.c src/api/libupnp_la-UpnpString.lo: src/api/UpnpString.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-UpnpString.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-UpnpString.Tpo -c -o src/api/libupnp_la-UpnpString.lo `test -f 'src/api/UpnpString.c' || echo '$(srcdir)/'`src/api/UpnpString.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-UpnpString.Tpo src/api/$(DEPDIR)/libupnp_la-UpnpString.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/UpnpString.c' object='src/api/libupnp_la-UpnpString.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-UpnpString.lo `test -f 'src/api/UpnpString.c' || echo '$(srcdir)/'`src/api/UpnpString.c src/api/libupnp_la-upnpapi.lo: src/api/upnpapi.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-upnpapi.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-upnpapi.Tpo -c -o src/api/libupnp_la-upnpapi.lo `test -f 'src/api/upnpapi.c' || echo '$(srcdir)/'`src/api/upnpapi.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-upnpapi.Tpo src/api/$(DEPDIR)/libupnp_la-upnpapi.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/upnpapi.c' object='src/api/libupnp_la-upnpapi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-upnpapi.lo `test -f 'src/api/upnpapi.c' || echo '$(srcdir)/'`src/api/upnpapi.c src/api/libupnp_la-upnptools.lo: src/api/upnptools.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-upnptools.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-upnptools.Tpo -c -o src/api/libupnp_la-upnptools.lo `test -f 'src/api/upnptools.c' || echo '$(srcdir)/'`src/api/upnptools.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-upnptools.Tpo src/api/$(DEPDIR)/libupnp_la-upnptools.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/upnptools.c' object='src/api/libupnp_la-upnptools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-upnptools.lo `test -f 'src/api/upnptools.c' || echo '$(srcdir)/'`src/api/upnptools.c src/api/libupnp_la-upnpdebug.lo: src/api/upnpdebug.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/api/libupnp_la-upnpdebug.lo -MD -MP -MF src/api/$(DEPDIR)/libupnp_la-upnpdebug.Tpo -c -o src/api/libupnp_la-upnpdebug.lo `test -f 'src/api/upnpdebug.c' || echo '$(srcdir)/'`src/api/upnpdebug.c @am__fastdepCC_TRUE@ mv -f src/api/$(DEPDIR)/libupnp_la-upnpdebug.Tpo src/api/$(DEPDIR)/libupnp_la-upnpdebug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/api/upnpdebug.c' object='src/api/libupnp_la-upnpdebug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/api/libupnp_la-upnpdebug.lo `test -f 'src/api/upnpdebug.c' || echo '$(srcdir)/'`src/api/upnpdebug.c src/uuid/libupnp_la-md5.lo: src/uuid/md5.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/uuid/libupnp_la-md5.lo -MD -MP -MF src/uuid/$(DEPDIR)/libupnp_la-md5.Tpo -c -o src/uuid/libupnp_la-md5.lo `test -f 'src/uuid/md5.c' || echo '$(srcdir)/'`src/uuid/md5.c @am__fastdepCC_TRUE@ mv -f src/uuid/$(DEPDIR)/libupnp_la-md5.Tpo src/uuid/$(DEPDIR)/libupnp_la-md5.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/uuid/md5.c' object='src/uuid/libupnp_la-md5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/uuid/libupnp_la-md5.lo `test -f 'src/uuid/md5.c' || echo '$(srcdir)/'`src/uuid/md5.c src/uuid/libupnp_la-sysdep.lo: src/uuid/sysdep.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/uuid/libupnp_la-sysdep.lo -MD -MP -MF src/uuid/$(DEPDIR)/libupnp_la-sysdep.Tpo -c -o src/uuid/libupnp_la-sysdep.lo `test -f 'src/uuid/sysdep.c' || echo '$(srcdir)/'`src/uuid/sysdep.c @am__fastdepCC_TRUE@ mv -f src/uuid/$(DEPDIR)/libupnp_la-sysdep.Tpo src/uuid/$(DEPDIR)/libupnp_la-sysdep.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/uuid/sysdep.c' object='src/uuid/libupnp_la-sysdep.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/uuid/libupnp_la-sysdep.lo `test -f 'src/uuid/sysdep.c' || echo '$(srcdir)/'`src/uuid/sysdep.c src/uuid/libupnp_la-uuid.lo: src/uuid/uuid.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/uuid/libupnp_la-uuid.lo -MD -MP -MF src/uuid/$(DEPDIR)/libupnp_la-uuid.Tpo -c -o src/uuid/libupnp_la-uuid.lo `test -f 'src/uuid/uuid.c' || echo '$(srcdir)/'`src/uuid/uuid.c @am__fastdepCC_TRUE@ mv -f src/uuid/$(DEPDIR)/libupnp_la-uuid.Tpo src/uuid/$(DEPDIR)/libupnp_la-uuid.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/uuid/uuid.c' object='src/uuid/libupnp_la-uuid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/uuid/libupnp_la-uuid.lo `test -f 'src/uuid/uuid.c' || echo '$(srcdir)/'`src/uuid/uuid.c src/urlconfig/libupnp_la-urlconfig.lo: src/urlconfig/urlconfig.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/urlconfig/libupnp_la-urlconfig.lo -MD -MP -MF src/urlconfig/$(DEPDIR)/libupnp_la-urlconfig.Tpo -c -o src/urlconfig/libupnp_la-urlconfig.lo `test -f 'src/urlconfig/urlconfig.c' || echo '$(srcdir)/'`src/urlconfig/urlconfig.c @am__fastdepCC_TRUE@ mv -f src/urlconfig/$(DEPDIR)/libupnp_la-urlconfig.Tpo src/urlconfig/$(DEPDIR)/libupnp_la-urlconfig.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/urlconfig/urlconfig.c' object='src/urlconfig/libupnp_la-urlconfig.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/urlconfig/libupnp_la-urlconfig.lo `test -f 'src/urlconfig/urlconfig.c' || echo '$(srcdir)/'`src/urlconfig/urlconfig.c src/libupnp_la-inet_pton.lo: src/inet_pton.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libupnp_la-inet_pton.lo -MD -MP -MF src/$(DEPDIR)/libupnp_la-inet_pton.Tpo -c -o src/libupnp_la-inet_pton.lo `test -f 'src/inet_pton.c' || echo '$(srcdir)/'`src/inet_pton.c @am__fastdepCC_TRUE@ mv -f src/$(DEPDIR)/libupnp_la-inet_pton.Tpo src/$(DEPDIR)/libupnp_la-inet_pton.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='src/inet_pton.c' object='src/libupnp_la-inet_pton.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libupnp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libupnp_la-inet_pton.lo `test -f 'src/inet_pton.c' || echo '$(srcdir)/'`src/inet_pton.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf src/.libs src/_libs -rm -rf src/api/.libs src/api/_libs -rm -rf src/gena/.libs src/gena/_libs -rm -rf src/genlib/client_table/.libs src/genlib/client_table/_libs -rm -rf src/genlib/miniserver/.libs src/genlib/miniserver/_libs -rm -rf src/genlib/net/.libs src/genlib/net/_libs -rm -rf src/genlib/net/http/.libs src/genlib/net/http/_libs -rm -rf src/genlib/net/uri/.libs src/genlib/net/uri/_libs -rm -rf src/genlib/service_table/.libs src/genlib/service_table/_libs -rm -rf src/genlib/util/.libs src/genlib/util/_libs -rm -rf src/soap/.libs src/soap/_libs -rm -rf src/ssdp/.libs src/ssdp/_libs -rm -rf src/urlconfig/.libs src/urlconfig/_libs -rm -rf src/uuid/.libs src/uuid/_libs install-nodist_upnpincludeHEADERS: $(nodist_upnpinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(upnpincludedir)" || $(MKDIR_P) "$(DESTDIR)$(upnpincludedir)" @list='$(nodist_upnpinclude_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(nodist_upnpincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(upnpincludedir)/$$f'"; \ $(nodist_upnpincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(upnpincludedir)/$$f"; \ done uninstall-nodist_upnpincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_upnpinclude_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(upnpincludedir)/$$f'"; \ rm -f "$(DESTDIR)$(upnpincludedir)/$$f"; \ done install-upnpincludeHEADERS: $(upnpinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(upnpincludedir)" || $(MKDIR_P) "$(DESTDIR)$(upnpincludedir)" @list='$(upnpinclude_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(upnpincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(upnpincludedir)/$$f'"; \ $(upnpincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(upnpincludedir)/$$f"; \ done uninstall-upnpincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(upnpinclude_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(upnpincludedir)/$$f'"; \ rm -f "$(DESTDIR)$(upnpincludedir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *$$ws$$tst$$ws*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(upnpincludedir)" "$(DESTDIR)$(upnpincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) -rm -f src/api/$(DEPDIR)/$(am__dirstamp) -rm -f src/api/$(am__dirstamp) -rm -f src/gena/$(DEPDIR)/$(am__dirstamp) -rm -f src/gena/$(am__dirstamp) -rm -f src/genlib/client_table/$(DEPDIR)/$(am__dirstamp) -rm -f src/genlib/client_table/$(am__dirstamp) -rm -f src/genlib/miniserver/$(DEPDIR)/$(am__dirstamp) -rm -f src/genlib/miniserver/$(am__dirstamp) -rm -f src/genlib/net/$(DEPDIR)/$(am__dirstamp) -rm -f src/genlib/net/$(am__dirstamp) -rm -f src/genlib/net/http/$(DEPDIR)/$(am__dirstamp) -rm -f src/genlib/net/http/$(am__dirstamp) -rm -f src/genlib/net/uri/$(DEPDIR)/$(am__dirstamp) -rm -f src/genlib/net/uri/$(am__dirstamp) -rm -f src/genlib/service_table/$(DEPDIR)/$(am__dirstamp) -rm -f src/genlib/service_table/$(am__dirstamp) -rm -f src/genlib/util/$(DEPDIR)/$(am__dirstamp) -rm -f src/genlib/util/$(am__dirstamp) -rm -f src/soap/$(DEPDIR)/$(am__dirstamp) -rm -f src/soap/$(am__dirstamp) -rm -f src/ssdp/$(DEPDIR)/$(am__dirstamp) -rm -f src/ssdp/$(am__dirstamp) -rm -f src/urlconfig/$(DEPDIR)/$(am__dirstamp) -rm -f src/urlconfig/$(am__dirstamp) -rm -f src/uuid/$(DEPDIR)/$(am__dirstamp) -rm -f src/uuid/$(am__dirstamp) -rm -f test/$(DEPDIR)/$(am__dirstamp) -rm -f test/$(am__dirstamp) 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-recursive clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-recursive -rm -rf src/$(DEPDIR) src/api/$(DEPDIR) src/gena/$(DEPDIR) src/genlib/client_table/$(DEPDIR) src/genlib/miniserver/$(DEPDIR) src/genlib/net/$(DEPDIR) src/genlib/net/http/$(DEPDIR) src/genlib/net/uri/$(DEPDIR) src/genlib/service_table/$(DEPDIR) src/genlib/util/$(DEPDIR) src/soap/$(DEPDIR) src/ssdp/$(DEPDIR) src/urlconfig/$(DEPDIR) src/uuid/$(DEPDIR) test/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-nodist_upnpincludeHEADERS \ install-upnpincludeHEADERS install-dvi: install-dvi-recursive install-exec-am: install-libLTLIBRARIES install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf src/$(DEPDIR) src/api/$(DEPDIR) src/gena/$(DEPDIR) src/genlib/client_table/$(DEPDIR) src/genlib/miniserver/$(DEPDIR) src/genlib/net/$(DEPDIR) src/genlib/net/http/$(DEPDIR) src/genlib/net/uri/$(DEPDIR) src/genlib/service_table/$(DEPDIR) src/genlib/util/$(DEPDIR) src/soap/$(DEPDIR) src/ssdp/$(DEPDIR) src/urlconfig/$(DEPDIR) src/uuid/$(DEPDIR) test/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES \ uninstall-nodist_upnpincludeHEADERS \ uninstall-upnpincludeHEADERS .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-libLTLIBRARIES install-man \ install-nodist_upnpincludeHEADERS install-pdf install-pdf-am \ install-ps install-ps-am install-strip \ install-upnpincludeHEADERS installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-libLTLIBRARIES uninstall-nodist_upnpincludeHEADERS \ uninstall-upnpincludeHEADERS # 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: libupnp-1.8.0~svn20100507/upnp/sample/0000777000175000017500000000000011373047473014216 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/web/0000777000175000017500000000000011373047473014773 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/web/tvpictureSCPD.xml0000644000175000017500000001307211021325542020115 00000000000000 1 0 SetColor Color Color in NewColor Color out IncreaseColor Color Color out DecreaseColor Color Color out SetTint Tint Tint in NewTint Tint out IncreaseTint Tint Tint out DecreaseTint Tint Tint out SetContrast Contrast Contrast in NewContrast Contrast out IncreaseContrast Contrast Contrast out DecreaseContrast Contrast Contrast out SetBrightness Brightness Brightness in NewBrightness Brightness out IncreaseBrightness Brightness Brightness out DecreaseBrightness Brightness Brightness out Color i4 1 10 1 5 Tint i4 1 10 1 5 Contrast i4 1 10 1 5 Brightness i4 1 10 1 5 libupnp-1.8.0~svn20100507/upnp/sample/web/tvdevicedesc.xml0000644000175000017500000000276611021325542020076 00000000000000 1 0 urn:schemas-upnp-org:device:tvdevice:1 UPnP Television Emulator TV Manufacturer Name http://www.manufacturer.com UPnP Television Device Emulator 1.0 TVEmulator 1.0 http://www.manufacturer.com/TVEmulator/ 123456789001 uuid:Upnp-TVEmulator-1_0-1234567890001 123456789 urn:schemas-upnp-org:service:tvcontrol:1 urn:upnp-org:serviceId:tvcontrol1 /upnp/control/tvcontrol1 /upnp/event/tvcontrol1 /tvcontrolSCPD.xml urn:schemas-upnp-org:service:tvpicture:1 urn:upnp-org:serviceId:tvpicture1 /upnp/control/tvpicture1 /upnp/event/tvpicture1 /tvpictureSCPD.xml /tvdevicepres.html libupnp-1.8.0~svn20100507/upnp/sample/web/tvdevicepres.html0000644000175000017500000002220411021325542020262 00000000000000 Presentation page for Controlling a UPnP Television

Device Name

TvDevice Control State Table

Variable Value Actions
Power

        
Channel

        
Volume

        









TvDevice Picture State Table

Variable Value Actions
Color

        
Tint

        
Contrast

        
Brightness

        

 

libupnp-1.8.0~svn20100507/upnp/sample/web/tvcontrolSCPD.xml0000644000175000017500000000717011021325542020124 00000000000000 1 0 PowerOn Power Power out PowerOff Power Power out SetChannel Channel Channel in NewChannel Channel out IncreaseChannel Channel Channel out DecreaseChannel Channel Channel out SetVolume Volume Volume in NewVolume Volume out IncreaseVolume Volume Volume out DecreaseVolume Volume Volume out Power Boolean 0 Channel i4 1 100 1 1 Volume i4 0 10 1 5 libupnp-1.8.0~svn20100507/upnp/sample/web/tvcombodesc.xml0000644000175000017500000000276611021325542017736 00000000000000 1 0 urn:schemas-upnp-org:device:tvdevice:1 UPnP Television Emulator TV Manufacturer Name http://www.manufacturer.com UPnP Television Device Emulator 1.0 TVEmulator 1.0 http://www.manufacturer.com/TVEmulator/ 123456789001 uuid:Upnp-TVEmulator-1_0-1234567890002 123456789 urn:schemas-upnp-org:service:tvcontrol:1 urn:upnp-org:serviceId:tvcontrol1 /upnp/control/tvcontrol1 /upnp/event/tvcontrol1 /tvcontrolSCPD.xml urn:schemas-upnp-org:service:tvpicture:1 urn:upnp-org:serviceId:tvpicture1 /upnp/control/tvpicture1 /upnp/event/tvpicture1 /tvpictureSCPD.xml /tvdevicepres.html libupnp-1.8.0~svn20100507/upnp/sample/common/0000777000175000017500000000000011373047473015506 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/common/sample_util.c0000644000175000017500000006071311360640052020077 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "sample_util.h" #include #include #include #if !UPNP_HAVE_TOOLS # error "Need upnptools.h to compile samples ; try ./configure --enable-tools" #endif int initialize = 1; /*! Function pointers to use for displaying formatted strings. * Set on Initialization of device. */ print_string gPrintFun = NULL; state_update gStateUpdateFun = NULL; /*! mutex to control displaying of events */ ithread_mutex_t display_mutex; /******************************************************************************* * SampleUtil_Initialize * * Description: * Initializes the sample util. Must be called before any sample util * functions. May be called multiple times. * But the initialization is done only once. * * Parameters: * print_function - print function to use in SampleUtil_Print * ******************************************************************************/ int SampleUtil_Initialize(print_string print_function) { if (initialize) { ithread_mutexattr_t attr; ithread_mutexattr_init(&attr); ithread_mutexattr_setkind_np(&attr, ITHREAD_MUTEX_RECURSIVE_NP); ithread_mutex_init(&display_mutex, &attr); ithread_mutexattr_destroy(&attr); /* To shut up valgrind mutex warning. */ ithread_mutex_lock(&display_mutex); gPrintFun = print_function; ithread_mutex_unlock(&display_mutex); initialize = 0; } else { SampleUtil_Print("***** SampleUtil_Initialize was called multiple times!\n"); abort(); } return UPNP_E_SUCCESS; } /******************************************************************************* * SampleUtil_RegisterUpdateFunction * * Description: * * Parameters: * ******************************************************************************/ int SampleUtil_RegisterUpdateFunction(state_update update_function) { /* Intialize only once. */ static int initialize = 1; if (initialize) { gStateUpdateFun = update_function; initialize = 0; } return UPNP_E_SUCCESS; } /******************************************************************************* * SampleUtil_Finish * * Description: * Releases Resources held by sample util. * * Parameters: * ******************************************************************************/ int SampleUtil_Finish() { ithread_mutex_destroy(&display_mutex); gPrintFun = NULL; initialize = 1; return UPNP_E_SUCCESS; } /******************************************************************************* * SampleUtil_GetElementValue * * Description: * Given a DOM node such as 11, this routine * extracts the value (e.g., 11) from the node and returns it as * a string. The string must be freed by the caller using * free. * * Parameters: * node -- The DOM node from which to extract the value * ******************************************************************************/ char *SampleUtil_GetElementValue(IN IXML_Element *element) { IXML_Node *child = ixmlNode_getFirstChild((IXML_Node *)element); char *temp = NULL; if (child != 0 && ixmlNode_getNodeType(child) == eTEXT_NODE) { temp = strdup(ixmlNode_getNodeValue(child)); } return temp; } /******************************************************************************* * SampleUtil_GetFirstServiceList * * Description: * Given a DOM node representing a UPnP Device Description Document, * this routine parses the document and finds the first service list * (i.e., the service list for the root device). The service list * is returned as a DOM node list. * * Parameters: * node -- The DOM node from which to extract the service list * ******************************************************************************/ IXML_NodeList *SampleUtil_GetFirstServiceList(IN IXML_Document *doc) { IXML_NodeList *ServiceList = NULL; IXML_NodeList *servlistnodelist = NULL; IXML_Node *servlistnode = NULL; servlistnodelist = ixmlDocument_getElementsByTagName( doc, "serviceList" ); if (servlistnodelist && ixmlNodeList_length(servlistnodelist)) { /* we only care about the first service list, from the root * device */ servlistnode = ixmlNodeList_item(servlistnodelist, 0); /* create as list of DOM nodes */ ServiceList = ixmlElement_getElementsByTagName( (IXML_Element *)servlistnode, "service"); } if (servlistnodelist) { ixmlNodeList_free(servlistnodelist); } return ServiceList; } /* * Obtain the service list * n == 0 the first * n == 1 the next in the device list, etc.. * */ IXML_NodeList *SampleUtil_GetNthServiceList(IN IXML_Document *doc , int n) { IXML_NodeList *ServiceList = NULL; IXML_NodeList *servlistnodelist = NULL; IXML_Node *servlistnode = NULL; /* * ixmlDocument_getElementsByTagName() * Returns a NodeList of all Elements that match the given * tag name in the order in which they were encountered in a preorder * traversal of the Document tree. * * return (NodeList*) A pointer to a NodeList containing the * matching items or NULL on an error. */ SampleUtil_Print("SampleUtil_GetNthServiceList called : n = %d\n", n); servlistnodelist = ixmlDocument_getElementsByTagName(doc, "serviceList"); if (servlistnodelist && ixmlNodeList_length(servlistnodelist) && n < ixmlNodeList_length(servlistnodelist)) { /* For the first service list (from the root device), * we pass 0 */ /*servlistnode = ixmlNodeList_item( servlistnodelist, 0 );*/ /* Retrieves a Node from a NodeList} specified by a * numerical index. * * return (Node*) A pointer to a Node or NULL if there was an * error. */ servlistnode = ixmlNodeList_item(servlistnodelist, n); assert(servlistnode != 0); /* create as list of DOM nodes */ ServiceList = ixmlElement_getElementsByTagName( (IXML_Element *)servlistnode, "service"); } if (servlistnodelist) { ixmlNodeList_free(servlistnodelist); } return ServiceList; } /******************************************************************************* * SampleUtil_GetFirstDocumentItem * * Description: * Given a document node, this routine searches for the first element * named by the input string item, and returns its value as a string. * String must be freed by caller using free. * Parameters: * doc -- The DOM document from which to extract the value * item -- The item to search for * ******************************************************************************/ char *SampleUtil_GetFirstDocumentItem( IN IXML_Document *doc, IN const char *item) { IXML_NodeList *nodeList = NULL; IXML_Node *textNode = NULL; IXML_Node *tmpNode = NULL; char *ret = NULL; nodeList = ixmlDocument_getElementsByTagName(doc, (char *)item); if (nodeList) { tmpNode = ixmlNodeList_item(nodeList, 0); if (tmpNode) { textNode = ixmlNode_getFirstChild(tmpNode); if (!textNode) { SampleUtil_Print("sample_util.c: (bug) " "ixmlNode_getFirstChild(tmpNode) " "returned NULL\n"); ret = strdup(""); goto epilogue; } if (!ixmlNode_getNodeValue(textNode)) { SampleUtil_Print("ixmlNode_getNodeValue " "returned NULL\n"); ret = strdup(""); goto epilogue; } else { ret = strdup(ixmlNode_getNodeValue(textNode)); } } else { SampleUtil_Print("ixmlNode_getFirstChild(tmpNode) " "returned NULL\n"); goto epilogue; } } else { SampleUtil_Print("Error finding %s in XML Node\n", item); goto epilogue; } epilogue: if (nodeList) { ixmlNodeList_free(nodeList); } return ret; } /******************************************************************************* * SampleUtil_GetFirstElementItem * * Description: * Given a DOM element, this routine searches for the first element * named by the input string item, and returns its value as a string. * The string must be freed using free. * Parameters: * node -- The DOM element from which to extract the value * item -- The item to search for * ******************************************************************************/ char *SampleUtil_GetFirstElementItem( IN IXML_Element *element, IN const char *item) { IXML_NodeList *nodeList = NULL; IXML_Node *textNode = NULL; IXML_Node *tmpNode = NULL; char *ret = NULL; nodeList = ixmlElement_getElementsByTagName(element, (char *)item); if (nodeList == NULL) { SampleUtil_Print( "Error finding %s in XML Node\n", item); return NULL; } tmpNode = ixmlNodeList_item(nodeList, 0); if (tmpNode) { SampleUtil_Print("Error finding %s value in XML Node\n", item); ixmlNodeList_free(nodeList); return NULL; } textNode = ixmlNode_getFirstChild(tmpNode); ret = strdup(ixmlNode_getNodeValue(textNode)); if (!ret) { SampleUtil_Print("Error allocating memory for %s in XML Node\n", item); ixmlNodeList_free(nodeList); return NULL; } ixmlNodeList_free(nodeList); return ret; } /******************************************************************************* * SampleUtil_PrintEventType * * Description: * Prints a callback event type as a string. * * Parameters: * S -- The callback event * ******************************************************************************/ void SampleUtil_PrintEventType(IN Upnp_EventType S) { switch (S) { /* Discovery */ case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: SampleUtil_Print("UPNP_DISCOVERY_ADVERTISEMENT_ALIVE\n"); break; case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: SampleUtil_Print("UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE\n"); break; case UPNP_DISCOVERY_SEARCH_RESULT: SampleUtil_Print( "UPNP_DISCOVERY_SEARCH_RESULT\n"); break; case UPNP_DISCOVERY_SEARCH_TIMEOUT: SampleUtil_Print( "UPNP_DISCOVERY_SEARCH_TIMEOUT\n"); break; /* SOAP */ case UPNP_CONTROL_ACTION_REQUEST: SampleUtil_Print("UPNP_CONTROL_ACTION_REQUEST\n"); break; case UPNP_CONTROL_ACTION_COMPLETE: SampleUtil_Print("UPNP_CONTROL_ACTION_COMPLETE\n"); break; case UPNP_CONTROL_GET_VAR_REQUEST: SampleUtil_Print("UPNP_CONTROL_GET_VAR_REQUEST\n"); break; case UPNP_CONTROL_GET_VAR_COMPLETE: SampleUtil_Print("UPNP_CONTROL_GET_VAR_COMPLETE\n"); break; /* GENA */ case UPNP_EVENT_SUBSCRIPTION_REQUEST: SampleUtil_Print("UPNP_EVENT_SUBSCRIPTION_REQUEST\n"); break; case UPNP_EVENT_RECEIVED: SampleUtil_Print("UPNP_EVENT_RECEIVED\n"); break; case UPNP_EVENT_RENEWAL_COMPLETE: SampleUtil_Print("UPNP_EVENT_RENEWAL_COMPLETE\n"); break; case UPNP_EVENT_SUBSCRIBE_COMPLETE: SampleUtil_Print("UPNP_EVENT_SUBSCRIBE_COMPLETE\n"); break; case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: SampleUtil_Print("UPNP_EVENT_UNSUBSCRIBE_COMPLETE\n"); break; case UPNP_EVENT_AUTORENEWAL_FAILED: SampleUtil_Print("UPNP_EVENT_AUTORENEWAL_FAILED\n"); break; case UPNP_EVENT_SUBSCRIPTION_EXPIRED: SampleUtil_Print("UPNP_EVENT_SUBSCRIPTION_EXPIRED\n"); break; } } /******************************************************************************* * SampleUtil_PrintEvent * * Description: * Prints callback event structure details. * * Parameters: * EventType -- The type of callback event * Event -- The callback event structure * ******************************************************************************/ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event) { ithread_mutex_lock(&display_mutex); SampleUtil_Print( "======================================================================\n" "----------------------------------------------------------------------\n"); SampleUtil_PrintEventType(EventType); switch (EventType) { /* SSDP */ case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: case UPNP_DISCOVERY_SEARCH_RESULT: { UpnpDiscovery *d_event = (UpnpDiscovery *)Event; SampleUtil_Print( "ErrCode = %d\n" "Expires = %d\n" "DeviceId = %s\n" "DeviceType = %s\n" "ServiceType = %s\n" "ServiceVer = %s\n" "Location = %s\n" "OS = %s\n" "Date = %s\n" "Ext = %s\n", UpnpDiscovery_get_ErrCode(d_event), UpnpDiscovery_get_Expires(d_event), UpnpString_get_String(UpnpDiscovery_get_DeviceID(d_event)), UpnpString_get_String(UpnpDiscovery_get_DeviceType(d_event)), UpnpString_get_String(UpnpDiscovery_get_ServiceType(d_event)), UpnpString_get_String(UpnpDiscovery_get_ServiceVer(d_event)), UpnpString_get_String(UpnpDiscovery_get_Location(d_event)), UpnpString_get_String(UpnpDiscovery_get_Os(d_event)), UpnpString_get_String(UpnpDiscovery_get_Date(d_event)), UpnpString_get_String(UpnpDiscovery_get_Ext(d_event))); break; } case UPNP_DISCOVERY_SEARCH_TIMEOUT: /* Nothing to print out here */ break; /* SOAP */ case UPNP_CONTROL_ACTION_REQUEST: { UpnpActionRequest *a_event = (UpnpActionRequest *)Event; IXML_Document *actionRequestDoc = NULL; IXML_Document *actionResultDoc = NULL; char *xmlbuff = NULL; SampleUtil_Print( "ErrCode = %d\n" "ErrStr = %s\n" "ActionName = %s\n" "UDN = %s\n" "ServiceID = %s\n", UpnpActionRequest_get_ErrCode(a_event), UpnpString_get_String(UpnpActionRequest_get_ErrStr(a_event)), UpnpString_get_String(UpnpActionRequest_get_ActionName(a_event)), UpnpString_get_String(UpnpActionRequest_get_DevUDN(a_event)), UpnpString_get_String(UpnpActionRequest_get_ServiceID(a_event))); actionRequestDoc = UpnpActionRequest_get_ActionRequest(a_event); if (actionRequestDoc) { xmlbuff = ixmlPrintNode((IXML_Node *)actionRequestDoc); if (xmlbuff) { SampleUtil_Print("ActRequest = %s\n", xmlbuff); ixmlFreeDOMString(xmlbuff); } xmlbuff = NULL; } else { SampleUtil_Print("ActRequest = (null)\n"); } actionResultDoc = UpnpActionRequest_get_ActionResult(a_event); if (actionResultDoc) { xmlbuff = ixmlPrintNode((IXML_Node *)actionResultDoc); if (xmlbuff) { SampleUtil_Print("ActResult = %s\n", xmlbuff); ixmlFreeDOMString(xmlbuff); } xmlbuff = NULL; } else { SampleUtil_Print("ActResult = (null)\n"); } break; } case UPNP_CONTROL_ACTION_COMPLETE: { UpnpActionComplete *a_event = (UpnpActionComplete *)Event; char *xmlbuff = NULL; int errCode = UpnpActionComplete_get_ErrCode(a_event); const char *ctrlURL = UpnpString_get_String( UpnpActionComplete_get_CtrlUrl(a_event)); IXML_Document *actionRequest = UpnpActionComplete_get_ActionRequest(a_event); IXML_Document *actionResult = UpnpActionComplete_get_ActionResult(a_event); SampleUtil_Print( "ErrCode = %d\n" "CtrlUrl = %s\n", errCode, ctrlURL); if (actionRequest) { xmlbuff = ixmlPrintNode((IXML_Node *)actionRequest); if (xmlbuff) { SampleUtil_Print("ActRequest = %s\n", xmlbuff); ixmlFreeDOMString(xmlbuff); } xmlbuff = NULL; } else { SampleUtil_Print("ActRequest = (null)\n"); } if (actionResult) { xmlbuff = ixmlPrintNode((IXML_Node *)actionResult); if (xmlbuff) { SampleUtil_Print("ActResult = %s\n", xmlbuff); ixmlFreeDOMString(xmlbuff); } xmlbuff = NULL; } else { SampleUtil_Print("ActResult = (null)\n"); } break; } case UPNP_CONTROL_GET_VAR_REQUEST: { UpnpStateVarRequest *sv_event = (UpnpStateVarRequest *)Event; SampleUtil_Print( "ErrCode = %d\n" "ErrStr = %s\n" "UDN = %s\n" "ServiceID = %s\n" "StateVarName= %s\n" "CurrentVal = %s\n", UpnpStateVarRequest_get_ErrCode(sv_event), UpnpString_get_String(UpnpStateVarRequest_get_ErrStr(sv_event)), UpnpString_get_String(UpnpStateVarRequest_get_DevUDN(sv_event)), UpnpString_get_String(UpnpStateVarRequest_get_ServiceID(sv_event)), UpnpString_get_String(UpnpStateVarRequest_get_StateVarName(sv_event)), UpnpStateVarRequest_get_CurrentVal(sv_event)); break; } case UPNP_CONTROL_GET_VAR_COMPLETE: { UpnpStateVarComplete *sv_event = (UpnpStateVarComplete *)Event; SampleUtil_Print( "ErrCode = %d\n" "CtrlUrl = %s\n" "StateVarName= %s\n" "CurrentVal = %s\n", UpnpStateVarComplete_get_ErrCode(sv_event), UpnpString_get_String(UpnpStateVarComplete_get_CtrlUrl(sv_event)), UpnpString_get_String(UpnpStateVarComplete_get_StateVarName(sv_event)), UpnpStateVarComplete_get_CurrentVal(sv_event)); break; } /* GENA */ case UPNP_EVENT_SUBSCRIPTION_REQUEST: { UpnpSubscriptionRequest *sr_event = (UpnpSubscriptionRequest *)Event; SampleUtil_Print( "ServiceID = %s\n" "UDN = %s\n" "SID = %s\n", UpnpString_get_String(UpnpSubscriptionRequest_get_ServiceId(sr_event)), UpnpString_get_String(UpnpSubscriptionRequest_get_UDN(sr_event)), UpnpString_get_String(UpnpSubscriptionRequest_get_SID(sr_event))); break; } case UPNP_EVENT_RECEIVED: { UpnpEvent *e_event = (UpnpEvent *)Event; char *xmlbuff = NULL; xmlbuff = ixmlPrintNode( (IXML_Node *)UpnpEvent_get_ChangedVariables(e_event)); SampleUtil_Print( "SID = %s\n" "EventKey = %d\n" "ChangedVars = %s\n", UpnpString_get_String(UpnpEvent_get_SID(e_event)), UpnpEvent_get_EventKey(e_event), xmlbuff); ixmlFreeDOMString(xmlbuff); break; } case UPNP_EVENT_RENEWAL_COMPLETE: { UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; SampleUtil_Print( "SID = %s\n" "ErrCode = %d\n" "TimeOut = %d\n", UpnpString_get_String(UpnpEventSubscribe_get_SID(es_event)), UpnpEventSubscribe_get_ErrCode(es_event), UpnpEventSubscribe_get_TimeOut(es_event)); break; } case UPNP_EVENT_SUBSCRIBE_COMPLETE: case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: { UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; SampleUtil_Print( "SID = %s\n" "ErrCode = %d\n" "PublisherURL= %s\n" "TimeOut = %d\n", UpnpString_get_String(UpnpEventSubscribe_get_SID(es_event)), UpnpEventSubscribe_get_ErrCode(es_event), UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), UpnpEventSubscribe_get_TimeOut(es_event)); break; } case UPNP_EVENT_AUTORENEWAL_FAILED: case UPNP_EVENT_SUBSCRIPTION_EXPIRED: { UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; SampleUtil_Print( "SID = %s\n" "ErrCode = %d\n" "PublisherURL= %s\n" "TimeOut = %d\n", UpnpString_get_String(UpnpEventSubscribe_get_SID(es_event)), UpnpEventSubscribe_get_ErrCode(es_event), UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), UpnpEventSubscribe_get_TimeOut(es_event)); break; } } SampleUtil_Print( "----------------------------------------------------------------------\n" "======================================================================\n" "\n\n\n"); ithread_mutex_unlock(&display_mutex); return 0; } /******************************************************************************* * SampleUtil_FindAndParseService * * Description: * This routine finds the first occurance of a service in a DOM representation * of a description document and parses it. * * Parameters: * DescDoc -- The DOM description document * location -- The location of the description document * serviceSearchType -- The type of service to search for * serviceId -- OUT -- The service ID * eventURL -- OUT -- The event URL for the service * controlURL -- OUT -- The control URL for the service * ******************************************************************************/ int SampleUtil_FindAndParseService( IN IXML_Document *DescDoc, IN const char *location, IN char *serviceType, OUT char **serviceId, OUT char **eventURL, OUT char **controlURL) { int i; int length; int found = 0; int ret; int sindex = 0; char *tempServiceType = NULL; char *baseURL = NULL; const char *base = NULL; char *relcontrolURL = NULL; char *releventURL = NULL; IXML_NodeList *serviceList = NULL; IXML_Element *service = NULL; baseURL = SampleUtil_GetFirstDocumentItem(DescDoc, "URLBase"); if (baseURL) { base = baseURL; } else { base = location; } /* Top level */ for (sindex = 0; (serviceList = SampleUtil_GetNthServiceList(DescDoc , sindex)) != NULL; sindex ++) { tempServiceType = NULL; relcontrolURL = NULL; releventURL = NULL; service = NULL; /* serviceList = SampleUtil_GetFirstServiceList( DescDoc ); */ length = ixmlNodeList_length(serviceList); for (i = 0; i < length; i++) { service = (IXML_Element *)ixmlNodeList_item(serviceList, i); tempServiceType = SampleUtil_GetFirstElementItem( (IXML_Element *)service, "serviceType"); if (strcmp(tempServiceType, serviceType) == 0) { SampleUtil_Print("Found service: %s\n", serviceType); *serviceId = SampleUtil_GetFirstElementItem(service, "serviceId"); SampleUtil_Print("serviceId: %s\n", *serviceId); relcontrolURL = SampleUtil_GetFirstElementItem(service, "controlURL"); releventURL = SampleUtil_GetFirstElementItem(service, "eventSubURL"); *controlURL = malloc(strlen(base) + strlen(relcontrolURL)+1); if (*controlURL) { ret = UpnpResolveURL(base, relcontrolURL, *controlURL); if (ret != UPNP_E_SUCCESS) { SampleUtil_Print("Error generating controlURL from %s + %s\n", base, relcontrolURL); } } *eventURL = malloc(strlen(base) + strlen(releventURL)+1); if (*eventURL) { ret = UpnpResolveURL(base, releventURL, *eventURL); if (ret != UPNP_E_SUCCESS) { SampleUtil_Print("Error generating eventURL from %s + %s\n", base, releventURL); } } free(relcontrolURL); free(releventURL); relcontrolURL = NULL; releventURL = NULL; found = 1; break; } free(tempServiceType); tempServiceType = NULL; } free(tempServiceType); tempServiceType = NULL; if (serviceList) { ixmlNodeList_free(serviceList); } serviceList = NULL; } free(baseURL); return found; } /******************************************************************************* * SampleUtil_Print * * Description: * Provides platform-specific print functionality. This function should be * called when you want to print content suitable for console output (i.e., * in a large text box or on a screen). If your device/operating system is * not supported here, you should add a port. * * Parameters: * Same as printf() * ******************************************************************************/ int SampleUtil_Print(char *fmt, ...) { #define MAX_BUF (8 * 1024) va_list ap; static char buf[MAX_BUF]; int rc; /* Protect both the display and the static buffer with the mutex */ ithread_mutex_lock(&display_mutex); va_start(ap, fmt); rc = vsnprintf(buf, MAX_BUF, fmt, ap); va_end(ap); if (gPrintFun) { gPrintFun(buf); } ithread_mutex_unlock(&display_mutex); return rc; } /******************************************************************************* * SampleUtil_StateUpdate * * Description: * * Parameters: * ******************************************************************************/ void SampleUtil_StateUpdate(const char *varName, const char *varValue, const char *UDN, eventType type) { /* TBD: Add mutex here? */ if (gStateUpdateFun) { gStateUpdateFun(varName, varValue, UDN, type); } } libupnp-1.8.0~svn20100507/upnp/sample/common/sample_util.h0000644000175000017500000002310011025042300020057 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef SAMPLE_UTIL_H #define SAMPLE_UTIL_H #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include "ithread.h" #include "ixml.h" /* for IXML_Document, IXML_Element */ #include "upnp.h" /* for Upnp_EventType */ #include "upnptools.h" #include #include /* mutex to control displaying of events */ extern ithread_mutex_t display_mutex; typedef enum { STATE_UPDATE = 0, DEVICE_ADDED = 1, DEVICE_REMOVED = 2, GET_VAR_COMPLETE = 3 } eventType; /******************************************************************************** * SampleUtil_GetElementValue * * Description: * Given a DOM node such as 11, this routine * extracts the value (e.g., 11) from the node and returns it as * a string. The string must be freed by the caller using * free. * * Parameters: * node -- The DOM node from which to extract the value * ********************************************************************************/ char *SampleUtil_GetElementValue(IN IXML_Element *element); /******************************************************************************** * SampleUtil_GetFirstServiceList * * Description: * Given a DOM node representing a UPnP Device Description Document, * this routine parses the document and finds the first service list * (i.e., the service list for the root device). The service list * is returned as a DOM node list. The NodeList must be freed using * NodeList_free. * * Parameters: * node -- The DOM node from which to extract the service list * ********************************************************************************/ IXML_NodeList *SampleUtil_GetFirstServiceList(IN IXML_Document *doc); /******************************************************************************** * SampleUtil_GetFirstDocumentItem * * Description: * Given a document node, this routine searches for the first element * named by the input string item, and returns its value as a string. * String must be freed by caller using free. * Parameters: * doc -- The DOM document from which to extract the value * item -- The item to search for * ********************************************************************************/ char *SampleUtil_GetFirstDocumentItem(IN IXML_Document *doc, IN const char *item); /******************************************************************************** * SampleUtil_GetFirstElementItem * * Description: * Given a DOM element, this routine searches for the first element * named by the input string item, and returns its value as a string. * The string must be freed using free. * Parameters: * node -- The DOM element from which to extract the value * item -- The item to search for * ********************************************************************************/ char *SampleUtil_GetFirstElementItem(IN IXML_Element *element, IN const char *item); /******************************************************************************** * SampleUtil_PrintEventType * * Description: * Prints a callback event type as a string. * * Parameters: * S -- The callback event * ********************************************************************************/ void SampleUtil_PrintEventType(IN Upnp_EventType S); /******************************************************************************** * SampleUtil_PrintEvent * * Description: * Prints callback event structure details. * * Parameters: * EventType -- The type of callback event * Event -- The callback event structure * ********************************************************************************/ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event); /******************************************************************************** * SampleUtil_FindAndParseService * * Description: * This routine finds the first occurance of a service in a DOM representation * of a description document and parses it. Note that this function currently * assumes that the eventURL and controlURL values in the service definitions * are full URLs. Relative URLs are not handled here. * * Parameters: * DescDoc -- The DOM description document * location -- The location of the description document * serviceSearchType -- The type of service to search for * serviceId -- OUT -- The service ID * eventURL -- OUT -- The event URL for the service * controlURL -- OUT -- The control URL for the service * ********************************************************************************/ int SampleUtil_FindAndParseService ( IN IXML_Document *DescDoc, IN const char* location, IN char *serviceType, OUT char **serviceId, OUT char **eventURL, OUT char **controlURL); /******************************************************************************** * print_string * * Description: * Prototype for displaying strings. All printing done by the device, * control point, and sample util, ultimately use this to display strings * to the user. * * Parameters: * const char * string. * ********************************************************************************/ typedef void (*print_string)(const char *string); //global print function used by sample util extern print_string gPrintFun; /******************************************************************************** * state_update * * Description: * Prototype for passing back state changes * * Parameters: * const char * varName * const char * varValue * const char * UDN * int newDevice ********************************************************************************/ typedef void (*state_update)( const char *varName, const char *varValue, const char *UDN, eventType type); //global state update function used by smaple util extern state_update gStateUpdateFun; /******************************************************************************** * SampleUtil_Initialize * * Description: * Initializes the sample util. Must be called before any sample util * functions. May be called multiple times. * * Parameters: * print_function - print function to use in SampleUtil_Print * ********************************************************************************/ int SampleUtil_Initialize(print_string print_function); /******************************************************************************** * SampleUtil_Finish * * Description: * Releases Resources held by sample util. * * Parameters: * ********************************************************************************/ int SampleUtil_Finish(); /******************************************************************************** * SampleUtil_Print * * Description: * Function emulating printf that ultimately calls the registered print * function with the formatted string. * * Parameters: * fmt - format (see printf) * . . . - variable number of args. (see printf) * ********************************************************************************/ int SampleUtil_Print(char *fmt, ...); /******************************************************************************** * SampleUtil_RegisterUpdateFunction * * Description: * * Parameters: * ********************************************************************************/ int SampleUtil_RegisterUpdateFunction(state_update update_function); /******************************************************************************** * SampleUtil_StateUpdate * * Description: * * Parameters: * ********************************************************************************/ void SampleUtil_StateUpdate( const char *varName, const char *varValue, const char *UDN, eventType type); #ifdef __cplusplus }; #endif /* __cplusplus */ #ifdef WIN32 #define snprintf _snprintf #define strcasecmp stricmp #endif #endif /* SAMPLE_UTIL_H */ libupnp-1.8.0~svn20100507/upnp/sample/Makefile.am0000644000175000017500000000325511360640052016157 00000000000000# # "Makefile.am" for "libupnp/upnp/sample" # # Copyright (C) 2007 Marcelo Roberto Jimenez # AM_CPPFLAGS = \ -I$(top_srcdir)/upnp/inc \ -I$(top_srcdir)/threadutil/inc \ -I$(top_srcdir)/ixml/inc LDADD = \ $(top_builddir)/upnp/libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la # samples noinst_PROGRAMS = if ENABLE_SAMPLES if ENABLE_CLIENT noinst_PROGRAMS += upnp_tv_ctrlpt upnp_tv_ctrlpt_CPPFLAGS = \ $(AM_CPPFLAGS) \ -I$(srcdir)/common/ \ -I$(srcdir)/tvctrlpt if ENABLE_DEVICE noinst_PROGRAMS += upnp_tv_combo upnp_tv_combo_CPPFLAGS = $(AM_CPPFLAGS) \ -I$(srcdir)/common/ \ -I$(srcdir)/tvcombo endif endif if ENABLE_DEVICE noinst_PROGRAMS += upnp_tv_device upnp_tv_device_CPPFLAGS = \ $(AM_CPPFLAGS) \ -I$(srcdir)/common/ \ -I$(srcdir)/tvdevice endif endif upnp_tv_device_SOURCES = \ common/sample_util.c \ common/sample_util.h \ tvdevice/upnp_tv_device.c \ tvdevice/upnp_tv_device.h \ tvdevice/linux/upnp_tv_device_main.c upnp_tv_ctrlpt_SOURCES = \ common/sample_util.c \ common/sample_util.h \ tvctrlpt/upnp_tv_ctrlpt.c \ tvctrlpt/upnp_tv_ctrlpt.h \ tvctrlpt/linux/upnp_tv_ctrlpt_main.c upnp_tv_combo_SOURCES = \ common/sample_util.c \ common/sample_util.h \ tvcombo/upnp_tv_ctrlpt.c \ tvcombo/upnp_tv_ctrlpt.h \ tvcombo/upnp_tv_device.c \ tvcombo/upnp_tv_device.h \ tvcombo/linux/upnp_tv_combo_main.c if WITH_DOCUMENTATION examplesdir = $(docdir)/examples examples_DATA = \ $(sort \ $(upnp_tv_ctrlpt_SOURCES) \ $(upnp_tv_device_SOURCES)) endif EXTRA_DIST = \ web/tvcombodesc.xml \ web/tvcontrolSCPD.xml \ web/tvdevicedesc.xml \ web/tvdevicepres.html \ web/tvpictureSCPD.xml libupnp-1.8.0~svn20100507/upnp/sample/Makefile.in0000644000175000017500000013422111360640114016165 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ # # "Makefile.am" for "libupnp/upnp/sample" # # Copyright (C) 2007 Marcelo Roberto Jimenez # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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@ noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) @ENABLE_CLIENT_TRUE@@ENABLE_SAMPLES_TRUE@am__append_1 = upnp_tv_ctrlpt @ENABLE_CLIENT_TRUE@@ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@am__append_2 = upnp_tv_combo @ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@am__append_3 = upnp_tv_device subdir = upnp/sample DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/autoconfig.h \ $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = @ENABLE_CLIENT_TRUE@@ENABLE_SAMPLES_TRUE@am__EXEEXT_1 = upnp_tv_ctrlpt$(EXEEXT) @ENABLE_CLIENT_TRUE@@ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@am__EXEEXT_2 = upnp_tv_combo$(EXEEXT) @ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@am__EXEEXT_3 = upnp_tv_device$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_upnp_tv_combo_OBJECTS = common/upnp_tv_combo-sample_util.$(OBJEXT) \ tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.$(OBJEXT) \ tvcombo/upnp_tv_combo-upnp_tv_device.$(OBJEXT) \ tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.$(OBJEXT) upnp_tv_combo_OBJECTS = $(am_upnp_tv_combo_OBJECTS) upnp_tv_combo_LDADD = $(LDADD) upnp_tv_combo_DEPENDENCIES = $(top_builddir)/upnp/libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la am_upnp_tv_ctrlpt_OBJECTS = \ common/upnp_tv_ctrlpt-sample_util.$(OBJEXT) \ tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.$(OBJEXT) \ tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.$(OBJEXT) upnp_tv_ctrlpt_OBJECTS = $(am_upnp_tv_ctrlpt_OBJECTS) upnp_tv_ctrlpt_LDADD = $(LDADD) upnp_tv_ctrlpt_DEPENDENCIES = $(top_builddir)/upnp/libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la am_upnp_tv_device_OBJECTS = \ common/upnp_tv_device-sample_util.$(OBJEXT) \ tvdevice/upnp_tv_device-upnp_tv_device.$(OBJEXT) \ tvdevice/linux/upnp_tv_device-upnp_tv_device_main.$(OBJEXT) upnp_tv_device_OBJECTS = $(am_upnp_tv_device_OBJECTS) upnp_tv_device_LDADD = $(LDADD) upnp_tv_device_DEPENDENCIES = $(top_builddir)/upnp/libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/upnp/inc depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(upnp_tv_combo_SOURCES) $(upnp_tv_ctrlpt_SOURCES) \ $(upnp_tv_device_SOURCES) DIST_SOURCES = $(upnp_tv_combo_SOURCES) $(upnp_tv_ctrlpt_SOURCES) \ $(upnp_tv_device_SOURCES) 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 = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(examplesdir)" examplesDATA_INSTALL = $(INSTALL_DATA) DATA = $(examples_DATA) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = \ -I$(top_srcdir)/upnp/inc \ -I$(top_srcdir)/threadutil/inc \ -I$(top_srcdir)/ixml/inc LDADD = \ $(top_builddir)/upnp/libupnp.la \ $(top_builddir)/threadutil/libthreadutil.la \ $(top_builddir)/ixml/libixml.la @ENABLE_CLIENT_TRUE@@ENABLE_SAMPLES_TRUE@upnp_tv_ctrlpt_CPPFLAGS = \ @ENABLE_CLIENT_TRUE@@ENABLE_SAMPLES_TRUE@ $(AM_CPPFLAGS) \ @ENABLE_CLIENT_TRUE@@ENABLE_SAMPLES_TRUE@ -I$(srcdir)/common/ \ @ENABLE_CLIENT_TRUE@@ENABLE_SAMPLES_TRUE@ -I$(srcdir)/tvctrlpt @ENABLE_CLIENT_TRUE@@ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@upnp_tv_combo_CPPFLAGS = $(AM_CPPFLAGS) \ @ENABLE_CLIENT_TRUE@@ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@ -I$(srcdir)/common/ \ @ENABLE_CLIENT_TRUE@@ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@ -I$(srcdir)/tvcombo @ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@upnp_tv_device_CPPFLAGS = \ @ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@ $(AM_CPPFLAGS) \ @ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@ -I$(srcdir)/common/ \ @ENABLE_DEVICE_TRUE@@ENABLE_SAMPLES_TRUE@ -I$(srcdir)/tvdevice upnp_tv_device_SOURCES = \ common/sample_util.c \ common/sample_util.h \ tvdevice/upnp_tv_device.c \ tvdevice/upnp_tv_device.h \ tvdevice/linux/upnp_tv_device_main.c upnp_tv_ctrlpt_SOURCES = \ common/sample_util.c \ common/sample_util.h \ tvctrlpt/upnp_tv_ctrlpt.c \ tvctrlpt/upnp_tv_ctrlpt.h \ tvctrlpt/linux/upnp_tv_ctrlpt_main.c upnp_tv_combo_SOURCES = \ common/sample_util.c \ common/sample_util.h \ tvcombo/upnp_tv_ctrlpt.c \ tvcombo/upnp_tv_ctrlpt.h \ tvcombo/upnp_tv_device.c \ tvcombo/upnp_tv_device.h \ tvcombo/linux/upnp_tv_combo_main.c @WITH_DOCUMENTATION_TRUE@examplesdir = $(docdir)/examples @WITH_DOCUMENTATION_TRUE@examples_DATA = \ @WITH_DOCUMENTATION_TRUE@ $(sort \ @WITH_DOCUMENTATION_TRUE@ $(upnp_tv_ctrlpt_SOURCES) \ @WITH_DOCUMENTATION_TRUE@ $(upnp_tv_device_SOURCES)) EXTRA_DIST = \ web/tvcombodesc.xml \ web/tvcontrolSCPD.xml \ web/tvdevicedesc.xml \ web/tvdevicepres.html \ web/tvpictureSCPD.xml all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign upnp/sample/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign upnp/sample/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 clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done common/$(am__dirstamp): @$(MKDIR_P) common @: > common/$(am__dirstamp) common/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) common/$(DEPDIR) @: > common/$(DEPDIR)/$(am__dirstamp) common/upnp_tv_combo-sample_util.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) tvcombo/$(am__dirstamp): @$(MKDIR_P) tvcombo @: > tvcombo/$(am__dirstamp) tvcombo/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tvcombo/$(DEPDIR) @: > tvcombo/$(DEPDIR)/$(am__dirstamp) tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.$(OBJEXT): \ tvcombo/$(am__dirstamp) tvcombo/$(DEPDIR)/$(am__dirstamp) tvcombo/upnp_tv_combo-upnp_tv_device.$(OBJEXT): \ tvcombo/$(am__dirstamp) tvcombo/$(DEPDIR)/$(am__dirstamp) tvcombo/linux/$(am__dirstamp): @$(MKDIR_P) tvcombo/linux @: > tvcombo/linux/$(am__dirstamp) tvcombo/linux/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tvcombo/linux/$(DEPDIR) @: > tvcombo/linux/$(DEPDIR)/$(am__dirstamp) tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.$(OBJEXT): \ tvcombo/linux/$(am__dirstamp) \ tvcombo/linux/$(DEPDIR)/$(am__dirstamp) upnp_tv_combo$(EXEEXT): $(upnp_tv_combo_OBJECTS) $(upnp_tv_combo_DEPENDENCIES) @rm -f upnp_tv_combo$(EXEEXT) $(LINK) $(upnp_tv_combo_OBJECTS) $(upnp_tv_combo_LDADD) $(LIBS) common/upnp_tv_ctrlpt-sample_util.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) tvctrlpt/$(am__dirstamp): @$(MKDIR_P) tvctrlpt @: > tvctrlpt/$(am__dirstamp) tvctrlpt/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tvctrlpt/$(DEPDIR) @: > tvctrlpt/$(DEPDIR)/$(am__dirstamp) tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.$(OBJEXT): \ tvctrlpt/$(am__dirstamp) tvctrlpt/$(DEPDIR)/$(am__dirstamp) tvctrlpt/linux/$(am__dirstamp): @$(MKDIR_P) tvctrlpt/linux @: > tvctrlpt/linux/$(am__dirstamp) tvctrlpt/linux/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tvctrlpt/linux/$(DEPDIR) @: > tvctrlpt/linux/$(DEPDIR)/$(am__dirstamp) tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.$(OBJEXT): \ tvctrlpt/linux/$(am__dirstamp) \ tvctrlpt/linux/$(DEPDIR)/$(am__dirstamp) upnp_tv_ctrlpt$(EXEEXT): $(upnp_tv_ctrlpt_OBJECTS) $(upnp_tv_ctrlpt_DEPENDENCIES) @rm -f upnp_tv_ctrlpt$(EXEEXT) $(LINK) $(upnp_tv_ctrlpt_OBJECTS) $(upnp_tv_ctrlpt_LDADD) $(LIBS) common/upnp_tv_device-sample_util.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) tvdevice/$(am__dirstamp): @$(MKDIR_P) tvdevice @: > tvdevice/$(am__dirstamp) tvdevice/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tvdevice/$(DEPDIR) @: > tvdevice/$(DEPDIR)/$(am__dirstamp) tvdevice/upnp_tv_device-upnp_tv_device.$(OBJEXT): \ tvdevice/$(am__dirstamp) tvdevice/$(DEPDIR)/$(am__dirstamp) tvdevice/linux/$(am__dirstamp): @$(MKDIR_P) tvdevice/linux @: > tvdevice/linux/$(am__dirstamp) tvdevice/linux/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) tvdevice/linux/$(DEPDIR) @: > tvdevice/linux/$(DEPDIR)/$(am__dirstamp) tvdevice/linux/upnp_tv_device-upnp_tv_device_main.$(OBJEXT): \ tvdevice/linux/$(am__dirstamp) \ tvdevice/linux/$(DEPDIR)/$(am__dirstamp) upnp_tv_device$(EXEEXT): $(upnp_tv_device_OBJECTS) $(upnp_tv_device_DEPENDENCIES) @rm -f upnp_tv_device$(EXEEXT) $(LINK) $(upnp_tv_device_OBJECTS) $(upnp_tv_device_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f common/upnp_tv_combo-sample_util.$(OBJEXT) -rm -f common/upnp_tv_ctrlpt-sample_util.$(OBJEXT) -rm -f common/upnp_tv_device-sample_util.$(OBJEXT) -rm -f tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.$(OBJEXT) -rm -f tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.$(OBJEXT) -rm -f tvcombo/upnp_tv_combo-upnp_tv_device.$(OBJEXT) -rm -f tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.$(OBJEXT) -rm -f tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.$(OBJEXT) -rm -f tvdevice/linux/upnp_tv_device-upnp_tv_device_main.$(OBJEXT) -rm -f tvdevice/upnp_tv_device-upnp_tv_device.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/upnp_tv_combo-sample_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/upnp_tv_ctrlpt-sample_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/upnp_tv_device-sample_util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_ctrlpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_device.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tvcombo/linux/$(DEPDIR)/upnp_tv_combo-upnp_tv_combo_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tvctrlpt/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tvctrlpt/linux/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tvdevice/$(DEPDIR)/upnp_tv_device-upnp_tv_device.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@tvdevice/linux/$(DEPDIR)/upnp_tv_device-upnp_tv_device_main.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< common/upnp_tv_combo-sample_util.o: common/sample_util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common/upnp_tv_combo-sample_util.o -MD -MP -MF common/$(DEPDIR)/upnp_tv_combo-sample_util.Tpo -c -o common/upnp_tv_combo-sample_util.o `test -f 'common/sample_util.c' || echo '$(srcdir)/'`common/sample_util.c @am__fastdepCC_TRUE@ mv -f common/$(DEPDIR)/upnp_tv_combo-sample_util.Tpo common/$(DEPDIR)/upnp_tv_combo-sample_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common/sample_util.c' object='common/upnp_tv_combo-sample_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common/upnp_tv_combo-sample_util.o `test -f 'common/sample_util.c' || echo '$(srcdir)/'`common/sample_util.c common/upnp_tv_combo-sample_util.obj: common/sample_util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common/upnp_tv_combo-sample_util.obj -MD -MP -MF common/$(DEPDIR)/upnp_tv_combo-sample_util.Tpo -c -o common/upnp_tv_combo-sample_util.obj `if test -f 'common/sample_util.c'; then $(CYGPATH_W) 'common/sample_util.c'; else $(CYGPATH_W) '$(srcdir)/common/sample_util.c'; fi` @am__fastdepCC_TRUE@ mv -f common/$(DEPDIR)/upnp_tv_combo-sample_util.Tpo common/$(DEPDIR)/upnp_tv_combo-sample_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common/sample_util.c' object='common/upnp_tv_combo-sample_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common/upnp_tv_combo-sample_util.obj `if test -f 'common/sample_util.c'; then $(CYGPATH_W) 'common/sample_util.c'; else $(CYGPATH_W) '$(srcdir)/common/sample_util.c'; fi` tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.o: tvcombo/upnp_tv_ctrlpt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.o -MD -MP -MF tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_ctrlpt.Tpo -c -o tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.o `test -f 'tvcombo/upnp_tv_ctrlpt.c' || echo '$(srcdir)/'`tvcombo/upnp_tv_ctrlpt.c @am__fastdepCC_TRUE@ mv -f tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_ctrlpt.Tpo tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_ctrlpt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvcombo/upnp_tv_ctrlpt.c' object='tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.o `test -f 'tvcombo/upnp_tv_ctrlpt.c' || echo '$(srcdir)/'`tvcombo/upnp_tv_ctrlpt.c tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.obj: tvcombo/upnp_tv_ctrlpt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.obj -MD -MP -MF tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_ctrlpt.Tpo -c -o tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.obj `if test -f 'tvcombo/upnp_tv_ctrlpt.c'; then $(CYGPATH_W) 'tvcombo/upnp_tv_ctrlpt.c'; else $(CYGPATH_W) '$(srcdir)/tvcombo/upnp_tv_ctrlpt.c'; fi` @am__fastdepCC_TRUE@ mv -f tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_ctrlpt.Tpo tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_ctrlpt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvcombo/upnp_tv_ctrlpt.c' object='tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvcombo/upnp_tv_combo-upnp_tv_ctrlpt.obj `if test -f 'tvcombo/upnp_tv_ctrlpt.c'; then $(CYGPATH_W) 'tvcombo/upnp_tv_ctrlpt.c'; else $(CYGPATH_W) '$(srcdir)/tvcombo/upnp_tv_ctrlpt.c'; fi` tvcombo/upnp_tv_combo-upnp_tv_device.o: tvcombo/upnp_tv_device.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvcombo/upnp_tv_combo-upnp_tv_device.o -MD -MP -MF tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_device.Tpo -c -o tvcombo/upnp_tv_combo-upnp_tv_device.o `test -f 'tvcombo/upnp_tv_device.c' || echo '$(srcdir)/'`tvcombo/upnp_tv_device.c @am__fastdepCC_TRUE@ mv -f tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_device.Tpo tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_device.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvcombo/upnp_tv_device.c' object='tvcombo/upnp_tv_combo-upnp_tv_device.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvcombo/upnp_tv_combo-upnp_tv_device.o `test -f 'tvcombo/upnp_tv_device.c' || echo '$(srcdir)/'`tvcombo/upnp_tv_device.c tvcombo/upnp_tv_combo-upnp_tv_device.obj: tvcombo/upnp_tv_device.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvcombo/upnp_tv_combo-upnp_tv_device.obj -MD -MP -MF tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_device.Tpo -c -o tvcombo/upnp_tv_combo-upnp_tv_device.obj `if test -f 'tvcombo/upnp_tv_device.c'; then $(CYGPATH_W) 'tvcombo/upnp_tv_device.c'; else $(CYGPATH_W) '$(srcdir)/tvcombo/upnp_tv_device.c'; fi` @am__fastdepCC_TRUE@ mv -f tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_device.Tpo tvcombo/$(DEPDIR)/upnp_tv_combo-upnp_tv_device.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvcombo/upnp_tv_device.c' object='tvcombo/upnp_tv_combo-upnp_tv_device.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvcombo/upnp_tv_combo-upnp_tv_device.obj `if test -f 'tvcombo/upnp_tv_device.c'; then $(CYGPATH_W) 'tvcombo/upnp_tv_device.c'; else $(CYGPATH_W) '$(srcdir)/tvcombo/upnp_tv_device.c'; fi` tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.o: tvcombo/linux/upnp_tv_combo_main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.o -MD -MP -MF tvcombo/linux/$(DEPDIR)/upnp_tv_combo-upnp_tv_combo_main.Tpo -c -o tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.o `test -f 'tvcombo/linux/upnp_tv_combo_main.c' || echo '$(srcdir)/'`tvcombo/linux/upnp_tv_combo_main.c @am__fastdepCC_TRUE@ mv -f tvcombo/linux/$(DEPDIR)/upnp_tv_combo-upnp_tv_combo_main.Tpo tvcombo/linux/$(DEPDIR)/upnp_tv_combo-upnp_tv_combo_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvcombo/linux/upnp_tv_combo_main.c' object='tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.o `test -f 'tvcombo/linux/upnp_tv_combo_main.c' || echo '$(srcdir)/'`tvcombo/linux/upnp_tv_combo_main.c tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.obj: tvcombo/linux/upnp_tv_combo_main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.obj -MD -MP -MF tvcombo/linux/$(DEPDIR)/upnp_tv_combo-upnp_tv_combo_main.Tpo -c -o tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.obj `if test -f 'tvcombo/linux/upnp_tv_combo_main.c'; then $(CYGPATH_W) 'tvcombo/linux/upnp_tv_combo_main.c'; else $(CYGPATH_W) '$(srcdir)/tvcombo/linux/upnp_tv_combo_main.c'; fi` @am__fastdepCC_TRUE@ mv -f tvcombo/linux/$(DEPDIR)/upnp_tv_combo-upnp_tv_combo_main.Tpo tvcombo/linux/$(DEPDIR)/upnp_tv_combo-upnp_tv_combo_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvcombo/linux/upnp_tv_combo_main.c' object='tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_combo_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvcombo/linux/upnp_tv_combo-upnp_tv_combo_main.obj `if test -f 'tvcombo/linux/upnp_tv_combo_main.c'; then $(CYGPATH_W) 'tvcombo/linux/upnp_tv_combo_main.c'; else $(CYGPATH_W) '$(srcdir)/tvcombo/linux/upnp_tv_combo_main.c'; fi` common/upnp_tv_ctrlpt-sample_util.o: common/sample_util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common/upnp_tv_ctrlpt-sample_util.o -MD -MP -MF common/$(DEPDIR)/upnp_tv_ctrlpt-sample_util.Tpo -c -o common/upnp_tv_ctrlpt-sample_util.o `test -f 'common/sample_util.c' || echo '$(srcdir)/'`common/sample_util.c @am__fastdepCC_TRUE@ mv -f common/$(DEPDIR)/upnp_tv_ctrlpt-sample_util.Tpo common/$(DEPDIR)/upnp_tv_ctrlpt-sample_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common/sample_util.c' object='common/upnp_tv_ctrlpt-sample_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common/upnp_tv_ctrlpt-sample_util.o `test -f 'common/sample_util.c' || echo '$(srcdir)/'`common/sample_util.c common/upnp_tv_ctrlpt-sample_util.obj: common/sample_util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common/upnp_tv_ctrlpt-sample_util.obj -MD -MP -MF common/$(DEPDIR)/upnp_tv_ctrlpt-sample_util.Tpo -c -o common/upnp_tv_ctrlpt-sample_util.obj `if test -f 'common/sample_util.c'; then $(CYGPATH_W) 'common/sample_util.c'; else $(CYGPATH_W) '$(srcdir)/common/sample_util.c'; fi` @am__fastdepCC_TRUE@ mv -f common/$(DEPDIR)/upnp_tv_ctrlpt-sample_util.Tpo common/$(DEPDIR)/upnp_tv_ctrlpt-sample_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common/sample_util.c' object='common/upnp_tv_ctrlpt-sample_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common/upnp_tv_ctrlpt-sample_util.obj `if test -f 'common/sample_util.c'; then $(CYGPATH_W) 'common/sample_util.c'; else $(CYGPATH_W) '$(srcdir)/common/sample_util.c'; fi` tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.o: tvctrlpt/upnp_tv_ctrlpt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.o -MD -MP -MF tvctrlpt/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt.Tpo -c -o tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.o `test -f 'tvctrlpt/upnp_tv_ctrlpt.c' || echo '$(srcdir)/'`tvctrlpt/upnp_tv_ctrlpt.c @am__fastdepCC_TRUE@ mv -f tvctrlpt/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt.Tpo tvctrlpt/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvctrlpt/upnp_tv_ctrlpt.c' object='tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.o `test -f 'tvctrlpt/upnp_tv_ctrlpt.c' || echo '$(srcdir)/'`tvctrlpt/upnp_tv_ctrlpt.c tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.obj: tvctrlpt/upnp_tv_ctrlpt.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.obj -MD -MP -MF tvctrlpt/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt.Tpo -c -o tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.obj `if test -f 'tvctrlpt/upnp_tv_ctrlpt.c'; then $(CYGPATH_W) 'tvctrlpt/upnp_tv_ctrlpt.c'; else $(CYGPATH_W) '$(srcdir)/tvctrlpt/upnp_tv_ctrlpt.c'; fi` @am__fastdepCC_TRUE@ mv -f tvctrlpt/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt.Tpo tvctrlpt/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvctrlpt/upnp_tv_ctrlpt.c' object='tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvctrlpt/upnp_tv_ctrlpt-upnp_tv_ctrlpt.obj `if test -f 'tvctrlpt/upnp_tv_ctrlpt.c'; then $(CYGPATH_W) 'tvctrlpt/upnp_tv_ctrlpt.c'; else $(CYGPATH_W) '$(srcdir)/tvctrlpt/upnp_tv_ctrlpt.c'; fi` tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.o: tvctrlpt/linux/upnp_tv_ctrlpt_main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.o -MD -MP -MF tvctrlpt/linux/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.Tpo -c -o tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.o `test -f 'tvctrlpt/linux/upnp_tv_ctrlpt_main.c' || echo '$(srcdir)/'`tvctrlpt/linux/upnp_tv_ctrlpt_main.c @am__fastdepCC_TRUE@ mv -f tvctrlpt/linux/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.Tpo tvctrlpt/linux/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvctrlpt/linux/upnp_tv_ctrlpt_main.c' object='tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.o `test -f 'tvctrlpt/linux/upnp_tv_ctrlpt_main.c' || echo '$(srcdir)/'`tvctrlpt/linux/upnp_tv_ctrlpt_main.c tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.obj: tvctrlpt/linux/upnp_tv_ctrlpt_main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.obj -MD -MP -MF tvctrlpt/linux/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.Tpo -c -o tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.obj `if test -f 'tvctrlpt/linux/upnp_tv_ctrlpt_main.c'; then $(CYGPATH_W) 'tvctrlpt/linux/upnp_tv_ctrlpt_main.c'; else $(CYGPATH_W) '$(srcdir)/tvctrlpt/linux/upnp_tv_ctrlpt_main.c'; fi` @am__fastdepCC_TRUE@ mv -f tvctrlpt/linux/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.Tpo tvctrlpt/linux/$(DEPDIR)/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvctrlpt/linux/upnp_tv_ctrlpt_main.c' object='tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_ctrlpt_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvctrlpt/linux/upnp_tv_ctrlpt-upnp_tv_ctrlpt_main.obj `if test -f 'tvctrlpt/linux/upnp_tv_ctrlpt_main.c'; then $(CYGPATH_W) 'tvctrlpt/linux/upnp_tv_ctrlpt_main.c'; else $(CYGPATH_W) '$(srcdir)/tvctrlpt/linux/upnp_tv_ctrlpt_main.c'; fi` common/upnp_tv_device-sample_util.o: common/sample_util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common/upnp_tv_device-sample_util.o -MD -MP -MF common/$(DEPDIR)/upnp_tv_device-sample_util.Tpo -c -o common/upnp_tv_device-sample_util.o `test -f 'common/sample_util.c' || echo '$(srcdir)/'`common/sample_util.c @am__fastdepCC_TRUE@ mv -f common/$(DEPDIR)/upnp_tv_device-sample_util.Tpo common/$(DEPDIR)/upnp_tv_device-sample_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common/sample_util.c' object='common/upnp_tv_device-sample_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common/upnp_tv_device-sample_util.o `test -f 'common/sample_util.c' || echo '$(srcdir)/'`common/sample_util.c common/upnp_tv_device-sample_util.obj: common/sample_util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT common/upnp_tv_device-sample_util.obj -MD -MP -MF common/$(DEPDIR)/upnp_tv_device-sample_util.Tpo -c -o common/upnp_tv_device-sample_util.obj `if test -f 'common/sample_util.c'; then $(CYGPATH_W) 'common/sample_util.c'; else $(CYGPATH_W) '$(srcdir)/common/sample_util.c'; fi` @am__fastdepCC_TRUE@ mv -f common/$(DEPDIR)/upnp_tv_device-sample_util.Tpo common/$(DEPDIR)/upnp_tv_device-sample_util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='common/sample_util.c' object='common/upnp_tv_device-sample_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o common/upnp_tv_device-sample_util.obj `if test -f 'common/sample_util.c'; then $(CYGPATH_W) 'common/sample_util.c'; else $(CYGPATH_W) '$(srcdir)/common/sample_util.c'; fi` tvdevice/upnp_tv_device-upnp_tv_device.o: tvdevice/upnp_tv_device.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvdevice/upnp_tv_device-upnp_tv_device.o -MD -MP -MF tvdevice/$(DEPDIR)/upnp_tv_device-upnp_tv_device.Tpo -c -o tvdevice/upnp_tv_device-upnp_tv_device.o `test -f 'tvdevice/upnp_tv_device.c' || echo '$(srcdir)/'`tvdevice/upnp_tv_device.c @am__fastdepCC_TRUE@ mv -f tvdevice/$(DEPDIR)/upnp_tv_device-upnp_tv_device.Tpo tvdevice/$(DEPDIR)/upnp_tv_device-upnp_tv_device.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvdevice/upnp_tv_device.c' object='tvdevice/upnp_tv_device-upnp_tv_device.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvdevice/upnp_tv_device-upnp_tv_device.o `test -f 'tvdevice/upnp_tv_device.c' || echo '$(srcdir)/'`tvdevice/upnp_tv_device.c tvdevice/upnp_tv_device-upnp_tv_device.obj: tvdevice/upnp_tv_device.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvdevice/upnp_tv_device-upnp_tv_device.obj -MD -MP -MF tvdevice/$(DEPDIR)/upnp_tv_device-upnp_tv_device.Tpo -c -o tvdevice/upnp_tv_device-upnp_tv_device.obj `if test -f 'tvdevice/upnp_tv_device.c'; then $(CYGPATH_W) 'tvdevice/upnp_tv_device.c'; else $(CYGPATH_W) '$(srcdir)/tvdevice/upnp_tv_device.c'; fi` @am__fastdepCC_TRUE@ mv -f tvdevice/$(DEPDIR)/upnp_tv_device-upnp_tv_device.Tpo tvdevice/$(DEPDIR)/upnp_tv_device-upnp_tv_device.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvdevice/upnp_tv_device.c' object='tvdevice/upnp_tv_device-upnp_tv_device.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvdevice/upnp_tv_device-upnp_tv_device.obj `if test -f 'tvdevice/upnp_tv_device.c'; then $(CYGPATH_W) 'tvdevice/upnp_tv_device.c'; else $(CYGPATH_W) '$(srcdir)/tvdevice/upnp_tv_device.c'; fi` tvdevice/linux/upnp_tv_device-upnp_tv_device_main.o: tvdevice/linux/upnp_tv_device_main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvdevice/linux/upnp_tv_device-upnp_tv_device_main.o -MD -MP -MF tvdevice/linux/$(DEPDIR)/upnp_tv_device-upnp_tv_device_main.Tpo -c -o tvdevice/linux/upnp_tv_device-upnp_tv_device_main.o `test -f 'tvdevice/linux/upnp_tv_device_main.c' || echo '$(srcdir)/'`tvdevice/linux/upnp_tv_device_main.c @am__fastdepCC_TRUE@ mv -f tvdevice/linux/$(DEPDIR)/upnp_tv_device-upnp_tv_device_main.Tpo tvdevice/linux/$(DEPDIR)/upnp_tv_device-upnp_tv_device_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvdevice/linux/upnp_tv_device_main.c' object='tvdevice/linux/upnp_tv_device-upnp_tv_device_main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvdevice/linux/upnp_tv_device-upnp_tv_device_main.o `test -f 'tvdevice/linux/upnp_tv_device_main.c' || echo '$(srcdir)/'`tvdevice/linux/upnp_tv_device_main.c tvdevice/linux/upnp_tv_device-upnp_tv_device_main.obj: tvdevice/linux/upnp_tv_device_main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tvdevice/linux/upnp_tv_device-upnp_tv_device_main.obj -MD -MP -MF tvdevice/linux/$(DEPDIR)/upnp_tv_device-upnp_tv_device_main.Tpo -c -o tvdevice/linux/upnp_tv_device-upnp_tv_device_main.obj `if test -f 'tvdevice/linux/upnp_tv_device_main.c'; then $(CYGPATH_W) 'tvdevice/linux/upnp_tv_device_main.c'; else $(CYGPATH_W) '$(srcdir)/tvdevice/linux/upnp_tv_device_main.c'; fi` @am__fastdepCC_TRUE@ mv -f tvdevice/linux/$(DEPDIR)/upnp_tv_device-upnp_tv_device_main.Tpo tvdevice/linux/$(DEPDIR)/upnp_tv_device-upnp_tv_device_main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tvdevice/linux/upnp_tv_device_main.c' object='tvdevice/linux/upnp_tv_device-upnp_tv_device_main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(upnp_tv_device_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tvdevice/linux/upnp_tv_device-upnp_tv_device_main.obj `if test -f 'tvdevice/linux/upnp_tv_device_main.c'; then $(CYGPATH_W) 'tvdevice/linux/upnp_tv_device_main.c'; else $(CYGPATH_W) '$(srcdir)/tvdevice/linux/upnp_tv_device_main.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-examplesDATA: $(examples_DATA) @$(NORMAL_INSTALL) test -z "$(examplesdir)" || $(MKDIR_P) "$(DESTDIR)$(examplesdir)" @list='$(examples_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(examplesDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(examplesdir)/$$f'"; \ $(examplesDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(examplesdir)/$$f"; \ done uninstall-examplesDATA: @$(NORMAL_UNINSTALL) @list='$(examples_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(examplesdir)/$$f'"; \ rm -f "$(DESTDIR)$(examplesdir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$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 $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(examplesdir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -rm -f common/$(DEPDIR)/$(am__dirstamp) -rm -f common/$(am__dirstamp) -rm -f tvcombo/$(DEPDIR)/$(am__dirstamp) -rm -f tvcombo/$(am__dirstamp) -rm -f tvcombo/linux/$(DEPDIR)/$(am__dirstamp) -rm -f tvcombo/linux/$(am__dirstamp) -rm -f tvctrlpt/$(DEPDIR)/$(am__dirstamp) -rm -f tvctrlpt/$(am__dirstamp) -rm -f tvctrlpt/linux/$(DEPDIR)/$(am__dirstamp) -rm -f tvctrlpt/linux/$(am__dirstamp) -rm -f tvdevice/$(DEPDIR)/$(am__dirstamp) -rm -f tvdevice/$(am__dirstamp) -rm -f tvdevice/linux/$(DEPDIR)/$(am__dirstamp) -rm -f tvdevice/linux/$(am__dirstamp) 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 clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf common/$(DEPDIR) tvcombo/$(DEPDIR) tvcombo/linux/$(DEPDIR) tvctrlpt/$(DEPDIR) tvctrlpt/linux/$(DEPDIR) tvdevice/$(DEPDIR) tvdevice/linux/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-examplesDATA install-dvi: install-dvi-am 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 installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf common/$(DEPDIR) tvcombo/$(DEPDIR) tvcombo/linux/$(DEPDIR) tvctrlpt/$(DEPDIR) tvctrlpt/linux/$(DEPDIR) tvdevice/$(DEPDIR) tvdevice/linux/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-examplesDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-examplesDATA 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-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-examplesDATA # 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: libupnp-1.8.0~svn20100507/upnp/sample/tvcombo/0000777000175000017500000000000011373047473015667 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/tvcombo/linux/0000777000175000017500000000000011373047473017026 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/tvcombo/linux/upnp_tv_combo_main.c0000644000175000017500000004362211360640052022757 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "sample_util.h" #include "upnp_tv_ctrlpt.h" #include "upnp_tv_device.h" #include #include /* Tags for valid commands issued at the command prompt */ enum cmdloop_tvcmds { PRTHELP = 0, PRTFULLHELP, POWON, POWOFF, SETCHAN, SETVOL, SETCOL, SETTINT, SETCONT, SETBRT, CTRLACTION, PICTACTION, CTRLGETVAR, PICTGETVAR, PRTDEV, LSTDEV, REFRESH, EXITCMD }; /* Data structure for parsing commands from the command line */ struct cmdloop_commands { char *str; // the string int cmdnum; // the command int numargs; // the number of arguments char *args; // the args } cmdloop_commands; /* Mappings between command text names, command tag, and required command arguments for command line commands */ static struct cmdloop_commands cmdloop_cmdlist[] = { {"Help", PRTHELP, 1, ""}, {"HelpFull", PRTFULLHELP, 1, ""}, {"ListDev", LSTDEV, 1, ""}, {"Refresh", REFRESH, 1, ""}, {"PrintDev", PRTDEV, 2, ""}, {"PowerOn", POWON, 2, ""}, {"PowerOff", POWOFF, 2, ""}, {"SetChannel", SETCHAN, 3, " "}, {"SetVolume", SETVOL, 3, " "}, {"SetColor", SETCOL, 3, " "}, {"SetTint", SETTINT, 3, " "}, {"SetContrast", SETCONT, 3, " "}, {"SetBrightness", SETBRT, 3, " "}, {"CtrlAction", CTRLACTION, 2, " "}, {"PictAction", PICTACTION, 2, " "}, {"CtrlGetVar", CTRLGETVAR, 2, " "}, {"PictGetVar", PICTGETVAR, 2, " "}, {"Exit", EXITCMD, 1, ""} }; void linux_print( const char *string ) { puts( string ); } /******************************************************************************** * TvCtrlPointPrintHelp * * Description: * Print help info for this application. ********************************************************************************/ void TvCtrlPointPrintShortHelp( void ) { SampleUtil_Print( "Commands:" ); SampleUtil_Print( " Help" ); SampleUtil_Print( " HelpFull" ); SampleUtil_Print( " ListDev" ); SampleUtil_Print( " Refresh" ); SampleUtil_Print( " PrintDev " ); SampleUtil_Print( " PowerOn " ); SampleUtil_Print( " PowerOff " ); SampleUtil_Print( " SetChannel " ); SampleUtil_Print( " SetVolume " ); SampleUtil_Print( " SetColor " ); SampleUtil_Print( " SetTint " ); SampleUtil_Print( " SetContrast " ); SampleUtil_Print( " SetBrightness " ); SampleUtil_Print( " CtrlAction " ); SampleUtil_Print( " PictAction " ); SampleUtil_Print( " CtrlGetVar " ); SampleUtil_Print( " PictGetVar " ); SampleUtil_Print( " Exit" ); } void TvCtrlPointPrintLongHelp( void ) { SampleUtil_Print( "" ); SampleUtil_Print( "******************************" ); SampleUtil_Print( "* TV Control Point Help Info *" ); SampleUtil_Print( "******************************" ); SampleUtil_Print( "" ); SampleUtil_Print( "This sample control point application automatically searches" ); SampleUtil_Print( "for and subscribes to the services of television device emulator" ); SampleUtil_Print( "devices, described in the tvdevicedesc.xml description document." ); SampleUtil_Print( "It also registers itself as a tv device." ); SampleUtil_Print( "" ); SampleUtil_Print( "Commands:" ); SampleUtil_Print( " Help" ); SampleUtil_Print( " Print this help info." ); SampleUtil_Print( " ListDev" ); SampleUtil_Print( " Print the current list of TV Device Emulators that this" ); SampleUtil_Print( " control point is aware of. Each device is preceded by a" ); SampleUtil_Print( " device number which corresponds to the devnum argument of" ); SampleUtil_Print( " commands listed below." ); SampleUtil_Print( " Refresh" ); SampleUtil_Print( " Delete all of the devices from the device list and issue new" ); SampleUtil_Print( " search request to rebuild the list from scratch." ); SampleUtil_Print( " PrintDev " ); SampleUtil_Print( " Print the state table for the device ." ); SampleUtil_Print( " e.g., 'PrintDev 1' prints the state table for the first" ); SampleUtil_Print( " device in the device list." ); SampleUtil_Print( " PowerOn " ); SampleUtil_Print( " Sends the PowerOn action to the Control Service of" ); SampleUtil_Print( " device ." ); SampleUtil_Print( " PowerOff " ); SampleUtil_Print( " Sends the PowerOff action to the Control Service of" ); SampleUtil_Print( " device ." ); SampleUtil_Print( " SetChannel " ); SampleUtil_Print( " Sends the SetChannel action to the Control Service of" ); SampleUtil_Print( " device , requesting the channel to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetVolume " ); SampleUtil_Print( " Sends the SetVolume action to the Control Service of" ); SampleUtil_Print( " device , requesting the volume to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetColor " ); SampleUtil_Print( " Sends the SetColor action to the Control Service of" ); SampleUtil_Print( " device , requesting the color to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetTint " ); SampleUtil_Print( " Sends the SetTint action to the Control Service of" ); SampleUtil_Print( " device , requesting the tint to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetContrast " ); SampleUtil_Print( " Sends the SetContrast action to the Control Service of" ); SampleUtil_Print( " device , requesting the contrast to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetBrightness " ); SampleUtil_Print( " Sends the SetBrightness action to the Control Service of" ); SampleUtil_Print( " device , requesting the brightness to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " CtrlAction " ); SampleUtil_Print( " Sends an action request specified by the string " ); SampleUtil_Print( " to the Control Service of device . This command" ); SampleUtil_Print( " only works for actions that have no arguments." ); SampleUtil_Print( " (e.g., \"CtrlAction 1 IncreaseChannel\")" ); SampleUtil_Print( " PictAction " ); SampleUtil_Print( " Sends an action request specified by the string " ); SampleUtil_Print( " to the Picture Service of device . This command" ); SampleUtil_Print( " only works for actions that have no arguments." ); SampleUtil_Print( " (e.g., \"PictAction 1 DecreaseContrast\")" ); SampleUtil_Print( " CtrlGetVar " ); SampleUtil_Print( " Requests the value of a variable specified by the string " ); SampleUtil_Print( " from the Control Service of device ." ); SampleUtil_Print( " (e.g., \"CtrlGetVar 1 Volume\")" ); SampleUtil_Print( " PictGetVar " ); SampleUtil_Print( " Requests the value of a variable specified by the string " ); SampleUtil_Print( " from the Picture Service of device ." ); SampleUtil_Print( " (e.g., \"PictGetVar 1 Tint\")" ); SampleUtil_Print( " Exit" ); SampleUtil_Print( " Exits the control point application." ); } /******************************************************************************** * TvCtrlPointPrintCommands * * Description: * Print the list of valid command line commands to the user * * Parameters: * None * ********************************************************************************/ void TvCtrlPointPrintCommands() { int i; int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands ); SampleUtil_Print( "Valid Commands:" ); for( i = 0; i < numofcmds; i++ ) { SampleUtil_Print( " %-14s %s", cmdloop_cmdlist[i].str, cmdloop_cmdlist[i].args ); } SampleUtil_Print( "" ); } /******************************************************************************** * TvCtrlPointCommandLoop * * Description: * Function that receives commands from the user at the command prompt * during the lifetime of the control point, and calls the appropriate * functions for those commands. * * Parameters: * None * ********************************************************************************/ void * TvCtrlPointCommandLoop( void *args ) { char cmdline[100]; while( 1 ) { SampleUtil_Print( "\n>> " ); fgets( cmdline, 100, stdin ); TvCtrlPointProcessCommand( cmdline ); } return NULL; } int TvCtrlPointProcessCommand( char *cmdline ) { char cmd[100]; char strarg[100]; int arg_val_err = -99999; int arg1 = arg_val_err; int arg2 = arg_val_err; int cmdnum = -1; int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands ); int cmdfound = 0; int i, rc; int invalidargs = 0; int validargs; validargs = sscanf( cmdline, "%s %d %d", cmd, &arg1, &arg2 ); for( i = 0; i < numofcmds; i++ ) { if( strcasecmp( cmd, cmdloop_cmdlist[i].str ) == 0 ) { cmdnum = cmdloop_cmdlist[i].cmdnum; cmdfound++; if( validargs != cmdloop_cmdlist[i].numargs ) invalidargs++; break; } } if( !cmdfound ) { SampleUtil_Print( "Command not found; try 'Help'" ); return TV_SUCCESS; } if( invalidargs ) { SampleUtil_Print( "Invalid arguments; try 'Help'" ); return TV_SUCCESS; } switch ( cmdnum ) { case PRTHELP: TvCtrlPointPrintShortHelp(); break; case PRTFULLHELP: TvCtrlPointPrintLongHelp(); break; case POWON: TvCtrlPointSendPowerOn( arg1 ); break; case POWOFF: TvCtrlPointSendPowerOff( arg1 ); break; case SETCHAN: TvCtrlPointSendSetChannel( arg1, arg2 ); break; case SETVOL: TvCtrlPointSendSetVolume( arg1, arg2 ); break; case SETCOL: TvCtrlPointSendSetColor( arg1, arg2 ); break; case SETTINT: TvCtrlPointSendSetTint( arg1, arg2 ); break; case SETCONT: TvCtrlPointSendSetContrast( arg1, arg2 ); break; case SETBRT: TvCtrlPointSendSetBrightness( arg1, arg2 ); break; case CTRLACTION: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointSendAction( TV_SERVICE_CONTROL, arg1, strarg, NULL, NULL, 0 ); else invalidargs++; break; case PICTACTION: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointSendAction( TV_SERVICE_PICTURE, arg1, strarg, NULL, NULL, 0 ); else invalidargs++; break; case CTRLGETVAR: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointGetVar( TV_SERVICE_CONTROL, arg1, strarg ); else invalidargs++; break; case PICTGETVAR: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointGetVar( TV_SERVICE_PICTURE, arg1, strarg ); else invalidargs++; break; case PRTDEV: TvCtrlPointPrintDevice( arg1 ); break; case LSTDEV: TvCtrlPointPrintList(); break; case REFRESH: TvCtrlPointRefresh(); break; case EXITCMD: rc = TvCtrlPointStop(); exit( rc ); break; default: SampleUtil_Print( "Command not implemented; see 'Help'" ); break; } if( invalidargs ) SampleUtil_Print( "Invalid args in command; see 'Help'" ); return TV_SUCCESS; } int device_main( int argc, char **argv ) { unsigned int portTemp = 0; char *ip_address = NULL, *desc_doc_name = NULL, *web_dir_path = NULL; unsigned int port = 0; int i = 0; SampleUtil_Initialize( linux_print ); // Parse options for( i = 1; i < argc; i++ ) { if( strcmp( argv[i], "-ip" ) == 0 ) { ip_address = argv[++i]; } else if( strcmp( argv[i], "-port" ) == 0 ) { sscanf( argv[++i], "%u", &portTemp ); } else if( strcmp( argv[i], "-desc" ) == 0 ) { desc_doc_name = argv[++i]; } else if( strcmp( argv[i], "-webdir" ) == 0 ) { web_dir_path = argv[++i]; } else if( strcmp( argv[i], "-help" ) == 0 ) { SampleUtil_Print( "Usage: %s -ip ipaddress -port port" " -desc desc_doc_name -webdir web_dir_path" " -help (this message)\n", argv[0] ); SampleUtil_Print( "\tipaddress: IP address of the device" " (must match desc. doc)\n" ); SampleUtil_Print( "\t\te.g.: 192.168.0.4\n" ); SampleUtil_Print( "\tport: Port number to use for " "receiving UPnP messages (must match desc. doc)\n" ); SampleUtil_Print( "\t\te.g.: 5431\n" ); SampleUtil_Print ( "\tdesc_doc_name: name of device description document\n" ); SampleUtil_Print( "\t\te.g.: tvcombodesc.xml\n" ); SampleUtil_Print ( "\tweb_dir_path: Filesystem path where web files " "related to the device are stored\n" ); SampleUtil_Print( "\t\te.g.: /upnp/sample/web\n" ); return 1; } } port = ( unsigned short )portTemp; return TvDeviceStart( ip_address, port, desc_doc_name, web_dir_path, linux_print ); } int main( int argc, char **argv ) { int rc; ithread_t cmdloop_thread; #ifdef WIN32 #else int sig; sigset_t sigs_to_catch; #endif int code; device_main(argc, argv); rc = TvCtrlPointStart( linux_print, NULL ); if( rc != TV_SUCCESS ) { SampleUtil_Print( "Error starting UPnP TV Control Point" ); return rc; } /* start a command loop thread */ code = ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop, NULL ); #ifdef WIN32 ithread_join(cmdloop_thread, NULL); #else /* Catch Ctrl-C and properly shutdown */ sigemptyset( &sigs_to_catch ); sigaddset( &sigs_to_catch, SIGINT ); sigwait( &sigs_to_catch, &sig ); SampleUtil_Print( "Shutting down on signal %d...\n", sig ); #endif TvDeviceStop(); rc = TvCtrlPointStop(); return rc; } libupnp-1.8.0~svn20100507/upnp/sample/tvcombo/upnp_tv_device.c0000644000175000017500000017317411025042301020751 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "upnp_tv_device.h" #include #define DEFAULT_WEB_DIR "./web" #define DESC_URL_SIZE 200 /* Device type for tv device */ extern char TvDeviceType[]; /* Service types for tv services */ extern char *TvServiceType[]; /* Global arrays for storing Tv Control Service variable names, values, and defaults */ char *tvc_varname[] = { "Power", "Channel", "Volume" }; char tvc_varval[TV_CONTROL_VARCOUNT][TV_MAX_VAL_LEN]; char *tvc_varval_def[] = { "1", "1", "5" }; /* Global arrays for storing Tv Picture Service variable names, values, and defaults */ char *tvp_varname[] = { "Color", "Tint", "Contrast", "Brightness" }; char tvp_varval[TV_PICTURE_VARCOUNT][TV_MAX_VAL_LEN]; char *tvp_varval_def[] = { "5", "5", "5", "5" }; /* The amount of time (in seconds) before advertisements will expire */ int default_advr_expire = 100; /* Global structure for storing the state table for this device */ struct TvService tv_service_table[2]; /* Device handle supplied by UPnP SDK */ UpnpDevice_Handle device_handle = -1; /* Mutex for protecting the global state table data in a multi-threaded, asynchronous environment. All functions should lock this mutex before reading or writing the state table data. */ ithread_mutex_t TVDevMutex; //Color constants #define MAX_COLOR 10 #define MIN_COLOR 1 //Brightness constants #define MAX_BRIGHTNESS 10 #define MIN_BRIGHTNESS 1 //Power constants #define POWER_ON 1 #define POWER_OFF 0 //Tint constants #define MAX_TINT 10 #define MIN_TINT 1 //Volume constants #define MAX_VOLUME 10 #define MIN_VOLUME 1 //Contrast constants #define MAX_CONTRAST 10 #define MIN_CONTRAST 1 //Channel constants #define MAX_CHANNEL 100 #define MIN_CHANNEL 1 /****************************************************************************** * SetServiceTable * * Description: * Initializes the service table for the specified service. * Note that * knowledge of the service description is * assumed. * Parameters: * int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE * const char * UDN - UDN of device containing service * const char * serviceId - serviceId of service * const char * serviceTypeS - service type (as specified in Description * Document) * struct TvService *out - service containing table to be set. * *****************************************************************************/ int SetServiceTable( IN int serviceType, IN const char *UDN, IN const char *serviceId, IN const char *serviceTypeS, INOUT struct TvService *out ) { unsigned int i = 0; strcpy( out->UDN, UDN ); strcpy( out->ServiceId, serviceId ); strcpy( out->ServiceType, serviceTypeS ); switch ( serviceType ) { case TV_SERVICE_CONTROL: out->VariableCount = TV_CONTROL_VARCOUNT; for( i = 0; i < tv_service_table[TV_SERVICE_CONTROL].VariableCount; i++ ) { tv_service_table[TV_SERVICE_CONTROL].VariableName[i] = tvc_varname[i]; tv_service_table[TV_SERVICE_CONTROL].VariableStrVal[i] = tvc_varval[i]; strcpy( tv_service_table[TV_SERVICE_CONTROL]. VariableStrVal[i], tvc_varval_def[i] ); } break; case TV_SERVICE_PICTURE: out->VariableCount = TV_PICTURE_VARCOUNT; for( i = 0; i < tv_service_table[TV_SERVICE_PICTURE].VariableCount; i++ ) { tv_service_table[TV_SERVICE_PICTURE].VariableName[i] = tvp_varname[i]; tv_service_table[TV_SERVICE_PICTURE].VariableStrVal[i] = tvp_varval[i]; strcpy( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[i], tvp_varval_def[i] ); } break; default: assert( 0 ); } return SetActionTable( serviceType, out ); } /****************************************************************************** * SetActionTable * * Description: * Initializes the action table for the specified service. * Note that * knowledge of the service description is * assumed. Action names are hardcoded. * Parameters: * int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE * struct TvService *out - service containing action table to set. * *****************************************************************************/ int SetActionTable( IN int serviceType, INOUT struct TvService *out ) { if( serviceType == TV_SERVICE_CONTROL ) { out->ActionNames[0] = "PowerOn"; out->actions[0] = TvDevicePowerOn; out->ActionNames[1] = "PowerOff"; out->actions[1] = TvDevicePowerOff; out->ActionNames[2] = "SetChannel"; out->actions[2] = TvDeviceSetChannel; out->ActionNames[3] = "IncreaseChannel"; out->actions[3] = TvDeviceIncreaseChannel; out->ActionNames[4] = "DecreaseChannel"; out->actions[4] = TvDeviceDecreaseChannel; out->ActionNames[5] = "SetVolume"; out->actions[5] = TvDeviceSetVolume; out->ActionNames[6] = "IncreaseVolume"; out->actions[6] = TvDeviceIncreaseVolume; out->ActionNames[7] = "DecreaseVolume"; out->actions[7] = TvDeviceDecreaseVolume; out->ActionNames[8] = NULL; return 1; } else if( serviceType == TV_SERVICE_PICTURE ) { out->ActionNames[0] = "SetColor"; out->ActionNames[1] = "IncreaseColor"; out->ActionNames[2] = "DecreaseColor"; out->actions[0] = TvDeviceSetColor; out->actions[1] = TvDeviceIncreaseColor; out->actions[2] = TvDeviceDecreaseColor; out->ActionNames[3] = "SetTint"; out->ActionNames[4] = "IncreaseTint"; out->ActionNames[5] = "DecreaseTint"; out->actions[3] = TvDeviceSetTint; out->actions[4] = TvDeviceIncreaseTint; out->actions[5] = TvDeviceDecreaseTint; out->ActionNames[6] = "SetBrightness"; out->ActionNames[7] = "IncreaseBrightness"; out->ActionNames[8] = "DecreaseBrightness"; out->actions[6] = TvDeviceSetBrightness; out->actions[7] = TvDeviceIncreaseBrightness; out->actions[8] = TvDeviceDecreaseBrightness; out->ActionNames[9] = "SetContrast"; out->ActionNames[10] = "IncreaseContrast"; out->ActionNames[11] = "DecreaseContrast"; out->actions[9] = TvDeviceSetContrast; out->actions[10] = TvDeviceIncreaseContrast; out->actions[11] = TvDeviceDecreaseContrast; return 1; } return 0; } /****************************************************************************** * TvDeviceStateTableInit * * Description: * Initialize the device state table for * this TvDevice, pulling identifier info * from the description Document. Note that * knowledge of the service description is * assumed. State table variables and default * values are currently hardcoded in this file * rather than being read from service description * documents. * * Parameters: * DescDocURL -- The description document URL * *****************************************************************************/ int TvDeviceStateTableInit( IN char *DescDocURL ) { IXML_Document *DescDoc = NULL; int ret = UPNP_E_SUCCESS; char *servid_ctrl = NULL, *evnturl_ctrl = NULL, *ctrlurl_ctrl = NULL; char *servid_pict = NULL, *evnturl_pict = NULL, *ctrlurl_pict = NULL; char *udn = NULL; //Download description document if( UpnpDownloadXmlDoc( DescDocURL, &DescDoc ) != UPNP_E_SUCCESS ) { SampleUtil_Print( "TvDeviceStateTableInit -- Error Parsing %s\n", DescDocURL ); ret = UPNP_E_INVALID_DESC; goto error_handler; } udn = SampleUtil_GetFirstDocumentItem( DescDoc, "UDN" ); /* Find the Tv Control Service identifiers */ if( !SampleUtil_FindAndParseService( DescDoc, DescDocURL, TvServiceType[TV_SERVICE_CONTROL], &servid_ctrl, &evnturl_ctrl, &ctrlurl_ctrl ) ) { SampleUtil_Print( "TvDeviceStateTableInit -- Error: Could not find" " Service: %s\n", TvServiceType[TV_SERVICE_CONTROL] ); ret = UPNP_E_INVALID_DESC; goto error_handler; } //set control service table SetServiceTable( TV_SERVICE_CONTROL, udn, servid_ctrl, TvServiceType[TV_SERVICE_CONTROL], &tv_service_table[TV_SERVICE_CONTROL] ); /* Find the Tv Picture Service identifiers */ if( !SampleUtil_FindAndParseService( DescDoc, DescDocURL, TvServiceType[TV_SERVICE_PICTURE], &servid_pict, &evnturl_pict, &ctrlurl_pict ) ) { SampleUtil_Print( "TvDeviceStateTableInit -- Error: Could not find" " Service: %s\n", TvServiceType[TV_SERVICE_PICTURE] ); ret = UPNP_E_INVALID_DESC; goto error_handler; } //set picture service table SetServiceTable( TV_SERVICE_PICTURE, udn, servid_pict, TvServiceType[TV_SERVICE_PICTURE], &tv_service_table[TV_SERVICE_PICTURE] ); error_handler: //clean up if( udn ) free( udn ); if( servid_ctrl ) free( servid_ctrl ); if( evnturl_ctrl ) free( evnturl_ctrl ); if( ctrlurl_ctrl ) free( ctrlurl_ctrl ); if( servid_pict ) free( servid_pict ); if( evnturl_pict ) free( evnturl_pict ); if( ctrlurl_pict ) free( ctrlurl_pict ); if( DescDoc ) ixmlDocument_free( DescDoc ); return ( ret ); } /****************************************************************************** * TvDeviceHandleSubscriptionRequest * * Description: * Called during a subscription request callback. If the * subscription request is for this device and either its * control service or picture service, then accept it. * * Parameters: * sr_event -- The subscription request event structure * *****************************************************************************/ int TvDeviceHandleSubscriptionRequest(IN const UpnpSubscriptionRequest *sr_event) { unsigned int i = 0; //unsigned int j = 0; int cmp1 = 0; int cmp2 = 0; const char *l_serviceId = NULL; const char *l_udn = NULL; const char *l_sid = NULL; // IXML_Document *PropSet = NULL; // lock state mutex ithread_mutex_lock( &TVDevMutex ); l_serviceId = UpnpString_get_String(UpnpSubscriptionRequest_get_ServiceId(sr_event)); l_udn = UpnpString_get_String(UpnpSubscriptionRequest_get_UDN(sr_event)); l_sid = UpnpString_get_String(UpnpSubscriptionRequest_get_SID(sr_event)); for (i = 0; i < TV_SERVICE_SERVCOUNT; ++i) { cmp1 = strcmp(l_udn, tv_service_table[i].UDN); cmp2 = strcmp(l_serviceId, tv_service_table[i].ServiceId); if (cmp1 == 0 && cmp2 == 0) { #if 0 PropSet = NULL; for (j = 0; j< tv_service_table[i].VariableCount; ++j) { // add each variable to the property set // for initial state dump UpnpAddToPropertySet( &PropSet, tv_service_table[i].VariableName[j], tv_service_table[i].VariableStrVal[j]); } // dump initial state UpnpAcceptSubscriptionExt( device_handle, l_udn, l_serviceId, PropSet, l_sid); // free document Document_free(PropSet); #endif UpnpAcceptSubscription( device_handle, l_udn, l_serviceId, (const char **)tv_service_table[i]. VariableName, (const char **)tv_service_table[i]. VariableStrVal, tv_service_table[i].VariableCount, l_sid); } } ithread_mutex_unlock( &TVDevMutex ); return 1; } /****************************************************************************** * TvDeviceHandleGetVarRequest * * Description: * Called during a get variable request callback. If the * request is for this device and either its control service * or picture service, then respond with the variable value. * * Parameters: * cgv_event -- The control get variable request event structure * *****************************************************************************/ int TvDeviceHandleGetVarRequest( INOUT UpnpStateVarRequest *cgv_event ) { unsigned int i = 0; unsigned int j = 0; int getvar_succeeded = 0; UpnpStateVarRequest_set_CurrentVal(cgv_event, NULL); ithread_mutex_lock( &TVDevMutex ); for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) { // check udn and service id const char *devUDN = UpnpString_get_String(UpnpStateVarRequest_get_DevUDN(cgv_event)); const char *serviceID = UpnpString_get_String(UpnpStateVarRequest_get_ServiceID(cgv_event)); if( ( strcmp( devUDN, tv_service_table[i].UDN ) == 0 ) && ( strcmp( serviceID, tv_service_table[i].ServiceId ) == 0 ) ) { // check variable name for( j = 0; j < tv_service_table[i].VariableCount; j++ ) { const char *stateVarName = UpnpString_get_String(UpnpStateVarRequest_get_StateVarName(cgv_event)); if( strcmp( stateVarName, tv_service_table[i].VariableName[j] ) == 0 ) { getvar_succeeded = 1; UpnpStateVarRequest_set_CurrentVal(cgv_event, tv_service_table[i].VariableStrVal[j] ); break; } } } } if( getvar_succeeded ) { UpnpStateVarRequest_set_ErrCode(cgv_event, UPNP_E_SUCCESS); } else { SampleUtil_Print( "Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" " Unknown variable name = %s\n", UpnpString_get_String(UpnpStateVarRequest_get_StateVarName(cgv_event)) ); UpnpStateVarRequest_set_ErrCode(cgv_event, 404); UpnpStateVarRequest_strcpy_ErrStr(cgv_event, "Invalid Variable" ); } ithread_mutex_unlock( &TVDevMutex ); return UpnpStateVarRequest_get_ErrCode(cgv_event) == UPNP_E_SUCCESS; } /****************************************************************************** * TvDeviceHandleActionRequest * * Description: * Called during an action request callback. If the * request is for this device and either its control service * or picture service, then perform the action and respond. * * Parameters: * ca_event -- The control action request event structure * *****************************************************************************/ int TvDeviceHandleActionRequest( INOUT UpnpActionRequest *ca_event ) { /* Defaults if action not found */ int action_found = 0; int i = 0; int service = -1; int retCode = 0; char *errorString = NULL; const char *devUDN = NULL; const char *serviceID = NULL; const char *actionName = NULL; IXML_Document *actionResult = NULL; UpnpActionRequest_set_ErrCode(ca_event, 0); UpnpActionRequest_set_ActionResult(ca_event, NULL); devUDN = UpnpString_get_String(UpnpActionRequest_get_DevUDN( ca_event)); serviceID = UpnpString_get_String(UpnpActionRequest_get_ServiceID( ca_event)); actionName = UpnpString_get_String(UpnpActionRequest_get_ActionName(ca_event)); if( ( strcmp( devUDN, tv_service_table[TV_SERVICE_CONTROL].UDN ) == 0 ) && ( strcmp( serviceID, tv_service_table[TV_SERVICE_CONTROL].ServiceId ) == 0 ) ) { /* Request for action in the TvDevice Control Service */ service = TV_SERVICE_CONTROL; } else if( ( strcmp( devUDN, tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 ) && ( strcmp( serviceID, tv_service_table[TV_SERVICE_PICTURE].ServiceId ) == 0 ) ) { /* Request for action in the TvDevice Picture Service */ service = TV_SERVICE_PICTURE; } /* Find and call appropriate procedure based on action name * Each action name has an associated procedure stored in the * service table. These are set at initialization. */ for( i = 0; i < TV_MAXACTIONS && tv_service_table[service].ActionNames[i] != NULL; i++ ) { if( !strcmp( actionName, tv_service_table[service].ActionNames[i] ) ) { if( ( !strcmp( tv_service_table[TV_SERVICE_CONTROL].VariableStrVal[TV_CONTROL_POWER], "1" ) ) || ( !strcmp( actionName, "PowerOn" ) ) ) { retCode = tv_service_table[service].actions[i]( UpnpActionRequest_get_ActionRequest(ca_event), &actionResult, &errorString ); UpnpActionRequest_set_ActionResult(ca_event, actionResult); } else { errorString = "Power is Off"; retCode = UPNP_E_INTERNAL_ERROR; } action_found = 1; break; } } if( !action_found ) { UpnpActionRequest_set_ActionResult(ca_event, NULL); UpnpActionRequest_strcpy_ErrStr(ca_event, "Invalid Action" ); UpnpActionRequest_set_ErrCode(ca_event, 401); } else { if( retCode == UPNP_E_SUCCESS ) { UpnpActionRequest_set_ErrCode(ca_event, UPNP_E_SUCCESS); } else { // copy the error string UpnpActionRequest_strcpy_ErrStr(ca_event, errorString ); switch ( retCode ) { case UPNP_E_INVALID_PARAM: { UpnpActionRequest_set_ErrCode(ca_event, 402); break; } case UPNP_E_INTERNAL_ERROR: default: { UpnpActionRequest_set_ErrCode(ca_event, 501); break; } } } } return UpnpActionRequest_get_ErrCode(ca_event); } /****************************************************************************** * TvDeviceSetServiceTableVar * * Description: * Update the TvDevice service state table, and notify all subscribed * control points of the updated state. Note that since this function * blocks on the mutex TVDevMutex, to avoid a hang this function should * not be called within any other function that currently has this mutex * locked. * * Parameters: * service -- The service number (TV_SERVICE_CONTROL or TV_SERVICE_PICTURE) * variable -- The variable number (TV_CONTROL_POWER, TV_CONTROL_CHANNEL, * TV_CONTROL_VOLUME, TV_PICTURE_COLOR, TV_PICTURE_TINT, * TV_PICTURE_CONTRAST, or TV_PICTURE_BRIGHTNESS) * value -- The string representation of the new value * *****************************************************************************/ int TvDeviceSetServiceTableVar( IN unsigned int service, IN unsigned int variable, IN char *value ) { //IXML_Document *PropSet= NULL; if( ( service >= TV_SERVICE_SERVCOUNT ) || ( variable >= tv_service_table[service].VariableCount ) || ( strlen( value ) >= TV_MAX_VAL_LEN ) ) { return ( 0 ); } ithread_mutex_lock( &TVDevMutex ); strcpy( tv_service_table[service].VariableStrVal[variable], value ); /* //Using utility api PropSet= UpnpCreatePropertySet(1,tv_service_table[service]. VariableName[variable], tv_service_table[service]. VariableStrVal[variable]); UpnpNotifyExt(device_handle, tv_service_table[service].UDN, tv_service_table[service].ServiceId,PropSet); //Free created property set Document_free(PropSet); */ UpnpNotify( device_handle, tv_service_table[service].UDN, tv_service_table[service].ServiceId, ( const char ** )&tv_service_table[service]. VariableName[variable], ( const char ** )&tv_service_table[service]. VariableStrVal[variable], 1 ); ithread_mutex_unlock( &TVDevMutex ); return ( 1 ); } /****************************************************************************** * TvDeviceSetPower * * Description: * Turn the power on/off, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * on -- If 1, turn power on. If 0, turn power off. * *****************************************************************************/ int TvDeviceSetPower( IN int on ) { char value[TV_MAX_VAL_LEN]; int ret = 0; if( on != POWER_ON && on != POWER_OFF ) { SampleUtil_Print( "error: can't set power to value %d\n", on ); return 0; } /* Vendor-specific code to turn the power on/off goes here */ sprintf( value, "%d", on ); ret = TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_POWER, value ); return ret; } /****************************************************************************** * TvDevicePowerOn * * Description: * Turn the power on. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { ( *out ) = NULL; ( *errorString ) = NULL; if( TvDeviceSetPower( POWER_ON ) ) { //create a response if( UpnpAddToActionResponse( out, "PowerOn", TvServiceType[TV_SERVICE_CONTROL], "Power", "1" ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDevicePowerOff * * Description: * Turn the power off. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOff( IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString ) { ( *out ) = NULL; ( *errorString ) = NULL; if( TvDeviceSetPower( POWER_OFF ) ) { //create a response if( UpnpAddToActionResponse( out, "PowerOff", TvServiceType[TV_SERVICE_CONTROL], "Power", "0" ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } /****************************************************************************** * TvDeviceSetChannel * * Description: * Change the channel, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int channel = 0; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Channel" ) ) ) { ( *errorString ) = "Invalid Channel"; return UPNP_E_INVALID_PARAM; } channel = atoi( value ); if( channel < MIN_CHANNEL || channel > MAX_CHANNEL ) { free( value ); SampleUtil_Print( "error: can't change to channel %d\n", channel ); ( *errorString ) = "Invalid Channel"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_CHANNEL, value ) ) { if( UpnpAddToActionResponse( out, "SetChannel", TvServiceType[TV_SERVICE_CONTROL], "NewChannel", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementChannel * * Description: * Increment the channel. Read the current channel from the state * table, add the increment, and then change the channel. * * Parameters: * incr -- The increment by which to change the channel. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementChannel( IN int incr, IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString ) { int curchannel; int newchannel; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseChannel"; } else { actionName = "DecreaseChannel"; } ithread_mutex_lock( &TVDevMutex ); curchannel = atoi( tv_service_table[TV_SERVICE_CONTROL]. VariableStrVal[TV_CONTROL_CHANNEL] ); ithread_mutex_unlock( &TVDevMutex ); newchannel = curchannel + incr; if( newchannel < MIN_CHANNEL || newchannel > MAX_CHANNEL ) { SampleUtil_Print( "error: can't change to channel %d\n", newchannel ); ( *errorString ) = "Invalid Channel"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newchannel ); if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_CHANNEL, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_CONTROL], "Channel", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceDecreaseChannel * * Description: * Decrease the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementChannel( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceIncreaseChannel * * Description: * Increase the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementChannel( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetVolume * * Description: * Change the volume, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int volume = 0; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Volume" ) ) ) { ( *errorString ) = "Invalid Volume"; return UPNP_E_INVALID_PARAM; } volume = atoi( value ); if( volume < MIN_VOLUME || volume > MAX_VOLUME ) { SampleUtil_Print( "error: can't change to volume %d\n", volume ); ( *errorString ) = "Invalid Volume"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_VOLUME, value ) ) { if( UpnpAddToActionResponse( out, "SetVolume", TvServiceType[TV_SERVICE_CONTROL], "NewVolume", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementVolume * * Description: * Increment the volume. Read the current volume from the state * table, add the increment, and then change the volume. * * Parameters: * incr -- The increment by which to change the volume. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT char **errorString ) { int curvolume, newvolume; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseVolume"; } else { actionName = "DecreaseVolume"; } ithread_mutex_lock( &TVDevMutex ); curvolume = atoi( tv_service_table[TV_SERVICE_CONTROL]. VariableStrVal[TV_CONTROL_VOLUME] ); ithread_mutex_unlock( &TVDevMutex ); newvolume = curvolume + incr; if( newvolume < MIN_VOLUME || newvolume > MAX_VOLUME ) { SampleUtil_Print( "error: can't change to volume %d\n", newvolume ); ( *errorString ) = "Invalid Volume"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newvolume ); if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_VOLUME, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_CONTROL], "Volume", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncrVolume * * Description: * Increase the volume. * * Parameters: * * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementVolume( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseVolume * * Description: * Decrease the volume. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementVolume( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetColor * * Description: * Change the color, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int color = 0; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Color" ) ) ) { ( *errorString ) = "Invalid Color"; return UPNP_E_INVALID_PARAM; } color = atoi( value ); if( color < MIN_COLOR || color > MAX_COLOR ) { SampleUtil_Print( "error: can't change to color %d\n", color ); ( *errorString ) = "Invalid Color"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_COLOR, value ) ) { if( UpnpAddToActionResponse( out, "SetColor", TvServiceType[TV_SERVICE_PICTURE], "NewColor", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementColor * * Description: * Increment the color. Read the current color from the state * table, add the increment, and then change the color. * * Parameters: * incr -- The increment by which to change the color. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementColor( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curcolor; int newcolor; char *actionName; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseColor"; } else { actionName = "DecreaseColor"; } ithread_mutex_lock( &TVDevMutex ); curcolor = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_COLOR] ); ithread_mutex_unlock( &TVDevMutex ); newcolor = curcolor + incr; if( newcolor < MIN_COLOR || newcolor > MAX_COLOR ) { SampleUtil_Print( "error: can't change to color %d\n", newcolor ); ( *errorString ) = "Invalid Color"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newcolor ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_COLOR, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Color", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceDecreaseColor * * Description: * Decrease the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceDecreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementColor( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceIncreaseColor * * Description: * Increase the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementColor( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetTint * * Description: * Change the tint, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int tint = -1; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Tint" ) ) ) { ( *errorString ) = "Invalid Tint"; return UPNP_E_INVALID_PARAM; } tint = atoi( value ); if( tint < MIN_TINT || tint > MAX_TINT ) { SampleUtil_Print( "error: can't change to tint %d\n", tint ); ( *errorString ) = "Invalid Tint"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_TINT, value ) ) { if( UpnpAddToActionResponse( out, "SetTint", TvServiceType[TV_SERVICE_PICTURE], "NewTint", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementTint * * Description: * Increment the tint. Read the current tint from the state * table, add the increment, and then change the tint. * * Parameters: * incr -- The increment by which to change the tint. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curtint; int newtint; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseTint"; } else { actionName = "DecreaseTint"; } ithread_mutex_lock( &TVDevMutex ); curtint = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_TINT] ); ithread_mutex_unlock( &TVDevMutex ); newtint = curtint + incr; if( newtint < MIN_TINT || newtint > MAX_TINT ) { SampleUtil_Print( "error: can't change to tint %d\n", newtint ); ( *errorString ) = "Invalid Tint"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newtint ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_TINT, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Tint", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncreaseTint * * Description: * Increase tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementTint( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseTint * * Description: * Decrease tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementTint( -1, in, out, errorString ); } /***************************************************************************** * TvDeviceSetContrast * * Description: * Change the contrast, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * ****************************************************************************/ int TvDeviceSetContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int contrast = -1; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Contrast" ) ) ) { ( *errorString ) = "Invalid Contrast"; return UPNP_E_INVALID_PARAM; } contrast = atoi( value ); if( contrast < MIN_CONTRAST || contrast > MAX_CONTRAST ) { SampleUtil_Print( "error: can't change to contrast %d\n", contrast ); ( *errorString ) = "Invalid Contrast"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_CONTRAST, value ) ) { if( UpnpAddToActionResponse( out, "SetContrast", TvServiceType[TV_SERVICE_PICTURE], "NewContrast", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementContrast * * Description: * Increment the contrast. Read the current contrast from the state * table, add the increment, and then change the contrast. * * Parameters: * incr -- The increment by which to change the contrast. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementContrast( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curcontrast; int newcontrast; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseContrast"; } else { actionName = "DecreaseContrast"; } ithread_mutex_lock( &TVDevMutex ); curcontrast = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_CONTRAST] ); ithread_mutex_unlock( &TVDevMutex ); newcontrast = curcontrast + incr; if( newcontrast < MIN_CONTRAST || newcontrast > MAX_CONTRAST ) { SampleUtil_Print( "error: can't change to contrast %d\n", newcontrast ); ( *errorString ) = "Invalid Contrast"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newcontrast ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_CONTRAST, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Contrast", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncreaseContrast * * Description: * * Increase the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementContrast( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseContrast * * Description: * Decrease the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementContrast( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetBrightness * * Description: * Change the brightness, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * brightness -- The brightness value to change to. * *****************************************************************************/ int TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int brightness = -1; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Brightness" ) ) ) { ( *errorString ) = "Invalid Brightness"; return UPNP_E_INVALID_PARAM; } brightness = atoi( value ); if( brightness < MIN_BRIGHTNESS || brightness > MAX_BRIGHTNESS ) { SampleUtil_Print( "error: can't change to brightness %d\n", brightness ); ( *errorString ) = "Invalid Brightness"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_BRIGHTNESS, value ) ) { if( UpnpAddToActionResponse( out, "SetBrightness", TvServiceType[TV_SERVICE_PICTURE], "NewBrightness", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementBrightness * * Description: * Increment the brightness. Read the current brightness from the state * table, add the increment, and then change the brightness. * * Parameters: * incr -- The increment by which to change the brightness. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementBrightness( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curbrightness; int newbrightness; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseBrightness"; } else { actionName = "DecreaseBrightness"; } ithread_mutex_lock( &TVDevMutex ); curbrightness = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_BRIGHTNESS] ); ithread_mutex_unlock( &TVDevMutex ); newbrightness = curbrightness + incr; if( newbrightness < MIN_BRIGHTNESS || newbrightness > MAX_BRIGHTNESS ) { SampleUtil_Print( "error: can't change to brightness %d\n", newbrightness ); ( *errorString ) = "Invalid Brightness"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newbrightness ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_BRIGHTNESS, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Brightness", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncreaseBrightness * * Description: * Increase brightness. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementBrightness( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseBrightness * * Description: * Decrease brightnesss. * * Parameters: * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementBrightness( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceCallbackEventHandler * * Description: * The callback handler registered with the SDK while registering * root device. Dispatches the request to the appropriate procedure * based on the value of EventType. The four requests handled by the * device are: * 1) Event Subscription requests. * 2) Get Variable requests. * 3) Action requests. * * Parameters: * * EventType -- The type of callback event * Event -- Data structure containing event data * Cookie -- Optional data specified during callback registration * *****************************************************************************/ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie) { switch ( EventType ) { case UPNP_EVENT_SUBSCRIPTION_REQUEST: TvDeviceHandleSubscriptionRequest((UpnpSubscriptionRequest *)Event); break; case UPNP_CONTROL_GET_VAR_REQUEST: TvDeviceHandleGetVarRequest( (UpnpStateVarRequest *)Event ); break; case UPNP_CONTROL_ACTION_REQUEST: TvDeviceHandleActionRequest( (UpnpActionRequest *)Event ); break; /* ignore these cases, since this is not a control point */ case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: case UPNP_DISCOVERY_SEARCH_RESULT: case UPNP_DISCOVERY_SEARCH_TIMEOUT: case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: case UPNP_CONTROL_ACTION_COMPLETE: case UPNP_CONTROL_GET_VAR_COMPLETE: case UPNP_EVENT_RECEIVED: case UPNP_EVENT_RENEWAL_COMPLETE: case UPNP_EVENT_SUBSCRIBE_COMPLETE: case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: break; default: SampleUtil_Print( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n", EventType ); } /* Print a summary of the event received */ SampleUtil_PrintEvent( EventType, Event ); return 0; } /****************************************************************************** * TvDeviceStop * * Description: * Stops the device. Uninitializes the sdk. * * Parameters: * *****************************************************************************/ int TvDeviceStop() { UpnpUnRegisterRootDevice( device_handle ); UpnpFinish(); SampleUtil_Finish(); ithread_mutex_destroy( &TVDevMutex ); return UPNP_E_SUCCESS; } /****************************************************************************** * TvDeviceStart * * Description: * Initializes the UPnP Sdk, registers the device, and sends out * advertisements. * * Parameters: * * ip_address - ip address to initialize the sdk (may be NULL) * if null, then the first non null loopback address is used. * port - port number to initialize the sdk (may be 0) * if zero, then a random number is used. * desc_doc_name - name of description document. * may be NULL. Default is tvcombodesc.xml * web_dir_path - path of web directory. * may be NULL. Default is ./web (for Linux) or ../tvdevice/web * for windows. * pfun - print function to use. * *****************************************************************************/ int TvDeviceStart( char *ip_address, unsigned short port, char *desc_doc_name, char *web_dir_path, print_string pfun ) { int ret = UPNP_E_SUCCESS; char desc_doc_url[DESC_URL_SIZE]; ithread_mutex_init( &TVDevMutex, NULL ); SampleUtil_Initialize( pfun ); SampleUtil_Print( "Initializing UPnP Sdk with\n" "\tipaddress = %s port = %u\n", ip_address, port ); ret = UpnpInit( ip_address, port ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error with UpnpInit -- %d\n", ret ); UpnpFinish(); return ret; } ip_address = UpnpGetServerIpAddress(); port = UpnpGetServerPort(); SampleUtil_Print( "UPnP Initialized\n" "\tipaddress= %s port = %u\n", ip_address, port ); if( desc_doc_name == NULL ) { desc_doc_name = "tvcombodesc.xml"; } if( web_dir_path == NULL ) { web_dir_path = DEFAULT_WEB_DIR; } snprintf( desc_doc_url, DESC_URL_SIZE, "http://%s:%d/%s", ip_address, port, desc_doc_name ); SampleUtil_Print( "Specifying the webserver root directory -- %s\n", web_dir_path ); ret = UpnpSetWebServerRootDir( web_dir_path ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error specifying webserver root directory -- %s: %d\n", web_dir_path, ret ); UpnpFinish(); return ret; } SampleUtil_Print( "Registering the RootDevice\n" "\t with desc_doc_url: %s\n", desc_doc_url ); ret = UpnpRegisterRootDevice( desc_doc_url, TvDeviceCallbackEventHandler, &device_handle, &device_handle ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error registering the rootdevice : %d\n", ret ); UpnpFinish(); return ret; } else { SampleUtil_Print( "RootDevice Registered\n" "Initializing State Table\n"); TvDeviceStateTableInit( desc_doc_url ); SampleUtil_Print("State Table Initialized\n"); ret = UpnpSendAdvertisement( device_handle, default_advr_expire ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error sending advertisements : %d\n", ret ); UpnpFinish(); return ret; } SampleUtil_Print("Advertisements Sent\n"); } return UPNP_E_SUCCESS; } libupnp-1.8.0~svn20100507/upnp/sample/tvcombo/upnp_tv_device.h0000644000175000017500000005204211021325542020753 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef UPNP_TV_DEVICE_H #define UPNP_TV_DEVICE_H #include #include #ifdef __cplusplus extern "C" { #endif #include "sample_util.h" #include "ithread.h" #include "upnp.h" #include #include #ifdef WIN32 /* Do not #include */ #else #include #endif //Color constants #define MAX_COLOR 10 #define MIN_COLOR 1 //Brightness constants #define MAX_BRIGHTNESS 10 #define MIN_BRIGHTNESS 1 //Power constants #define POWER_ON 1 #define POWER_OFF 0 //Tint constants #define MAX_TINT 10 #define MIN_TINT 1 //Volume constants #define MAX_VOLUME 10 #define MIN_VOLUME 1 //Contrast constants #define MAX_CONTRAST 10 #define MIN_CONTRAST 1 //Channel constants #define MAX_CHANNEL 100 #define MIN_CHANNEL 1 //Number of services. #define TV_SERVICE_SERVCOUNT 2 //Index of control service #define TV_SERVICE_CONTROL 0 //Index of picture service #define TV_SERVICE_PICTURE 1 //Number of control variables #define TV_CONTROL_VARCOUNT 3 //Index of power variable #define TV_CONTROL_POWER 0 //Index of channel variable #define TV_CONTROL_CHANNEL 1 //Index of volume variable #define TV_CONTROL_VOLUME 2 //Number of picture variables #define TV_PICTURE_VARCOUNT 4 //Index of color variable #define TV_PICTURE_COLOR 0 //Index of tint variable #define TV_PICTURE_TINT 1 //Index of contrast variable #define TV_PICTURE_CONTRAST 2 //Index of brightness variable #define TV_PICTURE_BRIGHTNESS 3 //Max value length #define TV_MAX_VAL_LEN 5 //Max actions #define TV_MAXACTIONS 12 /* This should be the maximum VARCOUNT from above */ #define TV_MAXVARS TV_PICTURE_VARCOUNT extern char TvDeviceType[]; extern char *TvServiceType[]; /****************************************************************************** * upnp_action * * Description: * Prototype for all actions. For each action that a service * implements, there is a corresponding function with this prototype. * Pointers to these functions, along with action names, are stored * in the service table. When an action request comes in the action * name is matched, and the appropriate function is called. * Each function returns UPNP_E_SUCCESS, on success, and a nonzero * error code on failure. * * Parameters: * * IXML_Document * request - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out, char **errorString); /* Structure for storing Tv Service identifiers and state table */ struct TvService { char UDN[NAME_SIZE]; /* Universally Unique Device Name */ char ServiceId[NAME_SIZE]; char ServiceType[NAME_SIZE]; char *VariableName[TV_MAXVARS]; char *VariableStrVal[TV_MAXVARS]; char *ActionNames[TV_MAXACTIONS]; upnp_action actions[TV_MAXACTIONS]; unsigned int VariableCount; }; //Array of service structures extern struct TvService tv_service_table[]; //Device handle returned from sdk extern UpnpDevice_Handle device_handle; /* Mutex for protecting the global state table data in a multi-threaded, asynchronous environment. All functions should lock this mutex before reading or writing the state table data. */ extern ithread_mutex_t TVDevMutex; /****************************************************************************** * SetActionTable * * Description: * Initializes the action table for the specified service. * Note that * knowledge of the service description is * assumed. Action names are hardcoded. * Parameters: * int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE * struct TvService *out - service containing action table to set. * *****************************************************************************/ int SetActionTable(int serviceType, struct TvService *out); /****************************************************************************** * TvDeviceStateTableInit * * Description: * Initialize the device state table for * this TvDevice, pulling identifier info * from the description Document. Note that * knowledge of the service description is * assumed. State table variables and default * values are currently hardcoded in this file * rather than being read from service description * documents. * * Parameters: * DescDocURL -- The description document URL * *****************************************************************************/ int TvDeviceStateTableInit(char*); /****************************************************************************** * TvDeviceHandleSubscriptionRequest * * Description: * Called during a subscription request callback. If the * subscription request is for this device and either its * control service or picture service, then accept it. * * Parameters: * sr_event -- The subscription request event structure * *****************************************************************************/ int TvDeviceHandleSubscriptionRequest(const UpnpSubscriptionRequest *); /****************************************************************************** * TvDeviceHandleGetVarRequest * * Description: * Called during a get variable request callback. If the * request is for this device and either its control service * or picture service, then respond with the variable value. * * Parameters: * cgv_event -- The control get variable request event structure * *****************************************************************************/ int TvDeviceHandleGetVarRequest(UpnpStateVarRequest *); /****************************************************************************** * TvDeviceHandleActionRequest * * Description: * Called during an action request callback. If the * request is for this device and either its control service * or picture service, then perform the action and respond. * * Parameters: * ca_event -- The control action request event structure * *****************************************************************************/ int TvDeviceHandleActionRequest(UpnpActionRequest *); /****************************************************************************** * TvDeviceCallbackEventHandler * * Description: * The callback handler registered with the SDK while registering * root device. Dispatches the request to the appropriate procedure * based on the value of EventType. The four requests handled by the * device are: * 1) Event Subscription requests. * 2) Get Variable requests. * 3) Action requests. * * Parameters: * * EventType -- The type of callback event * Event -- Data structure containing event data * Cookie -- Optional data specified during callback registration * *****************************************************************************/ int TvDeviceCallbackEventHandler(Upnp_EventType, void*, void*); /****************************************************************************** * TvDeviceSetServiceTableVar * * Description: * Update the TvDevice service state table, and notify all subscribed * control points of the updated state. Note that since this function * blocks on the mutex TVDevMutex, to avoid a hang this function should * not be called within any other function that currently has this mutex * locked. * * Parameters: * service -- The service number (TV_SERVICE_CONTROL or TV_SERVICE_PICTURE) * variable -- The variable number (TV_CONTROL_POWER, TV_CONTROL_CHANNEL, * TV_CONTROL_VOLUME, TV_PICTURE_COLOR, TV_PICTURE_TINT, * TV_PICTURE_CONTRAST, or TV_PICTURE_BRIGHTNESS) * value -- The string representation of the new value * *****************************************************************************/ int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*); //Control Service Actions /****************************************************************************** * TvDevicePowerOn * * Description: * Turn the power on. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDevicePowerOff * * Description: * Turn the power off. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetChannel * * Description: * Change the channel, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseChannel * * Description: * Increase the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseChannel * * Description: * Decrease the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetVolume * * Description: * Change the volume, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseVolume * * Description: * Increase the volume. * * Parameters: * * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseVolume * * Description: * Decrease the volume. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); //Picture Service Actions /****************************************************************************** * TvDeviceSetColor * * Description: * Change the color, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseColor * * Description: * Increase the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseColor * * Description: * Decrease the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetTint * * Description: * Change the tint, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseTint * * Description: * Increase tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseTint * * Description: * Decrease tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /***************************************************************************** * TvDeviceSetContrast * * Description: * Change the contrast, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * ****************************************************************************/ int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseContrast * * Description: * * Increase the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseContrast * * Description: * Decrease the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetBrightness * * Description: * Change the brightness, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * brightness -- The brightness value to change to. * *****************************************************************************/ int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseBrightness * * Description: * Increase brightness. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseBrightness * * Description: * Decrease brightnesss. * * Parameters: * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name, char *web_dir_path, print_string pfun); int TvDeviceStop(); #ifdef __cplusplus } #endif #endif libupnp-1.8.0~svn20100507/upnp/sample/tvcombo/upnp_tv_ctrlpt.c0000644000175000017500000012556211360640052021031 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "upnp_tv_ctrlpt.h" /* Mutex for protecting the global device list in a multi-threaded, asynchronous environment. All functions should lock this mutex before reading or writing the device list. */ ithread_mutex_t DeviceListMutex; UpnpClient_Handle ctrlpt_handle = -1; char TvDeviceType[] = "urn:schemas-upnp-org:device:tvdevice:1"; char *TvServiceType[] = { "urn:schemas-upnp-org:service:tvcontrol:1", "urn:schemas-upnp-org:service:tvpicture:1" }; char *TvServiceName[] = { "Control", "Picture" }; /* Global arrays for storing variable names and counts for TvControl and TvPicture services */ char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS] = { {"Power", "Channel", "Volume", ""}, {"Color", "Tint", "Contrast", "Brightness"} }; char TvVarCount[TV_SERVICE_SERVCOUNT] = { TV_CONTROL_VARCOUNT, TV_PICTURE_VARCOUNT }; /* Timeout to request during subscriptions */ int default_timeout = 1801; /* The first node in the global device list, or NULL if empty */ struct TvDeviceNode *GlobalDeviceList = NULL; /******************************************************************************** * TvCtrlPointDeleteNode * * Description: * Delete a device node from the global device list. Note that this * function is NOT thread safe, and should be called from another * function that has already locked the global device list. * * Parameters: * node -- The device node * ********************************************************************************/ int TvCtrlPointDeleteNode( struct TvDeviceNode *node ) { int rc, service, var; if( NULL == node ) { SampleUtil_Print( "ERROR: TvCtrlPointDeleteNode: Node is empty" ); return TV_ERROR; } for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { /* If we have a valid control SID, then unsubscribe */ if( strcmp( node->device.TvService[service].SID, "" ) != 0 ) { rc = UpnpUnSubscribe( ctrlpt_handle, node->device.TvService[service].SID ); if( UPNP_E_SUCCESS == rc ) { SampleUtil_Print ( "Unsubscribed from Tv %s EventURL with SID=%s", TvServiceName[service], node->device.TvService[service].SID ); } else { SampleUtil_Print ( "Error unsubscribing to Tv %s EventURL -- %d", TvServiceName[service], rc ); } } for( var = 0; var < TvVarCount[service]; var++ ) { if( node->device.TvService[service].VariableStrVal[var] ) { free( node->device.TvService[service]. VariableStrVal[var] ); } } } //Notify New Device Added SampleUtil_StateUpdate( NULL, NULL, node->device.UDN, DEVICE_REMOVED ); free( node ); node = NULL; return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointRemoveDevice * * Description: * Remove a device from the global device list. * * Parameters: * UDN -- The Unique Device Name for the device to remove * ********************************************************************************/ int TvCtrlPointRemoveDevice(const char *UDN) { struct TvDeviceNode *curdevnode; struct TvDeviceNode *prevdevnode; ithread_mutex_lock( &DeviceListMutex ); curdevnode = GlobalDeviceList; if( !curdevnode ) { SampleUtil_Print ( "WARNING: TvCtrlPointRemoveDevice: Device list empty" ); } else { if( 0 == strcmp( curdevnode->device.UDN, UDN ) ) { GlobalDeviceList = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); } else { prevdevnode = curdevnode; curdevnode = curdevnode->next; while( curdevnode ) { if( strcmp( curdevnode->device.UDN, UDN ) == 0 ) { prevdevnode->next = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); break; } prevdevnode = curdevnode; curdevnode = curdevnode->next; } } } ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointRemoveAll * * Description: * Remove all devices from the global device list. * * Parameters: * None * ********************************************************************************/ int TvCtrlPointRemoveAll( void ) { struct TvDeviceNode *curdevnode, *next; ithread_mutex_lock( &DeviceListMutex ); curdevnode = GlobalDeviceList; GlobalDeviceList = NULL; while( curdevnode ) { next = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); curdevnode = next; } ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointRefresh * * Description: * Clear the current global device list and issue new search * requests to build it up again from scratch. * * Parameters: * None * ********************************************************************************/ int TvCtrlPointRefresh( void ) { int rc; TvCtrlPointRemoveAll(); /* Search for all devices of type tvdevice version 1, waiting for up to 5 seconds for the response */ rc = UpnpSearchAsync( ctrlpt_handle, 5, TvDeviceType, NULL ); if( UPNP_E_SUCCESS != rc ) { SampleUtil_Print( "Error sending search request%d", rc ); return TV_ERROR; } return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointGetVar * * Description: * Send a GetVar request to the specified service of a device. * * Parameters: * service -- The service * devnum -- The number of the device (order in the list, * starting with 1) * varname -- The name of the variable to request. * ********************************************************************************/ int TvCtrlPointGetVar( int service, int devnum, char *varname ) { struct TvDeviceNode *devnode; int rc; ithread_mutex_lock( &DeviceListMutex ); rc = TvCtrlPointGetDevice( devnum, &devnode ); if( TV_SUCCESS == rc ) { rc = UpnpGetServiceVarStatusAsync( ctrlpt_handle, devnode->device. TvService[service].ControlURL, varname, TvCtrlPointCallbackEventHandler, NULL ); if( rc != UPNP_E_SUCCESS ) { SampleUtil_Print ( "Error in UpnpGetServiceVarStatusAsync -- %d", rc ); rc = TV_ERROR; } } ithread_mutex_unlock( &DeviceListMutex ); return rc; } int TvCtrlPointGetPower( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_CONTROL, devnum, "Power" ); } int TvCtrlPointGetChannel( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_CONTROL, devnum, "Channel" ); } int TvCtrlPointGetVolume( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_CONTROL, devnum, "Volume" ); } int TvCtrlPointGetColor( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Color" ); } int TvCtrlPointGetTint( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Tint" ); } int TvCtrlPointGetContrast( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Contrast" ); } int TvCtrlPointGetBrightness( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Brightness" ); } /******************************************************************************** * TvCtrlPointSendAction * * Description: * Send an Action request to the specified service of a device. * * Parameters: * service -- The service * devnum -- The number of the device (order in the list, * starting with 1) * actionname -- The name of the action. * param_name -- An array of parameter names * param_val -- The corresponding parameter values * param_count -- The number of parameters * ********************************************************************************/ int TvCtrlPointSendAction( int service, int devnum, char *actionname, char **param_name, char **param_val, int param_count ) { struct TvDeviceNode *devnode; IXML_Document *actionNode = NULL; int rc = TV_SUCCESS; int param; ithread_mutex_lock( &DeviceListMutex ); rc = TvCtrlPointGetDevice( devnum, &devnode ); if( TV_SUCCESS == rc ) { if( 0 == param_count ) { actionNode = UpnpMakeAction( actionname, TvServiceType[service], 0, NULL ); } else { for( param = 0; param < param_count; param++ ) { if( UpnpAddToAction ( &actionNode, actionname, TvServiceType[service], param_name[param], param_val[param] ) != UPNP_E_SUCCESS ) { SampleUtil_Print ( "ERROR: TvCtrlPointSendAction: Trying to add action param" ); //return -1; // TBD - BAD! leaves mutex locked } } } rc = UpnpSendActionAsync( ctrlpt_handle, devnode->device.TvService[service]. ControlURL, TvServiceType[service], NULL, actionNode, TvCtrlPointCallbackEventHandler, NULL ); if( rc != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error in UpnpSendActionAsync -- %d", rc ); rc = TV_ERROR; } } ithread_mutex_unlock( &DeviceListMutex ); if( actionNode ) ixmlDocument_free( actionNode ); return rc; } /******************************************************************************** * TvCtrlPointSendActionNumericArg * * Description:Send an action with one argument to a device in the global device list. * * Parameters: * devnum -- The number of the device (order in the list, starting with 1) * service -- TV_SERVICE_CONTROL or TV_SERVICE_PICTURE * actionName -- The device action, i.e., "SetChannel" * paramName -- The name of the parameter that is being passed * paramValue -- Actual value of the parameter being passed * ********************************************************************************/ int TvCtrlPointSendActionNumericArg( int devnum, int service, char *actionName, char *paramName, int paramValue ) { char param_val_a[50]; char *param_val = param_val_a; sprintf( param_val_a, "%d", paramValue ); return TvCtrlPointSendAction( service, devnum, actionName, ¶mName, ¶m_val, 1 ); } int TvCtrlPointSendPowerOn( int devnum ) { return TvCtrlPointSendAction( TV_SERVICE_CONTROL, devnum, "PowerOn", NULL, NULL, 0 ); } int TvCtrlPointSendPowerOff( int devnum ) { return TvCtrlPointSendAction( TV_SERVICE_CONTROL, devnum, "PowerOff", NULL, NULL, 0 ); } int TvCtrlPointSendSetChannel( int devnum, int channel ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_CONTROL, "SetChannel", "Channel", channel ); } int TvCtrlPointSendSetVolume( int devnum, int volume ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_CONTROL, "SetVolume", "Volume", volume ); } int TvCtrlPointSendSetColor( int devnum, int color ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetColor", "Color", color ); } int TvCtrlPointSendSetTint( int devnum, int tint ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetTint", "Tint", tint ); } int TvCtrlPointSendSetContrast( int devnum, int contrast ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetContrast", "Contrast", contrast ); } int TvCtrlPointSendSetBrightness( int devnum, int brightness ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetBrightness", "Brightness", brightness ); } /******************************************************************************** * TvCtrlPointGetDevice * * Description: * Given a list number, returns the pointer to the device * node at that position in the global device list. Note * that this function is not thread safe. It must be called * from a function that has locked the global device list. * * Parameters: * devnum -- The number of the device (order in the list, * starting with 1) * devnode -- The output device node pointer * ********************************************************************************/ int TvCtrlPointGetDevice( int devnum, struct TvDeviceNode **devnode ) { int count = devnum; struct TvDeviceNode *tmpdevnode = NULL; if( count ) tmpdevnode = GlobalDeviceList; while( --count && tmpdevnode ) { tmpdevnode = tmpdevnode->next; } if( !tmpdevnode ) { SampleUtil_Print( "Error finding TvDevice number -- %d", devnum ); return TV_ERROR; } *devnode = tmpdevnode; return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointPrintList * * Description: * Print the universal device names for each device in the global device list * * Parameters: * None * ********************************************************************************/ int TvCtrlPointPrintList() { struct TvDeviceNode *tmpdevnode; int i = 0; ithread_mutex_lock( &DeviceListMutex ); SampleUtil_Print( "TvCtrlPointPrintList:" ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { SampleUtil_Print( " %3d -- %s", ++i, tmpdevnode->device.UDN ); tmpdevnode = tmpdevnode->next; } SampleUtil_Print( "" ); ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointPrintDevice * * Description: * Print the identifiers and state table for a device from * the global device list. * * Parameters: * devnum -- The number of the device (order in the list, * starting with 1) * ********************************************************************************/ int TvCtrlPointPrintDevice( int devnum ) { struct TvDeviceNode *tmpdevnode; int i = 0, service, var; char spacer[15]; if( devnum <= 0 ) { SampleUtil_Print ( "Error in TvCtrlPointPrintDevice: invalid devnum = %d", devnum ); return TV_ERROR; } ithread_mutex_lock( &DeviceListMutex ); SampleUtil_Print( "TvCtrlPointPrintDevice:" ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { i++; if( i == devnum ) break; tmpdevnode = tmpdevnode->next; } if( !tmpdevnode ) { SampleUtil_Print ( "Error in TvCtrlPointPrintDevice: invalid devnum = %d -- actual device count = %d", devnum, i ); } else { SampleUtil_Print( " TvDevice -- %d", devnum ); SampleUtil_Print( " | " ); SampleUtil_Print( " +- UDN = %s", tmpdevnode->device.UDN ); SampleUtil_Print( " +- DescDocURL = %s", tmpdevnode->device.DescDocURL ); SampleUtil_Print( " +- FriendlyName = %s", tmpdevnode->device.FriendlyName ); SampleUtil_Print( " +- PresURL = %s", tmpdevnode->device.PresURL ); SampleUtil_Print( " +- Adver. TimeOut = %d", tmpdevnode->device.AdvrTimeOut ); for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( service < TV_SERVICE_SERVCOUNT - 1 ) sprintf( spacer, " | " ); else sprintf( spacer, " " ); SampleUtil_Print( " | " ); SampleUtil_Print( " +- Tv %s Service", TvServiceName[service] ); SampleUtil_Print( "%s+- ServiceId = %s", spacer, tmpdevnode->device.TvService[service]. ServiceId ); SampleUtil_Print( "%s+- ServiceType = %s", spacer, tmpdevnode->device.TvService[service]. ServiceType ); SampleUtil_Print( "%s+- EventURL = %s", spacer, tmpdevnode->device.TvService[service]. EventURL ); SampleUtil_Print( "%s+- ControlURL = %s", spacer, tmpdevnode->device.TvService[service]. ControlURL ); SampleUtil_Print( "%s+- SID = %s", spacer, tmpdevnode->device.TvService[service].SID ); SampleUtil_Print( "%s+- ServiceStateTable", spacer ); for( var = 0; var < TvVarCount[service]; var++ ) { SampleUtil_Print( "%s +- %-10s = %s", spacer, TvVarName[service][var], tmpdevnode->device.TvService[service]. VariableStrVal[var] ); } } } SampleUtil_Print( "" ); ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointAddDevice * * Description: * If the device is not already included in the global device list, * add it. Otherwise, update its advertisement expiration timeout. * * Parameters: * DescDoc -- The description document for the device * location -- The location of the description document URL * expires -- The expiration time for this advertisement * ********************************************************************************/ void TvCtrlPointAddDevice( IXML_Document *DescDoc, const char *location, int expires ) { char *deviceType = NULL; char *friendlyName = NULL; char presURL[200]; char *baseURL = NULL; char *relURL = NULL; char *UDN = NULL; char *serviceId[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; char *eventURL[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; char *controlURL[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; Upnp_SID eventSID[TV_SERVICE_SERVCOUNT]; int TimeOut[TV_SERVICE_SERVCOUNT] = { default_timeout, default_timeout }; struct TvDeviceNode *deviceNode; struct TvDeviceNode *tmpdevnode; int ret = 1; int found = 0; int service; int var; ithread_mutex_lock( &DeviceListMutex ); /* Read key elements from description document */ UDN = SampleUtil_GetFirstDocumentItem( DescDoc, "UDN" ); deviceType = SampleUtil_GetFirstDocumentItem( DescDoc, "deviceType" ); friendlyName = SampleUtil_GetFirstDocumentItem( DescDoc, "friendlyName" ); baseURL = SampleUtil_GetFirstDocumentItem( DescDoc, "URLBase" ); relURL = SampleUtil_GetFirstDocumentItem( DescDoc, "presentationURL" ); ret = UpnpResolveURL( ( baseURL ? baseURL : location ), relURL, presURL); if( UPNP_E_SUCCESS != ret ) SampleUtil_Print( "Error generating presURL from %s + %s", baseURL, relURL ); if( strcmp( deviceType, TvDeviceType ) == 0 ) { SampleUtil_Print( "Found Tv device" ); // Check if this device is already in the list tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { if( strcmp( tmpdevnode->device.UDN, UDN ) == 0 ) { found = 1; break; } tmpdevnode = tmpdevnode->next; } if( found ) { // The device is already there, so just update // the advertisement timeout field tmpdevnode->device.AdvrTimeOut = expires; } else { for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( SampleUtil_FindAndParseService ( DescDoc, location, TvServiceType[service], &serviceId[service], &eventURL[service], &controlURL[service] ) ) { SampleUtil_Print( "Subscribing to EventURL %s...", eventURL[service] ); ret = UpnpSubscribe( ctrlpt_handle, eventURL[service], &TimeOut[service], eventSID[service] ); if( ret == UPNP_E_SUCCESS ) { SampleUtil_Print ( "Subscribed to EventURL with SID=%s", eventSID[service] ); } else { SampleUtil_Print ( "Error Subscribing to EventURL -- %d", ret ); strcpy( eventSID[service], "" ); } } else { SampleUtil_Print( "Error: Could not find Service: %s", TvServiceType[service] ); } } /* Create a new device node */ deviceNode = ( struct TvDeviceNode * ) malloc( sizeof( struct TvDeviceNode ) ); strcpy( deviceNode->device.UDN, UDN ); strcpy( deviceNode->device.DescDocURL, location ); strcpy( deviceNode->device.FriendlyName, friendlyName ); strcpy( deviceNode->device.PresURL, presURL ); deviceNode->device.AdvrTimeOut = expires; for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { strcpy( deviceNode->device.TvService[service].ServiceId, serviceId[service] ); strcpy( deviceNode->device.TvService[service].ServiceType, TvServiceType[service] ); strcpy( deviceNode->device.TvService[service].ControlURL, controlURL[service] ); strcpy( deviceNode->device.TvService[service].EventURL, eventURL[service] ); strcpy( deviceNode->device.TvService[service].SID, eventSID[service] ); for( var = 0; var < TvVarCount[service]; var++ ) { deviceNode->device.TvService[service]. VariableStrVal[var] = ( char * )malloc( TV_MAX_VAL_LEN ); strcpy( deviceNode->device.TvService[service]. VariableStrVal[var], "" ); } } deviceNode->next = NULL; // Insert the new device node in the list if( ( tmpdevnode = GlobalDeviceList ) ) { while( tmpdevnode ) { if( tmpdevnode->next ) { tmpdevnode = tmpdevnode->next; } else { tmpdevnode->next = deviceNode; break; } } } else { GlobalDeviceList = deviceNode; } //Notify New Device Added SampleUtil_StateUpdate( NULL, NULL, deviceNode->device.UDN, DEVICE_ADDED ); } } ithread_mutex_unlock( &DeviceListMutex ); if( deviceType ) free( deviceType ); if( friendlyName ) free( friendlyName ); if( UDN ) free( UDN ); if( baseURL ) free( baseURL ); if( relURL ) free( relURL ); for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( serviceId[service] ) free( serviceId[service] ); if( controlURL[service] ) free( controlURL[service] ); if( eventURL[service] ) free( eventURL[service] ); } } /******************************************************************************** * TvStateUpdate * * Description: * Update a Tv state table. Called when an event is * received. Note: this function is NOT thread save. It must be * called from another function that has locked the global device list. * * Parameters: * UDN -- The UDN of the parent device. * Service -- The service state table to update * ChangedVariables -- DOM document representing the XML received * with the event * State -- pointer to the state table for the Tv service * to update * ********************************************************************************/ void TvStateUpdate( char *UDN, int Service, IXML_Document * ChangedVariables, char **State ) { IXML_NodeList *properties, *variables; IXML_Element *property, *variable; int length, length1; int i, j; char *tmpstate = NULL; SampleUtil_Print( "Tv State Update (service %d): ", Service ); /* Find all of the e:property tags in the document */ properties = ixmlDocument_getElementsByTagName( ChangedVariables, "e:property" ); if( NULL != properties ) { length = ixmlNodeList_length( properties ); for( i = 0; i < length; i++ ) { /* Loop through each property change found */ property = ( IXML_Element * ) ixmlNodeList_item( properties, i ); /* For each variable name in the state table, check if this is a corresponding property change */ for( j = 0; j < TvVarCount[Service]; j++ ) { variables = ixmlElement_getElementsByTagName( property, TvVarName[Service] [j] ); /* If a match is found, extract the value, and update the state table */ if( variables ) { length1 = ixmlNodeList_length( variables ); if( length1 ) { variable = ( IXML_Element * ) ixmlNodeList_item( variables, 0 ); tmpstate = SampleUtil_GetElementValue( variable ); if( tmpstate ) { strcpy( State[j], tmpstate ); SampleUtil_Print ( " Variable Name: %s New Value:'%s'", TvVarName[Service][j], State[j] ); } if( tmpstate ) free( tmpstate ); tmpstate = NULL; } ixmlNodeList_free( variables ); variables = NULL; } } } ixmlNodeList_free( properties ); } } /******************************************************************************** * TvCtrlPointHandleEvent * * Description: * Handle a UPnP event that was received. Process the event and update * the appropriate service state table. * * Parameters: * sid -- The subscription id for the event * eventkey -- The eventkey number for the event * changes -- The DOM document representing the changes * ********************************************************************************/ void TvCtrlPointHandleEvent( const UpnpString *sid, int evntkey, IXML_Document *changes) { struct TvDeviceNode *tmpdevnode; int service; const char *aux_sid = NULL; ithread_mutex_lock(&DeviceListMutex); tmpdevnode = GlobalDeviceList; while (tmpdevnode) { for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) { aux_sid = UpnpString_get_String(sid); if (strcmp(tmpdevnode->device.TvService[service].SID, aux_sid) == 0) { SampleUtil_Print("Received Tv %s Event: %d for SID %s", TvServiceName[service], evntkey, aux_sid); TvStateUpdate( tmpdevnode->device.UDN, service, changes, (char **)&tmpdevnode->device.TvService[service].VariableStrVal); break; } } tmpdevnode = tmpdevnode->next; } ithread_mutex_unlock(&DeviceListMutex); } /******************************************************************************** * TvCtrlPointHandleSubscribeUpdate * * Description: * Handle a UPnP subscription update that was received. Find the * service the update belongs to, and update its subscription * timeout. * * Parameters: * eventURL -- The event URL for the subscription * sid -- The subscription id for the subscription * timeout -- The new timeout for the subscription * ********************************************************************************/ void TvCtrlPointHandleSubscribeUpdate( const char *eventURL, const Upnp_SID sid, int timeout) { struct TvDeviceNode *tmpdevnode; int service; ithread_mutex_lock( &DeviceListMutex ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( strcmp ( tmpdevnode->device.TvService[service].EventURL, eventURL ) == 0 ) { SampleUtil_Print ( "Received Tv %s Event Renewal for eventURL %s", TvServiceName[service], eventURL ); strcpy( tmpdevnode->device.TvService[service].SID, sid ); break; } } tmpdevnode = tmpdevnode->next; } ithread_mutex_unlock( &DeviceListMutex ); } void TvCtrlPointHandleGetVar( const char *controlURL, const char *varName, const DOMString varValue) { struct TvDeviceNode *tmpdevnode; int service; ithread_mutex_lock( &DeviceListMutex ); tmpdevnode = GlobalDeviceList; while (tmpdevnode) { for (service = 0; service < TV_SERVICE_SERVCOUNT; service++) { if (strcmp(tmpdevnode->device.TvService[service].ControlURL, controlURL) == 0) { SampleUtil_StateUpdate( varName, varValue, tmpdevnode->device.UDN, GET_VAR_COMPLETE); break; } } tmpdevnode = tmpdevnode->next; } ithread_mutex_unlock( &DeviceListMutex ); } /******************************************************************************** * TvCtrlPointCallbackEventHandler * * Description: * The callback handler registered with the SDK while registering * the control point. Detects the type of callback, and passes the * request on to the appropriate function. * * Parameters: * EventType -- The type of callback event * Event -- Data structure containing event data * Cookie -- Optional data specified during callback registration * ********************************************************************************/ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie) { int errCode = 0; SampleUtil_PrintEvent(EventType, Event); switch ( EventType ) { /* SSDP Stuff */ case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: case UPNP_DISCOVERY_SEARCH_RESULT: { UpnpDiscovery *d_event = (UpnpDiscovery *)Event; IXML_Document *DescDoc = NULL; const char *location = NULL; int errCode = UpnpDiscovery_get_ErrCode(d_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Discovery Callback -- %d", errCode); } location = UpnpString_get_String(UpnpDiscovery_get_Location(d_event)); errCode = UpnpDownloadXmlDoc(location, &DescDoc); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error obtaining device description from %s -- error = %d", location, errCode); } else { TvCtrlPointAddDevice( DescDoc, location, UpnpDiscovery_get_Expires(d_event)); } if (DescDoc) { ixmlDocument_free(DescDoc); } TvCtrlPointPrintList(); break; } case UPNP_DISCOVERY_SEARCH_TIMEOUT: /* Nothing to do here... */ break; case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: { UpnpDiscovery *d_event = (UpnpDiscovery *)Event; int errCode = UpnpDiscovery_get_ErrCode(d_event); const char *deviceId = UpnpString_get_String( UpnpDiscovery_get_DeviceID(d_event)); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Discovery ByeBye Callback -- %d", errCode); } SampleUtil_Print("Received ByeBye for Device: %s", deviceId); TvCtrlPointRemoveDevice(deviceId); SampleUtil_Print("After byebye:"); TvCtrlPointPrintList(); break; } /* SOAP Stuff */ case UPNP_CONTROL_ACTION_COMPLETE: { UpnpActionComplete *a_event = (UpnpActionComplete *)Event; int errCode = UpnpActionComplete_get_ErrCode(a_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Action Complete Callback -- %d", errCode); } /* No need for any processing here, just print out results. * Service state table updates are handled by events. */ break; } case UPNP_CONTROL_GET_VAR_COMPLETE: { UpnpStateVarComplete *sv_event = (UpnpStateVarComplete *)Event; int errCode = UpnpStateVarComplete_get_ErrCode(sv_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Get Var Complete Callback -- %d", errCode); } else { TvCtrlPointHandleGetVar( UpnpString_get_String(UpnpStateVarComplete_get_CtrlUrl(sv_event)), UpnpString_get_String(UpnpStateVarComplete_get_StateVarName(sv_event)), UpnpStateVarComplete_get_CurrentVal(sv_event)); } break; } /* GENA Stuff */ case UPNP_EVENT_RECEIVED: { UpnpEvent *e_event = (UpnpEvent *)Event; TvCtrlPointHandleEvent( UpnpEvent_get_SID(e_event), UpnpEvent_get_EventKey(e_event), UpnpEvent_get_ChangedVariables(e_event)); break; } case UPNP_EVENT_SUBSCRIBE_COMPLETE: case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: case UPNP_EVENT_RENEWAL_COMPLETE: { UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; errCode = UpnpEventSubscribe_get_ErrCode(es_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Event Subscribe Callback -- %d", errCode); } else { TvCtrlPointHandleSubscribeUpdate( UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), UpnpString_get_String(UpnpEventSubscribe_get_SID(es_event)), UpnpEventSubscribe_get_TimeOut(es_event)); } break; } case UPNP_EVENT_AUTORENEWAL_FAILED: case UPNP_EVENT_SUBSCRIPTION_EXPIRED: { UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; int TimeOut = default_timeout; Upnp_SID newSID; errCode = UpnpSubscribe( ctrlpt_handle, UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), &TimeOut, newSID); if (errCode == UPNP_E_SUCCESS) { SampleUtil_Print("Subscribed to EventURL with SID=%s", newSID); TvCtrlPointHandleSubscribeUpdate( UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), newSID, TimeOut); } else { SampleUtil_Print("Error Subscribing to EventURL -- %d", errCode); } break; } /* ignore these cases, since this is not a device */ case UPNP_EVENT_SUBSCRIPTION_REQUEST: case UPNP_CONTROL_GET_VAR_REQUEST: case UPNP_CONTROL_ACTION_REQUEST: break; } return 0; } /******************************************************************************** * TvCtrlPointVerifyTimeouts * * Description: * Checks the advertisement each device * in the global device list. If an advertisement expires, * the device is removed from the list. If an advertisement is about to * expire, a search request is sent for that device. * * Parameters: * incr -- The increment to subtract from the timeouts each time the * function is called. * ********************************************************************************/ void TvCtrlPointVerifyTimeouts( int incr ) { struct TvDeviceNode *prevdevnode, *curdevnode; int ret; ithread_mutex_lock( &DeviceListMutex ); prevdevnode = NULL; curdevnode = GlobalDeviceList; while( curdevnode ) { curdevnode->device.AdvrTimeOut -= incr; //SampleUtil_Print("Advertisement Timeout: %d\n", curdevnode->device.AdvrTimeOut); if( curdevnode->device.AdvrTimeOut <= 0 ) { /* This advertisement has expired, so we should remove the device from the list */ if( GlobalDeviceList == curdevnode ) GlobalDeviceList = curdevnode->next; else prevdevnode->next = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); if( prevdevnode ) curdevnode = prevdevnode->next; else curdevnode = GlobalDeviceList; } else { if( curdevnode->device.AdvrTimeOut < 2 * incr ) { /* This advertisement is about to expire, so send out a search request for this device UDN to try to renew */ ret = UpnpSearchAsync( ctrlpt_handle, incr, curdevnode->device.UDN, NULL ); if( ret != UPNP_E_SUCCESS ) SampleUtil_Print ( "Error sending search request for Device UDN: %s -- err = %d", curdevnode->device.UDN, ret ); } prevdevnode = curdevnode; curdevnode = curdevnode->next; } } ithread_mutex_unlock( &DeviceListMutex ); } /******************************************************************************** * TvCtrlPointTimerLoop * * Description: * Function that runs in its own thread and monitors advertisement * and subscription timeouts for devices in the global device list. * * Parameters: * None * ********************************************************************************/ static int TvCtrlPointTimerLoopRun = 1; void *TvCtrlPointTimerLoop(void *args) { int incr = 30; // how often to verify the timeouts, in seconds while (TvCtrlPointTimerLoopRun) { isleep( incr ); TvCtrlPointVerifyTimeouts( incr ); } return NULL; } /******************************************************************************** * TvCtrlPointStart * * Description: * Call this function to initialize the UPnP library and start the TV Control * Point. This function creates a timer thread and provides a callback * handler to process any UPnP events that are received. * * Parameters: * None * * Returns: * TV_SUCCESS if everything went well, else TV_ERROR * ********************************************************************************/ int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionPtr) { ithread_t timer_thread; int rc; unsigned short port = 0; char *ip_address = NULL; SampleUtil_Initialize(printFunctionPtr); SampleUtil_RegisterUpdateFunction(updateFunctionPtr); ithread_mutex_init(&DeviceListMutex, 0); SampleUtil_Print( "Initializing UPnP Sdk with\n" "\tipaddress = %s port = %u\n", ip_address, port); rc = UpnpInit(ip_address, port); if (rc != UPNP_E_SUCCESS) { SampleUtil_Print("WinCEStart: UpnpInit() Error: %d", rc); /* UpnpFinish(); return TV_ERROR; */ } if (!ip_address) { ip_address = UpnpGetServerIpAddress(); } if (!port) { port = UpnpGetServerPort(); } SampleUtil_Print( "UPnP Initialized\n" "\tipaddress= %s port = %u\n", ip_address, port); SampleUtil_Print("Registering Control Point"); rc = UpnpRegisterClient(TvCtrlPointCallbackEventHandler, &ctrlpt_handle, &ctrlpt_handle); if (rc != UPNP_E_SUCCESS) { SampleUtil_Print( "Error registering CP: %d", rc ); UpnpFinish(); return TV_ERROR; } SampleUtil_Print("Control Point Registered"); TvCtrlPointRefresh(); /* start a timer thread */ ithread_create(&timer_thread, NULL, TvCtrlPointTimerLoop, NULL); ithread_detach(timer_thread); return TV_SUCCESS; } int TvCtrlPointStop(void) { TvCtrlPointTimerLoopRun = 0; TvCtrlPointRemoveAll(); UpnpUnRegisterClient( ctrlpt_handle ); UpnpFinish(); SampleUtil_Finish(); return TV_SUCCESS; } libupnp-1.8.0~svn20100507/upnp/sample/tvcombo/upnp_tv_ctrlpt.h0000644000175000017500000001226011021325542021022 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef UPNP_TV_CTRLPT_H #define UPNP_TV_CTRLPT_H #ifdef __cplusplus extern "C" { #endif #include "sample_util.h" #include "ithread.h" #include "upnp.h" #include "upnptools.h" #include #include #include #include #include #ifdef WIN32 /* Do not #include */ #else #include #endif #define TV_SERVICE_SERVCOUNT 2 #define TV_SERVICE_CONTROL 0 #define TV_SERVICE_PICTURE 1 #define TV_CONTROL_VARCOUNT 3 #define TV_CONTROL_POWER 0 #define TV_CONTROL_CHANNEL 1 #define TV_CONTROL_VOLUME 2 #define TV_PICTURE_VARCOUNT 4 #define TV_PICTURE_COLOR 0 #define TV_PICTURE_TINT 1 #define TV_PICTURE_CONTRAST 2 #define TV_PICTURE_BRIGHTNESS 3 #define TV_MAX_VAL_LEN 5 #define TV_SUCCESS 0 #define TV_ERROR (-1) #define TV_WARNING 1 /* This should be the maximum VARCOUNT from above */ #define TV_MAXVARS TV_PICTURE_VARCOUNT extern char TvDeviceType[]; extern char *TvServiceType[]; extern char *TvServiceName[]; extern char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS]; extern char TvVarCount[]; struct tv_service { char ServiceId[NAME_SIZE]; char ServiceType[NAME_SIZE]; char *VariableStrVal[TV_MAXVARS]; char EventURL[NAME_SIZE]; char ControlURL[NAME_SIZE]; char SID[NAME_SIZE]; }; extern struct TvDeviceNode *GlobalDeviceList; struct TvDevice { char UDN[250]; char DescDocURL[250]; char FriendlyName[250]; char PresURL[250]; int AdvrTimeOut; struct tv_service TvService[TV_SERVICE_SERVCOUNT]; }; struct TvDeviceNode { struct TvDevice device; struct TvDeviceNode *next; }; extern ithread_mutex_t DeviceListMutex; extern UpnpClient_Handle ctrlpt_handle; void TvCtrlPointPrintHelp(); int TvCtrlPointDeleteNode(struct TvDeviceNode*); int TvCtrlPointRemoveDevice(const char *); int TvCtrlPointRemoveAll(); int TvCtrlPointRefresh(); int TvCtrlPointSendAction(int, int, char *, char **, char **, int); int TvCtrlPointSendActionNumericArg(int devnum, int service, char *actionName, char *paramName, int paramValue); int TvCtrlPointSendPowerOn(int devnum); int TvCtrlPointSendPowerOff(int devnum); int TvCtrlPointSendSetChannel(int, int); int TvCtrlPointSendSetVolume(int, int); int TvCtrlPointSendSetColor(int, int); int TvCtrlPointSendSetTint(int, int); int TvCtrlPointSendSetContrast(int, int); int TvCtrlPointSendSetBrightness(int, int); int TvCtrlPointGetVar(int, int, char*); int TvCtrlPointGetPower(int devnum); int TvCtrlPointGetChannel(int); int TvCtrlPointGetVolume(int); int TvCtrlPointGetColor(int); int TvCtrlPointGetTint(int); int TvCtrlPointGetContrast(int); int TvCtrlPointGetBrightness(int); int TvCtrlPointGetDevice(int, struct TvDeviceNode **); int TvCtrlPointPrintList( void ); int TvCtrlPointPrintDevice(int); void TvCtrlPointAddDevice(IXML_Document *, const char *, int); void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString); void TvStateUpdate(char*,int, IXML_Document * , char **); void TvCtrlPointHandleEvent(const UpnpString *, int, IXML_Document *); void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int); int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *); void TvCtrlPointVerifyTimeouts(int); void TvCtrlPointPrintCommands( void ); void* TvCtrlPointCommandLoop( void* ); int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr ); int TvCtrlPointStop( void ); int TvCtrlPointProcessCommand( char *cmdline ); #ifdef __cplusplus }; #endif #endif //UPNP_TV_CTRLPT_H libupnp-1.8.0~svn20100507/upnp/sample/tvdevice/0000777000175000017500000000000011373047473016027 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/tvdevice/linux/0000777000175000017500000000000011373047473017166 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/tvdevice/linux/upnp_tv_device_main.c0000644000175000017500000001463611360640052023262 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "sample_util.h" #include "upnp_tv_device.h" #include /****************************************************************************** * linux_print * * Description: * Prints a string to standard out. * * Parameters: * None * *****************************************************************************/ void linux_print( const char *string ) { printf( "%s", string ); } /****************************************************************************** * TvDeviceCommandLoop * * Description: * Function that receives commands from the user at the command prompt * during the lifetime of the device, and calls the appropriate * functions for those commands. Only one command, exit, is currently * defined. * * Parameters: * None * *****************************************************************************/ void * TvDeviceCommandLoop( void *args ) { int stoploop = 0; char cmdline[100]; char cmd[100]; while( !stoploop ) { sprintf( cmdline, " " ); sprintf( cmd, " " ); SampleUtil_Print( "\n>> " ); // Get a command line fgets( cmdline, 100, stdin ); sscanf( cmdline, "%s", cmd ); if( strcasecmp( cmd, "exit" ) == 0 ) { SampleUtil_Print( "Shutting down...\n" ); TvDeviceStop(); exit( 0 ); } else { SampleUtil_Print( "\n Unknown command: %s\n\n", cmd ); SampleUtil_Print( " Valid Commands:\n" ); SampleUtil_Print( " Exit\n\n" ); } } return NULL; } /****************************************************************************** * main * * Description: * Main entry point for tv device application. * Initializes and registers with the sdk. * Initializes the state stables of the service. * Starts the command loop. * * Parameters: * int argc - count of arguments * char ** argv -arguments. The application * accepts the following optional arguments: * * -ip ipaddress * -port port * -desc desc_doc_name * -webdir web_dir_path" * -help * * *****************************************************************************/ int main( IN int argc, IN char **argv ) { unsigned int portTemp = 0; char *ip_address = NULL, *desc_doc_name = NULL, *web_dir_path = NULL; int rc; ithread_t cmdloop_thread; #ifdef WIN32 #else int sig; sigset_t sigs_to_catch; #endif int code; unsigned int port = 0; int i = 0; SampleUtil_Initialize( linux_print ); // Parse options for( i = 1; i < argc; i++ ) { if( strcmp( argv[i], "-ip" ) == 0 ) { ip_address = argv[++i]; } else if( strcmp( argv[i], "-port" ) == 0 ) { sscanf( argv[++i], "%u", &portTemp ); } else if( strcmp( argv[i], "-desc" ) == 0 ) { desc_doc_name = argv[++i]; } else if( strcmp( argv[i], "-webdir" ) == 0 ) { web_dir_path = argv[++i]; } else if( strcmp( argv[i], "-help" ) == 0 ) { SampleUtil_Print( "Usage: %s -ip ipaddress -port port" " -desc desc_doc_name -webdir web_dir_path" " -help (this message)\n", argv[0] ); SampleUtil_Print( "\tipaddress: IP address of the device" " (must match desc. doc)\n" ); SampleUtil_Print( "\t\te.g.: 192.168.0.4\n" ); SampleUtil_Print( "\tport: Port number to use for " "receiving UPnP messages (must match desc. doc)\n" ); SampleUtil_Print( "\t\te.g.: 5431\n" ); SampleUtil_Print ( "\tdesc_doc_name: name of device description document\n" ); SampleUtil_Print( "\t\te.g.: tvdevicedesc.xml\n" ); SampleUtil_Print ( "\tweb_dir_path: Filesystem path where web files " "related to the device are stored\n" ); SampleUtil_Print( "\t\te.g.: /upnp/sample/tvdevice/web\n" ); return 1; } } port = ( unsigned short )portTemp; TvDeviceStart( ip_address, port, desc_doc_name, web_dir_path, linux_print ); /* start a command loop thread */ code = ithread_create( &cmdloop_thread, NULL, TvDeviceCommandLoop, NULL ); #ifdef WIN32 ithread_join(cmdloop_thread, NULL); #else /* Catch Ctrl-C and properly shutdown */ sigemptyset( &sigs_to_catch ); sigaddset( &sigs_to_catch, SIGINT ); sigwait( &sigs_to_catch, &sig ); SampleUtil_Print( "Shutting down on signal %d...\n", sig ); #endif rc = TvDeviceStop(); return rc; } libupnp-1.8.0~svn20100507/upnp/sample/tvdevice/upnp_tv_device.c0000644000175000017500000017340211347521105021116 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "upnp_tv_device.h" #include #define DEFAULT_WEB_DIR "./web" #define DESC_URL_SIZE 200 /* Device type for tv device */ char TvDeviceType[] = "urn:schemas-upnp-org:device:tvdevice:1"; /* Service types for tv services */ char *TvServiceType[] = { "urn:schemas-upnp-org:service:tvcontrol:1", "urn:schemas-upnp-org:service:tvpicture:1" }; /* Global arrays for storing Tv Control Service variable names, values, and defaults */ char *tvc_varname[] = { "Power", "Channel", "Volume" }; char tvc_varval[TV_CONTROL_VARCOUNT][TV_MAX_VAL_LEN]; char *tvc_varval_def[] = { "1", "1", "5" }; /* Global arrays for storing Tv Picture Service variable names, values, and defaults */ char *tvp_varname[] = { "Color", "Tint", "Contrast", "Brightness" }; char tvp_varval[TV_PICTURE_VARCOUNT][TV_MAX_VAL_LEN]; char *tvp_varval_def[] = { "5", "5", "5", "5" }; /* The amount of time (in seconds) before advertisements will expire */ int default_advr_expire = 100; /* Global structure for storing the state table for this device */ struct TvService tv_service_table[2]; /* Device handle supplied by UPnP SDK */ UpnpDevice_Handle device_handle = -1; /* Mutex for protecting the global state table data in a multi-threaded, asynchronous environment. All functions should lock this mutex before reading or writing the state table data. */ ithread_mutex_t TVDevMutex; //Color constants #define MAX_COLOR 10 #define MIN_COLOR 1 //Brightness constants #define MAX_BRIGHTNESS 10 #define MIN_BRIGHTNESS 1 //Power constants #define POWER_ON 1 #define POWER_OFF 0 //Tint constants #define MAX_TINT 10 #define MIN_TINT 1 //Volume constants #define MAX_VOLUME 10 #define MIN_VOLUME 1 //Contrast constants #define MAX_CONTRAST 10 #define MIN_CONTRAST 1 //Channel constants #define MAX_CHANNEL 100 #define MIN_CHANNEL 1 /****************************************************************************** * SetServiceTable * * Description: * Initializes the service table for the specified service. * Note that * knowledge of the service description is * assumed. * Parameters: * int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE * const char * UDN - UDN of device containing service * const char * serviceId - serviceId of service * const char * serviceTypeS - service type (as specified in Description * Document) * struct TvService *out - service containing table to be set. * *****************************************************************************/ int SetServiceTable( IN int serviceType, IN const char *UDN, IN const char *serviceId, IN const char *serviceTypeS, INOUT struct TvService *out ) { unsigned int i = 0; strcpy( out->UDN, UDN ); strcpy( out->ServiceId, serviceId ); strcpy( out->ServiceType, serviceTypeS ); switch ( serviceType ) { case TV_SERVICE_CONTROL: out->VariableCount = TV_CONTROL_VARCOUNT; for( i = 0; i < tv_service_table[TV_SERVICE_CONTROL].VariableCount; i++ ) { tv_service_table[TV_SERVICE_CONTROL].VariableName[i] = tvc_varname[i]; tv_service_table[TV_SERVICE_CONTROL].VariableStrVal[i] = tvc_varval[i]; strcpy( tv_service_table[TV_SERVICE_CONTROL]. VariableStrVal[i], tvc_varval_def[i] ); } break; case TV_SERVICE_PICTURE: out->VariableCount = TV_PICTURE_VARCOUNT; for( i = 0; i < tv_service_table[TV_SERVICE_PICTURE].VariableCount; i++ ) { tv_service_table[TV_SERVICE_PICTURE].VariableName[i] = tvp_varname[i]; tv_service_table[TV_SERVICE_PICTURE].VariableStrVal[i] = tvp_varval[i]; strcpy( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[i], tvp_varval_def[i] ); } break; default: assert( 0 ); } return SetActionTable( serviceType, out ); } /****************************************************************************** * SetActionTable * * Description: * Initializes the action table for the specified service. * Note that * knowledge of the service description is * assumed. Action names are hardcoded. * Parameters: * int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE * struct TvService *out - service containing action table to set. * *****************************************************************************/ int SetActionTable( IN int serviceType, INOUT struct TvService *out ) { if( serviceType == TV_SERVICE_CONTROL ) { out->ActionNames[0] = "PowerOn"; out->actions[0] = TvDevicePowerOn; out->ActionNames[1] = "PowerOff"; out->actions[1] = TvDevicePowerOff; out->ActionNames[2] = "SetChannel"; out->actions[2] = TvDeviceSetChannel; out->ActionNames[3] = "IncreaseChannel"; out->actions[3] = TvDeviceIncreaseChannel; out->ActionNames[4] = "DecreaseChannel"; out->actions[4] = TvDeviceDecreaseChannel; out->ActionNames[5] = "SetVolume"; out->actions[5] = TvDeviceSetVolume; out->ActionNames[6] = "IncreaseVolume"; out->actions[6] = TvDeviceIncreaseVolume; out->ActionNames[7] = "DecreaseVolume"; out->actions[7] = TvDeviceDecreaseVolume; out->ActionNames[8] = NULL; return 1; } else if( serviceType == TV_SERVICE_PICTURE ) { out->ActionNames[0] = "SetColor"; out->ActionNames[1] = "IncreaseColor"; out->ActionNames[2] = "DecreaseColor"; out->actions[0] = TvDeviceSetColor; out->actions[1] = TvDeviceIncreaseColor; out->actions[2] = TvDeviceDecreaseColor; out->ActionNames[3] = "SetTint"; out->ActionNames[4] = "IncreaseTint"; out->ActionNames[5] = "DecreaseTint"; out->actions[3] = TvDeviceSetTint; out->actions[4] = TvDeviceIncreaseTint; out->actions[5] = TvDeviceDecreaseTint; out->ActionNames[6] = "SetBrightness"; out->ActionNames[7] = "IncreaseBrightness"; out->ActionNames[8] = "DecreaseBrightness"; out->actions[6] = TvDeviceSetBrightness; out->actions[7] = TvDeviceIncreaseBrightness; out->actions[8] = TvDeviceDecreaseBrightness; out->ActionNames[9] = "SetContrast"; out->ActionNames[10] = "IncreaseContrast"; out->ActionNames[11] = "DecreaseContrast"; out->actions[9] = TvDeviceSetContrast; out->actions[10] = TvDeviceIncreaseContrast; out->actions[11] = TvDeviceDecreaseContrast; return 1; } return 0; } /****************************************************************************** * TvDeviceStateTableInit * * Description: * Initialize the device state table for * this TvDevice, pulling identifier info * from the description Document. Note that * knowledge of the service description is * assumed. State table variables and default * values are currently hardcoded in this file * rather than being read from service description * documents. * * Parameters: * DescDocURL -- The description document URL * *****************************************************************************/ int TvDeviceStateTableInit( IN char *DescDocURL ) { IXML_Document *DescDoc = NULL; int ret = UPNP_E_SUCCESS; char *servid_ctrl = NULL, *evnturl_ctrl = NULL, *ctrlurl_ctrl = NULL; char *servid_pict = NULL, *evnturl_pict = NULL, *ctrlurl_pict = NULL; char *udn = NULL; //Download description document if( UpnpDownloadXmlDoc( DescDocURL, &DescDoc ) != UPNP_E_SUCCESS ) { SampleUtil_Print( "TvDeviceStateTableInit -- Error Parsing %s\n", DescDocURL ); ret = UPNP_E_INVALID_DESC; goto error_handler; } udn = SampleUtil_GetFirstDocumentItem( DescDoc, "UDN" ); /* Find the Tv Control Service identifiers */ if( !SampleUtil_FindAndParseService( DescDoc, DescDocURL, TvServiceType[TV_SERVICE_CONTROL], &servid_ctrl, &evnturl_ctrl, &ctrlurl_ctrl ) ) { SampleUtil_Print( "TvDeviceStateTableInit -- Error: Could not find" " Service: %s\n", TvServiceType[TV_SERVICE_CONTROL] ); ret = UPNP_E_INVALID_DESC; goto error_handler; } //set control service table SetServiceTable( TV_SERVICE_CONTROL, udn, servid_ctrl, TvServiceType[TV_SERVICE_CONTROL], &tv_service_table[TV_SERVICE_CONTROL] ); /* Find the Tv Picture Service identifiers */ if( !SampleUtil_FindAndParseService( DescDoc, DescDocURL, TvServiceType[TV_SERVICE_PICTURE], &servid_pict, &evnturl_pict, &ctrlurl_pict ) ) { SampleUtil_Print( "TvDeviceStateTableInit -- Error: Could not find" " Service: %s\n", TvServiceType[TV_SERVICE_PICTURE] ); ret = UPNP_E_INVALID_DESC; goto error_handler; } //set picture service table SetServiceTable( TV_SERVICE_PICTURE, udn, servid_pict, TvServiceType[TV_SERVICE_PICTURE], &tv_service_table[TV_SERVICE_PICTURE] ); error_handler: //clean up if( udn ) free( udn ); if( servid_ctrl ) free( servid_ctrl ); if( evnturl_ctrl ) free( evnturl_ctrl ); if( ctrlurl_ctrl ) free( ctrlurl_ctrl ); if( servid_pict ) free( servid_pict ); if( evnturl_pict ) free( evnturl_pict ); if( ctrlurl_pict ) free( ctrlurl_pict ); if( DescDoc ) ixmlDocument_free( DescDoc ); return ( ret ); } /****************************************************************************** * TvDeviceHandleSubscriptionRequest * * Description: * Called during a subscription request callback. If the * subscription request is for this device and either its * control service or picture service, then accept it. * * Parameters: * sr_event -- The subscription request event structure * *****************************************************************************/ int TvDeviceHandleSubscriptionRequest(IN const UpnpSubscriptionRequest *sr_event) { unsigned int i = 0; //unsigned int j = 0; int cmp1 = 0; int cmp2 = 0; const char *l_serviceId = NULL; const char *l_udn = NULL; const char *l_sid = NULL; // IXML_Document *PropSet = NULL; // lock state mutex ithread_mutex_lock( &TVDevMutex ); l_serviceId = UpnpString_get_String(UpnpSubscriptionRequest_get_ServiceId(sr_event)); l_udn = UpnpString_get_String(UpnpSubscriptionRequest_get_UDN(sr_event)); l_sid = UpnpString_get_String(UpnpSubscriptionRequest_get_SID(sr_event)); for (i = 0; i < TV_SERVICE_SERVCOUNT; ++i) { cmp1 = strcmp(l_udn, tv_service_table[i].UDN); cmp2 = strcmp(l_serviceId, tv_service_table[i].ServiceId); if (cmp1 == 0 && cmp2 == 0) { #if 0 PropSet = NULL; for (j = 0; j< tv_service_table[i].VariableCount; ++j) { // add each variable to the property set // for initial state dump UpnpAddToPropertySet( &PropSet, tv_service_table[i].VariableName[j], tv_service_table[i].VariableStrVal[j]); } // dump initial state UpnpAcceptSubscriptionExt( device_handle, l_udn, l_serviceId, PropSet, l_sid); // free document Document_free(PropSet); #endif UpnpAcceptSubscription( device_handle, l_udn, l_serviceId, (const char **)tv_service_table[i]. VariableName, (const char **)tv_service_table[i]. VariableStrVal, tv_service_table[i].VariableCount, l_sid); } } ithread_mutex_unlock( &TVDevMutex ); return 1; } /****************************************************************************** * TvDeviceHandleGetVarRequest * * Description: * Called during a get variable request callback. If the * request is for this device and either its control service * or picture service, then respond with the variable value. * * Parameters: * cgv_event -- The control get variable request event structure * *****************************************************************************/ int TvDeviceHandleGetVarRequest( INOUT UpnpStateVarRequest *cgv_event ) { unsigned int i = 0; unsigned int j = 0; int getvar_succeeded = 0; UpnpStateVarRequest_set_CurrentVal(cgv_event, NULL); ithread_mutex_lock( &TVDevMutex ); for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) { // check udn and service id const char *devUDN = UpnpString_get_String(UpnpStateVarRequest_get_DevUDN(cgv_event)); const char *serviceID = UpnpString_get_String(UpnpStateVarRequest_get_ServiceID(cgv_event)); if( ( strcmp( devUDN, tv_service_table[i].UDN ) == 0 ) && ( strcmp( serviceID, tv_service_table[i].ServiceId ) == 0 ) ) { // check variable name for( j = 0; j < tv_service_table[i].VariableCount; j++ ) { const char *stateVarName = UpnpString_get_String(UpnpStateVarRequest_get_StateVarName(cgv_event)); if( strcmp( stateVarName, tv_service_table[i].VariableName[j] ) == 0 ) { getvar_succeeded = 1; UpnpStateVarRequest_set_CurrentVal(cgv_event, tv_service_table[i].VariableStrVal[j] ); break; } } } } if( getvar_succeeded ) { UpnpStateVarRequest_set_ErrCode(cgv_event, UPNP_E_SUCCESS); } else { SampleUtil_Print( "Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" " Unknown variable name = %s\n", UpnpString_get_String(UpnpStateVarRequest_get_StateVarName(cgv_event)) ); UpnpStateVarRequest_set_ErrCode(cgv_event, 404); UpnpStateVarRequest_strcpy_ErrStr(cgv_event, "Invalid Variable" ); } ithread_mutex_unlock( &TVDevMutex ); return UpnpStateVarRequest_get_ErrCode(cgv_event) == UPNP_E_SUCCESS; } /****************************************************************************** * TvDeviceHandleActionRequest * * Description: * Called during an action request callback. If the * request is for this device and either its control service * or picture service, then perform the action and respond. * * Parameters: * ca_event -- The control action request event structure * *****************************************************************************/ int TvDeviceHandleActionRequest( INOUT UpnpActionRequest *ca_event ) { /* Defaults if action not found */ int action_found = 0; int i = 0; int service = -1; int retCode = 0; char *errorString = NULL; const char *devUDN = NULL; const char *serviceID = NULL; const char *actionName = NULL; IXML_Document *actionResult = NULL; UpnpActionRequest_set_ErrCode(ca_event, 0); UpnpActionRequest_set_ActionResult(ca_event, NULL); devUDN = UpnpString_get_String(UpnpActionRequest_get_DevUDN( ca_event)); serviceID = UpnpString_get_String(UpnpActionRequest_get_ServiceID( ca_event)); actionName = UpnpString_get_String(UpnpActionRequest_get_ActionName(ca_event)); if( ( strcmp( devUDN, tv_service_table[TV_SERVICE_CONTROL].UDN ) == 0 ) && ( strcmp( serviceID, tv_service_table[TV_SERVICE_CONTROL].ServiceId ) == 0 ) ) { /* Request for action in the TvDevice Control Service */ service = TV_SERVICE_CONTROL; } else if( ( strcmp( devUDN, tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 ) && ( strcmp( serviceID, tv_service_table[TV_SERVICE_PICTURE].ServiceId ) == 0 ) ) { /* Request for action in the TvDevice Picture Service */ service = TV_SERVICE_PICTURE; } /* Find and call appropriate procedure based on action name * Each action name has an associated procedure stored in the * service table. These are set at initialization. */ for( i = 0; i < TV_MAXACTIONS && tv_service_table[service].ActionNames[i] != NULL; i++ ) { if( !strcmp( actionName, tv_service_table[service].ActionNames[i] ) ) { if( ( !strcmp( tv_service_table[TV_SERVICE_CONTROL].VariableStrVal[TV_CONTROL_POWER], "1" ) ) || ( !strcmp( actionName, "PowerOn" ) ) ) { retCode = tv_service_table[service].actions[i]( UpnpActionRequest_get_ActionRequest(ca_event), &actionResult, &errorString ); UpnpActionRequest_set_ActionResult(ca_event, actionResult); } else { errorString = "Power is Off"; retCode = UPNP_E_INTERNAL_ERROR; } action_found = 1; break; } } if( !action_found ) { UpnpActionRequest_set_ActionResult(ca_event, NULL); UpnpActionRequest_strcpy_ErrStr(ca_event, "Invalid Action" ); UpnpActionRequest_set_ErrCode(ca_event, 401); } else { if( retCode == UPNP_E_SUCCESS ) { UpnpActionRequest_set_ErrCode(ca_event, UPNP_E_SUCCESS); } else { // copy the error string UpnpActionRequest_strcpy_ErrStr(ca_event, errorString ); switch ( retCode ) { case UPNP_E_INVALID_PARAM: { UpnpActionRequest_set_ErrCode(ca_event, 402); break; } case UPNP_E_INTERNAL_ERROR: default: { UpnpActionRequest_set_ErrCode(ca_event, 501); break; } } } } return UpnpActionRequest_get_ErrCode(ca_event); } /****************************************************************************** * TvDeviceSetServiceTableVar * * Description: * Update the TvDevice service state table, and notify all subscribed * control points of the updated state. Note that since this function * blocks on the mutex TVDevMutex, to avoid a hang this function should * not be called within any other function that currently has this mutex * locked. * * Parameters: * service -- The service number (TV_SERVICE_CONTROL or TV_SERVICE_PICTURE) * variable -- The variable number (TV_CONTROL_POWER, TV_CONTROL_CHANNEL, * TV_CONTROL_VOLUME, TV_PICTURE_COLOR, TV_PICTURE_TINT, * TV_PICTURE_CONTRAST, or TV_PICTURE_BRIGHTNESS) * value -- The string representation of the new value * *****************************************************************************/ int TvDeviceSetServiceTableVar( IN unsigned int service, IN unsigned int variable, IN char *value ) { //IXML_Document *PropSet= NULL; if( ( service >= TV_SERVICE_SERVCOUNT ) || ( variable >= tv_service_table[service].VariableCount ) || ( strlen( value ) >= TV_MAX_VAL_LEN ) ) { return ( 0 ); } ithread_mutex_lock( &TVDevMutex ); strcpy( tv_service_table[service].VariableStrVal[variable], value ); /* //Using utility api PropSet= UpnpCreatePropertySet(1,tv_service_table[service]. VariableName[variable], tv_service_table[service]. VariableStrVal[variable]); UpnpNotifyExt(device_handle, tv_service_table[service].UDN, tv_service_table[service].ServiceId,PropSet); //Free created property set Document_free(PropSet); */ UpnpNotify( device_handle, tv_service_table[service].UDN, tv_service_table[service].ServiceId, ( const char ** )&tv_service_table[service]. VariableName[variable], ( const char ** )&tv_service_table[service]. VariableStrVal[variable], 1 ); ithread_mutex_unlock( &TVDevMutex ); return ( 1 ); } /****************************************************************************** * TvDeviceSetPower * * Description: * Turn the power on/off, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * on -- If 1, turn power on. If 0, turn power off. * *****************************************************************************/ int TvDeviceSetPower( IN int on ) { char value[TV_MAX_VAL_LEN]; int ret = 0; if( on != POWER_ON && on != POWER_OFF ) { SampleUtil_Print( "error: can't set power to value %d\n", on ); return 0; } /* Vendor-specific code to turn the power on/off goes here */ sprintf( value, "%d", on ); ret = TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_POWER, value ); return ret; } /****************************************************************************** * TvDevicePowerOn * * Description: * Turn the power on. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { ( *out ) = NULL; ( *errorString ) = NULL; if( TvDeviceSetPower( POWER_ON ) ) { //create a response if( UpnpAddToActionResponse( out, "PowerOn", TvServiceType[TV_SERVICE_CONTROL], "Power", "1" ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDevicePowerOff * * Description: * Turn the power off. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOff( IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString ) { ( *out ) = NULL; ( *errorString ) = NULL; if( TvDeviceSetPower( POWER_OFF ) ) { //create a response if( UpnpAddToActionResponse( out, "PowerOff", TvServiceType[TV_SERVICE_CONTROL], "Power", "0" ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } /****************************************************************************** * TvDeviceSetChannel * * Description: * Change the channel, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int channel = 0; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Channel" ) ) ) { ( *errorString ) = "Invalid Channel"; return UPNP_E_INVALID_PARAM; } channel = atoi( value ); if( channel < MIN_CHANNEL || channel > MAX_CHANNEL ) { free( value ); SampleUtil_Print( "error: can't change to channel %d\n", channel ); ( *errorString ) = "Invalid Channel"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_CHANNEL, value ) ) { if( UpnpAddToActionResponse( out, "SetChannel", TvServiceType[TV_SERVICE_CONTROL], "NewChannel", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementChannel * * Description: * Increment the channel. Read the current channel from the state * table, add the increment, and then change the channel. * * Parameters: * incr -- The increment by which to change the channel. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementChannel( IN int incr, IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString ) { int curchannel; int newchannel; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseChannel"; } else { actionName = "DecreaseChannel"; } ithread_mutex_lock( &TVDevMutex ); curchannel = atoi( tv_service_table[TV_SERVICE_CONTROL]. VariableStrVal[TV_CONTROL_CHANNEL] ); ithread_mutex_unlock( &TVDevMutex ); newchannel = curchannel + incr; if( newchannel < MIN_CHANNEL || newchannel > MAX_CHANNEL ) { SampleUtil_Print( "error: can't change to channel %d\n", newchannel ); ( *errorString ) = "Invalid Channel"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newchannel ); if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_CHANNEL, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_CONTROL], "Channel", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceDecreaseChannel * * Description: * Decrease the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementChannel( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceIncreaseChannel * * Description: * Increase the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementChannel( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetVolume * * Description: * Change the volume, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int volume = 0; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Volume" ) ) ) { ( *errorString ) = "Invalid Volume"; return UPNP_E_INVALID_PARAM; } volume = atoi( value ); if( volume < MIN_VOLUME || volume > MAX_VOLUME ) { SampleUtil_Print( "error: can't change to volume %d\n", volume ); ( *errorString ) = "Invalid Volume"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_VOLUME, value ) ) { if( UpnpAddToActionResponse( out, "SetVolume", TvServiceType[TV_SERVICE_CONTROL], "NewVolume", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementVolume * * Description: * Increment the volume. Read the current volume from the state * table, add the increment, and then change the volume. * * Parameters: * incr -- The increment by which to change the volume. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT char **errorString ) { int curvolume, newvolume; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseVolume"; } else { actionName = "DecreaseVolume"; } ithread_mutex_lock( &TVDevMutex ); curvolume = atoi( tv_service_table[TV_SERVICE_CONTROL]. VariableStrVal[TV_CONTROL_VOLUME] ); ithread_mutex_unlock( &TVDevMutex ); newvolume = curvolume + incr; if( newvolume < MIN_VOLUME || newvolume > MAX_VOLUME ) { SampleUtil_Print( "error: can't change to volume %d\n", newvolume ); ( *errorString ) = "Invalid Volume"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newvolume ); if( TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_VOLUME, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_CONTROL], "Volume", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncrVolume * * Description: * Increase the volume. * * Parameters: * * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementVolume( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseVolume * * Description: * Decrease the volume. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementVolume( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetColor * * Description: * Change the color, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int color = 0; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Color" ) ) ) { ( *errorString ) = "Invalid Color"; return UPNP_E_INVALID_PARAM; } color = atoi( value ); if( color < MIN_COLOR || color > MAX_COLOR ) { SampleUtil_Print( "error: can't change to color %d\n", color ); ( *errorString ) = "Invalid Color"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_COLOR, value ) ) { if( UpnpAddToActionResponse( out, "SetColor", TvServiceType[TV_SERVICE_PICTURE], "NewColor", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementColor * * Description: * Increment the color. Read the current color from the state * table, add the increment, and then change the color. * * Parameters: * incr -- The increment by which to change the color. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementColor( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curcolor; int newcolor; char *actionName; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseColor"; } else { actionName = "DecreaseColor"; } ithread_mutex_lock( &TVDevMutex ); curcolor = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_COLOR] ); ithread_mutex_unlock( &TVDevMutex ); newcolor = curcolor + incr; if( newcolor < MIN_COLOR || newcolor > MAX_COLOR ) { SampleUtil_Print( "error: can't change to color %d\n", newcolor ); ( *errorString ) = "Invalid Color"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newcolor ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_COLOR, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Color", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceDecreaseColor * * Description: * Decrease the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceDecreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementColor( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceIncreaseColor * * Description: * Increase the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementColor( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetTint * * Description: * Change the tint, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int tint = -1; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Tint" ) ) ) { ( *errorString ) = "Invalid Tint"; return UPNP_E_INVALID_PARAM; } tint = atoi( value ); if( tint < MIN_TINT || tint > MAX_TINT ) { SampleUtil_Print( "error: can't change to tint %d\n", tint ); ( *errorString ) = "Invalid Tint"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_TINT, value ) ) { if( UpnpAddToActionResponse( out, "SetTint", TvServiceType[TV_SERVICE_PICTURE], "NewTint", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementTint * * Description: * Increment the tint. Read the current tint from the state * table, add the increment, and then change the tint. * * Parameters: * incr -- The increment by which to change the tint. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curtint; int newtint; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseTint"; } else { actionName = "DecreaseTint"; } ithread_mutex_lock( &TVDevMutex ); curtint = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_TINT] ); ithread_mutex_unlock( &TVDevMutex ); newtint = curtint + incr; if( newtint < MIN_TINT || newtint > MAX_TINT ) { SampleUtil_Print( "error: can't change to tint %d\n", newtint ); ( *errorString ) = "Invalid Tint"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newtint ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_TINT, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Tint", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncreaseTint * * Description: * Increase tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementTint( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseTint * * Description: * Decrease tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementTint( -1, in, out, errorString ); } /***************************************************************************** * TvDeviceSetContrast * * Description: * Change the contrast, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * ****************************************************************************/ int TvDeviceSetContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int contrast = -1; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Contrast" ) ) ) { ( *errorString ) = "Invalid Contrast"; return UPNP_E_INVALID_PARAM; } contrast = atoi( value ); if( contrast < MIN_CONTRAST || contrast > MAX_CONTRAST ) { SampleUtil_Print( "error: can't change to contrast %d\n", contrast ); ( *errorString ) = "Invalid Contrast"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_CONTRAST, value ) ) { if( UpnpAddToActionResponse( out, "SetContrast", TvServiceType[TV_SERVICE_PICTURE], "NewContrast", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementContrast * * Description: * Increment the contrast. Read the current contrast from the state * table, add the increment, and then change the contrast. * * Parameters: * incr -- The increment by which to change the contrast. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementContrast( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curcontrast; int newcontrast; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseContrast"; } else { actionName = "DecreaseContrast"; } ithread_mutex_lock( &TVDevMutex ); curcontrast = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_CONTRAST] ); ithread_mutex_unlock( &TVDevMutex ); newcontrast = curcontrast + incr; if( newcontrast < MIN_CONTRAST || newcontrast > MAX_CONTRAST ) { SampleUtil_Print( "error: can't change to contrast %d\n", newcontrast ); ( *errorString ) = "Invalid Contrast"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newcontrast ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_CONTRAST, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Contrast", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncreaseContrast * * Description: * * Increase the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementContrast( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseContrast * * Description: * Decrease the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementContrast( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceSetBrightness * * Description: * Change the brightness, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * brightness -- The brightness value to change to. * *****************************************************************************/ int TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { char *value = NULL; int brightness = -1; ( *out ) = NULL; ( *errorString ) = NULL; if( !( value = SampleUtil_GetFirstDocumentItem( in, "Brightness" ) ) ) { ( *errorString ) = "Invalid Brightness"; return UPNP_E_INVALID_PARAM; } brightness = atoi( value ); if( brightness < MIN_BRIGHTNESS || brightness > MAX_BRIGHTNESS ) { SampleUtil_Print( "error: can't change to brightness %d\n", brightness ); ( *errorString ) = "Invalid Brightness"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the volume goes here */ if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_BRIGHTNESS, value ) ) { if( UpnpAddToActionResponse( out, "SetBrightness", TvServiceType[TV_SERVICE_PICTURE], "NewBrightness", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; free( value ); return UPNP_E_INTERNAL_ERROR; } free( value ); return UPNP_E_SUCCESS; } else { free( value ); ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * IncrementBrightness * * Description: * Increment the brightness. Read the current brightness from the state * table, add the increment, and then change the brightness. * * Parameters: * incr -- The increment by which to change the brightness. * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int IncrementBrightness( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { int curbrightness; int newbrightness; char *actionName = NULL; char value[TV_MAX_VAL_LEN]; if( incr > 0 ) { actionName = "IncreaseBrightness"; } else { actionName = "DecreaseBrightness"; } ithread_mutex_lock( &TVDevMutex ); curbrightness = atoi( tv_service_table[TV_SERVICE_PICTURE]. VariableStrVal[TV_PICTURE_BRIGHTNESS] ); ithread_mutex_unlock( &TVDevMutex ); newbrightness = curbrightness + incr; if( newbrightness < MIN_BRIGHTNESS || newbrightness > MAX_BRIGHTNESS ) { SampleUtil_Print( "error: can't change to brightness %d\n", newbrightness ); ( *errorString ) = "Invalid Brightness"; return UPNP_E_INVALID_PARAM; } /* Vendor-specific code to set the channel goes here */ sprintf( value, "%d", newbrightness ); if( TvDeviceSetServiceTableVar( TV_SERVICE_PICTURE, TV_PICTURE_BRIGHTNESS, value ) ) { if( UpnpAddToActionResponse( out, actionName, TvServiceType[TV_SERVICE_PICTURE], "Brightness", value ) != UPNP_E_SUCCESS ) { ( *out ) = NULL; ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } return UPNP_E_SUCCESS; } else { ( *errorString ) = "Internal Error"; return UPNP_E_INTERNAL_ERROR; } } /****************************************************************************** * TvDeviceIncreaseBrightness * * Description: * Increase brightness. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementBrightness( 1, in, out, errorString ); } /****************************************************************************** * TvDeviceDecreaseBrightness * * Description: * Decrease brightnesss. * * Parameters: * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString ) { return IncrementBrightness( -1, in, out, errorString ); } /****************************************************************************** * TvDeviceCallbackEventHandler * * Description: * The callback handler registered with the SDK while registering * root device. Dispatches the request to the appropriate procedure * based on the value of EventType. The four requests handled by the * device are: * 1) Event Subscription requests. * 2) Get Variable requests. * 3) Action requests. * * Parameters: * * EventType -- The type of callback event * Event -- Data structure containing event data * Cookie -- Optional data specified during callback registration * *****************************************************************************/ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie) { switch ( EventType ) { case UPNP_EVENT_SUBSCRIPTION_REQUEST: TvDeviceHandleSubscriptionRequest((UpnpSubscriptionRequest *)Event); break; case UPNP_CONTROL_GET_VAR_REQUEST: TvDeviceHandleGetVarRequest( (UpnpStateVarRequest *)Event ); break; case UPNP_CONTROL_ACTION_REQUEST: TvDeviceHandleActionRequest( (UpnpActionRequest *)Event ); break; /* ignore these cases, since this is not a control point */ case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: case UPNP_DISCOVERY_SEARCH_RESULT: case UPNP_DISCOVERY_SEARCH_TIMEOUT: case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: case UPNP_CONTROL_ACTION_COMPLETE: case UPNP_CONTROL_GET_VAR_COMPLETE: case UPNP_EVENT_RECEIVED: case UPNP_EVENT_RENEWAL_COMPLETE: case UPNP_EVENT_SUBSCRIBE_COMPLETE: case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: break; default: SampleUtil_Print( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n", EventType ); } /* Print a summary of the event received */ SampleUtil_PrintEvent( EventType, Event ); return 0; } /****************************************************************************** * TvDeviceStop * * Description: * Stops the device. Uninitializes the sdk. * * Parameters: * *****************************************************************************/ int TvDeviceStop(void) { UpnpUnRegisterRootDevice( device_handle ); UpnpFinish(); SampleUtil_Finish(); ithread_mutex_destroy( &TVDevMutex ); return UPNP_E_SUCCESS; } /****************************************************************************** * TvDeviceStart * * Description: * Initializes the UPnP Sdk, registers the device, and sends out * advertisements. * * Parameters: * * ip_address - ip address to initialize the sdk (may be NULL) * if null, then the first non null loopback address is used. * port - port number to initialize the sdk (may be 0) * if zero, then a random number is used. * desc_doc_name - name of description document. * may be NULL. Default is tvdevicedesc.xml * web_dir_path - path of web directory. * may be NULL. Default is ./web (for Linux) or ../tvdevice/web * for windows. * pfun - print function to use. * *****************************************************************************/ int TvDeviceStart( char *ip_address, unsigned short port, char *desc_doc_name, char *web_dir_path, print_string pfun ) { int ret = UPNP_E_SUCCESS; char desc_doc_url[DESC_URL_SIZE]; ithread_mutex_init( &TVDevMutex, NULL ); SampleUtil_Initialize( pfun ); SampleUtil_Print( "Initializing UPnP Sdk with\n" "\tipaddress = %s port = %u\n", ip_address, port ); ret = UpnpInit( ip_address, port ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error with UpnpInit -- %d\n", ret ); UpnpFinish(); return ret; } ip_address = UpnpGetServerIpAddress(); port = UpnpGetServerPort(); SampleUtil_Print( "UPnP Initialized\n" "\tipaddress= %s port = %u\n", ip_address, port ); if( desc_doc_name == NULL ) { desc_doc_name = "tvdevicedesc.xml"; } if( web_dir_path == NULL ) { web_dir_path = DEFAULT_WEB_DIR; } snprintf( desc_doc_url, DESC_URL_SIZE, "http://%s:%d/%s", ip_address, port, desc_doc_name ); SampleUtil_Print( "Specifying the webserver root directory -- %s\n", web_dir_path ); ret = UpnpSetWebServerRootDir( web_dir_path ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error specifying webserver root directory -- %s: %d\n", web_dir_path, ret ); UpnpFinish(); return ret; } SampleUtil_Print( "Registering the RootDevice\n" "\t with desc_doc_url: %s\n", desc_doc_url ); ret = UpnpRegisterRootDevice( desc_doc_url, TvDeviceCallbackEventHandler, &device_handle, &device_handle ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error registering the rootdevice : %d\n", ret ); UpnpFinish(); return ret; } else { SampleUtil_Print( "RootDevice Registered\n" "Initializing State Table\n"); TvDeviceStateTableInit( desc_doc_url ); SampleUtil_Print("State Table Initialized\n"); ret = UpnpSendAdvertisement( device_handle, default_advr_expire ); if( ret != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error sending advertisements : %d\n", ret ); UpnpFinish(); return ret; } SampleUtil_Print("Advertisements Sent\n"); } return UPNP_E_SUCCESS; } libupnp-1.8.0~svn20100507/upnp/sample/tvdevice/upnp_tv_device.h0000644000175000017500000005204611347521105021123 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef UPNP_TV_DEVICE_H #define UPNP_TV_DEVICE_H #include #include #ifdef __cplusplus extern "C" { #endif #include "sample_util.h" #include "ithread.h" #include "upnp.h" #include #include #ifdef WIN32 /* Do not #include */ #else #include #endif //Color constants #define MAX_COLOR 10 #define MIN_COLOR 1 //Brightness constants #define MAX_BRIGHTNESS 10 #define MIN_BRIGHTNESS 1 //Power constants #define POWER_ON 1 #define POWER_OFF 0 //Tint constants #define MAX_TINT 10 #define MIN_TINT 1 //Volume constants #define MAX_VOLUME 10 #define MIN_VOLUME 1 //Contrast constants #define MAX_CONTRAST 10 #define MIN_CONTRAST 1 //Channel constants #define MAX_CHANNEL 100 #define MIN_CHANNEL 1 //Number of services. #define TV_SERVICE_SERVCOUNT 2 //Index of control service #define TV_SERVICE_CONTROL 0 //Index of picture service #define TV_SERVICE_PICTURE 1 //Number of control variables #define TV_CONTROL_VARCOUNT 3 //Index of power variable #define TV_CONTROL_POWER 0 //Index of channel variable #define TV_CONTROL_CHANNEL 1 //Index of volume variable #define TV_CONTROL_VOLUME 2 //Number of picture variables #define TV_PICTURE_VARCOUNT 4 //Index of color variable #define TV_PICTURE_COLOR 0 //Index of tint variable #define TV_PICTURE_TINT 1 //Index of contrast variable #define TV_PICTURE_CONTRAST 2 //Index of brightness variable #define TV_PICTURE_BRIGHTNESS 3 //Max value length #define TV_MAX_VAL_LEN 5 //Max actions #define TV_MAXACTIONS 12 /* This should be the maximum VARCOUNT from above */ #define TV_MAXVARS TV_PICTURE_VARCOUNT extern char TvDeviceType[]; extern char *TvServiceType[]; /****************************************************************************** * upnp_action * * Description: * Prototype for all actions. For each action that a service * implements, there is a corresponding function with this prototype. * Pointers to these functions, along with action names, are stored * in the service table. When an action request comes in the action * name is matched, and the appropriate function is called. * Each function returns UPNP_E_SUCCESS, on success, and a nonzero * error code on failure. * * Parameters: * * IXML_Document * request - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out, char **errorString); /* Structure for storing Tv Service identifiers and state table */ struct TvService { char UDN[NAME_SIZE]; /* Universally Unique Device Name */ char ServiceId[NAME_SIZE]; char ServiceType[NAME_SIZE]; char *VariableName[TV_MAXVARS]; char *VariableStrVal[TV_MAXVARS]; char *ActionNames[TV_MAXACTIONS]; upnp_action actions[TV_MAXACTIONS]; unsigned int VariableCount; }; //Array of service structures extern struct TvService tv_service_table[]; //Device handle returned from sdk extern UpnpDevice_Handle device_handle; /* Mutex for protecting the global state table data in a multi-threaded, asynchronous environment. All functions should lock this mutex before reading or writing the state table data. */ extern ithread_mutex_t TVDevMutex; /****************************************************************************** * SetActionTable * * Description: * Initializes the action table for the specified service. * Note that * knowledge of the service description is * assumed. Action names are hardcoded. * Parameters: * int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE * struct TvService *out - service containing action table to set. * *****************************************************************************/ int SetActionTable(int serviceType, struct TvService *out); /****************************************************************************** * TvDeviceStateTableInit * * Description: * Initialize the device state table for * this TvDevice, pulling identifier info * from the description Document. Note that * knowledge of the service description is * assumed. State table variables and default * values are currently hardcoded in this file * rather than being read from service description * documents. * * Parameters: * DescDocURL -- The description document URL * *****************************************************************************/ int TvDeviceStateTableInit(char*); /****************************************************************************** * TvDeviceHandleSubscriptionRequest * * Description: * Called during a subscription request callback. If the * subscription request is for this device and either its * control service or picture service, then accept it. * * Parameters: * sr_event -- The subscription request event structure * *****************************************************************************/ int TvDeviceHandleSubscriptionRequest(const UpnpSubscriptionRequest *); /****************************************************************************** * TvDeviceHandleGetVarRequest * * Description: * Called during a get variable request callback. If the * request is for this device and either its control service * or picture service, then respond with the variable value. * * Parameters: * cgv_event -- The control get variable request event structure * *****************************************************************************/ int TvDeviceHandleGetVarRequest(UpnpStateVarRequest *); /****************************************************************************** * TvDeviceHandleActionRequest * * Description: * Called during an action request callback. If the * request is for this device and either its control service * or picture service, then perform the action and respond. * * Parameters: * ca_event -- The control action request event structure * *****************************************************************************/ int TvDeviceHandleActionRequest(UpnpActionRequest *); /****************************************************************************** * TvDeviceCallbackEventHandler * * Description: * The callback handler registered with the SDK while registering * root device. Dispatches the request to the appropriate procedure * based on the value of EventType. The four requests handled by the * device are: * 1) Event Subscription requests. * 2) Get Variable requests. * 3) Action requests. * * Parameters: * * EventType -- The type of callback event * Event -- Data structure containing event data * Cookie -- Optional data specified during callback registration * *****************************************************************************/ int TvDeviceCallbackEventHandler(Upnp_EventType, void*, void*); /****************************************************************************** * TvDeviceSetServiceTableVar * * Description: * Update the TvDevice service state table, and notify all subscribed * control points of the updated state. Note that since this function * blocks on the mutex TVDevMutex, to avoid a hang this function should * not be called within any other function that currently has this mutex * locked. * * Parameters: * service -- The service number (TV_SERVICE_CONTROL or TV_SERVICE_PICTURE) * variable -- The variable number (TV_CONTROL_POWER, TV_CONTROL_CHANNEL, * TV_CONTROL_VOLUME, TV_PICTURE_COLOR, TV_PICTURE_TINT, * TV_PICTURE_CONTRAST, or TV_PICTURE_BRIGHTNESS) * value -- The string representation of the new value * *****************************************************************************/ int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*); //Control Service Actions /****************************************************************************** * TvDevicePowerOn * * Description: * Turn the power on. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDevicePowerOff * * Description: * Turn the power off. * * Parameters: * * IXML_Document * in - document of action request * IXML_Document **out - action result * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetChannel * * Description: * Change the channel, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseChannel * * Description: * Increase the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseChannel * * Description: * Decrease the channel. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetVolume * * Description: * Change the volume, update the TvDevice control service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseVolume * * Description: * Increase the volume. * * Parameters: * * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseVolume * * Description: * Decrease the volume. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); //Picture Service Actions /****************************************************************************** * TvDeviceSetColor * * Description: * Change the color, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseColor * * Description: * Increase the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseColor * * Description: * Decrease the color. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) *****************************************************************************/ int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetTint * * Description: * Change the tint, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseTint * * Description: * Increase tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseTint * * Description: * Decrease tint. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /***************************************************************************** * TvDeviceSetContrast * * Description: * Change the contrast, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * ****************************************************************************/ int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseContrast * * Description: * * Increase the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseContrast * * Description: * Decrease the contrast. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceSetBrightness * * Description: * Change the brightness, update the TvDevice picture service * state table, and notify all subscribed control points of the * updated state. * * Parameters: * brightness -- The brightness value to change to. * *****************************************************************************/ int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceIncreaseBrightness * * Description: * Increase brightness. * * Parameters: * * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); /****************************************************************************** * TvDeviceDecreaseBrightness * * Description: * Decrease brightnesss. * * Parameters: * IXML_Document * in - action request document * IXML_Document **out - action result document * char **errorString - errorString (in case action was unsuccessful) * *****************************************************************************/ int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString); int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name, char *web_dir_path, print_string pfun); int TvDeviceStop(void); #ifdef __cplusplus } #endif #endif libupnp-1.8.0~svn20100507/upnp/sample/tvctrlpt/0000777000175000017500000000000011373047473016100 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/tvctrlpt/linux/0000777000175000017500000000000011373047473017237 500000000000000libupnp-1.8.0~svn20100507/upnp/sample/tvctrlpt/linux/upnp_tv_ctrlpt_main.c0000644000175000017500000003762511360640052023407 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "sample_util.h" #include "upnp_tv_ctrlpt.h" #include #include /* Tags for valid commands issued at the command prompt */ enum cmdloop_tvcmds { PRTHELP = 0, PRTFULLHELP, POWON, POWOFF, SETCHAN, SETVOL, SETCOL, SETTINT, SETCONT, SETBRT, CTRLACTION, PICTACTION, CTRLGETVAR, PICTGETVAR, PRTDEV, LSTDEV, REFRESH, EXITCMD }; /* Data structure for parsing commands from the command line */ struct cmdloop_commands { char *str; // the string int cmdnum; // the command int numargs; // the number of arguments char *args; // the args } cmdloop_commands; /* Mappings between command text names, command tag, and required command arguments for command line commands */ static struct cmdloop_commands cmdloop_cmdlist[] = { {"Help", PRTHELP, 1, ""}, {"HelpFull", PRTFULLHELP, 1, ""}, {"ListDev", LSTDEV, 1, ""}, {"Refresh", REFRESH, 1, ""}, {"PrintDev", PRTDEV, 2, ""}, {"PowerOn", POWON, 2, ""}, {"PowerOff", POWOFF, 2, ""}, {"SetChannel", SETCHAN, 3, " "}, {"SetVolume", SETVOL, 3, " "}, {"SetColor", SETCOL, 3, " "}, {"SetTint", SETTINT, 3, " "}, {"SetContrast", SETCONT, 3, " "}, {"SetBrightness", SETBRT, 3, " "}, {"CtrlAction", CTRLACTION, 2, " "}, {"PictAction", PICTACTION, 2, " "}, {"CtrlGetVar", CTRLGETVAR, 2, " "}, {"PictGetVar", PICTGETVAR, 2, " "}, {"Exit", EXITCMD, 1, ""} }; void linux_print( const char *string ) { puts( string ); } /******************************************************************************** * TvCtrlPointPrintHelp * * Description: * Print help info for this application. ********************************************************************************/ void TvCtrlPointPrintShortHelp( void ) { SampleUtil_Print( "Commands:" ); SampleUtil_Print( " Help" ); SampleUtil_Print( " HelpFull" ); SampleUtil_Print( " ListDev" ); SampleUtil_Print( " Refresh" ); SampleUtil_Print( " PrintDev " ); SampleUtil_Print( " PowerOn " ); SampleUtil_Print( " PowerOff " ); SampleUtil_Print( " SetChannel " ); SampleUtil_Print( " SetVolume " ); SampleUtil_Print( " SetColor " ); SampleUtil_Print( " SetTint " ); SampleUtil_Print( " SetContrast " ); SampleUtil_Print( " SetBrightness " ); SampleUtil_Print( " CtrlAction " ); SampleUtil_Print( " PictAction " ); SampleUtil_Print( " CtrlGetVar " ); SampleUtil_Print( " PictGetVar " ); SampleUtil_Print( " Exit" ); } void TvCtrlPointPrintLongHelp( void ) { SampleUtil_Print( "" ); SampleUtil_Print( "******************************" ); SampleUtil_Print( "* TV Control Point Help Info *" ); SampleUtil_Print( "******************************" ); SampleUtil_Print( "" ); SampleUtil_Print( "This sample control point application automatically searches" ); SampleUtil_Print( "for and subscribes to the services of television device emulator" ); SampleUtil_Print( "devices, described in the tvdevicedesc.xml description document." ); SampleUtil_Print( "" ); SampleUtil_Print( "Commands:" ); SampleUtil_Print( " Help" ); SampleUtil_Print( " Print this help info." ); SampleUtil_Print( " ListDev" ); SampleUtil_Print( " Print the current list of TV Device Emulators that this" ); SampleUtil_Print( " control point is aware of. Each device is preceded by a" ); SampleUtil_Print( " device number which corresponds to the devnum argument of" ); SampleUtil_Print( " commands listed below." ); SampleUtil_Print( " Refresh" ); SampleUtil_Print( " Delete all of the devices from the device list and issue new" ); SampleUtil_Print( " search request to rebuild the list from scratch." ); SampleUtil_Print( " PrintDev " ); SampleUtil_Print( " Print the state table for the device ." ); SampleUtil_Print( " e.g., 'PrintDev 1' prints the state table for the first" ); SampleUtil_Print( " device in the device list." ); SampleUtil_Print( " PowerOn " ); SampleUtil_Print( " Sends the PowerOn action to the Control Service of" ); SampleUtil_Print( " device ." ); SampleUtil_Print( " PowerOff " ); SampleUtil_Print( " Sends the PowerOff action to the Control Service of" ); SampleUtil_Print( " device ." ); SampleUtil_Print( " SetChannel " ); SampleUtil_Print( " Sends the SetChannel action to the Control Service of" ); SampleUtil_Print( " device , requesting the channel to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetVolume " ); SampleUtil_Print( " Sends the SetVolume action to the Control Service of" ); SampleUtil_Print( " device , requesting the volume to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetColor " ); SampleUtil_Print( " Sends the SetColor action to the Control Service of" ); SampleUtil_Print( " device , requesting the color to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetTint " ); SampleUtil_Print( " Sends the SetTint action to the Control Service of" ); SampleUtil_Print( " device , requesting the tint to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetContrast " ); SampleUtil_Print( " Sends the SetContrast action to the Control Service of" ); SampleUtil_Print( " device , requesting the contrast to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " SetBrightness " ); SampleUtil_Print( " Sends the SetBrightness action to the Control Service of" ); SampleUtil_Print( " device , requesting the brightness to be changed" ); SampleUtil_Print( " to ." ); SampleUtil_Print( " CtrlAction " ); SampleUtil_Print( " Sends an action request specified by the string " ); SampleUtil_Print( " to the Control Service of device . This command" ); SampleUtil_Print( " only works for actions that have no arguments." ); SampleUtil_Print( " (e.g., \"CtrlAction 1 IncreaseChannel\")" ); SampleUtil_Print( " PictAction " ); SampleUtil_Print( " Sends an action request specified by the string " ); SampleUtil_Print( " to the Picture Service of device . This command" ); SampleUtil_Print( " only works for actions that have no arguments." ); SampleUtil_Print( " (e.g., \"PictAction 1 DecreaseContrast\")" ); SampleUtil_Print( " CtrlGetVar " ); SampleUtil_Print( " Requests the value of a variable specified by the string " ); SampleUtil_Print( " from the Control Service of device ." ); SampleUtil_Print( " (e.g., \"CtrlGetVar 1 Volume\")" ); SampleUtil_Print( " PictGetVar " ); SampleUtil_Print( " Requests the value of a variable specified by the string " ); SampleUtil_Print( " from the Picture Service of device ." ); SampleUtil_Print( " (e.g., \"PictGetVar 1 Tint\")" ); SampleUtil_Print( " Exit" ); SampleUtil_Print( " Exits the control point application." ); } /******************************************************************************** * TvCtrlPointPrintCommands * * Description: * Print the list of valid command line commands to the user * * Parameters: * None * ********************************************************************************/ void TvCtrlPointPrintCommands() { int i; int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands ); SampleUtil_Print( "Valid Commands:" ); for( i = 0; i < numofcmds; i++ ) { SampleUtil_Print( " %-14s %s", cmdloop_cmdlist[i].str, cmdloop_cmdlist[i].args ); } SampleUtil_Print( "" ); } /******************************************************************************** * TvCtrlPointCommandLoop * * Description: * Function that receives commands from the user at the command prompt * during the lifetime of the control point, and calls the appropriate * functions for those commands. * * Parameters: * None * ********************************************************************************/ void * TvCtrlPointCommandLoop( void *args ) { char cmdline[100]; while( 1 ) { SampleUtil_Print( "\n>> " ); fgets( cmdline, 100, stdin ); TvCtrlPointProcessCommand( cmdline ); } return NULL; } int TvCtrlPointProcessCommand( char *cmdline ) { char cmd[100]; char strarg[100]; int arg_val_err = -99999; int arg1 = arg_val_err; int arg2 = arg_val_err; int cmdnum = -1; int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands ); int cmdfound = 0; int i, rc; int invalidargs = 0; int validargs; validargs = sscanf( cmdline, "%s %d %d", cmd, &arg1, &arg2 ); for( i = 0; i < numofcmds; i++ ) { if( strcasecmp( cmd, cmdloop_cmdlist[i].str ) == 0 ) { cmdnum = cmdloop_cmdlist[i].cmdnum; cmdfound++; if( validargs != cmdloop_cmdlist[i].numargs ) invalidargs++; break; } } if( !cmdfound ) { SampleUtil_Print( "Command not found; try 'Help'" ); return TV_SUCCESS; } if( invalidargs ) { SampleUtil_Print( "Invalid arguments; try 'Help'" ); return TV_SUCCESS; } switch ( cmdnum ) { case PRTHELP: TvCtrlPointPrintShortHelp(); break; case PRTFULLHELP: TvCtrlPointPrintLongHelp(); break; case POWON: TvCtrlPointSendPowerOn( arg1 ); break; case POWOFF: TvCtrlPointSendPowerOff( arg1 ); break; case SETCHAN: TvCtrlPointSendSetChannel( arg1, arg2 ); break; case SETVOL: TvCtrlPointSendSetVolume( arg1, arg2 ); break; case SETCOL: TvCtrlPointSendSetColor( arg1, arg2 ); break; case SETTINT: TvCtrlPointSendSetTint( arg1, arg2 ); break; case SETCONT: TvCtrlPointSendSetContrast( arg1, arg2 ); break; case SETBRT: TvCtrlPointSendSetBrightness( arg1, arg2 ); break; case CTRLACTION: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointSendAction( TV_SERVICE_CONTROL, arg1, strarg, NULL, NULL, 0 ); else invalidargs++; break; case PICTACTION: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointSendAction( TV_SERVICE_PICTURE, arg1, strarg, NULL, NULL, 0 ); else invalidargs++; break; case CTRLGETVAR: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointGetVar( TV_SERVICE_CONTROL, arg1, strarg ); else invalidargs++; break; case PICTGETVAR: /* re-parse commandline since second arg is string */ validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); if( 3 == validargs ) TvCtrlPointGetVar( TV_SERVICE_PICTURE, arg1, strarg ); else invalidargs++; break; case PRTDEV: TvCtrlPointPrintDevice( arg1 ); break; case LSTDEV: TvCtrlPointPrintList(); break; case REFRESH: TvCtrlPointRefresh(); break; case EXITCMD: rc = TvCtrlPointStop(); exit( rc ); break; default: SampleUtil_Print( "Command not implemented; see 'Help'" ); break; } if( invalidargs ) SampleUtil_Print( "Invalid args in command; see 'Help'" ); return TV_SUCCESS; } int main( int argc, char **argv ) { int rc; ithread_t cmdloop_thread; #ifdef WIN32 #else int sig; sigset_t sigs_to_catch; #endif int code; rc = TvCtrlPointStart( linux_print, NULL ); if( rc != TV_SUCCESS ) { SampleUtil_Print( "Error starting UPnP TV Control Point" ); return rc; } /* start a command loop thread */ code = ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop, NULL ); #ifdef WIN32 ithread_join(cmdloop_thread, NULL); #else /* Catch Ctrl-C and properly shutdown */ sigemptyset( &sigs_to_catch ); sigaddset( &sigs_to_catch, SIGINT ); sigwait( &sigs_to_catch, &sig ); SampleUtil_Print( "Shutting down on signal %d...\n", sig ); #endif rc = TvCtrlPointStop(); return rc; } libupnp-1.8.0~svn20100507/upnp/sample/tvctrlpt/upnp_tv_ctrlpt.c0000644000175000017500000012574111360640052021241 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #include "upnp_tv_ctrlpt.h" #include "upnp.h" /*! Mutex for protecting the global device list in a multi-threaded, asynchronous environment. All functions should lock this mutex before reading or writing the device list. */ ithread_mutex_t DeviceListMutex; UpnpClient_Handle ctrlpt_handle = -1; char TvDeviceType[] = "urn:schemas-upnp-org:device:tvdevice:1"; char *TvServiceType[] = { "urn:schemas-upnp-org:service:tvcontrol:1", "urn:schemas-upnp-org:service:tvpicture:1" }; char *TvServiceName[] = { "Control", "Picture" }; /*! Global arrays for storing variable names and counts for TvControl and TvPicture services */ char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS] = { {"Power", "Channel", "Volume", ""}, {"Color", "Tint", "Contrast", "Brightness"} }; char TvVarCount[TV_SERVICE_SERVCOUNT] = { TV_CONTROL_VARCOUNT, TV_PICTURE_VARCOUNT }; /*! Timeout to request during subscriptions */ int default_timeout = 1801; /*! The first node in the global device list, or NULL if empty */ struct TvDeviceNode *GlobalDeviceList = NULL; /******************************************************************************** * TvCtrlPointDeleteNode * * Description: * Delete a device node from the global device list. Note that this * function is NOT thread safe, and should be called from another * function that has already locked the global device list. * * Parameters: * node -- The device node * ********************************************************************************/ int TvCtrlPointDeleteNode( struct TvDeviceNode *node ) { int rc, service, var; if( NULL == node ) { SampleUtil_Print( "ERROR: TvCtrlPointDeleteNode: Node is empty" ); return TV_ERROR; } for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { /* If we have a valid control SID, then unsubscribe */ if( strcmp( node->device.TvService[service].SID, "" ) != 0 ) { rc = UpnpUnSubscribe( ctrlpt_handle, node->device.TvService[service].SID ); if( UPNP_E_SUCCESS == rc ) { SampleUtil_Print ( "Unsubscribed from Tv %s EventURL with SID=%s", TvServiceName[service], node->device.TvService[service].SID ); } else { SampleUtil_Print ( "Error unsubscribing to Tv %s EventURL -- %d", TvServiceName[service], rc ); } } for( var = 0; var < TvVarCount[service]; var++ ) { if( node->device.TvService[service].VariableStrVal[var] ) { free( node->device.TvService[service]. VariableStrVal[var] ); } } } //Notify New Device Added SampleUtil_StateUpdate( NULL, NULL, node->device.UDN, DEVICE_REMOVED ); free( node ); node = NULL; return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointRemoveDevice * * Description: * Remove a device from the global device list. * * Parameters: * UDN -- The Unique Device Name for the device to remove * ********************************************************************************/ int TvCtrlPointRemoveDevice(const char *UDN) { struct TvDeviceNode *curdevnode; struct TvDeviceNode *prevdevnode; ithread_mutex_lock( &DeviceListMutex ); curdevnode = GlobalDeviceList; if( !curdevnode ) { SampleUtil_Print ( "WARNING: TvCtrlPointRemoveDevice: Device list empty" ); } else { if( 0 == strcmp( curdevnode->device.UDN, UDN ) ) { GlobalDeviceList = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); } else { prevdevnode = curdevnode; curdevnode = curdevnode->next; while( curdevnode ) { if( strcmp( curdevnode->device.UDN, UDN ) == 0 ) { prevdevnode->next = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); break; } prevdevnode = curdevnode; curdevnode = curdevnode->next; } } } ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointRemoveAll * * Description: * Remove all devices from the global device list. * * Parameters: * None * ********************************************************************************/ int TvCtrlPointRemoveAll( void ) { struct TvDeviceNode *curdevnode, *next; ithread_mutex_lock( &DeviceListMutex ); curdevnode = GlobalDeviceList; GlobalDeviceList = NULL; while( curdevnode ) { next = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); curdevnode = next; } ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointRefresh * * Description: * Clear the current global device list and issue new search * requests to build it up again from scratch. * * Parameters: * None * ********************************************************************************/ int TvCtrlPointRefresh( void ) { int rc; TvCtrlPointRemoveAll(); /* Search for all devices of type tvdevice version 1, waiting for up to 5 seconds for the response */ rc = UpnpSearchAsync( ctrlpt_handle, 5, TvDeviceType, NULL ); if( UPNP_E_SUCCESS != rc ) { SampleUtil_Print( "Error sending search request%d", rc ); return TV_ERROR; } return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointGetVar * * Description: * Send a GetVar request to the specified service of a device. * * Parameters: * service -- The service * devnum -- The number of the device (order in the list, * starting with 1) * varname -- The name of the variable to request. * ********************************************************************************/ int TvCtrlPointGetVar( int service, int devnum, char *varname ) { struct TvDeviceNode *devnode; int rc; ithread_mutex_lock( &DeviceListMutex ); rc = TvCtrlPointGetDevice( devnum, &devnode ); if( TV_SUCCESS == rc ) { rc = UpnpGetServiceVarStatusAsync( ctrlpt_handle, devnode->device. TvService[service].ControlURL, varname, TvCtrlPointCallbackEventHandler, NULL ); if( rc != UPNP_E_SUCCESS ) { SampleUtil_Print ( "Error in UpnpGetServiceVarStatusAsync -- %d", rc ); rc = TV_ERROR; } } ithread_mutex_unlock( &DeviceListMutex ); return rc; } int TvCtrlPointGetPower( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_CONTROL, devnum, "Power" ); } int TvCtrlPointGetChannel( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_CONTROL, devnum, "Channel" ); } int TvCtrlPointGetVolume( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_CONTROL, devnum, "Volume" ); } int TvCtrlPointGetColor( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Color" ); } int TvCtrlPointGetTint( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Tint" ); } int TvCtrlPointGetContrast( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Contrast" ); } int TvCtrlPointGetBrightness( int devnum ) { return TvCtrlPointGetVar( TV_SERVICE_PICTURE, devnum, "Brightness" ); } /******************************************************************************** * TvCtrlPointSendAction * * Description: * Send an Action request to the specified service of a device. * * Parameters: * service -- The service * devnum -- The number of the device (order in the list, * starting with 1) * actionname -- The name of the action. * param_name -- An array of parameter names * param_val -- The corresponding parameter values * param_count -- The number of parameters * ********************************************************************************/ int TvCtrlPointSendAction( int service, int devnum, char *actionname, char **param_name, char **param_val, int param_count ) { struct TvDeviceNode *devnode; IXML_Document *actionNode = NULL; int rc = TV_SUCCESS; int param; ithread_mutex_lock( &DeviceListMutex ); rc = TvCtrlPointGetDevice( devnum, &devnode ); if( TV_SUCCESS == rc ) { if( 0 == param_count ) { actionNode = UpnpMakeAction( actionname, TvServiceType[service], 0, NULL ); } else { for( param = 0; param < param_count; param++ ) { if( UpnpAddToAction ( &actionNode, actionname, TvServiceType[service], param_name[param], param_val[param] ) != UPNP_E_SUCCESS ) { SampleUtil_Print ( "ERROR: TvCtrlPointSendAction: Trying to add action param" ); //return -1; // TBD - BAD! leaves mutex locked } } } rc = UpnpSendActionAsync( ctrlpt_handle, devnode->device.TvService[service]. ControlURL, TvServiceType[service], NULL, actionNode, TvCtrlPointCallbackEventHandler, NULL ); if( rc != UPNP_E_SUCCESS ) { SampleUtil_Print( "Error in UpnpSendActionAsync -- %d", rc ); rc = TV_ERROR; } } ithread_mutex_unlock( &DeviceListMutex ); if( actionNode ) ixmlDocument_free( actionNode ); return rc; } /******************************************************************************** * TvCtrlPointSendActionNumericArg * * Description:Send an action with one argument to a device in the global device list. * * Parameters: * devnum -- The number of the device (order in the list, starting with 1) * service -- TV_SERVICE_CONTROL or TV_SERVICE_PICTURE * actionName -- The device action, i.e., "SetChannel" * paramName -- The name of the parameter that is being passed * paramValue -- Actual value of the parameter being passed * ********************************************************************************/ int TvCtrlPointSendActionNumericArg( int devnum, int service, char *actionName, char *paramName, int paramValue ) { char param_val_a[50]; char *param_val = param_val_a; sprintf( param_val_a, "%d", paramValue ); return TvCtrlPointSendAction( service, devnum, actionName, ¶mName, ¶m_val, 1 ); } int TvCtrlPointSendPowerOn( int devnum ) { return TvCtrlPointSendAction( TV_SERVICE_CONTROL, devnum, "PowerOn", NULL, NULL, 0 ); } int TvCtrlPointSendPowerOff( int devnum ) { return TvCtrlPointSendAction( TV_SERVICE_CONTROL, devnum, "PowerOff", NULL, NULL, 0 ); } int TvCtrlPointSendSetChannel( int devnum, int channel ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_CONTROL, "SetChannel", "Channel", channel ); } int TvCtrlPointSendSetVolume( int devnum, int volume ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_CONTROL, "SetVolume", "Volume", volume ); } int TvCtrlPointSendSetColor( int devnum, int color ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetColor", "Color", color ); } int TvCtrlPointSendSetTint( int devnum, int tint ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetTint", "Tint", tint ); } int TvCtrlPointSendSetContrast( int devnum, int contrast ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetContrast", "Contrast", contrast ); } int TvCtrlPointSendSetBrightness( int devnum, int brightness ) { return TvCtrlPointSendActionNumericArg( devnum, TV_SERVICE_PICTURE, "SetBrightness", "Brightness", brightness ); } /******************************************************************************** * TvCtrlPointGetDevice * * Description: * Given a list number, returns the pointer to the device * node at that position in the global device list. Note * that this function is not thread safe. It must be called * from a function that has locked the global device list. * * Parameters: * devnum -- The number of the device (order in the list, * starting with 1) * devnode -- The output device node pointer * ********************************************************************************/ int TvCtrlPointGetDevice( int devnum, struct TvDeviceNode **devnode ) { int count = devnum; struct TvDeviceNode *tmpdevnode = NULL; if( count ) tmpdevnode = GlobalDeviceList; while( --count && tmpdevnode ) { tmpdevnode = tmpdevnode->next; } if( !tmpdevnode ) { SampleUtil_Print( "Error finding TvDevice number -- %d", devnum ); return TV_ERROR; } *devnode = tmpdevnode; return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointPrintList * * Description: * Print the universal device names for each device in the global device list * * Parameters: * None * ********************************************************************************/ int TvCtrlPointPrintList() { struct TvDeviceNode *tmpdevnode; int i = 0; ithread_mutex_lock( &DeviceListMutex ); SampleUtil_Print( "TvCtrlPointPrintList:" ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { SampleUtil_Print( " %3d -- %s", ++i, tmpdevnode->device.UDN ); tmpdevnode = tmpdevnode->next; } SampleUtil_Print( "" ); ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointPrintDevice * * Description: * Print the identifiers and state table for a device from * the global device list. * * Parameters: * devnum -- The number of the device (order in the list, * starting with 1) * ********************************************************************************/ int TvCtrlPointPrintDevice( int devnum ) { struct TvDeviceNode *tmpdevnode; int i = 0, service, var; char spacer[15]; if( devnum <= 0 ) { SampleUtil_Print ( "Error in TvCtrlPointPrintDevice: invalid devnum = %d", devnum ); return TV_ERROR; } ithread_mutex_lock( &DeviceListMutex ); SampleUtil_Print( "TvCtrlPointPrintDevice:" ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { i++; if( i == devnum ) break; tmpdevnode = tmpdevnode->next; } if( !tmpdevnode ) { SampleUtil_Print ( "Error in TvCtrlPointPrintDevice: invalid devnum = %d -- actual device count = %d", devnum, i ); } else { SampleUtil_Print( " TvDevice -- %d", devnum ); SampleUtil_Print( " | " ); SampleUtil_Print( " +- UDN = %s", tmpdevnode->device.UDN ); SampleUtil_Print( " +- DescDocURL = %s", tmpdevnode->device.DescDocURL ); SampleUtil_Print( " +- FriendlyName = %s", tmpdevnode->device.FriendlyName ); SampleUtil_Print( " +- PresURL = %s", tmpdevnode->device.PresURL ); SampleUtil_Print( " +- Adver. TimeOut = %d", tmpdevnode->device.AdvrTimeOut ); for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( service < TV_SERVICE_SERVCOUNT - 1 ) sprintf( spacer, " | " ); else sprintf( spacer, " " ); SampleUtil_Print( " | " ); SampleUtil_Print( " +- Tv %s Service", TvServiceName[service] ); SampleUtil_Print( "%s+- ServiceId = %s", spacer, tmpdevnode->device.TvService[service]. ServiceId ); SampleUtil_Print( "%s+- ServiceType = %s", spacer, tmpdevnode->device.TvService[service]. ServiceType ); SampleUtil_Print( "%s+- EventURL = %s", spacer, tmpdevnode->device.TvService[service]. EventURL ); SampleUtil_Print( "%s+- ControlURL = %s", spacer, tmpdevnode->device.TvService[service]. ControlURL ); SampleUtil_Print( "%s+- SID = %s", spacer, tmpdevnode->device.TvService[service].SID ); SampleUtil_Print( "%s+- ServiceStateTable", spacer ); for( var = 0; var < TvVarCount[service]; var++ ) { SampleUtil_Print( "%s +- %-10s = %s", spacer, TvVarName[service][var], tmpdevnode->device.TvService[service]. VariableStrVal[var] ); } } } SampleUtil_Print( "" ); ithread_mutex_unlock( &DeviceListMutex ); return TV_SUCCESS; } /******************************************************************************** * TvCtrlPointAddDevice * * Description: * If the device is not already included in the global device list, * add it. Otherwise, update its advertisement expiration timeout. * * Parameters: * DescDoc -- The description document for the device * location -- The location of the description document URL * expires -- The expiration time for this advertisement * ********************************************************************************/ void TvCtrlPointAddDevice( IXML_Document *DescDoc, const char *location, int expires ) { char *deviceType = NULL; char *friendlyName = NULL; char presURL[200]; char *baseURL = NULL; char *relURL = NULL; char *UDN = NULL; char *serviceId[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; char *eventURL[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; char *controlURL[TV_SERVICE_SERVCOUNT] = { NULL, NULL }; Upnp_SID eventSID[TV_SERVICE_SERVCOUNT]; int TimeOut[TV_SERVICE_SERVCOUNT] = { default_timeout, default_timeout }; struct TvDeviceNode *deviceNode; struct TvDeviceNode *tmpdevnode; int ret = 1; int found = 0; int service; int var; ithread_mutex_lock( &DeviceListMutex ); /* Read key elements from description document */ UDN = SampleUtil_GetFirstDocumentItem( DescDoc, "UDN" ); deviceType = SampleUtil_GetFirstDocumentItem( DescDoc, "deviceType" ); friendlyName = SampleUtil_GetFirstDocumentItem( DescDoc, "friendlyName" ); baseURL = SampleUtil_GetFirstDocumentItem( DescDoc, "URLBase" ); relURL = SampleUtil_GetFirstDocumentItem( DescDoc, "presentationURL" ); ret = UpnpResolveURL( ( baseURL ? baseURL : location ), relURL, presURL); if( UPNP_E_SUCCESS != ret ) SampleUtil_Print( "Error generating presURL from %s + %s", baseURL, relURL ); if( strcmp( deviceType, TvDeviceType ) == 0 ) { SampleUtil_Print( "Found Tv device" ); // Check if this device is already in the list tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { if( strcmp( tmpdevnode->device.UDN, UDN ) == 0 ) { found = 1; break; } tmpdevnode = tmpdevnode->next; } if( found ) { // The device is already there, so just update // the advertisement timeout field tmpdevnode->device.AdvrTimeOut = expires; } else { for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( SampleUtil_FindAndParseService ( DescDoc, location, TvServiceType[service], &serviceId[service], &eventURL[service], &controlURL[service] ) ) { SampleUtil_Print( "Subscribing to EventURL %s...", eventURL[service] ); ret = UpnpSubscribe( ctrlpt_handle, eventURL[service], &TimeOut[service], eventSID[service] ); if( ret == UPNP_E_SUCCESS ) { SampleUtil_Print ( "Subscribed to EventURL with SID=%s", eventSID[service] ); } else { SampleUtil_Print ( "Error Subscribing to EventURL -- %d", ret ); strcpy( eventSID[service], "" ); } } else { SampleUtil_Print( "Error: Could not find Service: %s", TvServiceType[service] ); } } /* Create a new device node */ deviceNode = ( struct TvDeviceNode * ) malloc( sizeof( struct TvDeviceNode ) ); strcpy( deviceNode->device.UDN, UDN ); strcpy( deviceNode->device.DescDocURL, location ); strcpy( deviceNode->device.FriendlyName, friendlyName ); strcpy( deviceNode->device.PresURL, presURL ); deviceNode->device.AdvrTimeOut = expires; for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { strcpy( deviceNode->device.TvService[service].ServiceId, serviceId[service] ); strcpy( deviceNode->device.TvService[service].ServiceType, TvServiceType[service] ); strcpy( deviceNode->device.TvService[service].ControlURL, controlURL[service] ); strcpy( deviceNode->device.TvService[service].EventURL, eventURL[service] ); strcpy( deviceNode->device.TvService[service].SID, eventSID[service] ); for( var = 0; var < TvVarCount[service]; var++ ) { deviceNode->device.TvService[service]. VariableStrVal[var] = ( char * )malloc( TV_MAX_VAL_LEN ); strcpy( deviceNode->device.TvService[service]. VariableStrVal[var], "" ); } } deviceNode->next = NULL; // Insert the new device node in the list if( ( tmpdevnode = GlobalDeviceList ) ) { while( tmpdevnode ) { if( tmpdevnode->next ) { tmpdevnode = tmpdevnode->next; } else { tmpdevnode->next = deviceNode; break; } } } else { GlobalDeviceList = deviceNode; } //Notify New Device Added SampleUtil_StateUpdate( NULL, NULL, deviceNode->device.UDN, DEVICE_ADDED ); } } ithread_mutex_unlock( &DeviceListMutex ); if( deviceType ) free( deviceType ); if( friendlyName ) free( friendlyName ); if( UDN ) free( UDN ); if( baseURL ) free( baseURL ); if( relURL ) free( relURL ); for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( serviceId[service] ) free( serviceId[service] ); if( controlURL[service] ) free( controlURL[service] ); if( eventURL[service] ) free( eventURL[service] ); } } /******************************************************************************** * TvStateUpdate * * Description: * Update a Tv state table. Called when an event is * received. Note: this function is NOT thread save. It must be * called from another function that has locked the global device list. * * Parameters: * UDN -- The UDN of the parent device. * Service -- The service state table to update * ChangedVariables -- DOM document representing the XML received * with the event * State -- pointer to the state table for the Tv service * to update * ********************************************************************************/ void TvStateUpdate( char *UDN, int Service, IXML_Document * ChangedVariables, char **State ) { IXML_NodeList *properties, *variables; IXML_Element *property, *variable; int length, length1; int i, j; char *tmpstate = NULL; SampleUtil_Print( "Tv State Update (service %d): ", Service ); /* Find all of the e:property tags in the document */ properties = ixmlDocument_getElementsByTagName( ChangedVariables, "e:property" ); if( NULL != properties ) { length = ixmlNodeList_length( properties ); for( i = 0; i < length; i++ ) { /* Loop through each property change found */ property = ( IXML_Element * ) ixmlNodeList_item( properties, i ); /* For each variable name in the state table, check if this is a corresponding property change */ for( j = 0; j < TvVarCount[Service]; j++ ) { variables = ixmlElement_getElementsByTagName( property, TvVarName[Service] [j] ); /* If a match is found, extract the value, and update the state table */ if( variables ) { length1 = ixmlNodeList_length( variables ); if( length1 ) { variable = ( IXML_Element * ) ixmlNodeList_item( variables, 0 ); tmpstate = SampleUtil_GetElementValue( variable ); if( tmpstate ) { strcpy( State[j], tmpstate ); SampleUtil_Print ( " Variable Name: %s New Value:'%s'", TvVarName[Service][j], State[j] ); } if( tmpstate ) free( tmpstate ); tmpstate = NULL; } ixmlNodeList_free( variables ); variables = NULL; } } } ixmlNodeList_free( properties ); } } /******************************************************************************** * TvCtrlPointHandleEvent * * Description: * Handle a UPnP event that was received. Process the event and update * the appropriate service state table. * * Parameters: * sid -- The subscription id for the event * eventkey -- The eventkey number for the event * changes -- The DOM document representing the changes * ********************************************************************************/ void TvCtrlPointHandleEvent( const UpnpString *sid, int evntkey, IXML_Document *changes) { struct TvDeviceNode *tmpdevnode; int service; const char *aux_sid = NULL; ithread_mutex_lock(&DeviceListMutex); tmpdevnode = GlobalDeviceList; while (tmpdevnode) { for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) { aux_sid = UpnpString_get_String(sid); if (strcmp(tmpdevnode->device.TvService[service].SID, aux_sid) == 0) { SampleUtil_Print("Received Tv %s Event: %d for SID %s", TvServiceName[service], evntkey, aux_sid); TvStateUpdate( tmpdevnode->device.UDN, service, changes, (char **)&tmpdevnode->device.TvService[service].VariableStrVal); break; } } tmpdevnode = tmpdevnode->next; } ithread_mutex_unlock(&DeviceListMutex); } /******************************************************************************** * TvCtrlPointHandleSubscribeUpdate * * Description: * Handle a UPnP subscription update that was received. Find the * service the update belongs to, and update its subscription * timeout. * * Parameters: * eventURL -- The event URL for the subscription * sid -- The subscription id for the subscription * timeout -- The new timeout for the subscription * ********************************************************************************/ void TvCtrlPointHandleSubscribeUpdate( const char *eventURL, const Upnp_SID sid, int timeout) { struct TvDeviceNode *tmpdevnode; int service; ithread_mutex_lock( &DeviceListMutex ); tmpdevnode = GlobalDeviceList; while( tmpdevnode ) { for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) { if( strcmp ( tmpdevnode->device.TvService[service].EventURL, eventURL ) == 0 ) { SampleUtil_Print ( "Received Tv %s Event Renewal for eventURL %s", TvServiceName[service], eventURL ); strcpy( tmpdevnode->device.TvService[service].SID, sid ); break; } } tmpdevnode = tmpdevnode->next; } ithread_mutex_unlock( &DeviceListMutex ); } void TvCtrlPointHandleGetVar( const char *controlURL, const char *varName, const DOMString varValue ) { struct TvDeviceNode *tmpdevnode; int service; ithread_mutex_lock( &DeviceListMutex ); tmpdevnode = GlobalDeviceList; while (tmpdevnode) { for (service = 0; service < TV_SERVICE_SERVCOUNT; service++) { if (strcmp(tmpdevnode->device.TvService[service].ControlURL, controlURL ) == 0 ) { SampleUtil_StateUpdate( varName, varValue, tmpdevnode->device.UDN, GET_VAR_COMPLETE ); break; } } tmpdevnode = tmpdevnode->next; } ithread_mutex_unlock( &DeviceListMutex ); } /******************************************************************************** * TvCtrlPointCallbackEventHandler * * Description: * The callback handler registered with the SDK while registering * the control point. Detects the type of callback, and passes the * request on to the appropriate function. * * Parameters: * EventType -- The type of callback event * Event -- Data structure containing event data * Cookie -- Optional data specified during callback registration * ********************************************************************************/ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie) { int errCode = 0; SampleUtil_PrintEvent(EventType, Event); switch ( EventType ) { /* SSDP Stuff */ case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE: case UPNP_DISCOVERY_SEARCH_RESULT: { UpnpDiscovery *d_event = (UpnpDiscovery *)Event; IXML_Document *DescDoc = NULL; const char *location = NULL; int errCode = UpnpDiscovery_get_ErrCode(d_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Discovery Callback -- %d", errCode); } location = UpnpString_get_String(UpnpDiscovery_get_Location(d_event)); errCode = UpnpDownloadXmlDoc(location, &DescDoc); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error obtaining device description from %s -- error = %d", location, errCode); } else { TvCtrlPointAddDevice( DescDoc, location, UpnpDiscovery_get_Expires(d_event)); } if( DescDoc ) { ixmlDocument_free(DescDoc); } TvCtrlPointPrintList(); break; } case UPNP_DISCOVERY_SEARCH_TIMEOUT: /* Nothing to do here... */ break; case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: { UpnpDiscovery *d_event = (UpnpDiscovery *)Event; int errCode = UpnpDiscovery_get_ErrCode(d_event); const char *deviceId = UpnpString_get_String( UpnpDiscovery_get_DeviceID(d_event)); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Discovery ByeBye Callback -- %d", errCode); } SampleUtil_Print("Received ByeBye for Device: %s", deviceId); TvCtrlPointRemoveDevice(deviceId); SampleUtil_Print("After byebye:"); TvCtrlPointPrintList(); break; } /* SOAP Stuff */ case UPNP_CONTROL_ACTION_COMPLETE: { UpnpActionComplete *a_event = (UpnpActionComplete *)Event; int errCode = UpnpActionComplete_get_ErrCode(a_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Action Complete Callback -- %d", errCode); } /* No need for any processing here, just print out results. * Service state table updates are handled by events. */ break; } case UPNP_CONTROL_GET_VAR_COMPLETE: { UpnpStateVarComplete *sv_event = (UpnpStateVarComplete *)Event; int errCode = UpnpStateVarComplete_get_ErrCode(sv_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Get Var Complete Callback -- %d", errCode ); } else { TvCtrlPointHandleGetVar( UpnpString_get_String(UpnpStateVarComplete_get_CtrlUrl(sv_event)), UpnpString_get_String(UpnpStateVarComplete_get_StateVarName(sv_event)), UpnpStateVarComplete_get_CurrentVal(sv_event) ); } break; } /* GENA Stuff */ case UPNP_EVENT_RECEIVED: { UpnpEvent *e_event = (UpnpEvent *)Event; TvCtrlPointHandleEvent( UpnpEvent_get_SID(e_event), UpnpEvent_get_EventKey(e_event), UpnpEvent_get_ChangedVariables(e_event)); break; } case UPNP_EVENT_SUBSCRIBE_COMPLETE: case UPNP_EVENT_UNSUBSCRIBE_COMPLETE: case UPNP_EVENT_RENEWAL_COMPLETE: { UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; errCode = UpnpEventSubscribe_get_ErrCode(es_event); if (errCode != UPNP_E_SUCCESS) { SampleUtil_Print( "Error in Event Subscribe Callback -- %d", errCode); } else { TvCtrlPointHandleSubscribeUpdate( UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), UpnpString_get_String(UpnpEventSubscribe_get_SID(es_event)), UpnpEventSubscribe_get_TimeOut(es_event)); } break; } case UPNP_EVENT_AUTORENEWAL_FAILED: case UPNP_EVENT_SUBSCRIPTION_EXPIRED: { UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; int TimeOut = default_timeout; Upnp_SID newSID; errCode = UpnpSubscribe( ctrlpt_handle, UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), &TimeOut, newSID); if (errCode == UPNP_E_SUCCESS) { SampleUtil_Print("Subscribed to EventURL with SID=%s", newSID); TvCtrlPointHandleSubscribeUpdate( UpnpString_get_String(UpnpEventSubscribe_get_PublisherUrl(es_event)), newSID, TimeOut); } else { SampleUtil_Print("Error Subscribing to EventURL -- %d", errCode); } break; } /* ignore these cases, since this is not a device */ case UPNP_EVENT_SUBSCRIPTION_REQUEST: case UPNP_CONTROL_GET_VAR_REQUEST: case UPNP_CONTROL_ACTION_REQUEST: break; } return 0; } /******************************************************************************** * TvCtrlPointVerifyTimeouts * * Description: * Checks the advertisement each device * in the global device list. If an advertisement expires, * the device is removed from the list. If an advertisement is about to * expire, a search request is sent for that device. * * Parameters: * incr -- The increment to subtract from the timeouts each time the * function is called. * ********************************************************************************/ void TvCtrlPointVerifyTimeouts( int incr ) { struct TvDeviceNode *prevdevnode, *curdevnode; int ret; ithread_mutex_lock( &DeviceListMutex ); prevdevnode = NULL; curdevnode = GlobalDeviceList; while( curdevnode ) { curdevnode->device.AdvrTimeOut -= incr; //SampleUtil_Print("Advertisement Timeout: %d\n", curdevnode->device.AdvrTimeOut); if( curdevnode->device.AdvrTimeOut <= 0 ) { /* This advertisement has expired, so we should remove the device from the list */ if( GlobalDeviceList == curdevnode ) GlobalDeviceList = curdevnode->next; else prevdevnode->next = curdevnode->next; TvCtrlPointDeleteNode( curdevnode ); if( prevdevnode ) curdevnode = prevdevnode->next; else curdevnode = GlobalDeviceList; } else { if( curdevnode->device.AdvrTimeOut < 2 * incr ) { /* This advertisement is about to expire, so send out a search request for this device UDN to try to renew */ ret = UpnpSearchAsync( ctrlpt_handle, incr, curdevnode->device.UDN, NULL ); if( ret != UPNP_E_SUCCESS ) SampleUtil_Print ( "Error sending search request for Device UDN: %s -- err = %d", curdevnode->device.UDN, ret ); } prevdevnode = curdevnode; curdevnode = curdevnode->next; } } ithread_mutex_unlock( &DeviceListMutex ); } /******************************************************************************** * TvCtrlPointTimerLoop * * Description: * Function that runs in its own thread and monitors advertisement * and subscription timeouts for devices in the global device list. * * Parameters: * None * ********************************************************************************/ static int TvCtrlPointTimerLoopRun = 1; void *TvCtrlPointTimerLoop(void *args) { int incr = 30; // how often to verify the timeouts, in seconds while (TvCtrlPointTimerLoopRun) { isleep( incr ); TvCtrlPointVerifyTimeouts( incr ); } return NULL; } /******************************************************************************** * TvCtrlPointStart * * Description: * Call this function to initialize the UPnP library and start the TV Control * Point. This function creates a timer thread and provides a callback * handler to process any UPnP events that are received. * * Parameters: * None * * Returns: * TV_SUCCESS if everything went well, else TV_ERROR * ********************************************************************************/ int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionPtr) { ithread_t timer_thread; int rc; unsigned short port = 0; char *ip_address = NULL; SampleUtil_Initialize(printFunctionPtr); SampleUtil_RegisterUpdateFunction(updateFunctionPtr); ithread_mutex_init(&DeviceListMutex, 0); SampleUtil_Print( "Initializing UPnP Sdk with\n" "\tipaddress = %s port = %u\n", ip_address, port); rc = UpnpInit(ip_address, port); if (rc != UPNP_E_SUCCESS) { SampleUtil_Print("WinCEStart: UpnpInit() Error: %d", rc); UpnpFinish(); return TV_ERROR; } if (!ip_address) { ip_address = UpnpGetServerIpAddress(); } if (!port) { port = UpnpGetServerPort(); } SampleUtil_Print( "UPnP Initialized\n" "\tipaddress= %s port = %u\n", ip_address, port); SampleUtil_Print("Registering Control Point"); rc = UpnpRegisterClient(TvCtrlPointCallbackEventHandler, &ctrlpt_handle, &ctrlpt_handle); if (rc != UPNP_E_SUCCESS) { SampleUtil_Print( "Error registering CP: %d", rc ); UpnpFinish(); return TV_ERROR; } SampleUtil_Print("Control Point Registered"); TvCtrlPointRefresh(); /* start a timer thread */ ithread_create(&timer_thread, NULL, TvCtrlPointTimerLoop, NULL); ithread_detach(timer_thread); return TV_SUCCESS; } int TvCtrlPointStop(void) { TvCtrlPointTimerLoopRun = 0; TvCtrlPointRemoveAll(); UpnpUnRegisterClient( ctrlpt_handle ); UpnpFinish(); SampleUtil_Finish(); return TV_SUCCESS; } libupnp-1.8.0~svn20100507/upnp/sample/tvctrlpt/upnp_tv_ctrlpt.h0000644000175000017500000001226011021325542021233 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef UPNP_TV_CTRLPT_H #define UPNP_TV_CTRLPT_H #ifdef __cplusplus extern "C" { #endif #include "sample_util.h" #include "ithread.h" #include "upnp.h" #include "upnptools.h" #include #include #include #include #include #ifdef WIN32 /* Do not #include */ #else #include #endif #define TV_SERVICE_SERVCOUNT 2 #define TV_SERVICE_CONTROL 0 #define TV_SERVICE_PICTURE 1 #define TV_CONTROL_VARCOUNT 3 #define TV_CONTROL_POWER 0 #define TV_CONTROL_CHANNEL 1 #define TV_CONTROL_VOLUME 2 #define TV_PICTURE_VARCOUNT 4 #define TV_PICTURE_COLOR 0 #define TV_PICTURE_TINT 1 #define TV_PICTURE_CONTRAST 2 #define TV_PICTURE_BRIGHTNESS 3 #define TV_MAX_VAL_LEN 5 #define TV_SUCCESS 0 #define TV_ERROR (-1) #define TV_WARNING 1 /* This should be the maximum VARCOUNT from above */ #define TV_MAXVARS TV_PICTURE_VARCOUNT extern char TvDeviceType[]; extern char *TvServiceType[]; extern char *TvServiceName[]; extern char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS]; extern char TvVarCount[]; struct tv_service { char ServiceId[NAME_SIZE]; char ServiceType[NAME_SIZE]; char *VariableStrVal[TV_MAXVARS]; char EventURL[NAME_SIZE]; char ControlURL[NAME_SIZE]; char SID[NAME_SIZE]; }; extern struct TvDeviceNode *GlobalDeviceList; struct TvDevice { char UDN[250]; char DescDocURL[250]; char FriendlyName[250]; char PresURL[250]; int AdvrTimeOut; struct tv_service TvService[TV_SERVICE_SERVCOUNT]; }; struct TvDeviceNode { struct TvDevice device; struct TvDeviceNode *next; }; extern ithread_mutex_t DeviceListMutex; extern UpnpClient_Handle ctrlpt_handle; void TvCtrlPointPrintHelp(); int TvCtrlPointDeleteNode(struct TvDeviceNode*); int TvCtrlPointRemoveDevice(const char *); int TvCtrlPointRemoveAll(); int TvCtrlPointRefresh(); int TvCtrlPointSendAction(int, int, char *, char **, char **, int); int TvCtrlPointSendActionNumericArg(int devnum, int service, char *actionName, char *paramName, int paramValue); int TvCtrlPointSendPowerOn(int devnum); int TvCtrlPointSendPowerOff(int devnum); int TvCtrlPointSendSetChannel(int, int); int TvCtrlPointSendSetVolume(int, int); int TvCtrlPointSendSetColor(int, int); int TvCtrlPointSendSetTint(int, int); int TvCtrlPointSendSetContrast(int, int); int TvCtrlPointSendSetBrightness(int, int); int TvCtrlPointGetVar(int, int, char*); int TvCtrlPointGetPower(int devnum); int TvCtrlPointGetChannel(int); int TvCtrlPointGetVolume(int); int TvCtrlPointGetColor(int); int TvCtrlPointGetTint(int); int TvCtrlPointGetContrast(int); int TvCtrlPointGetBrightness(int); int TvCtrlPointGetDevice(int, struct TvDeviceNode **); int TvCtrlPointPrintList( void ); int TvCtrlPointPrintDevice(int); void TvCtrlPointAddDevice(IXML_Document *, const char *, int); void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString); void TvStateUpdate(char*,int, IXML_Document * , char **); void TvCtrlPointHandleEvent(const UpnpString *, int, IXML_Document *); void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int); int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *); void TvCtrlPointVerifyTimeouts(int); void TvCtrlPointPrintCommands( void ); void* TvCtrlPointCommandLoop( void* ); int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr ); int TvCtrlPointStop( void ); int TvCtrlPointProcessCommand( char *cmdline ); #ifdef __cplusplus }; #endif #endif //UPNP_TV_CTRLPT_H libupnp-1.8.0~svn20100507/LICENSE0000644000175000017500000000273311021325542012663 00000000000000Copyright (c) 2000-2003 Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. libupnp-1.8.0~svn20100507/build/0000777000175000017500000000000011373047467013055 500000000000000libupnp-1.8.0~svn20100507/build/inc/0000777000175000017500000000000011373047467013626 500000000000000libupnp-1.8.0~svn20100507/build/inc/config.h0000644000175000017500000002522211042015421015135 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #ifndef INTERNAL_CONFIG_H #define INTERNAL_CONFIG_H #include "autoconfig.h" /*! * \name Compile time configuration options * * The Linux SDK for UPnP Devices contains some compile-time parameters * that effect the behavior of the SDK. All configuration options are * located in {\tt src/inc/config.h}. * * @{ */ /*! * \name THREAD_IDLE_TIME * * The {\tt THREAD_IDLE_TIME} constant determines when a thread will be * removed from the thread pool and returned to the operating system. When * a thread in the thread pool has been idle for this number of milliseconds * the thread will be released from the thread pool. The default value is * 5000 milliseconds (5 seconds). * * @{ */ #define THREAD_IDLE_TIME 5000 /* @} */ /*! * \name JOBS_PER_THREAD * * The {\tt JOBS_PER_THREAD} constant determines when a new thread will be * allocated to the thread pool inside the SDK. The thread pool will * try and maintain this jobs/thread ratio. When the jobs/thread ratio * becomes greater than this, then a new thread (up to the max) will be * allocated to the thread pool. The default ratio is 10 jobs/thread. * * @{ */ #define JOBS_PER_THREAD 10 /* @} */ /*! * \name MIN_THREADS * * The {\tt MIN_THREADS} constant defines the minimum number of threads the * thread pool inside the SDK will create. The thread pool will * always have this number of threads. These threads are used * for both callbacks into applications built on top of the SDK and also * for making connections to other control points and devices. This number * includes persistent threads. The default value is two threads. * * @{ */ #define MIN_THREADS 2 /* @} */ /*! * \name MAX_THREADS * * The {\tt MAX_THREADS} constant defines the maximum number of threads the * thread pool inside the SDK will create. These threads are used * for both callbacks into applications built on top of the library and also * for making connections to other control points and devices. It is not * recommended that this value be below 10, since the threads are * necessary for correct operation. This value can be increased for greater * performance in operation at the expense of greater memory overhead. The * default value is 12. * * @{ */ #define MAX_THREADS 12 /* @} */ /*! \name MAX_JOBS_TOTAL * * The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs * that can be queued. If this limit is reached further jobs will be thrown * to avoid memory exhaustion. The default value 100. * (Added by Axis.) * * @{ */ #define MAX_JOBS_TOTAL 100 /* @} */ /*! * \name DEFAULT_SOAP_CONTENT_LENGTH * * SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes. * This prevents devices that have a misbehaving web server to send * a large amount of data to the control point causing it to crash. * This can be adjusted dynamically with {\tt UpnpSetMaxContentLength}. * * @{ */ #define DEFAULT_SOAP_CONTENT_LENGTH 16000 /* @} */ /*! * \name NUM_SSDP_COPY * * This configuration parameter determines how many copies of each SSDP * advertisement and search packets will be sent. By default it will send two * copies of every packet. * * @{ */ #define NUM_SSDP_COPY 2 /* @} */ /*! * \name SSDP_PAUSE * * This configuration parameter determines the pause between identical SSDP * advertisement and search packets. The pause is measured in milliseconds * and defaults to 100. * * @{ */ #define SSDP_PAUSE 100 /* @} */ /*! * \name WEB_SERVER_BUF_SIZE * * This configuration parameter sets the maximum buffer size for the * webserver. The default value is 1MB. * * @{ */ #define WEB_SERVER_BUF_SIZE (1024*1024) /* @} */ /*! * \name AUTO_RENEW_TIME * * The {\tt AUTO_RENEW_TIME} is the time, in seconds, before a subscription * expires that the SDK automatically resubscribes. The default * value is 10 seconds. Setting this value too low can result in the * subscription renewal not making it to the device in time, causing the * subscription to timeout. In order to avoid continually resubscribing * the minimum subscription time is five seconds more than the auto renew * time. * * @{ */ #define AUTO_RENEW_TIME 10 /* @} */ /*! * \name CP_MINIMUM_SUBSCRIPTION_TIME * * The {\tt CP_MINIMUM_SUBSCRIPTION_TIME} is the minimum subscription time * allowed for a control point using the SDK. Subscribing for less than * this time automatically results in a subscription for this amount. The * default value is 5 seconds more than the {\tt AUTO_RENEW_TIME}, or 15 * seconds. * * @{ */ #define CP_MINIMUM_SUBSCRIPTION_TIME (AUTO_RENEW_TIME + 5) /* @} */ /*! * \name MAX_SEARCH_TIME * * The {\tt MAX_SEARCH_TIME} is the maximum time * allowed for an SSDP search by a control point. Searching for greater than * this time automatically results in a search for this amount. The default * value is 80 seconds. * * @{ */ #define MAX_SEARCH_TIME 80 /* @} */ /*! * \name MIN_SEARCH_TIME * * The {\tt MIN_SEARCH_TIME} is the minimumm time * allowed for an SSDP search by a control point. Searching for less than * this time automatically results in a search for this amount. The default * value is 2 seconds. * * @{ */ #define MIN_SEARCH_TIME 2 /* @} */ /*! * \name AUTO_ADVERTISEMENT_TIME * * The {\tt AUTO_ADVERTISEMENT_TIME} is the time, in seconds, before an * device advertisements expires before a renewed advertisement is sent. * The default time is 30 seconds. * * @{ */ #define AUTO_ADVERTISEMENT_TIME 30 /* @} */ /*! * \name SSDP_PACKET_DISTRIBUTE * * The {\tt SSDP_PACKET_DISTRIBUTE} enables the SSDP packets to be sent * at an interval equal to half of the expiration time of SSDP packets * minus the AUTO_ADVERTISEMENT_TIME. This is used to increase * the probability of SSDP packets reaching to control points. * It is recommended that this flag be turned on for embedded wireless * devices. * * @{ */ #define SSDP_PACKET_DISTRIBUTE 1 /* @} */ /*! * \name Module Exclusion * * Depending on the requirements, the user can selectively discard any of * the major modules like SOAP, GENA, SSDP or the Internal web server. By * default everything is included inside the SDK. By setting any of * the values below to 0, that component will not be included in the final * SDK. * \begin{itemize} * \item {\tt EXCLUDE_SOAP[0,1]} * \item {\tt EXCLUDE_GENA[0,1]} * \item {\tt EXCLUDE_SSDP[0,1]} * \item {\tt EXCLUDE_DOM [0,1]} * \item {\tt EXCLUDE_MINISERVER[0,1]} * \item {\tt EXCLUDE_WEB_SERVER[0,1]} * \item {\tt EXCLUDE_JNI[0,1]} * \end{itemize} * * @{ */ #define EXCLUDE_SSDP 0 #define EXCLUDE_SOAP 0 #define EXCLUDE_GENA 0 #define EXCLUDE_DOM 0 #define EXCLUDE_MINISERVER 0 #define EXCLUDE_WEB_SERVER 0 #ifdef USE_JNI # define EXCLUDE_JNI 0 #else # define EXCLUDE_JNI 1 #endif /* @} */ /*! * \name DEBUG_TARGET * * The user has the option to redirect the library output debug messages * to either the screen or to a log file. All the output messages with * debug level 0 will go to {\tt upnp.err} and messages with debug level * greater than zero will be redirected to {\tt upnp.out}. * * @{ */ #define DEBUG_TARGET 1 /* @} */ /*! * \name Other debugging features * * The UPnP SDK contains other features to aid in debugging: * see */ #define DEBUG_ALL 1 #define DEBUG_SSDP 0 #define DEBUG_SOAP 0 #define DEBUG_GENA 0 #define DEBUG_TPOOL 0 #define DEBUG_MSERV 0 #define DEBUG_DOM 0 #define DEBUG_HTTP 0 #define DEBUG_API 0 /* * @} Compile time configuration options */ /*************************************************************************** * Do not change, Internal purpose only!!! ***************************************************************************/ /*! * @{ */ /* * Set additional defines based on requested configuration */ /* configure --enable-client */ #if UPNP_HAVE_CLIENT # define INCLUDE_CLIENT_APIS 1 #endif /* configure --enable-device */ #if UPNP_HAVE_DEVICE # define INCLUDE_DEVICE_APIS 1 #endif /* configure --enable-webserver --enable-device */ #if UPNP_HAVE_WEBSERVER # define INTERNAL_WEB_SERVER 1 #endif #undef EXCLUDE_WEB_SERVER #undef EXCLUDE_MINISERVER #ifdef INTERNAL_WEB_SERVER # define EXCLUDE_WEB_SERVER 0 # define EXCLUDE_MINISERVER 0 #else # define EXCLUDE_WEB_SERVER 1 # define EXCLUDE_MINISERVER 1 #endif #if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1 # undef EXCLUDE_MINISERVER # define EXCLUDE_MINISERVER 1 # if INTERNAL_WEB_SERVER # error "conflicting settings: use configure --disable-webserver" # endif #endif #if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0 # undef EXCLUDE_MINISERVER # define EXCLUDE_MINISERVER 0 # if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER # error "conflicting settings : use configure --enable-webserver" # endif #endif #ifdef INCLUDE_CLIENT_APIS # define CLIENTONLY(x) x #else /* INCLUDE_CLIENT_APIS */ # define CLIENTONLY(x) #endif /* INCLUDE_CLIENT_APIS */ /* * @} */ #endif /* INTERNAL_CONFIG_H */ libupnp-1.8.0~svn20100507/build/inc/autoconfig.h0000644000175000017500000001105111042015421016021 00000000000000/* autoconfig.h. Generated from autoconfig.h.in by configure. */ /* autoconfig.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 to compile debug code */ /* #undef DEBUG */ /* Define to 1 if you have the header file. */ #define HAVE_ARPA_INET_H 1 /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ /* #undef HAVE_DOPRNT */ /* Define to 1 if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #define HAVE_FSEEKO 1 /* Define to 1 if you have the `ftime' function. */ #define HAVE_FTIME 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if you have the `compat' library (-lcompat). */ /* #undef HAVE_LIBCOMPAT */ /* Define to 1 if you have the header file. */ #define HAVE_LIMITS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if you have the header file. */ #define HAVE_NETDB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_NETINET_IN_H 1 /* Define if you have POSIX threads libraries and header files. */ #define HAVE_PTHREAD 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYSLOG_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_IOCTL_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TIMEB_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the `vprintf' function. */ #define HAVE_VPRINTF 1 /* Define to 1 if you have the header file. */ /* #undef HAVE_WS2TCPIP_H */ /* Define to 1 to prevent compilation of assert() */ /* #undef NDEBUG */ /* Define to 1 to prevent some debug code */ /* #undef NO_DEBUG */ /* Define to 1 if your C compiler doesn't accept -c and -o together. */ /* #undef NO_MINUS_C_MINUS_O */ /* Name of package */ #define PACKAGE "libupnp" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "mroberto@users.sourceforge.net" /* Define to the full name of this package. */ #define PACKAGE_NAME "libupnp" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "libupnp 1.8.0" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libupnp" /* Define to the version of this package. */ #define PACKAGE_VERSION "1.8.0" /* Define to necessary symbol if this constant uses a non-standard name on your system. */ /* #undef PTHREAD_CREATE_JOINABLE */ /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* see upnpconfig.h */ #define UPNP_HAVE_CLIENT 1 /* see upnpconfig.h */ #define UPNP_HAVE_DEBUG 1 /* see upnpconfig.h */ #define UPNP_HAVE_DEVICE 1 /* see upnpconfig.h */ #define UPNP_HAVE_TOOLS 1 /* see upnpconfig.h */ #define UPNP_HAVE_WEBSERVER 1 /* Do not use pthread_rwlock_t */ #define UPNP_USE_RWLOCK 1 /* see upnpconfig.h */ #define UPNP_VERSION_MAJOR 1 /* see upnpconfig.h */ #define UPNP_VERSION_MINOR 8 /* see upnpconfig.h */ #define UPNP_VERSION_PATCH 0 /* see upnpconfig.h */ #define UPNP_VERSION_STRING "1.8.0" /* Version number of package */ #define VERSION "1.8.0" /* File Offset size */ #define _FILE_OFFSET_BITS 64 /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ /* #undef _LARGEFILE_SOURCE */ /* Large files support */ #define _LARGE_FILE_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `long int' if does not define. */ /* #undef off_t */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ /* Type for storing the length of struct sockaddr */ /* #undef socklen_t */ libupnp-1.8.0~svn20100507/build/inc/upnpconfig.h0000644000175000017500000000713211042015421016040 00000000000000/* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in by configure. */ /* -*- C -*- */ /******************************************************************************* * * Copyright (c) 2006 Rémi Turboult * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef UPNP_CONFIG_H #define UPNP_CONFIG_H /*************************************************************************** * Library version ***************************************************************************/ /** The library version (string) e.g. "1.3.0" */ #define UPNP_VERSION_STRING "1.8.0" /** Major version of the library */ #define UPNP_VERSION_MAJOR 1 /** Minor version of the library */ #define UPNP_VERSION_MINOR 8 /** Patch version of the library */ #define UPNP_VERSION_PATCH 0 /** The library version (numeric) e.g. 10300 means version 1.3.0 */ #define UPNP_VERSION \ ((UPNP_VERSION_MAJOR*100 + UPNP_VERSION_MINOR)*100 + UPNP_VERSION_PATCH) /*************************************************************************** * Library optional features ***************************************************************************/ /* * The following defines can be tested in order to know which * optional features have been included in the installed library. */ /** Defined to 1 if the library has been compiled with DEBUG enabled * (i.e. configure --enable-debug) : file is available */ #define UPNP_HAVE_DEBUG 1 /** Defined to 1 if the library has been compiled with client API enabled * (i.e. configure --enable-client) */ #define UPNP_HAVE_CLIENT 1 /** Defined to 1 if the library has been compiled with device API enabled * (i.e. configure --enable-device) */ #define UPNP_HAVE_DEVICE 1 /** Defined to 1 if the library has been compiled with integrated web server * (i.e. configure --enable-webserver --enable-device) */ #define UPNP_HAVE_WEBSERVER 1 /** Defined to 1 if the library has been compiled with helper API * (i.e. configure --enable-tools) : file is available */ #define UPNP_HAVE_TOOLS 1 #endif /* UPNP_CONFIG_H */ libupnp-1.8.0~svn20100507/build/vc8/0000777000175000017500000000000011373047467013555 500000000000000libupnp-1.8.0~svn20100507/build/vc8/tvdevice.vcproj0000644000175000017500000001062611021325544016515 00000000000000 libupnp-1.8.0~svn20100507/build/vc8/libupnp.sln0000644000175000017500000000770311021325544015650 00000000000000 Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libupnp", "libupnp.vcproj", "{6227F51A-1498-4C4A-B213-F6FDED605125}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "threadutil", "threadutil.vcproj", "{24884928-0501-4CF2-BC8A-180AFC23B2AF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ixml", "ixml.vcproj", "{AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvdevice", "tvdevice.vcproj", "{F592B023-E1F3-4A1E-841E-662DEE497435}" ProjectSection(ProjectDependencies) = postProject {6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125} {24884928-0501-4CF2-BC8A-180AFC23B2AF} = {24884928-0501-4CF2-BC8A-180AFC23B2AF} {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} = {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvctrlpt", "tvctrlpt.vcproj", "{BC1557D9-9E84-4BA5-861E-CB04D767FBDC}" ProjectSection(ProjectDependencies) = postProject {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} = {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} {24884928-0501-4CF2-BC8A-180AFC23B2AF} = {24884928-0501-4CF2-BC8A-180AFC23B2AF} {6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvcombo", "tvcombo.vcproj", "{B5D74697-F615-4DCB-AA8B-935F6372F01C}" ProjectSection(ProjectDependencies) = postProject {6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125} {24884928-0501-4CF2-BC8A-180AFC23B2AF} = {24884928-0501-4CF2-BC8A-180AFC23B2AF} {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} = {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.ActiveCfg = Debug|Win32 {6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.Build.0 = Debug|Win32 {6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.ActiveCfg = Release|Win32 {6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.Build.0 = Release|Win32 {24884928-0501-4CF2-BC8A-180AFC23B2AF}.Debug|Win32.ActiveCfg = Debug|Win32 {24884928-0501-4CF2-BC8A-180AFC23B2AF}.Debug|Win32.Build.0 = Debug|Win32 {24884928-0501-4CF2-BC8A-180AFC23B2AF}.Release|Win32.ActiveCfg = Release|Win32 {24884928-0501-4CF2-BC8A-180AFC23B2AF}.Release|Win32.Build.0 = Release|Win32 {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Debug|Win32.ActiveCfg = Debug|Win32 {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Debug|Win32.Build.0 = Debug|Win32 {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Release|Win32.ActiveCfg = Release|Win32 {AD489FAF-9CDD-411B-BFE9-1B9C6C16D427}.Release|Win32.Build.0 = Release|Win32 {F592B023-E1F3-4A1E-841E-662DEE497435}.Debug|Win32.ActiveCfg = Debug|Win32 {F592B023-E1F3-4A1E-841E-662DEE497435}.Debug|Win32.Build.0 = Debug|Win32 {F592B023-E1F3-4A1E-841E-662DEE497435}.Release|Win32.ActiveCfg = Release|Win32 {F592B023-E1F3-4A1E-841E-662DEE497435}.Release|Win32.Build.0 = Release|Win32 {BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Debug|Win32.ActiveCfg = Debug|Win32 {BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Debug|Win32.Build.0 = Debug|Win32 {BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Release|Win32.ActiveCfg = Release|Win32 {BC1557D9-9E84-4BA5-861E-CB04D767FBDC}.Release|Win32.Build.0 = Release|Win32 {B5D74697-F615-4DCB-AA8B-935F6372F01C}.Debug|Win32.ActiveCfg = Debug|Win32 {B5D74697-F615-4DCB-AA8B-935F6372F01C}.Debug|Win32.Build.0 = Debug|Win32 {B5D74697-F615-4DCB-AA8B-935F6372F01C}.Release|Win32.ActiveCfg = Release|Win32 {B5D74697-F615-4DCB-AA8B-935F6372F01C}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal libupnp-1.8.0~svn20100507/build/vc8/tvcombo.vcproj0000644000175000017500000001107611021325544016355 00000000000000 libupnp-1.8.0~svn20100507/build/vc8/tvctrlpt.vcproj0000644000175000017500000001062611021325544016566 00000000000000 libupnp-1.8.0~svn20100507/build/vc8/threadutil.vcproj0000644000175000017500000001027311021325544017047 00000000000000 libupnp-1.8.0~svn20100507/build/vc8/libupnp.vcproj0000644000175000017500000003307411021325544016357 00000000000000 libupnp-1.8.0~svn20100507/build/vc8/ixml.vcproj0000644000175000017500000001052611042015421015645 00000000000000 libupnp-1.8.0~svn20100507/build/vc9/0000777000175000017500000000000011373047470013550 500000000000000libupnp-1.8.0~svn20100507/build/vc9/tvdevice.vcproj0000644000175000017500000001055411021325544016516 00000000000000 libupnp-1.8.0~svn20100507/build/vc9/libupnp.sln0000644000175000017500000000730211025042303015635 00000000000000 Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libupnp", "libupnp.vcproj", "{6227F51A-1498-4C4A-B213-F6FDED605125}" ProjectSection(ProjectDependencies) = postProject {9C2C266D-35A3-465F-A297-0E21D54E5C89} = {9C2C266D-35A3-465F-A297-0E21D54E5C89} {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D} = {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ixml", "ixml.vcproj", "{9C2C266D-35A3-465F-A297-0E21D54E5C89}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "threadutil", "threadutil.vcproj", "{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvctrlpt", "tvctrlpt.vcproj", "{8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}" ProjectSection(ProjectDependencies) = postProject {6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvdevice", "tvdevice.vcproj", "{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}" ProjectSection(ProjectDependencies) = postProject {6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tvcombo", "tvcombo.vcproj", "{6365804B-22C6-4D5E-91F3-0C052EB55B4F}" ProjectSection(ProjectDependencies) = postProject {6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.ActiveCfg = Debug|Win32 {6227F51A-1498-4C4A-B213-F6FDED605125}.Debug|Win32.Build.0 = Debug|Win32 {6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.ActiveCfg = Release|Win32 {6227F51A-1498-4C4A-B213-F6FDED605125}.Release|Win32.Build.0 = Release|Win32 {9C2C266D-35A3-465F-A297-0E21D54E5C89}.Debug|Win32.ActiveCfg = Debug|Win32 {9C2C266D-35A3-465F-A297-0E21D54E5C89}.Debug|Win32.Build.0 = Debug|Win32 {9C2C266D-35A3-465F-A297-0E21D54E5C89}.Release|Win32.ActiveCfg = Release|Win32 {9C2C266D-35A3-465F-A297-0E21D54E5C89}.Release|Win32.Build.0 = Release|Win32 {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Debug|Win32.ActiveCfg = Debug|Win32 {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Debug|Win32.Build.0 = Debug|Win32 {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Release|Win32.ActiveCfg = Release|Win32 {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}.Release|Win32.Build.0 = Release|Win32 {8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Debug|Win32.ActiveCfg = Debug|Win32 {8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Debug|Win32.Build.0 = Debug|Win32 {8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Release|Win32.ActiveCfg = Release|Win32 {8FB56F1C-E617-4B79-96AE-1FA499A3A9B5}.Release|Win32.Build.0 = Release|Win32 {7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Debug|Win32.ActiveCfg = Debug|Win32 {7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Debug|Win32.Build.0 = Debug|Win32 {7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Release|Win32.ActiveCfg = Release|Win32 {7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}.Release|Win32.Build.0 = Release|Win32 {6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Debug|Win32.ActiveCfg = Debug|Win32 {6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Debug|Win32.Build.0 = Debug|Win32 {6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Release|Win32.ActiveCfg = Release|Win32 {6365804B-22C6-4D5E-91F3-0C052EB55B4F}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal libupnp-1.8.0~svn20100507/build/vc9/tvcombo.vcproj0000644000175000017500000001100711025042303016341 00000000000000 libupnp-1.8.0~svn20100507/build/vc9/tvctrlpt.vcproj0000644000175000017500000001055211021325544016565 00000000000000 libupnp-1.8.0~svn20100507/build/vc9/threadutil.vcproj0000644000175000017500000001110311025042303017032 00000000000000 libupnp-1.8.0~svn20100507/build/vc9/libupnp.vcproj0000644000175000017500000003277611025042303016361 00000000000000 libupnp-1.8.0~svn20100507/build/vc9/ixml.vcproj0000644000175000017500000001043111042015421015641 00000000000000 libupnp-1.8.0~svn20100507/build/msvc/0000777000175000017500000000000011373047467014025 500000000000000libupnp-1.8.0~svn20100507/build/msvc/inttypes.h0000644000175000017500000001730211021325544015755 00000000000000// ISO C9x compliant inttypes.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_INTTYPES_H_ // [ #define _MSC_INTTYPES_H_ #if _MSC_VER > 1000 #pragma once #endif #include // 7.8 Format conversion of integer types typedef struct { intmax_t quot; intmax_t rem; } imaxdiv_t; // 7.8.1 Macros for format specifiers // The fprintf macros for signed integers are: #define PRId8 "d" #define PRIi8 "i" #define PRIdLEAST8 "d" #define PRIiLEAST8 "i" #define PRIdFAST8 "d" #define PRIiFAST8 "i" #define PRId16 "hd" #define PRIi16 "hi" #define PRIdLEAST16 "hd" #define PRIiLEAST16 "hi" #define PRIdFAST16 "hd" #define PRIiFAST16 "hi" #define PRId32 "I32d" #define PRIi32 "I32i" #define PRIdLEAST32 "I32d" #define PRIiLEAST32 "I32i" #define PRIdFAST32 "I32d" #define PRIiFAST32 "I32i" #define PRId64 "I64d" #define PRIi64 "I64i" #define PRIdLEAST64 "I64d" #define PRIiLEAST64 "I64i" #define PRIdFAST64 "I64d" #define PRIiFAST64 "I64i" #define PRIdMAX "I64d" #define PRIiMAX "I64i" #define PRIdPTR "Id" #define PRIiPTR "Ii" // The fprintf macros for unsigned integers are: #define PRIo8 "o" #define PRIu8 "u" #define PRIx8 "x" #define PRIX8 "X" #define PRIoLEAST8 "o" #define PRIuLEAST8 "u" #define PRIxLEAST8 "x" #define PRIXLEAST8 "X" #define PRIoFAST8 "o" #define PRIuFAST8 "u" #define PRIxFAST8 "x" #define PRIXFAST8 "X" #define PRIo16 "ho" #define PRIu16 "hu" #define PRIx16 "hx" #define PRIX16 "hX" #define PRIoLEAST16 "ho" #define PRIuLEAST16 "hu" #define PRIxLEAST16 "hx" #define PRIXLEAST16 "hX" #define PRIoFAST16 "ho" #define PRIuFAST16 "hu" #define PRIxFAST16 "hx" #define PRIXFAST16 "hX" #define PRIo32 "I32o" #define PRIu32 "I32u" #define PRIx32 "I32x" #define PRIX32 "I32X" #define PRIoLEAST32 "I32o" #define PRIuLEAST32 "I32u" #define PRIxLEAST32 "I32x" #define PRIXLEAST32 "I32X" #define PRIoFAST32 "I32o" #define PRIuFAST32 "I32u" #define PRIxFAST32 "I32x" #define PRIXFAST32 "I32X" #define PRIo64 "I64o" #define PRIu64 "I64u" #define PRIx64 "I64x" #define PRIX64 "I64X" #define PRIoLEAST64 "I64o" #define PRIuLEAST64 "I64u" #define PRIxLEAST64 "I64x" #define PRIXLEAST64 "I64X" #define PRIoFAST64 "I64o" #define PRIuFAST64 "I64u" #define PRIxFAST64 "I64x" #define PRIXFAST64 "I64X" #define PRIoMAX "I64o" #define PRIuMAX "I64u" #define PRIxMAX "I64x" #define PRIXMAX "I64X" #define PRIoPTR "Io" #define PRIuPTR "Iu" #define PRIxPTR "Ix" #define PRIXPTR "IX" // The fscanf macros for signed integers are: #define SCNd8 "d" #define SCNi8 "i" #define SCNdLEAST8 "d" #define SCNiLEAST8 "i" #define SCNdFAST8 "d" #define SCNiFAST8 "i" #define SCNd16 "hd" #define SCNi16 "hi" #define SCNdLEAST16 "hd" #define SCNiLEAST16 "hi" #define SCNdFAST16 "hd" #define SCNiFAST16 "hi" #define SCNd32 "ld" #define SCNi32 "li" #define SCNdLEAST32 "ld" #define SCNiLEAST32 "li" #define SCNdFAST32 "ld" #define SCNiFAST32 "li" #define SCNd64 "I64d" #define SCNi64 "I64i" #define SCNdLEAST64 "I64d" #define SCNiLEAST64 "I64i" #define SCNdFAST64 "I64d" #define SCNiFAST64 "I64i" #define SCNdMAX "I64d" #define SCNiMAX "I64i" #ifdef _WIN64 // [ # define SCNdPTR "I64d" # define SCNiPTR "I64i" #else // _WIN64 ][ # define SCNdPTR "ld" # define SCNiPTR "li" #endif // _WIN64 ] // The fscanf macros for unsigned integers are: #define SCNo8 "o" #define SCNu8 "u" #define SCNx8 "x" #define SCNX8 "X" #define SCNoLEAST8 "o" #define SCNuLEAST8 "u" #define SCNxLEAST8 "x" #define SCNXLEAST8 "X" #define SCNoFAST8 "o" #define SCNuFAST8 "u" #define SCNxFAST8 "x" #define SCNXFAST8 "X" #define SCNo16 "ho" #define SCNu16 "hu" #define SCNx16 "hx" #define SCNX16 "hX" #define SCNoLEAST16 "ho" #define SCNuLEAST16 "hu" #define SCNxLEAST16 "hx" #define SCNXLEAST16 "hX" #define SCNoFAST16 "ho" #define SCNuFAST16 "hu" #define SCNxFAST16 "hx" #define SCNXFAST16 "hX" #define SCNo32 "lo" #define SCNu32 "lu" #define SCNx32 "lx" #define SCNX32 "lX" #define SCNoLEAST32 "lo" #define SCNuLEAST32 "lu" #define SCNxLEAST32 "lx" #define SCNXLEAST32 "lX" #define SCNoFAST32 "lo" #define SCNuFAST32 "lu" #define SCNxFAST32 "lx" #define SCNXFAST32 "lX" #define SCNo64 "I64o" #define SCNu64 "I64u" #define SCNx64 "I64x" #define SCNX64 "I64X" #define SCNoLEAST64 "I64o" #define SCNuLEAST64 "I64u" #define SCNxLEAST64 "I64x" #define SCNXLEAST64 "I64X" #define SCNoFAST64 "I64o" #define SCNuFAST64 "I64u" #define SCNxFAST64 "I64x" #define SCNXFAST64 "I64X" #define SCNoMAX "I64o" #define SCNuMAX "I64u" #define SCNxMAX "I64x" #define SCNXMAX "I64X" #ifdef _WIN64 // [ # define SCNoPTR "I64o" # define SCNuPTR "I64u" # define SCNxPTR "I64x" # define SCNXPTR "I64X" #else // _WIN64 ][ # define SCNoPTR "lo" # define SCNuPTR "lu" # define SCNxPTR "lx" # define SCNXPTR "lX" #endif // _WIN64 ] // 7.8.2 Functions for greatest-width integer types // 7.8.2.1 The imaxabs function #define imaxabs _abs64 // 7.8.2.2 The imaxdiv function // This is modified version of div() function from Microsoft's div.c found // in %MSVC.NET%\crt\src\div.c #ifdef STATIC_IMAXDIV // [ static #else // STATIC_IMAXDIV ][ _inline #endif // STATIC_IMAXDIV ] imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) { imaxdiv_t result; result.quot = numer / denom; result.rem = numer % denom; if (numer < 0 && result.rem > 0) { // did division wrong; must fix up ++result.quot; result.rem -= denom; } return result; } // 7.8.2.3 The strtoimax and strtoumax functions #define strtoimax _strtoi64 #define strtoumax _strtoui64 // 7.8.2.4 The wcstoimax and wcstoumax functions #define wcstoimax _wcstoi64 #define wcstoumax _wcstoui64 #endif // _MSC_INTTYPES_H_ ] libupnp-1.8.0~svn20100507/build/msvc/stdint.h0000644000175000017500000001560611021325544015410 00000000000000// ISO C9x compliant stdint.h for Microsoft Visual Studio // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 // // Copyright (c) 2006 Alexander Chemeris // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The name of the author may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #include // For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #if (_MSC_VER < 1300) && defined(__cplusplus) extern "C++" { #endif # include #if (_MSC_VER < 1300) && defined(__cplusplus) } #endif // 7.18.1 Integer types // 7.18.1.1 Exact-width integer types typedef __int8 int8_t; typedef __int16 int16_t; typedef __int32 int32_t; typedef __int64 int64_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; // 7.18.1.2 Minimum-width integer types typedef int8_t int_least8_t; typedef int16_t int_least16_t; typedef int32_t int_least32_t; typedef int64_t int_least64_t; typedef uint8_t uint_least8_t; typedef uint16_t uint_least16_t; typedef uint32_t uint_least32_t; typedef uint64_t uint_least64_t; // 7.18.1.3 Fastest minimum-width integer types typedef int8_t int_fast8_t; typedef int16_t int_fast16_t; typedef int32_t int_fast32_t; typedef int64_t int_fast64_t; typedef uint8_t uint_fast8_t; typedef uint16_t uint_fast16_t; typedef uint32_t uint_fast32_t; typedef uint64_t uint_fast64_t; // 7.18.1.4 Integer types capable of holding object pointers #ifdef _WIN64 // [ typedef __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef int intptr_t; typedef unsigned int uintptr_t; #endif // _WIN64 ] // 7.18.1.5 Greatest-width integer types typedef int64_t intmax_t; typedef uint64_t uintmax_t; // 7.18.2 Limits of specified-width integer types #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 // 7.18.2.1 Limits of exact-width integer types #define INT8_MIN ((int8_t)_I8_MIN) #define INT8_MAX _I8_MAX #define INT16_MIN ((int16_t)_I16_MIN) #define INT16_MAX _I16_MAX #define INT32_MIN ((int32_t)_I32_MIN) #define INT32_MAX _I32_MAX #define INT64_MIN ((int64_t)_I64_MIN) #define INT64_MAX _I64_MAX #define UINT8_MAX _UI8_MAX #define UINT16_MAX _UI16_MAX #define UINT32_MAX _UI32_MAX #define UINT64_MAX _UI64_MAX // 7.18.2.2 Limits of minimum-width integer types #define INT_LEAST8_MIN INT8_MIN #define INT_LEAST8_MAX INT8_MAX #define INT_LEAST16_MIN INT16_MIN #define INT_LEAST16_MAX INT16_MAX #define INT_LEAST32_MIN INT32_MIN #define INT_LEAST32_MAX INT32_MAX #define INT_LEAST64_MIN INT64_MIN #define INT_LEAST64_MAX INT64_MAX #define UINT_LEAST8_MAX UINT8_MAX #define UINT_LEAST16_MAX UINT16_MAX #define UINT_LEAST32_MAX UINT32_MAX #define UINT_LEAST64_MAX UINT64_MAX // 7.18.2.3 Limits of fastest minimum-width integer types #define INT_FAST8_MIN INT8_MIN #define INT_FAST8_MAX INT8_MAX #define INT_FAST16_MIN INT16_MIN #define INT_FAST16_MAX INT16_MAX #define INT_FAST32_MIN INT32_MIN #define INT_FAST32_MAX INT32_MAX #define INT_FAST64_MIN INT64_MIN #define INT_FAST64_MAX INT64_MAX #define UINT_FAST8_MAX UINT8_MAX #define UINT_FAST16_MAX UINT16_MAX #define UINT_FAST32_MAX UINT32_MAX #define UINT_FAST64_MAX UINT64_MAX // 7.18.2.4 Limits of integer types capable of holding object pointers #ifdef _WIN64 // [ # define INTPTR_MIN INT64_MIN # define INTPTR_MAX INT64_MAX # define UINTPTR_MAX UINT64_MAX #else // _WIN64 ][ # define INTPTR_MIN INT32_MIN # define INTPTR_MAX INT32_MAX # define UINTPTR_MAX UINT32_MAX #endif // _WIN64 ] // 7.18.2.5 Limits of greatest-width integer types #define INTMAX_MIN INT64_MIN #define INTMAX_MAX INT64_MAX #define UINTMAX_MAX UINT64_MAX // 7.18.3 Limits of other integer types #ifdef _WIN64 // [ # define PTRDIFF_MIN _I64_MIN # define PTRDIFF_MAX _I64_MAX #else // _WIN64 ][ # define PTRDIFF_MIN _I32_MIN # define PTRDIFF_MAX _I32_MAX #endif // _WIN64 ] #define SIG_ATOMIC_MIN INT_MIN #define SIG_ATOMIC_MAX INT_MAX #ifndef SIZE_MAX // [ # ifdef _WIN64 // [ # define SIZE_MAX _UI64_MAX # else // _WIN64 ][ # define SIZE_MAX _UI32_MAX # endif // _WIN64 ] #endif // SIZE_MAX ] // WCHAR_MIN and WCHAR_MAX are also defined in #ifndef WCHAR_MIN // [ # define WCHAR_MIN 0 #endif // WCHAR_MIN ] #ifndef WCHAR_MAX // [ # define WCHAR_MAX _UI16_MAX #endif // WCHAR_MAX ] #define WINT_MIN 0 #define WINT_MAX _UI16_MAX #endif // __STDC_LIMIT_MACROS ] // 7.18.4 Limits of other integer types #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 // 7.18.4.1 Macros for minimum-width integer constants #define INT8_C(val) val##i8 #define INT16_C(val) val##i16 #define INT32_C(val) val##i32 #define INT64_C(val) val##i64 #define UINT8_C(val) val##ui8 #define UINT16_C(val) val##ui16 #define UINT32_C(val) val##ui32 #define UINT64_C(val) val##ui64 // 7.18.4.2 Macros for greatest-width integer constants #define INTMAX_C INT64_C #define UINTMAX_C UINT64_C #endif // __STDC_CONSTANT_MACROS ] #endif // _MSC_STDINT_H_ ] libupnp-1.8.0~svn20100507/build/libupnp.bpf0000644000175000017500000000426511021325544015123 00000000000000USEUNIT("..\ixml\src\nodeList.c"); USEUNIT("..\ixml\src\attr.c"); USEUNIT("..\ixml\src\document.c"); USEUNIT("..\ixml\src\element.c"); USEUNIT("..\ixml\src\ixml.c"); USEUNIT("..\ixml\src\ixmlmembuf.c"); USEUNIT("..\ixml\src\ixmlparser.c"); USEUNIT("..\ixml\src\namedNodeMap.c"); USEUNIT("..\ixml\src\node.c"); USEUNIT("..\threadutil\src\TimerThread.c"); USEUNIT("..\threadutil\src\FreeList.c"); USEUNIT("..\threadutil\src\iasnprintf.c"); USEUNIT("..\threadutil\src\LinkedList.c"); USEUNIT("..\threadutil\src\ThreadPool.c"); USEUNIT("..\upnp\src\win_dll.c"); USEUNIT("..\upnp\src\inet_pton.c"); USEUNIT("..\upnp\src\api\upnptools.c"); USEUNIT("..\upnp\src\api\upnpapi.c"); USEUNIT("..\upnp\src\gena\gena_device.c"); USEUNIT("..\upnp\src\gena\gena_callback2.c"); USEUNIT("..\upnp\src\gena\gena_ctrlpt.c"); USEUNIT("..\upnp\src\genlib\client_table\client_table.c"); USEUNIT("..\upnp\src\genlib\miniserver\miniserver.c"); USEUNIT("..\upnp\src\genlib\net\sock.c"); USEUNIT("..\upnp\src\genlib\net\http\webserver.c"); USEUNIT("..\upnp\src\genlib\net\http\httpparser.c"); USEUNIT("..\upnp\src\genlib\net\http\httpreadwrite.c"); USEUNIT("..\upnp\src\genlib\net\http\parsetools.c"); USEUNIT("..\upnp\src\genlib\net\http\statcodes.c"); USEUNIT("..\upnp\src\genlib\net\uri\uri.c"); USEUNIT("..\upnp\src\genlib\service_table\service_table.c"); USEUNIT("..\upnp\src\genlib\util\util.c"); USEUNIT("..\upnp\src\genlib\util\membuffer.c"); USEUNIT("..\upnp\src\genlib\util\strintmap.c"); USEUNIT("..\upnp\src\genlib\util\upnp_timeout.c"); USEUNIT("..\upnp\src\soap\soap_device.c"); USEUNIT("..\upnp\src\soap\soap_common.c"); USEUNIT("..\upnp\src\soap\soap_ctrlpt.c"); USEUNIT("..\upnp\src\ssdp\ssdp_server.c"); USEUNIT("..\upnp\src\ssdp\ssdp_ctrlpt.c"); USEUNIT("..\upnp\src\ssdp\ssdp_device.c"); USEUNIT("..\upnp\src\urlconfig\urlconfig.c"); USEUNIT("..\upnp\src\uuid\uuid.c"); USEUNIT("..\upnp\src\uuid\md5.c"); USEUNIT("..\upnp\src\uuid\sysdep.c"); USELIB("..\..\..\pthreads-w32-1-10-0-release\pthreadBC1.lib"); //--------------------------------------------------------------------------- This file is used by the project manager only and should be treated like the project file DllEntryPointlibupnp-1.8.0~svn20100507/build/libupnp.bpr0000644000175000017500000001713611021325544015140 00000000000000 [Version Info] IncludeVerInfo=0 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=1031 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=1.0.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [HistoryLists\hlIncludePath] Count=3 Item0=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;..\..\pthreads-w32-1-10-0-release Item1=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;D:\DEVELOP\pthreads-w32-1-10-0-release Item2=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc [HistoryLists\hlLibraryPath] Count=3 Item0=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;..\..\pthreads-w32-1-10-0-release Item1=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;D:\DEVELOP\pthreads-w32-1-10-0-release Item2=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib [HistoryLists\hlDebugSourcePath] Count=1 Item0=$(BCB)\source\vcl [HistoryLists\hlConditionals] Count=4 Item0=WIN32;LIBUPNP_EXPORTS;UPNP_USE_BCBPP Item1=WIN32;LIBUPNP_EXPORTS Item2=WIN32;EXPORT_SPEC Item3=WIN32 [Debugging] DebugSourceDirs=$(BCB)\source\vcl [Parameters] RunParams= HostApplication= RemoteHost= RemotePath= RemoteDebug=0 [Compiler] ShowInfoMsgs=0 LinkDebugVcl=0 libupnp-1.8.0~svn20100507/build/libupnp.dsp0000644000175000017500000002455111021325544015142 00000000000000# Microsoft Developer Studio Project File - Name="libupnp" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** NICHT BEARBEITEN ** # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 CFG=libupnp - Win32 Debug !MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE !MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl !MESSAGE !MESSAGE NMAKE /f "libupnp.mak". !MESSAGE !MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben !MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: !MESSAGE !MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug" !MESSAGE !MESSAGE Für die Konfiguration stehen zur Auswahl: !MESSAGE !MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "libupnp - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I ".\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /D "PTW32_STATIC_LIB" /D "UPNP_STATIC_LIB" /D "UPNP_USE_MSVCPP" /FR /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD RSC /l 0x407 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /machine:I386 # SUBTRACT LINK32 /pdb:none !ELSEIF "$(CFG)" == "libupnp - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I "..\build\inc" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /D "UPNP_USE_MSVCPP" /FR /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD RSC /l 0x407 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept !ENDIF # Begin Target # Name "libupnp - Win32 Release" # Name "libupnp - Win32 Debug" # Begin Group "Quellcodedateien" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=..\ixml\src\attr.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\client_table\client_table.c # End Source File # Begin Source File SOURCE=..\ixml\src\document.c # End Source File # Begin Source File SOURCE=..\ixml\src\element.c # End Source File # Begin Source File SOURCE=..\threadutil\src\FreeList.c # End Source File # Begin Source File SOURCE=..\upnp\src\gena\gena_callback2.c # End Source File # Begin Source File SOURCE=..\upnp\src\gena\gena_ctrlpt.c # End Source File # Begin Source File SOURCE=..\upnp\src\gena\gena_device.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\net\http\httpparser.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\net\http\httpreadwrite.c # End Source File # Begin Source File SOURCE=..\threadutil\src\iasnprintf.c # End Source File # Begin Source File SOURCE=..\upnp\src\inet_pton.c # End Source File # Begin Source File SOURCE=..\ixml\src\ixml.c # End Source File # Begin Source File SOURCE=..\ixml\src\ixmlmembuf.c # End Source File # Begin Source File SOURCE=..\ixml\src\ixmlparser.c # End Source File # Begin Source File SOURCE=..\threadutil\src\LinkedList.c # End Source File # Begin Source File SOURCE=..\upnp\src\uuid\md5.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\util\membuffer.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\miniserver\miniserver.c # End Source File # Begin Source File SOURCE=..\ixml\src\namedNodeMap.c # End Source File # Begin Source File SOURCE=..\ixml\src\node.c # End Source File # Begin Source File SOURCE=..\ixml\src\nodeList.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\net\http\parsetools.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\service_table\service_table.c # End Source File # Begin Source File SOURCE=..\upnp\src\soap\soap_common.c # End Source File # Begin Source File SOURCE=..\upnp\src\soap\soap_ctrlpt.c # End Source File # Begin Source File SOURCE=..\upnp\src\soap\soap_device.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\net\sock.c # End Source File # Begin Source File SOURCE=..\upnp\src\ssdp\ssdp_ctrlpt.c # End Source File # Begin Source File SOURCE=..\upnp\src\ssdp\ssdp_device.c # End Source File # Begin Source File SOURCE=..\upnp\src\ssdp\ssdp_server.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\net\http\statcodes.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\util\strintmap.c # End Source File # Begin Source File SOURCE=..\upnp\src\uuid\sysdep.c # End Source File # Begin Source File SOURCE=..\threadutil\src\ThreadPool.c # End Source File # Begin Source File SOURCE=..\threadutil\src\TimerThread.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\util\upnp_timeout.c # End Source File # Begin Source File SOURCE=..\upnp\src\api\upnpapi.c # End Source File # Begin Source File SOURCE=..\upnp\src\api\upnptools.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\net\uri\uri.c # End Source File # Begin Source File SOURCE=..\upnp\src\urlconfig\urlconfig.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\util\util.c # End Source File # Begin Source File SOURCE=..\upnp\src\uuid\uuid.c # End Source File # Begin Source File SOURCE=..\upnp\src\genlib\net\http\webserver.c # End Source File # Begin Source File SOURCE=..\upnp\src\win_dll.c # End Source File # End Group # Begin Group "Header-Dateien" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=..\upnp\src\inc\client_table.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\config.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\gena.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\gena_ctrlpt.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\gena_device.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\global.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\gmtdate.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\http_client.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\httpparser.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\httpreadwrite.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\inet_pton.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\md5.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\membuffer.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\miniserver.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\netall.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\parsetools.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\server.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\service_table.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\soaplib.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\sock.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\ssdplib.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\statcodes.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\statuscodes.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\strintmap.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\sysdep.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\unixutil.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\upnp_timeout.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\upnpapi.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\upnpclosesocket.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\uri.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\urlconfig.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\util.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\utilall.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\uuid.h # End Source File # Begin Source File SOURCE=..\upnp\src\inc\webserver.h # End Source File # End Group # Begin Group "Ressourcendateien" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # Begin Source File SOURCE=..\..\..\..\libupnp_win32.patch # End Source File # End Target # End Project libupnp-1.8.0~svn20100507/build/libupnp.dsw0000644000175000017500000000103011021325544015134 00000000000000Microsoft Developer Studio Workspace File, Format Version 6.00 # WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! ############################################################################### Project: "libupnp"=.\libupnp.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### libupnp-1.8.0~svn20100507/aclocal.m40000644000175000017500000102251711360640111013517 00000000000000# generated automatically by aclocal 1.10.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 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. # 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. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(AC_AUTOCONF_VERSION, [2.61],, [m4_warning([this file was generated for autoconf 2.61. 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'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 52 Debian 1.5.26-4+lenny1 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac _LT_REQUIRED_DARWIN_CHECKS AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. AC_DEFUN([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ]) # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. AC_DEFUN([_LT_COMPILER_BOILERPLATE], [AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. AC_DEFUN([_LT_LINKER_BOILERPLATE], [AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # -------------------------- # Check for some things on darwin AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. echo "int foo(void){return 1;}" > conftest.c $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib ${wl}-single_module conftest.c if test -f libconftest.dylib; then lt_cv_apple_cc_single_mod=yes rm -rf libconftest.dylib* fi rm conftest.c fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) case $host_os in rhapsody* | darwin1.[[0123]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil="~$DSYMUTIL \$lib || :" else _lt_dsymutil= fi ;; esac ]) # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_LINK_IFELSE(AC_LANG_PROGRAM,[ lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # ------------------ AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # --------------------------------------------------------------------- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ---------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" m4_if($1,[],[ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[[3-9]]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], [lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], [lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 DLLs AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- # set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognize shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognize a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, # it is assumed to be `libltdl'. LIBLTDL will be prefixed with # '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' # (note the single quotes!). If your package is not flat and you're not # using automake, define top_builddir and top_srcdir appropriately in # the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that # AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, # and an installed libltdl is not found, it is assumed to be `libltdl'. # LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and top_srcdir # appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP # ------------------ AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP fi ])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # ------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= _LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" if test "$GXX" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else case $cc_basename in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], [AC_REQUIRE([LT_AC_PROG_SED])dnl dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_AC_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac ])# AC_LIBTOOL_POSTDEP_PREDEP # AC_LIBTOOL_LANG_F77_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) AC_DEFUN([_LT_AC_LANG_F77_CONFIG], [AC_REQUIRE([AC_PROG_F77]) AC_LANG_PUSH(Fortran 77) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_AC_TAGVAR(GCC, $1)="$G77" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_F77_CONFIG # AC_LIBTOOL_LANG_GCJ_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], [AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_CONFIG($1) AC_LANG_RESTORE CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_GCJ_CONFIG # AC_LIBTOOL_LANG_RC_CONFIG # ------------------------- # Ensure that the configuration vars for the Windows resource compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) AC_DEFUN([_LT_AC_LANG_RC_CONFIG], [AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes AC_LIBTOOL_CONFIG($1) AC_LANG_RESTORE CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_RC_CONFIG # AC_LIBTOOL_CONFIG([TAGNAME]) # ---------------------------- # If TAGNAME is not passed, then create an initial libtool script # with a default configuration from the untagged config vars. Otherwise # add code to config.status for appending the configuration named by # TAGNAME from the matching tagged config vars. AC_DEFUN([AC_LIBTOOL_CONFIG], [# The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ _LT_AC_TAGVAR(compiler, $1) \ _LT_AC_TAGVAR(CC, $1) \ _LT_AC_TAGVAR(LD, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ _LT_AC_TAGVAR(old_archive_cmds, $1) \ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ _LT_AC_TAGVAR(predep_objects, $1) \ _LT_AC_TAGVAR(postdep_objects, $1) \ _LT_AC_TAGVAR(predeps, $1) \ _LT_AC_TAGVAR(postdeps, $1) \ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ _LT_AC_TAGVAR(archive_cmds, $1) \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ _LT_AC_TAGVAR(postinstall_cmds, $1) \ _LT_AC_TAGVAR(postuninstall_cmds, $1) \ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ _LT_AC_TAGVAR(allow_undefined_flag, $1) \ _LT_AC_TAGVAR(no_undefined_flag, $1) \ _LT_AC_TAGVAR(export_symbols_cmds, $1) \ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ _LT_AC_TAGVAR(hardcode_automatic, $1) \ _LT_AC_TAGVAR(module_cmds, $1) \ _LT_AC_TAGVAR(module_expsym_cmds, $1) \ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ _LT_AC_TAGVAR(fix_srcfile_path, $1) \ _LT_AC_TAGVAR(exclude_expsyms, $1) \ _LT_AC_TAGVAR(include_expsyms, $1); do case $var in _LT_AC_TAGVAR(old_archive_cmds, $1) | \ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ _LT_AC_TAGVAR(archive_cmds, $1) | \ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ _LT_AC_TAGVAR(module_cmds, $1) | \ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\[$]0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` ;; esac ifelse([$1], [], [cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" AC_MSG_NOTICE([creating $ofile])], [cfgfile="$ofile"]) cat <<__EOF__ >> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # 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 of the License, 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # 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. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([LT_AC_PROG_SED]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc* | ecpc*) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler. _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac # # Check to make sure the static flag actually works. # wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' ;; linux* | k*bsd*-gnu) _LT_AC_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. _LT_CC_BASENAME([$compiler]) case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; interix[[3-9]]*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi _LT_AC_TAGVAR(link_all_deplibs, $1)=no else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi[[45]]*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then wlarc='${wl}' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) # Cheap backport of AS_EXECUTABLE_P and required macros # from Autoconf 2.59; we should not use $as_executable_p directly. # _AS_TEST_PREPARE # ---------------- m4_ifndef([_AS_TEST_PREPARE], [m4_defun([_AS_TEST_PREPARE], [if test -x / >/dev/null 2>&1; then as_executable_p='test -x' else as_executable_p='test -f' fi ])])# _AS_TEST_PREPARE # AS_EXECUTABLE_P # --------------- # Check whether a file is executable. m4_ifndef([AS_EXECUTABLE_P], [m4_defun([AS_EXECUTABLE_P], [AS_REQUIRE([_AS_TEST_PREPARE])dnl $as_executable_p $1[]dnl ])])# AS_EXECUTABLE_P # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ]) # Copyright (C) 2002, 2003, 2005, 2006, 2007 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. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.10' 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.10.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.10.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 # 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 8 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 # 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 9 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # 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 3 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 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 13 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.60])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 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 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 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 3 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005 # 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 5 # 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 ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != 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 # 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 5 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 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. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 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 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # 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 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006 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. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 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 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acx_pthread.m4]) m4_include([m4/ax_cflags_gcc_option.m4]) m4_include([m4/ax_cflags_warn_all.m4]) m4_include([m4/rt_bool_arg_enable.m4]) libupnp-1.8.0~svn20100507/README0000644000175000017500000002350411021325544012537 00000000000000Portable SDK for UPnP* Devices (libupnp) Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved. Copyright (c) 2005-2006 Rémi Turboult Copyright (c) 2006 Michel Pfeiffer and others See LICENSE for details. This file contains information about the above product in the following sections: 1. Release Contents 2. Package Contents 3. System Requirements 4. Build Instructions 5. Install/Uninstall Instructions 6. Product Release Notes 7. New Features 8. Support and Contact Information 1) Release Contents ------------------------------------------- The Portable SDK for UPnP Devices is an SDK for development of UPnP device and control point applications. It consists of the core UPnP protocols along with a UPnP-specific eXtensible Markup Language (XML) parser supporting the Document Object Model (DOM) Level 2 API and an optional, integrated mini web server for serving UPnP related documents. 2) Package Contents ------------------------------------------- The SDK for UPnP Devices contains the following: README This file. Contains the installation and build instructions. LICENSE The licensing terms the SDK is distributed under. NEWS Changes and new features. ixml\doc The files for generating the XML parser documentation from the source code. ixml\inc The public include files required to use the XML parser. ixml\src The source code to the XML parser library. threadutil\inc The public include files required to the threading utility library. threadutil\src The source code to the threading utility library. upnp\doc The files for generating the SDK documentation from the source code. upnp\inc The public include files required to use the SDK. upnp\src The source files comprising the SDK, libupnp.so. upnp\sample A sample device and control point application, illustrating the usage of the SDK. 3) System Requirements ------------------------------------------- The SDK for UPnP Devices is designed to compile and run under several operating systems. It does, however, have dependencies on some packages that may not be installed by default. All packages that it requires are listed below. libpthread The header and library are installed as part of the glibc-devel package (or equivalent). Additionally, the documentation for the SDK can be auto-generated from the UPNP.H header file using DOC++, a documentation system for C, C++, IDL, and Java*. DOC++ generates the documentation in HTML or TeX format. Using some additional tools, the TeX output can be converted into a PDF file. To generate the documentation these tools are required: DOC++ The homepage for DOC++ is http://docpp.sourceforge.net/. The current version as of this release of the SDK is version 3.4.9. DOC++ is the only requirement for generating the HTML documentation. LaTeX/TeX To generate the PDF documentation, LaTeX and TeX tools are necessary. The tetex and tetex-latex packages provide these tools. dvips dvips converts the DVI file produced by LaTeX into a PostScript* file. The tetex-dvips package provides this tool. ps2pdf The final step to making the PDF is converting the PostStript into Portable Document Format. The ghostscript package provides this tool. For the UPnP library to function correctly, networking must be configured properly for multicasting. To do this: route add -net 239.0.0.0 netmask 255.0.0.0 eth0 where 'eth0' is the network adapter that the UPnP library will use. Without this addition, device advertisements and control point searches will not function. 4) Build Instructions ------------------------------------------- CORE LIBRARIES The in the examples below, replace $(LIBUPNP) with "libupnp-x.y.z", with x, y, and z corresponding to the version of the library that you have. All pieces of the SDK are configured and built from the $(LIBUPNP) directory. % cd $(LIBUPNP) % ./configure % make will build a version of the binaries without debug support, and with default options enabled (see below for options available at configure time). % cd $(LIBUPNP) % ./configure CFLAGS="-DSPARC_SOLARIS -mtune= -mcpu=" % make will build a Sparc Solaris version of the binaries without debug support and with default options enabled (see below for options available at configure time). Please note: has to be replaced by a token that fits to your platform and CPU (e.g. "supersparc"). To build the documentation, assuming all the necessary tools are installed (see section 3) : To generate the HTML documentation: % cd $(LIBUPNP) % make html To generate the PDF file: % cd $(LIBUPNP) % make pdf A few options are available at configure time. Use "./configure --help" to display a complete list of options. Note that these options may be combined in any order. After installation, the file will provide a summary of the optional features that have been included in the library. % cd $(LIBUPNP) % ./configure --enable-debug % make will build a debug version with symbols support. To build the library with the optional, integrated mini web server (note that this is the default): % cd $(LIBUPNP) % ./configure --enable-webserver % make To build without: % cd $(LIBUPNP) % ./configure --disable-webserver % make The SDK also contains some additional helper APIs, declared in inc/tools/upnptools.h. If these additional tools are not required, they can be compiled out: % cd $(LIBUPNP) % ./configure --disable-tools % make By default, the tools are included in the library. To further remove code that is not required, the library can be build with or with out the control point (client) or device specific code. To remove this code: % cd $(LIBUPNP) % ./configure --disable-client % make to remove client only code or: % cd $(LIBUPNP) % ./configure --disable-device % make to remove device only code. By default, both client and device code is included in the library. The integrated web server is automatically removed when configuring with --disable-device. To build the library without large-file support (enabled by default) : % cd $(LIBUPNP) % ./configure --disable-largefile % make To remove all the targets, object files, and built documentation: % cd $(LIBUPNP) % make clean CROSS COMPILATION To cross compile the SDK, a special "configure" directive is all that is required: % cd $(LIBUPNP) % ./configure --host=arm-linux % make This will invoke the "arm-linux-gcc" cross compiler to build the library. SAMPLES The SDK contains two samples: a TV device application and a control point that talks with the TV device. They are found in the $(LIBUPNP)/upnp/sample directory. To build the samples (note: this is the default behaviour): % cd $(LIBUPNP) % ./configure --enable-samples % make will build the sample device "$(LIBUPNP)/upnp/upnp_tv_device" and sample control point "$(LIBUPNP)/upnp/upnp_tv_ctrlpt". Note : the sample device won't be built if --disable-device has been configured, and the sample control point won't be build if --disable-client has been configured. To run the sample device, you need the "$(LIBUPNP)/upnp/sample/tvdevice/web" sub-directory. Example : % cd $(LIBUPNP)/upnp/sample/tvdevice % ../../upnp_tv_device SOLARIS BUILD The building process for the Solaris operating system is similar to the one described above. Only the call to ./configure has to be done using an additional parameter: ./configure CFLAGS="-mcpu= -mtune= -DSPARC_SOLARIS" where has to be replaced by the appropriate CPU tuning flag (e.g. "supersparc"). Afterwards make make install can be called as described above. WINDOWS BUILD In order to build libupnp under Windows the pthreads-w32 package is required. You can download a self-extracting ZIP file from the following location: ftp://sources.redhat.com/pub/pthreads-win32/pthreads-w32-2-7-0-release.exe Execute the self-extracting archive and copy the Pre-build.2 folder to the top level source folder. Rename Pre-build.2 to pthreads. Open the provided workspace build\libupnp.dsw with Visual C++ 6.0 and select Build->Build libupnp.dll (F7) For building a static library instead of a DLL and for using the static pthreads-w32 library following switches need to be defined additionally: UPNP_STATIC_LIB - for creating a statically linkable UPnP-library PTW32_STATIC_LIB - for using the static pthreads32 library 5) Install/Uninstall Instructions ------------------------------------------- Install The top-level makefile for the UPnP SDK contains rules to install the necessary components. To install the SDK, as root: make install Uninstall Likewise, the top-level makefile contains an uninstall rule, reversing the steps in the install: make uninstall 6) Product Release Notes ------------------------------------------- The SDK for UPnP Devices v1.2.1a has these known issues: - The UPnP library may not work with older versions of gcc and libstdc++, causing a segmentation fault when the library loads. It is recommended that gcc version 2.9 or later be used in building library. - The UPnP library does not work the glibc 2.1.92-14 that ships with Red Hat 7.0. For the library to function, you must updated the glibc and glibc-devel packages to 2.1.94-3 or later. There is some issue with libpthreads that has been resolved in the 2.1.94 version. 7) New Features ------------------------------------------- See NEWS file. 8) Support and Contact Information ------------------------------------------- Intel is not providing support for the SDK for UPnP Devices. Mailing lists and discussion boards can be found at http://www.libupnp.org/. If you find this SDK useful, please send an email to upnp@intel.com and let us know. * Other brands, names, and trademarks are the property of their respective owners. libupnp-1.8.0~svn20100507/THANKS0000644000175000017500000000215111372263256012577 00000000000000 libupnp was originally written by Intel Corporation. Many people further contributed to libupnp by reporting problems, suggesting various improvements or submitting actual code. Here is a list of these people. Help us keep it complete and exempt of errors. - Alex (afaucher) - Andre Sodermans (wienerschnitzel) - Anthony Viallard (homer242) - Apostolos Syropoulos - Arno Willig - Bob Ciora - Carlo Parata - Chaos - Charles Nepveu (cnepveu) - Chris Pickel - Craig Nelson - David Maass - Emil Ljungdahl - Erik Johansson - Eric Tanguy - Erwan Velu - Eugene Christensen - Fabrice Fontaine - Fredrik Svensson - Glen Masgai - Hartmut Holzgraefe - hholzgra - Ingo Hofmann - Jiri Zouhar - John Dennis - Jonathan Casiot (no_dice) - Josh Carroll - Keith Brindley - Leuk_He - Loigu - Luke Kim (nereusuj) - Marcelo Roberto Jimenez (mroberto) - Markus Strobl - Nektarios K. Papadopoulos (npapadop) - Nicholas Kraft - Nick Leverton (leveret) - Oskar Liljeblad - Michael (oxygenic) - Paul Vixie - Peter Hartley - Rene Hexel - Robert Gingher (robsbox) - Siva Chandran - StĂ©phane CorthĂ©sy - Steve Bresson - Timothy Redaelli - Titus Winters libupnp-1.8.0~svn20100507/configure0000755000175000017500000275776011360640116013613 00000000000000#! /bin/sh # From configure.ac Revision: 1.11 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for libupnp 1.8.0. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... 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'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p 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 # 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'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string=`eval $cmd`) 2>/dev/null && echo_test_string=`eval $cmd` && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='libupnp' PACKAGE_TARNAME='libupnp' PACKAGE_VERSION='1.8.0' PACKAGE_STRING='libupnp 1.8.0' PACKAGE_BUGREPORT='mroberto@users.sourceforge.net' ac_unique_file="upnp/inc/upnp.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias LT_VERSION_IXML LT_VERSION_THREADUTIL LT_VERSION_UPNP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA am__isrc CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar build build_cpu build_vendor build_os host host_cpu host_vendor host_os ENABLE_DEBUG_TRUE ENABLE_DEBUG_FALSE ENABLE_CLIENT_TRUE ENABLE_CLIENT_FALSE ENABLE_DEVICE_TRUE ENABLE_DEVICE_FALSE ENABLE_WEBSERVER_TRUE ENABLE_WEBSERVER_FALSE ENABLE_TOOLS_TRUE ENABLE_TOOLS_FALSE ENABLE_SAMPLES_TRUE ENABLE_SAMPLES_FALSE WITH_DOCUMENTATION_TRUE WITH_DOCUMENTATION_FALSE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE SED GREP EGREP LN_S ECHO AR RANLIB DSYMUTIL NMEDIT CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL acx_pthread_config PTHREAD_CC PTHREAD_LIBS PTHREAD_CFLAGS LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP F77 FFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe 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 fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # 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 libupnp 1.8.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/libupnp] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of libupnp 1.8.0:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable extra debugging code [default=disabled] --disable-client disable control point code (client) [default=enabled] --disable-device disable device specific code (implies --disable-webserver if disabled) [default=enabled] --disable-webserver disable integrated web server [default=enabled] --disable-tools disable helper APIs in upnptools.h [default=enabled] --disable-samples disable compilation of upnp/sample/ code [default=enabled] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-documentation=directory_name where documentation is installed [DATADIR/doc/libupnp-1.8.0] --without-documentation do not install the documentation --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libupnp configure 1.8.0 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi 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 libupnp $as_me 1.8.0, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu LT_VERSION_IXML=2:4:0 LT_VERSION_THREADUTIL=5:0:2 LT_VERSION_UPNP=4:0:0 ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in build-aux \"$srcdir\"/build-aux" >&5 echo "$as_me: error: cannot find install-sh or install.sh in build-aux \"$srcdir\"/build-aux" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. am__api_version='1.10' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # 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 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. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm -f conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi { echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS 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 case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { echo "$as_me:$LINENO: result: $MKDIR_P" >&5 echo "${ECHO_T}$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AWK" && break done { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='libupnp' VERSION='1.8.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' # # Get canonical host names in host and host_os # # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # # There are 3 configuration files : # 1) "./autoconfig.h" is auto-generated and used only internally during build # (usually named "config.h" but conflicts with the file below) # 2) "./upnp/src/inc/config.h" is static and contains some compile-time # parameters. This file was previously in "./upnp/inc" but is no longer # installed (contains internal definitions only). # 3) "./upnp/inc/upnpconfig.h" is auto-generated and installed with the # libraries : it contains information on the configuration of the # installed libraries. # ac_config_headers="$ac_config_headers autoconfig.h upnp/inc/upnpconfig.h" #AC_SYS_LARGEFILE_SENSITIVE upnpmaj=`echo "$PACKAGE_VERSION" | sed 's/\..*//' ` upnpmin=`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.// ; s/[^0-9].*$//' ` upnppatch=`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.[^.]\.// ; s/[^0-9].*$//' ` cat >>confdefs.h <<_ACEOF #define UPNP_VERSION_STRING "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define UPNP_VERSION_MAJOR $upnpmaj _ACEOF cat >>confdefs.h <<_ACEOF #define UPNP_VERSION_MINOR $upnpmin _ACEOF cat >>confdefs.h <<_ACEOF #define UPNP_VERSION_PATCH $upnppatch _ACEOF # # Check for DEBUG flag # { echo "$as_me:$LINENO: checking for --enable-debug" >&5 echo $ECHO_N "checking for --enable-debug... $ECHO_C" >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then enableval=$enable_debug; fi test "x$enable_debug" != xyes && enable_debug=no { echo "$as_me:$LINENO: result: $enable_debug" >&5 echo "${ECHO_T}$enable_debug" >&6; } if test x"$enable_debug" = xyes; then ENABLE_DEBUG_TRUE= ENABLE_DEBUG_FALSE='#' else ENABLE_DEBUG_TRUE='#' ENABLE_DEBUG_FALSE= fi if test "x$enable_debug" = xyes ; then cat >>confdefs.h <<\_ACEOF #define UPNP_HAVE_DEBUG 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define DEBUG 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define NO_DEBUG 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define NDEBUG 1 _ACEOF fi # # Check for libupnp subsets # { echo "$as_me:$LINENO: checking for --enable-client" >&5 echo $ECHO_N "checking for --enable-client... $ECHO_C" >&6; } # Check whether --enable-client was given. if test "${enable_client+set}" = set; then enableval=$enable_client; fi test "x$enable_client" != xno && enable_client=yes { echo "$as_me:$LINENO: result: $enable_client" >&5 echo "${ECHO_T}$enable_client" >&6; } if test x"$enable_client" = xyes; then ENABLE_CLIENT_TRUE= ENABLE_CLIENT_FALSE='#' else ENABLE_CLIENT_TRUE='#' ENABLE_CLIENT_FALSE= fi if test "x$enable_client" = xyes ; then cat >>confdefs.h <<\_ACEOF #define UPNP_HAVE_CLIENT 1 _ACEOF fi { echo "$as_me:$LINENO: checking for --enable-device" >&5 echo $ECHO_N "checking for --enable-device... $ECHO_C" >&6; } # Check whether --enable-device was given. if test "${enable_device+set}" = set; then enableval=$enable_device; fi test "x$enable_device" != xno && enable_device=yes { echo "$as_me:$LINENO: result: $enable_device" >&5 echo "${ECHO_T}$enable_device" >&6; } if test x"$enable_device" = xyes; then ENABLE_DEVICE_TRUE= ENABLE_DEVICE_FALSE='#' else ENABLE_DEVICE_TRUE='#' ENABLE_DEVICE_FALSE= fi if test "x$enable_device" = xyes ; then cat >>confdefs.h <<\_ACEOF #define UPNP_HAVE_DEVICE 1 _ACEOF fi if test "x$enable_device" = xno ; then enable_webserver=no else { echo "$as_me:$LINENO: checking for --enable-webserver" >&5 echo $ECHO_N "checking for --enable-webserver... $ECHO_C" >&6; } # Check whether --enable-webserver was given. if test "${enable_webserver+set}" = set; then enableval=$enable_webserver; fi test "x$enable_webserver" != xno && enable_webserver=yes { echo "$as_me:$LINENO: result: $enable_webserver" >&5 echo "${ECHO_T}$enable_webserver" >&6; } if test x"$enable_webserver" = xyes; then ENABLE_WEBSERVER_TRUE= ENABLE_WEBSERVER_FALSE='#' else ENABLE_WEBSERVER_TRUE='#' ENABLE_WEBSERVER_FALSE= fi fi if test x"$enable_webserver" = xyes; then ENABLE_WEBSERVER_TRUE= ENABLE_WEBSERVER_FALSE='#' else ENABLE_WEBSERVER_TRUE='#' ENABLE_WEBSERVER_FALSE= fi if test "x$enable_webserver" = xyes ; then cat >>confdefs.h <<\_ACEOF #define UPNP_HAVE_WEBSERVER 1 _ACEOF fi { echo "$as_me:$LINENO: checking for --enable-tools" >&5 echo $ECHO_N "checking for --enable-tools... $ECHO_C" >&6; } # Check whether --enable-tools was given. if test "${enable_tools+set}" = set; then enableval=$enable_tools; fi test "x$enable_tools" != xno && enable_tools=yes { echo "$as_me:$LINENO: result: $enable_tools" >&5 echo "${ECHO_T}$enable_tools" >&6; } if test x"$enable_tools" = xyes; then ENABLE_TOOLS_TRUE= ENABLE_TOOLS_FALSE='#' else ENABLE_TOOLS_TRUE='#' ENABLE_TOOLS_FALSE= fi if test "x$enable_tools" = xyes ; then cat >>confdefs.h <<\_ACEOF #define UPNP_HAVE_TOOLS 1 _ACEOF fi { echo "$as_me:$LINENO: checking for --enable-samples" >&5 echo $ECHO_N "checking for --enable-samples... $ECHO_C" >&6; } # Check whether --enable-samples was given. if test "${enable_samples+set}" = set; then enableval=$enable_samples; fi test "x$enable_samples" != xno && enable_samples=yes { echo "$as_me:$LINENO: result: $enable_samples" >&5 echo "${ECHO_T}$enable_samples" >&6; } if test x"$enable_samples" = xyes; then ENABLE_SAMPLES_TRUE= ENABLE_SAMPLES_FALSE='#' else ENABLE_SAMPLES_TRUE='#' ENABLE_SAMPLES_FALSE= fi # # doc installation # autoconf >= 2.60 already defines ${docdir}, but we will not use its # default value, which is ${datarootdir}/doc/${PACKAGE_TARNAME}. # That would give us ${datarootdir}/doc/libupnp, and we want the package # version on that. # docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}" { echo "$as_me:$LINENO: checking for documentation directory" >&5 echo $ECHO_N "checking for documentation directory... $ECHO_C" >&6; } # Check whether --with-documentation was given. if test "${with_documentation+set}" = set; then withval=$with_documentation; else with_documentation=no fi # # If something has been entered after an equal sign, assume it is the directory # if test x"$with_documentation" != xyes -a x"$with_documentation" != xno; then docdir="$with_documentation" fi if test x"$with_documentation" != xno; then WITH_DOCUMENTATION_TRUE= WITH_DOCUMENTATION_FALSE='#' else WITH_DOCUMENTATION_TRUE='#' WITH_DOCUMENTATION_FALSE= fi { echo "$as_me:$LINENO: result: $docdir" >&5 echo "${ECHO_T}$docdir" >&6; } # # Checks for programs # ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* 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); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi { echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test "x$CC" != xcc; then { echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6; } else { echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6; } fi set dummy $CC; ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -f conftest2.$ac_objext && { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -f conftest2.$ac_objext && { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; 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 { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } cat >>confdefs.h <<\_ACEOF #define NO_MINUS_C_MINUS_O 1 _ACEOF fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != 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 # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi { echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; } if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done fi SED=$lt_cv_path_SED { echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6; } { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 # 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 *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 # 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 *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi { echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac { echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; } if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi { echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6; } NM="$lt_cv_path_NM" { echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6; } fi { echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 4778 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## --------------------------------------------- ## ## Report this to mroberto@users.sourceforge.net ## ## --------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= { echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac F77=$ac_ct_F77 fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6; } if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6; } ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= { echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6; } if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments { echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; } else { echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6; } fi # Check for command to grab the raw symbol name followed by C symbol from nm. { echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux* | k*bsd*-gnu) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6; } else { echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6; } fi { echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6; } if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e 1s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_DSYMUTIL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 echo "${ECHO_T}$DSYMUTIL" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 echo "${ECHO_T}$ac_ct_DSYMUTIL" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_NMEDIT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { echo "$as_me:$LINENO: result: $NMEDIT" >&5 echo "${ECHO_T}$NMEDIT" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 echo "${ECHO_T}$ac_ct_NMEDIT" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi { echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 echo $ECHO_N "checking for -single_module linker flag... $ECHO_C" >&6; } if test "${lt_cv_apple_cc_single_mod+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. echo "int foo(void){return 1;}" > conftest.c $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib ${wl}-single_module conftest.c if test -f libconftest.dylib; then lt_cv_apple_cc_single_mod=yes rm -rf libconftest.dylib* fi rm conftest.c fi fi { echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 echo "${ECHO_T}$lt_cv_apple_cc_single_mod" >&6; } { echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 echo $ECHO_N "checking for -exported_symbols_list linker flag... $ECHO_C" >&6; } if test "${lt_cv_ld_exported_symbols_list+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_cv_ld_exported_symbols_list=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 echo "${ECHO_T}$lt_cv_ld_exported_symbols_list" >&6; } case $host_os in rhapsody* | darwin1.[0123]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil="~$DSYMUTIL \$lib || :" else _lt_dsymutil= fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic was given. if test "${with_pic+set}" = set; then withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:7835: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:7839: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic='-qnocommon' lt_prog_compiler_wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8125: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8129: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8229: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8233: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi link_all_deplibs=no else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs=no ;; esac fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi { echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6; } if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= { echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi ;; *) { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) { echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; } if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_shl_load || defined __stub___shl_load choke me #endif int main () { return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6; } if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; } if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else { echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; } if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_dlopen || defined __stub___dlopen choke me #endif int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6; } if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; } if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; } if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; } if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which library types will actually be built { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6; } # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ compiler_lib_search_dirs \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ fix_srcfile_path \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # 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 of the License, 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # 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. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" # Check whether --with-tags was given. if test "${with_tags+set}" = set; then withval=$with_tags; tagnames="$withval" fi if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi if test -z "$LTCFLAGS"; then eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= compiler_lib_search_dirs_CXX= # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" if test "$GXX" = yes ; then output_verbose_link_cmd='echo' archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_CXX=no ;; esac fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc*) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' else ld_shlibs_CXX=no fi ;; osf3*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. # So that behaviour is only enabled if SCOABSPATH is set to a # non-empty value in the environment. Most likely only useful for # creating official distributions of packages. # This is a hack until libtool officially supports absolute path # names for shared libraries. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext compiler_lib_search_dirs_CXX= if test -n "$compiler_lib_search_path_CXX"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_CXX='-qnocommon' lt_prog_compiler_wl_CXX='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc* | ecpc*) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13107: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13111: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13211: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13215: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' ;; linux* | k*bsd*-gnu) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ compiler_lib_search_dirs_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ fix_srcfile_path_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6; } { echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6; } GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_F77='-qnocommon' lt_prog_compiler_wl_F77='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14809: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:14813: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_F77" >&6; } if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works_F77=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_F77=yes fi else lt_cv_prog_compiler_static_works_F77=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works_F77" >&6; } if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then : else lt_prog_compiler_static_F77= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:14913: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:14917: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; interix[3-9]*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi link_all_deplibs_F77=no else ld_shlibs_F77=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = no; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_F77='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_F77=no ;; esac fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_F77=no fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_F77='${wl}-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='${wl}-z,text' allow_undefined_flag_F77='${wl}-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi { echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6; } test "$ld_shlibs_F77" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var_F77" || \ test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6; } if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ compiler_lib_search_dirs_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ fix_srcfile_path_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no old_archive_cmds_GCJ=$old_archive_cmds lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17133: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17137: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= { echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case $cc_basename in xlc*) lt_prog_compiler_pic_GCJ='-qnocommon' lt_prog_compiler_wl_GCJ='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-fpic' lt_prog_compiler_static_GCJ='-Bstatic' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' lt_prog_compiler_wl_GCJ='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' lt_prog_compiler_wl_GCJ='' ;; esac ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; rdos*) lt_prog_compiler_static_GCJ='-non_shared' ;; solaris*) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl_GCJ='-Qoption ld ';; *) lt_prog_compiler_wl_GCJ='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; unicos*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_can_build_shared_GCJ=no ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi { echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17423: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:17427: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_GCJ" >&6; } if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_static_works_GCJ=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_GCJ=yes fi else lt_cv_prog_compiler_static_works_GCJ=yes fi fi $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_static_works_GCJ" >&6; } if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then : else lt_prog_compiler_static_GCJ= fi { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; } if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:17527: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:17531: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . 2>&5 $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi { echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; } hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6; } if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; } runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= # Just being paranoid about ensuring that cc_basename is set. for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_GCJ=no fi ;; interix[3-9]*) hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_addflag= case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; *) tmp_sharedflag='-shared' ;; esac archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi link_all_deplibs_GCJ=no else ld_shlibs_GCJ=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_GCJ=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = no; then runpath_var= hardcode_libdir_flag_spec_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ='$convenience' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) case $host_os in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else case $cc_basename in xlc*) output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_GCJ=no ;; esac fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: case $host_cpu in hppa*64*|ia64*) hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; *) hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs_GCJ=no fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else wlarc='' archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_GCJ='${wl}-z,text' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_GCJ='${wl}-z,text' allow_undefined_flag_GCJ='${wl}-z,nodefs' archive_cmds_need_lc_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi { echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6; } test "$ld_shlibs_GCJ" = no && can_build_shared=no # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; } $rm conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ pic_flag=$lt_prog_compiler_pic_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* { echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6; } ;; esac fi ;; esac { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" fi sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" fi sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; } hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ test "X$hardcode_automatic_GCJ" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi { echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6; } if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ compiler_lib_search_dirs_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ fix_srcfile_path_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $rm -r conftest* # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ compiler_lib_search_dirs_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ fix_srcfile_path_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # LTCC compiler flags. LTCFLAGS=$lt_LTCFLAGS # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The directories searched by this compiler when creating a shared # library compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # 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 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. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 # 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 *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" # # Default compilation flags # echo "--------------------- Default compilation flags -------------------------------" echo host is $host echo host_os is $host_os case $host_os in freebsd*) echo "Using FreeBSD specific compiler settings" # Put FreeBSD specific compiler flags here ;; *) echo "Using non-specific system compiler settings" if test x"$enable_debug" = xyes; then # AC_PROG_CC already sets CFLAGS to "-g -O2" by default #: # Use -O0 in debug so that variables do not get optimized out { echo "$as_me:$LINENO: checking CFLAGS for gcc -O0" >&5 echo $ECHO_N "checking CFLAGS for gcc -O0... $ECHO_C" >&6; } if test "${ac_cv_cflags_gcc_option__O0+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_cflags_gcc_option__O0="no, unknown" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_save_CFLAGS="$CFLAGS" for ac_arg in "-pedantic -Werror % -O0" "-pedantic % -O0 %% no, obsolete" # do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_cflags_gcc_option__O0=`echo $ac_arg | sed -e 's,.*% *,,'` ; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done CFLAGS="$ac_save_CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cflags_gcc_option__O0" >&5 echo "${ECHO_T}$ac_cv_cflags_gcc_option__O0" >&6; } case ".$ac_cv_cflags_gcc_option__O0" in .ok|.ok,*) ;; .|.no|.no,*) ;; *) if echo " $CFLAGS " | grep " $ac_cv_cflags_gcc_option__O0 " 2>&1 >/dev/null then { (echo "$as_me:$LINENO: : CFLAGS does contain \$ac_cv_cflags_gcc_option__O0") >&5 (: CFLAGS does contain $ac_cv_cflags_gcc_option__O0) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } else { (echo "$as_me:$LINENO: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_gcc_option__O0\"") >&5 (: CFLAGS="$CFLAGS $ac_cv_cflags_gcc_option__O0") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } CFLAGS="$CFLAGS $ac_cv_cflags_gcc_option__O0" fi ;; esac else # add optimise for size { echo "$as_me:$LINENO: checking CFLAGS for gcc -Os" >&5 echo $ECHO_N "checking CFLAGS for gcc -Os... $ECHO_C" >&6; } if test "${ac_cv_cflags_gcc_option__Os+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_cflags_gcc_option__Os="no, unknown" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_save_CFLAGS="$CFLAGS" for ac_arg in "-pedantic -Werror % -Os" "-pedantic % -Os %% no, obsolete" # do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_cflags_gcc_option__Os=`echo $ac_arg | sed -e 's,.*% *,,'` ; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done CFLAGS="$ac_save_CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cflags_gcc_option__Os" >&5 echo "${ECHO_T}$ac_cv_cflags_gcc_option__Os" >&6; } case ".$ac_cv_cflags_gcc_option__Os" in .ok|.ok,*) ;; .|.no|.no,*) ;; *) if echo " $CFLAGS " | grep " $ac_cv_cflags_gcc_option__Os " 2>&1 >/dev/null then { (echo "$as_me:$LINENO: : CFLAGS does contain \$ac_cv_cflags_gcc_option__Os") >&5 (: CFLAGS does contain $ac_cv_cflags_gcc_option__Os) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } else { (echo "$as_me:$LINENO: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_gcc_option__Os\"") >&5 (: CFLAGS="$CFLAGS $ac_cv_cflags_gcc_option__Os") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } CFLAGS="$CFLAGS $ac_cv_cflags_gcc_option__Os" fi ;; esac fi ;; esac { echo "$as_me:$LINENO: checking CFLAGS for maximum warnings" >&5 echo $ECHO_N "checking CFLAGS for maximum warnings... $ECHO_C" >&6; } if test "${ac_cv_cflags_warn_all+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_cflags_warn_all="no, unknown" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_save_CFLAGS="$CFLAGS" for ac_arg in "-pedantic % -Wall" "-xstrconst % -v" "-std1 % -verbose -w0 -warnprotos" "-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" "-ansi -ansiE % -fullwarn" "+ESlit % +w1" "-Xc % -pvctl,fullmsg" "-h conform % -h msglevel 2" # do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_cflags_warn_all=`echo $ac_arg | sed -e 's,.*% *,,'` ; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done CFLAGS="$ac_save_CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cflags_warn_all" >&5 echo "${ECHO_T}$ac_cv_cflags_warn_all" >&6; } case ".$ac_cv_cflags_warn_all" in .ok|.ok,*) ;; .|.no|.no,*) ;; *) if echo " $CFLAGS " | grep " $ac_cv_cflags_warn_all " 2>&1 >/dev/null then { (echo "$as_me:$LINENO: : CFLAGS does contain \$ac_cv_cflags_warn_all") >&5 (: CFLAGS does contain $ac_cv_cflags_warn_all) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } else { (echo "$as_me:$LINENO: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_warn_all\"") >&5 (: CFLAGS="$CFLAGS $ac_cv_cflags_warn_all") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" fi ;; esac echo "-------------------------------------------------------------------------------" # # Lot's of stuff to ensure large file support # { echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef size_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6; } if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { echo "$as_me:$LINENO: checking for off_t" >&5 echo $ECHO_N "checking for off_t... $ECHO_C" >&6; } if test "${ac_cv_type_off_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef off_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_type_off_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_off_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 echo "${ECHO_T}$ac_cv_type_off_t" >&6; } if test $ac_cv_type_off_t = yes; then : else cat >>confdefs.h <<_ACEOF #define off_t long int _ACEOF fi cat >>confdefs.h <<\_ACEOF #define _LARGE_FILE_SOURCE _ACEOF cat >>confdefs.h <<\_ACEOF #define _FILE_OFFSET_BITS 64 _ACEOF # # Are we targetting Win32? # { echo "$as_me:$LINENO: checking for Win32" >&5 echo $ECHO_N "checking for Win32... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef WIN32 #error Yup #endif int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_win32="no" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_win32="yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_cv_win32" = "yes"; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # # Checks for header files (which aren't needed on Win32) # { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi if test "$ac_cv_win32" = "no"; then # libupnp code doesn't use autoconf variables yet, # so just abort if a header file is not found. for ac_header in \ arpa/inet.h \ fcntl.h \ inttypes.h \ limits.h \ netdb.h \ netinet/in.h \ stdlib.h \ string.h \ sys/ioctl.h \ sys/socket.h \ sys/time.h \ syslog.h \ unistd.h \ do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## --------------------------------------------- ## ## Report this to mroberto@users.sourceforge.net ## ## --------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF else { { echo "$as_me:$LINENO: error: required header file missing" >&5 echo "$as_me: error: required header file missing" >&2;} { (exit 1); exit 1; }; } fi done fi # # Checks for typedefs, structures, and compiler characteristics # { echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi # The test for socklen_t was getting it wrong when it exists but is in ws2tcpip.h, # so we use a new test. #TYPE_SOCKLEN_T for ac_header in sys/types.h sys/socket.h ws2tcpip.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## --------------------------------------------- ## ## Report this to mroberto@users.sourceforge.net ## ## --------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for socklen_t" >&5 echo $ECHO_N "checking for socklen_t... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif int main () { socklen_t t = 0; return t; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_socklen_t="yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_socklen_t="no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "$ac_cv_socklen_t" = "yes"; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no, using int" >&5 echo "${ECHO_T}no, using int" >&6; } cat >>confdefs.h <<\_ACEOF #define socklen_t int _ACEOF fi # # Checks for library functions # for ac_func in vprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF { echo "$as_me:$LINENO: checking for _doprnt" >&5 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6; } if test "${ac_cv_func__doprnt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define _doprnt to an innocuous variant, in case declares _doprnt. For example, HP-UX 11i declares gettimeofday. */ #define _doprnt innocuous__doprnt /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _doprnt /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _doprnt (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub__doprnt || defined __stub____doprnt choke me #endif int main () { return _doprnt (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func__doprnt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__doprnt=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 echo "${ECHO_T}$ac_cv_func__doprnt" >&6; } if test $ac_cv_func__doprnt = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DOPRNT 1 _ACEOF fi fi done { echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5 echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6; } if test "${ac_cv_sys_largefile_source+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else while :; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_sys_largefile_source=no; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _LARGEFILE_SOURCE 1 #include /* for off_t */ #include int main () { int (*fp) (FILE *, off_t, int) = fseeko; return fseeko (stdin, 0, 0) && fp (stdin, 0, 0); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_sys_largefile_source=1; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext ac_cv_sys_largefile_source=unknown break done fi { echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5 echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6; } case $ac_cv_sys_largefile_source in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source _ACEOF ;; esac rm -f conftest* # We used to try defining _XOPEN_SOURCE=500 too, to work around a bug # in glibc 2.1.3, but that breaks too many other things. # If you want fseeko and ftello with glibc, upgrade to a fixed glibc. if test $ac_cv_sys_largefile_source != unknown; then cat >>confdefs.h <<\_ACEOF #define HAVE_FSEEKO 1 _ACEOF fi for ac_func in ftime do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else { echo "$as_me:$LINENO: checking for ftime in -lcompat" >&5 echo $ECHO_N "checking for ftime in -lcompat... $ECHO_C" >&6; } if test "${ac_cv_lib_compat_ftime+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcompat $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ftime (); int main () { return ftime (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_lib_compat_ftime=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_compat_ftime=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_compat_ftime" >&5 echo "${ECHO_T}$ac_cv_lib_compat_ftime" >&6; } if test $ac_cv_lib_compat_ftime = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBCOMPAT 1 _ACEOF LIBS="-lcompat $LIBS" fi fi done # # Solaris needs -lsocket -lnsl -lrt { echo "$as_me:$LINENO: checking for library containing bind" >&5 echo $ECHO_N "checking for library containing bind... $ECHO_C" >&6; } if test "${ac_cv_search_bind+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bind (); int main () { return bind (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_search_bind=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_bind+set}" = set; then break fi done if test "${ac_cv_search_bind+set}" = set; then : else ac_cv_search_bind=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_bind" >&5 echo "${ECHO_T}$ac_cv_search_bind" >&6; } ac_res=$ac_cv_search_bind if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { echo "$as_me:$LINENO: checking for library containing gethostbyname" >&5 echo $ECHO_N "checking for library containing gethostbyname... $ECHO_C" >&6; } if test "${ac_cv_search_gethostbyname+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_search_gethostbyname=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_gethostbyname+set}" = set; then break fi done if test "${ac_cv_search_gethostbyname+set}" = set; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_gethostbyname" >&5 echo "${ECHO_T}$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { echo "$as_me:$LINENO: checking for library containing sched_getparam" >&5 echo $ECHO_N "checking for library containing sched_getparam... $ECHO_C" >&6; } if test "${ac_cv_search_sched_getparam+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_getparam (); int main () { return sched_getparam (); ; return 0; } _ACEOF for ac_lib in '' rt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_search_sched_getparam=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_sched_getparam+set}" = set; then break fi done if test "${ac_cv_search_sched_getparam+set}" = set; then : else ac_cv_search_sched_getparam=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_sched_getparam" >&5 echo "${ECHO_T}$ac_cv_search_sched_getparam" >&6; } ac_res=$ac_cv_search_sched_getparam if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # # Checks for POSIX Threads # echo "--------------------------- pthread stuff -------------------------------------" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { echo "$as_me:$LINENO: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 echo $ECHO_N "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then acx_pthread_ok=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext { echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 echo "${ECHO_T}$acx_pthread_ok" >&6; } if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) { echo "$as_me:$LINENO: checking whether pthreads work without any flags" >&5 echo $ECHO_N "checking whether pthreads work without any flags... $ECHO_C" >&6; } ;; -*) { echo "$as_me:$LINENO: checking whether pthreads work with $flag" >&5 echo $ECHO_N "checking whether pthreads work with $flag... $ECHO_C" >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_acx_pthread_config+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$acx_pthread_config"; then ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_acx_pthread_config="yes" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" fi fi acx_pthread_config=$ac_cv_prog_acx_pthread_config if test -n "$acx_pthread_config"; then { echo "$as_me:$LINENO: result: $acx_pthread_config" >&5 echo "${ECHO_T}$acx_pthread_config" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { echo "$as_me:$LINENO: checking for the pthreads library -l$flag" >&5 echo $ECHO_N "checking for the pthreads library -l$flag... $ECHO_C" >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then acx_pthread_ok=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 echo "${ECHO_T}$acx_pthread_ok" >&6; } if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { echo "$as_me:$LINENO: checking for joinable pthread attribute" >&5 echo $ECHO_N "checking for joinable pthread attribute... $ECHO_C" >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { int attr=$attr; return attr; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then attr_name=$attr; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext done { echo "$as_me:$LINENO: result: $attr_name" >&5 echo "${ECHO_T}$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { echo "$as_me:$LINENO: checking if more special flags are required for pthreads" >&5 echo $ECHO_N "checking if more special flags are required for pthreads... $ECHO_C" >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { echo "$as_me:$LINENO: result: ${flag}" >&5 echo "${ECHO_T}${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with xlc_r or cc_r if test x"$GCC" != xyes; then for ac_prog in xlc_r cc_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PTHREAD_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { echo "$as_me:$LINENO: result: $PTHREAD_CC" >&5 echo "${ECHO_T}$PTHREAD_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" else PTHREAD_CC=$CC fi else PTHREAD_CC="$CC" fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_PTHREAD 1 _ACEOF : else acx_pthread_ok=no { { echo "$as_me:$LINENO: error: POSIX threads are required to build this program" >&5 echo "$as_me: error: POSIX threads are required to build this program" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # # Update environment variables for pthreads # CC="$PTHREAD_CC" CFLAGS="$PTHREAD_CFLAGS $CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # # Determine if pthread_rwlock_t is available # echo "----------------------- pthread_rwlock_t stuff --------------------------------" { echo "$as_me:$LINENO: checking if pthread_rwlock_t is available" >&5 echo $ECHO_N "checking if pthread_rwlock_t is available... $ECHO_C" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { pthread_rwlock_t *x; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define UPNP_USE_RWLOCK 1 _ACEOF { echo "$as_me:$LINENO: result: yes, supported without any options" >&5 echo "${ECHO_T}yes, supported without any options" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _GNU_SOURCE #include int main () { pthread_rwlock_t *x; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then cat >>confdefs.h <<\_ACEOF #define UPNP_USE_RWLOCK 1 _ACEOF CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" { echo "$as_me:$LINENO: result: yes, definition of _GNU_SOURCE required" >&5 echo "${ECHO_T}yes, definition of _GNU_SOURCE required" >&6; } else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >>confdefs.h <<\_ACEOF #define UPNP_USE_RWLOCK 0 _ACEOF { echo "$as_me:$LINENO: result: no, needs to fallback to pthread_mutex" >&5 echo "${ECHO_T}no, needs to fallback to pthread_mutex" >&6; } { { echo "$as_me:$LINENO: error: pthread_rwlock_t not available" >&5 echo "$as_me: error: pthread_rwlock_t not available" >&2;} { (exit 1); exit 1; }; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext echo "-------------------------------------------------------------------------------" ac_config_files="$ac_config_files Makefile ixml/Makefile ixml/doc/Makefile threadutil/Makefile upnp/Makefile upnp/doc/Makefile upnp/sample/Makefile docs/dist/Makefile libupnp.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${ENABLE_DEBUG_TRUE}" && test -z "${ENABLE_DEBUG_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_CLIENT_TRUE}" && test -z "${ENABLE_CLIENT_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_CLIENT\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_CLIENT\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_DEVICE_TRUE}" && test -z "${ENABLE_DEVICE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_DEVICE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_DEVICE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_WEBSERVER_TRUE}" && test -z "${ENABLE_WEBSERVER_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_WEBSERVER\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_WEBSERVER\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_WEBSERVER_TRUE}" && test -z "${ENABLE_WEBSERVER_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_WEBSERVER\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_WEBSERVER\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_TOOLS_TRUE}" && test -z "${ENABLE_TOOLS_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_TOOLS\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_TOOLS\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_SAMPLES_TRUE}" && test -z "${ENABLE_SAMPLES_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_SAMPLES\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${WITH_DOCUMENTATION_TRUE}" && test -z "${WITH_DOCUMENTATION_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"WITH_DOCUMENTATION\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"WITH_DOCUMENTATION\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... 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'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p 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 # 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'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by libupnp $as_me 1.8.0, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ libupnp config.status 1.8.0 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "autoconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS autoconfig.h" ;; "upnp/inc/upnpconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS upnp/inc/upnpconfig.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "ixml/Makefile") CONFIG_FILES="$CONFIG_FILES ixml/Makefile" ;; "ixml/doc/Makefile") CONFIG_FILES="$CONFIG_FILES ixml/doc/Makefile" ;; "threadutil/Makefile") CONFIG_FILES="$CONFIG_FILES threadutil/Makefile" ;; "upnp/Makefile") CONFIG_FILES="$CONFIG_FILES upnp/Makefile" ;; "upnp/doc/Makefile") CONFIG_FILES="$CONFIG_FILES upnp/doc/Makefile" ;; "upnp/sample/Makefile") CONFIG_FILES="$CONFIG_FILES upnp/sample/Makefile" ;; "docs/dist/Makefile") CONFIG_FILES="$CONFIG_FILES docs/dist/Makefile" ;; "libupnp.pc") CONFIG_FILES="$CONFIG_FILES libupnp.pc" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim LT_VERSION_IXML!$LT_VERSION_IXML$ac_delim LT_VERSION_THREADUTIL!$LT_VERSION_THREADUTIL$ac_delim LT_VERSION_UPNP!$LT_VERSION_UPNP$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim am__isrc!$am__isrc$ac_delim CYGPATH_W!$CYGPATH_W$ac_delim PACKAGE!$PACKAGE$ac_delim VERSION!$VERSION$ac_delim ACLOCAL!$ACLOCAL$ac_delim AUTOCONF!$AUTOCONF$ac_delim AUTOMAKE!$AUTOMAKE$ac_delim AUTOHEADER!$AUTOHEADER$ac_delim MAKEINFO!$MAKEINFO$ac_delim install_sh!$install_sh$ac_delim STRIP!$STRIP$ac_delim INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim mkdir_p!$mkdir_p$ac_delim AWK!$AWK$ac_delim SET_MAKE!$SET_MAKE$ac_delim am__leading_dot!$am__leading_dot$ac_delim AMTAR!$AMTAR$ac_delim am__tar!$am__tar$ac_delim am__untar!$am__untar$ac_delim build!$build$ac_delim build_cpu!$build_cpu$ac_delim build_vendor!$build_vendor$ac_delim build_os!$build_os$ac_delim host!$host$ac_delim host_cpu!$host_cpu$ac_delim host_vendor!$host_vendor$ac_delim host_os!$host_os$ac_delim ENABLE_DEBUG_TRUE!$ENABLE_DEBUG_TRUE$ac_delim ENABLE_DEBUG_FALSE!$ENABLE_DEBUG_FALSE$ac_delim ENABLE_CLIENT_TRUE!$ENABLE_CLIENT_TRUE$ac_delim ENABLE_CLIENT_FALSE!$ENABLE_CLIENT_FALSE$ac_delim ENABLE_DEVICE_TRUE!$ENABLE_DEVICE_TRUE$ac_delim ENABLE_DEVICE_FALSE!$ENABLE_DEVICE_FALSE$ac_delim ENABLE_WEBSERVER_TRUE!$ENABLE_WEBSERVER_TRUE$ac_delim ENABLE_WEBSERVER_FALSE!$ENABLE_WEBSERVER_FALSE$ac_delim ENABLE_TOOLS_TRUE!$ENABLE_TOOLS_TRUE$ac_delim ENABLE_TOOLS_FALSE!$ENABLE_TOOLS_FALSE$ac_delim ENABLE_SAMPLES_TRUE!$ENABLE_SAMPLES_TRUE$ac_delim ENABLE_SAMPLES_FALSE!$ENABLE_SAMPLES_FALSE$ac_delim WITH_DOCUMENTATION_TRUE!$WITH_DOCUMENTATION_TRUE$ac_delim WITH_DOCUMENTATION_FALSE!$WITH_DOCUMENTATION_FALSE$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim DEPDIR!$DEPDIR$ac_delim am__include!$am__include$ac_delim am__quote!$am__quote$ac_delim AMDEP_TRUE!$AMDEP_TRUE$ac_delim AMDEP_FALSE!$AMDEP_FALSE$ac_delim AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF CEOF$ac_eof _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF CCDEPMODE!$CCDEPMODE$ac_delim am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim SED!$SED$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim LN_S!$LN_S$ac_delim ECHO!$ECHO$ac_delim AR!$AR$ac_delim RANLIB!$RANLIB$ac_delim DSYMUTIL!$DSYMUTIL$ac_delim NMEDIT!$NMEDIT$ac_delim CPP!$CPP$ac_delim CXX!$CXX$ac_delim CXXFLAGS!$CXXFLAGS$ac_delim ac_ct_CXX!$ac_ct_CXX$ac_delim CXXDEPMODE!$CXXDEPMODE$ac_delim am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim CXXCPP!$CXXCPP$ac_delim F77!$F77$ac_delim FFLAGS!$FFLAGS$ac_delim ac_ct_F77!$ac_ct_F77$ac_delim LIBTOOL!$LIBTOOL$ac_delim acx_pthread_config!$acx_pthread_config$ac_delim PTHREAD_CC!$PTHREAD_CC$ac_delim PTHREAD_LIBS!$PTHREAD_LIBS$ac_delim PTHREAD_CFLAGS!$PTHREAD_CFLAGS$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 30; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" # Compute $ac_file's index in $config_headers. _am_arg=$ac_file _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir=$dirpart/$fdir case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi libupnp-1.8.0~svn20100507/configure.ac0000644000175000017500000003345511360640053014154 00000000000000# -*- Autoconf -*- # # Top-level configure.ac file for libupnp # # Process this file with autoconf to produce a configure script. # # (C) Copyright 2005-2007 RĂ©mi Turboult # AC_PREREQ(2.60) AC_INIT([libupnp], [1.8.0], [mroberto@users.sourceforge.net]) dnl ############################################################################ dnl # *Independently* of the above libupnp package version, the libtool version dnl # of the 3 libraries need to be updated whenever there is a change released: dnl # "current:revision:age" (this is NOT the same as the package version), dnl # where: dnl # - library code modified: revision++ dnl # - interfaces changed/added/removed: current++ and revision=0 dnl # - interfaces added: age++ dnl # - interfaces removed: age=0 dnl # *please update only once, before a formal release, not for each change* dnl # dnl ############################################################################ dnl # Release 1.4.1: dnl #AC_SUBST([LT_VERSION_IXML], [2:2:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) dnl #AC_SUBST([LT_VERSION_UPNP], [2:2:0]) dnl # dnl ############################################################################ dnl # Release 1.4.6: dnl # "current:revision:age" dnl # dnl # - Code has changed in ixml dnl # revision: 2 -> 3 dnl # - Code has changed in threadutil dnl # revision: 2 -> 3 dnl # - Interface added in threadutil dnl # current: 2 -> 3 dnl # revisiion: 3 -> 0 dnl # age: 0 -> 1 dnl # - Code has changed in upnp dnl # revision: 2 -> 3 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:3:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1]) dnl #AC_SUBST([LT_VERSION_UPNP], [2:3:0]) dnl # dnl ############################################################################ dnl # Release 1.6.0: dnl # "current:revision:age" dnl # dnl # - Code has changed in ixml dnl # revision: 3 -> 4 dnl # - Code has changed in threadutil dnl # revision: 0 -> 1 dnl # - Code has changed in upnp dnl # revision: 3 -> 4 dnl # - Interface changed in upnp dnl # current: 2 -> 3 dnl # revision: 4 -> 0 dnl # - Interface removed in upnp dnl # age: 0 -> 0 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1]) dnl #AC_SUBST([LT_VERSION_UPNP], [3:0:0]) dnl # dnl ############################################################################ dnl # Release 1.6.1: dnl # "current:revision:age" dnl # dnl # - Code has changed in threadutil dnl # revision: 1 -> 2 dnl # - Interface added in threadutil dnl # current: 3 -> 4 dnl # revision: 2 -> 0 dnl # - Interface added in threadutil dnl # age: 1 -> 2 dnl # - Code has changed in upnp dnl # revision: 0 -> 1 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) dnl #AC_SUBST([LT_VERSION_UPNP], [3:1:0]) dnl # dnl ############################################################################ dnl # Release 1.6.2: dnl # "current:revision:age" dnl # dnl # - Code has changed in upnp dnl # revision: 1 -> 2 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) dnl #AC_SUBST([LT_VERSION_UPNP], [3:2:0]) dnl # dnl ############################################################################ dnl # Release 1.6.3: dnl # "current:revision:age" dnl # dnl # - Code has changed in threadutil dnl # revision: 0 -> 1 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:1:2]) dnl #AC_SUBST([LT_VERSION_UPNP], [3:2:0]) dnl # dnl ############################################################################ dnl # Release 1.6.4: dnl # "current:revision:age" dnl # dnl # - Code has changed in threadutil dnl # revision: 1 -> 2 dnl # - Code has changed in upnp dnl # revision: 2 -> 3 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:2:2]) dnl #AC_SUBST([LT_VERSION_UPNP], [3:3:0]) dnl # dnl ############################################################################ dnl # Release 1.6.5: dnl # "current:revision:age" dnl # dnl # - Code has changed in upnp dnl # revision: 3 -> 4 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:2:2]) dnl #AC_SUBST([LT_VERSION_UPNP], [3:4:0]) dnl # dnl ############################################################################ dnl # Release 1.6.6: dnl # "current:revision:age" dnl # dnl # - Code has changed in threadutil dnl # revision: 2 -> 3 dnl # - Code has changed in upnp dnl # revision: 4 -> 5 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:3:2]) dnl #AC_SUBST([LT_VERSION_UPNP], [3:5:0]) dnl # dnl ############################################################################ dnl # Release 1.8.0: dnl # "current:revision:age" dnl # dnl # - Code has changed in upnp dnl # revision: 5 -> 6 dnl # - Interfaces have been changed, added and removed in upnp dnl # current: 3 -> 4 dnl # revision: 6 -> 0 dnl # - Interface has been removed in upnp dnl # age = 0 dnl # - Code has changed in threadutil dnl # revision: 3 -> 4 dnl # - Interfaces have been changed, added and removed in upnp dnl # current: 4 -> 5 dnl # revision: 4 -> 0 dnl # dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0]) dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:0:2]) dnl #AC_SUBST([LT_VERSION_UPNP], [4:0:0]) dnl # dnl ############################################################################ AC_SUBST([LT_VERSION_IXML], [2:4:0]) AC_SUBST([LT_VERSION_THREADUTIL], [5:0:2]) AC_SUBST([LT_VERSION_UPNP], [4:0:0]) dnl ############################################################################ dnl # Repeating the algorithm to place it closer to the modificatin place: dnl # - library code modified: revision++ dnl # - interfaces changed/added/removed: current++ and revision=0 dnl # - interfaces added: age++ dnl # - interfaces removed: age=0 dnl # *please update only once, before a formal release, not for each change* dnl ############################################################################ AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([upnp/inc/upnp.h]) AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2]) # # Get canonical host names in host and host_os # AC_CANONICAL_HOST # # There are 3 configuration files : # 1) "./autoconfig.h" is auto-generated and used only internally during build # (usually named "config.h" but conflicts with the file below) # 2) "./upnp/src/inc/config.h" is static and contains some compile-time # parameters. This file was previously in "./upnp/inc" but is no longer # installed (contains internal definitions only). # 3) "./upnp/inc/upnpconfig.h" is auto-generated and installed with the # libraries : it contains information on the configuration of the # installed libraries. # AC_CONFIG_HEADERS([autoconfig.h upnp/inc/upnpconfig.h]) #AC_SYS_LARGEFILE_SENSITIVE AC_REVISION([$Revision: 1.11 $]) upnpmaj=`echo "$PACKAGE_VERSION" | sed 's/\..*//' ` upnpmin=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.// ; s/[^0-9].*$//' `] upnppatch=[`echo "$PACKAGE_VERSION" | sed 's/^[^.]\.[^.]\.// ; s/[^0-9].*$//' `] AC_DEFINE_UNQUOTED([UPNP_VERSION_STRING], "$PACKAGE_VERSION", [see upnpconfig.h]) AC_DEFINE_UNQUOTED([UPNP_VERSION_MAJOR], $upnpmaj, [see upnpconfig.h]) AC_DEFINE_UNQUOTED([UPNP_VERSION_MINOR], $upnpmin, [see upnpconfig.h]) AC_DEFINE_UNQUOTED([UPNP_VERSION_PATCH], $upnppatch, [see upnpconfig.h]) # # Check for DEBUG flag # RT_BOOL_ARG_ENABLE([debug], [no], [extra debugging code]) if test "x$enable_debug" = xyes ; then AC_DEFINE(UPNP_HAVE_DEBUG, 1, [see upnpconfig.h]) AC_DEFINE(DEBUG, 1, [Define to 1 to compile debug code]) else AC_DEFINE(NO_DEBUG, 1, [Define to 1 to prevent some debug code]) AC_DEFINE(NDEBUG, 1, [Define to 1 to prevent compilation of assert()]) fi # # Check for libupnp subsets # RT_BOOL_ARG_ENABLE([client], [yes], [control point code (client)]) if test "x$enable_client" = xyes ; then AC_DEFINE(UPNP_HAVE_CLIENT, 1, [see upnpconfig.h]) fi RT_BOOL_ARG_ENABLE([device], [yes], [device specific code (implies --disable-webserver if disabled)]) if test "x$enable_device" = xyes ; then AC_DEFINE(UPNP_HAVE_DEVICE, 1, [see upnpconfig.h]) fi if test "x$enable_device" = xno ; then enable_webserver=no else RT_BOOL_ARG_ENABLE([webserver], [yes], [integrated web server]) fi AM_CONDITIONAL(ENABLE_WEBSERVER, test x"$enable_webserver" = xyes) if test "x$enable_webserver" = xyes ; then AC_DEFINE(UPNP_HAVE_WEBSERVER, 1, [see upnpconfig.h]) fi RT_BOOL_ARG_ENABLE([tools], [yes], [helper APIs in upnptools.h]) if test "x$enable_tools" = xyes ; then AC_DEFINE(UPNP_HAVE_TOOLS, 1, [see upnpconfig.h]) fi RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code]) # # doc installation # autoconf >= 2.60 already defines ${docdir}, but we will not use its # default value, which is ${datarootdir}/doc/${PACKAGE_TARNAME}. # That would give us ${datarootdir}/doc/libupnp, and we want the package # version on that. # docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}" AC_MSG_CHECKING([for documentation directory]) AC_ARG_WITH( [documentation], AS_HELP_STRING( [--with-documentation=directory_name], [where documentation is installed @<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@]) AS_HELP_STRING( [--without-documentation], [do not install the documentation]), [], [with_documentation=no]) # # If something has been entered after an equal sign, assume it is the directory # if test x"$with_documentation" != xyes -a x"$with_documentation" != xno; then docdir="$with_documentation" fi AM_CONDITIONAL(WITH_DOCUMENTATION, test x"$with_documentation" != xno) AC_SUBST(docdir) AC_MSG_RESULT($docdir) # # Checks for programs # AC_PROG_CC AM_PROG_CC_C_O AC_PROG_LIBTOOL AC_PROG_INSTALL AC_PROG_MAKE_SET AC_PROG_EGREP # # Default compilation flags # echo "--------------------- Default compilation flags -------------------------------" echo host is $host echo host_os is $host_os case $host_os in freebsd*) echo "Using FreeBSD specific compiler settings" # Put FreeBSD specific compiler flags here ;; *) echo "Using non-specific system compiler settings" if test x"$enable_debug" = xyes; then # AC_PROG_CC already sets CFLAGS to "-g -O2" by default #: # Use -O0 in debug so that variables do not get optimized out AX_CFLAGS_GCC_OPTION([-O0]) else # add optimise for size AX_CFLAGS_GCC_OPTION([-Os]) fi ;; esac AX_CFLAGS_WARN_ALL echo "-------------------------------------------------------------------------------" # # Lot's of stuff to ensure large file support # AC_TYPE_SIZE_T AC_TYPE_OFF_T AC_DEFINE([_LARGE_FILE_SOURCE], [], [Large files support]) AC_DEFINE([_FILE_OFFSET_BITS], [64], [File Offset size]) # # Are we targetting Win32? # AC_MSG_CHECKING([for Win32]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #ifdef WIN32 #error Yup #endif ],[])], [ac_cv_win32="no"], [ac_cv_win32="yes"]) if test "$ac_cv_win32" = "yes"; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi # # Checks for header files (which aren't needed on Win32) # AC_HEADER_STDC if test "$ac_cv_win32" = "no"; then # libupnp code doesn't use autoconf variables yet, # so just abort if a header file is not found. AC_CHECK_HEADERS( [ \ arpa/inet.h \ fcntl.h \ inttypes.h \ limits.h \ netdb.h \ netinet/in.h \ stdlib.h \ string.h \ sys/ioctl.h \ sys/socket.h \ sys/time.h \ syslog.h \ unistd.h \ ], [], [AC_MSG_ERROR([required header file missing])]) fi # # Checks for typedefs, structures, and compiler characteristics # AC_C_CONST # The test for socklen_t was getting it wrong when it exists but is in ws2tcpip.h, # so we use a new test. #TYPE_SOCKLEN_T AC_CHECK_HEADERS([sys/types.h sys/socket.h ws2tcpip.h]) AC_MSG_CHECKING(for socklen_t) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ #ifdef HAVE_SYS_TYPES_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_WS2TCPIP_H #include #endif ],[ socklen_t t = 0; return t; ]) ],[ac_cv_socklen_t="yes"],[ac_cv_socklen_t="no"]) if test "$ac_cv_socklen_t" = "yes"; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no, using int]) AC_DEFINE(socklen_t, int, [Type for storing the length of struct sockaddr]) fi # # Checks for library functions # AC_FUNC_VPRINTF AC_FUNC_FSEEKO AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)]) # # Solaris needs -lsocket -lnsl -lrt AC_SEARCH_LIBS([bind], [socket]) AC_SEARCH_LIBS([gethostbyname], [nsl]) AC_SEARCH_LIBS([sched_getparam], [rt]) # # Checks for POSIX Threads # echo "--------------------------- pthread stuff -------------------------------------" ACX_PTHREAD( [], [AC_MSG_ERROR([POSIX threads are required to build this program])]) # # Update environment variables for pthreads # CC="$PTHREAD_CC" CFLAGS="$PTHREAD_CFLAGS $CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # # Determine if pthread_rwlock_t is available # echo "----------------------- pthread_rwlock_t stuff --------------------------------" AC_MSG_CHECKING([if pthread_rwlock_t is available]) AC_LANG([C]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [#include ], [pthread_rwlock_t *x;])], [AC_DEFINE([UPNP_USE_RWLOCK], [1], [Use pthread_rwlock_t]) AC_MSG_RESULT([yes, supported without any options])], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [#define _GNU_SOURCE #include ], [pthread_rwlock_t *x;])], [AC_DEFINE([UPNP_USE_RWLOCK], [1], [Use pthread_rwlock_t]) CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" AC_MSG_RESULT([yes, definition of _GNU_SOURCE required])], [AC_DEFINE([UPNP_USE_RWLOCK], [0], [Do not use pthread_rwlock_t]) AC_MSG_RESULT([no, needs to fallback to pthread_mutex]) AC_MSG_ERROR([pthread_rwlock_t not available])])]) echo "-------------------------------------------------------------------------------" AC_CONFIG_FILES([ Makefile ixml/Makefile ixml/doc/Makefile threadutil/Makefile upnp/Makefile upnp/doc/Makefile upnp/sample/Makefile docs/dist/Makefile libupnp.pc ]) AC_OUTPUT libupnp-1.8.0~svn20100507/autoconfig.h.in0000644000175000017500000001014711360640266014601 00000000000000/* autoconfig.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 to compile debug code */ #undef DEBUG /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ #undef HAVE_FSEEKO /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `compat' library (-lcompat). */ #undef HAVE_LIBCOMPAT /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WS2TCPIP_H /* Define to 1 to prevent compilation of assert() */ #undef NDEBUG /* Define to 1 to prevent some debug code */ #undef NO_DEBUG /* 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 /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* see upnpconfig.h */ #undef UPNP_HAVE_CLIENT /* see upnpconfig.h */ #undef UPNP_HAVE_DEBUG /* see upnpconfig.h */ #undef UPNP_HAVE_DEVICE /* see upnpconfig.h */ #undef UPNP_HAVE_TOOLS /* see upnpconfig.h */ #undef UPNP_HAVE_WEBSERVER /* Do not use pthread_rwlock_t */ #undef UPNP_USE_RWLOCK /* see upnpconfig.h */ #undef UPNP_VERSION_MAJOR /* see upnpconfig.h */ #undef UPNP_VERSION_MINOR /* see upnpconfig.h */ #undef UPNP_VERSION_PATCH /* see upnpconfig.h */ #undef UPNP_VERSION_STRING /* Version number of package */ #undef VERSION /* File Offset size */ #undef _FILE_OFFSET_BITS /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ #undef _LARGEFILE_SOURCE /* Large files support */ #undef _LARGE_FILE_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `long int' if does not define. */ #undef off_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Type for storing the length of struct sockaddr */ #undef socklen_t libupnp-1.8.0~svn20100507/Makefile.am0000644000175000017500000000242211025042304013701 00000000000000# # Top-level "Makefile.am" for libupnp # # Copyright (C) 2005 Rémi Turboult # ACLOCAL_AMFLAGS = -I m4 DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-samples SUBDIRS = \ ixml \ threadutil \ upnp \ docs/dist EXTRA_DIST = \ Doxyfile \ libupnp.pc.in \ LICENSE \ THANKS \ libupnp.spec \ build/libupnp.bpf \ build/libupnp.bpr \ build/libupnp.dsp \ build/libupnp.dsw \ build/inc/autoconfig.h \ build/inc/config.h \ build/inc/upnpconfig.h \ build/msvc/inttypes.h \ build/msvc/stdint.h \ build/vc8/ixml.vcproj \ build/vc8/libupnp.sln \ build/vc8/libupnp.vcproj \ build/vc8/threadutil.vcproj \ build/vc8/tvcombo.vcproj \ build/vc8/tvctrlpt.vcproj \ build/vc8/tvdevice.vcproj \ build/vc9/ixml.vcproj \ build/vc9/libupnp.sln \ build/vc9/libupnp.vcproj \ build/vc9/threadutil.vcproj \ build/vc9/tvcombo.vcproj \ build/vc9/tvctrlpt.vcproj \ build/vc9/tvdevice.vcproj # This variable must have 'exec' in its name, in order to be installed # by 'install-exec' target (instead of default 'install-data') pkgconfigexecdir = $(libdir)/pkgconfig pkgconfigexec_DATA = libupnp.pc $(pkgconfigexec_DATA): config.status if WITH_DOCUMENTATION doc_DATA = LICENSE README NEWS TODO THANKS endif CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt libupnp-1.8.0~svn20100507/Makefile.in0000644000175000017500000005565511360640115013740 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ # # Top-level "Makefile.am" for libupnp # # Copyright (C) 2005 Rémi Turboult # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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 = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/autoconfig.h.in \ $(srcdir)/libupnp.pc.in $(top_srcdir)/configure \ $(top_srcdir)/upnp/inc/upnpconfig.h.in AUTHORS COPYING \ ChangeLog INSTALL NEWS THANKS TODO 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/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.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 \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = autoconfig.h $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = libupnp.pc SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive 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 = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(pkgconfigexecdir)" pkgconfigexecDATA_INSTALL = $(INSTALL_DATA) DATA = $(pkgconfigexec_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-samples SUBDIRS = \ ixml \ threadutil \ upnp \ docs/dist EXTRA_DIST = \ Doxyfile \ libupnp.pc.in \ LICENSE \ THANKS \ libupnp.spec \ build/libupnp.bpf \ build/libupnp.bpr \ build/libupnp.dsp \ build/libupnp.dsw \ build/inc/autoconfig.h \ build/inc/config.h \ build/inc/upnpconfig.h \ build/msvc/inttypes.h \ build/msvc/stdint.h \ build/vc8/ixml.vcproj \ build/vc8/libupnp.sln \ build/vc8/libupnp.vcproj \ build/vc8/threadutil.vcproj \ build/vc8/tvcombo.vcproj \ build/vc8/tvctrlpt.vcproj \ build/vc8/tvdevice.vcproj \ build/vc9/ixml.vcproj \ build/vc9/libupnp.sln \ build/vc9/libupnp.vcproj \ build/vc9/threadutil.vcproj \ build/vc9/tvcombo.vcproj \ build/vc9/tvctrlpt.vcproj \ build/vc9/tvdevice.vcproj # This variable must have 'exec' in its name, in order to be installed # by 'install-exec' target (instead of default 'install-data') pkgconfigexecdir = $(libdir)/pkgconfig pkgconfigexec_DATA = libupnp.pc CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt all: autoconfig.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ cd $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) autoconfig.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/autoconfig.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status autoconfig.h $(srcdir)/autoconfig.h.in: $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ upnp/inc/upnpconfig.h: upnp/inc/stamp-h2 @if test ! -f $@; then \ rm -f upnp/inc/stamp-h2; \ $(MAKE) $(AM_MAKEFLAGS) upnp/inc/stamp-h2; \ else :; fi upnp/inc/stamp-h2: $(top_srcdir)/upnp/inc/upnpconfig.h.in $(top_builddir)/config.status @rm -f upnp/inc/stamp-h2 cd $(top_builddir) && $(SHELL) ./config.status upnp/inc/upnpconfig.h distclean-hdr: -rm -f autoconfig.h stamp-h1 upnp/inc/upnpconfig.h upnp/inc/stamp-h2 libupnp.pc: $(top_builddir)/config.status $(srcdir)/libupnp.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool install-pkgconfigexecDATA: $(pkgconfigexec_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigexecdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigexecdir)" @list='$(pkgconfigexec_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(pkgconfigexecDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigexecdir)/$$f'"; \ $(pkgconfigexecDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigexecdir)/$$f"; \ done uninstall-pkgconfigexecDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfigexec_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pkgconfigexecdir)/$$f'"; \ rm -f "$(DESTDIR)$(pkgconfigexecdir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) autoconfig.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) autoconfig.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) autoconfig.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) autoconfig.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d $(distdir) || mkdir $(distdir) @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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) autoconfig.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigexecdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-pkgconfigexecDATA install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigexecDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzma dist-shar dist-tarZ dist-zip distcheck \ distclean distclean-generic distclean-hdr distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck 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-pkgconfigexecDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-pkgconfigexecDATA $(pkgconfigexec_DATA): config.status @WITH_DOCUMENTATION_TRUE@ doc_DATA = LICENSE README NEWS TODO THANKS # 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: libupnp-1.8.0~svn20100507/libupnp.pc.in0000644000175000017500000000041011021325542014246 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libupnp Description: Linux SDK for UPnP Devices Version: @VERSION@ Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp libupnp-1.8.0~svn20100507/build-aux/0000777000175000017500000000000011373047467013650 500000000000000libupnp-1.8.0~svn20100507/build-aux/compile0000755000175000017500000000717311342563616015145 00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2005-05-14.22 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # 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 or send patches to # . 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 . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; esac ofile= cfile= eat= 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 -e 's|^.*/||' -e '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 mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then 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-end: "$" # End: libupnp-1.8.0~svn20100507/build-aux/depcomp0000755000175000017500000004271311342563617015144 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2007-03-29.01 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 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 # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # 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. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. 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 outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac 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 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## 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. ## 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 ## that the space means something, we add a space to the output as ## well. ## 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" rm -f "$tmpdepfile" ;; hp) # 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 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # 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 # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; 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 # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # 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:'. 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" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -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: # 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 \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" 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 \'. # 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" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; 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'. # 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. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break 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" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # 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. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$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" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## 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" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # 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-end: "$" # End: libupnp-1.8.0~svn20100507/build-aux/ltmain.sh0000644000175000017500000060646711312064261015407 00000000000000# ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008 Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # 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 of the License, 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # 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. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION="1.5.26 Debian 1.5.26-4+lenny1" TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" # Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= duplicate_deps=no preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 ##################################### # Shell function definitions: # This seems to be the best place for them # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $mkdir "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || { $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 exit $EXIT_FAILURE } fi $echo "X$my_tmpdir" | $Xsed } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ $SED -n -e '1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case "$@ " in " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 exit $EXIT_FAILURE fi } # func_extract_archives gentop oldlib ... func_extract_archives () { my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" my_status="" $show "${rm}r $my_gentop" $run ${rm}r "$my_gentop" $show "$mkdir $my_gentop" $run $mkdir "$my_gentop" my_status=$? if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then exit $my_status fi for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) extracted_serial=`expr $extracted_serial + 1` my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" $show "${rm}r $my_xdir" $run ${rm}r "$my_xdir" $show "$mkdir $my_xdir" $run $mkdir "$my_xdir" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then exit $exit_status fi case $host in *-darwin*) $show "Extracting $my_xabs" # Do not bother doing anything if just a dry run if test -z "$run"; then darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` if test -n "$darwin_arches"; then darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= $show "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we have a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` lipo -create -output "$darwin_file" $darwin_files done # $darwin_filelist ${rm}r unfat-$$ cd "$darwin_orig_dir" else cd "$darwin_orig_dir" func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches fi # $run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" disable_libs=no # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) echo "\ $PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $? ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $? ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $? ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag preserve_args="$preserve_args --tag" ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi case $disable_libs in no) ;; shared) build_libtool_libs=no build_old_libs=yes ;; static) build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` ;; esac # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, and some SunOS ksh mistreat backslash-escaping # in scan sets (worked around with variable expansion), # and furthermore cannot handle '|' '&' '(' ')' in scan sets # at all, so we specify them separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.[fF][09]?) xform=[fF][09]. ;; *.for) xform=for ;; *.java) xform=java ;; *.obj) xform=obj ;; *.sx) xform=sx ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` case $qlibobj in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qlibobj="\"$qlibobj\"" ;; esac test "X$libobj" != "X$qlibobj" \ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo "$srcfile" > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` case $qsrcfile in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qsrcfile="\"$qsrcfile\"" ;; esac $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; darwin_framework|darwin_framework_skip) test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework|-arch|-isysroot) case " $CC " in *" ${arg} ${1} "* | *" ${arg} ${1} "*) prev=darwin_framework_skip ;; *) compiler_flags="$compiler_flags $arg" prev=darwin_framework ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" notinst_path="$notinst_path $dir" fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. -model) compile_command="$compile_command $arg" compiler_flags="$compiler_flags $arg" finalize_command="$finalize_command $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) compiler_flags="$compiler_flags $arg" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -module) module=yes continue ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m* pass through architecture-specific compiler args for GCC # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" compiler_flags="$compiler_flags $arg" continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then exit $exit_status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` if eval $echo \"$deplib\" 2>/dev/null \ | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $absdir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes ; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP ": [^:]* bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$deplibdir/$depdepl" ; then depdepl="$deplibdir/$depdepl" elif test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" else # Can't find it, oh well... depdepl= fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) case " $deplibs" in *\ -l* | *\ -L*) $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; esac if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then major=`expr $current - $age` else major=`expr $current - $age + 1` fi case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name=`expr $a_deplib : '-l\(.*\)'` # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then case $archive_cmds in *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; esac else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$echo "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$output_la-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext k=`expr $k + 1` output=$output_objdir/$output_la-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadable object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then $show "${rm}r $gentop" $run ${rm}r "$gentop" fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) case " $deplibs" in *\ -l* | *\ -L*) $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; esac if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac else $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* ) $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ " case $host in *cygwin* | *mingw* ) $echo >> "$output_objdir/$dlsyms" "\ /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs */ struct { " ;; * ) $echo >> "$output_objdir/$dlsyms" "\ const struct { " ;; esac $echo >> "$output_objdir/$dlsyms" "\ const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. case $host in *cygwin* | *mingw* ) if test -f "$output_objdir/${outputname}.def" ; then compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` else compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` fi ;; * ) compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` ;; esac ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" exit_status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $exit_status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) output_name=`basename $output` output_path=`dirname $output` cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) /* -DDEBUG is fairly common in CFLAGS. */ #undef DEBUG #if defined DEBUGWRAPPER # define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) #else # define DEBUG(format, ...) #endif const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); const char * base_name (const char *name); char * find_executable(const char *wrapper); int check_executable(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup (base_name (argv[0])); DEBUG("(main) argv[0] : %s\n",argv[0]); DEBUG("(main) program_name : %s\n",program_name); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = find_executable(argv[0]); if (newargz[1] == NULL) lt_fatal("Couldn't find %s", argv[0]); DEBUG("(main) found exe at : %s\n",newargz[1]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" return 127; } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char)name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable(const char * path) { struct stat st; DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && ( /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ #if defined (S_IXOTH) ((st.st_mode & S_IXOTH) == S_IXOTH) || #endif #if defined (S_IXGRP) ((st.st_mode & S_IXGRP) == S_IXGRP) || #endif ((st.st_mode & S_IXUSR) == S_IXUSR)) ) return 1; else return 0; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise */ char * find_executable (const char* wrapper) { int has_slash = 0; const char* p; const char* p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char* concat_name; DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char* path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char* q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR(*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable(concat_name)) return concat_name; XFREE(concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen(tmp); concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable(concat_name)) return concat_name; XFREE(concat_name); return NULL; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \$*\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "copying selected object files to avoid basename conflicts..." if test -z "$gentop"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" $show "${rm}r $gentop" $run ${rm}r "$gentop" $show "$mkdir $gentop" $run $mkdir "$gentop" exit_status=$? if test "$exit_status" -ne 0 && test ! -d "$gentop"; then exit $exit_status fi fi save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase counter=`expr $counter + 1` case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" $run ln "$obj" "$gentop/$newobj" || $run cp "$obj" "$gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` else relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit } done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # Note that it is not necessary on cygwin/mingw to append a dot to # foo even if both foo and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. # # If there is no directory component, then add one. case $wrapper in */* | *\\*) . ${wrapper} ;; *) . ./${wrapper} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir=`func_mktempdir` file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "X----------------------------------------------------------------------" | $Xsed $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else if test ! -f "$dir/$dlname"; then $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $? # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared disable_libs=shared # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static disable_libs=static # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: libupnp-1.8.0~svn20100507/build-aux/config.guess0000755000175000017500000012753411342563617016114 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-23' # This file 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 of the License, 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, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # 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. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libupnp-1.8.0~svn20100507/build-aux/install-sh0000755000175000017500000003246411342563616015574 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: libupnp-1.8.0~svn20100507/build-aux/config.sub0000755000175000017500000010115311342563617015544 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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 of the License, 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, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # 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. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libupnp-1.8.0~svn20100507/build-aux/missing0000755000175000017500000002557711342563616015176 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # 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. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: libupnp-1.8.0~svn20100507/libupnp.spec0000644000175000017500000000712111021325544014201 00000000000000Version: 1.6.6 Summary: Universal Plug and Play (UPnP) SDK Name: libupnp Release: 1%{?dist} License: BSD Group: System Environment/Libraries URL: http://www.libupnp.org/ Source: http://puzzle.dl.sourceforge.net/sourceforge/pupnp/%{name}-%{version}.tar.bz2 Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %define docdeveldir %{_docdir}/%{name}-devel-%{version} %description The Universal Plug and Play (UPnP) SDK for Linux provides support for building UPnP-compliant control points, devices, and bridges on Linux. %package devel Group: Development/Libraries Summary: Include files needed for development with libupnp Requires: libupnp = %{version}-%{release} %description devel The libupnp-devel package contains the files necessary for development with the UPnP SDK libraries. %prep %setup -q %build %configure --with-documentation make %{?_smp_mflags} %install test "$RPM_BUILD_ROOT" != "/" && rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT #create the doc devel dir %{__mkdir_p} %{buildroot}%{docdeveldir} #mv examples dir and pdf file to the doc devel dir %{__mv} %{buildroot}%{docdir}/examples \ %{buildroot}%{docdeveldir}/ %{__mv} %{buildroot}%{docdir}/UPnP_Programming_Guide.pdf \ %{buildroot}%{docdeveldir}/ %{__mv} %{buildroot}%{docdir}/IXML_Programming_Guide.pdf \ %{buildroot}%{docdeveldir}/ %{__mv} %{buildroot}%{docdir}/html \ %{buildroot}%{docdeveldir}/ %{__rm} %{buildroot}%{_libdir}/{libixml.la,libthreadutil.la,libupnp.la} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %defattr(-,root,root,-) %doc %{docdir} %{_libdir}/libixml.so.* %{_libdir}/libthreadutil.so.* %{_libdir}/libupnp.so.* %files devel %defattr(0644,root,root,0755) %doc %{docdeveldir} %{_includedir}/upnp/ %{_libdir}/libixml.so %{_libdir}/libthreadutil.so %{_libdir}/libupnp.so %{_libdir}/libixml.a %{_libdir}/libthreadutil.a %{_libdir}/libupnp.a %{_libdir}/pkgconfig/libupnp.pc %clean rm -rf %{buildroot} %changelog * Mon Nov 19 2007 Marcelo Jimenez - 1.6.2-1 - Update to version 1.6.2 * Mon Nov 19 2007 Marcelo Jimenez - 1.4.7-1 - Update to version 1.4.7 * Fri Feb 02 2007 Eric Tanguy - 1.4.2-1 - Update to version 1.4.2 * Wed Jul 05 2006 Eric Tanguy - 1.4.1-1 - Update to version 1.4.1 * Fri Jun 23 2006 Eric Tanguy - 1.4.0-3 - modified patch for x86_64 arch * Fri Jun 23 2006 Eric Tanguy - 1.4.0-2 - Add a patch for x86_64 arch * Sun Jun 11 2006 Eric Tanguy - 1.4.0-1 - Update to 1.4.0 * Sun Mar 05 2006 Eric Tanguy - 1.3.1-1 - Update to 1.3.1 * Tue Feb 14 2006 Eric Tanguy - 1.2.1a-6 - Rebuild for FC5 * Fri Feb 10 2006 Eric Tanguy - 1.2.1a-5 - Rebuild for FC5 * Mon Jan 9 2006 Eric Tanguy 1.2.1a-4 - Include libupnp.so symlink in package to take care of non versioning of libupnp.so.1.2.1 * Sun Jan 8 2006 Paul Howarth 1.2.1a-3 - Disable stripping of object code for sane debuginfo generation - Edit makefiles to hnnor RPM optflags - Install libraries in %%{_libdir} rather than hardcoded /usr/lib - Fix libupnp.so symlink - Own directory %%{_includedir}/upnp - Fix permissions in -devel package * Fri Jan 06 2006 Eric Tanguy 1.2.1a-2 - Use 'install -p' to preserve timestamps - Devel now require full version-release of main package * Thu Dec 22 2005 Eric Tanguy 1.2.1a-1 - Modify spec file from http://rpm.pbone.net/index.php3/stat/4/idpl/2378737/com/libupnp-1.2.1a_DSM320-3.i386.rpm.html libupnp-1.8.0~svn20100507/AUTHORS0000644000175000017500000000000011021325543012710 00000000000000libupnp-1.8.0~svn20100507/INSTALL0000644000175000017500000000000011021325545012673 00000000000000libupnp-1.8.0~svn20100507/ChangeLog0000644000175000017500000016441111372263256013446 00000000000000******************************************************************************* Version 1.8.0 ******************************************************************************* 2010-04-25 Marcelo Jimenez Separation of the ClientSubscription object. 2010-04-24 Marcelo Jimenez Protect the object destructors agains null pointers on deletion, which should be something valid. 2010-03-27 Marcelo Jimenez SF Patch Tracker [ 2987390 ] upnp_debug vs. ixml_debug Thanks for the load of updates, I'm still assimilating them ! Could I make a suggestion though? The addition of printNodes(IXML_Node) to upnpdebug a dds a new dependency on ixml.h for anything using upnpdebug.h. I'm making quite a bit of use of upnpdebug in porting things to version 1.8.0, and I'd prefer it if printNodes could be added to ixmldebug.h instead. I'm attach ing a patch, what do you think ? Nick 2010-03-27 Marcelo Jimenez * Forward port of svn revision 505: SF Patch Tracker [ 2836704 ] Patch for Solaris10 compilation and usage. Submitted By: zephyrus ( zephyrus00jp ) 2010-03-20 Marcelo Jimenez * SF Patch Tracker [ 2969188 ] 1.8.0: patch for FreeBSD compilation Submitted By: Nick Leverton (leveret) Fix the order of header inclusion for FreeBSD. 2010-03-20 Marcelo Jimenez * Forward port of svn revision 502: SF Patch Tracker [ 2836704 ] Search for nested serviceList (not stopping at the first lis Submitted By: zephyrus ( zephyrus00jp ) Internet Gateway Device description contains nested serviceList (rootdevice -> servicelist, subdevice and subdevice has the lower-level serviceList, etc..) Unfrotunately, the sample code sample_util.c used by tv_device sample, etc. has a code that looks for only the first top-level serviceList. This results in the failure to read all the services of an IGD xml description. Attached patch modifies this behavior and looks for the service by visiting all the serviceList in xml document in turn. With the modified patch (ad additional modification), I could simulate an IGD device and created a modified control program for that. Patch against 1.6.6 TIA. 2010-03-20 Marcelo Jimenez * SF Patch Tracker [ 2973319 ] Problem in commit 499 Submitted By: Nick Leverton (leveret) Afraid that this doesn't compile, it seems retval should be retVal in two places. 2010-03-16 Marcelo Jimenez * Fix for the ithread_mutex_unlock() logic in UpnpInit(). Thanks for Nicholas Kraft. 2010-03-15 Marcelo Jimenez * SF Patch Tracker [ 2962606 ] Autorenewal errors: invalid SID, too-short renewal interval Submitted By: Nick Leverton (leveret) Auto-renewals send an invalid SID due to a missing UpnpString_get_String call. They also send a renewal interval of 0 instead of copying it from the original subscription. 2010-03-15 Marcelo Jimenez * SF Patch Tracker [ 2964685 ] patch for avoiding inet_ntoa (1.8.0) Submitted By: Nick Leverton (leveret) Seems like SF's tracker won't let me add a patch to someone else's issue ?! This refers to https://sourceforge.net/support/tracker.php?aid=2724578 The calls to inet_ntoa are in getlocalhostname(), which is called from UpnpInit when it is returning the bound IP address. UpnpInit/getlocalhostname hasn't been updated to IPv6, I presume this is deliberate so that it doesn't start returning IPv6 addresses and overwriting the caller's IPv4-sized allocation. The attached patch just updates getlocalhostname to use inet_ntop instead of inet_ntoa, and also documents the fact that UpnpInit is IPv4 only whilst UpnpInnit2 is both IPv4 and IPv6. A fuller solution might be to change UpnpInit to use some variant on UpnpGetIfInfo. UpnpInit could still be left as IPv4 only if desired - perhaps UpnpGetIfInfo could take an option for the desired address family. getlocalhostname and its own copy of the interface scanning code would then be redundant. I don't have IPv6 capability here though so I'm reluctant to change the IPv6 code, as I have no way to test it. 2010-03-15 Marcelo Jimenez * SF Patch Tracker [ 2724578 ] patch for avoiding memory leaks when add devices each time a device been added, UpnpInit() is called, on exit, UpnpFinish() is called, but the memories allocated by ThreadPoolInit() may lost because there's no code to call ThreadPoolShutdown() to release the memories. And inet_ntoa() is not thread safe, so in my patch, I substitute inet_ntoa() with inet_ntop(). 2010-03-14 Marcelo Jimenez * SF Patch Tracker [ 2964687 ] Add new string based accessors to upnp object API As per email to pupnp-devel, this is the patch to add the _strget_ accessors for string-like objects in the interface. Will add a further patch shortly to udpate the sample programs. 2008-06-27 Marcelo Jimenez * Nicholas Kraft's patch to fix some IPv6 copy/paste issues. He reported to be getting infinite loops with the svn code. 2008-06-13 Marcelo Jimenez * SF Bug Tracker [ 1984541 ] ixmlDocumenttoString does not render the namespace tag. Submitted By: Beliveau - belivo Undoing the patch that fixed this problem. In fact, there was no problem and the patch was wrong. 2008-06-11 Marcelo Jimenez * Ingo Hofmann's patch for "Content-Type in Subscription responses". Adds charset="utf-8" attribute to the CONTENT-TYPE header line. Hi, I have found an inconsistency regarding the text/xml content-type returned by libupnp. It looks like only subscription responses send "text/xml" where all other messages contain "text/xml; charset="utf-8"". Since I'm working on an DLNA device the latter behaviour is mandatory. I changed the according lines in gena_device.c (see attached patch). I'm not sure if it would be ok for other device to have the charset field but it would help me a lot :) Best regards, Ingo 2008-06-04 Marcelo Jimenez * SF Bug Tracker [ 1984541 ] ixmlDocumenttoString does not render the namespace tag. Submitted By: Beliveau - belivo The problem occurs when converting a xml document using ixmlDocumenttoString containing a namespace tag created with ixmlDocument_createElementNS. The namespace tag doesn't get rendered. example: The following code fragment prints: instead of: Code: #include #include int main() { IXML_Document* wDoc = ixmlDocument_createDocument(); IXML_Element* wRoot = ixmlDocument_createElementNS(wDoc, "urn:schemas-upnp-org:device-1-0", "root"); ixmlNode_appendChild((IXML_Node *)wDoc,(IXML_Node *)wRoot); DOMString wString = ixmlDocumenttoString(wDoc); printf(wString); free(wString); ixmlDocument_free(wDoc); return 0; } The problem was in the printing routine, not in the library data structure. 2008-05-31 Marcelo Jimenez * Charles Nepveu's suggestion of not allocating a thread for MiniServer when it is not compiled. 2008-05-24 Marcelo Jimenez * Ported Peter Hartley's patch to compile with mingw. 2008-05-24 Marcelo Jimenez * Added some debug capability to ixml. 2008-05-02 Marcelo Jimenez * Merged Charles Nepveu's IPv6 work. libupnp now is IPv6 enabled. 2008-02-06 Marcelo Jimenez * Breaking API so that we now hide internal data structures. 2008-02-06 Marcelo Jimenez * Rewrote Peter Hartley's patch to include a new extra header field in FileInfo. ******************************************************************************* Version 1.6.7 ******************************************************************************* 2010-05-07 Marcelo Jimenez SF Bug Tracker [ 2995758 ] libupnp 1.6.6, wrong bind when reuseaddr is 1. Submitted: viallard anthony ( homer242 ) When trying to use reuseaddr option in miniserver/miniserver.c, there isn't a affectation of the port chosen (serverAddr.sin_port isn't receive listen_port variable value). 2010-04-25 Marcelo Jimenez Define PROTOTYPES to be one by default in global.h. This affects the RSA MD5 code. 2010-03-27 Nick Leverton Subscription auto-renewals copy the renewal time from old subscription. 2010-03-27 Marcelo Jimenez * Added API to ithread, created the following functions: - int ithread_initialize_library(void); - int ithread_cleanup_library(void); - int ithread_initialize_thread(void); - int ithread_cleanup_thread(void); * SF Bug Tracker [ 2876374 ] Access Violation when compiling with Visual Studio 2008 Submitted: Stulle ( stulleamgym ) - 2009-10-10 19:05 Hi, I am one of the devs of the MorphXT project and I use this lib in some other of my projects, too. When I tried to upgrade the lib earlier for one of my projects I had to realise that something did not work at first and while most of the things were reasonably ease to be fixed. Now, the last thing I encountered was not so easy to fix and I am uncertain if my fix is any good so I'll just post it here and wait for some comments. The problem was that I got an Access Violation when calling "UpnpInit". It would call "ithread_rwlock_init(&GlobalHndRWLock, NULL)" which eventually led to calling "pthread_cond_init" and I got the error notice at "EnterCriticalSection (&ptw32_cond_list_lock);". It appeared that "ptw32_cond_list_lock" was NULL. Now, I found two ways to fix this. Firstly moving the whole block after at least one of the "ThreadPoolInit" calls will fix the issue. Secondly, you could add: #ifdef WIN32 #ifdef PTW32_STATIC_LIB // to get the following working we need this... is it a good patch or not... I do not know! pthread_win32_process_attach_np(); #endif #endif right before "ithread_rwlock_init(&GlobalHndRWLock, NULL)". Just so you know, I am using libupnp 1.6.6 and libpthreads 2.8.0 and both are linked static into the binaries. I am currently using Visual Studio 2008 for development with Windows being the target OS. Any comment at your end? Regards, Stulle 2010-03-27 Marcelo Jimenez * SF Patch Tracker [ 2836704 ] Patch for Solaris10 compilation and usage. Submitted By: zephyrus ( zephyrus00jp ) This second part covers the issue on linking with -lsocket -lnsl -lrt. 2010-03-21 Marcelo Jimenez * SF Bug Tracker [ 2392166 ] ithread_detach not called for finished worker thread Submitted: Ulrik ( ulsv_enea ) - 2008-12-05 08:24 Valgrind reports a memory leak due to that the function ithread_detach is not called for finished worker threads in ThreadPool.c. ==21137== 2,176 bytes in 8 blocks are possibly lost in loss record 5 of 5 ==21137== at 0x4C20F3F: calloc (vg_replace_malloc.c:279) ==21137== by 0x4010F58: _dl_allocate_tls (in /lib/ld-2.6.1.so) ==21137== by 0x544BA92: pthread_create@@GLIBC_2.2.5 (in /lib/libpthread-2.6.1.so) ==21137== by 0x5F94592: CreateWorker (ThreadPool.c:639) ==21137== by 0x5F95079: ThreadPoolInit (ThreadPool.c:784) I'm using libupnp 1.6.6 For more info on pthread_detach, see: http://gelorakan.wordpress.com/2007/11/26/pthead_create-valgrind-memory-lea k-solved/ 2010-03-21 Marcelo Jimenez * SF Bug Tracker [ 2392304 ] Memory leak in SSDP AdvertiseAndReply Submitted: Ulrik ( ulsv_enea ) - 2008-12-05 08:24 Valgrind reports a memory leak function in AdvertiseAndReply (ssdp/ssdp_server.c) in libupnp 1.6.6 There are continue statements in many places in AdvertiseAndReply. In some of those error handling cases the variable nodelist is not free'ed before continuing to the next iteration. The next iteration will take care of free'ing the nodelist from the previous iteration in most cases, but not when breaking out of the for loop after the last element. I belive this memory leak can be solved by makeing sure that the rows ixmlNodeList_free( nodeList ); nodeList = NULL; are always executed, also in the beginning of the last iteration when we found out that there are not more elements. ==29110== at 0x4C21C16: malloc (vg_replace_malloc.c:149) ==29110== by 0x5D8DE0E: ixmlNodeList_addToNodeList (nodeList.c:106) ==29110== by 0x5D8B7E2: ixmlNode_getElementsByTagNameRecursive (node.c:1438) ==29110== by 0x5D8E587: ixmlElement_getElementsByTagName (element.c:491) ==29110== by 0x5B6C0F1: AdvertiseAndReply (ssdp_server.c:201) ==29110== by 0x5B7AB74: UpnpSendAdvertisement (upnpapi.c:1495) 2010-03-21 Marcelo Jimenez * libupnp and multi-flows scenario patch Submited by Carlo Parata from STMicroelectronics. Hi Roberto and Nektarios, after an analysis of the problem of libupnp with a multi-flows scenario, I noticed that the only cause of the freezed system is the ThreadPool management. There are not mutex problems. In practise, if all threads in the thread pool are busy executing jobs, a new worker thread should be created if a job is scheduled (I inspired to tombupnp library). So I solved the problem with a little patch in threadutil library that you can find attached in this e-mail. I hope to have helped you. 2010-03-21 Marcelo Jimenez * SF Patch Tracker [ 2964973 ] install: will not overwrite just-created ...blah... with... Submitted: Nick Leverton ( leveret ) - 2010-03-07 05:18 Full error: /usr/bin/install: will not overwrite just-created `/tmp/buildd/libupnp-1.6.6/debian/tmp/usr/share/doc/libupnp3-dev/examples/s ample_util.c' with `common/sample_util.c' This seems to be from Automake 1.11 which doesn't like having duplicate files in a Makefile.am. Patch attached, kindly provided by Stefan Potyra for Debian (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=543068) This fix will be needed for both 1.6.x and 1.8.x branches. 2010-03-21 Marcelo Jimenez * Backport of svn revision 504: SF Patch Tracker [ 2969188 ] 1.8.0: patch for FreeBSD compilation Submitted By: Nick Leverton (leveret) Fix the order of header inclusion for FreeBSD. 2010-03-21 Marcelo Jimenez * SF Patch Tracker [ 2836704 ] Patch for Solaris10 compilation and usage. Submitted By: zephyrus ( zephyrus00jp ) Obs by Marcelo: The issue with linking with -lsocket -lnsl -lrt is not covered in this changeset beacuse I don't have solaris to test. I will need some help from zephyrus in this regard. The issue will be addressed in a future changeset. Compilation for solaris I have used gcc3.x and gcc4.x under solaris 10 for x86 / 64 bits. A couple of Source file fixes were necessary for successful compilation and runtime behavior. threadutil/src/ThreadPool.c POSIX sched_setschduler() returns non-negative value for success. Without the fix, UpnpInit() fails immediately. upnpp/src/api/upnpai.c There is a typo of a macro name "__sun" in one of the CPP conditional. Without the fix, the compilation aborts due to unknown constant in socket ioctl call. A few structs and an array is not properly initialized. Well, I think it may be safe as is, but when I checked it using purify evaluation version, it was reported that uninitizlied iszBuffer may cause read of uninitialized memory. So play it safe. Configure issue. This has to be more of a configure magic. To link a program successfully using network, we need -lsocket and -lnsl library specifications on the link line. We also need -lrt for programs that use thread scheduling features. The sample program under upnp/sample requires -lsocket -lnsl -lrt for successful linking. I added -lsocket -lnsl -lrt to Makefile.in. configure probably needs to take care of these. I don't know much about configure, automake, etc., so I am just raising a flag here. TIA 2010-03-20 Marcelo Jimenez * SF Patch Tracker [ 2836704 ] Search for nested serviceList (not stopping at the first lis Submitted By: zephyrus ( zephyrus00jp ) Internet Gateway Device description contains nested serviceList (rootdevice -> servicelist, subdevice and subdevice has the lower-level serviceList, etc..) Unfrotunately, the sample code sample_util.c used by tv_device sample, etc. has a code that looks for only the first top-level serviceList. This results in the failure to read all the services of an IGD xml description. Attached patch modifies this behavior and looks for the service by visiting all the serviceList in xml document in turn. With the modified patch (ad additional modification), I could simulate an IGD device and created a modified control program for that. Patch against 1.6.6 TIA. 2010-03-15 Marcelo Jimenez * SF Patch Tracker [ 2203721 ] timeb.h check obsolete 2010-03-15 Marcelo Jimenez * SF Patch Tracker [ 2970872 ] Update ErrorMessages for latest return code list Submitted By: Nick Leverton ( leveret ) ErrorMessage[] in upnptools.c has got a bit out of sync, the attached patch (generated from grep 'define UPNP_E_') should bring it up to date. 2010-03-15 Marcelo Jimenez * SF Patch Tracker [ 2857611 ] Declare a few functions to have proper (void) argument list. Submitted By: zephyrus ( zephyrus00jp ) In a publicly installed headers, a few functions are declared without any arguments at all, a la "()". When I used gcc's -Wimplict and -Wstrict-prototypes to check for the mismatch of function prototype declarations and their usage in my own program, some headers from libupnp-1.6.6 produced warnings. They are not strictly bugs, but pretty much annoying. This is 2009, and almost all the important compilers understand ISO-C. So the offending functions are declared as "(void") to show that they have no arguments at all. 2010-03-14 Marcelo Jimenez * SF Patch Tracker [ 2546532 ] Missing carriage return between SOAPACTION and User-Agent headers. There is something going wrong in soap_ctrlpt.c at line 931 (based on version 1.6.6 release). The http_Makemessage call looks as follows: if (http_MakeMessage( &request, 1, 1, "Q" "sbc" "N" "s" "s" "Ucc" "sss", SOAPMETHOD_POST, path.buf, path.length, "HOST: ", host.buf, host.length, content_length, ContentTypeHeader, "SOAPACTION: \"urn:schemas-upnp-org:control-1-0#QueryStateVariable\"", xml_start, var_name, xml_end ) != 0 ) { return UPNP_E_OUTOF_MEMORY; } This will result in the SOAPACTION header to be immediately followed by the User-Agent header, while a cr-lf should separate the two. I propose to fix this by changing the second "s" to "sc" to force the addition of a cr-lf after the SOAPACTION. This looks consistent to the other Makemessage calls. 2009-03-06 Oxygenic * parameter problem fixed in soap_request_and_response(), 2nd call to http_RequestAndResponse() was wrong (thanks to Kim Kyungsan) 2008-07-25 Marcelo Jimenez * Added upnp/m4/libupnp.m4 to the distribution tarball. 2008-07-25 Marcelo Jimenez * Fixed a missing HandleUnlock() in upnp/src/gena/gena_device.c. 2008-07-24 Marcelo Jimenez * SF Bug Tracker [ 2026431 ] pupnp does not build on GNU/KfreeBSD. Submitted By: Nick Leverton - leveret Gnu/KFreeBSD is one of the Debian architectures, it includes a FreeBSD kernel with GNU userspace (glibc etc). The Gnu/KfreeBSD developers provided the attached patch to test the appropriate #define and allow pupnp to build in their environment, and asked me to forward it to you. Since the test is a simple check for defined(__GLIBC__), this would presumably also help with other ports of GNU libc to non-Linux kernels. 2008-07-16 Marcelo Jimenez * Andre Sodermans (wienerschnitzel) patch for building libupnp under windows systems with VC9. This one fixes a missing include. 2008-06-30 Marcelo Jimenez * Added an m4 macro to deal with finding libupnp in the users' configure script. 2008-06-11 Marcelo Jimenez * Fixed a buffer overflow due to a bug in the calculation of the CONTENT-TYPE header line size, the length was beeing calculated with the wrong string, there was a missing colon. 2008-06-02 Marcelo Jimenez * SF Bug Tracker [ 1942285 ] UpnpCreatePropertySet can leak memory. Submitted By: Bob Ciora - bobciora In file upnp/src/api/upnptools.c, function UpnpCreatePropertySet can leak memory if no additional arguments are passed. This is because of the 'return' statement at (or near) line 554. The prior call to ixmlParseBufferEx may succeed. This causes a basic ixml tree to be created. The return statement at line 554 leaves this tree in memory without cleaning it up. There are two options: either add code prior to the return at 554 to clean up the tree, or simply allow a NumArg parameter of 0 to be passed. I prefer the second method -- there doesn't seem to be any need to pass *any* arguments to this function. In my local copy of upnptools.c, I have simply replaced the "return NULL" in line 554 to "return PropSet". I've attached the source file. 2008-05-26 Marcelo Jimenez * SF Bug Tracker [ 1903069 ] Subs (not services) not marked 'active' Submitted By: Bob Ciora - bobciora If the UpnpAcceptSubscription is not called, the subscription is not marked as "active", so no state variables will ever be sent. I have a "lazy" architecture where a service may not be ready to publish any state data at the time of a subscription. Subscriptions are still accepted, there's just nothing to send, so UpnpAcceptSubscription is never called. As a result, the subscription is never marked as "active" via the genaInitNotify functions. A best course of action would be to modify UpnpAcceptSubscription<...> functions so that they can accept *no* initial state information, but can still result in the subscription being marked as active. Technically, then, the "active" flag should be set here, not in the genaInitNotify<...> functions. But the UpnpAccept functions don't muck with the subscription table, and it's more work than it's worth to move that code from the gena fucntions to the upnpapi functions. So--- what I've done to correct this problem is to modify both UpnpAcceptSubscription<...> functions (in upnppapi.c) to accept an empty state list and still call the gena layer functions. The gena layer genaInitNotify<...> functions (gena_device.c) then mark the subscription as "active" *before* checking for an empty state set. In genaInitNotify, a check for "var_count <= 0" is added immediately after the "subs->active = 1;" line. If this occurs, then all cleanup is performed and the function returns GENA_SUCCESS (since now, an empty state list is not an error). The same check is made for "PropSet == 0" in genaInitNotifyExt (just after the "subs->active = 1;" line). I've modifified my proxy layer to call UpnpAcceptSubscriptionExt even when there is no state data to send. With the suggested changes to gena_device.c, later state changes are sent correctly. This has solved my problem. 2008-04-28 Marcelo Jimenez * Fix in function SetSeed() in threadutil/src/ThreadPool.c for CYGWIN compilation. Thanks to Gary Chan. ******************************************************************************* Version 1.6.6 ******************************************************************************* 2008-04-24 Marcelo Jimenez * Added thread id's to the UpnpPrintf debug messages. Thanks to Charles Nepveu for the idea. 2008-04-24 Marcelo Jimenez * SF Bug Tracker [ 1948586 ] Uppercase U in in "xmlns:U" in Invoke Action causes seg. f. Submitted By: Thomas Norheim - kjakan_no Device no longer segfaults with the following malformed xml action: 2 2008-04-23 Marcelo Jimenez * Use -O0 in debug builds so that variables do not get optimized out. 2008-04-10 Marcelo Jimenez * Apostolos Syropoulos changes for OpenSolaris x86. 2008-03-20 Marcelo Jimenez * Andre Sodermans (wienerschnitzel) patch for building libupnp under windows systems with VC9. 2008-03-20 Marcelo Jimenez * Andre Sodermans (wienerschnitzel) patch for building libupnp under windows systems with VC8. 2008-03-08 Marcelo Jimenez * Fixed a printf format problem on the upnp_tv_device.c from both upnp/sample/tvdevie and upnp/sample/tvcombo directories. The variable port was a short int instead of an unsigned short and it was beeing print as a negative value. 2008-03-08 Marcelo Jimenez * SF Bug Tracker [ 1902668 ] Cannot compile on MSVC Submitted By Luke Kim - nereusuj Version 1.6.5 cannot be compiled because of some changes in 1.6.3. MSVC does not support stdint.h, gettimeofday(), sys/param.h, const int variables in array size and Windows does not define _WINDOWS_ but define _WINDOWS. * MSVC does not understand "const int"'s as declarators of array dimensions, we must use #define'd constants. * Use WIN32 instead of _WINDOWS_ or _WINDOWS. 2008-02-22 Marcelo Jimenez * No longer ignore "upnp:rootdevice" advertisement. Thanks to Bob Ciora. 2008-02-10 Marcelo Jimenez * Changed "sys_errlist[errno]", which is deprecated, by "strerror_r()", which is thread safe. 2008-02-06 Marcelo Jimenez * Slightly improved error report by showing the sys_errlist string corresponding to errno. 2008-02-06 Marcelo Jimenez * Got rid of two useless constants: UPNP_SOCKETERROR and UPNP_INVALID_SOCKET. They both mean the same, that a network API function has failed. -1 is the value to check, not an invented constant. ******************************************************************************* Version 1.6.5 ******************************************************************************* 2008-02-02 Marcelo Jimenez * Peter Hartley's fix for wrong sized variable beeing passed to http_MakeMessage() on 64 bit architectures. ******************************************************************************* Version 1.6.4 ******************************************************************************* 2008-01-23 Marcelo Jimenez * Workaround for a problem with the new automake AM_CONDITIONAL macro from autotools-1.10. Thanks to Ingo Hofmann for helping with debugging this one. 2008-01-22 Marcelo Jimenez * Added quoting to macros AC_CONFIG_AUX_DIR, AC_CONFIG_MACRO_DIR and AC_CONFIG_SRCDIR in configure.ac. Also changed the name of the auxiliary directory in AC_CONFIG_AUX_DIR to build-aux. 2008-01-22 Marcelo Jimenez * Fix for setsockopt() in Threadpool.c to allow more than one process to join the multicast-group on OSX. Thanks to Ingo Hofmann. 2008-01-22 Marcelo Jimenez * Using defined(__OSX__) || defined(__APPLE__) instead of just defined(__OSX__) in the code. Thanks to Ingo Hofmann and Chris Pickel. 2008-01-21 Marcelo Jimenez * Fix for isFileInVirtualDir. Thanks to Peter Hartley for the patch. 2008-01-07 Marcelo Jimenez * Putting back a "defined(__OSX__)" that has been removed in the previous *BSD patch. Thanks to Chris Pickel for pointing it out. 2008-01-07 Marcelo Jimenez * SF Patches Tracker [ 1865812 ] typo in docs comment Submitted By: Hartmut Holzgraefe - hholzgra typo in docs comment ACCAPTED instead of ACCEPTED in @name UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302] Also, the documentation file name was mispelled and was corrected in the Makefile.am. ******************************************************************************* Version 1.6.3 ******************************************************************************* 2007-12-25 Marcelo Jimenez * Using pthread flags for the whole project, not just at the places individually indicated by several Makefile.am files spread all over the directories. That was too much error prone. 2007-12-24 Marcelo Jimenez * Added a configure test to check if pthread_rwlock_t is available. Define _GNU_SOURCE if needed. The fallback behaviou will only be implemented if _GNU_SOURCE prooves to be insufficient on some platforms. Thanks to Jonathan Casiot (no_dice) and Robert Gingher (robsbox). 2007-12-17 Marcelo Jimenez * Removed unused iasnprintf.{c,h} files. 2007-12-17 Marcelo Jimenez * Removed STATSONLY() macro from ThreadPool.{c,h}. * Removed time() usage from ThreadPool.c. * Fixed STATS = 0 compilation. 2007-12-16 Marcelo Jimenez * Library was not compiling on FreeBSD 7. Code now no longer uses ftime(), using gettimeofday() instead. Thanks to Josh Carroll. ******************************************************************************* Version 1.6.2 ******************************************************************************* 2007-12-10 Marcelo Jimenez * Fixed a compilation error due to a missing #ifdef in upnp/src/genlib/miniserver/miniserver.c. Thanks to Eugene Christensen. 2007-11-12 Marcelo Jimenez * "make check" was failing because ixml/test/test_document.sh did not have the executable flag set. Thanks to Steve Bresson. 2007-11-12 Marcelo Jimenez * Fixed a memory leak in upnpapi.c to delete gMiniServerThreadPool in the call to UpnpFinish(). Thanks to Fabrice Fontaine. 2007-11-09 Marcelo Jimenez * Added a isleep() call to the error handler of select() in RunMiniServer(), so that it does not take 100% cpu in case select() fails repeatedly. ******************************************************************************* Version 1.6.1 ******************************************************************************* 2007-11-07 Marcelo Jimenez * SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out Applied patch from Alex (afaucher) to change some write locks to read locks. 2007-11-06 Marcelo Jimenez * Adjusting libtool library numbers to reflect the last changes. 2007-11-06 Marcelo Jimenez * SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out GlobalHndMutex, which was a mutex is now GlobalHndRWLock, which is a rwlock. HandleLock() is mapped to HandleWriteLock() while all other instances have not been checked. One instance in AdvertiseAndReply() has been changed to HandleReadLock(). Thanks to Alex (afaucher) for the bug report and suggestions. 2007-11-06 Marcelo Jimenez * Added support for rwlocks. 2007-11-05 Marcelo Jimenez * SF Bug Tracker [ 1825929 ] woker thread still alive after UpnpFinish() Submitted By: Luke Kim - nereusuj Worker thread still alive after calling UpnpFinish() because ThreadPoolShutdown() is in the #ifdef DEBUG block. 421 422 #ifdef DEBUG 423 ThreadPoolShutdown( &gSendThreadPool ); 424 ThreadPoolShutdown( &gRecvThreadPool ); 2007-08-28 Marcelo Jimenez * Changed the calls to virtualDirCallback.open(filename, UPNP_WRITE) to (virtualDirCallback.open)(filename, UPNP_WRITE) (notice the parenthesis) due to a change in glibc that produces compilation errors. 2007-08-28 Marcelo Jimenez * Initialization of the "randomness" struct so that valgrind does not complain. 2007-08-06 Marcelo Jimenez * Merge of patch submitted By Keith Brindley - brindlk SF Bug Tracker [ 1762758 ] Seek not working for large files Problem: Requests from the uPnP client to seek to a position beyond 2GB in a large file are handled as a request to see from the 2GB point. Impact: Varies depending on client. The Xbox 360 kills the connection when it realises. Solution: GetNextRange function (webserver.c) is updated to handle large file sizes. Fix should also recognise when built on a 32bit platform rather than 64 and handle accordingly. 2007-08-05 Marcelo Jimenez * Merge of Mac OS X patch from StĂ©phane CorthĂ©sy (davelopper), SF Bug Tracker [ 1686420 ] Modifications for MacOSX. Some of the proposed changes were already done by Rene Hexel's patch. ******************************************************************************* Version 1.6.0 ******************************************************************************* 2007-06-10 Marcelo Jimenez * More fixes to Mac OS X and NetBSD from Rene Hexel: [pupnp-devel] NetBSD & Mac OS X packages and patches Okay, I found a couple more things. I have attached a patch file against the trunk (version 206) that make the repository code compile and run on both Mac OS X and NetBSD. This fixes the following issues: upnp/src/api/upnpapi.c: SIOCGIFCONF didn't work properly, use getifaddrs() instead (on BSD systems). threadutil/src/ThreadPool.c: priorities only work if _POSIX_PRIORITY_SCHEDULING is defined (and greater than 0). threadutil/src/LinkedList.c and threadutil/src/iasnprintf.c: use stdlib.h instead of malloc.h on all BSD systems (not just FreeBSD). This is important, because malloc.h does not exist on Darwin/Mac OS X. Cheers , Rene 2007-06-09 Marcelo Jimenez * [pupnp-devel] NetBSD & Mac OS X packages and patches. Rene Hexel's patch to compile in NetBSD and Mac OS X. 2007-05-26 Marcelo Jimenez * Updated the macro files acx_pthread.m4, ax_cflags_gcc_option.m4, ax_cflags_warn_all.m4, m4/ax_cflags_warn_all_ansi.m4, m4/type_socklen_t.m4. 2007-05-26 Marcelo Jimenez * Fixed an issue with the instalation of the file upnpdebug.h. Since the last modifications that removed the macro DEBUV_ONLY, this file must be installed even on a non-debug build. 2007-05-26 Marcelo Jimenez * SF Bug Tracker [ 1711325 ] Bad DestAddr in Upnp_Discovery structure Submitted By: Bob Ciora The field DestAddr of the structure Upnp_Discovery is now a full SOCKADDRIN instead of a pointer to SOCKADDRIN. Commented code sugests that in a previous moment, the function ssdp_handle_ctrlpt_msg() did not use a postponed thread to call ctrlpt_callback(). Now the code uses a thread, and most probably the original data would get lost and the pointer would point to an invalid memory region. This fix caused an interface change in the library and the minor library version was bumped. Also, the libtool library numbers were changed accordingly. ******************************************************************************* Version 1.4.7 ******************************************************************************* 2007-05-26 Marcelo Jimenez * Added support for the Basic Device (http://www.upnp.org/standardizeddcps/basic.asp) as suggested by Titus Winters. 2007-05-25 Marcelo Jimenez * Fixed the file libupnp.pc.in to generate a correct path for the include files. 2007-05-25 Marcelo Jimenez * Removing the Dbg_Level, InitLog, SetLogFileNames and CloseLog defines. These were just aliases, no reason to keep them. 2007-05-25 Marcelo Jimenez * Changed the comments of the include files that expose the UPnP API to use only C89 comments and no C99 comments. 2007-05-24 Nektarios K. Papadopoulos * Added tvcombo sample that demonstrates coexistence of a device and a control point in the same application. 2007-05-24 Nektarios K. Papadopoulos * SF Tracker FR [ 1570020 ]. * Enable both device and control point in the same application. Resolve deadlock in the SSDP processing threads. * Fix Threadpool expansion condition. Thanks to Siva Chandran P. for the original patch. 2007-05-24 Nektarios K. Papadopoulos * Modified tvdevice (control and picture) service descriptions to make compatible with WinXP/IE control point. 'in' arguments must appear before 'out' arguments in argument list. Thanks to Martin Tremblay for pointing out the solution originally provided by MORIOKA Yasuhiro. 2007-05-21 Marcelo Jimenez * More MSVC fixes, using XINLINE instead of inline, MSVC has troubles with inline. Thanks to David Maass for reporting. * Changed XINLINE to UPNP_INLINE. 2007-05-21 Marcelo Jimenez * Added the file build/inc/msvc/inttypes.h. This file is for use with MSVC only, because it does not provide C99 compatibility. 2007-05-18 Marcelo Jimenez * Removed all uses of the DEVICEONLY(x) macro. 2007-05-17 Marcelo Jimenez * Removed all uses of the DBGONLY(x) macro. A static inline empty function now is used and the compiler takes care of optimizing it out. 2007-05-17 Marcelo Jimenez * Fixed a bug in UpnpPrintf, function could call va_start() and return befor calling va_end(). 2007-05-15 Marcelo Jimenez * EXPORT_SPEC missing on some declarations in ixml/inc/ixml.h. Thanks to David Maass. 2007-05-15 Marcelo Jimenez * sizeof is unsigned, so %zu is more adequate than %zd. 2007-05-15 Marcelo Jimenez * Using an invented printf directive PRIzu that on MSVC expands to "lu", and on normal C99 compilers expands to "zu". 2007-05-15 Marcelo Jimenez * Rewrote raw_find_str. Now it no longer uses strcasestr(), but it transforms the first input buffer into lowercase. 2007-05-08 Marcelo Jimenez * Fix for debug printf format strings. size_t are not expected in a string format like "%.*s". 2007-05-08 Marcelo Jimenez * Added inttypes.h as a header requirement in configure.ac. 2007-05-11 Marcelo Jimenez * Moved upnp_tv_ctrlpt and upnp_tv_device executables from folder upnp to folder upnp/sample. Moved folder upnp/sample/tvdevice/web to folder upnp/sample/web. This way, if someone compiles the tarball and executes upnp_tv_device from its creation directory, there will be no error -108 for not finding directory web. ******************************************************************************* Version 1.4.6 ******************************************************************************* 2007-04-19 Marcelo Jimenez * Fix for freebsd host_os in configure.ac. ******************************************************************************* Version 1.4.5 ******************************************************************************* 2007-04-19 Marcelo Jimenez * Case insensitive comparison in raw_find_str() (httpparser.c) as suggested by Craig Nelson in SF Tracker [ 1689382 ] DLINK DIR-625 patch. 2007-04-07 Nektarios K. Papadopoulos * Fix for a bug in makeAction where va_arg was beeing called one extra time. 2007-04-28 Marcelo Jimenez * SF Tracker [ 1703533 ] Patch to make it compile under FreeBSD Submitted By: Timothy Redaelli - drittz I made some patches to make it compile under FreeBSD using gethostbyaddr_r when supported. 2007-04-28 Marcelo Jimenez * [pupnp-devel] Type mixup on x86_64 causes UPNP_E_OUTOF_MEMORY Submitted By: Glen Masgai after an UpnpSendActionAsync() for example, i get UPNP_E_OUTOF_MEMORY in the callback using 1.4.4 on a x86_64 system. This happens in http_MakeMessage(), which in some cases get called with wrong types (int instead of size_t) in combination with format "b" and "Q". The attached patch should fix this. ******************************************************************************* Version 1.4.4 ******************************************************************************* 2007-04-06 Marcelo Jimenez * SF Tracker [ 1695399 ] Typo in util.h Submitted By: Luke Kim - nereusuj Unix sleep is in seconds but WIN32 Sleep is in milliseconds. 2007-04-17 Marcelo Jimenez * SF Tracker [ 1652827 ] UpnpRegisterRootDevice returned -104 Submitted By: Michael Andersen - miwer Issue was found to be related to sizeof (size_t) != sizeof (int) on AMD64 systems. Emil Ljungdahl's AMD64 patch has been applied along with some other fixes. Original user report follows: When I run upnpd I get the above mentioned error (UPNP_E_OUTOF_MEMORY). I've tried with 1.4.1 and 1.4.2-RC3, it's the same. I don't understand why, because I have plenty of RAM, and I even tried closing some applications, but it didn't help. $ upnpd eth1 br0 The following is logged in the /var/log/messages: Feb 6 01:33:47 server upnpd[6933]: Error registering the root device with descDocUrl: http://192.168.0.1:49152/gatedesc.xml Feb 6 01:33:47 server upnpd[6933]: UpnpRegisterRootDevice returned -104 I tried enabling debugging and it looks like it cannot allocate memory through the membuffer_append function. It's wierd because it's only a few bytes. Please note, that I enabled some extra debugging lines that were commented, in order to get more information. See attached files. ******************************************************************************* Version 1.4.3 ******************************************************************************* 2007-03-13 Marcelo Jimenez * SF Tracker [ 1663004 ] Compile on Cygwin Submitted By: Jon Foster - jongfoster This patch gives basic support for building under Cygwin - it compiles, links, and a simple UPnP device application can initialise. I'm not sure if it actually works yet, but this is definitely a step in the right direction. Patch is against the 1.4.1 release. Changes are: * threadutil/inc/ithread.h: Fix the ithread mutex support to use documented, portable APIs (if present) rather than the Non-Portable (_NP) ones it uses now. This is required because Cygwin implements only the portable API. * threadutil/src/ThreadPool.c: Fake SetPolicyType() to do nothing on Cygwin because otherwise it fails. Should probably investigate why it fails and add a proper implementation later. * upnp/src/api/upnpapi.c: On Cygwin, zero out the GlobalHndMutex structure before initialising it. Without this, the initialisation fails. This appears to be a bug in Cygwin. * upnp/src/genlib/net/uri/uri.c: Use gethostbyname() on Cygwin. 2007-03-05 Oxy * Code adapted and typedefs added to compile cleanly under Windows with Borland C++ Builder and MS Visual C++ 2007-03-03 Marcelo Jimenez * Fixed nasty segmentation fault bug on membuffer.c. ******************************************************************************* Version 1.4.2 ******************************************************************************* 2007-02-09 Marcelo Jimenez * 32/64 bits portability issues on *printf. Use %zd for size_t, and cast to (long long) for off_t. 2007-02-02 Marcelo Jimenez * Bumped the program version to 1.4.2 in config.ac. * Now requires autoconf 2.60. * Fixed docdir use. * Does not install the documentation by default. * Use dist-bzip2 to create a .bz2 distribution file. 2007-01-23 Marcelo Jimenez * SF Tracker [ 1634922 ] Support for large files (>= 2 GiB), part 2 Submitted By: Jonathan Casiot - no_dice Summary: This patch hopefully fixes the remaining types and related code to enable files >= 2 GiB to be streamed. Jonathan claims to have tested this with a patched version of ushare-0.9.8 and a D-Link DSM-520. 2007-01-09 Marcelo Jimenez * SF Tracker [ 1628629 ] Multicast interface patch Submitted By: Fredrik Svensson - svefredrik This patch fixes two problems: 1) Specify the IP address for the interface when we do setsockopt IP_ADD_MEMBERSHIP. This makes it possible to run when no default router has been configured. 2) Explicitly set the multicast interface through setsockopt IP_MULTICAST_IF. Avoids socket error -207 in some cases. * SF Tracker [ 1628590 ] XML parsing segfault patch Submitted By: Fredrik Svensson - svefredrik This patch fixes a segmentation fault problem that occurrs when parsing XML code than some routers produce. 2007-01-06 Marcelo Jimenez * SF Tracker [ 1628552 ] XML white space patch Submitted By: Fredrik Svensson - svefredrik * SF Tracker [ 1628562 ] Maximum total jobs patch Submitted By: Fredrik Svensson - svefredrik Also, I incremented the libray versions and included some comments in the file configure.ac so that we do not bump the library version excessively, only the necessary numbers on the next release. * SF Tracker [ 1628575 ] Linksys WRT54G patch Submitted By: Fredrik Svensson - svefredrik * SF Tracker [ 1628636 ] SSDP packet copy patch Submitted By: Fredrik Svensson - svefredrik Changed NUM_COPY to 1 since, according to section 9.2 of the HTTPU/MU spec, we should never send more than one copy of a reply to an SSDP request. Ref. section 9.2 of http://www.upnp.org/download/draft-goland-http-udp-04.txt 2006-12-23 Marcelo Jimenez * Thorough revision of every call of http_MakeMessage() due to a bug introduced in rev.79 "largefile patch added". http_MakeMessage() has a worst than brain damaged "printf" like interface. In rev.79, the "N" format parameter must be an off_t. Every call of this function with an "N" format parameter and an int passed on the stack would fail terribly. * SF Bug tracker [ 1590469 ] Typo in ixmlparser.c Submitted By: Erik Johansson - erijo * SF Bug Tracker [ 1590466 ] Invalid xml output Submitted By: Erik Johansson - erijo * SF Patch tracker [ 1581161 ] VStudio2005 patch Submitted By: David Maass - darkservant * SF Patch tracker [ 1587272 ] const-ified ixml Submitted By: Erik Johansson * Finished const-ifications as suggested by Erik Johansson in SF Patch tracker [ 1587272 ]. 2006-07-05 Nektarios K. Papadopoulos * [bug-id] 1580440 [submitted-by] Erik Johansson - erijo [patched-by] Erik Johansson - erijo The SOAP HTTP message that's generated on upnp errors is missing a \r\n\ between header and body. 2006-07-07 Oxy * support for large files (>2 GBytes) added ******************************************************************************* Version 1.4.1 ******************************************************************************* 2006-07-07 Oxy * full support for Windows added, static library and DLL are fully working, code compiles with Borland Builder C++ and MS Visual C/C++ 2006-07-05 Nektarios K. Papadopoulos * Include prebuilt documentation (html,pdf), dropping doc++ dependancy. 2006-07-03 Marcelo Jimenez * Patch for FreeBSD, thanks to Markus Strobl. 2006-06-26 Marcelo Jimenez * Fix for missing "else" in httpreadwrite.c. Thanks to npapadop for the patch. 2006-06-26 Marcelo Jimenez * Fix for va_list initialization in x86_64 architectures. 2006-06-08 Oxy * Patch to fix memory leaks and reasons for crashes added (thanks to loigu) ******************************************************************************* Version 1.4.0 ******************************************************************************* 2006-05-26 Oxy * defines in iasnprintf.h changed to work with GCC-version < 3 2006-05-22 Oxy * BSD-patch added (not tested yet on an BSD system) 2006-05-19 Oxy * Patch added for bug: ixml parser colapsed on empty args (arg="") 2006-05-18 Oxy * DSM-320 patch added (fetched from project MediaTomb) * httpGet additons atch added, Added proxy support by introducing UpnpOpenHttpGetProxy. UpnpOpenHttpGet now just calls UpnpOpenHttpGetProxy with the proxy url set to NULL. * Bugfix for typo ("\0" / "0") in ixmlparser.c * Bugfix for M-Search packet ******************************************************************************* FORK FROM DEAD libupnp ******************************************************************************* 2006-04-29 RĂ©mi Turboult * THANKS: new file with list of contributors * upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0' in subscription response. Patch by Chaos (Bug # 1455367). 2006-04-08 RĂ©mi Turboult * upnp/doc/UPnP_Programming_Guide.pdf: replace this document with the one in libupnp-doc-1.2.1 because current CVS version was corrupted. 2006-04-06 * changes applied to several files to work under Sparc Solaris, temporarily requiring a define SPARC_SOLARIS 2006-04-03 RĂ©mi Turboult * upnp/Makefile.am: install upnp samples in $(docdir)/examples 2006-03-28 RĂ©mi Turboult * configure.ac: add --with-docdir option to choose where documentation is installed (or -without-docdir to not install the documentation) 2006-03-27 RĂ©mi Turboult * ixml/test: add simple test suite for xml parser 2006-03-26 RĂ©mi Turboult * ixml/src/ixmlparser.c (Parser_processCDSect): fix bug which prevents CDATA sections which contain a 0 (zero) to be parsed (instead the parsing of the whole document is aborted). Patch by Arno Willig (Patch # 1432124). * configure.ac, upnp/Makefile.am: add "--disable-samples" configure option, and move samples compilation from check_PROGRAMS to noinst_PROGRAMS 2006-03-25 RĂ©mi Turboult * upnp/src/genlib/miniserver/miniserver.c (get_miniserver_sockets): fix bug if new socket created has fd 0 (can only occur when stdin has been closed). Patch by Oskar Liljeblad 2004-07-02 : http://sourceforge.net/mailarchive/message.php?msg_id=8870528 2006-03-21 RĂ©mi Turboult * upnp/test/test_init.c: add some version checks and exit if failure 2006-03-05 RĂ©mi Turboult * libupnp version 1.3.1 * upnp/inc/upnpconfig.h.in: add new define UPNP_VERSION_PATCH * upnp/test/test_init.c: add simple test to run during checks * upnp/inc/upnp.h: include "upnpdebug.h" only if debug enabled in the library (else header file is not installed) * upnp/Makefile.am (libupnp_la_LDFLAGS): add inter-library libtool dependencies between upnp and ixml / threadutil, so that programs linking against upnp only still work. 2006-03-04 RĂ©mi Turboult * libupnp version 1.3.0 2006-03-03 RĂ©mi Turboult * upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): use package version string from configure to set sdk info * upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST + do not distribute generated upnpconfig.h file. 2006-02-28 RĂ©mi Turboult * upnp/src/inc/config.h, configure.ac: use only new defines UPNP_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER * upnp/Makefile.am, ixml/Makefile.am: add -export-symbols-regex to the librarie LDFLAGS in order to export only the symbols defined in the API 2006-02-27 RĂ©mi Turboult * configure.ac: add libtool versions for the 3 libraries * ixml/src/ixml.c (copy_with_escape): add missing 'static' to function * threadutil/src/ThreadPool.c (SetSeed): add missing 'static' 2006-02-26 RĂ©mi Turboult * threadutil/inc/iasnprintf.h: add gcc __printf__ format attribute to "iasnprintf" * upnp/src/api/upnpapi.c: fix invalid UpnpPrintf formats * upnp/src/gena/gena_device.c: fix invalid UpnpPrintf formats * upnp/src/inc/config.h: move upnp/inc/config.h to internal sources (this file is no longer installed with the libraries) * upnp/inc/upnpdebug.h: new file created from debug definitions previously in upnp/inc/config.h * upnp/src/api/config.c: rename to upnp/src/api/upnpdebug.c * upnp/inc/upnpconfig.h.in: new file to contain information on the configuration of the installed libraries (generates installed file ) 2006-02-22 RĂ©mi Turboult * upnp/ : add missing include of config.h in some .c files 2006-02-21 RĂ©mi Turboult * upnp/inc/upnp.h: move some definitions which should not be exported into "upnp/src/inc/util.h" * import all modifications below from libupnp in djmount 0.51 into official libupnp 2006-01-17 RĂ©mi Turboult * threadutil/Makefile.am (libthreadutil_la_SOURCES): remove extraneous file 2006-01-15 RĂ©mi Turboult * configure.ac: add checks for large-file support * upnp/inc/config.h: rename to "upnpconfig.h". The new "config.h" file is the one generated by autoconf. * m4/type_socklen_t.m4: added new check for socklen_t (fallback to int if not defined) * upnp/src/genlib/miniserver/miniserver.c, upnp/src/ssdp/ssdp_server.c: use socklen_t where appropriate (instead of int) * upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): remove XINLINE declaration (unused and too late) * ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning on const return type 2006-01-12 RĂ©mi Turboult * upnp/src/inc/readwrite.h : suppress unused C++ header file 2006-01-11 RĂ©mi Turboult * upnp/inc/config.h, upnp/src/inc/upnpapi.h, upnp/src/inc/httpreadwrite.h: remove internal configuration variable MINIMUM_DELAY (no clear purpose) 2005-12-05 RĂ©mi Turboult * upnp/inc/upnp.h: re-declare obsolete method UpnpSetContentLength, for binary compatibility with previous libupnp version. * upnp/src/api/upnpapi.c: correct type of g_maxContentLength to size_t 2005-11-01 RĂ©mi Turboult * autoconfiscate library : replace all makefiles by Makefile.am for automake support, + preliminary autoconf support (generated config.h not yet used in source files) 2005-10-18 RĂ©mi Turboult * upnp/src/makefile: fix location of DEBUG STATIC libupnp library * upnp/sample/tvctrlpt/linux/Makefile, upnp/sample/tvdevice/linux/Makefile: fix STATIC library support 2005-10-16 RĂ©mi Turboult * threadutil/src/Makefile (clean): remove built library 2005-08-28 RĂ©mi Turboult * ixml/src/ixml.h, ixml/src/ixml.c (ixmlRelaxParser) : new function * ixml/src/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) : new function 2005-08-02 RĂ©mi Turboult * ixml/src/Makefile: correct bug for static library being incorrectly stripped when building non-debug 2005-06-09 RĂ©mi Turboult * ixml/src/element.c (ixmlElement_removeAttributeNode): remove some compilation warning * ixml/inc/ixml.h, ixml/src/document.c : add some missing const's in public API * upnp/inc/upnptools.h, upnp/src/api/upnptools.c : add missing const's in public API 2005-05-28 RĂ©mi Turboult * upnp/inc/config.h: suppress HTTP_READ_BYTES (unused) and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h) * upnp/inc/upnp.h, upnp/src/api/upnpapi.c : replace UpnpSetContentLength (which was not using its Handle argument) by global function UpnpSetMaxContentLength. Remove "hard" limitation to 32K (not suitable for using in UPnP AV). * upnp/src/inc/upnpapi.h : removed DEFAULT_SOAP_CONTENT_LENGTH (moved to config.h) and MAX_SOAP_CONTENT_LENGTH (now unused) * upnp/src/api/upnptools.c : add more error message strings * upnp/src/genlib/net/http/httpreadwrite.c : return OUTOF_BOUNDS instead of BAD_HTTPMSG when allowed Content Length is exceeded. * upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect sprintf format 2005-05-27 RĂ©mi Turboult * upnp/makefile, upnp/src/makefile, ixml/Makefile, ixml/src/Makefile, threadutil/Makefile, threadutil/src/Makefile : implement STATIC library support (from patch at http://sourceforge.net/tracker/?group_id=7189&atid=307189 ) 2005-05-26 RĂ©mi Turboult * upnp/src/api/upnpapi.c, upnp/src/soap/soap_device.c, upnp/src/soap/makefile : corrections for compilation with CLIENT=1 only * importing "libupnp-1.2.1a" as baseline libupnp-1.8.0~svn20100507/COPYING0000644000175000017500000000000011021325545012675 00000000000000libupnp-1.8.0~svn20100507/Doxyfile0000644000175000017500000014570411025042302013364 00000000000000# Doxyfile 1.5.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file that # follow. The default is UTF-8 which is also the encoding used for all text before # the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into # libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of # possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = libUPnP # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = 1.8.0 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = docs/doxygen # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, # Italian, Japanese, Japanese-en (Japanese with English messages), Korean, # Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, # Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = YES # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to # include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = YES # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = upnp ixml threadutil # This tag can be used to specify the character encoding of the source files that # doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default # input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. # See http://www.gnu.org/software/libiconv for the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = */.svn */.deps */.libs */test # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the output. # The symbol name can be a fully qualified name, a word, or if the wildcard * is used, # a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = DEBUG UPNP_HAVE_TOOLS INCLUDE_DEVICE_APIS INCLUDE_CLIENT_APIS EXCLUDE_GENA=0 EXCLUDE_DOM=0 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to # produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to # specify the directory where the mscgen tool resides. If left empty the tool is assumed to # be found in the default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a caller dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen will always # show the root nodes and its direct children regardless of this setting. DOT_GRAPH_MAX_NODES = 50 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO libupnp-1.8.0~svn20100507/threadutil/0000777000175000017500000000000011373047470014115 500000000000000libupnp-1.8.0~svn20100507/threadutil/inc/0000777000175000017500000000000011373047471014667 500000000000000libupnp-1.8.0~svn20100507/threadutil/inc/TimerThread.h0000644000175000017500000001132411025042303017144 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef TIMERTHREAD_H #define TIMERTHREAD_H /*! * \file */ #include "FreeList.h" #include "ithread.h" #include "LinkedList.h" #include "ThreadPool.h" #ifdef __cplusplus extern "C" { #endif #define INVALID_EVENT_ID (-10 & 1<<29) /* Timeout Types */ /* absolute means in seconds from Jan 1, 1970 */ /* relative means in seconds from current time */ typedef enum timeoutType {ABS_SEC,REL_SEC} TimeoutType; /*! * A timer thread similar to the one in the Upnp SDK that allows * the scheduling of a job to run at a specified time in the future. * * Because the timer thread uses the thread pool there is no * gurantee of timing, only approximate timing. * * Uses ThreadPool, Mutex, Condition, Thread. */ typedef struct TIMERTHREAD { ithread_mutex_t mutex; ithread_cond_t condition; int lastEventId; LinkedList eventQ; int shutdown; FreeList freeEvents; ThreadPool *tp; } TimerThread; /*! * Struct to contain information for a timer event. * * Internal to the TimerThread. */ typedef struct TIMEREVENT { ThreadPoolJob job; /*! [in] Absolute time for event in seconds since Jan 1, 1970. */ time_t eventTime; /*! [in] Long term or short term job. */ Duration persistent; int id; } TimerEvent; /*! * \brief Initializes and starts timer thread. * * \return 0 on success, nonzero on failure. Returns error from * ThreadPoolAddPersistent on failure. */ int TimerThreadInit( /*! [in] Valid timer thread pointer. */ TimerThread *timer, /*! [in] Valid thread pool to use. Must be started. Must be valid for * lifetime of timer. Timer must be shutdown BEFORE thread pool. */ ThreadPool *tp); /*! * \brief Schedules an event to run at a specified time. * * \return 0 on success, nonzero on failure, EOUTOFMEM if not enough memory * to schedule job. */ int TimerThreadSchedule( /*! [in] Valid timer thread pointer. */ TimerThread* timer, /*! [in] time of event. Either in absolute seconds, or relative * seconds in the future. */ time_t time, /*! [in] either ABS_SEC, or REL_SEC. If REL_SEC, then the event * will be scheduled at the current time + REL_SEC. */ TimeoutType type, /*! [in] Valid Thread pool job with following fields. */ ThreadPoolJob *job, /*! [in] . */ Duration duration, /*! [in] Id of timer event. (out, can be null). */ int *id); /*! * \brief Removes an event from the timer Q. * * Events can only be removed before they have been placed in the thread pool. * * \return 0 on success, INVALID_EVENT_ID on failure. */ int TimerThreadRemove( /*! [in] Valid timer thread pointer. */ TimerThread *timer, /*! [in] Id of event to remove. */ int id, /*! [in] Space for thread pool job. */ ThreadPoolJob *out); /*! * \brief Shutdown the timer thread. * * Events scheduled in the future will NOT be run. * * Timer thread should be shutdown BEFORE it's associated thread pool. * * \return 0 if succesfull, nonzero otherwise. Always returns 0. */ int TimerThreadShutdown( /*! [in] Valid timer thread pointer. */ TimerThread *timer); #ifdef __cplusplus } #endif #endif /* TIMER_THREAD_H */ libupnp-1.8.0~svn20100507/threadutil/inc/ThreadPool.h0000644000175000017500000004660111360640053017013 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef THREADPOOL_H #define THREADPOOL_H /*! * \file */ #include "FreeList.h" #include "ithread.h" #include "LinkedList.h" #include "UpnpInet.h" #include "UpnpGlobal.h" /* for UPNP_INLINE, EXPORT_SPEC */ #include #ifdef WIN32 #include struct timezone { int tz_minuteswest; /* minutes W of Greenwich */ int tz_dsttime; /* type of dst correction */ }; int gettimeofday(struct timeval *tv, struct timezone *tz); #else /* WIN32 */ #include #include /* for gettimeofday() */ #if defined(__OSX__) || defined(__APPLE__) || defined(__NetBSD__) #include /* for setpriority() */ #endif #endif #ifdef __cplusplus extern "C" { #endif /*! Size of job free list */ #define JOBFREELISTSIZE 100 #define INFINITE_THREADS -1 #define EMAXTHREADS (-8 & 1<<29) /*! Invalid Policy */ #define INVALID_POLICY (-9 & 1<<29) /*! Invalid JOB Id */ #define INVALID_JOB_ID (-2 & 1<<29) typedef enum duration { SHORT_TERM, PERSISTENT } Duration; typedef enum priority { LOW_PRIORITY, MED_PRIORITY, HIGH_PRIORITY } ThreadPriority; /*! default priority used by TPJobInit */ #define DEFAULT_PRIORITY MED_PRIORITY /*! default minimum used by TPAttrInit */ #define DEFAULT_MIN_THREADS 1 /*! default max used by TPAttrInit */ #define DEFAULT_MAX_THREADS 10 /*! default jobs per thread used by TPAttrInit */ #define DEFAULT_JOBS_PER_THREAD 10 /*! default starvation time used by TPAttrInit */ #define DEFAULT_STARVATION_TIME 500 /*! default idle time used by TPAttrInit */ #define DEFAULT_IDLE_TIME 10 * 1000 /*! default free routine used TPJobInit */ #define DEFAULT_FREE_ROUTINE NULL /*! default max jobs used TPAttrInit */ #define DEFAULT_MAX_JOBS_TOTAL 100 /*! * \brief Statistics. * * Always include stats because code change is minimal. */ #define STATS 1 #ifdef _DEBUG #define DEBUG 1 #endif typedef int PolicyType; #define DEFAULT_POLICY SCHED_OTHER /*! Default priority */ #define DEFAULT_SCHED_PARAM 0 /**************************************************************************** * Name: free_routine * * Description: * Function for freeing a thread argument *****************************************************************************/ typedef void (*free_routine)(void *arg); /**************************************************************************** * Name: ThreadPoolAttr * * Description: * Attributes for thread pool. Used to set and change parameters of * thread pool *****************************************************************************/ typedef struct THREADPOOLATTR { /* minThreads, ThreadPool will always maintain at least this many threads */ int minThreads; /* maxThreads, ThreadPool will never have more than this number of threads */ int maxThreads; /* maxIdleTime (in milliseconds) this is the maximum time a thread will * remain idle before dying */ int maxIdleTime; /* jobs per thread to maintain */ int jobsPerThread; /* maximum number of jobs that can be queued totally. */ int maxJobsTotal; /* the time a low priority or med priority job waits before getting bumped * up a priority (in milliseconds) */ int starvationTime; /* scheduling policy to use */ PolicyType schedPolicy; } ThreadPoolAttr; /**************************************************************************** * Name: ThreadPool * * Description: * Internal ThreadPool Job *****************************************************************************/ typedef struct THREADPOOLJOB { start_routine func; void *arg; free_routine free_func; struct timeval requestTime; int priority; int jobId; } ThreadPoolJob; /**************************************************************************** * Name: ThreadPoolStats * * Description: * Structure to hold statistics *****************************************************************************/ typedef struct TPOOLSTATS { double totalTimeHQ; int totalJobsHQ; double avgWaitHQ; double totalTimeMQ; int totalJobsMQ; double avgWaitMQ; double totalTimeLQ; int totalJobsLQ; double avgWaitLQ; double totalWorkTime; double totalIdleTime; int workerThreads; int idleThreads; int persistentThreads; int totalThreads; int maxThreads; int currentJobsHQ; int currentJobsLQ; int currentJobsMQ; } ThreadPoolStats; /*! * \brief A thread pool similar to the thread pool in the UPnP SDK. * * Allows jobs to be scheduled for running by threads in a * thread pool. The thread pool is initialized with a * minimum and maximum thread number as well as a max idle time * and a jobs per thread ratio. If a worker thread waits the whole * max idle time without receiving a job and the thread pool * currently has more threads running than the minimum * then the worker thread will exit. If when * scheduling a job the current job to thread ratio * becomes greater than the set ratio and the thread pool currently has * less than the maximum threads then a new thread will * be created. */ typedef struct THREADPOOL { ithread_mutex_t mutex; /* mutex to protect job qs */ ithread_cond_t condition; /* condition variable to signal Q */ ithread_cond_t start_and_shutdown; /* condition variable for start and stop */ int lastJobId; /* ids for jobs */ int shutdown; /* whether or not we are shutting down */ int totalThreads; /* total number of threads */ int busyThreads; /* number of threads that are currently executing jobs */ int persistentThreads; /* number of persistent threads */ FreeList jobFreeList; /* free list of jobs */ LinkedList lowJobQ; /* low priority job Q */ LinkedList medJobQ; /* med priority job Q */ LinkedList highJobQ; /* high priority job Q */ ThreadPoolJob *persistentJob; /* persistent job */ ThreadPoolAttr attr; /* thread pool attributes */ /* statistics */ ThreadPoolStats stats; } ThreadPool; /**************************************************************************** * Function: ThreadPoolInit * * Description: * Initializes and starts ThreadPool. Must be called first. * And only once for ThreadPool. * Parameters: * tp - must be valid, non null, pointer to ThreadPool. * attr - can be null * * if not null then attr contains the following fields: * * minWorkerThreads - minimum number of worker threads * thread pool will never have less than this * number of threads. * maxWorkerThreads - maximum number of worker threads * thread pool will never have more than this * number of threads. * maxIdleTime - maximum time that a worker thread will spend * idle. If a worker is idle longer than this * time and there are more than the min * number of workers running, than the * worker thread exits. * jobsPerThread - ratio of jobs to thread to try and maintain * if a job is scheduled and the number of jobs per * thread is greater than this number,and * if less than the maximum number of * workers are running then a new thread is * started to help out with efficiency. * schedPolicy - scheduling policy to try and set (OS dependent) * Returns: * 0 on success, nonzero on failure. * EAGAIN if not enough system resources to create minimum threads. * INVALID_POLICY if schedPolicy can't be set * EMAXTHREADS if minimum threads is greater than maximum threads *****************************************************************************/ int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr); /**************************************************************************** * Function: ThreadPoolAddPersistent * * Description: * Adds a persistent job to the thread pool. * Job will be run as soon as possible. * Call will block until job is scheduled. * Parameters: * tp - valid thread pool pointer * ThreadPoolJob - valid thread pool job with the following fields: * * func - ThreadFunction to run * arg - argument to function. * priority - priority of job. * * Returns: * 0 on success, nonzero on failure * EOUTOFMEM not enough memory to add job. * EMAXTHREADS not enough threads to add persistent job. *****************************************************************************/ int ThreadPoolAddPersistent(ThreadPool*tp, ThreadPoolJob *job, int *jobId); /**************************************************************************** * Function: ThreadPoolGetAttr * * Description: * Gets the current set of attributes * associated with the thread pool. * Parameters: * tp - valid thread pool pointer * out - non null pointer to store attributes * Returns: * 0 on success, nonzero on failure * Always returns 0. *****************************************************************************/ int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out); /**************************************************************************** * Function: ThreadPoolSetAttr * * Description: * Sets the attributes for the thread pool. * Only affects future calculations. * Parameters: * tp - valid thread pool pointer * attr - pointer to attributes, null sets attributes to default. * Returns: * 0 on success, nonzero on failure * Returns INVALID_POLICY if policy can not be set. *****************************************************************************/ int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr); /**************************************************************************** * Function: ThreadPoolAdd * * Description: * Adds a job to the thread pool. * Job will be run as soon as possible. * Parameters: * tp - valid thread pool pointer * func - ThreadFunction to run * arg - argument to function. * priority - priority of job. * poolid - id of job * free_function - function to use when freeing argument * Returns: * 0 on success, nonzero on failure * EOUTOFMEM if not enough memory to add job. *****************************************************************************/ int ThreadPoolAdd (ThreadPool*tp, ThreadPoolJob *job, int *jobId); /**************************************************************************** * Function: ThreadPoolRemove * * Description: * Removes a job from the thread pool. * Can only remove jobs which are not * currently running. * Parameters: * tp - valid thread pool pointer * jobid - id of job * out - space for removed job. * Returns: * 0 on success, nonzero on failure. * INVALID_JOB_ID if job not found. *****************************************************************************/ int ThreadPoolRemove(ThreadPool *tp, int jobId, ThreadPoolJob *out); /**************************************************************************** * Function: ThreadPoolShutdown * * Description: * Shuts the thread pool down. * Waits for all threads to finish. * May block indefinitely if jobs do not * exit. * Parameters: * tp - must be valid tp * Returns: * 0 on success, nonzero on failure * Always returns 0. *****************************************************************************/ int ThreadPoolShutdown(ThreadPool *tp); /**************************************************************************** * Function: TPJobInit * * Description: * Initializes thread pool job. * Sets the priority to default defined in ThreadPool.h. * Sets the free_routine to default defined in ThreadPool.h * Parameters: * ThreadPoolJob *job - must be valid thread pool attributes. * start_routine func - function to run, must be valid * void * arg - argument to pass to function. * Returns: * Always returns 0. *****************************************************************************/ int TPJobInit(ThreadPoolJob *job, start_routine func, void *arg); /**************************************************************************** * Function: TPJobSetPriority * * Description: * Sets the max threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * maxThreads - value to set * Returns: * Always returns 0. *****************************************************************************/ int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority); /**************************************************************************** * Function: TPJobSetFreeFunction * * Description: * Sets the max threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * maxThreads - value to set * Returns: * Always returns 0. *****************************************************************************/ int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func); /**************************************************************************** * Function: TPAttrInit * * Description: * Initializes thread pool attributes. * Sets values to defaults defined in ThreadPool.h. * Parameters: * attr - must be valid thread pool attributes. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrInit(ThreadPoolAttr *attr); /**************************************************************************** * Function: TPAttrSetMaxThreads * * Description: * Sets the max threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * maxThreads - value to set * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads); /**************************************************************************** * Function: TPAttrSetMinThreads * * Description: * Sets the min threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * minThreads - value to set * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetMinThreads(ThreadPoolAttr *attr, int minThreads); /**************************************************************************** * Function: TPAttrSetIdleTime * * Description: * Sets the idle time for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime); /**************************************************************************** * Function: TPAttrSetJobsPerThread * * Description: * Sets the jobs per thread ratio * Parameters: * attr - must be valid thread pool attributes. * jobsPerThread - number of jobs per thread to maintain * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread); /**************************************************************************** * Function: TPAttrSetStarvationTime * * Description: * Sets the starvation time for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * int starvationTime - milliseconds * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime); /**************************************************************************** * Function: TPAttrSetSchedPolicy * * Description: * Sets the scheduling policy for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * PolicyType schedPolicy - must be a valid policy type. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy); /**************************************************************************** * Function: TPAttrSetMaxJobsTotal * * Description: * Sets the maximum number jobs that can be qeued totally. * Parameters: * attr - must be valid thread pool attributes. * maxJobsTotal - maximum number of jobs * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal); /**************************************************************************** * Function: ThreadPoolGetStats * * Description: * Returns various statistics about the * thread pool. * Only valid if STATS has been defined. * Parameters: * ThreadPool *tp - valid initialized threadpool * ThreadPoolStats *stats - valid stats, out parameter * Returns: * Always returns 0. *****************************************************************************/ #ifdef STATS EXPORT_SPEC int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats); EXPORT_SPEC void ThreadPoolPrintStats(ThreadPoolStats *stats); #else static UPNP_INLINE int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats) {} static UPNP_INLINE void ThreadPoolPrintStats(ThreadPoolStats *stats) {} #endif #ifdef __cplusplus } #endif #endif /* THREADPOOL_H */ libupnp-1.8.0~svn20100507/threadutil/inc/LinkedList.h0000644000175000017500000003004011025042303016772 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef LINKED_LIST_H #define LINKED_LIST_H /*! * \file */ #include "FreeList.h" #ifdef __cplusplus extern "C" { #endif #define EOUTOFMEM (-7 & 1<<29) #define FREELISTSIZE 100 #define LIST_SUCCESS 1 #define LIST_FAIL 0 /**************************************************************************** * Name: free_routine * * Description: * Function for freeing list items *****************************************************************************/ typedef void (*free_function)(void *arg); /**************************************************************************** * Name: cmp_routine * * Description: * Function for comparing list items * Returns 1 if itemA==itemB *****************************************************************************/ typedef int (*cmp_routine)(void *itemA,void *itemB); /**************************************************************************** * Name: ListNode * * Description: * linked list node. stores generic item and pointers to next and prev. * Internal Use Only. *****************************************************************************/ typedef struct LISTNODE { struct LISTNODE *prev; struct LISTNODE *next; void *item; } ListNode; /**************************************************************************** * Name: LinkedList * * Description: * linked list (no protection). Internal Use Only. * Because this is for internal use, parameters are NOT checked for * validity. * The first item of the list is stored at node: head->next * The last item of the list is stored at node: tail->prev * If head->next=tail, then list is empty. * To iterate through the list: * * LinkedList g; * ListNode *temp = NULL; * for (temp = ListHead(g);temp!=NULL;temp = ListNext(g,temp)) * { * } * *****************************************************************************/ typedef struct LINKEDLIST { ListNode head; /* head, first item is stored at: head->next */ ListNode tail; /* tail, last item is stored at: tail->prev */ long size; /* size of list */ FreeList freeNodeList; /* free list to use */ free_function free_func; /* free function to use */ cmp_routine cmp_func; /* compare function to use */ } LinkedList; /**************************************************************************** * Function: ListInit * * Description: * Initializes LinkedList. Must be called first. * And only once for List. * Parameters: * list - must be valid, non null, pointer to a linked list. * cmp_func - function used to compare items. (May be NULL) * free_func - function used to free items. (May be NULL) * Returns: * 0 on success, EOUTOFMEM on failure. *****************************************************************************/ int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func); /**************************************************************************** * Function: ListAddHead * * Description: * Adds a node to the head of the list. * Node gets immediately after list.head. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode *ListAddHead(LinkedList *list, void *item); /**************************************************************************** * Function: ListAddTail * * Description: * Adds a node to the tail of the list. * Node gets added immediately before list.tail. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode *ListAddTail(LinkedList *list, void *item); /**************************************************************************** * Function: ListAddAfter * * Description: * Adds a node after the specified node. * Node gets added immediately after bnode. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * ListNode * bnode - node to add after * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode *ListAddAfter(LinkedList *list, void *item, ListNode *bnode); /**************************************************************************** * Function: ListAddBefore * * Description: * Adds a node before the specified node. * Node gets added immediately before anode. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode * anode - node to add the in front of. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode *ListAddBefore(LinkedList *list,void *item, ListNode *anode); /**************************************************************************** * Function: ListDelNode * * Description: * Removes a node from the list * The memory for the node is freed. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode *dnode - done to delete. * freeItem - if !0 then item is freed using free function. * if 0 (or free function is NULL) then item is not freed * Returns: * The pointer to the item stored in the node or NULL if the item is freed. * Precondition: * The list has been initialized. *****************************************************************************/ void *ListDelNode(LinkedList *list,ListNode *dnode, int freeItem); /**************************************************************************** * Function: ListDestroy * * Description: * Removes all memory associated with list nodes. * Does not free LinkedList *list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * freeItem - if !0 then items are freed using the free_function. * if 0 (or free function is NULL) then items are not freed. * Returns: * 0 on success. Always returns 0. * Precondition: * The list has been initialized. *****************************************************************************/ int ListDestroy(LinkedList *list, int freeItem); /**************************************************************************** * Function: ListHead * * Description: * Returns the head of the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The head of the list. NULL if list is empty. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode* ListHead(LinkedList *list); /**************************************************************************** * Function: ListTail * * Description: * Returns the tail of the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The tail of the list. NULL if list is empty. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode* ListTail(LinkedList *list); /**************************************************************************** * Function: ListNext * * Description: * Returns the next item in the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The next item in the list. NULL if there are no more items in list. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode* ListNext(LinkedList *list, ListNode * node); /**************************************************************************** * Function: ListPrev * * Description: * Returns the previous item in the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The previous item in the list. NULL if there are no more items in list. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode* ListPrev(LinkedList *list, ListNode * node); /**************************************************************************** * Function: ListFind * * Description: * Finds the specified item in the list. * Uses the compare function specified in ListInit. If compare function * is NULL then compares items as pointers. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode *start - the node to start from, NULL if to start from * beginning. * void * item - the item to search for. * Returns: * The node containing the item. NULL if no node contains the item. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode* ListFind(LinkedList *list, ListNode *start, void * item); /**************************************************************************** * Function: ListSize * * Description: * Returns the size of the list. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * Returns: * The number of items in the list. * Precondition: * The list has been initialized. *****************************************************************************/ int ListSize(LinkedList* list); #ifdef __cplusplus } #endif #endif /* LINKED_LIST_H */ libupnp-1.8.0~svn20100507/threadutil/inc/FreeList.h0000644000175000017500000001206611025042303016455 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef FREE_LIST_H #define FREE_LIST_H /*! * \file */ #ifdef __cplusplus extern "C" { #endif #include "ithread.h" #include /**************************************************************************** * Name: FreeListNode * * Description: * free list node. points to next free item. * memory for node is borrowed from allocated items. * Internal Use Only. *****************************************************************************/ typedef struct FREELISTNODE { struct FREELISTNODE *next; } FreeListNode; /**************************************************************************** * Name: FreeList * * Description: * Stores head and size of free list, as well as mutex for protection. * Internal Use Only. *****************************************************************************/ typedef struct FREELIST { FreeListNode *head; size_t element_size; int maxFreeListLength; int freeListLength; }FreeList; /**************************************************************************** * Function: FreeListInit * * Description: * Initializes Free List. Must be called first. * And only once for FreeList. * Parameters: * free_list - must be valid, non null, pointer to a linked list. * size_t - size of elements to store in free list * maxFreeListSize - max size that the free list can grow to * before returning memory to O.S. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. *****************************************************************************/ int FreeListInit(FreeList *free_list, size_t elementSize, int maxFreeListSize); /**************************************************************************** * Function: FreeListAlloc * * Description: * Allocates chunk of set size. * If a free item is available in the list, returnes the stored item. * Otherwise calls the O.S. to allocate memory. * Parameters: * free_list - must be valid, non null, pointer to a linked list. * Returns: * Non NULL on success. NULL on failure. *****************************************************************************/ void * FreeListAlloc (FreeList *free_list); /**************************************************************************** * Function: FreeListFree * * Description: * Returns an item to the Free List. * If the free list is smaller than the max size than * adds the item to the free list. * Otherwise returns the item to the O.S. * Parameters: * free_list - must be valid, non null, pointer to a linked list. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. *****************************************************************************/ int FreeListFree (FreeList *free_list,void * element); /**************************************************************************** * Function: FreeListDestroy * * Description: * Releases the resources stored with the free list. * Parameters: * free_list - must be valid, non null, pointer to a linked list. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. *****************************************************************************/ int FreeListDestroy (FreeList *free_list); #ifdef __cplusplus } #endif #endif /* FREE_LIST_H */ libupnp-1.8.0~svn20100507/threadutil/inc/ithread.h0000644000175000017500000007173711360640053016402 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef ITHREAD_H #define ITHREAD_H /*! * \file */ #if !defined(WIN32) #include #endif #include "UpnpGlobal.h" /* For UPNP_INLINE, EXPORT_SPEC */ #ifdef __cplusplus extern "C" { #endif #include #ifdef WIN32 /* Do not #include */ #else #include #endif #if defined(BSD) #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE #endif #ifdef PTHREAD_MUTEX_RECURSIVE /* This system has SuS2-compliant mutex attributes. * E.g. on Cygwin, where we don't have the old nonportable (NP) symbols */ #define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL #define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE #define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK #else /* PTHREAD_MUTEX_RECURSIVE */ #define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP #define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP #define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP #endif /* PTHREAD_MUTEX_RECURSIVE */ #define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE #define ITHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED #define ITHREAD_CANCELED PTHREAD_CANCELED /*************************************************************************** * Name: ithread_t * * Description: * Thread handle. * typedef to pthread_t. * Internal Use Only. ***************************************************************************/ typedef pthread_t ithread_t; /**************************************************************************** * Name: ithread_attr_t * * Description: * Thread attribute. * typedef to pthread_attr_t * Internal Use Only ***************************************************************************/ typedef pthread_attr_t ithread_attr_t; /**************************************************************************** * Name: start_routine * * Description: * Thread start routine * Internal Use Only. ***************************************************************************/ typedef void *(*start_routine)(void *arg); /**************************************************************************** * Name: ithread_cond_t * * Description: * condition variable. * typedef to pthread_cond_t * Internal Use Only. ***************************************************************************/ typedef pthread_cond_t ithread_cond_t; /**************************************************************************** * Name: ithread_mutexattr_t * * Description: * Mutex attribute. * typedef to pthread_mutexattr_t * Internal Use Only ***************************************************************************/ typedef pthread_mutexattr_t ithread_mutexattr_t; /**************************************************************************** * Name: ithread_mutex_t * * Description: * Mutex. * typedef to pthread_mutex_t * Internal Use Only. ***************************************************************************/ typedef pthread_mutex_t ithread_mutex_t; /**************************************************************************** * Name: ithread_condattr_t * * Description: * Condition attribute. * typedef to pthread_condattr_t * NOT USED * Internal Use Only ***************************************************************************/ typedef pthread_condattr_t ithread_condattr_t; /**************************************************************************** * Name: ithread_rwlockattr_t * * Description: * Mutex attribute. * typedef to pthread_rwlockattr_t * Internal Use Only ***************************************************************************/ typedef pthread_rwlockattr_t ithread_rwlockattr_t; /**************************************************************************** * Name: ithread_rwlock_t * * Description: * Condition attribute. * typedef to pthread_rwlock_t * Internal Use Only ***************************************************************************/ typedef pthread_rwlock_t ithread_rwlock_t; /**************************************************************************** * Function: ithread_initialize_library * * Description: * Initializes the library. Does nothing in all implementations, except * when statically linked for WIN32. * Parameters: * none. * Returns: * 0 on success, Nonzero on failure. ***************************************************************************/ static UPNP_INLINE int ithread_initialize_library(void) { int ret = 0; #if defined(WIN32) && defined(PTW32_STATIC_LIB) ret = !pthread_win32_process_attach_np(); #endif return ret; } /**************************************************************************** * Function: ithread_cleanup_library * * Description: * Clean up library resources. Does nothing in all implementations, except * when statically linked for WIN32. * Parameters: * none. * Returns: * 0 on success, Nonzero on failure. ***************************************************************************/ static UPNP_INLINE int ithread_cleanup_library(void) { int ret = 0; #if defined(WIN32) && defined(PTW32_STATIC_LIB) ret = !pthread_win32_process_detach_np(); #endif return ret; } /**************************************************************************** * Function: ithread_initialize_thread * * Description: * Initializes the thread. Does nothing in all implementations, except * when statically linked for WIN32. * Parameters: * none. * Returns: * 0 on success, Nonzero on failure. ***************************************************************************/ static UPNP_INLINE int ithread_initialize_thread(void) { int ret = 0; #if defined(WIN32) && defined(PTW32_STATIC_LIB) ret = !pthread_win32_thread_attach_np(); #endif return ret; } /**************************************************************************** * Function: ithread_cleanup_thread * * Description: * Clean up thread resources. Does nothing in all implementations, except * when statically linked for WIN32. * Parameters: * none. * Returns: * 0 on success, Nonzero on failure. ***************************************************************************/ static UPNP_INLINE int ithread_cleanup_thread(void) { int ret = 0; #if defined(WIN32) && defined(PTW32_STATIC_LIB) ret = !pthread_win32_thread_detach_np(); #endif return ret; } /**************************************************************************** * Function: ithread_mutexattr_init * * Description: * Initializes a mutex attribute variable. * Used to set the type of the mutex. * Parameters: * ithread_mutexattr_init * attr (must be valid non NULL pointer to * pthread_mutexattr_t) * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_mutexattr_init ***************************************************************************/ #define ithread_mutexattr_init pthread_mutexattr_init /**************************************************************************** * Function: ithread_mutexattr_destroy * * Description: * Releases any resources held by the mutex attribute. * Currently there are no resources associated with the attribute * Parameters: * ithread_mutexattr_t * attr (must be valid non NULL pointer to * pthread_mutexattr_t) * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_mutexattr_destroy ***************************************************************************/ #define ithread_mutexattr_destroy pthread_mutexattr_destroy /**************************************************************************** * Function: ithread_mutexattr_setkind_np * * Description: * Sets the mutex type in the attribute. * Valid types are: ITHREAD_MUTEX_FAST_NP * ITHREAD_MUTEX_RECURSIVE_NP * ITHREAD_MUTEX_ERRORCHECK_NP * * Parameters: * ithread_mutexattr_t * attr (must be valid non NULL pointer to * ithread_mutexattr_t) * int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP * or ITHREAD_MUTEX_ERRORCHECK_NP) * Returns: * 0 on success. Nonzero on failure. * Returns EINVAL if the kind is not supported. * See man page for pthread_mutexattr_setkind_np *****************************************************************************/ #ifdef PTHREAD_MUTEX_RECURSIVE #define ithread_mutexattr_setkind_np pthread_mutexattr_settype #else #define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np #endif /**************************************************************************** * Function: ithread_mutexattr_getkind_np * * Description: * Gets the mutex type in the attribute. * Valid types are: ITHREAD_MUTEX_FAST_NP * ITHREAD_MUTEX_RECURSIVE_NP * ITHREAD_MUTEX_ERRORCHECK_NP * * Parameters: * ithread_mutexattr_t * attr (must be valid non NULL pointer to * pthread_mutexattr_t) * int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP * or ITHREAD_MUTEX_ERRORCHECK_NP) * Returns: * 0 on success. Nonzero on failure. * Always returns 0. * See man page for pthread_mutexattr_getkind_np *****************************************************************************/ #ifdef PTHREAD_MUTEX_RECURSIVE #define ithread_mutexattr_getkind_np pthread_mutexattr_gettype #else #define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np #endif /**************************************************************************** * Function: ithread_mutex_init * * Description: * Initializes mutex. * Must be called before use. * * Parameters: * ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t) * const ithread_mutexattr_t * mutex_attr * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_mutex_init *****************************************************************************/ #define ithread_mutex_init pthread_mutex_init /**************************************************************************** * Function: ithread_mutex_lock * * Description: * Locks mutex. * Parameters: * ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t) * mutex must be initialized. * * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_mutex_lock *****************************************************************************/ #define ithread_mutex_lock pthread_mutex_lock /**************************************************************************** * Function: ithread_mutex_unlock * * Description: * Unlocks mutex. * * Parameters: * ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t) * mutex must be initialized. * * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_mutex_unlock *****************************************************************************/ #define ithread_mutex_unlock pthread_mutex_unlock /**************************************************************************** * Function: ithread_mutex_destroy * * Description: * Releases any resources held by the mutex. * Mutex can no longer be used after this call. * Mutex is only destroyed when there are no longer any threads waiting on it. * Mutex cannot be destroyed if it is locked. * Parameters: * ithread_mutex_t * mutex (must be valid non NULL pointer to pthread_mutex_t) * mutex must be initialized. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. * See man page for pthread_mutex_destroy *****************************************************************************/ #define ithread_mutex_destroy pthread_mutex_destroy /**************************************************************************** * Function: ithread_rwlockattr_init * * Description: * Initializes a rwlock attribute variable to default values. * Parameters: * const ithread_rwlockattr_init *attr (must be valid non NULL pointer to * pthread_rwlockattr_t) * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_rwlockattr_init ***************************************************************************/ #define ithread_rwlockattr_init pthread_rwlockattr_init /**************************************************************************** * Function: ithread_rwlockattr_destroy * * Description: * Releases any resources held by the rwlock attribute. * Parameters: * ithread_rwlockattr_t *attr (must be valid non NULL pointer to * pthread_rwlockattr_t) * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_rwlockattr_destroy ***************************************************************************/ #define ithread_rwlockattr_destroy pthread_rwlockattr_destroy /**************************************************************************** * Function: ithread_rwlockatttr_setpshared * * Description: * Sets the rwlock type in the attribute. * Valid types are: ITHREAD_PROCESS_PRIVATE * ITHREAD_PROCESS_SHARED * * Parameters: * ithread_rwlockattr_t * attr (must be valid non NULL pointer to * ithread_rwlockattr_t) * int kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED) * * Returns: * 0 on success. Nonzero on failure. * Returns EINVAL if the kind is not supported. * See man page for pthread_rwlockattr_setkind_np *****************************************************************************/ #define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared /**************************************************************************** * Function: ithread_rwlockatttr_getpshared * * Description: * Gets the rwlock type in the attribute. * Valid types are: ITHREAD_PROCESS_PRIVATE * ITHREAD_PROCESS_SHARED * * Parameters: * ithread_rwlockattr_t * attr (must be valid non NULL pointer to * pthread_rwlockattr_t) * int *kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED) * * Returns: * 0 on success. Nonzero on failure. * Always returns 0. * See man page for pthread_rwlockatttr_getpshared *****************************************************************************/ #define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared /**************************************************************************** * Function: ithread_rwlock_init * * Description: * Initializes rwlock. * Must be called before use. * * Parameters: * ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t) * const ithread_rwlockattr_t *rwlock_attr * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_rwlock_init *****************************************************************************/ #define ithread_rwlock_init pthread_rwlock_init /**************************************************************************** * Function: ithread_rwlock_rdlock * * Description: * Locks rwlock for reading. * Parameters: * ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t) * rwlock must be initialized. * * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_rwlock_rdlock *****************************************************************************/ #define ithread_rwlock_rdlock pthread_rwlock_rdlock /**************************************************************************** * Function: ithread_rwlock_wrlock * * Description: * Locks rwlock for writting. * Parameters: * ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t) * rwlock must be initialized. * * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_rwlock_wrlock *****************************************************************************/ #define ithread_rwlock_wrlock pthread_rwlock_wrlock /**************************************************************************** * Function: ithread_rwlock_unlock * * Description: * Unlocks rwlock. * * Parameters: * ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t) * rwlock must be initialized. * * Returns: * 0 on success, Nonzero on failure. * Always returns 0. * See man page for pthread_rwlock_unlock *****************************************************************************/ #define ithread_rwlock_unlock pthread_rwlock_unlock /**************************************************************************** * Function: ithread_rwlock_destroy * * Description: * Releases any resources held by the rwlock. * rwlock can no longer be used after this call. * rwlock is only destroyed when there are no longer any threads waiting on it. * rwlock cannot be destroyed if it is locked. * Parameters: * ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t) * rwlock must be initialized. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. * See man page for pthread_rwlock_destroy *****************************************************************************/ #define ithread_rwlock_destroy pthread_rwlock_destroy /**************************************************************************** * Function: ithread_cond_init * * Description: * Initializes condition variable. * Must be called before use. * Parameters: * ithread_cond_t *cond (must be valid non NULL pointer to pthread_cond_t) * const ithread_condattr_t *cond_attr (ignored) * Returns: * 0 on success, Nonzero on failure. * See man page for pthread_cond_init *****************************************************************************/ #define ithread_cond_init pthread_cond_init /**************************************************************************** * Function: ithread_cond_signal * * Description: * Wakes up exactly one thread waiting on condition. * Associated mutex MUST be locked by thread before entering this call. * Parameters: * ithread_cond_t *cond (must be valid non NULL pointer to * ithread_cond_t) * cond must be initialized * Returns: * 0 on success, Nonzero on failure. * See man page for pthread_cond_signal *****************************************************************************/ #define ithread_cond_signal pthread_cond_signal /**************************************************************************** * Function: ithread_cond_broadcast * * Description: * Wakes up all threads waiting on condition. * Associated mutex MUST be locked by thread before entering this call. * Parameters: * ithread_cond_t *cond (must be valid non NULL pointer to * ithread_cond_t) * cond must be initialized * Returns: * 0 on success, Nonzero on failure. * See man page for pthread_cond_broadcast *****************************************************************************/ #define ithread_cond_broadcast pthread_cond_broadcast /**************************************************************************** * Function: ithread_cond_wait * * Description: * Atomically releases mutex and waits on condition. * Associated mutex MUST be locked by thread before entering this call. * Mutex is reacquired when call returns. * Parameters: * ithread_cond_t *cond (must be valid non NULL pointer to * ithread_cond_t) * cond must be initialized * ithread_mutex_t *mutex (must be valid non NULL pointer to * ithread_mutex_t) * Mutex must be locked. * Returns: * 0 on success, Nonzero on failure. * See man page for pthread_cond_wait *****************************************************************************/ #define ithread_cond_wait pthread_cond_wait /**************************************************************************** * Function: pthread_cond_timedwait * * Description: * Atomically releases the associated mutex and waits on the * condition. * If the condition is not signaled in the specified time than the * call times out and returns. * Associated mutex MUST be locked by thread before entering this call. * Mutex is reacquired when call returns. * Parameters: * ithread_cond_t *cond (must be valid non NULL pointer to ithread_cond_t) * cond must be initialized * ithread_mutex_t *mutex (must be valid non NULL pointer to ithread_mutex_t) * Mutex must be locked. * const struct timespec *abstime (absolute time, measured from Jan 1, 1970) * Returns: * 0 on success. ETIMEDOUT on timeout. Nonzero on failure. * See man page for pthread_cond_timedwait ***************************************************************************/ #define ithread_cond_timedwait pthread_cond_timedwait /**************************************************************************** * Function: ithread_cond_destroy * * Description: * Releases any resources held by the condition variable. * Condition variable can no longer be used after this call. * Parameters: * ithread_cond_t *cond (must be valid non NULL pointer to * ithread_cond_t) * cond must be initialized. * Returns: * 0 on success. Nonzero on failure. * See man page for pthread_cond_destroy ***************************************************************************/ #define ithread_cond_destroy pthread_cond_destroy /**************************************************************************** * Function: ithread_create * * Description: * Creates a thread with the given start routine * and argument. * Parameters: * ithread_t * thread (must be valid non NULL pointer to pthread_t) * ithread_attr_t *attr, IGNORED * void * (start_routine) (void *arg) (start routine) * void * arg - argument. * Returns: * 0 on success. Nonzero on failure. * Returns EAGAIN if a new thread can not be created. * Returns EINVAL if there is a problem with the arguments. * See man page fore pthread_create ***************************************************************************/ #define ithread_create pthread_create /**************************************************************************** * Function: ithread_cancel * * Description: * Cancels a thread. * Parameters: * ithread_t * thread (must be valid non NULL pointer to ithread_t) * Returns: * 0 on success. Nonzero on failure. * See man page for pthread_cancel ***************************************************************************/ #define ithread_cancel pthread_cancel /**************************************************************************** * Function: ithread_exit * * Description: * Returns a return code from a thread. * Implicitly called when the start routine returns. * Parameters: * void * return_code return code to return * See man page for pthread_exit ***************************************************************************/ #define ithread_exit pthread_exit /**************************************************************************** * Function: ithread_get_current_thread_id * * Description: * Returns the handle of the currently running thread. * Returns: * The handle of the currently running thread. * See man page for pthread_self ***************************************************************************/ #define ithread_get_current_thread_id pthread_self /**************************************************************************** * Function: ithread_self * * Description: * Returns the handle of the currently running thread. * Returns: * The handle of the currently running thread. * See man page for pthread_self ***************************************************************************/ #define ithread_self pthread_self /**************************************************************************** * Function: ithread_detach * * Description: * Makes a thread's resources reclaimed immediately * after it finishes * execution. * Returns: * 0 on success, Nonzero on failure. * See man page for pthread_detach ***************************************************************************/ #define ithread_detach pthread_detach /**************************************************************************** * Function: ithread_join * * Description: * Suspends the currently running thread until the * specified thread * has finished. * Returns the return code of the thread, or ITHREAD_CANCELED * if the thread has been canceled. * Parameters: * ithread_t *thread (valid non null thread identifier) * void ** return (space for return code) * Returns: * 0 on success, Nonzero on failure. * See man page for pthread_join ***************************************************************************/ #define ithread_join pthread_join /**************************************************************************** * Function: isleep * * Description: * Suspends the currently running thread for the specified number * of seconds * Always returns 0. * Parameters: * unsigned int seconds - number of seconds to sleep. * Returns: * 0 on success, Nonzero on failure. * See man page for sleep (man 3 sleep) *****************************************************************************/ #ifdef WIN32 #define isleep(x) Sleep((x)*1000) #else #define isleep sleep #endif /**************************************************************************** * Function: isleep * * Description: * Suspends the currently running thread for the specified number * of milliseconds * Always returns 0. * Parameters: * unsigned int milliseconds - number of milliseconds to sleep. * Returns: * 0 on success, Nonzero on failure. * See man page for sleep (man 3 sleep) *****************************************************************************/ #ifdef WIN32 #define imillisleep Sleep #else #define imillisleep(x) usleep(1000*x) #endif #ifndef PTHREAD_MUTEX_RECURSIVE /* NK: Added for satisfying the gcc compiler */ EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind); #endif #ifdef __cplusplus } #endif #endif /* ITHREAD_H */ libupnp-1.8.0~svn20100507/threadutil/src/0000777000175000017500000000000011373047471014705 500000000000000libupnp-1.8.0~svn20100507/threadutil/src/TimerThread.c0000644000175000017500000002421011025042303017153 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /*! * \file */ #include "TimerThread.h" #include /*! * \brief Deallocates a dynamically allocated TimerEvent. */ static void FreeTimerEvent( /*! [in] Valid timer thread pointer. */ TimerThread *timer, /*! [in] Must be allocated with CreateTimerEvent*/ TimerEvent *event) { assert(timer != NULL); FreeListFree(&timer->freeEvents, event); } /*! * \brief Implements timer thread. * * Waits for next event to occur and schedules associated job into threadpool. */ static void *TimerThreadWorker( /*! [in] arg is cast to (TimerThread *). */ void *arg) { TimerThread *timer = ( TimerThread * ) arg; ListNode *head = NULL; TimerEvent *nextEvent = NULL; time_t currentTime = 0; time_t nextEventTime = 0; struct timespec timeToWait; int tempId; assert( timer != NULL ); ithread_mutex_lock( &timer->mutex ); while( 1 ) { //mutex should always be locked at top of loop //Check for shutdown if( timer->shutdown ) { timer->shutdown = 0; ithread_cond_signal( &timer->condition ); ithread_mutex_unlock( &timer->mutex ); return NULL; } nextEvent = NULL; //Get the next event if possible if( timer->eventQ.size > 0 ) { head = ListHead( &timer->eventQ ); nextEvent = ( TimerEvent * ) head->item; nextEventTime = nextEvent->eventTime; } currentTime = time( NULL ); //If time has elapsed, schedule job if( ( nextEvent != NULL ) && ( currentTime >= nextEventTime ) ) { if( nextEvent->persistent ) { ThreadPoolAddPersistent( timer->tp, &nextEvent->job, &tempId ); } else { ThreadPoolAdd( timer->tp, &nextEvent->job, &tempId ); } ListDelNode( &timer->eventQ, head, 0 ); FreeTimerEvent( timer, nextEvent ); continue; } if( nextEvent != NULL ) { timeToWait.tv_nsec = 0; timeToWait.tv_sec = nextEvent->eventTime; ithread_cond_timedwait( &timer->condition, &timer->mutex, &timeToWait ); } else { ithread_cond_wait( &timer->condition, &timer->mutex ); } } } /*! * \brief Calculates the appropriate timeout in absolute seconds * since Jan 1, 1970. * * \return */ static int CalculateEventTime( /*! [in] Timeout. */ time_t *timeout, /*! [in] Timeout type. */ TimeoutType type) { time_t now; assert( timeout != NULL ); if( type == ABS_SEC ) return 0; else if( type == REL_SEC ) { time( &now ); ( *timeout ) += now; return 0; } return -1; } /*! * \brief Creates a Timer Event. (Dynamically allocated). * * \return (TimerEvent *) on success, NULL on failure. */ static TimerEvent *CreateTimerEvent( /*! [in] Valid timer thread pointer. */ TimerThread *timer, /*! [in] . */ ThreadPoolJob *job, /*! [in] . */ Duration persistent, /*! [in] The absoule time of the event in seconds from Jan, 1970. */ time_t eventTime, /*! [in] Id of job. */ int id) { TimerEvent *temp = NULL; assert( timer != NULL ); assert( job != NULL ); temp = ( TimerEvent * ) FreeListAlloc( &timer->freeEvents ); if( temp == NULL ) return temp; temp->job = ( *job ); temp->persistent = persistent; temp->eventTime = eventTime; temp->id = id; return temp; } int TimerThreadInit(TimerThread *timer, ThreadPool *tp) { int rc = 0; ThreadPoolJob timerThreadWorker; assert( timer != NULL ); assert( tp != NULL ); if( ( timer == NULL ) || ( tp == NULL ) ) { return EINVAL; } rc += ithread_mutex_init( &timer->mutex, NULL ); assert( rc == 0 ); rc += ithread_mutex_lock( &timer->mutex ); assert( rc == 0 ); rc += ithread_cond_init( &timer->condition, NULL ); assert( rc == 0 ); rc += FreeListInit( &timer->freeEvents, sizeof( TimerEvent ), 100 ); assert( rc == 0 ); timer->shutdown = 0; timer->tp = tp; timer->lastEventId = 0; rc += ListInit( &timer->eventQ, NULL, NULL ); assert( rc == 0 ); if( rc != 0 ) { rc = EAGAIN; } else { TPJobInit( &timerThreadWorker, TimerThreadWorker, timer ); TPJobSetPriority( &timerThreadWorker, HIGH_PRIORITY ); rc = ThreadPoolAddPersistent( tp, &timerThreadWorker, NULL ); } ithread_mutex_unlock( &timer->mutex ); if( rc != 0 ) { ithread_cond_destroy( &timer->condition ); ithread_mutex_destroy( &timer->mutex ); FreeListDestroy( &timer->freeEvents ); ListDestroy( &timer->eventQ, 0 ); } return rc; } int TimerThreadSchedule( TimerThread *timer, time_t timeout, TimeoutType type, ThreadPoolJob *job, Duration duration, int *id) { int rc = EOUTOFMEM; int found = 0; int tempId = 0; ListNode *tempNode = NULL; TimerEvent *temp = NULL; TimerEvent *newEvent = NULL; assert( timer != NULL ); assert( job != NULL ); if( ( timer == NULL ) || ( job == NULL ) ) { return EINVAL; } CalculateEventTime( &timeout, type ); ithread_mutex_lock( &timer->mutex ); if( id == NULL ) id = &tempId; ( *id ) = INVALID_EVENT_ID; newEvent = CreateTimerEvent( timer, job, duration, timeout, timer->lastEventId ); if( newEvent == NULL ) { ithread_mutex_unlock( &timer->mutex ); return rc; } tempNode = ListHead( &timer->eventQ ); //add job to Q //Q is ordered by eventTime //with the head of the Q being the next event while( tempNode != NULL ) { temp = ( TimerEvent * ) tempNode->item; if( temp->eventTime >= timeout ) { if( ListAddBefore( &timer->eventQ, newEvent, tempNode ) != NULL ) rc = 0; found = 1; break; } tempNode = ListNext( &timer->eventQ, tempNode ); } //add to the end of Q if( !found ) { if( ListAddTail( &timer->eventQ, newEvent ) != NULL ) rc = 0; } //signal change in Q if( rc == 0 ) { ithread_cond_signal( &timer->condition ); } else { FreeTimerEvent( timer, newEvent ); } ( *id ) = timer->lastEventId++; ithread_mutex_unlock( &timer->mutex ); return rc; } int TimerThreadRemove( TimerThread *timer, int id, ThreadPoolJob *out) { int rc = INVALID_EVENT_ID; ListNode *tempNode = NULL; TimerEvent *temp = NULL; assert( timer != NULL ); if( timer == NULL ) { return EINVAL; } ithread_mutex_lock( &timer->mutex ); tempNode = ListHead( &timer->eventQ ); while( tempNode != NULL ) { temp = ( TimerEvent * ) tempNode->item; if( temp->id == id ) { ListDelNode( &timer->eventQ, tempNode, 0 ); if( out != NULL ) ( *out ) = temp->job; FreeTimerEvent( timer, temp ); rc = 0; break; } tempNode = ListNext( &timer->eventQ, tempNode ); } ithread_mutex_unlock( &timer->mutex ); return rc; } int TimerThreadShutdown(TimerThread *timer) { ListNode *tempNode2 = NULL; ListNode *tempNode = NULL; assert( timer != NULL ); if( timer == NULL ) { return EINVAL; } ithread_mutex_lock( &timer->mutex ); timer->shutdown = 1; tempNode = ListHead( &timer->eventQ ); //Delete nodes in Q //call registered free function //on argument while( tempNode != NULL ) { TimerEvent *temp = ( TimerEvent * ) tempNode->item; tempNode2 = ListNext( &timer->eventQ, tempNode ); ListDelNode( &timer->eventQ, tempNode, 0 ); if( temp->job.free_func ) { temp->job.free_func( temp->job.arg ); } FreeTimerEvent( timer, temp ); tempNode = tempNode2; } ListDestroy( &timer->eventQ, 0 ); FreeListDestroy( &timer->freeEvents ); ithread_cond_broadcast( &timer->condition ); while( timer->shutdown ) //wait for timer thread to shutdown { ithread_cond_wait( &timer->condition, &timer->mutex ); } ithread_mutex_unlock( &timer->mutex ); //destroy condition while( ithread_cond_destroy( &timer->condition ) != 0 ) { } //destroy mutex while( ithread_mutex_destroy( &timer->mutex ) != 0 ) { } return 0; } libupnp-1.8.0~svn20100507/threadutil/src/ThreadPool.c0000644000175000017500000012320511360640053017020 00000000000000/******************************************************************************* * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ /*! * \file */ #if !defined(WIN32) #include #endif #include "ThreadPool.h" #include "FreeList.h" #include #include #include #include /* for memset()*/ /**************************************************************************** * Function: DiffMillis * * Description: * Returns the difference in milliseconds between two * timeval structures. * Internal Only. * Parameters: * struct timeval *time1, * struct timeval *time2, * Returns: * the difference in milliseconds, time1-time2. *****************************************************************************/ static unsigned long DiffMillis(struct timeval *time1, struct timeval *time2) { double temp = 0; temp = time1->tv_sec - time2->tv_sec; /* convert to milliseconds */ temp *= 1000; /* convert microseconds to milliseconds and add to temp */ /* implicit flooring of unsigned long data type */ temp += (time1->tv_usec - time2->tv_usec) / 1000; return temp; } #ifdef STATS /**************************************************************************** * Function: StatsInit * * Description: * Initializes the statistics structure. * Internal Only. * Parameters: * ThreadPoolStats *stats must be valid non null stats structure *****************************************************************************/ static void StatsInit(ThreadPoolStats *stats) { stats->totalIdleTime = 0; stats->totalJobsHQ = 0; stats->totalJobsLQ = 0; stats->totalJobsMQ = 0; stats->totalTimeHQ = 0; stats->totalTimeMQ = 0; stats->totalTimeLQ = 0; stats->totalWorkTime = 0; stats->totalIdleTime = 0; stats->avgWaitHQ = 0; stats->avgWaitMQ = 0; stats->avgWaitLQ = 0; stats->workerThreads = 0; stats->idleThreads = 0; stats->persistentThreads = 0; stats->maxThreads = 0; stats->totalThreads = 0; } static void StatsAccountLQ(ThreadPool *tp, unsigned long diffTime) { tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diffTime; } static void StatsAccountMQ(ThreadPool *tp, unsigned long diffTime) { tp->stats.totalJobsMQ++; tp->stats.totalTimeMQ += diffTime; } static void StatsAccountHQ(ThreadPool *tp, unsigned long diffTime) { tp->stats.totalJobsHQ++; tp->stats.totalTimeHQ += diffTime; } /**************************************************************************** * Function: CalcWaitTime * * Description: * Calculates the time the job has been waiting at the specified * priority. Adds to the totalTime and totalJobs kept in the * thread pool statistics structure. * Internal Only. * * Parameters: * ThreadPool *tp * ThreadPriority p * ThreadPoolJob *job *****************************************************************************/ static void CalcWaitTime(ThreadPool *tp, ThreadPriority p, ThreadPoolJob *job) { struct timeval now; unsigned long diff; assert(tp != NULL); assert(job != NULL); gettimeofday(&now, NULL); diff = DiffMillis(&now, &job->requestTime); switch (p) { case LOW_PRIORITY: StatsAccountLQ(tp, diff); break; case MED_PRIORITY: StatsAccountMQ(tp, diff); break; case HIGH_PRIORITY: StatsAccountHQ(tp, diff); break; default: assert(0); } } static time_t StatsTime(time_t *t) { struct timeval tv; gettimeofday(&tv, NULL); if (t) { *t = tv.tv_sec; } return tv.tv_sec; } #else /* STATS */ static UPNP_INLINE void StatsInit(ThreadPoolStats *stats) {} static UPNP_INLINE void StatsAccountLQ(ThreadPool *tp, unsigned long diffTime) {} static UPNP_INLINE void StatsAccountMQ(ThreadPool *tp, unsigned long diffTime) {} static UPNP_INLINE void StatsAccountHQ(ThreadPool *tp, unsigned long diffTime) {} static UPNP_INLINE void CalcWaitTime(ThreadPool *tp, ThreadPriority p, ThreadPoolJob *job) {} static UPNP_INLINE time_t StatsTime(time_t *t) { return 0; } #endif /* STATS */ /**************************************************************************** * Function: CmpThreadPoolJob * * Description: * Compares thread pool jobs. * Parameters: * void * - job A * void * - job B *****************************************************************************/ static int CmpThreadPoolJob(void *jobA, void *jobB) { ThreadPoolJob *a = (ThreadPoolJob *)jobA; ThreadPoolJob *b = (ThreadPoolJob *)jobB; return a->jobId == b->jobId; } /**************************************************************************** * Function: FreeThreadPoolJob * * Description: * Deallocates a dynamically allocated ThreadPoolJob. * Parameters: * ThreadPoolJob *tpj - must be allocated with CreateThreadPoolJob *****************************************************************************/ static void FreeThreadPoolJob(ThreadPool *tp, ThreadPoolJob *tpj) { FreeListFree(&tp->jobFreeList, tpj); } /**************************************************************************** * Function: SetPolicyType * * Description: * Sets the scheduling policy of the current process. * Internal only. * Parameters: * PolicyType in * Returns: * 0 on success, nonzero on failure * Returns result of GetLastError() on failure. * *****************************************************************************/ static int SetPolicyType(PolicyType in) { int retVal = 0; #ifdef __CYGWIN__ /* TODO not currently working... */ retVal = 0; #elif defined(__OSX__) || defined(__APPLE__) || defined(__NetBSD__) setpriority(PRIO_PROCESS, 0, 0); retVal = 0; #elif defined(WIN32) retVal = sched_setscheduler(0, in); #elif defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0 struct sched_param current; int sched_result; memset(¤t, 0, sizeof(current)); sched_getparam(0, ¤t); current.sched_priority = DEFAULT_SCHED_PARAM; sched_result = sched_setscheduler(0, in, ¤t); retVal = (sched_result != -1 || errno == EPERM) ? 0 : errno; #else retVal = 0; #endif return retVal; } /**************************************************************************** * Function: SetPriority * * Description: * Sets the priority of the currently running thread. * Internal only. * Parameters: * ThreadPriority priority * Returns: * 0 on success, nonzero on failure * EINVAL invalid priority * Returns result of GerLastError on failure. * *****************************************************************************/ static int SetPriority(ThreadPriority priority) { int retVal = 0; #if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0 int currentPolicy; int minPriority = 0; int maxPriority = 0; int actPriority = 0; int midPriority = 0; struct sched_param newPriority; int sched_result; pthread_getschedparam(ithread_self(), ¤tPolicy, &newPriority); minPriority = sched_get_priority_min(currentPolicy); maxPriority = sched_get_priority_max(currentPolicy); midPriority = (maxPriority - minPriority) / 2; switch (priority) { case LOW_PRIORITY: actPriority = minPriority; break; case MED_PRIORITY: actPriority = midPriority; break; case HIGH_PRIORITY: actPriority = maxPriority; break; default: retVal = EINVAL; goto exit_function; }; newPriority.sched_priority = actPriority; sched_result = pthread_setschedparam(ithread_self(), currentPolicy, &newPriority); retVal = (sched_result == 0 || errno == EPERM) ? 0 : sched_result; #else retVal = 0; #endif exit_function: return retVal; } /**************************************************************************** * Function: BumpPriority * * Description: * Determines whether any jobs * need to be bumped to a higher priority Q and bumps them. * * tp->mutex must be locked. * Internal Only. * Parameters: * ThreadPool *tp *****************************************************************************/ static void BumpPriority(ThreadPool *tp) { int done = 0; struct timeval now; unsigned long diffTime = 0; ThreadPoolJob *tempJob = NULL; gettimeofday(&now, NULL); while (!done) { if (tp->medJobQ.size) { tempJob = (ThreadPoolJob *)tp->medJobQ.head.next->item; diffTime = DiffMillis(&now, &tempJob->requestTime); if (diffTime >= tp->attr.starvationTime) { /* If job has waited longer than the starvation time * bump priority (add to higher priority Q) */ StatsAccountMQ(tp, diffTime); ListDelNode(&tp->medJobQ, tp->medJobQ.head.next, 0); ListAddTail(&tp->highJobQ, tempJob); continue; } } if (tp->lowJobQ.size) { tempJob = (ThreadPoolJob *)tp->lowJobQ.head.next->item; diffTime = DiffMillis(&now, &tempJob->requestTime); if (diffTime >= tp->attr.maxIdleTime) { /* If job has waited longer than the starvation time * bump priority (add to higher priority Q) */ StatsAccountLQ(tp, diffTime); ListDelNode(&tp->lowJobQ, tp->lowJobQ.head.next, 0); ListAddTail(&tp->medJobQ, tempJob); continue; } } done = 1; } } /**************************************************************************** * Function: SetRelTimeout * * Description: * Sets the fields of the * passed in timespec to be relMillis milliseconds in the future. * Internal Only. * Parameters: * struct timespec *time * int relMillis - milliseconds in the future *****************************************************************************/ static void SetRelTimeout( struct timespec *time, int relMillis ) { struct timeval now; int sec = relMillis / 1000; int milliSeconds = relMillis % 1000; gettimeofday(&now, NULL); time->tv_sec = now.tv_sec + sec; time->tv_nsec = (now.tv_usec / 1000 + milliSeconds) * 1000000; } /**************************************************************************** * Function: SetSeed * * Description: * Sets seed for random number generator. * Each thread sets the seed random number generator. * Internal Only. * Parameters: * *****************************************************************************/ static void SetSeed() { struct timeval t; gettimeofday(&t, NULL); #if defined(WIN32) srand((unsigned int)t.tv_usec + (unsigned int)ithread_get_current_thread_id().p); #elif defined(BSD) || defined(__OSX__) || defined(__APPLE__) || defined(__FreeBSD_kernel__) srand((unsigned int)t.tv_usec + (unsigned int)ithread_get_current_thread_id()); #elif defined(__linux__) || defined(__sun) || defined(__CYGWIN__) || defined(__GLIBC__) srand((unsigned int)t.tv_usec + ithread_get_current_thread_id()); #else { volatile union { volatile pthread_t tid; volatile unsigned i; } idu; idu.tid = ithread_get_current_thread_id(); srand((unsigned int)t.millitm + idu.i); } #endif } /**************************************************************************** * Function: WorkerThread * * Description: * Implements a thread pool worker. * Worker waits for a job to become available. * Worker picks up persistent jobs first, high priority, med priority, * then low priority. * If worker remains idle for more than specified max, the worker * is released. * Internal Only. * Parameters: * void * arg -> is cast to ThreadPool * *****************************************************************************/ static void *WorkerThread(void *arg) { time_t start = 0; ThreadPoolJob *job = NULL; ListNode *head = NULL; struct timespec timeout; int retCode = 0; int persistent = -1; ThreadPool *tp = (ThreadPool *) arg; ithread_initialize_thread(); /* Increment total thread count */ ithread_mutex_lock(&tp->mutex); tp->totalThreads++; ithread_cond_broadcast(&tp->start_and_shutdown); ithread_mutex_unlock(&tp->mutex); SetSeed(); StatsTime(&start); while (1) { ithread_mutex_lock(&tp->mutex); if (job) { tp->busyThreads--; FreeThreadPoolJob(tp, job); job = NULL; } retCode = 0; tp->stats.idleThreads++; tp->stats.totalWorkTime += ( StatsTime( NULL ) - start ); // work time StatsTime( &start ); // idle time if (persistent == 0) { tp->stats.workerThreads--; } else if (persistent == 1) { /* Persistent thread becomes a regular thread */ tp->persistentThreads--; } /* Check for a job or shutdown */ while (tp->lowJobQ.size == 0 && tp->medJobQ.size == 0 && tp->highJobQ.size == 0 && !tp->persistentJob && !tp->shutdown) { /* If wait timed out and we currently have more than the * min threads, or if we have more than the max threads * (only possible if the attributes have been reset) * let this thread die. */ if ((retCode == ETIMEDOUT && tp->totalThreads > tp->attr.minThreads) || (tp->attr.maxThreads != -1 && tp->totalThreads > tp->attr.maxThreads)) { tp->stats.idleThreads--; goto exit_function; } SetRelTimeout(&timeout, tp->attr.maxIdleTime); /* wait for a job up to the specified max time */ retCode = ithread_cond_timedwait( &tp->condition, &tp->mutex, &timeout); } tp->stats.idleThreads--; /* idle time */ tp->stats.totalIdleTime += StatsTime(NULL) - start; /* work time */ StatsTime(&start); /* bump priority of starved jobs */ BumpPriority(tp); /* if shutdown then stop */ if (tp->shutdown) { goto exit_function; } else { /* Pick up persistent job if available */ if (tp->persistentJob) { job = tp->persistentJob; tp->persistentJob = NULL; tp->persistentThreads++; persistent = 1; ithread_cond_broadcast(&tp->start_and_shutdown); } else { tp->stats.workerThreads++; persistent = 0; /* Pick the highest priority job */ if (tp->highJobQ.size > 0) { head = ListHead(&tp->highJobQ); job = (ThreadPoolJob *) head->item; CalcWaitTime(tp, HIGH_PRIORITY, job); ListDelNode(&tp->highJobQ, head, 0); } else if (tp->medJobQ.size > 0) { head = ListHead(&tp->medJobQ); job = (ThreadPoolJob *) head->item; CalcWaitTime(tp, MED_PRIORITY, job); ListDelNode(&tp->medJobQ, head, 0); } else if (tp->lowJobQ.size > 0) { head = ListHead(&tp->lowJobQ); job = (ThreadPoolJob *) head->item; CalcWaitTime(tp, LOW_PRIORITY, job); ListDelNode(&tp->lowJobQ, head, 0); } else { /* Should never get here */ tp->stats.workerThreads--; goto exit_function; } } } tp->busyThreads++; ithread_mutex_unlock(&tp->mutex); /* In the future can log info */ if (SetPriority(job->priority) != 0) { } else { } /* run the job */ job->func(job->arg); /* return to Normal */ SetPriority(DEFAULT_PRIORITY); } exit_function: tp->totalThreads--; ithread_cond_broadcast(&tp->start_and_shutdown); ithread_mutex_unlock(&tp->mutex); ithread_cleanup_thread(); return NULL; } /**************************************************************************** * Function: CreateThreadPoolJob * * Description: * Creates a Thread Pool Job. (Dynamically allocated) * Internal to thread pool. * Parameters: * ThreadPoolJob *job - job is copied * id - id of job * * Returns: * ThreadPoolJob *on success, NULL on failure. *****************************************************************************/ static ThreadPoolJob *CreateThreadPoolJob(ThreadPoolJob *job, int id, ThreadPool *tp) { ThreadPoolJob *newJob = NULL; newJob = (ThreadPoolJob *)FreeListAlloc(&tp->jobFreeList); if (newJob) { *newJob = *job; newJob->jobId = id; gettimeofday(&newJob->requestTime, NULL); } return newJob; } /**************************************************************************** * Function: CreateWorker * * Description: * Creates a worker thread, if the thread pool * does not already have max threads. * Internal to thread pool. * Parameters: * ThreadPool *tp * * Returns: * 0 on success, <0 on failure * EMAXTHREADS if already max threads reached * EAGAIN if system can not create thread * *****************************************************************************/ static int CreateWorker(ThreadPool *tp) { ithread_t temp; int rc = 0; int currentThreads = tp->totalThreads + 1; if (tp->attr.maxThreads != INFINITE_THREADS && currentThreads > tp->attr.maxThreads) { return EMAXTHREADS; } rc = ithread_create(&temp, NULL, WorkerThread, tp); if (rc == 0) { rc = ithread_detach(temp); while (tp->totalThreads < currentThreads) { ithread_cond_wait(&tp->start_and_shutdown, &tp->mutex); } } if (tp->stats.maxThreads < tp->totalThreads) { tp->stats.maxThreads = tp->totalThreads; } return rc; } /**************************************************************************** * Function: AddWorker * * Description: * Determines whether or not a thread should be added * based on the jobsPerThread ratio. * Adds a thread if appropriate. * Internal to Thread Pool. * Parameters: * ThreadPool* tp * *****************************************************************************/ static void AddWorker(ThreadPool *tp) { int jobs = 0; int threads = 0; jobs = tp->highJobQ.size + tp->lowJobQ.size + tp->medJobQ.size; threads = tp->totalThreads - tp->persistentThreads; while (threads == 0 || (jobs / threads) >= tp->attr.jobsPerThread || (tp->totalThreads == tp->busyThreads) ) { if (CreateWorker(tp) != 0) { return; } threads++; } } /**************************************************************************** * Function: ThreadPoolInit * * Description: * Initializes and starts ThreadPool. Must be called first. * And only once for ThreadPool. * Parameters: * tp - must be valid, non null, pointer to ThreadPool. * minWorkerThreads - minimum number of worker threads * thread pool will never have less than this * number of threads. * maxWorkerThreads - maximum number of worker threads * thread pool will never have more than this * number of threads. * maxIdleTime - maximum time that a worker thread will spend * idle. If a worker is idle longer than this * time and there are more than the min * number of workers running, than the * worker thread exits. * jobsPerThread - ratio of jobs to thread to try and maintain * if a job is scheduled and the number of jobs per * thread is greater than this number,and * if less than the maximum number of * workers are running then a new thread is * started to help out with efficiency. * schedPolicy - scheduling policy to try and set (OS dependent) * Returns: * 0 on success, nonzero on failure. * EAGAIN if not enough system resources to create minimum threads. * INVALID_POLICY if schedPolicy can't be set * EMAXTHREADS if minimum threads is greater than maximum threads *****************************************************************************/ int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr) { int retCode = 0; int i = 0; if (!tp) { return EINVAL; } retCode += ithread_mutex_init(&tp->mutex, NULL); retCode += ithread_mutex_lock(&tp->mutex); retCode += ithread_cond_init(&tp->condition, NULL); retCode += ithread_cond_init(&tp->start_and_shutdown, NULL); if (retCode) { return EAGAIN; } if (attr) { tp->attr = *attr; } else { TPAttrInit(&tp->attr); } if (SetPolicyType(tp->attr.schedPolicy) != 0) { ithread_mutex_unlock(&tp->mutex); ithread_mutex_destroy(&tp->mutex); ithread_cond_destroy(&tp->condition); ithread_cond_destroy(&tp->start_and_shutdown); return INVALID_POLICY; } retCode += FreeListInit( &tp->jobFreeList, sizeof(ThreadPoolJob), JOBFREELISTSIZE); StatsInit(&tp->stats); retCode += ListInit(&tp->highJobQ, CmpThreadPoolJob, NULL); retCode += ListInit(&tp->medJobQ, CmpThreadPoolJob, NULL); retCode += ListInit(&tp->lowJobQ, CmpThreadPoolJob, NULL); if (retCode) { retCode = EAGAIN; } else { tp->persistentJob = NULL; tp->lastJobId = 0; tp->shutdown = 0; tp->totalThreads = 0; tp->busyThreads = 0; tp->persistentThreads = 0; for (i = 0; i < tp->attr.minThreads; ++i) { retCode = CreateWorker(tp); if (retCode) { break; } } } ithread_mutex_unlock(&tp->mutex); if (retCode) { /* clean up if the min threads could not be created */ ThreadPoolShutdown(tp); } return retCode; } /**************************************************************************** * Function: ThreadPoolAddPersistent * * Description: * Adds a long term job to the thread pool. * Job will be run as soon as possible. * Call will block until job is scheduled. * Parameters: * tp - valid thread pool pointer * job-> valid ThreadPoolJob pointer with following fields * func - ThreadFunction to run * arg - argument to function. * priority - priority of job. * free_function - function to use when freeing argument * Returns: * 0 on success, nonzero on failure * EOUTOFMEM not enough memory to add job. * EMAXTHREADS not enough threads to add persistent job. *****************************************************************************/ int ThreadPoolAddPersistent(ThreadPool *tp, ThreadPoolJob *job, int *jobId) { int ret = 0; int tempId = -1; ThreadPoolJob *temp = NULL; if (!tp || !job) { return EINVAL; } if (!jobId) { jobId = &tempId; } *jobId = INVALID_JOB_ID; ithread_mutex_lock(&tp->mutex); /* Create A worker if less than max threads running */ if (tp->totalThreads < tp->attr.maxThreads) { CreateWorker(tp); } else { /* if there is more than one worker thread * available then schedule job, otherwise fail */ if (tp->totalThreads - tp->persistentThreads - 1 == 0) { ret = EMAXTHREADS; goto exit_function; } } temp = CreateThreadPoolJob(job, tp->lastJobId, tp); if (!temp) { ret = EOUTOFMEM; goto exit_function; } tp->persistentJob = temp; /* Notify a waiting thread */ ithread_cond_signal(&tp->condition); /* wait until long job has been picked up */ while (tp->persistentJob) { ithread_cond_wait(&tp->start_and_shutdown, &tp->mutex); } *jobId = tp->lastJobId++; exit_function: ithread_mutex_unlock(&tp->mutex); return ret; } /**************************************************************************** * Function: ThreadPoolAdd * * Description: * Adds a job to the thread pool. * Job will be run as soon as possible. * Parameters: * tp - valid thread pool pointer * func - ThreadFunction to run * arg - argument to function. * priority - priority of job. * jobId - id of job * duration - whether or not this is a persistent thread * free_function - function to use when freeing argument * Returns: * 0 on success, nonzero on failure * EOUTOFMEM if not enough memory to add job. *****************************************************************************/ int ThreadPoolAdd(ThreadPool *tp, ThreadPoolJob *job, int *jobId) { int rc = EOUTOFMEM; int tempId = -1; int totalJobs; ThreadPoolJob *temp = NULL; if (!tp || !job) { return EINVAL; } ithread_mutex_lock(&tp->mutex); totalJobs = tp->highJobQ.size + tp->lowJobQ.size + tp->medJobQ.size; if (totalJobs >= tp->attr.maxJobsTotal) { fprintf(stderr, "total jobs = %d, too many jobs", totalJobs); goto exit_function; } if (!jobId) { jobId = &tempId; } *jobId = INVALID_JOB_ID; temp = CreateThreadPoolJob(job, tp->lastJobId, tp); if (!temp) { goto exit_function; } if (job->priority == HIGH_PRIORITY) { if (ListAddTail(&tp->highJobQ, temp)) { rc = 0; } } else if (job->priority == MED_PRIORITY) { if (ListAddTail(&tp->medJobQ, temp)) { rc = 0; } } else { if (ListAddTail(&tp->lowJobQ, temp)) { rc = 0; } } /* AddWorker if appropriate */ AddWorker(tp); /* Notify a waiting thread */ if (rc == 0) { ithread_cond_signal(&tp->condition); } else { FreeThreadPoolJob(tp, temp); } *jobId = tp->lastJobId++; exit_function: ithread_mutex_unlock(&tp->mutex); return rc; } /**************************************************************************** * Function: ThreadPoolRemove * * Description: * Removes a job from the thread pool. * Can only remove jobs which are not * currently running. * Parameters: * tp - valid thread pool pointer * jobId - id of job * ThreadPoolJob *out - space for removed job. * Can be null if not needed. * * Returns: * 0 on success. INVALID_JOB_ID on failure. *****************************************************************************/ int ThreadPoolRemove(ThreadPool *tp, int jobId, ThreadPoolJob *out) { int ret = INVALID_JOB_ID; ThreadPoolJob *temp = NULL; ListNode *tempNode = NULL; ThreadPoolJob dummy; if (!tp) { return EINVAL; } if (!out) { out = &dummy; } dummy.jobId = jobId; ithread_mutex_lock(&tp->mutex); tempNode = ListFind(&tp->highJobQ, NULL, &dummy); if (tempNode) { temp = (ThreadPoolJob *)tempNode->item; *out = *temp; ListDelNode(&tp->highJobQ, tempNode, 0); FreeThreadPoolJob(tp, temp); ret = 0; goto exit_function; } tempNode = ListFind(&tp->medJobQ, NULL, &dummy); if (tempNode) { temp = (ThreadPoolJob *)tempNode->item; *out = *temp; ListDelNode(&tp->medJobQ, tempNode, 0); FreeThreadPoolJob(tp, temp); ret = 0; goto exit_function; } tempNode = ListFind(&tp->lowJobQ, NULL, &dummy); if (tempNode) { temp = (ThreadPoolJob *)tempNode->item; *out = *temp; ListDelNode(&tp->lowJobQ, tempNode, 0); FreeThreadPoolJob(tp, temp); ret = 0; goto exit_function; } if (tp->persistentJob && tp->persistentJob->jobId == jobId) { *out = *tp->persistentJob; FreeThreadPoolJob(tp, tp->persistentJob); tp->persistentJob = NULL; ret = 0; goto exit_function; } exit_function: ithread_mutex_unlock(&tp->mutex); return ret; } /**************************************************************************** * Function: ThreadPoolGetAttr * * Description: * Gets the current set of attributes * associated with the thread pool. * Parameters: * tp - valid thread pool pointer * out - non null pointer to store attributes * Returns: * 0 on success, nonzero on failure * Always returns 0. *****************************************************************************/ int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out) { if (!tp || !out) { return EINVAL; } if (!tp->shutdown) { ithread_mutex_lock(&tp->mutex); } *out = tp->attr; if (!tp->shutdown) { ithread_mutex_unlock(&tp->mutex); } return 0; } /**************************************************************************** * Function: ThreadPoolSetAttr * * Description: * Sets the attributes for the thread pool. * Only affects future calculations. * Parameters: * tp - valid thread pool pointer * attr - pointer to attributes, null sets attributes to default. * Returns: * 0 on success, nonzero on failure * Returns INVALID_POLICY if policy can not be set. *****************************************************************************/ int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr) { int retCode = 0; ThreadPoolAttr temp; int i = 0; if (!tp) { return EINVAL; } ithread_mutex_lock(&tp->mutex); if (attr) { temp = *attr; } else { TPAttrInit(&temp); } if (SetPolicyType(temp.schedPolicy) != 0) { ithread_mutex_unlock(&tp->mutex); return INVALID_POLICY; } tp->attr = temp; /* add threads */ if (tp->totalThreads < tp->attr.minThreads) { for (i = tp->totalThreads; i < tp->attr.minThreads; i++) { retCode = CreateWorker(tp); if (retCode != 0) { break; } } } /* signal changes */ ithread_cond_signal(&tp->condition); ithread_mutex_unlock(&tp->mutex); if (retCode != 0) { /* clean up if the min threads could not be created */ ThreadPoolShutdown(tp); } return retCode; } /**************************************************************************** * Function: ThreadPoolShutdown * * Description: * Shuts the thread pool down. * Waits for all threads to finish. * May block indefinitely if jobs do not * exit. * Parameters: * tp - must be valid tp * Returns: * 0 on success, nonzero on failure * Always returns 0. *****************************************************************************/ int ThreadPoolShutdown(ThreadPool *tp) { ListNode *head = NULL; ThreadPoolJob *temp = NULL; if (!tp) { return EINVAL; } ithread_mutex_lock(&tp->mutex); /* clean up high priority jobs */ while (tp->highJobQ.size) { head = ListHead(&tp->highJobQ); temp = (ThreadPoolJob *)head->item; if (temp->free_func) { temp->free_func(temp->arg); } FreeThreadPoolJob(tp, temp); ListDelNode(&tp->highJobQ, head, 0); } ListDestroy(&tp->highJobQ, 0); /* clean up med priority jobs */ while (tp->medJobQ.size) { head = ListHead(&tp->medJobQ); temp = (ThreadPoolJob *)head->item; if (temp->free_func) { temp->free_func(temp->arg); } FreeThreadPoolJob(tp, temp); ListDelNode(&tp->medJobQ, head, 0); } ListDestroy(&tp->medJobQ, 0); /* clean up low priority jobs */ while (tp->lowJobQ.size) { head = ListHead(&tp->lowJobQ); temp = (ThreadPoolJob *)head->item; if (temp->free_func) { temp->free_func(temp->arg); } FreeThreadPoolJob(tp, temp); ListDelNode(&tp->lowJobQ, head, 0); } ListDestroy(&tp->lowJobQ, 0); /* clean up long term job */ if (tp->persistentJob) { temp = tp->persistentJob; if (temp->free_func) { temp->free_func(temp->arg); } FreeThreadPoolJob(tp, temp); tp->persistentJob = NULL; } /* signal shutdown */ tp->shutdown = 1; ithread_cond_broadcast(&tp->condition); /* wait for all threads to finish */ while (tp->totalThreads > 0) { ithread_cond_wait(&tp->start_and_shutdown, &tp->mutex); } /* destroy condition */ while (ithread_cond_destroy(&tp->condition) != 0) { /**/ } while (ithread_cond_destroy(&tp->start_and_shutdown) != 0) { /**/ } FreeListDestroy(&tp->jobFreeList); ithread_mutex_unlock(&tp->mutex); /* destroy mutex */ while (ithread_mutex_destroy(&tp->mutex) != 0) { /**/ } return 0; } /**************************************************************************** * Function: TPAttrInit * * Description: * Initializes thread pool attributes. * Sets values to defaults defined in ThreadPool.h. * Parameters: * attr - must be valid thread pool attributes. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrInit(ThreadPoolAttr *attr) { if (!attr) { return EINVAL; } attr->jobsPerThread = DEFAULT_JOBS_PER_THREAD; attr->maxIdleTime = DEFAULT_IDLE_TIME; attr->maxThreads = DEFAULT_MAX_THREADS; attr->minThreads = DEFAULT_MIN_THREADS; attr->schedPolicy = DEFAULT_POLICY; attr->starvationTime = DEFAULT_STARVATION_TIME; attr->maxJobsTotal = DEFAULT_MAX_JOBS_TOTAL; return 0; } /**************************************************************************** * Function: TPJobInit * * Description: * Initializes thread pool job. * Sets the priority to default defined in ThreadPool.h. * Sets the free_routine to default defined in ThreadPool.h * Parameters: * ThreadPoolJob *job - must be valid thread pool attributes. * start_routine func - function to run, must be valid * void * arg - argument to pass to function. * Returns: * Always returns 0. *****************************************************************************/ int TPJobInit(ThreadPoolJob *job, start_routine func, void *arg) { if (!job || !func) { return EINVAL; } job->func = func; job->arg = arg; job->priority = DEFAULT_PRIORITY; job->free_func = DEFAULT_FREE_ROUTINE; return 0; } /**************************************************************************** * Function: TPJobSetPriority * * Description: * Sets the max threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * maxThreads - value to set * Returns: * Returns 0 on success nonzero on failure. * Returns EINVAL if invalid priority. *****************************************************************************/ int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority) { if (!job) { return EINVAL; } if (priority == LOW_PRIORITY || priority == MED_PRIORITY || priority == HIGH_PRIORITY) { job->priority = priority; return 0; } else { return EINVAL; } } /**************************************************************************** * Function: TPJobSetFreeFunction * * Description: * Sets the max threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * maxThreads - value to set * Returns: * Always returns 0. *****************************************************************************/ int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func) { if(!job) { return EINVAL; } job->free_func = func; return 0; } /**************************************************************************** * Function: TPAttrSetMaxThreads * * Description: * Sets the max threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * maxThreads - value to set * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads) { if (!attr) { return EINVAL; } attr->maxThreads = maxThreads; return 0; } /**************************************************************************** * Function: TPAttrSetMinThreads * * Description: * Sets the min threads for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * minThreads - value to set * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetMinThreads(ThreadPoolAttr *attr, int minThreads) { if (!attr) { return EINVAL; } attr->minThreads = minThreads; return 0; } /**************************************************************************** * Function: TPAttrSetIdleTime * * Description: * Sets the idle time for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime) { if (!attr) { return EINVAL; } attr->maxIdleTime = idleTime; return 0; } /**************************************************************************** * Function: TPAttrSetJobsPerThread * * Description: * Sets the max thre * Parameters: * attr - must be valid thread pool attributes. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread) { if (!attr) { return EINVAL; } attr->jobsPerThread = jobsPerThread; return 0; } /**************************************************************************** * Function: TPAttrSetStarvationTime * * Description: * Sets the starvation time for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime) { if (!attr) { return EINVAL; } attr->starvationTime = starvationTime; return 0; } /**************************************************************************** * Function: TPAttrSetSchedPolicy * * Description: * Sets the scheduling policy for the thread pool attributes. * Parameters: * attr - must be valid thread pool attributes. * PolicyType schedPolicy - must be a valid policy type. * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy) { if (!attr) { return EINVAL; } attr->schedPolicy = schedPolicy; return 0; } /**************************************************************************** * Function: TPAttrSetMaxJobsTotal * * Description: * Sets the maximum number jobs that can be qeued totally. * Parameters: * attr - must be valid thread pool attributes. * maxJobsTotal - maximum number of jobs * Returns: * Always returns 0. *****************************************************************************/ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal) { if (!attr) { return EINVAL; } attr->maxJobsTotal = maxJobsTotal; return 0; } #ifdef STATS void ThreadPoolPrintStats(ThreadPoolStats *stats) { if (!stats) { return; } /* some OSses time_t length may depending on platform, promote it to long for safety */ printf("ThreadPoolStats at Time: %ld\n", (long)StatsTime(NULL)); printf("High Jobs pending: %d\n", stats->currentJobsHQ); printf("Med Jobs Pending: %d\n", stats->currentJobsMQ); printf("Low Jobs Pending: %d\n", stats->currentJobsLQ); printf("Average Wait in High Priority Q in milliseconds: %f\n", stats->avgWaitHQ); printf("Average Wait in Med Priority Q in milliseconds: %f\n", stats->avgWaitMQ); printf("Averate Wait in Low Priority Q in milliseconds: %f\n", stats->avgWaitLQ); printf("Max Threads Active: %d\n", stats->maxThreads); printf("Current Worker Threads: %d\n", stats->workerThreads); printf("Current Persistent Threads: %d\n", stats->persistentThreads); printf("Current Idle Threads: %d\n", stats->idleThreads); printf("Total Threads : %d\n", stats->totalThreads); printf("Total Time spent Working in seconds: %f\n", stats->totalWorkTime); printf("Total Time spent Idle in seconds : %f\n", stats->totalIdleTime); } #endif /* STATS */ /**************************************************************************** * Function: ThreadPoolGetStats * * Description: * Returns various statistics about the * thread pool. * Only valid if STATS has been defined. * Parameters: * ThreadPool *tp - valid initialized threadpool * ThreadPoolStats *stats - valid stats, out parameter * Returns: * Always returns 0. *****************************************************************************/ #ifdef STATS int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats) { if (tp == NULL || stats == NULL) { return EINVAL; } /* if not shutdown then acquire mutex */ if (!tp->shutdown) { ithread_mutex_lock(&tp->mutex); } *stats = tp->stats; if (stats->totalJobsHQ > 0) { stats->avgWaitHQ = stats->totalTimeHQ / stats->totalJobsHQ; } else { stats->avgWaitHQ = 0; } if (stats->totalJobsMQ > 0) { stats->avgWaitMQ = stats->totalTimeMQ / stats->totalJobsMQ; } else { stats->avgWaitMQ = 0; } if (stats->totalJobsLQ > 0) { stats->avgWaitLQ = stats->totalTimeLQ / stats->totalJobsLQ; } else { stats->avgWaitLQ = 0; } stats->totalThreads = tp->totalThreads; stats->persistentThreads = tp->persistentThreads; stats->currentJobsHQ = ListSize( &tp->highJobQ ); stats->currentJobsLQ = ListSize( &tp->lowJobQ ); stats->currentJobsMQ = ListSize( &tp->medJobQ ); /* if not shutdown then release mutex */ if (!tp->shutdown) { ithread_mutex_unlock(&tp->mutex); } return 0; } #endif /* STATS */ #ifdef WIN32 #if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 #else #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL #endif int gettimeofday(struct timeval *tv, struct timezone *tz) { FILETIME ft; unsigned __int64 tmpres = 0; static int tzflag; if (tv) { GetSystemTimeAsFileTime(&ft); tmpres |= ft.dwHighDateTime; tmpres <<= 32; tmpres |= ft.dwLowDateTime; /*converting file time to unix epoch*/ tmpres /= 10; /*convert into microseconds*/ tmpres -= DELTA_EPOCH_IN_MICROSECS; tv->tv_sec = (long)(tmpres / 1000000UL); tv->tv_usec = (long)(tmpres % 1000000UL); } if (tz) { if (!tzflag) { _tzset(); tzflag++; } tz->tz_minuteswest = _timezone / 60; tz->tz_dsttime = _daylight; } return 0; } #endif /* WIN32 */ libupnp-1.8.0~svn20100507/threadutil/src/LinkedList.c0000644000175000017500000003527711021325544017033 00000000000000/************************************************************************** * * Copyright (c) 2000-2003 Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither name of Intel Corporation nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * **************************************************************************/ #include "LinkedList.h" #ifdef WIN32 /* Do not #include */ #else #include #endif #if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__) #include #else #include #endif #include static int freeListNode( ListNode * node, LinkedList * list ) { assert( list != NULL ); return FreeListFree( &list->freeNodeList, node ); } /**************************************************************************** * Function: CreateListNode * * Description: * Creates a list node. Dynamically. * * Parameters: * void * item - the item to store * Returns: * The new node, NULL on failure. *****************************************************************************/ static ListNode * CreateListNode( void *item, LinkedList * list ) { ListNode *temp = NULL; assert( list != NULL ); temp = ( ListNode * ) FreeListAlloc( &list->freeNodeList ); if( temp ) { temp->prev = NULL; temp->next = NULL; temp->item = item; } return temp; } /**************************************************************************** * Function: ListInit * * Description: * Initializes LinkedList. Must be called first. * And only once for List. * Parameters: * list - must be valid, non null, pointer to a linked list. * cmp_func - function used to compare items. (May be NULL) * free_func - function used to free items. (May be NULL) * Returns: * 0 on success, EOUTOFMEM on failure. *****************************************************************************/ int ListInit( LinkedList * list, cmp_routine cmp_func, free_function free_func ) { int retCode = 0; assert( list != NULL ); if( list == NULL ) return EINVAL; list->size = 0; list->cmp_func = cmp_func; list->free_func = free_func; retCode = FreeListInit( &list->freeNodeList, sizeof( ListNode ), FREELISTSIZE ); assert( retCode == 0 ); list->head.item = NULL; list->head.next = &list->tail; list->head.prev = NULL; list->tail.item = NULL; list->tail.prev = &list->head; list->tail.next = NULL; return 0; } /**************************************************************************** * Function: ListAddHead * * Description: * Adds a node to the head of the list. * Node gets immediately after list.head. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListAddHead( LinkedList * list, void *item ) { assert( list != NULL ); if( list == NULL ) return NULL; return ListAddAfter( list, item, &list->head ); } /**************************************************************************** * Function: ListAddTail * * Description: * Adds a node to the tail of the list. * Node gets added immediately before list.tail. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListAddTail( LinkedList * list, void *item ) { assert( list != NULL ); if( list == NULL ) return NULL; return ListAddBefore( list, item, &list->tail ); } /**************************************************************************** * Function: ListAddAfter * * Description: * Adds a node after the specified node. * Node gets added immediately after bnode. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * void * item - item to be added * ListNode * bnode - node to add after * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListAddAfter( LinkedList * list, void *item, ListNode * bnode ) { ListNode *newNode = NULL; assert( list != NULL ); if( ( list == NULL ) || ( bnode == NULL ) ) return NULL; newNode = CreateListNode( item, list ); if( newNode ) { ListNode *temp = bnode->next; bnode->next = newNode; newNode->prev = bnode; newNode->next = temp; temp->prev = newNode; list->size++; return newNode; } return NULL; } /**************************************************************************** * Function: ListAddBefore * * Description: * Adds a node before the specified node. * Node gets added immediately before anode. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode * anode - node to add the in front of. * void * item - item to be added * Returns: * The pointer to the ListNode on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListAddBefore( LinkedList * list, void *item, ListNode * anode ) { ListNode *newNode = NULL; assert( list != NULL ); if( ( list == NULL ) || ( anode == NULL ) ) return NULL; newNode = CreateListNode( item, list ); if( newNode ) { ListNode *temp = anode->prev; anode->prev = newNode; newNode->next = anode; newNode->prev = temp; temp->next = newNode; list->size++; return newNode; } return NULL; } /**************************************************************************** * Function: ListDelNode * * Description: * Removes a node from the list * The memory for the node is freed but the * the memory for the items are not. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode *dnode - done to delete. * Returns: * The pointer to the item stored in node on success, NULL on failure. * Precondition: * The list has been initialized. *****************************************************************************/ void * ListDelNode( LinkedList * list, ListNode * dnode, int freeItem ) { void *temp; assert( list != NULL ); assert( dnode != &list->head ); assert( dnode != &list->tail ); if( ( list == NULL ) || ( dnode == &list->head ) || ( dnode == &list->tail ) || ( dnode == NULL ) ) { return NULL; } temp = dnode->item; dnode->prev->next = dnode->next; dnode->next->prev = dnode->prev; freeListNode( dnode, list ); list->size--; if( freeItem && list->free_func ) { list->free_func( temp ); temp = NULL; } return temp; } /**************************************************************************** * Function: ListDestroy * * Description: * Removes all memory associated with list nodes. * Does not free LinkedList *list. * Items stored in the list are not freed, only nodes are. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. * Precondition: * The list has been initialized. *****************************************************************************/ int ListDestroy( LinkedList * list, int freeItem ) { ListNode *dnode = NULL; ListNode *temp = NULL; if( list == NULL ) return EINVAL; for( dnode = list->head.next; dnode != &list->tail; ) { temp = dnode->next; ListDelNode( list, dnode, freeItem ); dnode = temp; } list->size = 0; FreeListDestroy( &list->freeNodeList ); return 0; } /**************************************************************************** * Function: ListHead * * Description: * Returns the head of the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The head of the list. NULL if list is empty. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListHead( LinkedList * list ) { assert( list != NULL ); if( list == NULL ) return NULL; if( list->size == 0 ) return NULL; else return list->head.next; } /**************************************************************************** * Function: ListTail * * Description: * Returns the tail of the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The tail of the list. NULL if list is empty. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListTail( LinkedList * list ) { assert( list != NULL ); if( list == NULL ) return NULL; if( list->size == 0 ) return NULL; else return list->tail.prev; } /**************************************************************************** * Function: ListNext * * Description: * Returns the next item in the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The next item in the list. NULL if there are no more items in list. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListNext( LinkedList * list, ListNode * node ) { assert( list != NULL ); assert( node != NULL ); if( ( list == NULL ) || ( node == NULL ) ) return NULL; if( node->next == &list->tail ) return NULL; else return node->next; } /**************************************************************************** * Function: ListPrev * * Description: * Returns the previous item in the list. * * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * * Returns: * The previous item in the list. NULL if there are no more items in list. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListPrev( LinkedList * list, ListNode * node ) { assert( list != NULL ); assert( node != NULL ); if( ( list == NULL ) || ( node == NULL ) ) return NULL; if( node->prev == &list->head ) return NULL; else return node->prev; } /**************************************************************************** * Function: ListFind * * Description: * Finds the specified item in the list. * Uses the compare function specified in ListInit. If compare function * is NULL then compares items as pointers. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * ListNode *start - the node to start from, NULL if to start from * beginning. * void * item - the item to search for. * Returns: * The node containing the item. NULL if no node contains the item. * Precondition: * The list has been initialized. *****************************************************************************/ ListNode * ListFind( LinkedList * list, ListNode * start, void *item ) { ListNode *finger = NULL; if( list == NULL ) return NULL; if( start == NULL ) start = &list->head; assert( start ); finger = start->next; assert( finger ); while( finger != &list->tail ) { if( list->cmp_func ) { if( list->cmp_func( item, finger->item ) ) return finger; } else { if( item == finger->item ) return finger; } finger = finger->next; } return NULL; } /**************************************************************************** * Function: ListSize * * Description: * Returns the size of the list. * Parameters: * LinkedList *list - must be valid, non null, pointer to a linked list. * Returns: * The number of items in the list. * Precondition: * The list has been initialized. *****************************************************************************/ int ListSize( LinkedList * list ) { assert( list != NULL ); if( list == NULL ) return EINVAL; return list->size; } libupnp-1.8.0~svn20100507/threadutil/src/FreeList.c0000644000175000017500000001306711021325544016477 00000000000000/////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2003 Intel Corporation // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither name of Intel Corporation nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /////////////////////////////////////////////////////////////////////////// #include "FreeList.h" #include #include /**************************************************************************** * Function: FreeListInit * * Description: * Initializes Free List. Must be called first. * And only once for FreeList. * Parameters: * free_list - must be valid, non null, pointer to a linked list. * size_t - size of elements to store in free list * maxFreeListSize - max size that the free list can grow to * before returning memory to O.S. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. *****************************************************************************/ int FreeListInit( FreeList * free_list, size_t elementSize, int maxFreeListLength ) { assert( free_list != NULL ); if( free_list == NULL ) return EINVAL; free_list->element_size = elementSize; free_list->maxFreeListLength = maxFreeListLength; free_list->head = NULL; free_list->freeListLength = 0; return 0; } /**************************************************************************** * Function: FreeListAlloc * * Description: * Allocates chunk of set size. * If a free item is available in the list, returnes the stored item. * Otherwise calls the O.S. to allocate memory. * Parameters: * free_list - must be valid, non null, pointer to a linked list. * Returns: * Non NULL on success. NULL on failure. *****************************************************************************/ void * FreeListAlloc( FreeList * free_list ) { FreeListNode *ret = NULL; assert( free_list != NULL ); if( free_list == NULL ) return NULL; if( free_list->head ) { ret = free_list->head; free_list->head = free_list->head->next; free_list->freeListLength--; } else { ret = malloc( free_list->element_size ); } return ret; } /**************************************************************************** * Function: FreeListFree * * Description: * Returns an item to the Free List. * If the free list is smaller than the max size than * adds the item to the free list. * Otherwise returns the item to the O.S. * Parameters: * free_list - must be valid, non null, pointer to a free list. * element - must be a pointer allocated by FreeListAlloc * Returns: * 0 on success. Nonzero on failure. * Always returns 0. *****************************************************************************/ int FreeListFree( FreeList * free_list, void *element ) { FreeListNode *temp = NULL; assert( free_list != NULL ); if( free_list == NULL ) return EINVAL; if( ( element != NULL ) && ( ( free_list->freeListLength + 1 ) < free_list->maxFreeListLength ) ) { free_list->freeListLength++; temp = ( FreeListNode * ) element; temp->next = free_list->head; free_list->head = temp; } else { free( element ); } return 0; } /**************************************************************************** * Function: FreeListDestroy * * Description: * Releases the resources stored with the free list. * Parameters: * free_list - must be valid, non null, pointer to a linked list. * Returns: * 0 on success. Nonzero on failure. * Always returns 0. *****************************************************************************/ int FreeListDestroy( FreeList * free_list ) { FreeListNode *temp = NULL; int i = 0; assert( free_list != NULL ); if( free_list == NULL ) return EINVAL; while( free_list->head ) { i++; temp = free_list->head->next; free( free_list->head ); free_list->head = temp; } free_list->freeListLength = 0; return 0; } libupnp-1.8.0~svn20100507/threadutil/Makefile.am0000644000175000017500000000126211021325544016055 00000000000000# $Id: Makefile.am,v 1.2 2006/02/27 21:38:56 r3mi Exp $ # # "Makefile.am" for "libupnp/threadutil" # # (C) Copyright 2005 Rémi Turboult # AM_CPPFLAGS = -I$(srcdir)/inc -I$(srcdir)/src/inc if ENABLE_DEBUG AM_CPPFLAGS += -DDEBUG -DSTATS else AM_CPPFLAGS += -DNO_DEBUG -DNDEBUG endif lib_LTLIBRARIES = libthreadutil.la libthreadutil_la_LDFLAGS = -version-info $(LT_VERSION_THREADUTIL) libthreadutil_la_SOURCES = \ src/FreeList.c src/LinkedList.c \ src/ThreadPool.c src/TimerThread.c upnpincludedir = $(includedir)/upnp upnpinclude_HEADERS = \ inc/FreeList.h inc/LinkedList.h \ inc/ThreadPool.h inc/TimerThread.h \ inc/ithread.h libupnp-1.8.0~svn20100507/threadutil/Makefile.in0000644000175000017500000004341411360640114016072 00000000000000# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 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@ # $Id: Makefile.am,v 1.2 2006/02/27 21:38:56 r3mi Exp $ # # "Makefile.am" for "libupnp/threadutil" # # (C) Copyright 2005 Rémi Turboult # VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@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@ @ENABLE_DEBUG_TRUE@am__append_1 = -DDEBUG -DSTATS @ENABLE_DEBUG_FALSE@am__append_2 = -DNO_DEBUG -DNDEBUG subdir = threadutil DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(upnpinclude_HEADERS) ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/m4/ax_cflags_gcc_option.m4 \ $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ $(top_srcdir)/m4/rt_bool_arg_enable.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/autoconfig.h \ $(top_builddir)/upnp/inc/upnpconfig.h CONFIG_CLEAN_FILES = 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 = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(upnpincludedir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) libthreadutil_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libthreadutil_la_OBJECTS = src/FreeList.lo src/LinkedList.lo \ src/ThreadPool.lo src/TimerThread.lo libthreadutil_la_OBJECTS = $(am_libthreadutil_la_OBJECTS) libthreadutil_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libthreadutil_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/upnp/inc depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libthreadutil_la_SOURCES) DIST_SOURCES = $(libthreadutil_la_SOURCES) upnpincludeHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(upnpinclude_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_IXML = @LT_VERSION_IXML@ LT_VERSION_THREADUTIL = @LT_VERSION_THREADUTIL@ LT_VERSION_UPNP = @LT_VERSION_UPNP@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NMEDIT = @NMEDIT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ acx_pthread_config = @acx_pthread_config@ 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_builddir = @top_builddir@ top_srcdir = @top_srcdir@ AM_CPPFLAGS = -I$(srcdir)/inc -I$(srcdir)/src/inc $(am__append_1) \ $(am__append_2) lib_LTLIBRARIES = libthreadutil.la libthreadutil_la_LDFLAGS = -version-info $(LT_VERSION_THREADUTIL) libthreadutil_la_SOURCES = \ src/FreeList.c src/LinkedList.c \ src/ThreadPool.c src/TimerThread.c upnpincludedir = $(includedir)/upnp upnpinclude_HEADERS = \ inc/FreeList.h inc/LinkedList.h \ inc/ThreadPool.h inc/TimerThread.h \ inc/ithread.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign threadutil/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign threadutil/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 install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/FreeList.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/LinkedList.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/ThreadPool.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) src/TimerThread.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) libthreadutil.la: $(libthreadutil_la_OBJECTS) $(libthreadutil_la_DEPENDENCIES) $(libthreadutil_la_LINK) -rpath $(libdir) $(libthreadutil_la_OBJECTS) $(libthreadutil_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/FreeList.$(OBJEXT) -rm -f src/FreeList.lo -rm -f src/LinkedList.$(OBJEXT) -rm -f src/LinkedList.lo -rm -f src/ThreadPool.$(OBJEXT) -rm -f src/ThreadPool.lo -rm -f src/TimerThread.$(OBJEXT) -rm -f src/TimerThread.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/FreeList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/LinkedList.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ThreadPool.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/TimerThread.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ mv -f $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf src/.libs src/_libs install-upnpincludeHEADERS: $(upnpinclude_HEADERS) @$(NORMAL_INSTALL) test -z "$(upnpincludedir)" || $(MKDIR_P) "$(DESTDIR)$(upnpincludedir)" @list='$(upnpinclude_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(upnpincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(upnpincludedir)/$$f'"; \ $(upnpincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(upnpincludedir)/$$f"; \ done uninstall-upnpincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(upnpinclude_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(upnpincludedir)/$$f'"; \ rm -f "$(DESTDIR)$(upnpincludedir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 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 $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$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 $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(upnpincludedir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) 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-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf src/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-upnpincludeHEADERS install-dvi: install-dvi-am install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf src/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-upnpincludeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip \ install-upnpincludeHEADERS installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-libLTLIBRARIES \ uninstall-upnpincludeHEADERS # 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: