Compare commits
1 Commits
release-1.
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce5ccd8edc |
105
.gitignore
vendored
105
.gitignore
vendored
@@ -1,105 +0,0 @@
|
||||
#
|
||||
# NOTE! Don't add files that are generated in specific
|
||||
# subdirectories here. Add them in the ".gitignore" file
|
||||
# in that subdirectory instead.
|
||||
#
|
||||
# NOTE! Please use 'git ls-files -i --exclude-standard'
|
||||
# command after changing this file, to see if there are
|
||||
# any tracked files which get ignored after the change.
|
||||
#
|
||||
# Normal rules
|
||||
#
|
||||
.*
|
||||
*.o
|
||||
*.o.*
|
||||
*.a
|
||||
*.s
|
||||
*.ko
|
||||
*.so
|
||||
*.so.dbg
|
||||
*.mod.c
|
||||
*.i
|
||||
*.lst
|
||||
*.symtypes
|
||||
*.order
|
||||
modules.builtin
|
||||
*.elf
|
||||
*.bin
|
||||
*.gz
|
||||
*.bz2
|
||||
*.lzma
|
||||
*.patch
|
||||
*.gcno
|
||||
|
||||
#
|
||||
# Top-level generic files
|
||||
#
|
||||
/tags
|
||||
/TAGS
|
||||
/linux
|
||||
/vmlinux
|
||||
/vmlinuz
|
||||
/System.map
|
||||
/Module.markers
|
||||
/Module.symvers
|
||||
|
||||
#
|
||||
# git files that we don't want to ignore even it they are dot-files
|
||||
#
|
||||
!.gitignore
|
||||
!.mailmap
|
||||
|
||||
#
|
||||
# Generated include files
|
||||
#
|
||||
include/config
|
||||
include/linux/version.h
|
||||
include/generated
|
||||
|
||||
# stgit generated dirs
|
||||
patches-*
|
||||
|
||||
# quilt's files
|
||||
patches
|
||||
series
|
||||
|
||||
# cscope files
|
||||
cscope.*
|
||||
ncscope.*
|
||||
|
||||
# gnu global files
|
||||
GPATH
|
||||
GRTAGS
|
||||
GSYMS
|
||||
GTAGS
|
||||
|
||||
*.orig
|
||||
*~
|
||||
\#*#
|
||||
*.lo
|
||||
*.la
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autoconfig.h
|
||||
autoconfig.h.in
|
||||
autom4te.cache/
|
||||
build-aux/
|
||||
config.log
|
||||
config.status
|
||||
configure
|
||||
libtool
|
||||
libupnp.pc
|
||||
m4/libtool.m4
|
||||
m4/ltoptions.m4
|
||||
m4/ltsugar.m4
|
||||
m4/ltversion.m4
|
||||
m4/lt~obsolete.m4
|
||||
stamp-h1
|
||||
upnp/inc/stamp-h2
|
||||
upnp/inc/upnpconfig.h
|
||||
upnp/sample/upnp_tv_combo
|
||||
upnp/sample/upnp_tv_ctrlpt
|
||||
upnp/sample/upnp_tv_device
|
||||
docs/doxygen
|
||||
|
||||
12
Doxyfile
12
Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = libUPnP
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER = 1.6.9
|
||||
PROJECT_NUMBER = 1.4.7
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
@@ -91,7 +91,7 @@ ABBREVIATE_BRIEF =
|
||||
# Doxygen will generate a detailed section even if there is only a brief
|
||||
# description.
|
||||
|
||||
ALWAYS_DETAILED_SEC = YES
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
|
||||
# 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
|
||||
@@ -290,7 +290,7 @@ HIDE_IN_BODY_DOCS = NO
|
||||
# to NO (the default) then the documentation will be excluded.
|
||||
# Set it to YES to include the internal documentation.
|
||||
|
||||
INTERNAL_DOCS = YES
|
||||
INTERNAL_DOCS = NO
|
||||
|
||||
# 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
|
||||
@@ -462,7 +462,7 @@ WARN_LOGFILE =
|
||||
# directories like "/usr/src/myproject". Separate the files or directories
|
||||
# with spaces.
|
||||
|
||||
INPUT = upnp ixml threadutil
|
||||
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
|
||||
@@ -995,7 +995,7 @@ ENABLE_PREPROCESSING = YES
|
||||
# compilation will be performed. Macro expansion can be done in a controlled
|
||||
# way by setting EXPAND_ONLY_PREDEF to YES.
|
||||
|
||||
MACRO_EXPANSION = YES
|
||||
MACRO_EXPANSION = NO
|
||||
|
||||
# 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
|
||||
@@ -1029,7 +1029,7 @@ INCLUDE_FILE_PATTERNS =
|
||||
# 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
|
||||
PREDEFINED =
|
||||
|
||||
# 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.
|
||||
|
||||
21
Makefile.am
21
Makefile.am
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# Top-level "Makefile.am" for libupnp
|
||||
#
|
||||
# Copyright (C) 2005 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
# Copyright (C) 2005 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
#
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
@@ -16,7 +16,6 @@ SUBDIRS = \
|
||||
|
||||
|
||||
EXTRA_DIST = \
|
||||
Doxyfile \
|
||||
libupnp.pc.in \
|
||||
LICENSE \
|
||||
THANKS \
|
||||
@@ -26,23 +25,9 @@ EXTRA_DIST = \
|
||||
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
|
||||
build/msvc/inttypes.h
|
||||
|
||||
|
||||
# This variable must have 'exec' in its name, in order to be installed
|
||||
|
||||
2
README
2
README
@@ -1,7 +1,7 @@
|
||||
Portable SDK for UPnP* Devices (libupnp)
|
||||
|
||||
Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved.
|
||||
Copyright (c) 2005-2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
Copyright (c) 2005-2006 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
Copyright (c) 2006 Michel Pfeiffer and others <virtual_worlds@gmx.de>
|
||||
|
||||
See LICENSE for details.
|
||||
|
||||
9
THANKS
9
THANKS
@@ -8,19 +8,13 @@ exempt of errors.
|
||||
|
||||
- Alex (afaucher)
|
||||
- Andre Sodermans (wienerschnitzel)
|
||||
- Anthony Viallard (homer242)
|
||||
- Apostolos Syropoulos
|
||||
- Arno Willig
|
||||
- Bob Ciora
|
||||
- Carlo Parata
|
||||
- Carl Benson
|
||||
- Chandra (inactiveneurons)
|
||||
- Chaos
|
||||
- Charles Nepveu (cnepveu)
|
||||
- Chris Pickel
|
||||
- Chuck Thomason (cyt4)
|
||||
- Craig Nelson
|
||||
- David Blanchet
|
||||
- David Maass
|
||||
- Emil Ljungdahl
|
||||
- Erik Johansson
|
||||
@@ -43,15 +37,12 @@ exempt of errors.
|
||||
- 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)
|
||||
- Ronan Menard
|
||||
- Siva Chandran
|
||||
- Stéphane Corthésy
|
||||
- Steve Bresson
|
||||
|
||||
23
TODO
23
TODO
@@ -2,5 +2,28 @@
|
||||
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
|
||||
|
||||
|
||||
To Be Decided
|
||||
=============
|
||||
|
||||
- IPV6 support ?
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -67,6 +67,9 @@
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/timeb.h> header file. */
|
||||
#define HAVE_SYS_TIMEB_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
@@ -79,13 +82,6 @@
|
||||
/* Define to 1 if you have the `vprintf' function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the <ws2tcpip.h> header file. */
|
||||
/* #undef HAVE_WS2TCPIP_H */
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Define to 1 to prevent compilation of assert() */
|
||||
#define NDEBUG 1
|
||||
|
||||
@@ -105,13 +101,13 @@
|
||||
#define PACKAGE_NAME "libupnp"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "libupnp 1.6.9"
|
||||
#define PACKAGE_STRING "libupnp 1.4.7"
|
||||
|
||||
/* 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.6.9"
|
||||
#define PACKAGE_VERSION "1.4.7"
|
||||
|
||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
||||
your system. */
|
||||
@@ -120,12 +116,6 @@
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* see upnpconfig.h */
|
||||
/* #undef UPNP_ENABLE_IPV6 */
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_ENABLE_NOTIFICATION_REORDERING 1
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_HAVE_CLIENT 1
|
||||
|
||||
@@ -141,23 +131,20 @@
|
||||
/* 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 6
|
||||
#define UPNP_VERSION_MINOR 4
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_PATCH 9
|
||||
#define UPNP_VERSION_PATCH 7
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_STRING "1.6.9"
|
||||
#define UPNP_VERSION_STRING "1.4.7"
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "1.6.9"
|
||||
#define VERSION "1.4.7"
|
||||
|
||||
/* File Offset size */
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
@@ -166,7 +153,7 @@
|
||||
/* #undef _LARGEFILE_SOURCE */
|
||||
|
||||
/* Large files support */
|
||||
#define _LARGE_FILE_SOURCE /**/
|
||||
#define _LARGE_FILE_SOURCE
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
@@ -177,5 +164,5 @@
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
||||
|
||||
/* Type for storing the length of struct sockaddr */
|
||||
/* Substitute for socklen_t */
|
||||
/* #undef socklen_t */
|
||||
|
||||
343
build/inc/config.h
Normal file
343
build/inc/config.h
Normal file
@@ -0,0 +1,343 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <upnp/inc/upnpdebug.h>
|
||||
*/
|
||||
|
||||
#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
|
||||
# define CLIENTONLY(x)
|
||||
#endif
|
||||
|
||||
//@}
|
||||
#endif
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
/* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in by configure. */
|
||||
/* -*- C -*- */
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
// -*- C -*-
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2006 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
// 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
|
||||
@@ -40,20 +40,20 @@
|
||||
***************************************************************************/
|
||||
|
||||
/** The library version (string) e.g. "1.3.0" */
|
||||
#define UPNP_VERSION_STRING "1.6.9"
|
||||
#define UPNP_VERSION_STRING "1.4.7"
|
||||
|
||||
/** Major version of the library */
|
||||
#define UPNP_VERSION_MAJOR 1
|
||||
|
||||
/** Minor version of the library */
|
||||
#define UPNP_VERSION_MINOR 6
|
||||
#define UPNP_VERSION_MINOR 4
|
||||
|
||||
/** Patch version of the library */
|
||||
#define UPNP_VERSION_PATCH 9
|
||||
#define UPNP_VERSION_PATCH 7
|
||||
|
||||
/** 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)
|
||||
((UPNP_VERSION_MAJOR*100 + UPNP_VERSION_MINOR)*100 + UPNP_VERSION_PATCH)
|
||||
|
||||
|
||||
|
||||
@@ -91,9 +91,7 @@
|
||||
* (i.e. configure --enable-tools) : <upnp/upnptools.h> file is available */
|
||||
#define UPNP_HAVE_TOOLS 1
|
||||
|
||||
/** Defined to 1 if the library has been compiled with ipv6 support
|
||||
* (i.e. configure --enable-ipv6) */
|
||||
/* #undef UPNP_ENABLE_IPV6 */
|
||||
|
||||
#endif /* UPNP_CONFIG_H */
|
||||
#endif // UPNP_CONFIG_H
|
||||
|
||||
|
||||
|
||||
@@ -5,17 +5,17 @@
|
||||
# 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 Dies ist kein g<EFBFBD>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<EFBFBD>hren Sie den Befehl
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "libupnp.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE Sie können beim Ausf?hren von NMAKE eine Konfiguration angeben
|
||||
!MESSAGE Sie k<EFBFBD>nnen beim Ausf<EFBFBD>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 F<EFBFBD>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")
|
||||
@@ -389,6 +389,10 @@ 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
|
||||
|
||||
@@ -39,15 +39,14 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc;..\inc;..\..\upnp\inc"
|
||||
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc"
|
||||
PreprocessorDefinitions="WIN32;DEBUG"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
RuntimeLibrary="3"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
@@ -79,10 +78,9 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
@@ -103,13 +101,10 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc;..\inc"
|
||||
PreprocessorDefinitions="WIN32;IXML_INLINE="
|
||||
RuntimeLibrary="0"
|
||||
RuntimeLibrary="2"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="true"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
@@ -121,11 +116,18 @@
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
Name="VCLinkerTool"
|
||||
GenerateDebugInformation="true"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
@@ -135,6 +137,12 @@
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
@@ -164,10 +172,6 @@
|
||||
RelativePath="..\..\ixml\src\ixml.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\ixmldebug.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\ixmlmembuf.c"
|
||||
>
|
||||
@@ -198,10 +202,6 @@
|
||||
RelativePath="..\..\ixml\inc\ixml.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\inc\ixmldebug.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\inc\ixmlmembuf.h"
|
||||
>
|
||||
@@ -211,6 +211,12 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||
>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
Version="8.00"
|
||||
Name="libupnp"
|
||||
ProjectGUID="{6227F51A-1498-4C4A-B213-F6FDED605125}"
|
||||
RootNamespace="libupnp"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
@@ -16,8 +15,8 @@
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc8.$(ConfigurationName)\$(ProjectName)"
|
||||
OutputDirectory=".\Release"
|
||||
IntermediateDirectory=".\Release"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
@@ -49,19 +48,18 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\pthreads\include;..\..\ixml\src\inc;..\..\ixml\inc;..\..\threadutil\inc;..\..\upnp\inc;..\..\upnp\src\inc;..\inc;..\msvc"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
AdditionalIncludeDirectories="..\..\pthreads\include,..\ixml\src\inc,..\ixml\inc,..\threadutil\inc,..\upnp\inc,..\upnp\src\inc,.\inc"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
PrecompiledHeaderFile=".\Release/libupnp.pch"
|
||||
AssemblerListingLocation="$(OutDir)\"
|
||||
ObjectFile="$(OutDir)\"
|
||||
ProgramDataBaseFileName="$(OutDir)\"
|
||||
AssemblerListingLocation=".\Release/"
|
||||
ObjectFile=".\Release/"
|
||||
ProgramDataBaseFileName=".\Release/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="true"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
@@ -76,8 +74,8 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib iphlpapi.lib"
|
||||
OutputFile="$(OutDir)\libupnp.dll"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
|
||||
OutputFile=".\Release/libupnp.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
ProgramDatabaseFile=".\Release/libupnp.pdb"
|
||||
@@ -146,7 +144,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\pthreads\include;..\..\ixml\src\inc;..\..\ixml\inc;..\..\threadutil\inc;..\..\upnp\inc;..\..\upnp\src\inc;..\inc;..\msvc"
|
||||
PreprocessorDefinitions="DEBUG;WIN32;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
PreprocessorDefinitions="DEBUG;WIN32;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
@@ -158,7 +156,6 @@
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="true"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
@@ -173,11 +170,10 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib iphlpapi.lib ixml.lib"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
|
||||
OutputFile="$(OutDir)\libupnp.dll"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="true"
|
||||
AdditionalLibraryDirectories="$(OutDir)\..\ixml"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile="$(OutDir)\libupnp.pdb"
|
||||
ImportLibrary="$(OutDir)\libupnp.lib"
|
||||
@@ -218,14 +214,6 @@
|
||||
Name="sources"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\ActionComplete.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\ActionRequest.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\attr.c"
|
||||
>
|
||||
@@ -234,10 +222,6 @@
|
||||
RelativePath="..\..\upnp\src\genlib\client_table\client_table.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\Discovery.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\document.c"
|
||||
>
|
||||
@@ -246,18 +230,6 @@
|
||||
RelativePath="..\..\ixml\src\element.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\Event.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\EventSubscribe.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\FileInfo.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\threadutil\src\FreeList.c"
|
||||
>
|
||||
@@ -358,10 +330,6 @@
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_device.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_ResultData.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_server.c"
|
||||
>
|
||||
@@ -370,22 +338,10 @@
|
||||
RelativePath="..\..\upnp\src\genlib\net\http\statcodes.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\StateVarComplete.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\StateVarRequest.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\genlib\util\strintmap.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\SubscriptionRequest.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\uuid\sysdep.c"
|
||||
>
|
||||
@@ -410,10 +366,6 @@
|
||||
RelativePath="..\..\upnp\src\api\upnpdebug.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\UpnpString.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\upnptools.c"
|
||||
>
|
||||
@@ -447,14 +399,6 @@
|
||||
Name="headers"
|
||||
Filter="h;hpp;hxx;hm;inl"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\ActionComplete.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\actionrequest.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\client_table.h"
|
||||
>
|
||||
@@ -463,22 +407,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\config.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\discovery.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\Event.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\EventSubscribe.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\FileInfo.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\gena.h"
|
||||
>
|
||||
@@ -551,10 +479,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\sock.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_ResultData.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\ssdplib.h"
|
||||
>
|
||||
@@ -563,14 +487,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\statcodes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\StateVarComplete.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\statevarrequest.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\statuscodes.h"
|
||||
>
|
||||
@@ -579,10 +495,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\strintmap.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\SubscriptionRequest.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\sysdep.h"
|
||||
>
|
||||
@@ -591,10 +503,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\unixutil.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnp.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\upnp_timeout.h"
|
||||
>
|
||||
@@ -603,18 +511,14 @@
|
||||
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\UpnpString.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnptools.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\uri.h"
|
||||
>
|
||||
@@ -640,6 +544,11 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="resources"
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\..\..\..\libupnp_win32.patch"
|
||||
>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@@ -40,8 +40,8 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc;..\inc;..\..\upnp\inc"
|
||||
PreprocessorDefinitions="DEBUG;WIN32;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc"
|
||||
PreprocessorDefinitions="DEBUG;WIN32"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
@@ -78,10 +78,10 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="0"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
@@ -103,8 +103,6 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\ixml\inc;..\..\ixml\src\inc;..\inc"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
WarningLevel="3"
|
||||
@@ -120,11 +118,18 @@
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
Name="VCLinkerTool"
|
||||
GenerateDebugInformation="true"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManifestTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
@@ -134,6 +139,9 @@
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCAppVerifierTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
@@ -163,10 +171,6 @@
|
||||
RelativePath="..\..\ixml\src\ixml.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\ixmldebug.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\ixmlmembuf.c"
|
||||
>
|
||||
@@ -197,10 +201,6 @@
|
||||
RelativePath="..\..\ixml\inc\ixml.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\inc\ixmldebug.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\inc\ixmlmembuf.h"
|
||||
>
|
||||
@@ -210,6 +210,12 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||
>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
|
||||
@@ -1,29 +1,35 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||
# Visual Studio 2008
|
||||
# Visual C++ Express 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}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
|
||||
{9C2C266D-35A3-465F-A297-0E21D54E5C89} = {9C2C266D-35A3-465F-A297-0E21D54E5C89}
|
||||
EndProjectSection
|
||||
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}
|
||||
{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}") = "tvdevice", "tvdevice.vcproj", "{7FB5F4A6-74F9-471D-B358-BAA0AC1CCA0A}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
|
||||
{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}") = "tvcombo", "tvcombo.vcproj", "{6365804B-22C6-4D5E-91F3-0C052EB55B4F}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{6227F51A-1498-4C4A-B213-F6FDED605125} = {6227F51A-1498-4C4A-B213-F6FDED605125}
|
||||
{9C2C266D-35A3-465F-A297-0E21D54E5C89} = {9C2C266D-35A3-465F-A297-0E21D54E5C89}
|
||||
{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D} = {1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9,00"
|
||||
Version="9.00"
|
||||
Name="libupnp"
|
||||
ProjectGUID="{6227F51A-1498-4C4A-B213-F6FDED605125}"
|
||||
RootNamespace="libupnp"
|
||||
TargetFrameworkVersion="131072"
|
||||
>
|
||||
<Platforms>
|
||||
@@ -17,13 +16,13 @@
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
OutputDirectory=".\Release"
|
||||
IntermediateDirectory=".\Release"
|
||||
ConfigurationType="2"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@@ -51,9 +50,9 @@
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
AdditionalIncludeDirectories="..\..\pthreads\include,..\ixml\src\inc,..\ixml\inc,..\threadutil\inc,..\upnp\inc,..\upnp\src\inc,.\inc"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="2"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="true"
|
||||
PrecompiledHeaderFile=".\Release/libupnp.pch"
|
||||
AssemblerListingLocation=".\Release/"
|
||||
@@ -76,7 +75,7 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib iphlpapi.lib"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
|
||||
OutputFile=".\Release/libupnp.dll"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
@@ -118,7 +117,7 @@
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@@ -145,10 +144,10 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\pthreads\include;..\..\ixml\src\inc;..\..\ixml\inc;..\..\threadutil\inc;..\..\upnp\inc;..\..\upnp\src\inc;..\inc;..\msvc"
|
||||
PreprocessorDefinitions="DEBUG;WIN32;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
PreprocessorDefinitions="DEBUG;WIN32;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
RuntimeLibrary="1"
|
||||
PrecompiledHeaderFile="$(OutDir)\libupnp.pch"
|
||||
AssemblerListingLocation="$(OutDir)\"
|
||||
ObjectFile="$(OutDir)\"
|
||||
@@ -171,7 +170,7 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib iphlpapi.lib $(TargetDir)..\ixml\ixml.lib"
|
||||
AdditionalDependencies="odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib"
|
||||
OutputFile="$(OutDir)\libupnp.dll"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="true"
|
||||
@@ -214,14 +213,6 @@
|
||||
Name="sources"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\ActionComplete.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\ActionRequest.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\attr.c"
|
||||
>
|
||||
@@ -230,10 +221,6 @@
|
||||
RelativePath="..\..\upnp\src\genlib\client_table\client_table.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\Discovery.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ixml\src\document.c"
|
||||
>
|
||||
@@ -242,18 +229,6 @@
|
||||
RelativePath="..\..\ixml\src\element.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\Event.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\EventSubscribe.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\FileInfo.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\threadutil\src\FreeList.c"
|
||||
>
|
||||
@@ -354,10 +329,6 @@
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_device.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_ResultData.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_server.c"
|
||||
>
|
||||
@@ -366,22 +337,10 @@
|
||||
RelativePath="..\..\upnp\src\genlib\net\http\statcodes.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\StateVarComplete.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\StateVarRequest.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\genlib\util\strintmap.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\SubscriptionRequest.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\uuid\sysdep.c"
|
||||
>
|
||||
@@ -406,10 +365,6 @@
|
||||
RelativePath="..\..\upnp\src\api\upnpdebug.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\UpnpString.c"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\api\upnptools.c"
|
||||
>
|
||||
@@ -443,14 +398,6 @@
|
||||
Name="headers"
|
||||
Filter="h;hpp;hxx;hm;inl"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\ActionComplete.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\ActionRequest.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\client_table.h"
|
||||
>
|
||||
@@ -459,22 +406,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\config.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\Discovery.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\Event.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\EventSubscribe.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\FileInfo.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\gena.h"
|
||||
>
|
||||
@@ -547,10 +478,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\sock.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\ssdp\ssdp_ResultData.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\ssdplib.h"
|
||||
>
|
||||
@@ -559,14 +486,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\statcodes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\StateVarComplete.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\StateVarRequest.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\statuscodes.h"
|
||||
>
|
||||
@@ -575,10 +494,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\strintmap.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\SubscriptionRequest.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\sysdep.h"
|
||||
>
|
||||
@@ -587,10 +502,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\unixutil.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnp.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\upnp_timeout.h"
|
||||
>
|
||||
@@ -599,18 +510,14 @@
|
||||
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\UpnpString.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnptools.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\uri.h"
|
||||
>
|
||||
@@ -636,6 +543,11 @@
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="resources"
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
>
|
||||
</Filter>
|
||||
<File
|
||||
RelativePath="..\..\..\..\libupnp_win32.patch"
|
||||
>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9,00"
|
||||
Version="9.00"
|
||||
Name="threadutil"
|
||||
ProjectGUID="{1D3EEF7A-D248-48C0-B6B5-ECA229FE4B3D}"
|
||||
RootNamespace="threadutil"
|
||||
@@ -20,7 +20,7 @@
|
||||
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
ConfigurationType="4"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
@@ -41,13 +41,12 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
AdditionalIncludeDirectories="..\..\threadutil\inc;..\..\upnp\inc;..\..\ixml\inc;..\..\pthreads\include"
|
||||
PreprocessorDefinitions="DEBUG;WIN32;_USRDLL;LIBUPNP_EXPORTS;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
PreprocessorDefinitions="WIN32;DEBUG"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
@@ -81,10 +80,10 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="0"
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
@@ -106,13 +105,10 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="..\..\threadutil\inc;..\..\upnp\inc;..\..\ixml\inc;..\..\pthreads\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBUPNP_EXPORTS;PTW32_STATIC_LIB;UPNP_STATIC_LIB;UPNP_USE_MSVCPP;_CRT_SECURE_NO_WARNINGS"
|
||||
RuntimeLibrary="2"
|
||||
EnableFunctionLevelLinking="true"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9,00"
|
||||
Version="9.00"
|
||||
Name="tvcombo"
|
||||
ProjectGUID="{6365804B-22C6-4D5E-91F3-0C052EB55B4F}"
|
||||
RootNamespace="tvcombo"
|
||||
@@ -47,7 +47,6 @@
|
||||
RuntimeLibrary="3"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
@@ -60,8 +59,8 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib $(TargetDir)..\libupnp\libupnp.lib"
|
||||
AdditionalLibraryDirectories=""$(TargetDir)..\ixml";"$(TargetDir)..\threadutil";"$(TargetDir)..\libupnp""
|
||||
AdditionalDependencies="..\..\pthreads\lib\pthreadVC2.lib ixml.lib threadutil.lib libupnp.lib"
|
||||
AdditionalLibraryDirectories=""$(OutDir)";".\out.vc9.$(ConfigurationName)\ixml";".\out.vc9.$(ConfigurationName)\threadutil";".\out.vc9.$(ConfigurationName)\libupnp""
|
||||
GenerateDebugInformation="true"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
@@ -89,8 +88,8 @@
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
IntermediateDirectory=".\out.vc9.$(ConfigurationName)\$(ProjectName)"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="1"
|
||||
@@ -118,7 +117,6 @@
|
||||
EnableFunctionLevelLinking="true"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="1"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
|
||||
130
configure.ac
130
configure.ac
@@ -4,12 +4,12 @@
|
||||
#
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
#
|
||||
# (C) Copyright 2005-2007 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
# (C) Copyright 2005-2007 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
#
|
||||
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
AC_INIT([libupnp], [1.6.9], [mroberto@users.sourceforge.net])
|
||||
AC_INIT([libupnp], [1.6.6], [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:
|
||||
@@ -144,59 +144,9 @@ dnl #AC_SUBST([LT_VERSION_THREADUTIL], [4:3:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [3:5:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.7:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 3 -> 4
|
||||
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 # - Interfaces removed in upnp:
|
||||
dnl # age: -> 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], [3:5:0])
|
||||
dnl #
|
||||
dnl # Obs.: 1.6.7 was released with a version error, the correct nubers should
|
||||
dnl # have been:
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:0:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.8:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in ixml
|
||||
dnl # revision: 4 -> 5
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 0 -> 1
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 0 -> 1
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:1:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:1:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.9:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 1 -> 2
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 1 -> 2
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:2:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:2:0])
|
||||
dnl #
|
||||
############################################################################
|
||||
AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [5:2:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [4:2:0])
|
||||
AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [4:3:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [3:5:0])
|
||||
dnl ############################################################################
|
||||
dnl # Repeating the algorithm to place it closer to the modificatin place:
|
||||
dnl # - library code modified: revision++
|
||||
@@ -290,16 +240,6 @@ if test "x$enable_tools" = xyes ; then
|
||||
AC_DEFINE(UPNP_HAVE_TOOLS, 1, [see upnpconfig.h])
|
||||
fi
|
||||
|
||||
RT_BOOL_ARG_ENABLE([ipv6], [no], [ipv6 support])
|
||||
if test "x$enable_ipv6" = xyes ; then
|
||||
AC_DEFINE(UPNP_ENABLE_IPV6, 1, [see upnpconfig.h])
|
||||
fi
|
||||
|
||||
RT_BOOL_ARG_ENABLE([notification_reordering], [yes], [GENA notification reordering in gena_device.c])
|
||||
if test "x$enable_notification_reordering" = xyes ; then
|
||||
AC_DEFINE(UPNP_ENABLE_NOTIFICATION_REORDERING, 1, [see upnpconfig.h])
|
||||
fi
|
||||
|
||||
|
||||
RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code])
|
||||
|
||||
@@ -385,26 +325,9 @@ 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)
|
||||
# Checks for header files
|
||||
#
|
||||
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(
|
||||
@@ -420,43 +343,19 @@ AC_CHECK_HEADERS(
|
||||
sys/ioctl.h \
|
||||
sys/socket.h \
|
||||
sys/time.h \
|
||||
sys/timeb.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 <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_WS2TCPIP_H
|
||||
#include <ws2tcpip.h>
|
||||
#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
|
||||
TYPE_SOCKLEN_T
|
||||
|
||||
|
||||
#
|
||||
@@ -465,11 +364,6 @@ fi
|
||||
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])
|
||||
|
||||
|
||||
#
|
||||
@@ -526,11 +420,3 @@ AC_CONFIG_FILES([
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
#
|
||||
# Files copied for windows compilation.
|
||||
#
|
||||
echo "configure: copying \"autoconfig.h\" to \"build/inc/autoconfig.h\""
|
||||
cp autoconfig.h build/inc/autoconfig.h
|
||||
echo "configure: copying \"upnp/inc/upnpconfig.h\" to \"build/inc/upnpconfig.h\""
|
||||
cp upnp/inc/upnpconfig.h build/inc/upnpconfig.h
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# "Makefile.am" for "libupnp/ixml"
|
||||
#
|
||||
# (C) Copyright 2005 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
# (C) Copyright 2005 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
#
|
||||
|
||||
SUBDIRS = doc
|
||||
@@ -24,23 +24,15 @@ 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/ixml.c src/node.c src/ixmlparser.c \
|
||||
src/ixmlmembuf.c src/nodeList.c \
|
||||
src/element.c src/attr.c src/document.c \
|
||||
src/namedNodeMap.c \
|
||||
src/node.c \
|
||||
src/nodeList.c
|
||||
src/inc/ixmlmembuf.h src/inc/ixmlparser.h
|
||||
|
||||
upnpincludedir = $(includedir)/upnp
|
||||
upnpinclude_HEADERS = \
|
||||
inc/ixml.h \
|
||||
inc/ixmldebug.h
|
||||
upnpinclude_HEADERS = inc/ixml.h
|
||||
|
||||
|
||||
check_PROGRAMS = test_document
|
||||
TESTS = test/test_document.sh
|
||||
@@ -55,3 +47,4 @@ dist-hook:
|
||||
clean-local:
|
||||
@if [ -d bin ] ; then rm -rf bin ; fi
|
||||
|
||||
|
||||
|
||||
2726
ixml/inc/ixml.h
2726
ixml/inc/ixml.h
File diff suppressed because it is too large
Load Diff
@@ -1,67 +0,0 @@
|
||||
|
||||
|
||||
#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 */
|
||||
|
||||
@@ -1,53 +1,60 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "ixmlparser.h"
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void ixmlAttr_init(IN IXML_Attr *attr)
|
||||
/*================================================================
|
||||
* Function: Attr_init
|
||||
* Initializes an attribute node
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlAttr_init( IN IXML_Attr * attr )
|
||||
{
|
||||
if (attr != NULL) {
|
||||
memset(attr, 0, sizeof (IXML_Attr));
|
||||
if( attr != NULL ) {
|
||||
memset( attr, 0, sizeof( IXML_Attr ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ixmlAttr_free(IN IXML_Attr *attr)
|
||||
/*================================================================
|
||||
* Function: Attr_free
|
||||
* Frees an attribute node.
|
||||
* external function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlAttr_free( IN IXML_Attr * attr )
|
||||
{
|
||||
if (attr != NULL) {
|
||||
ixmlNode_free((IXML_Node *)attr);
|
||||
if( attr != NULL ) {
|
||||
ixmlNode_free( ( IXML_Node * ) attr );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,173 +1,73 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "ixml.h"
|
||||
|
||||
|
||||
#include <stdlib.h> /* for size_t */
|
||||
|
||||
|
||||
#define MINVAL(a, b) ( (a) < (b) ? (a) : (b) )
|
||||
#define MAXVAL(a, b) ( (a) > (b) ? (a) : (b) )
|
||||
|
||||
#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
|
||||
typedef struct // ixml_membuf
|
||||
{
|
||||
char *buf;
|
||||
|
||||
size_t length;
|
||||
size_t capacity;
|
||||
size_t size_inc;
|
||||
|
||||
} ixml_membuf;
|
||||
|
||||
//--------------------------------------------------
|
||||
//////////////// functions /////////////////////////
|
||||
//--------------------------------------------------
|
||||
/*
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \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 */
|
||||
void ixml_membuf_init(INOUT ixml_membuf *m);
|
||||
void ixml_membuf_destroy(INOUT ixml_membuf *m);
|
||||
int ixml_membuf_assign(INOUT ixml_membuf *m, IN const void *buf,
|
||||
IN size_t buf_len );
|
||||
int ixml_membuf_assign_str(INOUT ixml_membuf *m, IN const char *c_str );
|
||||
int ixml_membuf_append(INOUT ixml_membuf *m, IN const void *buf);
|
||||
int ixml_membuf_append_str(INOUT ixml_membuf *m, IN const char *c_str);
|
||||
int ixml_membuf_insert(INOUT ixml_membuf *m, IN const void* buf,
|
||||
IN size_t buf_len, int index );
|
||||
|
||||
#endif // _IXML_MEMBUF_H
|
||||
|
||||
@@ -1,49 +1,41 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
|
||||
#include "ixml.h"
|
||||
#include "ixmlmembuf.h"
|
||||
|
||||
|
||||
/* Parser definitions */
|
||||
// Parser definitions
|
||||
#define QUOT """
|
||||
#define LT "<"
|
||||
#define GT ">"
|
||||
@@ -52,7 +44,6 @@
|
||||
#define ESC_HEX "&#x"
|
||||
#define ESC_DEC "&#"
|
||||
|
||||
|
||||
typedef struct _IXML_NamespaceURI
|
||||
{
|
||||
char *nsURI;
|
||||
@@ -78,192 +69,52 @@ typedef enum
|
||||
eCONTENT,
|
||||
} PARSER_STATE;
|
||||
|
||||
|
||||
typedef struct _Parser
|
||||
{
|
||||
/*! Data buffer. */
|
||||
char *dataBuffer;
|
||||
/*! Pointer to the token parsed. */
|
||||
char *curPtr;
|
||||
/*! Saves for backup. */
|
||||
char *savePtr;
|
||||
char *dataBuffer; //data buffer
|
||||
char *curPtr; //ptr to the token parsed
|
||||
char *savePtr; //Saves for backup
|
||||
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_LoadDocument( IXML_Document **retDoc, const char * xmlFile, BOOL file);
|
||||
BOOL Parser_isValidXmlName( const DOMString name);
|
||||
int Parser_setNodePrefixAndLocalName(IXML_Node *newIXML_NodeIXML_Attr);
|
||||
void Parser_freeNodeContent( IXML_Node *IXML_Nodeptr);
|
||||
|
||||
void Parser_setErrorChar( char c );
|
||||
|
||||
void ixmlAttr_free(IXML_Attr *attrNode);
|
||||
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);
|
||||
int ixmlElement_setTagName(IXML_Element *element, const char *tagName);
|
||||
|
||||
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap);
|
||||
int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node *add);
|
||||
|
||||
/*!
|
||||
* \brief Initializes a NamedNodeMap object.
|
||||
*/
|
||||
void ixmlNamedNodeMap_init(
|
||||
/*! [in] The named node map to process. */
|
||||
IXML_NamedNodeMap *nnMap);
|
||||
void ixmlNode_init(IXML_Node *IXML_Nodeptr);
|
||||
BOOL ixmlNode_compare(IXML_Node *srcIXML_Node, IXML_Node *destIXML_Node);
|
||||
|
||||
void ixmlNode_getElementsByTagName( IXML_Node *n, const char *tagname, IXML_NodeList **list);
|
||||
void ixmlNode_getElementsByTagNameNS( IXML_Node *IXML_Node, const char *namespaceURI,
|
||||
const char *localName, IXML_NodeList **list);
|
||||
|
||||
/*!
|
||||
* \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);
|
||||
int ixmlNode_setNodeProperties(IXML_Node* node, IXML_Node *src);
|
||||
int ixmlNode_setNodeName( IXML_Node* node, const DOMString qualifiedName);
|
||||
|
||||
/*!
|
||||
* \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);
|
||||
void ixmlNodeList_init(IXML_NodeList *nList);
|
||||
int ixmlNodeList_addToNodeList(IXML_NodeList **nList, 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 */
|
||||
#endif // _IXMLPARSER_H
|
||||
|
||||
|
||||
560
ixml/src/ixml.c
560
ixml/src/ixml.c
@@ -1,469 +1,531 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "ixmldebug.h"
|
||||
#include "ixmlmembuf.h"
|
||||
#include "ixmlparser.h"
|
||||
|
||||
|
||||
#include <stdlib.h> /* for free() */
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Appends a string to a buffer, substituting some characters by escape
|
||||
* sequences.
|
||||
*/
|
||||
static void copy_with_escape(
|
||||
/*! [in,out] The input/output buffer. */
|
||||
ixml_membuf *buf,
|
||||
/*! [in] The string to copy from. */
|
||||
const char *p)
|
||||
/*================================================================
|
||||
* copy_with_escape
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
static void
|
||||
copy_with_escape( INOUT ixml_membuf * buf,
|
||||
IN const char *p )
|
||||
{
|
||||
int i;
|
||||
int plen;
|
||||
|
||||
if (p == NULL) {
|
||||
if( p == NULL )
|
||||
return;
|
||||
}
|
||||
|
||||
plen = strlen( p );
|
||||
|
||||
for (i = 0; i < plen; i++) {
|
||||
switch (p[i]) {
|
||||
for( i = 0; i < plen; i++ ) {
|
||||
switch ( p[i] ) {
|
||||
case '<':
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
break;
|
||||
|
||||
case '>':
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
break;
|
||||
|
||||
case '&':
|
||||
ixml_membuf_append_str(buf, "&");
|
||||
ixml_membuf_append_str( buf, "&" );
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
ixml_membuf_append_str(buf, "'");
|
||||
ixml_membuf_append_str( buf, "'" );
|
||||
break;
|
||||
|
||||
case '\"':
|
||||
ixml_membuf_append_str(buf, """);
|
||||
ixml_membuf_append_str( buf, """ );
|
||||
break;
|
||||
|
||||
default:
|
||||
ixml_membuf_append(buf, &p[i]);
|
||||
break;
|
||||
ixml_membuf_append( buf, &p[i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Recursive function to print all the node in a tree.
|
||||
* Internal to parser only.
|
||||
*/
|
||||
static void ixmlPrintDomTreeRecursive(
|
||||
/*! [in] \todo documentation. */
|
||||
IXML_Node *nodeptr,
|
||||
/*! [in] \todo documentation. */
|
||||
ixml_membuf *buf)
|
||||
/*================================================================
|
||||
* ixmlPrintDomTreeRecursive
|
||||
* It is a recursive function to print all the node in a tree.
|
||||
* Internal to parser only.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
|
||||
IN ixml_membuf * buf )
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL,
|
||||
*sibling = NULL;
|
||||
|
||||
if (nodeptr != NULL) {
|
||||
nodeName = (const char *)ixmlNode_getNodeName(nodeptr);
|
||||
nodeValue = ixmlNode_getNodeValue(nodeptr);
|
||||
if( nodeptr != NULL ) {
|
||||
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
|
||||
nodeValue = ixmlNode_getNodeValue( nodeptr );
|
||||
|
||||
switch ( ixmlNode_getNodeType( nodeptr ) ) {
|
||||
|
||||
switch (ixmlNode_getNodeType(nodeptr)) {
|
||||
case eTEXT_NODE:
|
||||
copy_with_escape(buf, nodeValue);
|
||||
copy_with_escape( buf, nodeValue );
|
||||
break;
|
||||
|
||||
case eCDATA_SECTION_NODE:
|
||||
ixml_membuf_append_str(buf, "<![CDATA[");
|
||||
ixml_membuf_append_str(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "]]>");
|
||||
ixml_membuf_append_str( buf, "<![CDATA[" );
|
||||
ixml_membuf_append_str( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "]]>" );
|
||||
break;
|
||||
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
ixml_membuf_append_str(buf, "<?");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
copy_with_escape(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "?>\n");
|
||||
ixml_membuf_append_str( buf, "<?" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "?>\n" );
|
||||
break;
|
||||
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild
|
||||
( nodeptr ), buf );
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, "=\"");
|
||||
copy_with_escape(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "\"");
|
||||
if (nodeptr->nextSibling != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->nextSibling, buf);
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, "=\"" );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "\"" );
|
||||
|
||||
if( nodeptr->nextSibling != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->nextSibling, buf );
|
||||
}
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
if (nodeptr->firstAttr != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->firstAttr, buf);
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
if( nodeptr->firstAttr != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->firstAttr, buf );
|
||||
}
|
||||
child = ixmlNode_getFirstChild(nodeptr);
|
||||
if (child != NULL &&
|
||||
ixmlNode_getNodeType(child) == eELEMENT_NODE) {
|
||||
ixml_membuf_append_str(buf, ">\r\n");
|
||||
|
||||
child = ixmlNode_getFirstChild( nodeptr );
|
||||
if( ( child != NULL )
|
||||
&& ( ixmlNode_getNodeType( child ) ==
|
||||
eELEMENT_NODE ) ) {
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
} else {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild
|
||||
( nodeptr ), buf );
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str( buf, "</" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
sibling = ixmlNode_getNextSibling(nodeptr);
|
||||
if (sibling != NULL &&
|
||||
ixmlNode_getNodeType(sibling) == eTEXT_NODE) {
|
||||
sibling = ixmlNode_getNextSibling( nodeptr );
|
||||
if( sibling != NULL
|
||||
&& ixmlNode_getNodeType( sibling ) == eTEXT_NODE ) {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
} else {
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
}
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getNextSibling(nodeptr), buf);
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getNextSibling
|
||||
( nodeptr ), buf );
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTreeRecursive",
|
||||
"Warning, unknown node type %d\n",
|
||||
ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Print a DOM tree.
|
||||
*
|
||||
* Element, and Attribute nodes are handled differently. We don't want to print
|
||||
* the Element and Attribute nodes' sibling.
|
||||
*/
|
||||
static void ixmlPrintDomTree(
|
||||
/*! [in] \todo documentation. */
|
||||
IXML_Node *nodeptr,
|
||||
/*! [in] \todo documentation. */
|
||||
ixml_membuf *buf)
|
||||
/*================================================================
|
||||
* ixmlPrintDomTree
|
||||
* Print a DOM tree.
|
||||
* Element, and Attribute nodes are handled differently.
|
||||
* We don't want to print the Element and Attribute nodes' sibling.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlPrintDomTree( IN IXML_Node * nodeptr,
|
||||
IN ixml_membuf * buf )
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL;
|
||||
|
||||
if (nodeptr == NULL || buf == NULL) {
|
||||
if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
nodeName = (const char *)ixmlNode_getNodeName(nodeptr);
|
||||
nodeValue = ixmlNode_getNodeValue(nodeptr);
|
||||
switch (ixmlNode_getNodeType(nodeptr)) {
|
||||
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
|
||||
nodeValue = ixmlNode_getNodeValue( nodeptr );
|
||||
|
||||
switch ( ixmlNode_getNodeType( nodeptr ) ) {
|
||||
|
||||
case eTEXT_NODE:
|
||||
case eCDATA_SECTION_NODE:
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive(nodeptr, buf);
|
||||
ixmlPrintDomTreeRecursive( nodeptr, buf );
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, "=\"");
|
||||
copy_with_escape(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "\"");
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, "=\"" );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "\"" );
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
if (nodeptr->firstAttr != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->firstAttr, buf);
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
if( nodeptr->firstAttr != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->firstAttr, buf );
|
||||
}
|
||||
child = ixmlNode_getFirstChild(nodeptr);
|
||||
if (child != NULL &&
|
||||
ixmlNode_getNodeType(child) == eELEMENT_NODE) {
|
||||
ixml_membuf_append_str(buf, ">\r\n");
|
||||
|
||||
child = ixmlNode_getFirstChild( nodeptr );
|
||||
if( ( child != NULL )
|
||||
&& ( ixmlNode_getNodeType( child ) == eELEMENT_NODE ) ) {
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
} else {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild( nodeptr ),
|
||||
buf );
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, ">\r\n");
|
||||
ixml_membuf_append_str( buf, "</" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTree",
|
||||
"Warning, unknown node type %d\n",
|
||||
ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Converts a DOM tree into a text string.
|
||||
*
|
||||
* Element, and Attribute nodes are handled differently. We don't want to print
|
||||
* the Element and Attribute nodes' sibling.
|
||||
*/
|
||||
static void ixmlDomTreetoString(
|
||||
/*! [in] \todo documentation. */
|
||||
IXML_Node *nodeptr,
|
||||
/*! [in] \todo documentation. */
|
||||
ixml_membuf *buf)
|
||||
/*================================================================
|
||||
* ixmlDomTreetoString
|
||||
* Converts a DOM tree into a text string
|
||||
* Element, and Attribute nodes are handled differently.
|
||||
* We don't want to print the Element and Attribute nodes' sibling.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlDomTreetoString( IN IXML_Node * nodeptr,
|
||||
IN ixml_membuf * buf )
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL;
|
||||
|
||||
if (nodeptr == NULL || buf == NULL) {
|
||||
if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
nodeName = (const char *)ixmlNode_getNodeName(nodeptr);
|
||||
nodeValue = ixmlNode_getNodeValue(nodeptr);
|
||||
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
|
||||
nodeValue = ixmlNode_getNodeValue( nodeptr );
|
||||
|
||||
switch ( ixmlNode_getNodeType( nodeptr ) ) {
|
||||
|
||||
switch (ixmlNode_getNodeType(nodeptr)) {
|
||||
case eTEXT_NODE:
|
||||
case eCDATA_SECTION_NODE:
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive(nodeptr, buf);
|
||||
ixmlPrintDomTreeRecursive( nodeptr, buf );
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, "=\"");
|
||||
copy_with_escape(buf, nodeValue );
|
||||
ixml_membuf_append_str(buf, "\"");
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, "=\"" );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "\"" );
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
if (nodeptr->firstAttr != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->firstAttr, buf);
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
if( nodeptr->firstAttr != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->firstAttr, buf );
|
||||
}
|
||||
child = ixmlNode_getFirstChild(nodeptr);
|
||||
if (child != NULL &&
|
||||
ixmlNode_getNodeType(child) == eELEMENT_NODE) {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
|
||||
child = ixmlNode_getFirstChild( nodeptr );
|
||||
if( ( child != NULL )
|
||||
&& ( ixmlNode_getNodeType( child ) == eELEMENT_NODE ) ) {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
} else {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive(ixmlNode_getFirstChild(nodeptr), buf);
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild( nodeptr ),
|
||||
buf );
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
ixml_membuf_append_str( buf, "</" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTreeRecursive",
|
||||
"Warning, unknown node type %d\n",
|
||||
ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int ixmlLoadDocumentEx(const char *xmlFile, IXML_Document **doc)
|
||||
/*================================================================
|
||||
* ixmlLoadDocumentEx
|
||||
* Parses the given file, and returns the DOM tree from it.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlLoadDocumentEx( IN const char *xmlFile,
|
||||
IXML_Document ** doc )
|
||||
{
|
||||
if (xmlFile == NULL || doc == NULL) {
|
||||
|
||||
if( ( xmlFile == NULL ) || ( doc == NULL ) ) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return Parser_LoadDocument(doc, xmlFile, TRUE);
|
||||
return Parser_LoadDocument( doc, xmlFile, TRUE );
|
||||
}
|
||||
|
||||
|
||||
IXML_Document *ixmlLoadDocument(const char *xmlFile)
|
||||
/*================================================================
|
||||
* ixmlLoadDocument
|
||||
* Parses the given file, and returns the DOM tree from it.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Document *
|
||||
ixmlLoadDocument( IN const char *xmlFile )
|
||||
{
|
||||
|
||||
IXML_Document *doc = NULL;
|
||||
|
||||
ixmlLoadDocumentEx(xmlFile, &doc);
|
||||
|
||||
ixmlLoadDocumentEx( xmlFile, &doc );
|
||||
return doc;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlPrintDocument
|
||||
* Prints entire document, prepending XML prolog first.
|
||||
* Puts lots of white spaces.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
|
||||
DOMString ixmlPrintDocument(IXML_Document *doc)
|
||||
DOMString
|
||||
ixmlPrintDocument(IXML_Document *doc)
|
||||
{
|
||||
IXML_Node* rootNode = (IXML_Node *)doc;
|
||||
IXML_Node* rootNode = ( IXML_Node * )doc;
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if(rootNode == NULL) {
|
||||
if( rootNode == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixml_membuf_append_str(buf, "<?xml version=\"1.0\"?>\r\n");
|
||||
ixmlPrintDomTree(rootNode, buf);
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
|
||||
ixmlPrintDomTree( rootNode, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlPrintNode(IXML_Node *node)
|
||||
/*================================================================
|
||||
* ixmlPrintNode
|
||||
* Print DOM tree under node. Puts lots of white spaces
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
DOMString
|
||||
ixmlPrintNode( IN IXML_Node * node )
|
||||
{
|
||||
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if (node == NULL) {
|
||||
if( node == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixmlPrintDomTree(node, buf);
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixmlPrintDomTree( node, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlDocumenttoString
|
||||
* converts DOM tree under node to text string,
|
||||
* prepending XML prolog first.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
|
||||
DOMString ixmlDocumenttoString(IXML_Document *doc)
|
||||
DOMString
|
||||
ixmlDocumenttoString(IXML_Document *doc)
|
||||
{
|
||||
IXML_Node* rootNode = (IXML_Node *)doc;
|
||||
IXML_Node* rootNode = ( IXML_Node * )doc;
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if(rootNode == NULL) {
|
||||
if( rootNode == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixml_membuf_append_str(buf, "<?xml version=\"1.0\"?>\r\n");
|
||||
ixmlDomTreetoString(rootNode, buf);
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
|
||||
ixmlDomTreetoString( rootNode, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlNodetoString(IXML_Node *node)
|
||||
/*================================================================
|
||||
* ixmlNodetoString
|
||||
* converts DOM tree under node to text string
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
DOMString
|
||||
ixmlNodetoString( IN IXML_Node * node )
|
||||
{
|
||||
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if (node == NULL) {
|
||||
if( node == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixmlDomTreetoString(node, buf);
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixmlDomTreetoString( node, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlRelaxParser
|
||||
* Makes the XML parser more tolerant to malformed text.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlRelaxParser(char errorChar)
|
||||
{
|
||||
Parser_setErrorChar( errorChar );
|
||||
}
|
||||
|
||||
|
||||
void ixmlRelaxParser(char errorChar)
|
||||
/*================================================================
|
||||
* ixmlParseBufferEx
|
||||
* Parse xml file stored in buffer.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlParseBufferEx( IN const char *buffer,
|
||||
IXML_Document ** retDoc )
|
||||
{
|
||||
Parser_setErrorChar(errorChar);
|
||||
}
|
||||
|
||||
|
||||
int ixmlParseBufferEx(const char *buffer, IXML_Document **retDoc)
|
||||
{
|
||||
if (buffer == NULL || retDoc == NULL) {
|
||||
if( ( buffer == NULL ) || ( retDoc == NULL ) ) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (buffer[0] == '\0') {
|
||||
if( buffer[0] == '\0' ) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return Parser_LoadDocument(retDoc, buffer, FALSE);
|
||||
return Parser_LoadDocument( retDoc, buffer, FALSE );
|
||||
}
|
||||
|
||||
|
||||
IXML_Document *ixmlParseBuffer(const char *buffer)
|
||||
/*================================================================
|
||||
* ixmlParseBuffer
|
||||
* Parse xml file stored in buffer.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Document *
|
||||
ixmlParseBuffer( IN const char *buffer )
|
||||
{
|
||||
IXML_Document *doc = NULL;
|
||||
|
||||
ixmlParseBufferEx(buffer, &doc);
|
||||
|
||||
ixmlParseBufferEx( buffer, &doc );
|
||||
return doc;
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlCloneDOMString(const DOMString src)
|
||||
/*================================================================
|
||||
* ixmlCloneDOMString
|
||||
* Clones a DOM String.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
DOMString
|
||||
ixmlCloneDOMString( IN const DOMString src )
|
||||
{
|
||||
if (src == NULL) {
|
||||
if( src == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return strdup(src);
|
||||
return ( strdup( src ) );
|
||||
}
|
||||
|
||||
|
||||
void ixmlFreeDOMString(DOMString buf)
|
||||
/*================================================================
|
||||
* ixmlFreeDOMString
|
||||
* Frees a DOM String.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlFreeDOMString( IN DOMString buf )
|
||||
{
|
||||
if (buf != NULL) {
|
||||
free(buf);
|
||||
if( buf != NULL ) {
|
||||
free( buf );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "autoconfig.h"
|
||||
|
||||
|
||||
#include "ixmldebug.h"
|
||||
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
void IxmlPrintf(
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo,
|
||||
const char *FunctionName,
|
||||
const char *FmtStr,
|
||||
...)
|
||||
{
|
||||
va_list ArgList;
|
||||
|
||||
FILE *fp = stdout;
|
||||
fprintf(fp, "(%s::%s), line %d", DbgFileName, FunctionName, DbgLineNo);
|
||||
if (FmtStr) {
|
||||
fprintf(fp, ": ");
|
||||
va_start(ArgList, FmtStr);
|
||||
vfprintf(fp, FmtStr, ArgList);
|
||||
fflush(fp);
|
||||
va_end(ArgList);
|
||||
} else {
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void printNodes(IXML_Node *tmpRoot, int depth)
|
||||
{
|
||||
int i;
|
||||
IXML_NodeList *NodeList1;
|
||||
IXML_Node *ChildNode1;
|
||||
unsigned short NodeType;
|
||||
const DOMString NodeValue;
|
||||
const DOMString NodeName;
|
||||
NodeList1 = ixmlNode_getChildNodes(tmpRoot);
|
||||
for (i = 0; i < 100; ++i) {
|
||||
ChildNode1 = ixmlNodeList_item(NodeList1, i);
|
||||
if (ChildNode1 == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
printNodes(ChildNode1, depth+1);
|
||||
NodeType = ixmlNode_getNodeType(ChildNode1);
|
||||
NodeValue = ixmlNode_getNodeValue(ChildNode1);
|
||||
NodeName = ixmlNode_getNodeName(ChildNode1);
|
||||
IxmlPrintf(__FILE__, __LINE__, "printNodes",
|
||||
"DEPTH-%2d-IXML_Node Type %d, "
|
||||
"IXML_Node Name: %s, IXML_Node Value: %s\n",
|
||||
depth, NodeType, NodeName, NodeValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,112 +1,109 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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 "ixmlmembuf.h"
|
||||
#include "ixml.h"
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "ixmlmembuf.h"
|
||||
#include "ixml.h"
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Increases or decreases buffer capacity so that at least 'new_length'
|
||||
* bytes can be stored.
|
||||
*
|
||||
* On error, m's fields do not change.
|
||||
*
|
||||
* \return
|
||||
* \li UPNP_E_SUCCESS
|
||||
* \li UPNP_E_OUTOF_MEMORY
|
||||
*/
|
||||
static int ixml_membuf_set_size(
|
||||
/*! [in,out] The memory buffer. */
|
||||
INOUT ixml_membuf *m,
|
||||
/*! [in] The new lenght. */
|
||||
IN size_t new_length)
|
||||
/*================================================================
|
||||
* ixml_membuf_set_size
|
||||
*
|
||||
* Increases or decreases buffer cap so that at least
|
||||
* 'new_length' bytes can be stored
|
||||
*
|
||||
* On error, m's fields do not change.
|
||||
*
|
||||
* returns:
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
*
|
||||
*=================================================================*/
|
||||
static int
|
||||
ixml_membuf_set_size( INOUT ixml_membuf * 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) {
|
||||
/* have enough mem; done */
|
||||
return 0;
|
||||
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);
|
||||
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) {
|
||||
if( ( m->capacity - new_length ) <= m->size_inc ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
alloc_len = new_length + m->size_inc;
|
||||
}
|
||||
|
||||
assert(alloc_len >= new_length);
|
||||
assert( alloc_len >= new_length );
|
||||
|
||||
temp_buf = realloc(m->buf, alloc_len + 1);
|
||||
if (temp_buf == NULL) {
|
||||
/* try smaller size */
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 );
|
||||
if( temp_buf == NULL ) {
|
||||
// try smaller size
|
||||
alloc_len = new_length;
|
||||
temp_buf = realloc(m->buf, alloc_len + 1);
|
||||
if (temp_buf == NULL) {
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 );
|
||||
|
||||
if( temp_buf == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
}
|
||||
/* save */
|
||||
// save
|
||||
m->buf = temp_buf;
|
||||
m->capacity = alloc_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void ixml_membuf_init(ixml_membuf *m)
|
||||
/*================================================================
|
||||
* membuffer_init
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixml_membuf_init( INOUT ixml_membuf * m )
|
||||
{
|
||||
assert(m != NULL);
|
||||
assert( m != NULL );
|
||||
|
||||
m->size_inc = MEMBUF_DEF_SIZE_INC;
|
||||
m->buf = NULL;
|
||||
@@ -114,105 +111,126 @@ void ixml_membuf_init(ixml_membuf *m)
|
||||
m->capacity = 0;
|
||||
}
|
||||
|
||||
|
||||
void ixml_membuf_destroy(ixml_membuf *m)
|
||||
/*================================================================
|
||||
* membuffer_destroy
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixml_membuf_destroy( INOUT ixml_membuf * m )
|
||||
{
|
||||
if (m == NULL) {
|
||||
if( m == NULL ) {
|
||||
return;
|
||||
}
|
||||
|
||||
free(m->buf);
|
||||
ixml_membuf_init(m);
|
||||
free( m->buf );
|
||||
ixml_membuf_init( m );
|
||||
}
|
||||
|
||||
|
||||
int ixml_membuf_assign(
|
||||
ixml_membuf *m,
|
||||
const void *buf,
|
||||
size_t buf_len)
|
||||
/*================================================================
|
||||
* ixml_membuf_assign
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_assign( INOUT ixml_membuf * m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len )
|
||||
{
|
||||
int return_code;
|
||||
|
||||
assert(m != NULL);
|
||||
assert( m != NULL );
|
||||
|
||||
// set value to null
|
||||
if (buf == NULL) {
|
||||
ixml_membuf_destroy(m);
|
||||
if( buf == NULL ) {
|
||||
ixml_membuf_destroy( m );
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
// alloc mem
|
||||
return_code = ixml_membuf_set_size(m, buf_len);
|
||||
if (return_code != 0) {
|
||||
return_code = ixml_membuf_set_size( m, buf_len );
|
||||
if( return_code != 0 ) {
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// copy
|
||||
memcpy(m->buf, buf, buf_len);
|
||||
memcpy( m->buf, buf, buf_len );
|
||||
m->buf[buf_len] = 0; // null-terminate
|
||||
|
||||
// null-terminate
|
||||
m->buf[buf_len] = 0;
|
||||
m->length = buf_len;
|
||||
|
||||
return IXML_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int ixml_membuf_assign_str(
|
||||
ixml_membuf *m,
|
||||
const char *c_str)
|
||||
/*================================================================
|
||||
* ixml_membuf_assign_str
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_assign_str( INOUT ixml_membuf * m,
|
||||
IN const char *c_str )
|
||||
{
|
||||
return ixml_membuf_assign(m, c_str, strlen(c_str));
|
||||
return ixml_membuf_assign( m, c_str, strlen( c_str ) );
|
||||
}
|
||||
|
||||
|
||||
int ixml_membuf_append(
|
||||
INOUT ixml_membuf *m,
|
||||
IN const void *buf)
|
||||
/*================================================================
|
||||
* ixml_membuf_append
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_append( INOUT ixml_membuf * m,
|
||||
IN const void *buf )
|
||||
{
|
||||
assert(m != NULL);
|
||||
assert( m != NULL );
|
||||
|
||||
return ixml_membuf_insert(m, buf, 1, m->length);
|
||||
return ixml_membuf_insert( m, buf, 1, m->length );
|
||||
}
|
||||
|
||||
|
||||
int ixml_membuf_append_str(
|
||||
INOUT ixml_membuf *m,
|
||||
IN const char *c_str)
|
||||
/*================================================================
|
||||
* ixml_membuf_append_str
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_append_str( INOUT ixml_membuf * m,
|
||||
IN const char *c_str )
|
||||
{
|
||||
return ixml_membuf_insert(m, c_str, strlen(c_str), m->length);
|
||||
return ixml_membuf_insert( m, c_str, strlen( c_str ), m->length );
|
||||
}
|
||||
|
||||
|
||||
int ixml_membuf_insert(
|
||||
INOUT ixml_membuf *m,
|
||||
/*================================================================
|
||||
* ixml_membuf_insert
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_insert( INOUT ixml_membuf * m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len,
|
||||
int index)
|
||||
int index )
|
||||
{
|
||||
int return_code = 0;
|
||||
int return_code;
|
||||
|
||||
assert(m != NULL);
|
||||
assert( m != NULL );
|
||||
|
||||
if (index < 0 || index > (int)m->length) {
|
||||
if( index < 0 || index > ( int )m->length )
|
||||
return IXML_INDEX_SIZE_ERR;
|
||||
}
|
||||
|
||||
if (buf == NULL || buf_len == 0) {
|
||||
if( buf == NULL || buf_len == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
/* alloc mem */
|
||||
return_code = ixml_membuf_set_size(m, m->length + buf_len);
|
||||
if (return_code != 0) {
|
||||
// alloc mem
|
||||
return_code = ixml_membuf_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);
|
||||
// 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;
|
||||
/* Null terminate */
|
||||
m->buf[m->length] = 0;
|
||||
m->buf[m->length] = 0; // null-terminate
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,70 +1,62 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "ixmlparser.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h> /* for free(), malloc() */
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Return the item number of a item in NamedNodeMap.
|
||||
*/
|
||||
static unsigned long ixmlNamedNodeMap_getItemNumber(
|
||||
/*! [in] The named node map to process. */
|
||||
IN IXML_NamedNodeMap *nnMap,
|
||||
/*! [in] The name of the item to find. */
|
||||
IN const char *name)
|
||||
/*================================================================
|
||||
* NamedNodeMap_getItemNumber
|
||||
* return the item number of a item in NamedNodeMap.
|
||||
* Internal to parser only.
|
||||
* Parameters:
|
||||
* name: the name of the item to find
|
||||
*
|
||||
*=================================================================*/
|
||||
unsigned long
|
||||
ixmlNamedNodeMap_getItemNumber( IN IXML_NamedNodeMap * nnMap,
|
||||
IN const char *name )
|
||||
{
|
||||
IXML_Node *tempNode;
|
||||
unsigned long returnItemNo = 0;
|
||||
|
||||
assert(nnMap != NULL && name != NULL);
|
||||
if (nnMap == NULL || name == NULL) {
|
||||
assert( nnMap != NULL && name != NULL );
|
||||
if( ( nnMap == NULL ) || ( name == NULL ) ) {
|
||||
return IXML_INVALID_ITEM_NUMBER;
|
||||
}
|
||||
|
||||
tempNode = nnMap->nodeItem;
|
||||
while (tempNode != NULL) {
|
||||
if (strcmp(name, tempNode->nodeName) == 0) {
|
||||
while( tempNode != NULL ) {
|
||||
if( strcmp( name, tempNode->nodeName ) == 0 ) {
|
||||
return returnItemNo;
|
||||
}
|
||||
|
||||
tempNode = tempNode->nextSibling;
|
||||
returnItemNo++;
|
||||
}
|
||||
@@ -72,117 +64,173 @@ static unsigned long ixmlNamedNodeMap_getItemNumber(
|
||||
return IXML_INVALID_ITEM_NUMBER;
|
||||
}
|
||||
|
||||
|
||||
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap)
|
||||
/*================================================================
|
||||
* NamedNodeMap_init
|
||||
* Initializes a NamedNodeMap object.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNamedNodeMap_init( IN IXML_NamedNodeMap * nnMap )
|
||||
{
|
||||
assert(nnMap != NULL);
|
||||
|
||||
memset(nnMap, 0, sizeof (IXML_NamedNodeMap));
|
||||
assert( nnMap != NULL );
|
||||
memset( nnMap, 0, sizeof( IXML_NamedNodeMap ) );
|
||||
}
|
||||
|
||||
|
||||
IXML_Node *ixmlNamedNodeMap_getNamedItem(
|
||||
IXML_NamedNodeMap *nnMap,
|
||||
const DOMString name)
|
||||
/*================================================================
|
||||
* NamedNodeMap_getNamedItem
|
||||
* Retrieves a node specified by name.
|
||||
* External function.
|
||||
*
|
||||
* Parameter:
|
||||
* name: type nodeName of a node to retrieve.
|
||||
*
|
||||
* Return Value:
|
||||
* A Node with the specified nodeName, or null if it
|
||||
* does not identify any node in this map.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Node *
|
||||
ixmlNamedNodeMap_getNamedItem( IN IXML_NamedNodeMap * nnMap,
|
||||
IN const char *name )
|
||||
{
|
||||
long index;
|
||||
|
||||
if (nnMap == NULL || name == NULL) {
|
||||
if( ( nnMap == NULL ) || ( name == NULL ) ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
index = ixmlNamedNodeMap_getItemNumber(nnMap, name);
|
||||
if (index == IXML_INVALID_ITEM_NUMBER) {
|
||||
index = ixmlNamedNodeMap_getItemNumber( nnMap, name );
|
||||
if( index == IXML_INVALID_ITEM_NUMBER ) {
|
||||
return NULL;
|
||||
} else {
|
||||
return ixmlNamedNodeMap_item(nnMap, (unsigned long)index);
|
||||
return ( ixmlNamedNodeMap_item( nnMap, ( unsigned long )index ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
IXML_Node *ixmlNamedNodeMap_item(
|
||||
IN IXML_NamedNodeMap *nnMap,
|
||||
/*================================================================
|
||||
* NamedNodeMap_item
|
||||
* Returns the indexth item in the map. If index is greater than or
|
||||
* equal to the number of nodes in this map, this returns null.
|
||||
* External function.
|
||||
*
|
||||
* Parameter:
|
||||
* index: index into this map.
|
||||
*
|
||||
* Return Value:
|
||||
* The node at the indexth position in the map, or null if that is
|
||||
* not a valid index.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Node *
|
||||
ixmlNamedNodeMap_item( IN IXML_NamedNodeMap * nnMap,
|
||||
IN unsigned long index )
|
||||
{
|
||||
IXML_Node *tempNode;
|
||||
unsigned int i;
|
||||
|
||||
if (nnMap == NULL) {
|
||||
if( nnMap == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (index > ixmlNamedNodeMap_getLength(nnMap) - 1) {
|
||||
if( index > ixmlNamedNodeMap_getLength( nnMap ) - 1 ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tempNode = nnMap->nodeItem;
|
||||
for (i = 0; i < index && tempNode != NULL; ++i) {
|
||||
for( i = 0; i < index && tempNode != NULL; ++i ) {
|
||||
tempNode = tempNode->nextSibling;
|
||||
}
|
||||
|
||||
return tempNode;
|
||||
}
|
||||
|
||||
|
||||
unsigned long ixmlNamedNodeMap_getLength(IXML_NamedNodeMap *nnMap)
|
||||
/*================================================================
|
||||
* NamedNodeMap_getLength
|
||||
* Return the number of Nodes in this map.
|
||||
* External function.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
*=================================================================*/
|
||||
unsigned long
|
||||
ixmlNamedNodeMap_getLength( IN IXML_NamedNodeMap * nnMap )
|
||||
{
|
||||
IXML_Node *tempNode;
|
||||
unsigned long length = 0;
|
||||
|
||||
if (nnMap != NULL) {
|
||||
if( nnMap != NULL ) {
|
||||
tempNode = nnMap->nodeItem;
|
||||
for (length = 0; tempNode != NULL; ++length) {
|
||||
for( length = 0; tempNode != NULL; ++length ) {
|
||||
tempNode = tempNode->nextSibling;
|
||||
}
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
void ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap)
|
||||
/*================================================================
|
||||
* ixmlNamedNodeMap_free
|
||||
* frees a NamedNodeMap.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNamedNodeMap_free( IXML_NamedNodeMap * nnMap )
|
||||
{
|
||||
IXML_NamedNodeMap *pNext;
|
||||
|
||||
while (nnMap != NULL) {
|
||||
while( nnMap != NULL ) {
|
||||
pNext = nnMap->next;
|
||||
free(nnMap);
|
||||
free( nnMap );
|
||||
nnMap = pNext;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int ixmlNamedNodeMap_addToNamedNodeMap(
|
||||
IXML_NamedNodeMap **nnMap,
|
||||
IXML_Node *add)
|
||||
/*================================================================
|
||||
* NamedNodeMap_addToNamedNodeMap
|
||||
* add a node to a NamedNodeMap.
|
||||
* Internal to parser only.
|
||||
* Parameters:
|
||||
* add: the node to add into NamedNodeMap.
|
||||
* Return:
|
||||
* IXML_SUCCESS or failure.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlNamedNodeMap_addToNamedNodeMap( IN IXML_NamedNodeMap ** nnMap,
|
||||
IN IXML_Node * add )
|
||||
{
|
||||
IXML_NamedNodeMap *traverse = NULL;
|
||||
IXML_NamedNodeMap *p = NULL;
|
||||
IXML_NamedNodeMap *traverse = NULL,
|
||||
*p = NULL;
|
||||
IXML_NamedNodeMap *newItem = NULL;
|
||||
|
||||
if(add == NULL) {
|
||||
if( add == NULL ) {
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
|
||||
if (*nnMap == NULL) {
|
||||
// nodelist is empty
|
||||
*nnMap = (IXML_NamedNodeMap *)malloc(sizeof (IXML_NamedNodeMap));
|
||||
if (*nnMap == NULL) {
|
||||
if( *nnMap == NULL ) // nodelist is empty
|
||||
{
|
||||
*nnMap =
|
||||
( IXML_NamedNodeMap * ) malloc( sizeof( IXML_NamedNodeMap ) );
|
||||
if( *nnMap == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
ixmlNamedNodeMap_init(*nnMap);
|
||||
ixmlNamedNodeMap_init( *nnMap );
|
||||
}
|
||||
if ((*nnMap)->nodeItem == NULL) {
|
||||
(*nnMap)->nodeItem = add;
|
||||
|
||||
if( ( *nnMap )->nodeItem == NULL ) {
|
||||
( *nnMap )->nodeItem = add;
|
||||
} else {
|
||||
traverse = *nnMap;
|
||||
p = traverse;
|
||||
while (traverse != NULL) {
|
||||
while( traverse != NULL ) {
|
||||
p = traverse;
|
||||
traverse = traverse->next;
|
||||
}
|
||||
newItem = (IXML_NamedNodeMap *)malloc(sizeof (IXML_NamedNodeMap));
|
||||
if (newItem == NULL) {
|
||||
|
||||
newItem =
|
||||
( IXML_NamedNodeMap * ) malloc( sizeof( IXML_NamedNodeMap ) );
|
||||
if( newItem == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
p->next = newItem;
|
||||
@@ -192,4 +240,3 @@ int ixmlNamedNodeMap_addToNamedNodeMap(
|
||||
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
1636
ixml/src/node.c
1636
ixml/src/node.c
File diff suppressed because it is too large
Load Diff
@@ -1,118 +1,128 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "ixmlparser.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void ixmlNodeList_init(IXML_NodeList *nList)
|
||||
/*================================================================
|
||||
* ixmlNodeList_init
|
||||
* initializes a nodelist
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNodeList_init( IXML_NodeList * nList )
|
||||
{
|
||||
assert(nList != NULL);
|
||||
assert( nList != NULL );
|
||||
|
||||
memset( nList, 0, sizeof( IXML_NodeList ) );
|
||||
|
||||
memset(nList, 0, sizeof (IXML_NodeList));
|
||||
}
|
||||
|
||||
|
||||
IXML_Node *ixmlNodeList_item(
|
||||
IXML_NodeList *nList,
|
||||
unsigned long index)
|
||||
/*================================================================
|
||||
* ixmlNodeList_item
|
||||
* Returns the indexth item in the collection. If index is greater
|
||||
* than or equal to the number of nodes in the list, this returns
|
||||
* null.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Node *
|
||||
ixmlNodeList_item( IXML_NodeList * nList,
|
||||
unsigned long index )
|
||||
{
|
||||
IXML_NodeList *next;
|
||||
unsigned int i;
|
||||
|
||||
// if the list ptr is NULL
|
||||
if (nList == NULL) {
|
||||
if( nList == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
// if index is more than list length
|
||||
if (index > ixmlNodeList_length(nList) - 1) {
|
||||
if( index > ixmlNodeList_length( nList ) - 1 ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
next = nList;
|
||||
for (i = 0; i < index && next != NULL; ++i) {
|
||||
for( i = 0; i < index && next != NULL; ++i ) {
|
||||
next = next->next;
|
||||
}
|
||||
|
||||
if (next == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if( next == NULL ) return NULL;
|
||||
|
||||
return next->nodeItem;
|
||||
|
||||
}
|
||||
|
||||
int ixmlNodeList_addToNodeList(
|
||||
IXML_NodeList **nList,
|
||||
IXML_Node *add)
|
||||
/*================================================================
|
||||
* ixmlNodeList_addToNodeList
|
||||
* Add a node to nodelist
|
||||
* Internal to parser only.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlNodeList_addToNodeList( IN IXML_NodeList ** nList,
|
||||
IN IXML_Node * add )
|
||||
{
|
||||
IXML_NodeList *traverse = NULL;
|
||||
IXML_NodeList *p = NULL;
|
||||
IXML_NodeList *traverse,
|
||||
*p = NULL;
|
||||
IXML_NodeList *newListItem;
|
||||
|
||||
assert(add != NULL);
|
||||
assert( add != NULL );
|
||||
|
||||
if (add == NULL) {
|
||||
if( add == NULL ) {
|
||||
return IXML_FAILED;
|
||||
}
|
||||
|
||||
if (*nList == NULL) {
|
||||
// nodelist is empty
|
||||
*nList = (IXML_NodeList *)malloc(sizeof (IXML_NodeList));
|
||||
if (*nList == NULL) {
|
||||
if( *nList == NULL ) // nodelist is empty
|
||||
{
|
||||
*nList = ( IXML_NodeList * ) malloc( sizeof( IXML_NodeList ) );
|
||||
if( *nList == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
|
||||
ixmlNodeList_init(*nList);
|
||||
ixmlNodeList_init( *nList );
|
||||
}
|
||||
|
||||
if ((*nList)->nodeItem == NULL) {
|
||||
(*nList)->nodeItem = add;
|
||||
if( ( *nList )->nodeItem == NULL ) {
|
||||
( *nList )->nodeItem = add;
|
||||
} else {
|
||||
traverse = *nList;
|
||||
while (traverse != NULL) {
|
||||
while( traverse != NULL ) {
|
||||
p = traverse;
|
||||
traverse = traverse->next;
|
||||
}
|
||||
|
||||
newListItem = (IXML_NodeList *)malloc(sizeof (IXML_NodeList));
|
||||
if (newListItem == NULL) {
|
||||
newListItem =
|
||||
( IXML_NodeList * ) malloc( sizeof( IXML_NodeList ) );
|
||||
if( newListItem == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
p->next = newListItem;
|
||||
@@ -123,14 +133,21 @@ int ixmlNodeList_addToNodeList(
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
unsigned long ixmlNodeList_length(IXML_NodeList *nList)
|
||||
/*================================================================
|
||||
* ixmlNodeList_length
|
||||
* Returns the number of nodes in the list. The range of valid
|
||||
* child node indices is 0 to length-1 inclusive.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
unsigned long
|
||||
ixmlNodeList_length( IN IXML_NodeList * nList )
|
||||
{
|
||||
IXML_NodeList *list;
|
||||
unsigned long length = 0;
|
||||
|
||||
list = nList;
|
||||
while (list != NULL) {
|
||||
while( list != NULL ) {
|
||||
++length;
|
||||
list = list->next;
|
||||
}
|
||||
@@ -138,15 +155,22 @@ unsigned long ixmlNodeList_length(IXML_NodeList *nList)
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
void ixmlNodeList_free(IXML_NodeList *nList)
|
||||
/*================================================================
|
||||
* ixmlNodeList_free
|
||||
* frees a nodeList
|
||||
* External function
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNodeList_free( IN IXML_NodeList * nList )
|
||||
{
|
||||
IXML_NodeList *next;
|
||||
|
||||
while (nList != NULL) {
|
||||
while( nList != NULL ) {
|
||||
next = nList->next;
|
||||
free(nList);
|
||||
|
||||
free( nList );
|
||||
nList = next;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,6 +6,6 @@ includedir=@includedir@
|
||||
Name: libupnp
|
||||
Description: Linux SDK for UPnP Devices
|
||||
Version: @VERSION@
|
||||
Libs: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml
|
||||
Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml
|
||||
Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Version: 1.6.9
|
||||
Version: 1.6.6
|
||||
Summary: Universal Plug and Play (UPnP) SDK
|
||||
Name: libupnp
|
||||
Release: 1%{?dist}
|
||||
|
||||
@@ -29,24 +29,14 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef FREE_LIST_H
|
||||
#define FREE_LIST_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "ithread.h"
|
||||
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
@@ -29,32 +29,21 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#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
|
||||
*
|
||||
@@ -63,7 +52,6 @@ extern "C" {
|
||||
*****************************************************************************/
|
||||
typedef void (*free_function)(void *arg);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmp_routine
|
||||
*
|
||||
@@ -73,7 +61,6 @@ typedef void (*free_function)(void *arg);
|
||||
*****************************************************************************/
|
||||
typedef int (*cmp_routine)(void *itemA,void *itemB);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ListNode
|
||||
*
|
||||
@@ -88,7 +75,6 @@ typedef struct LISTNODE
|
||||
void *item;
|
||||
} ListNode;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: LinkedList
|
||||
*
|
||||
@@ -118,7 +104,6 @@ typedef struct LINKEDLIST
|
||||
cmp_routine cmp_func; /* compare function to use */
|
||||
} LinkedList;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListInit
|
||||
*
|
||||
@@ -134,7 +119,6 @@ typedef struct LINKEDLIST
|
||||
*****************************************************************************/
|
||||
int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddHead
|
||||
*
|
||||
@@ -151,7 +135,6 @@ int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func);
|
||||
*****************************************************************************/
|
||||
ListNode *ListAddHead(LinkedList *list, void *item);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddTail
|
||||
*
|
||||
@@ -168,7 +151,6 @@ ListNode *ListAddHead(LinkedList *list, void *item);
|
||||
*****************************************************************************/
|
||||
ListNode *ListAddTail(LinkedList *list, void *item);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddAfter
|
||||
*
|
||||
@@ -223,7 +205,6 @@ ListNode *ListAddBefore(LinkedList *list,void *item, ListNode *anode);
|
||||
*****************************************************************************/
|
||||
void *ListDelNode(LinkedList *list,ListNode *dnode, int freeItem);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListDestroy
|
||||
*
|
||||
@@ -259,7 +240,6 @@ int ListDestroy(LinkedList *list, int freeItem);
|
||||
*****************************************************************************/
|
||||
ListNode* ListHead(LinkedList *list);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListTail
|
||||
*
|
||||
@@ -276,7 +256,6 @@ ListNode* ListHead(LinkedList *list);
|
||||
*****************************************************************************/
|
||||
ListNode* ListTail(LinkedList *list);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListNext
|
||||
*
|
||||
@@ -293,7 +272,6 @@ ListNode* ListTail(LinkedList *list);
|
||||
*****************************************************************************/
|
||||
ListNode* ListNext(LinkedList *list, ListNode * node);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListPrev
|
||||
*
|
||||
@@ -310,7 +288,6 @@ ListNode* ListNext(LinkedList *list, ListNode * node);
|
||||
*****************************************************************************/
|
||||
ListNode* ListPrev(LinkedList *list, ListNode * node);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListFind
|
||||
*
|
||||
@@ -330,7 +307,6 @@ ListNode* ListPrev(LinkedList *list, ListNode * node);
|
||||
*****************************************************************************/
|
||||
ListNode* ListFind(LinkedList *list, ListNode *start, void * item);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListSize
|
||||
*
|
||||
|
||||
@@ -29,28 +29,60 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef THREADPOOL_H
|
||||
#define THREADPOOL_H
|
||||
|
||||
#ifdef UPNP_USE_MSVCPP
|
||||
#define UPNP_INLINE
|
||||
#else
|
||||
#define UPNP_INLINE inline
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
#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;
|
||||
|
||||
#define DEFAULT_PRIORITY MED_PRIORITY /* default priority used by TPJobInit */
|
||||
#define DEFAULT_MIN_THREADS 1 /* default minimum used by TPAttrInit */
|
||||
#define DEFAULT_MAX_THREADS 10 /* default max used by TPAttrInit */
|
||||
#define DEFAULT_JOBS_PER_THREAD 10 /* default jobs per thread used by TPAttrInit */
|
||||
#define DEFAULT_STARVATION_TIME 500 /* default starvation time used by TPAttrInit */
|
||||
#define DEFAULT_IDLE_TIME 10 * 1000 /* default idle time used by TPAttrInit */
|
||||
#define DEFAULT_FREE_ROUTINE NULL /* default free routine used TPJobInit */
|
||||
#define DEFAULT_MAX_JOBS_TOTAL 100 /* default max jobs used TPAttrInit */
|
||||
|
||||
/* Statistics */
|
||||
/* always include stats because code change is minimal */
|
||||
#define STATS 1
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define DEBUG 1
|
||||
#endif
|
||||
|
||||
#include "FreeList.h"
|
||||
#include "ithread.h"
|
||||
#include "LinkedList.h"
|
||||
#include "UpnpInet.h"
|
||||
#include "UpnpGlobal.h" /* for UPNP_INLINE, EXPORT_SPEC */
|
||||
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <time.h>
|
||||
#include <winsock2.h>
|
||||
struct timezone
|
||||
{
|
||||
int tz_minuteswest; /* minutes W of Greenwich */
|
||||
@@ -58,105 +90,19 @@
|
||||
};
|
||||
int gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
#else /* WIN32 */
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h> /* for gettimeofday() */
|
||||
#if defined(__OSX__) || defined(__APPLE__) || defined(__NetBSD__)
|
||||
#include <sys/resource.h> /* for setpriority() */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#include "FreeList.h"
|
||||
|
||||
#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 stack size used by TPAttrInit */
|
||||
#define DEFAULT_STACK_SIZE 0
|
||||
|
||||
|
||||
/*! 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
|
||||
#include "ithread.h"
|
||||
#include <errno.h>
|
||||
|
||||
#define EXPORT
|
||||
|
||||
typedef int PolicyType;
|
||||
|
||||
|
||||
#define DEFAULT_POLICY SCHED_OTHER
|
||||
|
||||
#define DEFAULT_SCHED_PARAM 0 /* default priority */
|
||||
|
||||
/****************************************************************************
|
||||
* Name: free_routine
|
||||
@@ -166,7 +112,6 @@ typedef int PolicyType;
|
||||
*****************************************************************************/
|
||||
typedef void (*free_routine)(void *arg);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ThreadPoolAttr
|
||||
*
|
||||
@@ -182,10 +127,6 @@ typedef struct THREADPOOLATTR
|
||||
/* maxThreads, ThreadPool will never have more than this number of threads */
|
||||
int maxThreads;
|
||||
|
||||
/* stackSize (in bytes), this is the minimum stack size allocated for each
|
||||
* thread */
|
||||
size_t stackSize;
|
||||
|
||||
/* maxIdleTime (in milliseconds) this is the maximum time a thread will
|
||||
* remain idle before dying */
|
||||
int maxIdleTime;
|
||||
@@ -204,7 +145,6 @@ typedef struct THREADPOOLATTR
|
||||
PolicyType schedPolicy;
|
||||
} ThreadPoolAttr;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ThreadPool
|
||||
*
|
||||
@@ -221,13 +161,13 @@ typedef struct THREADPOOLJOB
|
||||
int jobId;
|
||||
} ThreadPoolJob;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ThreadPoolStats
|
||||
*
|
||||
* Description:
|
||||
* Structure to hold statistics
|
||||
*****************************************************************************/
|
||||
|
||||
typedef struct TPOOLSTATS
|
||||
{
|
||||
double totalTimeHQ;
|
||||
@@ -252,12 +192,15 @@ typedef struct TPOOLSTATS
|
||||
} ThreadPoolStats;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief A thread pool similar to the thread pool in the UPnP SDK.
|
||||
/****************************************************************************
|
||||
* Name: ThreadPool
|
||||
*
|
||||
* Description:
|
||||
* 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
|
||||
* 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
|
||||
@@ -266,22 +209,25 @@ typedef struct TPOOLSTATS
|
||||
* 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 */
|
||||
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 */
|
||||
@@ -289,6 +235,7 @@ typedef struct THREADPOOL
|
||||
} ThreadPool;
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolInit
|
||||
*
|
||||
@@ -327,7 +274,6 @@ typedef struct THREADPOOL
|
||||
*****************************************************************************/
|
||||
int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolAddPersistent
|
||||
*
|
||||
@@ -350,7 +296,6 @@ int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
*****************************************************************************/
|
||||
int ThreadPoolAddPersistent(ThreadPool*tp, ThreadPoolJob *job, int *jobId);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolGetAttr
|
||||
*
|
||||
@@ -365,8 +310,6 @@ int ThreadPoolAddPersistent(ThreadPool*tp, ThreadPoolJob *job, int *jobId);
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolSetAttr
|
||||
*
|
||||
@@ -382,7 +325,6 @@ int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out);
|
||||
*****************************************************************************/
|
||||
int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolAdd
|
||||
*
|
||||
@@ -402,7 +344,6 @@ int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
*****************************************************************************/
|
||||
int ThreadPoolAdd (ThreadPool*tp, ThreadPoolJob *job, int *jobId);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolRemove
|
||||
*
|
||||
@@ -455,7 +396,6 @@ int ThreadPoolShutdown(ThreadPool *tp);
|
||||
*****************************************************************************/
|
||||
int TPJobInit(ThreadPoolJob *job, start_routine func, void *arg);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPJobSetPriority
|
||||
*
|
||||
@@ -469,7 +409,6 @@ int TPJobInit(ThreadPoolJob *job, start_routine func, void *arg);
|
||||
*****************************************************************************/
|
||||
int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPJobSetFreeFunction
|
||||
*
|
||||
@@ -483,7 +422,6 @@ int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority);
|
||||
*****************************************************************************/
|
||||
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrInit
|
||||
*
|
||||
@@ -497,7 +435,6 @@ int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func);
|
||||
*****************************************************************************/
|
||||
int TPAttrInit(ThreadPoolAttr *attr);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetMaxThreads
|
||||
*
|
||||
@@ -511,7 +448,6 @@ int TPAttrInit(ThreadPoolAttr *attr);
|
||||
*****************************************************************************/
|
||||
int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetMinThreads
|
||||
*
|
||||
@@ -525,21 +461,6 @@ int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads);
|
||||
*****************************************************************************/
|
||||
int TPAttrSetMinThreads(ThreadPoolAttr *attr, int minThreads);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetStackSize
|
||||
*
|
||||
* Description:
|
||||
* Sets the stack size for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* stackSize - value to set
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrSetStackSize(ThreadPoolAttr *attr, size_t stackSize);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetIdleTime
|
||||
*
|
||||
@@ -552,7 +473,6 @@ int TPAttrSetStackSize(ThreadPoolAttr *attr, size_t stackSize);
|
||||
*****************************************************************************/
|
||||
int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetJobsPerThread
|
||||
*
|
||||
@@ -566,7 +486,6 @@ int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime);
|
||||
*****************************************************************************/
|
||||
int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetStarvationTime
|
||||
*
|
||||
@@ -580,7 +499,6 @@ int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread);
|
||||
*****************************************************************************/
|
||||
int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetSchedPolicy
|
||||
*
|
||||
@@ -608,7 +526,6 @@ int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy);
|
||||
*****************************************************************************/
|
||||
int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolGetStats
|
||||
*
|
||||
@@ -623,20 +540,18 @@ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal);
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
#ifdef STATS
|
||||
EXPORT_SPEC int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);
|
||||
EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);
|
||||
|
||||
EXPORT_SPEC void ThreadPoolPrintStats(ThreadPoolStats *stats);
|
||||
EXPORT 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 */
|
||||
#endif /* ThreadPool */
|
||||
|
||||
|
||||
@@ -29,45 +29,38 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef TIMERTHREAD_H
|
||||
#define TIMERTHREAD_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "FreeList.h"
|
||||
#include "ithread.h"
|
||||
#include "LinkedList.h"
|
||||
#include "FreeList.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.
|
||||
/****************************************************************************
|
||||
* Name: TimerThread
|
||||
*
|
||||
* Description:
|
||||
* 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
|
||||
*
|
||||
* Uses ThreadPool, Mutex, Condition, Thread.
|
||||
*/
|
||||
*
|
||||
*****************************************************************************/
|
||||
typedef struct TIMERTHREAD
|
||||
{
|
||||
ithread_mutex_t mutex;
|
||||
@@ -80,88 +73,116 @@ typedef struct TIMERTHREAD
|
||||
} TimerThread;
|
||||
|
||||
|
||||
/*!
|
||||
* Struct to contain information for a timer event.
|
||||
/****************************************************************************
|
||||
* Name: TimerEvent
|
||||
*
|
||||
* Internal to the TimerThread.
|
||||
*/
|
||||
* Description:
|
||||
*
|
||||
* 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;
|
||||
time_t eventTime; /* absolute time for event in seconds since Jan 1, 1970 */
|
||||
Duration persistent; /* long term or short term job */
|
||||
int id;
|
||||
} TimerEvent;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Initializes and starts timer thread.
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadInit
|
||||
*
|
||||
* \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. */
|
||||
* Description:
|
||||
* Initializes and starts timer thread.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* tp - valid thread pool to use. Must be
|
||||
* started. Must be valid for lifetime
|
||||
* of timer. Timer must be shutdown
|
||||
* BEFORE thread pool.
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* Returns error from ThreadPoolAddPersistent on failure.
|
||||
*
|
||||
************************************************************************/
|
||||
int TimerThreadInit(TimerThread *timer,
|
||||
ThreadPool *tp);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Schedules an event to run at a specified time.
|
||||
/************************************************************************
|
||||
* Function: TimerThreadSchedule
|
||||
*
|
||||
* \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. */
|
||||
* Description:
|
||||
* Schedules an event to run at a specified time.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* time_t - time of event.
|
||||
* either in absolute seconds,
|
||||
* or relative seconds in the future.
|
||||
* timeoutType - either ABS_SEC, or REL_SEC.
|
||||
* if REL_SEC, then the event
|
||||
* will be scheduled at the
|
||||
* current time + REL_SEC.
|
||||
* job-> valid Thread pool job with following fields
|
||||
* func - function to schedule
|
||||
* arg - argument to function
|
||||
* priority - priority of job.
|
||||
*
|
||||
* id - id of timer event. (out, can be null)
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* EOUTOFMEM if not enough memory to schedule job.
|
||||
*
|
||||
************************************************************************/
|
||||
int TimerThreadSchedule(TimerThread* timer,
|
||||
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.
|
||||
/************************************************************************
|
||||
* Function: TimerThreadRemove
|
||||
*
|
||||
* Events can only be removed before they have been placed in the thread pool.
|
||||
* Description:
|
||||
* 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. */
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* id - id of event to remove.
|
||||
* ThreadPoolJob *out - space for thread pool job.
|
||||
* Return:
|
||||
* 0 on success,
|
||||
* INVALID_EVENT_ID on failure
|
||||
*
|
||||
************************************************************************/
|
||||
int TimerThreadRemove(TimerThread *timer,
|
||||
int id,
|
||||
/*! [in] Space for thread pool job. */
|
||||
ThreadPoolJob *out);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Shutdown the timer thread.
|
||||
/************************************************************************
|
||||
* Function: TimerThreadShutdown
|
||||
*
|
||||
* Description:
|
||||
* 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);
|
||||
|
||||
* Timer thread should be shutdown BEFORE it's associated
|
||||
* thread pool.
|
||||
* Returns:
|
||||
* returns 0 if succesfull,
|
||||
* nonzero otherwise.
|
||||
* Always returns 0.
|
||||
***********************************************************************/
|
||||
int TimerThreadShutdown(TimerThread *timer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -29,42 +29,22 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef ITHREAD_H
|
||||
#define ITHREAD_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#if !defined(WIN32)
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include "UpnpGlobal.h" /* For UPNP_INLINE, EXPORT_SPEC */
|
||||
|
||||
|
||||
#ifndef ITHREADH
|
||||
#define ITHREADH
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include <pthread.h>
|
||||
#ifdef WIN32
|
||||
/* Do not #include <unistd.h> */
|
||||
#else
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(BSD)
|
||||
#ifdef __FreeBSD__
|
||||
#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
|
||||
@@ -86,9 +66,6 @@ extern "C" {
|
||||
#define ITHREAD_CANCELED PTHREAD_CANCELED
|
||||
|
||||
|
||||
#define ITHREAD_STACK_MIN PTHREAD_STACK_MIN
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Name: ithread_t
|
||||
*
|
||||
@@ -99,7 +76,6 @@ extern "C" {
|
||||
***************************************************************************/
|
||||
typedef pthread_t ithread_t;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ithread_attr_t
|
||||
*
|
||||
@@ -118,7 +94,7 @@ typedef pthread_attr_t ithread_attr_t;
|
||||
* Thread start routine
|
||||
* Internal Use Only.
|
||||
***************************************************************************/
|
||||
typedef void *(*start_routine)(void *arg);
|
||||
typedef void * (*start_routine) (void *arg);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -174,9 +150,7 @@ typedef pthread_condattr_t ithread_condattr_t;
|
||||
* typedef to pthread_rwlockattr_t
|
||||
* Internal Use Only
|
||||
***************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
typedef pthread_rwlockattr_t ithread_rwlockattr_t;
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -187,101 +161,7 @@ typedef pthread_rwlockattr_t ithread_rwlockattr_t;
|
||||
* typedef to pthread_rwlock_t
|
||||
* Internal Use Only
|
||||
***************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
typedef pthread_rwlock_t ithread_rwlock_t;
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
typedef ithread_mutex_t ithread_rwlock_t;
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* 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;
|
||||
}
|
||||
|
||||
typedef pthread_rwlock_t ithread_rwlock_t;
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_mutexattr_init
|
||||
@@ -340,7 +220,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
|
||||
#else
|
||||
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_mutexattr_getkind_np
|
||||
@@ -365,7 +245,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
|
||||
#else
|
||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -453,9 +333,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlockattr_init
|
||||
***************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockattr_init pthread_rwlockattr_init
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlockattr_init pthread_rwlockattr_init
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -471,9 +349,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlockattr_destroy
|
||||
***************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockattr_destroy pthread_rwlockattr_destroy
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlockattr_destroy pthread_rwlockattr_destroy
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -494,9 +370,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Returns EINVAL if the kind is not supported.
|
||||
* See man page for pthread_rwlockattr_setkind_np
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -517,9 +391,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlockatttr_getpshared
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -530,19 +402,15 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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
|
||||
* 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
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_init pthread_rwlock_init
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_init ithread_mutex_init
|
||||
#endif
|
||||
#define ithread_rwlock_init pthread_rwlock_init
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_rwlock_rdlock
|
||||
@@ -550,7 +418,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Description:
|
||||
* Locks rwlock for reading.
|
||||
* Parameters:
|
||||
* ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||
* rwlock must be initialized.
|
||||
*
|
||||
* Returns:
|
||||
@@ -558,12 +426,8 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_rdlock
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_rdlock pthread_rwlock_rdlock
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_rdlock ithread_mutex_lock
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlock_rdlock pthread_rwlock_rdlock
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_rwlock_wrlock
|
||||
@@ -571,7 +435,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Description:
|
||||
* Locks rwlock for writting.
|
||||
* Parameters:
|
||||
* ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||
* rwlock must be initialized.
|
||||
*
|
||||
* Returns:
|
||||
@@ -579,12 +443,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_wrlock
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_wrlock pthread_rwlock_wrlock
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_wrlock ithread_mutex_lock
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlock_wrlock pthread_rwlock_wrlock
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -594,7 +453,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Unlocks rwlock.
|
||||
*
|
||||
* Parameters:
|
||||
* ithread_rwlock_t *rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||
* ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t)
|
||||
* rwlock must be initialized.
|
||||
*
|
||||
* Returns:
|
||||
@@ -602,12 +461,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_unlock
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_unlock pthread_rwlock_unlock
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_unlock ithread_mutex_unlock
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlock_unlock pthread_rwlock_unlock
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -619,19 +473,14 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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)
|
||||
* 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
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_destroy pthread_rwlock_destroy
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_destroy ithread_mutex_destroy
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
#define ithread_rwlock_destroy pthread_rwlock_destroy
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -641,8 +490,8 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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)
|
||||
* 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
|
||||
@@ -650,6 +499,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
#define ithread_cond_init pthread_cond_init
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_cond_signal
|
||||
*
|
||||
@@ -657,7 +507,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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 valid non NULL pointer to
|
||||
* ithread_cond_t)
|
||||
* cond must be initialized
|
||||
* Returns:
|
||||
@@ -674,7 +524,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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 valid non NULL pointer to
|
||||
* ithread_cond_t)
|
||||
* cond must be initialized
|
||||
* Returns:
|
||||
@@ -692,7 +542,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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 valid non NULL pointer to
|
||||
* ithread_cond_t)
|
||||
* cond must be initialized
|
||||
* ithread_mutex_t *mutex (must be valid non NULL pointer to
|
||||
@@ -709,18 +559,22 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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
|
||||
* 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.
|
||||
* 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)
|
||||
* 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)
|
||||
* 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)
|
||||
* 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
|
||||
@@ -736,7 +590,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 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 valid non NULL pointer to
|
||||
* ithread_cond_t)
|
||||
* cond must be initialized.
|
||||
* Returns:
|
||||
@@ -745,49 +599,6 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
***************************************************************************/
|
||||
#define ithread_cond_destroy pthread_cond_destroy
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_attr_init
|
||||
*
|
||||
* Description:
|
||||
* Initialises thread attribute object.
|
||||
* Parameters:
|
||||
* ithread_attr_t *attr (must be valid non NULL pointer to
|
||||
* ithread_attr_t)
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* See man page for pthread_attr_init
|
||||
***************************************************************************/
|
||||
#define ithread_attr_init pthread_attr_init
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_attr_destroy
|
||||
*
|
||||
* Description:
|
||||
* Destroys thread attribute object.
|
||||
* Parameters:
|
||||
* ithread_attr_t *attr (must be valid non NULL pointer to
|
||||
* ithread_attr_t)
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* See man page for pthread_attr_destroy
|
||||
***************************************************************************/
|
||||
#define ithread_attr_destroy pthread_attr_destroy
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_attr_setstacksize
|
||||
*
|
||||
* Description:
|
||||
* Sets stack size of a thread attribute object.
|
||||
* Parameters:
|
||||
* ithread_attr_t *attr (must be valid non NULL pointer to
|
||||
* ithread_attr_t)
|
||||
* size_t stacksize (value of stacksize must be greater than
|
||||
* ITHREAD_STACK_MIN and lower than system-imposed limits
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* See man page for pthread_attr_setstacksize
|
||||
***************************************************************************/
|
||||
#define ithread_attr_setstacksize pthread_attr_setstacksize
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_create
|
||||
@@ -797,7 +608,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* and argument.
|
||||
* Parameters:
|
||||
* ithread_t * thread (must be valid non NULL pointer to pthread_t)
|
||||
* ithread_attr_t *attr
|
||||
* ithread_attr_t *attr, IGNORED
|
||||
* void * (start_routine) (void *arg) (start routine)
|
||||
* void * arg - argument.
|
||||
* Returns:
|
||||
@@ -835,7 +646,6 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
***************************************************************************/
|
||||
#define ithread_exit pthread_exit
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_get_current_thread_id
|
||||
*
|
||||
@@ -859,7 +669,6 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
***************************************************************************/
|
||||
#define ithread_self pthread_self
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_detach
|
||||
*
|
||||
@@ -873,7 +682,6 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
***************************************************************************/
|
||||
#define ithread_detach pthread_detach
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_join
|
||||
*
|
||||
@@ -893,6 +701,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
#define ithread_join pthread_join
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: isleep
|
||||
*
|
||||
@@ -906,13 +715,12 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 0 on success, Nonzero on failure.
|
||||
* See man page for sleep (man 3 sleep)
|
||||
*****************************************************************************/
|
||||
#ifdef WIN32
|
||||
#define isleep(x) Sleep((x)*1000)
|
||||
#ifndef WIN32
|
||||
#define isleep sleep
|
||||
#else
|
||||
#define isleep sleep
|
||||
#define isleep(x) Sleep((x)*1000)
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: isleep
|
||||
*
|
||||
@@ -926,10 +734,25 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* 0 on success, Nonzero on failure.
|
||||
* See man page for sleep (man 3 sleep)
|
||||
*****************************************************************************/
|
||||
#ifdef WIN32
|
||||
#define imillisleep Sleep
|
||||
#ifndef WIN32
|
||||
#define imillisleep(x) usleep(1000*x)
|
||||
#else
|
||||
#define imillisleep(x) usleep(1000*x)
|
||||
#define imillisleep Sleep
|
||||
#endif
|
||||
|
||||
#ifdef WIN32
|
||||
#ifndef 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
|
||||
#define EXPORT_SPEC __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define EXPORT_SPEC
|
||||
#endif
|
||||
#else
|
||||
#define EXPORT_SPEC
|
||||
#endif
|
||||
|
||||
|
||||
@@ -938,11 +761,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* ITHREAD_H */
|
||||
#endif /* ITHREADH */
|
||||
|
||||
|
||||
@@ -1,55 +1,45 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <sys/param.h> */
|
||||
#else
|
||||
#ifndef WIN32
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
|
||||
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__)
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
static int
|
||||
freeListNode( ListNode * node,
|
||||
LinkedList * list )
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,69 +1,68 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "TimerThread.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Deallocates a dynamically allocated TimerEvent.
|
||||
*/
|
||||
static void FreeTimerEvent(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread *timer,
|
||||
/*! [in] Must be allocated with CreateTimerEvent*/
|
||||
TimerEvent *event)
|
||||
/****************************************************************************
|
||||
* Function: FreeTimerEvent
|
||||
*
|
||||
* Description:
|
||||
* Deallocates a dynamically allocated TimerEvent.
|
||||
* Parameters:
|
||||
* TimerEvent *event - must be allocated with CreateTimerEvent
|
||||
*****************************************************************************/
|
||||
static void
|
||||
FreeTimerEvent( TimerThread * timer,
|
||||
TimerEvent * event )
|
||||
{
|
||||
assert(timer != NULL);
|
||||
|
||||
FreeListFree(&timer->freeEvents, event);
|
||||
assert( timer != NULL );
|
||||
|
||||
FreeListFree( &timer->freeEvents, event );
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Implements timer thread.
|
||||
/****************************************************************************
|
||||
* Function: TimerThreadWorker
|
||||
*
|
||||
* Waits for next event to occur and schedules associated job into threadpool.
|
||||
*/
|
||||
static void *TimerThreadWorker(
|
||||
/*! [in] arg is cast to (TimerThread *). */
|
||||
void *arg)
|
||||
* Description:
|
||||
* Implements timer thread.
|
||||
* Waits for next event to occur and schedules
|
||||
* associated job into threadpool.
|
||||
* Internal Only.
|
||||
* Parameters:
|
||||
* void * arg -> is cast to TimerThread *
|
||||
*****************************************************************************/
|
||||
static void *
|
||||
TimerThreadWorker( void *arg )
|
||||
{
|
||||
TimerThread *timer = ( TimerThread * ) arg;
|
||||
ListNode *head = NULL;
|
||||
@@ -82,14 +81,19 @@ static void *TimerThreadWorker(
|
||||
|
||||
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;
|
||||
@@ -98,6 +102,7 @@ static void *TimerThreadWorker(
|
||||
if( timer->eventQ.size > 0 )
|
||||
{
|
||||
head = ListHead( &timer->eventQ );
|
||||
|
||||
nextEvent = ( TimerEvent * ) head->item;
|
||||
nextEventTime = nextEvent->eventTime;
|
||||
}
|
||||
@@ -105,42 +110,54 @@ static void *TimerThreadWorker(
|
||||
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.
|
||||
/****************************************************************************
|
||||
* Function: CalculateEventTime
|
||||
*
|
||||
* \return
|
||||
*/
|
||||
static int CalculateEventTime(
|
||||
/*! [in] Timeout. */
|
||||
time_t *timeout,
|
||||
/*! [in] Timeout type. */
|
||||
TimeoutType type)
|
||||
* Description:
|
||||
* Calculates the appropriate timeout in absolute seconds since
|
||||
* Jan 1, 1970
|
||||
* Internal Only.
|
||||
* Parameters:
|
||||
* time_t *timeout - timeout
|
||||
*
|
||||
*****************************************************************************/
|
||||
static int
|
||||
CalculateEventTime( time_t * timeout,
|
||||
TimeoutType type )
|
||||
{
|
||||
time_t now;
|
||||
|
||||
@@ -158,22 +175,29 @@ static int CalculateEventTime(
|
||||
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Creates a Timer Event. (Dynamically allocated).
|
||||
/****************************************************************************
|
||||
* Function: CreateTimerEvent
|
||||
*
|
||||
* \return (TimerEvent *) on success, NULL on failure.
|
||||
*/
|
||||
static TimerEvent *CreateTimerEvent(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread *timer,
|
||||
/*! [in] . */
|
||||
ThreadPoolJob *job,
|
||||
/*! [in] . */
|
||||
* Description:
|
||||
* Creates a Timer Event. (Dynamically allocated)
|
||||
* Internal to timer thread.
|
||||
* Parameters:
|
||||
* func - thread function to run.
|
||||
* arg - argument to function.
|
||||
* priority - priority of job.
|
||||
* eventTime - the absoule time of the event
|
||||
* in seconds from Jan, 1970
|
||||
* id - id of job
|
||||
*
|
||||
* Returns:
|
||||
* TimerEvent * on success, NULL on failure.
|
||||
****************************************************************************/
|
||||
static TimerEvent *
|
||||
CreateTimerEvent( TimerThread * timer,
|
||||
ThreadPoolJob * job,
|
||||
Duration persistent,
|
||||
/*! [in] The absoule time of the event in seconds from Jan, 1970. */
|
||||
time_t eventTime,
|
||||
/*! [in] Id of job. */
|
||||
int id)
|
||||
int id )
|
||||
{
|
||||
TimerEvent *temp = NULL;
|
||||
|
||||
@@ -191,8 +215,25 @@ static TimerEvent *CreateTimerEvent(
|
||||
return temp;
|
||||
}
|
||||
|
||||
|
||||
int TimerThreadInit(TimerThread *timer, ThreadPool *tp)
|
||||
/************************************************************************
|
||||
* Function: TimerThreadInit
|
||||
*
|
||||
* Description:
|
||||
* Initializes and starts timer thread.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* tp - valid thread pool to use. Must be
|
||||
* started. Must be valid for lifetime
|
||||
* of timer. Timer must be shutdown
|
||||
* BEFORE thread pool.
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* Returns error from ThreadPoolAddPersistent if failure.
|
||||
************************************************************************/
|
||||
int
|
||||
TimerThreadInit( TimerThread * timer,
|
||||
ThreadPool * tp )
|
||||
{
|
||||
|
||||
int rc = 0;
|
||||
@@ -249,14 +290,37 @@ int TimerThreadInit(TimerThread *timer, ThreadPool *tp)
|
||||
|
||||
}
|
||||
|
||||
|
||||
int TimerThreadSchedule(
|
||||
TimerThread *timer,
|
||||
/************************************************************************
|
||||
* Function: TimerThreadSchedule
|
||||
*
|
||||
* Description:
|
||||
* Schedules an event to run at a specified time.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* time_t - time of event.
|
||||
* either in absolute seconds,
|
||||
* or relative seconds in the future.
|
||||
* timeoutType - either ABS_SEC, or REL_SEC.
|
||||
* if REL_SEC, then the event
|
||||
* will be scheduled at the
|
||||
* current time + REL_SEC.
|
||||
*
|
||||
* func - function to schedule
|
||||
* arg - argument to function
|
||||
* priority - priority of job.
|
||||
* id - id of timer event. (out)
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* EOUTOFMEM if not enough memory to schedule job
|
||||
************************************************************************/
|
||||
int
|
||||
TimerThreadSchedule( TimerThread * timer,
|
||||
time_t timeout,
|
||||
TimeoutType type,
|
||||
ThreadPoolJob *job,
|
||||
ThreadPoolJob * job,
|
||||
Duration duration,
|
||||
int *id)
|
||||
int *id )
|
||||
{
|
||||
|
||||
int rc = EOUTOFMEM;
|
||||
@@ -330,11 +394,28 @@ int TimerThreadSchedule(
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
int TimerThreadRemove(
|
||||
TimerThread *timer,
|
||||
/************************************************************************
|
||||
* Function: TimerThreadRemove
|
||||
*
|
||||
* Description:
|
||||
* Removes an event from the timer Q.
|
||||
* Events can only be removed
|
||||
* before they have been placed in the
|
||||
* thread pool.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* id - id of event to remove.
|
||||
* out - space for returned job (Can be NULL)
|
||||
* Return:
|
||||
* 0 on success.
|
||||
* INVALID_EVENT_ID on error.
|
||||
*
|
||||
************************************************************************/
|
||||
int
|
||||
TimerThreadRemove( TimerThread * timer,
|
||||
int id,
|
||||
ThreadPoolJob *out)
|
||||
ThreadPoolJob * out )
|
||||
{
|
||||
int rc = INVALID_EVENT_ID;
|
||||
ListNode *tempNode = NULL;
|
||||
@@ -369,8 +450,21 @@ int TimerThreadRemove(
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
int TimerThreadShutdown(TimerThread *timer)
|
||||
/************************************************************************
|
||||
* Function: TimerThreadShutdown
|
||||
*
|
||||
* Description:
|
||||
* Shutdown the timer thread
|
||||
* Events scheduled in the future will NOT be run.
|
||||
* Timer thread should be shutdown BEFORE it's associated
|
||||
* thread pool.
|
||||
* Returns:
|
||||
* returns 0 if succesfull,
|
||||
* nonzero otherwise.
|
||||
* Always returns 0.
|
||||
***********************************************************************/
|
||||
int
|
||||
TimerThreadShutdown( TimerThread * timer )
|
||||
{
|
||||
ListNode *tempNode2 = NULL;
|
||||
ListNode *tempNode = NULL;
|
||||
@@ -423,4 +517,3 @@ int TimerThreadShutdown(TimerThread *timer)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#
|
||||
# "Makefile.am" for "libupnp/upnp"
|
||||
#
|
||||
# Copyright (C) 2005 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
# Copyright (C) 2005 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
#
|
||||
|
||||
SUBDIRS = doc . sample
|
||||
@@ -19,11 +19,8 @@ LDADD = \
|
||||
|
||||
upnpincludedir = $(includedir)/upnp
|
||||
upnpinclude_HEADERS = \
|
||||
inc/UpnpString.h \
|
||||
inc/upnp.h \
|
||||
inc/upnpdebug.h \
|
||||
inc/UpnpGlobal.h \
|
||||
inc/UpnpInet.h
|
||||
inc/upnpdebug.h
|
||||
|
||||
nodist_upnpinclude_HEADERS = inc/upnpconfig.h
|
||||
if ENABLE_TOOLS
|
||||
@@ -49,6 +46,7 @@ libupnp_la_SOURCES = \
|
||||
src/inc/gena_device.h \
|
||||
src/inc/global.h \
|
||||
src/inc/gmtdate.h \
|
||||
src/inc/http_client.h \
|
||||
src/inc/httpparser.h \
|
||||
src/inc/httpreadwrite.h \
|
||||
src/inc/md5.h \
|
||||
@@ -67,12 +65,13 @@ libupnp_la_SOURCES = \
|
||||
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/upnputil.h \
|
||||
src/inc/util.h \
|
||||
src/inc/utilall.h \
|
||||
src/inc/uuid.h \
|
||||
src/inc/VirtualDir.h \
|
||||
src/inc/webserver.h
|
||||
|
||||
# ssdp
|
||||
@@ -111,14 +110,10 @@ libupnp_la_SOURCES += \
|
||||
src/gena/gena_callback2.c
|
||||
|
||||
# api
|
||||
libupnp_la_SOURCES += \
|
||||
src/api/UpnpString.c \
|
||||
src/api/upnpapi.c
|
||||
|
||||
libupnp_la_SOURCES += 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
|
||||
@@ -135,12 +130,6 @@ libupnp_la_SOURCES += \
|
||||
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
|
||||
@@ -149,7 +138,8 @@ test_init_SOURCES = test/test_init.c
|
||||
|
||||
EXTRA_DIST = \
|
||||
LICENSE \
|
||||
m4/libupnp.m4 \
|
||||
src/inc/inet_pton.h \
|
||||
src/inet_pton.c \
|
||||
src/win_dll.c
|
||||
|
||||
|
||||
|
||||
@@ -1,120 +0,0 @@
|
||||
|
||||
|
||||
#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 */
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
|
||||
|
||||
#ifndef UPNPINET_H
|
||||
#define UPNPINET_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief Provides a platform independent way to include TCP/IP types and functions.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <iphlpapi.h>
|
||||
#include <winsock2.h>
|
||||
#include <Ws2tcpip.h>
|
||||
|
||||
#define UpnpCloseSocket closesocket
|
||||
#else
|
||||
#include <sys/param.h>
|
||||
#if (defined(BSD) && BSD >= 199306) || defined (__FreeBSD_kernel__)
|
||||
#include <ifaddrs.h>
|
||||
/* Do not move or remove the include below for "sys/socket"!
|
||||
* Will break FreeBSD builds. */
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <unistd.h> /* for close(). Do not include in WIN32. */
|
||||
#define SOCKET int
|
||||
#define INVALID_SOCKET ((SOCKET)(-1))
|
||||
#define UpnpCloseSocket close
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* UPNPINET_H */
|
||||
|
||||
@@ -1,171 +0,0 @@
|
||||
|
||||
|
||||
#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 */
|
||||
|
||||
|
||||
#include <stdlib.h> /* for size_t */
|
||||
|
||||
|
||||
#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 size_t UpnpString_get_Length(
|
||||
/*! [in] The \em \b this pointer. */
|
||||
const UpnpString *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Truncates the string to the specified lenght, or does nothing
|
||||
* if the current lenght is less than or equal to the requested length.
|
||||
* */
|
||||
EXPORT_SPEC void UpnpString_set_Length(
|
||||
/*! [in] The \em \b this pointer. */
|
||||
UpnpString *p,
|
||||
/*! [in] The requested length. */
|
||||
size_t n);
|
||||
|
||||
|
||||
/*!
|
||||
* \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 int 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 int 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.*/
|
||||
size_t n);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Clears the string, sets its size to zero.
|
||||
*/
|
||||
EXPORT_SPEC void UpnpString_clear(
|
||||
/*! [in] The \em \b this pointer. */
|
||||
UpnpString *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compares two strings for equality. Case matters.
|
||||
*
|
||||
* \return The result of strcmp().
|
||||
*/
|
||||
EXPORT_SPEC int UpnpString_cmp(
|
||||
/*! [in] The \em \b the first string. */
|
||||
UpnpString *p,
|
||||
/*! [in] The \em \b the second string. */
|
||||
UpnpString *q);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compares two strings for equality. Case does not matter.
|
||||
*
|
||||
* \return The result of strcasecmp().
|
||||
*/
|
||||
EXPORT_SPEC int UpnpString_casecmp(
|
||||
/*! [in] The \em \b the first string. */
|
||||
UpnpString *p,
|
||||
/*! [in] The \em \b the second string. */
|
||||
UpnpString *q);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
/* @} UpnpString The UpnpString API */
|
||||
|
||||
|
||||
#endif /* STRING_H */
|
||||
|
||||
3669
upnp/inc/upnp.h
3669
upnp/inc/upnp.h
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
/* -*- C -*- */
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
* Copyright (c) 2006 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
/** 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)
|
||||
((UPNP_VERSION_MAJOR*100 + UPNP_VERSION_MINOR)*100 + UPNP_VERSION_PATCH)
|
||||
|
||||
|
||||
|
||||
@@ -90,9 +90,6 @@
|
||||
* (i.e. configure --enable-tools) : <upnp/upnptools.h> file is available */
|
||||
#undef UPNP_HAVE_TOOLS
|
||||
|
||||
/** Defined to 1 if the library has been compiled with ipv6 support
|
||||
* (i.e. configure --enable-ipv6) */
|
||||
#undef UPNP_ENABLE_IPV6
|
||||
|
||||
#endif /* UPNP_CONFIG_H */
|
||||
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
* 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,
|
||||
* * 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,
|
||||
* * 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
|
||||
* * 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.
|
||||
*
|
||||
@@ -33,34 +33,25 @@
|
||||
#ifndef UPNP_DEBUG_H
|
||||
#define UPNP_DEBUG_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ThreadPool.h"
|
||||
#include "upnp.h"
|
||||
#include "upnpconfig.h"
|
||||
#include "UpnpGlobal.h" /* for UPNP_INLINE */
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \name Other debugging features
|
||||
*
|
||||
* The UPnP SDK contains other features to aid in debugging.
|
||||
/** @name Other debugging features
|
||||
The UPnP SDK contains other features to aid in debugging.
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
/** \name Upnp_LogLevel
|
||||
/*! @{ */
|
||||
|
||||
/** @name Upnp_LogLevel
|
||||
* The user has the option to select 4 different types of debugging levels,
|
||||
* see \c UpnpSetLogLevel.
|
||||
* see {\tt 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
|
||||
@@ -69,11 +60,14 @@ extern "C" {
|
||||
* 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]
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_CRITICAL [0]}
|
||||
* \item {\tt UPNP_PACKET [1]}
|
||||
* \item {\tt UPNP_INFO [2]}
|
||||
* \item {\tt UPNP_ALL [3]}
|
||||
* \end{itemize}
|
||||
*/
|
||||
|
||||
typedef enum Upnp_Module {
|
||||
SSDP,
|
||||
SOAP,
|
||||
@@ -85,69 +79,91 @@ typedef enum Upnp_Module {
|
||||
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
|
||||
* Default log level : see {\tt Upnp_LogLevel}
|
||||
*/
|
||||
#define UPNP_DEFAULT_LOG_LEVEL UPNP_ALL
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Initialize the log files.
|
||||
/***************************************************************************
|
||||
* Function : UpnpInitLog
|
||||
*
|
||||
* \return -1 if fails or UPNP_E_SUCCESS if succeeds.
|
||||
*/
|
||||
* Parameters: void
|
||||
*
|
||||
* Description:
|
||||
* This functions initializes the log files
|
||||
*
|
||||
* Returns: int
|
||||
* -1 : If fails
|
||||
* UPNP_E_SUCCESS : if success
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
int UpnpInitLog(void);
|
||||
int UpnpInitLog();
|
||||
#else
|
||||
static UPNP_INLINE int UpnpInitLog(void)
|
||||
{
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
static UPNP_INLINE int UpnpInitLog() { return UPNP_E_SUCCESS; }
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set the log level (see \c Upnp_LogLevel).
|
||||
*/
|
||||
/***************************************************************************
|
||||
* Function : UpnpSetLogLevel
|
||||
*
|
||||
* Parameters: Upnp_LogLevel log_level
|
||||
*
|
||||
* Description:
|
||||
* This functions set the log level (see {\tt Upnp_LogLevel}
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void UpnpSetLogLevel(
|
||||
/*! [in] Log level. */
|
||||
Upnp_LogLevel log_level);
|
||||
void UpnpSetLogLevel(Upnp_LogLevel log_level);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Closes the log files.
|
||||
*/
|
||||
/***************************************************************************
|
||||
* Function : UpnpCloseLog
|
||||
*
|
||||
* Parameters: void
|
||||
*
|
||||
* Description:
|
||||
* This functions closes the log files
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void UpnpCloseLog(void);
|
||||
void UpnpCloseLog();
|
||||
#else
|
||||
static UPNP_INLINE void UpnpCloseLog(void) {}
|
||||
static UPNP_INLINE void UpnpCloseLog() {}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set the name for error and information files, respectively.
|
||||
*/
|
||||
/***************************************************************************
|
||||
* Function : UpnpSetLogFileNames
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* ErrFileName: name of the error file
|
||||
* IN const char *InfoFileName: name of the information file
|
||||
* IN int size: Size of the buffer
|
||||
* IN int starLength: This parameter provides the width of the banner
|
||||
*
|
||||
* Description:
|
||||
* This functions takes the buffer and writes the buffer in the file as
|
||||
* per the requested banner
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#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(
|
||||
@@ -156,20 +172,24 @@ static UPNP_INLINE void UpnpSetLogFileNames(
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Check if the module is turned on for debug and returns the file
|
||||
* descriptor corresponding to the debug level
|
||||
/***************************************************************************
|
||||
* Function : UpnpGetDebugFile
|
||||
*
|
||||
* \return NULL if the module is turn off for debug otheriwse returns the
|
||||
* right file descriptor.
|
||||
*/
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
*
|
||||
* Description:
|
||||
* This function checks if the module is turned on for debug
|
||||
* and returns the file descriptor corresponding to the debug level
|
||||
* Returns: FILE *
|
||||
* NULL : if the module is turn off for debug
|
||||
* else 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);
|
||||
FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module);
|
||||
#else
|
||||
static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module)
|
||||
{
|
||||
@@ -178,47 +198,60 @@ static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Returns true if debug output should be done in this module.
|
||||
/***************************************************************************
|
||||
* Function : DebugAtThisLevel
|
||||
*
|
||||
* \return Nonzero value if true, zero if false.
|
||||
*/
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
*
|
||||
* Description:
|
||||
* This functions returns true if debug output should be done in this
|
||||
* module.
|
||||
*
|
||||
* Returns: int
|
||||
***************************************************************************/
|
||||
#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);
|
||||
IN Upnp_LogLevel DLevel,
|
||||
IN Dbg_Module Module);
|
||||
#else
|
||||
static UPNP_INLINE int DebugAtThisLevel(
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
IN Upnp_LogLevel DLevel,
|
||||
IN 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.
|
||||
*/
|
||||
/***************************************************************************
|
||||
* Function : UpnpPrintf
|
||||
*
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
* IN char *DbgFileName: Name of the file from where debug statement is
|
||||
* coming
|
||||
* IN int DbgLineNo : Line number of the file from where debug statement
|
||||
* is coming
|
||||
* IN char * FmtStr, ...: Variable number of arguments that will go
|
||||
* in the debug statement
|
||||
*
|
||||
* Description:
|
||||
* This functions prints the debug statement either on the startdard
|
||||
* output or log file along with the information from where this
|
||||
* debug statement is coming
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#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 */
|
||||
@@ -232,44 +265,29 @@ static UPNP_INLINE void UpnpPrintf(
|
||||
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
|
||||
*/
|
||||
/***************************************************************************
|
||||
* Function : UpnpDisplayBanner
|
||||
*
|
||||
* Parameters:
|
||||
* IN FILE *fd: file descriptor where the banner will be written
|
||||
* IN char **lines: The buffer that will be written
|
||||
* IN int size: Size of the buffer
|
||||
* IN int starLength: This parameter provides the width of the banner
|
||||
*
|
||||
* Description:
|
||||
* This functions takes the buffer and writes the buffer in the file as
|
||||
* per the requested banner
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#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(
|
||||
@@ -280,31 +298,33 @@ static UPNP_INLINE void UpnpDisplayBanner(
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Prints thread pool statistics.
|
||||
*/
|
||||
/***************************************************************************
|
||||
* Function : UpnpDisplayFileAndLine
|
||||
*
|
||||
* Parameters:
|
||||
* IN FILE *fd: File descriptor where line number and file name will be
|
||||
* written
|
||||
* IN char *DbgFileName: Name of the file
|
||||
* IN int DbgLineNo : Line number of the file
|
||||
*
|
||||
* Description:
|
||||
* This function writes the file name and file number from where
|
||||
* debug statement is coming to the log file
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void PrintThreadPoolStats(
|
||||
/*! [in] The thread pool. */
|
||||
ThreadPool *tp,
|
||||
/*! [in] The file name that called this function, use the macro __FILE__. */
|
||||
void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
const char *DbgFileName,
|
||||
/*! [in] The line number that the function was called, use the macro __LINE__. */
|
||||
int DbgLineNo,
|
||||
/*! [in] The message. */
|
||||
const char *msg);
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static UPNP_INLINE void PrintThreadPoolStats(
|
||||
ThreadPool *tp,
|
||||
static UPNP_INLINE void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo,
|
||||
const char *msg)
|
||||
{
|
||||
}
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
/*! @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -29,237 +29,201 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/** @name 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.
|
||||
*/
|
||||
|
||||
/*! @{ */
|
||||
|
||||
#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 */
|
||||
|
||||
#include "upnp.h"
|
||||
|
||||
/* 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.
|
||||
/** {\bf UpnpResolveURL} combines a base URL and a relative URL into
|
||||
* a single absolute URL. The memory for {\bf AbsURL} needs to be
|
||||
* allocated by the caller and must be large enough to hold the
|
||||
* {\bf BaseURL} and {\bf RelURL} combined.
|
||||
*
|
||||
* \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 <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: \b RelURL is <tt>NULL</tt>.
|
||||
* \li <tt>UPNP_E_INVALID_URL</tt>: The \b BaseURL / \b RelURL
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: {\bf RelURL} is {\tt NULL}.
|
||||
* \item {\tt UPNP_E_INVALID_URL}: The {\bf BaseURL} / {\bf RelURL}
|
||||
* combination does not form a valid URL.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
*/
|
||||
|
||||
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);
|
||||
IN const char * BaseURL, /** The base URL to combine. */
|
||||
IN const char * RelURL, /** The relative URL to {\bf BaseURL}. */
|
||||
OUT char * AbsURL /** A pointer to a buffer to store the
|
||||
absolute URL. */
|
||||
);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Creates an action request packet based on its input parameters
|
||||
* (status variable name and value pair).
|
||||
/** {\bf 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.
|
||||
*
|
||||
* 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 <tt>NULL</tt> if the
|
||||
* operation failed.
|
||||
* @return [IXML_Document*] The action node of {\bf Upnp_Document} type or
|
||||
* {\tt 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. */
|
||||
...);
|
||||
|
||||
EXPORT_SPEC IXML_Document* UpnpMakeAction(
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN int NumArg, /** Number of argument pairs to be passed. */
|
||||
IN const char * Arg, /** Status variable name and value pair. */
|
||||
IN ... /* Other status variable name and value pairs. */
|
||||
);
|
||||
|
||||
/*!
|
||||
* \brief Ceates an action response packet based on its output parameters
|
||||
* (status variable name and value pair).
|
||||
/** {\bf 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
|
||||
* {\bf Upnp_Document} variable initialized with {\tt NULL} should be passed
|
||||
* as a parameter.
|
||||
*
|
||||
* 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 <tt>NULL</tt> 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 <b>Upnp_Document variable initialized with <tt>NULL</tt></b>
|
||||
* 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 <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: One or more of the parameters are invalid.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
||||
* are invalid.
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
*/
|
||||
|
||||
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);
|
||||
IN OUT IXML_Document ** ActionDoc,
|
||||
/** A pointer to store the action
|
||||
document node. */
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN const char * ArgName, /** The status variable name. */
|
||||
IN const char * ArgVal /** The status variable value. */
|
||||
);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Creates an action response packet based on its output parameters
|
||||
* (status variable name and value pair).
|
||||
/** {\bf 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.
|
||||
*
|
||||
* 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 <tt>NULL</tt>
|
||||
* 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 <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: One or more of the parameters are invalid.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* @return [IXML_Document*] The action node of {\bf Upnp_Document} type or
|
||||
* {\tt NULL} if the operation failed.
|
||||
*/
|
||||
|
||||
EXPORT_SPEC IXML_Document* UpnpMakeActionResponse(
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN int NumArg, /** The number of argument pairs passed. */
|
||||
IN const char * Arg, /** The status variable name and value pair. */
|
||||
IN ... /* Other status variable name and value pairs. */
|
||||
);
|
||||
|
||||
/** {\bf 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
|
||||
* {\bf Upnp_Document} variable initialized with {\tt NULL} should be passed
|
||||
* as a parameter.
|
||||
*
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
||||
* are invalid.
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
*/
|
||||
|
||||
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);
|
||||
IN OUT IXML_Document ** ActionResponse,
|
||||
/** Pointer to a document to
|
||||
store the action document
|
||||
node. */
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN const char * ArgName, /** The status variable name. */
|
||||
IN const char * ArgVal /** The status variable value. */
|
||||
);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Creates a property set message packet.
|
||||
/** {\bf 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 {\tt NULL} and pass that as the first parameter.
|
||||
*
|
||||
* Any number of input parameters can be passed to this function but every
|
||||
* input variable name should have a matching value input argument.
|
||||
*
|
||||
* \return <tt>NULL</tt> 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
|
||||
* <tt>NULL</tt> and pass that as the first parameter.
|
||||
*
|
||||
* \return An integer representing one of the following:
|
||||
* \li <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: One or more of the parameters are invalid.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
||||
* are invalid.
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
*
|
||||
*/
|
||||
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);
|
||||
|
||||
EXPORT_SPEC int UpnpAddToPropertySet(
|
||||
IN OUT IXML_Document **PropSet,
|
||||
/** A pointer to the document containing
|
||||
the property set document node. */
|
||||
IN const char * ArgName, /** The status variable name. */
|
||||
IN const char * ArgVal /** The status variable value. */
|
||||
);
|
||||
|
||||
/** {\bf 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.
|
||||
*
|
||||
* @return [IXML_Document*] {\tt NULL} on failure, or the property-set
|
||||
* document node.
|
||||
*
|
||||
*/
|
||||
|
||||
EXPORT_SPEC IXML_Document* UpnpCreatePropertySet(
|
||||
IN int NumArg, /** The number of argument pairs passed. */
|
||||
IN const char* Arg, /** The status variable name and value pair. */
|
||||
IN ...
|
||||
);
|
||||
|
||||
/** {\bf UpnpGetErrorMessage} converts an SDK error code into a
|
||||
* string error message suitable for display. The memory returned
|
||||
* from this function should NOT be freed.
|
||||
*
|
||||
* @return [char*] An ASCII text string representation of the error message
|
||||
* associated with the error code.
|
||||
*/
|
||||
|
||||
EXPORT_SPEC const char * UpnpGetErrorMessage(
|
||||
int errorcode /** The SDK error code to convert. */
|
||||
);
|
||||
|
||||
/*! @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*! @} */
|
||||
|
||||
|
||||
#endif /* UPNP_HAVE_TOOLS */
|
||||
|
||||
|
||||
#endif /* UPNP_TOOLS_H */
|
||||
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
# -*- 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], [
|
||||
AC_MSG_CHECKING([for libupnp version >= MIN_LIBUPNP_VERSION])
|
||||
AS_IF([test -n "$PKG_CONFIG"], [
|
||||
AS_IF([$PKG_CONFIG libupnp --exists], [
|
||||
LIBUPNP_VERSION=`$PKG_CONFIG libupnp --modversion`
|
||||
AS_IF([$PKG_CONFIG libupnp --atleast-version=MIN_LIBUPNP_VERSION], [
|
||||
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`"
|
||||
], [
|
||||
result=no
|
||||
resultstr=" (version $LIBUPNP_VERSION is not new enough)"
|
||||
])
|
||||
], [
|
||||
result=no
|
||||
resultstr=" (try to use --with-libupnp-prefix=PREFIX)"
|
||||
])
|
||||
], [
|
||||
result=no
|
||||
resultstr=" (pkg-config not found)"
|
||||
])
|
||||
AC_MSG_RESULT([$result$resultstr])
|
||||
libupnp_error="libupnp >= MIN_LIBUPNP_VERSION not found$resultstr"
|
||||
], [
|
||||
dnl Currently cross-compilation with libupnp is not supported.
|
||||
result=no
|
||||
libupnp_error="cross compiling"
|
||||
])
|
||||
|
||||
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
|
||||
])
|
||||
@@ -69,9 +69,8 @@ upnp_tv_combo_SOURCES = \
|
||||
if WITH_DOCUMENTATION
|
||||
examplesdir = $(docdir)/examples
|
||||
examples_DATA = \
|
||||
$(sort \
|
||||
$(upnp_tv_ctrlpt_SOURCES) \
|
||||
$(upnp_tv_device_SOURCES))
|
||||
$(upnp_tv_device_SOURCES)
|
||||
endif
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,55 +1,51 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ithread.h"
|
||||
#include "ixml.h"
|
||||
#include "upnptools.h"
|
||||
|
||||
/* mutex to control displaying of events */
|
||||
|
||||
// mutex to control displaying of events
|
||||
extern ithread_mutex_t display_mutex;
|
||||
|
||||
|
||||
@@ -170,7 +166,7 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType,
|
||||
********************************************************************************/
|
||||
int SampleUtil_FindAndParseService (
|
||||
IN IXML_Document *DescDoc,
|
||||
IN const char* location,
|
||||
IN char* location,
|
||||
IN char *serviceType,
|
||||
OUT char **serviceId,
|
||||
OUT char **eventURL,
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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"
|
||||
@@ -130,8 +130,7 @@ TvCtrlPointPrintLongHelp( void )
|
||||
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( "devices. While registers a tv device itself." );
|
||||
SampleUtil_Print( "" );
|
||||
SampleUtil_Print( "Commands:" );
|
||||
SampleUtil_Print( " Help" );
|
||||
@@ -457,8 +456,7 @@ int main( int argc, char **argv )
|
||||
{
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
#ifndef WIN32
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
@@ -473,9 +471,7 @@ int main( int argc, char **argv )
|
||||
/* start a command loop thread */
|
||||
code = ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop, NULL );
|
||||
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
#ifndef WIN32
|
||||
/*
|
||||
Catch Ctrl-C and properly shutdown
|
||||
*/
|
||||
@@ -484,8 +480,12 @@ int main( int argc, char **argv )
|
||||
sigwait( &sigs_to_catch, &sig );
|
||||
|
||||
SampleUtil_Print( "Shutting down on signal %d...\n", sig );
|
||||
#else
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#endif
|
||||
TvDeviceStop();
|
||||
rc = TvCtrlPointStop();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,42 +1,37 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
@@ -53,7 +48,7 @@ char *TvServiceType[] = {
|
||||
};
|
||||
char *TvServiceName[] = { "Control", "Picture" };
|
||||
|
||||
/*!
|
||||
/*
|
||||
Global arrays for storing variable names and counts for
|
||||
TvControl and TvPicture services
|
||||
*/
|
||||
@@ -64,12 +59,12 @@ char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS] = {
|
||||
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;
|
||||
@@ -143,10 +138,11 @@ TvCtrlPointDeleteNode( struct TvDeviceNode *node )
|
||||
* UDN -- The Unique Device Name for the device to remove
|
||||
*
|
||||
********************************************************************************/
|
||||
int TvCtrlPointRemoveDevice(const char *UDN)
|
||||
int
|
||||
TvCtrlPointRemoveDevice( char *UDN )
|
||||
{
|
||||
struct TvDeviceNode *curdevnode;
|
||||
struct TvDeviceNode *prevdevnode;
|
||||
struct TvDeviceNode *curdevnode,
|
||||
*prevdevnode;
|
||||
|
||||
ithread_mutex_lock( &DeviceListMutex );
|
||||
|
||||
@@ -672,8 +668,8 @@ TvCtrlPointPrintDevice( int devnum )
|
||||
*
|
||||
********************************************************************************/
|
||||
void
|
||||
TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
const char *location,
|
||||
TvCtrlPointAddDevice( IXML_Document * DescDoc,
|
||||
char *location,
|
||||
int expires )
|
||||
{
|
||||
char *deviceType = NULL;
|
||||
@@ -686,19 +682,20 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
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 };
|
||||
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;
|
||||
int service,
|
||||
var;
|
||||
|
||||
ithread_mutex_lock( &DeviceListMutex );
|
||||
|
||||
/* Read key elements from description document */
|
||||
/*
|
||||
Read key elements from description document
|
||||
*/
|
||||
UDN = SampleUtil_GetFirstDocumentItem( DescDoc, "UDN" );
|
||||
deviceType = SampleUtil_GetFirstDocumentItem( DescDoc, "deviceType" );
|
||||
friendlyName =
|
||||
@@ -706,8 +703,9 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
baseURL = SampleUtil_GetFirstDocumentItem( DescDoc, "URLBase" );
|
||||
relURL = SampleUtil_GetFirstDocumentItem( DescDoc, "presentationURL" );
|
||||
|
||||
ret = UpnpResolveURL(
|
||||
( baseURL ? baseURL : location ), relURL, presURL);
|
||||
ret =
|
||||
UpnpResolveURL( ( baseURL ? baseURL : location ), relURL,
|
||||
presURL );
|
||||
|
||||
if( UPNP_E_SUCCESS != ret )
|
||||
SampleUtil_Print( "Error generating presURL from %s + %s", baseURL,
|
||||
@@ -941,36 +939,34 @@ TvStateUpdate( char *UDN,
|
||||
* changes -- The DOM document representing the changes
|
||||
*
|
||||
********************************************************************************/
|
||||
void TvCtrlPointHandleEvent(
|
||||
const char *sid,
|
||||
void
|
||||
TvCtrlPointHandleEvent( Upnp_SID sid,
|
||||
int evntkey,
|
||||
IXML_Document *changes)
|
||||
IXML_Document * changes )
|
||||
{
|
||||
struct TvDeviceNode *tmpdevnode;
|
||||
int service;
|
||||
|
||||
ithread_mutex_lock(&DeviceListMutex);
|
||||
ithread_mutex_lock( &DeviceListMutex );
|
||||
|
||||
tmpdevnode = GlobalDeviceList;
|
||||
while (tmpdevnode) {
|
||||
for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) {
|
||||
if (strcmp(tmpdevnode->device.TvService[service].SID, sid) == 0) {
|
||||
SampleUtil_Print("Received Tv %s Event: %d for SID %s",
|
||||
TvServiceName[service],
|
||||
evntkey,
|
||||
sid);
|
||||
TvStateUpdate(
|
||||
tmpdevnode->device.UDN,
|
||||
service,
|
||||
changes,
|
||||
(char **)&tmpdevnode->device.TvService[service].VariableStrVal);
|
||||
while( tmpdevnode ) {
|
||||
for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) {
|
||||
if( strcmp( tmpdevnode->device.TvService[service].SID, sid ) ==
|
||||
0 ) {
|
||||
SampleUtil_Print( "Received Tv %s Event: %d for SID %s",
|
||||
TvServiceName[service], evntkey, sid );
|
||||
|
||||
TvStateUpdate( tmpdevnode->device.UDN, service, changes,
|
||||
( char ** )&tmpdevnode->device.
|
||||
TvService[service].VariableStrVal );
|
||||
break;
|
||||
}
|
||||
}
|
||||
tmpdevnode = tmpdevnode->next;
|
||||
}
|
||||
|
||||
ithread_mutex_unlock(&DeviceListMutex);
|
||||
ithread_mutex_unlock( &DeviceListMutex );
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
@@ -987,10 +983,10 @@ void TvCtrlPointHandleEvent(
|
||||
* timeout -- The new timeout for the subscription
|
||||
*
|
||||
********************************************************************************/
|
||||
void TvCtrlPointHandleSubscribeUpdate(
|
||||
const char *eventURL,
|
||||
const Upnp_SID sid,
|
||||
int timeout)
|
||||
void
|
||||
TvCtrlPointHandleSubscribeUpdate( char *eventURL,
|
||||
Upnp_SID sid,
|
||||
int timeout )
|
||||
{
|
||||
struct TvDeviceNode *tmpdevnode;
|
||||
int service;
|
||||
@@ -1018,10 +1014,10 @@ void TvCtrlPointHandleSubscribeUpdate(
|
||||
ithread_mutex_unlock( &DeviceListMutex );
|
||||
}
|
||||
|
||||
void TvCtrlPointHandleGetVar(
|
||||
const char *controlURL,
|
||||
const char *varName,
|
||||
const DOMString varValue)
|
||||
void
|
||||
TvCtrlPointHandleGetVar( char *controlURL,
|
||||
char *varName,
|
||||
DOMString varValue )
|
||||
{
|
||||
|
||||
struct TvDeviceNode *tmpdevnode;
|
||||
@@ -1030,11 +1026,14 @@ void TvCtrlPointHandleGetVar(
|
||||
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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1058,130 +1057,179 @@ void TvCtrlPointHandleGetVar(
|
||||
* Cookie -- Optional data specified during callback registration
|
||||
*
|
||||
********************************************************************************/
|
||||
int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie)
|
||||
int
|
||||
TvCtrlPointCallbackEventHandler( Upnp_EventType EventType,
|
||||
void *Event,
|
||||
void *Cookie )
|
||||
{
|
||||
/*int errCode = 0;*/
|
||||
SampleUtil_PrintEvent( EventType, Event );
|
||||
|
||||
SampleUtil_PrintEvent(EventType, Event);
|
||||
switch ( EventType ) {
|
||||
/* SSDP Stuff */
|
||||
/*
|
||||
SSDP Stuff
|
||||
*/
|
||||
case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
|
||||
case UPNP_DISCOVERY_SEARCH_RESULT: {
|
||||
struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event;
|
||||
case UPNP_DISCOVERY_SEARCH_RESULT:
|
||||
{
|
||||
struct Upnp_Discovery *d_event =
|
||||
( struct Upnp_Discovery * )Event;
|
||||
IXML_Document *DescDoc = NULL;
|
||||
int ret;
|
||||
|
||||
if (d_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Discovery Callback -- %d", d_event->ErrCode);
|
||||
if( d_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error in Discovery Callback -- %d",
|
||||
d_event->ErrCode );
|
||||
}
|
||||
ret = UpnpDownloadXmlDoc(d_event->Location, &DescDoc);
|
||||
if (ret != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error obtaining device description from %s -- error = %d",
|
||||
d_event->Location, ret);
|
||||
|
||||
if( ( ret =
|
||||
UpnpDownloadXmlDoc( d_event->Location,
|
||||
&DescDoc ) ) !=
|
||||
UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error obtaining device description from %s -- error = %d",
|
||||
d_event->Location, ret );
|
||||
} else {
|
||||
TvCtrlPointAddDevice(
|
||||
DescDoc, d_event->Location, d_event->Expires);
|
||||
}
|
||||
if (DescDoc) {
|
||||
ixmlDocument_free(DescDoc);
|
||||
TvCtrlPointAddDevice( DescDoc, d_event->Location,
|
||||
d_event->Expires );
|
||||
}
|
||||
|
||||
if( DescDoc )
|
||||
ixmlDocument_free( DescDoc );
|
||||
|
||||
TvCtrlPointPrintList();
|
||||
break;
|
||||
}
|
||||
|
||||
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
||||
/* Nothing to do here... */
|
||||
/*
|
||||
Nothing to do here...
|
||||
*/
|
||||
break;
|
||||
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: {
|
||||
struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event;
|
||||
|
||||
if (d_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Discovery ByeBye Callback -- %d", d_event->ErrCode);
|
||||
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
|
||||
{
|
||||
struct Upnp_Discovery *d_event =
|
||||
( struct Upnp_Discovery * )Event;
|
||||
|
||||
if( d_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Discovery ByeBye Callback -- %d",
|
||||
d_event->ErrCode );
|
||||
}
|
||||
SampleUtil_Print("Received ByeBye for Device: %s", d_event->DeviceId);
|
||||
TvCtrlPointRemoveDevice(d_event->DeviceId);
|
||||
SampleUtil_Print("After byebye:");
|
||||
|
||||
SampleUtil_Print( "Received ByeBye for Device: %s",
|
||||
d_event->DeviceId );
|
||||
TvCtrlPointRemoveDevice( d_event->DeviceId );
|
||||
|
||||
SampleUtil_Print( "After byebye:" );
|
||||
TvCtrlPointPrintList();
|
||||
|
||||
break;
|
||||
}
|
||||
/* SOAP Stuff */
|
||||
case UPNP_CONTROL_ACTION_COMPLETE: {
|
||||
struct Upnp_Action_Complete *a_event = (struct Upnp_Action_Complete *)Event;
|
||||
|
||||
if (a_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Action Complete Callback -- %d", a_event->ErrCode);
|
||||
/*
|
||||
SOAP Stuff
|
||||
*/
|
||||
case UPNP_CONTROL_ACTION_COMPLETE:
|
||||
{
|
||||
struct Upnp_Action_Complete *a_event =
|
||||
( struct Upnp_Action_Complete * )Event;
|
||||
|
||||
if( a_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Action Complete Callback -- %d",
|
||||
a_event->ErrCode );
|
||||
}
|
||||
/* No need for any processing here, just print out results.
|
||||
* Service state table updates are handled by events. */
|
||||
|
||||
/*
|
||||
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: {
|
||||
struct Upnp_State_Var_Complete *sv_event = (struct Upnp_State_Var_Complete *)Event;
|
||||
|
||||
if (sv_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Get Var Complete Callback -- %d", sv_event->ErrCode);
|
||||
case UPNP_CONTROL_GET_VAR_COMPLETE:
|
||||
{
|
||||
struct Upnp_State_Var_Complete *sv_event =
|
||||
( struct Upnp_State_Var_Complete * )Event;
|
||||
|
||||
if( sv_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Get Var Complete Callback -- %d",
|
||||
sv_event->ErrCode );
|
||||
} else {
|
||||
TvCtrlPointHandleGetVar(
|
||||
sv_event->CtrlUrl,
|
||||
TvCtrlPointHandleGetVar( sv_event->CtrlUrl,
|
||||
sv_event->StateVarName,
|
||||
sv_event->CurrentVal);
|
||||
sv_event->CurrentVal );
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* GENA Stuff */
|
||||
case UPNP_EVENT_RECEIVED: {
|
||||
struct Upnp_Event *e_event = (struct Upnp_Event *)Event;
|
||||
|
||||
TvCtrlPointHandleEvent(
|
||||
e_event->Sid,
|
||||
e_event->EventKey,
|
||||
e_event->ChangedVariables);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
GENA Stuff
|
||||
*/
|
||||
case UPNP_EVENT_RECEIVED:
|
||||
{
|
||||
struct Upnp_Event *e_event = ( struct Upnp_Event * )Event;
|
||||
|
||||
TvCtrlPointHandleEvent( e_event->Sid, e_event->EventKey,
|
||||
e_event->ChangedVariables );
|
||||
break;
|
||||
}
|
||||
|
||||
case UPNP_EVENT_SUBSCRIBE_COMPLETE:
|
||||
case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
|
||||
case UPNP_EVENT_RENEWAL_COMPLETE: {
|
||||
struct Upnp_Event_Subscribe *es_event = (struct Upnp_Event_Subscribe *)Event;
|
||||
case UPNP_EVENT_RENEWAL_COMPLETE:
|
||||
{
|
||||
struct Upnp_Event_Subscribe *es_event =
|
||||
( struct Upnp_Event_Subscribe * )Event;
|
||||
|
||||
if (es_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Event Subscribe Callback -- %d", es_event->ErrCode);
|
||||
if( es_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Event Subscribe Callback -- %d",
|
||||
es_event->ErrCode );
|
||||
} else {
|
||||
TvCtrlPointHandleSubscribeUpdate(
|
||||
es_event->PublisherUrl,
|
||||
TvCtrlPointHandleSubscribeUpdate( es_event->
|
||||
PublisherUrl,
|
||||
es_event->Sid,
|
||||
es_event->TimeOut);
|
||||
es_event->TimeOut );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case UPNP_EVENT_AUTORENEWAL_FAILED:
|
||||
case UPNP_EVENT_SUBSCRIPTION_EXPIRED: {
|
||||
struct Upnp_Event_Subscribe *es_event = (struct Upnp_Event_Subscribe *)Event;
|
||||
case UPNP_EVENT_SUBSCRIPTION_EXPIRED:
|
||||
{
|
||||
int TimeOut = default_timeout;
|
||||
Upnp_SID newSID;
|
||||
int ret;
|
||||
|
||||
ret = UpnpSubscribe(
|
||||
ctrlpt_handle,
|
||||
es_event->PublisherUrl,
|
||||
&TimeOut,
|
||||
newSID);
|
||||
if (ret == UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print("Subscribed to EventURL with SID=%s", newSID);
|
||||
TvCtrlPointHandleSubscribeUpdate(
|
||||
es_event->PublisherUrl,
|
||||
newSID,
|
||||
TimeOut);
|
||||
struct Upnp_Event_Subscribe *es_event =
|
||||
( struct Upnp_Event_Subscribe * )Event;
|
||||
|
||||
ret =
|
||||
UpnpSubscribe( ctrlpt_handle, es_event->PublisherUrl,
|
||||
&TimeOut, newSID );
|
||||
|
||||
if( ret == UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Subscribed to EventURL with SID=%s",
|
||||
newSID );
|
||||
TvCtrlPointHandleSubscribeUpdate( es_event->
|
||||
PublisherUrl, newSID,
|
||||
TimeOut );
|
||||
} else {
|
||||
SampleUtil_Print("Error Subscribing to EventURL -- %d", ret);
|
||||
SampleUtil_Print
|
||||
( "Error Subscribing to EventURL -- %d", ret );
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* ignore these cases, since this is not a device */
|
||||
|
||||
/*
|
||||
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:
|
||||
@@ -1272,12 +1320,12 @@ TvCtrlPointVerifyTimeouts( int incr )
|
||||
* None
|
||||
*
|
||||
********************************************************************************/
|
||||
static int TvCtrlPointTimerLoopRun = 1;
|
||||
void *TvCtrlPointTimerLoop(void *args)
|
||||
void *
|
||||
TvCtrlPointTimerLoop( void *args )
|
||||
{
|
||||
int incr = 30; // how often to verify the timeouts, in seconds
|
||||
|
||||
while (TvCtrlPointTimerLoopRun) {
|
||||
while( 1 ) {
|
||||
isleep( incr );
|
||||
TvCtrlPointVerifyTimeouts( incr );
|
||||
}
|
||||
@@ -1300,69 +1348,66 @@ void *TvCtrlPointTimerLoop(void *args)
|
||||
* TV_SUCCESS if everything went well, else TV_ERROR
|
||||
*
|
||||
********************************************************************************/
|
||||
int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionPtr)
|
||||
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);
|
||||
SampleUtil_Initialize( printFunctionPtr );
|
||||
SampleUtil_RegisterUpdateFunction( updateFunctionPtr );
|
||||
|
||||
ithread_mutex_init(&DeviceListMutex, 0);
|
||||
ithread_mutex_init( &DeviceListMutex, 0 );
|
||||
|
||||
SampleUtil_Print(
|
||||
"Initializing UPnP Sdk with\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
ip_address, port );
|
||||
|
||||
rc = UpnpInit(ip_address, port);
|
||||
if (rc != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print("WinCEStart: UpnpInit() Error: %d", rc);
|
||||
/*
|
||||
UpnpFinish();
|
||||
return TV_ERROR;
|
||||
*/
|
||||
rc = UpnpInit( ip_address, port );
|
||||
if( UPNP_E_SUCCESS != rc ) {
|
||||
SampleUtil_Print( "WinCEStart: UpnpInit() Error: %d", rc );
|
||||
//UpnpFinish();
|
||||
//return TV_ERROR;
|
||||
}
|
||||
if (!ip_address) {
|
||||
|
||||
if( NULL == ip_address ) {
|
||||
ip_address = UpnpGetServerIpAddress();
|
||||
}
|
||||
if (!port) {
|
||||
if( 0 == port ) {
|
||||
port = UpnpGetServerPort();
|
||||
}
|
||||
|
||||
SampleUtil_Print(
|
||||
"UPnP Initialized\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
"\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( "Registering Control Point" );
|
||||
rc = UpnpRegisterClient( TvCtrlPointCallbackEventHandler,
|
||||
&ctrlpt_handle, &ctrlpt_handle );
|
||||
if( UPNP_E_SUCCESS != rc ) {
|
||||
SampleUtil_Print( "Error registering CP: %d", rc );
|
||||
UpnpFinish();
|
||||
|
||||
return TV_ERROR;
|
||||
}
|
||||
|
||||
SampleUtil_Print("Control Point Registered");
|
||||
SampleUtil_Print( "Control Point Registered" );
|
||||
|
||||
TvCtrlPointRefresh();
|
||||
|
||||
/* start a timer thread */
|
||||
ithread_create(&timer_thread, NULL, TvCtrlPointTimerLoop, NULL);
|
||||
ithread_detach(timer_thread);
|
||||
// start a timer thread
|
||||
ithread_create( &timer_thread, NULL, TvCtrlPointTimerLoop, NULL );
|
||||
|
||||
return TV_SUCCESS;
|
||||
}
|
||||
|
||||
int TvCtrlPointStop(void)
|
||||
int
|
||||
TvCtrlPointStop( void )
|
||||
{
|
||||
TvCtrlPointTimerLoopRun = 0;
|
||||
TvCtrlPointRemoveAll();
|
||||
UpnpUnRegisterClient( ctrlpt_handle );
|
||||
UpnpFinish();
|
||||
@@ -1370,4 +1415,3 @@ int TvCtrlPointStop(void)
|
||||
|
||||
return TV_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,66 +1,55 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <stdio.h>
|
||||
|
||||
#include "ithread.h"
|
||||
#include "upnp.h"
|
||||
#include "UpnpString.h"
|
||||
#include "upnptools.h"
|
||||
|
||||
|
||||
#include <signal.h>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <unistd.h> */
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "upnp.h"
|
||||
#include "upnptools.h"
|
||||
#include "sample_util.h"
|
||||
|
||||
#define TV_SERVICE_SERVCOUNT 2
|
||||
#define TV_SERVICE_CONTROL 0
|
||||
@@ -121,11 +110,11 @@ extern ithread_mutex_t DeviceListMutex;
|
||||
|
||||
extern UpnpClient_Handle ctrlpt_handle;
|
||||
|
||||
void TvCtrlPointPrintHelp(void);
|
||||
int TvCtrlPointDeleteNode(struct TvDeviceNode *);
|
||||
int TvCtrlPointRemoveDevice(const char *);
|
||||
int TvCtrlPointRemoveAll(void);
|
||||
int TvCtrlPointRefresh(void);
|
||||
void TvCtrlPointPrintHelp( void );
|
||||
int TvCtrlPointDeleteNode(struct TvDeviceNode*);
|
||||
int TvCtrlPointRemoveDevice(char*);
|
||||
int TvCtrlPointRemoveAll( void );
|
||||
int TvCtrlPointRefresh( void );
|
||||
|
||||
|
||||
int TvCtrlPointSendAction(int, int, char *, char **, char **, int);
|
||||
@@ -149,20 +138,20 @@ int TvCtrlPointGetContrast(int);
|
||||
int TvCtrlPointGetBrightness(int);
|
||||
|
||||
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
|
||||
int TvCtrlPointPrintList(void);
|
||||
int TvCtrlPointPrintList( void );
|
||||
int TvCtrlPointPrintDevice(int);
|
||||
void TvCtrlPointAddDevice(IXML_Document *, const char *, int);
|
||||
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
||||
void TvCtrlPointAddDevice (IXML_Document *, char *, int);
|
||||
void TvCtrlPointHandleGetVar(char *,char *,DOMString);
|
||||
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
||||
void TvCtrlPointHandleEvent(const char *, int, IXML_Document *);
|
||||
void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int);
|
||||
void TvCtrlPointHandleEvent(Upnp_SID, int, IXML_Document *);
|
||||
void TvCtrlPointHandleSubscribeUpdate(char *, 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);
|
||||
void TvCtrlPointPrintCommands( void );
|
||||
void* TvCtrlPointCommandLoop( void* );
|
||||
int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr );
|
||||
int TvCtrlPointStop( void );
|
||||
int TvCtrlPointProcessCommand( char *cmdline );
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
|
||||
@@ -1,47 +1,40 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <assert.h>
|
||||
|
||||
|
||||
#define DEFAULT_WEB_DIR "./web"
|
||||
|
||||
|
||||
#define DESC_URL_SIZE 200
|
||||
|
||||
|
||||
/*
|
||||
Device type for tv device
|
||||
*/
|
||||
@@ -185,6 +178,7 @@ SetServiceTable( IN int serviceType,
|
||||
}
|
||||
|
||||
return SetActionTable( serviceType, out );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -255,6 +249,7 @@ SetActionTable( IN int serviceType,
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -371,66 +366,61 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
* sr_event -- The subscription request event structure
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_event)
|
||||
int
|
||||
TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
||||
*sr_event )
|
||||
{
|
||||
unsigned int i = 0;
|
||||
int cmp1 = 0;
|
||||
int cmp2 = 0;
|
||||
const char *l_serviceId = NULL;
|
||||
const char *l_udn = NULL;
|
||||
const char *l_sid = NULL;
|
||||
unsigned int i = 0; //,j=0;
|
||||
|
||||
// lock state mutex
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
// IXML_Document *PropSet=NULL;
|
||||
|
||||
l_serviceId = sr_event->ServiceId;
|
||||
l_udn = sr_event->UDN;
|
||||
l_sid = sr_event->Sid;
|
||||
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
|
||||
//lock state mutex
|
||||
ithread_mutex_lock( &TVDevMutex );
|
||||
|
||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
||||
if( ( strcmp( sr_event->UDN, tv_service_table[i].UDN ) == 0 ) &&
|
||||
( strcmp( sr_event->ServiceId, tv_service_table[i].ServiceId )
|
||||
== 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,
|
||||
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
|
||||
//dump initial state
|
||||
UpnpAcceptSubscriptionExt(device_handle, sr_event->UDN,
|
||||
sr_event->ServiceId,
|
||||
PropSet,sr_event->Sid);
|
||||
//free document
|
||||
Document_free(PropSet);
|
||||
#endif
|
||||
UpnpAcceptSubscription(
|
||||
device_handle,
|
||||
l_udn,
|
||||
l_serviceId,
|
||||
(const char **)tv_service_table[i].
|
||||
|
||||
*/
|
||||
|
||||
UpnpAcceptSubscription( device_handle,
|
||||
sr_event->UDN,
|
||||
sr_event->ServiceId,
|
||||
( const char ** )tv_service_table[i].
|
||||
VariableName,
|
||||
(const char **)tv_service_table[i].
|
||||
( const char ** )tv_service_table[i].
|
||||
VariableStrVal,
|
||||
tv_service_table[i].VariableCount,
|
||||
l_sid);
|
||||
sr_event->Sid );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ithread_mutex_unlock(&TVDevMutex);
|
||||
ithread_mutex_unlock( &TVDevMutex );
|
||||
|
||||
return 1;
|
||||
return ( 1 );
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceHandleGetVarRequest
|
||||
*
|
||||
@@ -443,52 +433,52 @@ int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_ev
|
||||
* cgv_event -- The control get variable request event structure
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||
int
|
||||
TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request
|
||||
*cgv_event )
|
||||
{
|
||||
unsigned int i = 0;
|
||||
unsigned int j = 0;
|
||||
unsigned int i = 0,
|
||||
j = 0;
|
||||
int getvar_succeeded = 0;
|
||||
|
||||
cgv_event->CurrentVal = NULL;
|
||||
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
ithread_mutex_lock( &TVDevMutex );
|
||||
|
||||
for (i = 0; i < TV_SERVICE_SERVCOUNT; i++) {
|
||||
// check udn and service id
|
||||
const char *devUDN =
|
||||
cgv_event->DevUDN;
|
||||
const char *serviceID =
|
||||
cgv_event->ServiceID;
|
||||
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 =
|
||||
cgv_event->StateVarName;
|
||||
if (strcmp(stateVarName,
|
||||
tv_service_table[i].VariableName[j]) == 0) {
|
||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
||||
//check udn and service id
|
||||
if( ( strcmp( cgv_event->DevUDN, tv_service_table[i].UDN ) == 0 )
|
||||
&&
|
||||
( strcmp( cgv_event->ServiceID, tv_service_table[i].ServiceId )
|
||||
== 0 ) ) {
|
||||
//check variable name
|
||||
for( j = 0; j < tv_service_table[i].VariableCount; j++ ) {
|
||||
if( strcmp( cgv_event->StateVarName,
|
||||
tv_service_table[i].VariableName[j] ) == 0 ) {
|
||||
getvar_succeeded = 1;
|
||||
cgv_event->CurrentVal = ixmlCloneDOMString(
|
||||
tv_service_table[i].VariableStrVal[j]);
|
||||
cgv_event->CurrentVal =
|
||||
ixmlCloneDOMString( tv_service_table[i].
|
||||
VariableStrVal[j] );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (getvar_succeeded) {
|
||||
|
||||
if( getvar_succeeded ) {
|
||||
cgv_event->ErrCode = UPNP_E_SUCCESS;
|
||||
} else {
|
||||
SampleUtil_Print(
|
||||
"Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n"
|
||||
" Unknown variable name = %s\n",
|
||||
cgv_event->StateVarName);
|
||||
SampleUtil_Print
|
||||
( "Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" );
|
||||
SampleUtil_Print( " Unknown variable name = %s\n",
|
||||
cgv_event->StateVarName );
|
||||
cgv_event->ErrCode = 404;
|
||||
strcpy(cgv_event->ErrStr, "Invalid Variable");
|
||||
strcpy( cgv_event->ErrStr, "Invalid Variable" );
|
||||
}
|
||||
|
||||
ithread_mutex_unlock(&TVDevMutex);
|
||||
ithread_mutex_unlock( &TVDevMutex );
|
||||
|
||||
return cgv_event->ErrCode == UPNP_E_SUCCESS;
|
||||
return ( cgv_event->ErrCode == UPNP_E_SUCCESS );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -503,47 +493,63 @@ int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||
* ca_event -- The control action request event structure
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||
int
|
||||
TvDeviceHandleActionRequest( INOUT struct Upnp_Action_Request *ca_event )
|
||||
{
|
||||
/* Defaults if action not found. */
|
||||
|
||||
/*
|
||||
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;
|
||||
|
||||
ca_event->ErrCode = 0;
|
||||
ca_event->ActionResult = NULL;
|
||||
|
||||
devUDN = ca_event->DevUDN;
|
||||
serviceID = ca_event->ServiceID;
|
||||
actionName = ca_event->ActionName;
|
||||
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. */
|
||||
if( ( strcmp( ca_event->DevUDN,
|
||||
tv_service_table[TV_SERVICE_CONTROL].UDN ) == 0 ) &&
|
||||
( strcmp
|
||||
( ca_event->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. */
|
||||
} else if( ( strcmp( ca_event->DevUDN,
|
||||
tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 )
|
||||
&&
|
||||
( strcmp
|
||||
( ca_event->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](
|
||||
ca_event->ActionRequest,
|
||||
&ca_event->ActionResult,
|
||||
&errorString);
|
||||
//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( ca_event->ActionName,
|
||||
tv_service_table[service].ActionNames[i] ) ) {
|
||||
|
||||
if( ( !strcmp( tv_service_table[TV_SERVICE_CONTROL].
|
||||
VariableStrVal[TV_CONTROL_POWER], "1" ) )
|
||||
|| ( !strcmp( ca_event->ActionName, "PowerOn" ) ) ) {
|
||||
retCode =
|
||||
tv_service_table[service].actions[i] ( ca_event->
|
||||
ActionRequest,
|
||||
&ca_event->
|
||||
ActionResult,
|
||||
&errorString );
|
||||
} else {
|
||||
errorString = "Power is Off";
|
||||
retCode = UPNP_E_INTERNAL_ERROR;
|
||||
@@ -553,29 +559,34 @@ int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||
}
|
||||
}
|
||||
|
||||
if (!action_found) {
|
||||
if( !action_found ) {
|
||||
ca_event->ActionResult = NULL;
|
||||
strcpy(ca_event->ErrStr, "Invalid Action");
|
||||
strcpy( ca_event->ErrStr, "Invalid Action" );
|
||||
ca_event->ErrCode = 401;
|
||||
} else {
|
||||
if (retCode == UPNP_E_SUCCESS) {
|
||||
if( retCode == UPNP_E_SUCCESS ) {
|
||||
ca_event->ErrCode = UPNP_E_SUCCESS;
|
||||
} else {
|
||||
// copy the error string
|
||||
strcpy(ca_event->ErrStr, errorString);
|
||||
switch (retCode) {
|
||||
//copy the error string
|
||||
strcpy( ca_event->ErrStr, errorString );
|
||||
switch ( retCode ) {
|
||||
case UPNP_E_INVALID_PARAM:
|
||||
{
|
||||
ca_event->ErrCode = 402;
|
||||
break;
|
||||
}
|
||||
case UPNP_E_INTERNAL_ERROR:
|
||||
default:
|
||||
{
|
||||
ca_event->ErrCode = 501;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ca_event->ErrCode;
|
||||
return ( ca_event->ErrCode );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -638,6 +649,7 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
ithread_mutex_unlock( &TVDevMutex );
|
||||
|
||||
return ( 1 );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -660,7 +672,7 @@ TvDeviceSetPower( IN int on )
|
||||
|
||||
if( on != POWER_ON && on != POWER_OFF ) {
|
||||
SampleUtil_Print( "error: can't set power to value %d\n", on );
|
||||
return 0;
|
||||
return ( 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -671,7 +683,7 @@ TvDeviceSetPower( IN int on )
|
||||
ret = TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_POWER,
|
||||
value );
|
||||
|
||||
return ret;
|
||||
return ( ret );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -688,7 +700,9 @@ TvDeviceSetPower( IN int on )
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDevicePowerOn( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
( *out ) = NULL;
|
||||
( *errorString ) = NULL;
|
||||
@@ -708,6 +722,7 @@ TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -725,7 +740,7 @@ TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDevicePowerOff( IN IXML_Document * in,
|
||||
OUT IXML_Document **out,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
( *out ) = NULL;
|
||||
@@ -764,8 +779,11 @@ TvDevicePowerOff( IN IXML_Document * in,
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetChannel( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int channel = 0;
|
||||
@@ -810,6 +828,7 @@ TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **er
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -827,10 +846,13 @@ TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **er
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementChannel( IN int incr, IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementChannel( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curchannel;
|
||||
int newchannel;
|
||||
int curchannel,
|
||||
newchannel;
|
||||
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
@@ -892,9 +914,12 @@ IncrementChannel( IN int incr, IN IXML_Document * in, OUT IXML_Document **out, O
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseChannel( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementChannel( -1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -911,9 +936,12 @@ TvDeviceDecreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseChannel( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementChannel( 1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -932,9 +960,13 @@ TvDeviceIncreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetVolume( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int volume = 0;
|
||||
|
||||
( *out ) = NULL;
|
||||
@@ -975,6 +1007,7 @@ TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **err
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -993,7 +1026,10 @@ TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **err
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementVolume( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curvolume,
|
||||
newvolume;
|
||||
@@ -1030,7 +1066,8 @@ IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT
|
||||
TV_CONTROL_VOLUME, value ) ) {
|
||||
if( UpnpAddToActionResponse( out, actionName,
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
"Volume", value ) != UPNP_E_SUCCESS ) {
|
||||
"Volume", value ) != UPNP_E_SUCCESS )
|
||||
{
|
||||
( *out ) = NULL;
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
@@ -1040,6 +1077,7 @@ IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1056,9 +1094,13 @@ IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseVolume( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementVolume( 1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1075,9 +1117,13 @@ TvDeviceIncreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseVolume( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementVolume( -1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1096,9 +1142,13 @@ TvDeviceDecreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetColor( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int color = 0;
|
||||
|
||||
( *out ) = NULL;
|
||||
@@ -1138,6 +1188,7 @@ TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **erro
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1154,11 +1205,16 @@ TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **erro
|
||||
* 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 )
|
||||
IncrementColor( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curcolor;
|
||||
int newcolor;
|
||||
int curcolor,
|
||||
newcolor;
|
||||
|
||||
char *actionName;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1216,8 +1272,11 @@ IncrementColor( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseColor( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementColor( -1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1234,8 +1293,11 @@ TvDeviceDecreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseColor( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementColor( 1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1255,9 +1317,13 @@ TvDeviceIncreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetTint( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int tint = -1;
|
||||
|
||||
( *out ) = NULL;
|
||||
@@ -1316,10 +1382,14 @@ TvDeviceSetTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementTint( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curtint;
|
||||
int newtint;
|
||||
int curtint,
|
||||
newtint;
|
||||
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1362,6 +1432,7 @@ IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1378,8 +1449,11 @@ IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseTint( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementTint( 1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1397,8 +1471,11 @@ TvDeviceIncreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseTint( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementTint( -1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1418,8 +1495,11 @@ TvDeviceDecreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **
|
||||
*
|
||||
****************************************************************************/
|
||||
int
|
||||
TvDeviceSetContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetContrast( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
int contrast = -1;
|
||||
|
||||
@@ -1480,10 +1560,14 @@ TvDeviceSetContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **e
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementContrast( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementContrast( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curcontrast;
|
||||
int newcontrast;
|
||||
int curcontrast,
|
||||
newcontrast;
|
||||
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1545,8 +1629,11 @@ IncrementContrast( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, O
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseContrast( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementContrast( 1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1564,7 +1651,9 @@ TvDeviceIncreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT cha
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseContrast( IXML_Document * in,
|
||||
IXML_Document ** out,
|
||||
char **errorString )
|
||||
{
|
||||
return IncrementContrast( -1, in, out, errorString );
|
||||
}
|
||||
@@ -1582,8 +1671,11 @@ TvDeviceDecreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT cha
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetBrightness( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
int brightness = -1;
|
||||
|
||||
@@ -1626,6 +1718,7 @@ TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1643,10 +1736,13 @@ TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementBrightness( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementBrightness( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curbrightness;
|
||||
int newbrightness;
|
||||
int curbrightness,
|
||||
newbrightness;
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1707,7 +1803,9 @@ IncrementBrightness( IN int incr, IN IXML_Document *in, OUT IXML_Document **out,
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseBrightness( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementBrightness( 1, in, out, errorString );
|
||||
}
|
||||
@@ -1725,7 +1823,9 @@ TvDeviceIncreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseBrightness( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementBrightness( -1, in, out, errorString );
|
||||
}
|
||||
@@ -1749,19 +1849,29 @@ TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
* Cookie -- Optional data specified during callback registration
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie)
|
||||
int
|
||||
TvDeviceCallbackEventHandler( Upnp_EventType EventType,
|
||||
void *Event,
|
||||
void *Cookie )
|
||||
{
|
||||
switch (EventType) {
|
||||
|
||||
switch ( EventType ) {
|
||||
|
||||
case UPNP_EVENT_SUBSCRIPTION_REQUEST:
|
||||
TvDeviceHandleSubscriptionRequest((struct Upnp_Subscription_Request *)Event);
|
||||
|
||||
TvDeviceHandleSubscriptionRequest( ( struct
|
||||
Upnp_Subscription_Request
|
||||
* )Event );
|
||||
break;
|
||||
|
||||
case UPNP_CONTROL_GET_VAR_REQUEST:
|
||||
TvDeviceHandleGetVarRequest((struct Upnp_State_Var_Request *)Event);
|
||||
TvDeviceHandleGetVarRequest( ( struct Upnp_State_Var_Request
|
||||
* )Event );
|
||||
break;
|
||||
|
||||
case UPNP_CONTROL_ACTION_REQUEST:
|
||||
TvDeviceHandleActionRequest((struct Upnp_Action_Request *)Event);
|
||||
TvDeviceHandleActionRequest( ( struct Upnp_Action_Request * )
|
||||
Event );
|
||||
break;
|
||||
|
||||
/*
|
||||
@@ -1780,14 +1890,17 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co
|
||||
break;
|
||||
|
||||
default:
|
||||
SampleUtil_Print("Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
||||
EventType);
|
||||
SampleUtil_Print
|
||||
( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
||||
EventType );
|
||||
}
|
||||
|
||||
/* Print a summary of the event received */
|
||||
SampleUtil_PrintEvent(EventType, Event);
|
||||
/*
|
||||
Print a summary of the event received
|
||||
*/
|
||||
SampleUtil_PrintEvent( EventType, Event );
|
||||
|
||||
return 0;
|
||||
return ( 0 );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1799,13 +1912,13 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co
|
||||
* Parameters:
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceStop(void)
|
||||
int
|
||||
TvDeviceStop()
|
||||
{
|
||||
UpnpUnRegisterRootDevice( device_handle );
|
||||
UpnpFinish();
|
||||
SampleUtil_Finish();
|
||||
ithread_mutex_destroy( &TVDevMutex );
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1838,6 +1951,7 @@ TvDeviceStart( char *ip_address,
|
||||
print_string pfun )
|
||||
{
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
|
||||
char desc_doc_url[DESC_URL_SIZE];
|
||||
|
||||
ithread_mutex_init( &TVDevMutex, NULL );
|
||||
@@ -1847,24 +1961,26 @@ TvDeviceStart( char *ip_address,
|
||||
SampleUtil_Print(
|
||||
"Initializing UPnP Sdk with\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
ip_address, port );
|
||||
|
||||
ret = UpnpInit( ip_address, port );
|
||||
if( ret != UPNP_E_SUCCESS ) {
|
||||
if( ( ret = UpnpInit( ip_address, port ) ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error with UpnpInit -- %d\n", ret );
|
||||
UpnpFinish();
|
||||
return ret;
|
||||
}
|
||||
|
||||
if( ip_address == NULL ) {
|
||||
ip_address = UpnpGetServerIpAddress();
|
||||
}
|
||||
|
||||
if( port == 0 ) {
|
||||
port = UpnpGetServerPort();
|
||||
}
|
||||
|
||||
SampleUtil_Print(
|
||||
"UPnP Initialized\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
"\tipaddress= %s port = %u\n",
|
||||
ip_address, port );
|
||||
|
||||
if( desc_doc_name == NULL ) {
|
||||
desc_doc_name = "tvcombodesc.xml";
|
||||
@@ -1879,12 +1995,12 @@ TvDeviceStart( char *ip_address,
|
||||
|
||||
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",
|
||||
if( ( ret =
|
||||
UpnpSetWebServerRootDir( web_dir_path ) ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error specifying webserver root directory -- %s: %d\n",
|
||||
web_dir_path, ret );
|
||||
UpnpFinish();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1893,12 +2009,12 @@ TvDeviceStart( char *ip_address,
|
||||
"\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 ) {
|
||||
if( ( ret = UpnpRegisterRootDevice( desc_doc_url,
|
||||
TvDeviceCallbackEventHandler,
|
||||
&device_handle, &device_handle ) )
|
||||
!= UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error registering the rootdevice : %d\n", ret );
|
||||
UpnpFinish();
|
||||
|
||||
return ret;
|
||||
} else {
|
||||
SampleUtil_Print(
|
||||
@@ -1906,17 +2022,17 @@ TvDeviceStart( char *ip_address,
|
||||
"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 ) {
|
||||
|
||||
if( ( ret =
|
||||
UpnpSendAdvertisement( device_handle, default_advr_expire ) )
|
||||
!= UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error sending advertisements : %d\n", ret );
|
||||
UpnpFinish();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
SampleUtil_Print("Advertisements Sent\n");
|
||||
}
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,65 +1,52 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <stdio.h>
|
||||
#include <signal.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "sample_util.h"
|
||||
|
||||
|
||||
#include "ithread.h"
|
||||
#include "upnp.h"
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <unistd.h> */
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include "upnp.h"
|
||||
#include "sample_util.h"
|
||||
|
||||
//Color constants
|
||||
#define MAX_COLOR 10
|
||||
@@ -161,7 +148,8 @@ extern char *TvServiceType[];
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out, char **errorString);
|
||||
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out,
|
||||
char **errorString);
|
||||
|
||||
/* Structure for storing Tv Service
|
||||
identifiers and state table */
|
||||
@@ -205,7 +193,7 @@ extern ithread_mutex_t TVDevMutex;
|
||||
* struct TvService *out - service containing action table to set.
|
||||
*
|
||||
*****************************************************************************/
|
||||
int SetActionTable(int serviceType, struct TvService *out);
|
||||
int SetActionTable(int serviceType, struct TvService * out);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceStateTableInit
|
||||
@@ -325,7 +313,8 @@ int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*);
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDevicePowerOff
|
||||
@@ -340,7 +329,8 @@ int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **e
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetChannel
|
||||
@@ -357,7 +347,8 @@ int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **e
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseChannel
|
||||
@@ -372,7 +363,8 @@ int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseChannel
|
||||
*
|
||||
@@ -386,7 +378,8 @@ int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
/******************************************************************************
|
||||
* TvDeviceSetVolume
|
||||
*
|
||||
@@ -402,7 +395,8 @@ int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseVolume
|
||||
@@ -417,7 +411,8 @@ int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **
|
||||
* 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);
|
||||
int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
||||
OUT char **errorString);
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -433,7 +428,8 @@ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT ch
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
||||
OUT char **errorString);
|
||||
|
||||
|
||||
//Picture Service Actions
|
||||
@@ -453,7 +449,8 @@ int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT ch
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -468,7 +465,8 @@ int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **e
|
||||
* 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);
|
||||
int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseColor
|
||||
@@ -482,7 +480,8 @@ int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT ch
|
||||
* 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);
|
||||
int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetTint
|
||||
@@ -499,7 +498,8 @@ int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT ch
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseTint
|
||||
@@ -514,7 +514,8 @@ int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **er
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseTint
|
||||
@@ -529,7 +530,8 @@ int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/*****************************************************************************
|
||||
* TvDeviceSetContrast
|
||||
@@ -546,7 +548,8 @@ int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
****************************************************************************/
|
||||
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseContrast
|
||||
@@ -562,7 +565,8 @@ int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseContrast
|
||||
*
|
||||
@@ -576,7 +580,8 @@ int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetBrightness
|
||||
@@ -590,7 +595,8 @@ int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT
|
||||
* brightness -- The brightness value to change to.
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseBrightness
|
||||
@@ -605,7 +611,8 @@ int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT cha
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseBrightness
|
||||
@@ -619,11 +626,12 @@ int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OU
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
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);
|
||||
int TvDeviceStop();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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"
|
||||
@@ -401,29 +401,29 @@ TvCtrlPointProcessCommand( char *cmdline )
|
||||
return TV_SUCCESS;
|
||||
}
|
||||
|
||||
int main( int argc, char **argv )
|
||||
int
|
||||
main( int argc,
|
||||
char **argv )
|
||||
{
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
#ifndef WIN32
|
||||
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 );
|
||||
// start a command loop thread
|
||||
code =
|
||||
ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop,
|
||||
NULL );
|
||||
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
#ifndef WIN32
|
||||
/*
|
||||
Catch Ctrl-C and properly shutdown
|
||||
*/
|
||||
@@ -431,11 +431,11 @@ int main( int argc, char **argv )
|
||||
sigaddset( &sigs_to_catch, SIGINT );
|
||||
sigwait( &sigs_to_catch, &sig );
|
||||
|
||||
SampleUtil_Print( "Shutting down on signal %d...\n", sig );
|
||||
SampleUtil_Print( "Shutting down on signal %d...", sig );
|
||||
#else
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#endif
|
||||
|
||||
rc = TvCtrlPointStop();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,42 +1,37 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
@@ -53,7 +48,7 @@ char *TvServiceType[] = {
|
||||
};
|
||||
char *TvServiceName[] = { "Control", "Picture" };
|
||||
|
||||
/*!
|
||||
/*
|
||||
Global arrays for storing variable names and counts for
|
||||
TvControl and TvPicture services
|
||||
*/
|
||||
@@ -64,12 +59,12 @@ char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS] = {
|
||||
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;
|
||||
@@ -143,10 +138,11 @@ TvCtrlPointDeleteNode( struct TvDeviceNode *node )
|
||||
* UDN -- The Unique Device Name for the device to remove
|
||||
*
|
||||
********************************************************************************/
|
||||
int TvCtrlPointRemoveDevice(const char *UDN)
|
||||
int
|
||||
TvCtrlPointRemoveDevice( char *UDN )
|
||||
{
|
||||
struct TvDeviceNode *curdevnode;
|
||||
struct TvDeviceNode *prevdevnode;
|
||||
struct TvDeviceNode *curdevnode,
|
||||
*prevdevnode;
|
||||
|
||||
ithread_mutex_lock( &DeviceListMutex );
|
||||
|
||||
@@ -672,8 +668,8 @@ TvCtrlPointPrintDevice( int devnum )
|
||||
*
|
||||
********************************************************************************/
|
||||
void
|
||||
TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
const char *location,
|
||||
TvCtrlPointAddDevice( IXML_Document * DescDoc,
|
||||
char *location,
|
||||
int expires )
|
||||
{
|
||||
char *deviceType = NULL;
|
||||
@@ -686,19 +682,20 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
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 };
|
||||
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;
|
||||
int service,
|
||||
var;
|
||||
|
||||
ithread_mutex_lock( &DeviceListMutex );
|
||||
|
||||
/* Read key elements from description document */
|
||||
/*
|
||||
Read key elements from description document
|
||||
*/
|
||||
UDN = SampleUtil_GetFirstDocumentItem( DescDoc, "UDN" );
|
||||
deviceType = SampleUtil_GetFirstDocumentItem( DescDoc, "deviceType" );
|
||||
friendlyName =
|
||||
@@ -706,8 +703,9 @@ TvCtrlPointAddDevice( IXML_Document *DescDoc,
|
||||
baseURL = SampleUtil_GetFirstDocumentItem( DescDoc, "URLBase" );
|
||||
relURL = SampleUtil_GetFirstDocumentItem( DescDoc, "presentationURL" );
|
||||
|
||||
ret = UpnpResolveURL(
|
||||
( baseURL ? baseURL : location ), relURL, presURL);
|
||||
ret =
|
||||
UpnpResolveURL( ( baseURL ? baseURL : location ), relURL,
|
||||
presURL );
|
||||
|
||||
if( UPNP_E_SUCCESS != ret )
|
||||
SampleUtil_Print( "Error generating presURL from %s + %s", baseURL,
|
||||
@@ -941,36 +939,34 @@ TvStateUpdate( char *UDN,
|
||||
* changes -- The DOM document representing the changes
|
||||
*
|
||||
********************************************************************************/
|
||||
void TvCtrlPointHandleEvent(
|
||||
const char *sid,
|
||||
void
|
||||
TvCtrlPointHandleEvent( Upnp_SID sid,
|
||||
int evntkey,
|
||||
IXML_Document *changes)
|
||||
IXML_Document * changes )
|
||||
{
|
||||
struct TvDeviceNode *tmpdevnode;
|
||||
int service;
|
||||
|
||||
ithread_mutex_lock(&DeviceListMutex);
|
||||
ithread_mutex_lock( &DeviceListMutex );
|
||||
|
||||
tmpdevnode = GlobalDeviceList;
|
||||
while (tmpdevnode) {
|
||||
for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) {
|
||||
if (strcmp(tmpdevnode->device.TvService[service].SID, sid) == 0) {
|
||||
SampleUtil_Print("Received Tv %s Event: %d for SID %s",
|
||||
TvServiceName[service],
|
||||
evntkey,
|
||||
sid);
|
||||
TvStateUpdate(
|
||||
tmpdevnode->device.UDN,
|
||||
service,
|
||||
changes,
|
||||
(char **)&tmpdevnode->device.TvService[service].VariableStrVal);
|
||||
while( tmpdevnode ) {
|
||||
for( service = 0; service < TV_SERVICE_SERVCOUNT; service++ ) {
|
||||
if( strcmp( tmpdevnode->device.TvService[service].SID, sid ) ==
|
||||
0 ) {
|
||||
SampleUtil_Print( "Received Tv %s Event: %d for SID %s",
|
||||
TvServiceName[service], evntkey, sid );
|
||||
|
||||
TvStateUpdate( tmpdevnode->device.UDN, service, changes,
|
||||
( char ** )&tmpdevnode->device.
|
||||
TvService[service].VariableStrVal );
|
||||
break;
|
||||
}
|
||||
}
|
||||
tmpdevnode = tmpdevnode->next;
|
||||
}
|
||||
|
||||
ithread_mutex_unlock(&DeviceListMutex);
|
||||
ithread_mutex_unlock( &DeviceListMutex );
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
@@ -987,10 +983,10 @@ void TvCtrlPointHandleEvent(
|
||||
* timeout -- The new timeout for the subscription
|
||||
*
|
||||
********************************************************************************/
|
||||
void TvCtrlPointHandleSubscribeUpdate(
|
||||
const char *eventURL,
|
||||
const Upnp_SID sid,
|
||||
int timeout)
|
||||
void
|
||||
TvCtrlPointHandleSubscribeUpdate( char *eventURL,
|
||||
Upnp_SID sid,
|
||||
int timeout )
|
||||
{
|
||||
struct TvDeviceNode *tmpdevnode;
|
||||
int service;
|
||||
@@ -1018,10 +1014,10 @@ void TvCtrlPointHandleSubscribeUpdate(
|
||||
ithread_mutex_unlock( &DeviceListMutex );
|
||||
}
|
||||
|
||||
void TvCtrlPointHandleGetVar(
|
||||
const char *controlURL,
|
||||
const char *varName,
|
||||
const DOMString varValue)
|
||||
void
|
||||
TvCtrlPointHandleGetVar( char *controlURL,
|
||||
char *varName,
|
||||
DOMString varValue )
|
||||
{
|
||||
|
||||
struct TvDeviceNode *tmpdevnode;
|
||||
@@ -1030,11 +1026,14 @@ void TvCtrlPointHandleGetVar(
|
||||
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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1058,130 +1057,179 @@ void TvCtrlPointHandleGetVar(
|
||||
* Cookie -- Optional data specified during callback registration
|
||||
*
|
||||
********************************************************************************/
|
||||
int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie)
|
||||
int
|
||||
TvCtrlPointCallbackEventHandler( Upnp_EventType EventType,
|
||||
void *Event,
|
||||
void *Cookie )
|
||||
{
|
||||
/*int errCode = 0;*/
|
||||
SampleUtil_PrintEvent( EventType, Event );
|
||||
|
||||
SampleUtil_PrintEvent(EventType, Event);
|
||||
switch ( EventType ) {
|
||||
/* SSDP Stuff */
|
||||
/*
|
||||
SSDP Stuff
|
||||
*/
|
||||
case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
|
||||
case UPNP_DISCOVERY_SEARCH_RESULT: {
|
||||
struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event;
|
||||
case UPNP_DISCOVERY_SEARCH_RESULT:
|
||||
{
|
||||
struct Upnp_Discovery *d_event =
|
||||
( struct Upnp_Discovery * )Event;
|
||||
IXML_Document *DescDoc = NULL;
|
||||
int ret;
|
||||
|
||||
if (d_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Discovery Callback -- %d", d_event->ErrCode);
|
||||
if( d_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error in Discovery Callback -- %d",
|
||||
d_event->ErrCode );
|
||||
}
|
||||
ret = UpnpDownloadXmlDoc(d_event->Location, &DescDoc);
|
||||
if (ret != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error obtaining device description from %s -- error = %d",
|
||||
d_event->Location, ret);
|
||||
|
||||
if( ( ret =
|
||||
UpnpDownloadXmlDoc( d_event->Location,
|
||||
&DescDoc ) ) !=
|
||||
UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error obtaining device description from %s -- error = %d",
|
||||
d_event->Location, ret );
|
||||
} else {
|
||||
TvCtrlPointAddDevice(
|
||||
DescDoc, d_event->Location, d_event->Expires);
|
||||
}
|
||||
if (DescDoc) {
|
||||
ixmlDocument_free(DescDoc);
|
||||
TvCtrlPointAddDevice( DescDoc, d_event->Location,
|
||||
d_event->Expires );
|
||||
}
|
||||
|
||||
if( DescDoc )
|
||||
ixmlDocument_free( DescDoc );
|
||||
|
||||
TvCtrlPointPrintList();
|
||||
break;
|
||||
}
|
||||
|
||||
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
||||
/* Nothing to do here... */
|
||||
/*
|
||||
Nothing to do here...
|
||||
*/
|
||||
break;
|
||||
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: {
|
||||
struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event;
|
||||
|
||||
if (d_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Discovery ByeBye Callback -- %d", d_event->ErrCode);
|
||||
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
|
||||
{
|
||||
struct Upnp_Discovery *d_event =
|
||||
( struct Upnp_Discovery * )Event;
|
||||
|
||||
if( d_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Discovery ByeBye Callback -- %d",
|
||||
d_event->ErrCode );
|
||||
}
|
||||
SampleUtil_Print("Received ByeBye for Device: %s", d_event->DeviceId);
|
||||
TvCtrlPointRemoveDevice(d_event->DeviceId);
|
||||
SampleUtil_Print("After byebye:");
|
||||
|
||||
SampleUtil_Print( "Received ByeBye for Device: %s",
|
||||
d_event->DeviceId );
|
||||
TvCtrlPointRemoveDevice( d_event->DeviceId );
|
||||
|
||||
SampleUtil_Print( "After byebye:" );
|
||||
TvCtrlPointPrintList();
|
||||
|
||||
break;
|
||||
}
|
||||
/* SOAP Stuff */
|
||||
case UPNP_CONTROL_ACTION_COMPLETE: {
|
||||
struct Upnp_Action_Complete *a_event = (struct Upnp_Action_Complete *)Event;
|
||||
|
||||
if (a_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Action Complete Callback -- %d", a_event->ErrCode);
|
||||
/*
|
||||
SOAP Stuff
|
||||
*/
|
||||
case UPNP_CONTROL_ACTION_COMPLETE:
|
||||
{
|
||||
struct Upnp_Action_Complete *a_event =
|
||||
( struct Upnp_Action_Complete * )Event;
|
||||
|
||||
if( a_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Action Complete Callback -- %d",
|
||||
a_event->ErrCode );
|
||||
}
|
||||
/* No need for any processing here, just print out results.
|
||||
* Service state table updates are handled by events. */
|
||||
|
||||
/*
|
||||
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: {
|
||||
struct Upnp_State_Var_Complete *sv_event = (struct Upnp_State_Var_Complete *)Event;
|
||||
|
||||
if (sv_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Get Var Complete Callback -- %d", sv_event->ErrCode);
|
||||
case UPNP_CONTROL_GET_VAR_COMPLETE:
|
||||
{
|
||||
struct Upnp_State_Var_Complete *sv_event =
|
||||
( struct Upnp_State_Var_Complete * )Event;
|
||||
|
||||
if( sv_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Get Var Complete Callback -- %d",
|
||||
sv_event->ErrCode );
|
||||
} else {
|
||||
TvCtrlPointHandleGetVar(
|
||||
sv_event->CtrlUrl,
|
||||
TvCtrlPointHandleGetVar( sv_event->CtrlUrl,
|
||||
sv_event->StateVarName,
|
||||
sv_event->CurrentVal);
|
||||
sv_event->CurrentVal );
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* GENA Stuff */
|
||||
case UPNP_EVENT_RECEIVED: {
|
||||
struct Upnp_Event *e_event = (struct Upnp_Event *)Event;
|
||||
|
||||
TvCtrlPointHandleEvent(
|
||||
e_event->Sid,
|
||||
e_event->EventKey,
|
||||
e_event->ChangedVariables);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
GENA Stuff
|
||||
*/
|
||||
case UPNP_EVENT_RECEIVED:
|
||||
{
|
||||
struct Upnp_Event *e_event = ( struct Upnp_Event * )Event;
|
||||
|
||||
TvCtrlPointHandleEvent( e_event->Sid, e_event->EventKey,
|
||||
e_event->ChangedVariables );
|
||||
break;
|
||||
}
|
||||
|
||||
case UPNP_EVENT_SUBSCRIBE_COMPLETE:
|
||||
case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
|
||||
case UPNP_EVENT_RENEWAL_COMPLETE: {
|
||||
struct Upnp_Event_Subscribe *es_event = (struct Upnp_Event_Subscribe *)Event;
|
||||
case UPNP_EVENT_RENEWAL_COMPLETE:
|
||||
{
|
||||
struct Upnp_Event_Subscribe *es_event =
|
||||
( struct Upnp_Event_Subscribe * )Event;
|
||||
|
||||
if (es_event->ErrCode != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print(
|
||||
"Error in Event Subscribe Callback -- %d", es_event->ErrCode);
|
||||
if( es_event->ErrCode != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error in Event Subscribe Callback -- %d",
|
||||
es_event->ErrCode );
|
||||
} else {
|
||||
TvCtrlPointHandleSubscribeUpdate(
|
||||
es_event->PublisherUrl,
|
||||
TvCtrlPointHandleSubscribeUpdate( es_event->
|
||||
PublisherUrl,
|
||||
es_event->Sid,
|
||||
es_event->TimeOut);
|
||||
es_event->TimeOut );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case UPNP_EVENT_AUTORENEWAL_FAILED:
|
||||
case UPNP_EVENT_SUBSCRIPTION_EXPIRED: {
|
||||
struct Upnp_Event_Subscribe *es_event = (struct Upnp_Event_Subscribe *)Event;
|
||||
case UPNP_EVENT_SUBSCRIPTION_EXPIRED:
|
||||
{
|
||||
int TimeOut = default_timeout;
|
||||
Upnp_SID newSID;
|
||||
int ret;
|
||||
|
||||
ret = UpnpSubscribe(
|
||||
ctrlpt_handle,
|
||||
es_event->PublisherUrl,
|
||||
&TimeOut,
|
||||
newSID);
|
||||
if (ret == UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print("Subscribed to EventURL with SID=%s", newSID);
|
||||
TvCtrlPointHandleSubscribeUpdate(
|
||||
es_event->PublisherUrl,
|
||||
newSID,
|
||||
TimeOut);
|
||||
struct Upnp_Event_Subscribe *es_event =
|
||||
( struct Upnp_Event_Subscribe * )Event;
|
||||
|
||||
ret =
|
||||
UpnpSubscribe( ctrlpt_handle, es_event->PublisherUrl,
|
||||
&TimeOut, newSID );
|
||||
|
||||
if( ret == UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Subscribed to EventURL with SID=%s",
|
||||
newSID );
|
||||
TvCtrlPointHandleSubscribeUpdate( es_event->
|
||||
PublisherUrl, newSID,
|
||||
TimeOut );
|
||||
} else {
|
||||
SampleUtil_Print("Error Subscribing to EventURL -- %d", ret);
|
||||
SampleUtil_Print
|
||||
( "Error Subscribing to EventURL -- %d", ret );
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* ignore these cases, since this is not a device */
|
||||
|
||||
/*
|
||||
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:
|
||||
@@ -1272,12 +1320,12 @@ TvCtrlPointVerifyTimeouts( int incr )
|
||||
* None
|
||||
*
|
||||
********************************************************************************/
|
||||
static int TvCtrlPointTimerLoopRun = 1;
|
||||
void *TvCtrlPointTimerLoop(void *args)
|
||||
void *
|
||||
TvCtrlPointTimerLoop( void *args )
|
||||
{
|
||||
int incr = 30; // how often to verify the timeouts, in seconds
|
||||
|
||||
while (TvCtrlPointTimerLoopRun) {
|
||||
while( 1 ) {
|
||||
isleep( incr );
|
||||
TvCtrlPointVerifyTimeouts( incr );
|
||||
}
|
||||
@@ -1300,67 +1348,66 @@ void *TvCtrlPointTimerLoop(void *args)
|
||||
* TV_SUCCESS if everything went well, else TV_ERROR
|
||||
*
|
||||
********************************************************************************/
|
||||
int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionPtr)
|
||||
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);
|
||||
SampleUtil_Initialize( printFunctionPtr );
|
||||
SampleUtil_RegisterUpdateFunction( updateFunctionPtr );
|
||||
|
||||
ithread_mutex_init(&DeviceListMutex, 0);
|
||||
ithread_mutex_init( &DeviceListMutex, 0 );
|
||||
|
||||
SampleUtil_Print(
|
||||
"Initializing UPnP Sdk with\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
ip_address, port );
|
||||
|
||||
rc = UpnpInit(ip_address, port);
|
||||
if (rc != UPNP_E_SUCCESS) {
|
||||
SampleUtil_Print("WinCEStart: UpnpInit() Error: %d", rc);
|
||||
rc = UpnpInit( ip_address, port );
|
||||
if( UPNP_E_SUCCESS != rc ) {
|
||||
SampleUtil_Print( "WinCEStart: UpnpInit() Error: %d", rc );
|
||||
UpnpFinish();
|
||||
return TV_ERROR;
|
||||
}
|
||||
if (!ip_address) {
|
||||
|
||||
if( NULL == ip_address ) {
|
||||
ip_address = UpnpGetServerIpAddress();
|
||||
}
|
||||
if (!port) {
|
||||
if( 0 == port ) {
|
||||
port = UpnpGetServerPort();
|
||||
}
|
||||
|
||||
SampleUtil_Print(
|
||||
"UPnP Initialized\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
"\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( "Registering Control Point" );
|
||||
rc = UpnpRegisterClient( TvCtrlPointCallbackEventHandler,
|
||||
&ctrlpt_handle, &ctrlpt_handle );
|
||||
if( UPNP_E_SUCCESS != rc ) {
|
||||
SampleUtil_Print( "Error registering CP: %d", rc );
|
||||
UpnpFinish();
|
||||
|
||||
return TV_ERROR;
|
||||
}
|
||||
|
||||
SampleUtil_Print("Control Point Registered");
|
||||
SampleUtil_Print( "Control Point Registered" );
|
||||
|
||||
TvCtrlPointRefresh();
|
||||
|
||||
/* start a timer thread */
|
||||
ithread_create(&timer_thread, NULL, TvCtrlPointTimerLoop, NULL);
|
||||
ithread_detach(timer_thread);
|
||||
// start a timer thread
|
||||
ithread_create( &timer_thread, NULL, TvCtrlPointTimerLoop, NULL );
|
||||
|
||||
return TV_SUCCESS;
|
||||
}
|
||||
|
||||
int TvCtrlPointStop(void)
|
||||
int
|
||||
TvCtrlPointStop( void )
|
||||
{
|
||||
TvCtrlPointTimerLoopRun = 0;
|
||||
TvCtrlPointRemoveAll();
|
||||
UpnpUnRegisterClient( ctrlpt_handle );
|
||||
UpnpFinish();
|
||||
@@ -1368,4 +1415,3 @@ int TvCtrlPointStop(void)
|
||||
|
||||
return TV_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,66 +1,55 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <stdio.h>
|
||||
|
||||
#include "ithread.h"
|
||||
#include "upnp.h"
|
||||
#include "UpnpString.h"
|
||||
#include "upnptools.h"
|
||||
|
||||
|
||||
#include <signal.h>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <unistd.h> */
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include "upnp.h"
|
||||
#include "upnptools.h"
|
||||
#include "sample_util.h"
|
||||
|
||||
#define TV_SERVICE_SERVCOUNT 2
|
||||
#define TV_SERVICE_CONTROL 0
|
||||
@@ -121,11 +110,11 @@ extern ithread_mutex_t DeviceListMutex;
|
||||
|
||||
extern UpnpClient_Handle ctrlpt_handle;
|
||||
|
||||
void TvCtrlPointPrintHelp(void);
|
||||
int TvCtrlPointDeleteNode(struct TvDeviceNode *);
|
||||
int TvCtrlPointRemoveDevice(const char *);
|
||||
int TvCtrlPointRemoveAll(void);
|
||||
int TvCtrlPointRefresh(void);
|
||||
void TvCtrlPointPrintHelp( void );
|
||||
int TvCtrlPointDeleteNode(struct TvDeviceNode*);
|
||||
int TvCtrlPointRemoveDevice(char*);
|
||||
int TvCtrlPointRemoveAll( void );
|
||||
int TvCtrlPointRefresh( void );
|
||||
|
||||
|
||||
int TvCtrlPointSendAction(int, int, char *, char **, char **, int);
|
||||
@@ -149,20 +138,20 @@ int TvCtrlPointGetContrast(int);
|
||||
int TvCtrlPointGetBrightness(int);
|
||||
|
||||
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
|
||||
int TvCtrlPointPrintList(void);
|
||||
int TvCtrlPointPrintList( void );
|
||||
int TvCtrlPointPrintDevice(int);
|
||||
void TvCtrlPointAddDevice(IXML_Document *, const char *, int);
|
||||
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
||||
void TvCtrlPointAddDevice (IXML_Document *, char *, int);
|
||||
void TvCtrlPointHandleGetVar(char *,char *,DOMString);
|
||||
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
||||
void TvCtrlPointHandleEvent(const char *, int, IXML_Document *);
|
||||
void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int);
|
||||
void TvCtrlPointHandleEvent(Upnp_SID, int, IXML_Document *);
|
||||
void TvCtrlPointHandleSubscribeUpdate(char *, 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);
|
||||
void TvCtrlPointPrintCommands( void );
|
||||
void* TvCtrlPointCommandLoop( void* );
|
||||
int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr );
|
||||
int TvCtrlPointStop( void );
|
||||
int TvCtrlPointProcessCommand( char *cmdline );
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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"
|
||||
@@ -130,8 +130,7 @@ int main( IN int argc, IN char **argv )
|
||||
*web_dir_path = NULL;
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
#ifndef WIN32
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
@@ -179,9 +178,7 @@ int main( IN int argc, IN char **argv )
|
||||
/* start a command loop thread */
|
||||
code = ithread_create( &cmdloop_thread, NULL, TvDeviceCommandLoop, NULL );
|
||||
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
#ifndef WIN32
|
||||
/*
|
||||
Catch Ctrl-C and properly shutdown
|
||||
*/
|
||||
@@ -190,6 +187,8 @@ int main( IN int argc, IN char **argv )
|
||||
sigwait( &sigs_to_catch, &sig );
|
||||
|
||||
SampleUtil_Print( "Shutting down on signal %d...\n", sig );
|
||||
#else
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#endif
|
||||
rc = TvDeviceStop();
|
||||
|
||||
|
||||
@@ -1,47 +1,40 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <assert.h>
|
||||
|
||||
|
||||
#define DEFAULT_WEB_DIR "./web"
|
||||
|
||||
|
||||
#define DESC_URL_SIZE 200
|
||||
|
||||
|
||||
/*
|
||||
Device type for tv device
|
||||
*/
|
||||
@@ -187,6 +180,7 @@ SetServiceTable( IN int serviceType,
|
||||
}
|
||||
|
||||
return SetActionTable( serviceType, out );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -257,6 +251,7 @@ SetActionTable( IN int serviceType,
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -373,66 +368,61 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
||||
* sr_event -- The subscription request event structure
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_event)
|
||||
int
|
||||
TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
||||
*sr_event )
|
||||
{
|
||||
unsigned int i = 0;
|
||||
int cmp1 = 0;
|
||||
int cmp2 = 0;
|
||||
const char *l_serviceId = NULL;
|
||||
const char *l_udn = NULL;
|
||||
const char *l_sid = NULL;
|
||||
unsigned int i = 0; //,j=0;
|
||||
|
||||
// lock state mutex
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
// IXML_Document *PropSet=NULL;
|
||||
|
||||
l_serviceId = sr_event->ServiceId;
|
||||
l_udn = sr_event->UDN;
|
||||
l_sid = sr_event->Sid;
|
||||
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
|
||||
//lock state mutex
|
||||
ithread_mutex_lock( &TVDevMutex );
|
||||
|
||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
||||
if( ( strcmp( sr_event->UDN, tv_service_table[i].UDN ) == 0 ) &&
|
||||
( strcmp( sr_event->ServiceId, tv_service_table[i].ServiceId )
|
||||
== 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,
|
||||
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
|
||||
//dump initial state
|
||||
UpnpAcceptSubscriptionExt(device_handle, sr_event->UDN,
|
||||
sr_event->ServiceId,
|
||||
PropSet,sr_event->Sid);
|
||||
//free document
|
||||
Document_free(PropSet);
|
||||
#endif
|
||||
UpnpAcceptSubscription(
|
||||
device_handle,
|
||||
l_udn,
|
||||
l_serviceId,
|
||||
(const char **)tv_service_table[i].
|
||||
|
||||
*/
|
||||
|
||||
UpnpAcceptSubscription( device_handle,
|
||||
sr_event->UDN,
|
||||
sr_event->ServiceId,
|
||||
( const char ** )tv_service_table[i].
|
||||
VariableName,
|
||||
(const char **)tv_service_table[i].
|
||||
( const char ** )tv_service_table[i].
|
||||
VariableStrVal,
|
||||
tv_service_table[i].VariableCount,
|
||||
l_sid);
|
||||
sr_event->Sid );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ithread_mutex_unlock(&TVDevMutex);
|
||||
ithread_mutex_unlock( &TVDevMutex );
|
||||
|
||||
return 1;
|
||||
return ( 1 );
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceHandleGetVarRequest
|
||||
*
|
||||
@@ -445,52 +435,52 @@ int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_ev
|
||||
* cgv_event -- The control get variable request event structure
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||
int
|
||||
TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request
|
||||
*cgv_event )
|
||||
{
|
||||
unsigned int i = 0;
|
||||
unsigned int j = 0;
|
||||
unsigned int i = 0,
|
||||
j = 0;
|
||||
int getvar_succeeded = 0;
|
||||
|
||||
cgv_event->CurrentVal = NULL;
|
||||
|
||||
ithread_mutex_lock(&TVDevMutex);
|
||||
ithread_mutex_lock( &TVDevMutex );
|
||||
|
||||
for (i = 0; i < TV_SERVICE_SERVCOUNT; i++) {
|
||||
// check udn and service id
|
||||
const char *devUDN =
|
||||
cgv_event->DevUDN;
|
||||
const char *serviceID =
|
||||
cgv_event->ServiceID;
|
||||
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 =
|
||||
cgv_event->StateVarName;
|
||||
if (strcmp(stateVarName,
|
||||
tv_service_table[i].VariableName[j]) == 0) {
|
||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
||||
//check udn and service id
|
||||
if( ( strcmp( cgv_event->DevUDN, tv_service_table[i].UDN ) == 0 )
|
||||
&&
|
||||
( strcmp( cgv_event->ServiceID, tv_service_table[i].ServiceId )
|
||||
== 0 ) ) {
|
||||
//check variable name
|
||||
for( j = 0; j < tv_service_table[i].VariableCount; j++ ) {
|
||||
if( strcmp( cgv_event->StateVarName,
|
||||
tv_service_table[i].VariableName[j] ) == 0 ) {
|
||||
getvar_succeeded = 1;
|
||||
cgv_event->CurrentVal = ixmlCloneDOMString(
|
||||
tv_service_table[i].VariableStrVal[j]);
|
||||
cgv_event->CurrentVal =
|
||||
ixmlCloneDOMString( tv_service_table[i].
|
||||
VariableStrVal[j] );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (getvar_succeeded) {
|
||||
|
||||
if( getvar_succeeded ) {
|
||||
cgv_event->ErrCode = UPNP_E_SUCCESS;
|
||||
} else {
|
||||
SampleUtil_Print(
|
||||
"Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n"
|
||||
" Unknown variable name = %s\n",
|
||||
cgv_event->StateVarName);
|
||||
SampleUtil_Print
|
||||
( "Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" );
|
||||
SampleUtil_Print( " Unknown variable name = %s\n",
|
||||
cgv_event->StateVarName );
|
||||
cgv_event->ErrCode = 404;
|
||||
strcpy(cgv_event->ErrStr, "Invalid Variable");
|
||||
strcpy( cgv_event->ErrStr, "Invalid Variable" );
|
||||
}
|
||||
|
||||
ithread_mutex_unlock(&TVDevMutex);
|
||||
ithread_mutex_unlock( &TVDevMutex );
|
||||
|
||||
return cgv_event->ErrCode == UPNP_E_SUCCESS;
|
||||
return ( cgv_event->ErrCode == UPNP_E_SUCCESS );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -505,47 +495,63 @@ int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||
* ca_event -- The control action request event structure
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||
int
|
||||
TvDeviceHandleActionRequest( INOUT struct Upnp_Action_Request *ca_event )
|
||||
{
|
||||
/* Defaults if action not found. */
|
||||
|
||||
/*
|
||||
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;
|
||||
|
||||
ca_event->ErrCode = 0;
|
||||
ca_event->ActionResult = NULL;
|
||||
|
||||
devUDN = ca_event->DevUDN;
|
||||
serviceID = ca_event->ServiceID;
|
||||
actionName = ca_event->ActionName;
|
||||
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. */
|
||||
if( ( strcmp( ca_event->DevUDN,
|
||||
tv_service_table[TV_SERVICE_CONTROL].UDN ) == 0 ) &&
|
||||
( strcmp
|
||||
( ca_event->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. */
|
||||
} else if( ( strcmp( ca_event->DevUDN,
|
||||
tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 )
|
||||
&&
|
||||
( strcmp
|
||||
( ca_event->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](
|
||||
ca_event->ActionRequest,
|
||||
&ca_event->ActionResult,
|
||||
&errorString);
|
||||
//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( ca_event->ActionName,
|
||||
tv_service_table[service].ActionNames[i] ) ) {
|
||||
|
||||
if( ( !strcmp( tv_service_table[TV_SERVICE_CONTROL].
|
||||
VariableStrVal[TV_CONTROL_POWER], "1" ) )
|
||||
|| ( !strcmp( ca_event->ActionName, "PowerOn" ) ) ) {
|
||||
retCode =
|
||||
tv_service_table[service].actions[i] ( ca_event->
|
||||
ActionRequest,
|
||||
&ca_event->
|
||||
ActionResult,
|
||||
&errorString );
|
||||
} else {
|
||||
errorString = "Power is Off";
|
||||
retCode = UPNP_E_INTERNAL_ERROR;
|
||||
@@ -555,29 +561,34 @@ int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||
}
|
||||
}
|
||||
|
||||
if (!action_found) {
|
||||
if( !action_found ) {
|
||||
ca_event->ActionResult = NULL;
|
||||
strcpy(ca_event->ErrStr, "Invalid Action");
|
||||
strcpy( ca_event->ErrStr, "Invalid Action" );
|
||||
ca_event->ErrCode = 401;
|
||||
} else {
|
||||
if (retCode == UPNP_E_SUCCESS) {
|
||||
if( retCode == UPNP_E_SUCCESS ) {
|
||||
ca_event->ErrCode = UPNP_E_SUCCESS;
|
||||
} else {
|
||||
// copy the error string
|
||||
strcpy(ca_event->ErrStr, errorString);
|
||||
switch (retCode) {
|
||||
//copy the error string
|
||||
strcpy( ca_event->ErrStr, errorString );
|
||||
switch ( retCode ) {
|
||||
case UPNP_E_INVALID_PARAM:
|
||||
{
|
||||
ca_event->ErrCode = 402;
|
||||
break;
|
||||
}
|
||||
case UPNP_E_INTERNAL_ERROR:
|
||||
default:
|
||||
{
|
||||
ca_event->ErrCode = 501;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ca_event->ErrCode;
|
||||
return ( ca_event->ErrCode );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -640,6 +651,7 @@ TvDeviceSetServiceTableVar( IN unsigned int service,
|
||||
ithread_mutex_unlock( &TVDevMutex );
|
||||
|
||||
return ( 1 );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -662,7 +674,7 @@ TvDeviceSetPower( IN int on )
|
||||
|
||||
if( on != POWER_ON && on != POWER_OFF ) {
|
||||
SampleUtil_Print( "error: can't set power to value %d\n", on );
|
||||
return 0;
|
||||
return ( 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -673,7 +685,7 @@ TvDeviceSetPower( IN int on )
|
||||
ret = TvDeviceSetServiceTableVar( TV_SERVICE_CONTROL, TV_CONTROL_POWER,
|
||||
value );
|
||||
|
||||
return ret;
|
||||
return ( ret );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -690,7 +702,9 @@ TvDeviceSetPower( IN int on )
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDevicePowerOn( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
( *out ) = NULL;
|
||||
( *errorString ) = NULL;
|
||||
@@ -710,6 +724,7 @@ TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -727,7 +742,7 @@ TvDevicePowerOn( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDevicePowerOff( IN IXML_Document * in,
|
||||
OUT IXML_Document **out,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
( *out ) = NULL;
|
||||
@@ -766,8 +781,11 @@ TvDevicePowerOff( IN IXML_Document * in,
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetChannel( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int channel = 0;
|
||||
@@ -812,6 +830,7 @@ TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **er
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -829,10 +848,13 @@ TvDeviceSetChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **er
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementChannel( IN int incr, IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementChannel( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curchannel;
|
||||
int newchannel;
|
||||
int curchannel,
|
||||
newchannel;
|
||||
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
@@ -894,9 +916,12 @@ IncrementChannel( IN int incr, IN IXML_Document * in, OUT IXML_Document **out, O
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseChannel( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementChannel( -1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -913,9 +938,12 @@ TvDeviceDecreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseChannel( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementChannel( 1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -934,9 +962,13 @@ TvDeviceIncreaseChannel( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetVolume( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int volume = 0;
|
||||
|
||||
( *out ) = NULL;
|
||||
@@ -977,6 +1009,7 @@ TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **err
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -995,7 +1028,10 @@ TvDeviceSetVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **err
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementVolume( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curvolume,
|
||||
newvolume;
|
||||
@@ -1032,7 +1068,8 @@ IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT
|
||||
TV_CONTROL_VOLUME, value ) ) {
|
||||
if( UpnpAddToActionResponse( out, actionName,
|
||||
TvServiceType[TV_SERVICE_CONTROL],
|
||||
"Volume", value ) != UPNP_E_SUCCESS ) {
|
||||
"Volume", value ) != UPNP_E_SUCCESS )
|
||||
{
|
||||
( *out ) = NULL;
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
@@ -1042,6 +1079,7 @@ IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1058,9 +1096,13 @@ IncrementVolume( IN int incr, IN IXML_Document *in,OUT IXML_Document **out, OUT
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseVolume( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementVolume( 1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1077,9 +1119,13 @@ TvDeviceIncreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseVolume( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementVolume( -1, in, out, errorString );
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1098,9 +1144,13 @@ TvDeviceDecreaseVolume( IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetColor( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int color = 0;
|
||||
|
||||
( *out ) = NULL;
|
||||
@@ -1140,6 +1190,7 @@ TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **erro
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1156,11 +1207,16 @@ TvDeviceSetColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **erro
|
||||
* 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 )
|
||||
IncrementColor( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curcolor;
|
||||
int newcolor;
|
||||
int curcolor,
|
||||
newcolor;
|
||||
|
||||
char *actionName;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1218,8 +1274,11 @@ IncrementColor( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseColor( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementColor( -1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1236,8 +1295,11 @@ TvDeviceDecreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseColor( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementColor( 1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1257,9 +1319,13 @@ TvDeviceIncreaseColor( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetTint( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
|
||||
int tint = -1;
|
||||
|
||||
( *out ) = NULL;
|
||||
@@ -1318,10 +1384,14 @@ TvDeviceSetTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **error
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementTint( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curtint;
|
||||
int newtint;
|
||||
int curtint,
|
||||
newtint;
|
||||
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1364,6 +1434,7 @@ IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1380,8 +1451,11 @@ IncrementTint( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseTint( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementTint( 1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1399,8 +1473,11 @@ TvDeviceIncreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseTint( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementTint( -1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1420,8 +1497,11 @@ TvDeviceDecreaseTint( IN IXML_Document *in, OUT IXML_Document **out, OUT char **
|
||||
*
|
||||
****************************************************************************/
|
||||
int
|
||||
TvDeviceSetContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetContrast( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
int contrast = -1;
|
||||
|
||||
@@ -1482,10 +1562,14 @@ TvDeviceSetContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **e
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementContrast( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementContrast( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curcontrast;
|
||||
int newcontrast;
|
||||
int curcontrast,
|
||||
newcontrast;
|
||||
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1547,8 +1631,11 @@ IncrementContrast( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, O
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseContrast( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
return IncrementContrast( 1, in, out, errorString );
|
||||
}
|
||||
|
||||
@@ -1566,7 +1653,9 @@ TvDeviceIncreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT cha
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseContrast( IXML_Document * in,
|
||||
IXML_Document ** out,
|
||||
char **errorString )
|
||||
{
|
||||
return IncrementContrast( -1, in, out, errorString );
|
||||
}
|
||||
@@ -1584,8 +1673,11 @@ TvDeviceDecreaseContrast( IN IXML_Document *in, OUT IXML_Document **out, OUT cha
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceSetBrightness( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
|
||||
char *value = NULL;
|
||||
int brightness = -1;
|
||||
|
||||
@@ -1628,6 +1720,7 @@ TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
( *errorString ) = "Internal Error";
|
||||
return UPNP_E_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1645,10 +1738,13 @@ TvDeviceSetBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*****************************************************************************/
|
||||
int
|
||||
IncrementBrightness( IN int incr, IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
IncrementBrightness( IN int incr,
|
||||
IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
int curbrightness;
|
||||
int newbrightness;
|
||||
int curbrightness,
|
||||
newbrightness;
|
||||
char *actionName = NULL;
|
||||
char value[TV_MAX_VAL_LEN];
|
||||
|
||||
@@ -1709,7 +1805,9 @@ IncrementBrightness( IN int incr, IN IXML_Document *in, OUT IXML_Document **out,
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceIncreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceIncreaseBrightness( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementBrightness( 1, in, out, errorString );
|
||||
}
|
||||
@@ -1727,7 +1825,9 @@ TvDeviceIncreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
*
|
||||
*****************************************************************************/
|
||||
int
|
||||
TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString )
|
||||
TvDeviceDecreaseBrightness( IN IXML_Document * in,
|
||||
OUT IXML_Document ** out,
|
||||
OUT char **errorString )
|
||||
{
|
||||
return IncrementBrightness( -1, in, out, errorString );
|
||||
}
|
||||
@@ -1751,19 +1851,29 @@ TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
* Cookie -- Optional data specified during callback registration
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Cookie)
|
||||
int
|
||||
TvDeviceCallbackEventHandler( Upnp_EventType EventType,
|
||||
void *Event,
|
||||
void *Cookie )
|
||||
{
|
||||
switch (EventType) {
|
||||
|
||||
switch ( EventType ) {
|
||||
|
||||
case UPNP_EVENT_SUBSCRIPTION_REQUEST:
|
||||
TvDeviceHandleSubscriptionRequest((struct Upnp_Subscription_Request *)Event);
|
||||
|
||||
TvDeviceHandleSubscriptionRequest( ( struct
|
||||
Upnp_Subscription_Request
|
||||
* )Event );
|
||||
break;
|
||||
|
||||
case UPNP_CONTROL_GET_VAR_REQUEST:
|
||||
TvDeviceHandleGetVarRequest((struct Upnp_State_Var_Request *)Event);
|
||||
TvDeviceHandleGetVarRequest( ( struct Upnp_State_Var_Request
|
||||
* )Event );
|
||||
break;
|
||||
|
||||
case UPNP_CONTROL_ACTION_REQUEST:
|
||||
TvDeviceHandleActionRequest((struct Upnp_Action_Request *)Event);
|
||||
TvDeviceHandleActionRequest( ( struct Upnp_Action_Request * )
|
||||
Event );
|
||||
break;
|
||||
|
||||
/*
|
||||
@@ -1782,14 +1892,17 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co
|
||||
break;
|
||||
|
||||
default:
|
||||
SampleUtil_Print("Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
||||
EventType);
|
||||
SampleUtil_Print
|
||||
( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
||||
EventType );
|
||||
}
|
||||
|
||||
/* Print a summary of the event received */
|
||||
SampleUtil_PrintEvent(EventType, Event);
|
||||
/*
|
||||
Print a summary of the event received
|
||||
*/
|
||||
SampleUtil_PrintEvent( EventType, Event );
|
||||
|
||||
return 0;
|
||||
return ( 0 );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -1801,13 +1914,13 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co
|
||||
* Parameters:
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceStop(void)
|
||||
int
|
||||
TvDeviceStop()
|
||||
{
|
||||
UpnpUnRegisterRootDevice( device_handle );
|
||||
UpnpFinish();
|
||||
SampleUtil_Finish();
|
||||
ithread_mutex_destroy( &TVDevMutex );
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1840,6 +1953,7 @@ TvDeviceStart( char *ip_address,
|
||||
print_string pfun )
|
||||
{
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
|
||||
char desc_doc_url[DESC_URL_SIZE];
|
||||
|
||||
ithread_mutex_init( &TVDevMutex, NULL );
|
||||
@@ -1849,24 +1963,24 @@ TvDeviceStart( char *ip_address,
|
||||
SampleUtil_Print(
|
||||
"Initializing UPnP Sdk with\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
ip_address, port );
|
||||
|
||||
ret = UpnpInit( ip_address, port );
|
||||
if( ret != UPNP_E_SUCCESS ) {
|
||||
if( ( ret = UpnpInit( ip_address, port ) ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error with UpnpInit -- %d\n", ret );
|
||||
UpnpFinish();
|
||||
return ret;
|
||||
}
|
||||
|
||||
if( ip_address == NULL ) {
|
||||
ip_address = UpnpGetServerIpAddress();
|
||||
}
|
||||
|
||||
port = UpnpGetServerPort();
|
||||
|
||||
SampleUtil_Print(
|
||||
"UPnP Initialized\n"
|
||||
"\tipaddress = %s port = %u\n",
|
||||
ip_address ? ip_address : "{NULL}",
|
||||
port);
|
||||
"\tipaddress= %s port = %u\n",
|
||||
ip_address, port );
|
||||
|
||||
if( desc_doc_name == NULL ) {
|
||||
desc_doc_name = "tvdevicedesc.xml";
|
||||
@@ -1881,12 +1995,12 @@ TvDeviceStart( char *ip_address,
|
||||
|
||||
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",
|
||||
if( ( ret =
|
||||
UpnpSetWebServerRootDir( web_dir_path ) ) != UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print
|
||||
( "Error specifying webserver root directory -- %s: %d\n",
|
||||
web_dir_path, ret );
|
||||
UpnpFinish();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1895,12 +2009,12 @@ TvDeviceStart( char *ip_address,
|
||||
"\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 ) {
|
||||
if( ( ret = UpnpRegisterRootDevice( desc_doc_url,
|
||||
TvDeviceCallbackEventHandler,
|
||||
&device_handle, &device_handle ) )
|
||||
!= UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error registering the rootdevice : %d\n", ret );
|
||||
UpnpFinish();
|
||||
|
||||
return ret;
|
||||
} else {
|
||||
SampleUtil_Print(
|
||||
@@ -1908,17 +2022,17 @@ TvDeviceStart( char *ip_address,
|
||||
"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 ) {
|
||||
|
||||
if( ( ret =
|
||||
UpnpSendAdvertisement( device_handle, default_advr_expire ) )
|
||||
!= UPNP_E_SUCCESS ) {
|
||||
SampleUtil_Print( "Error sending advertisements : %d\n", ret );
|
||||
UpnpFinish();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
SampleUtil_Print("Advertisements Sent\n");
|
||||
}
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,65 +1,52 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <stdio.h>
|
||||
#include <signal.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "sample_util.h"
|
||||
|
||||
|
||||
#include "ithread.h"
|
||||
#include "upnp.h"
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <unistd.h> */
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include "upnp.h"
|
||||
#include "sample_util.h"
|
||||
|
||||
//Color constants
|
||||
#define MAX_COLOR 10
|
||||
@@ -161,7 +148,8 @@ extern char *TvServiceType[];
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out, char **errorString);
|
||||
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out,
|
||||
char **errorString);
|
||||
|
||||
/* Structure for storing Tv Service
|
||||
identifiers and state table */
|
||||
@@ -205,7 +193,7 @@ extern ithread_mutex_t TVDevMutex;
|
||||
* struct TvService *out - service containing action table to set.
|
||||
*
|
||||
*****************************************************************************/
|
||||
int SetActionTable(int serviceType, struct TvService *out);
|
||||
int SetActionTable(int serviceType, struct TvService * out);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceStateTableInit
|
||||
@@ -325,7 +313,8 @@ int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*);
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDevicePowerOff
|
||||
@@ -340,7 +329,8 @@ int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **e
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetChannel
|
||||
@@ -357,7 +347,8 @@ int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **e
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseChannel
|
||||
@@ -372,7 +363,8 @@ int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char *
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseChannel
|
||||
*
|
||||
@@ -386,7 +378,8 @@ int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
/******************************************************************************
|
||||
* TvDeviceSetVolume
|
||||
*
|
||||
@@ -402,7 +395,8 @@ int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseVolume
|
||||
@@ -417,7 +411,8 @@ int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **
|
||||
* 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);
|
||||
int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
||||
OUT char **errorString);
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -433,7 +428,8 @@ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT ch
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
||||
OUT char **errorString);
|
||||
|
||||
|
||||
//Picture Service Actions
|
||||
@@ -453,7 +449,8 @@ int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT ch
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -468,7 +465,8 @@ int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **e
|
||||
* 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);
|
||||
int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseColor
|
||||
@@ -482,7 +480,8 @@ int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT ch
|
||||
* 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);
|
||||
int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetTint
|
||||
@@ -499,7 +498,8 @@ int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT ch
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseTint
|
||||
@@ -514,7 +514,8 @@ int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **er
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseTint
|
||||
@@ -529,7 +530,8 @@ int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/*****************************************************************************
|
||||
* TvDeviceSetContrast
|
||||
@@ -546,7 +548,8 @@ int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
****************************************************************************/
|
||||
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseContrast
|
||||
@@ -562,7 +565,8 @@ int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseContrast
|
||||
*
|
||||
@@ -576,7 +580,8 @@ int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceSetBrightness
|
||||
@@ -590,7 +595,8 @@ int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT
|
||||
* brightness -- The brightness value to change to.
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceIncreaseBrightness
|
||||
@@ -605,7 +611,8 @@ int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT cha
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
||||
OUT char **errorString);
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceDecreaseBrightness
|
||||
@@ -619,11 +626,12 @@ int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OU
|
||||
* char **errorString - errorString (in case action was unsuccessful)
|
||||
*
|
||||
*****************************************************************************/
|
||||
int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||
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);
|
||||
int TvDeviceStop();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,205 +0,0 @@
|
||||
|
||||
|
||||
/*!
|
||||
* \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 <stdlib.h> /* for calloc(), free() */
|
||||
#include <string.h> /* for strlen(), strdup() */
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define strcasecmp stricmp
|
||||
#else
|
||||
/* Other systems have strncasecmp */
|
||||
#endif
|
||||
|
||||
|
||||
/* strndup() is a GNU extension. Other systems must fix it with elif's. */
|
||||
#ifdef __GNUC__
|
||||
extern char *strndup(__const char *__string, size_t __n);
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
size_t UpnpString_get_Length(const UpnpString *p)
|
||||
{
|
||||
return ((struct SUpnpString *)p)->m_length;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_set_Length(UpnpString *p, size_t n)
|
||||
{
|
||||
if (((struct SUpnpString *)p)->m_length > n) {
|
||||
((struct SUpnpString *)p)->m_length = n;
|
||||
/* No need to realloc now, will do later when needed. */
|
||||
((struct SUpnpString *)p)->m_string[n] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const char *UpnpString_get_String(const UpnpString *p)
|
||||
{
|
||||
return ((struct SUpnpString *)p)->m_string;
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_set_String(UpnpString *p, const char *s)
|
||||
{
|
||||
char *q = strdup(s);
|
||||
if (!q) goto error_handler1;
|
||||
free(((struct SUpnpString *)p)->m_string);
|
||||
((struct SUpnpString *)p)->m_length = strlen(q);
|
||||
((struct SUpnpString *)p)->m_string = q;
|
||||
|
||||
error_handler1:
|
||||
return q != NULL;
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_set_StringN(UpnpString *p, const char *s, size_t n)
|
||||
{
|
||||
char *q = strndup(s, n);
|
||||
if (!q) goto error_handler1;
|
||||
free(((struct SUpnpString *)p)->m_string);
|
||||
((struct SUpnpString *)p)->m_length = strlen(q);
|
||||
((struct SUpnpString *)p)->m_string = q;
|
||||
|
||||
error_handler1:
|
||||
return q != NULL;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_cmp(UpnpString *p, UpnpString *q)
|
||||
{
|
||||
const char *cp = UpnpString_get_String(p);
|
||||
const char *cq = UpnpString_get_String(q);
|
||||
|
||||
return strcmp(cp, cq);
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_casecmp(UpnpString *p, UpnpString *q)
|
||||
{
|
||||
const char *cp = UpnpString_get_String(p);
|
||||
const char *cq = UpnpString_get_String(q);
|
||||
|
||||
return strcasecmp(cp, cq);
|
||||
}
|
||||
|
||||
/* @} UpnpString */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,121 +1,177 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "ithread.h"
|
||||
#include "upnp.h"
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
/*! Mutex to synchronize all the log file opeartions in the debug mode */
|
||||
//Mutex to synchronize all the log file opeartions in the debug mode
|
||||
static ithread_mutex_t GlobalDebugMutex;
|
||||
|
||||
/*! Global log level */
|
||||
// Global log level
|
||||
static Upnp_LogLevel g_log_level = UPNP_DEFAULT_LOG_LEVEL;
|
||||
|
||||
/*! File handle for the error log file */
|
||||
//File handle for the error log file
|
||||
static FILE *ErrFileHnd = NULL;
|
||||
|
||||
/*! File handle for the information log file */
|
||||
//File handle for the information log file
|
||||
static FILE *InfoFileHnd = NULL;
|
||||
|
||||
/*! Name of the error file */
|
||||
//Name of the error file
|
||||
static const char *errFileName = "IUpnpErrFile.txt";
|
||||
|
||||
/*! Name of the info file */
|
||||
//Name of the info file
|
||||
static const char *infoFileName = "IUpnpInfoFile.txt";
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
|
||||
int UpnpInitLog(void)
|
||||
/***************************************************************************
|
||||
* Function : UpnpSetLogFileNames
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* ErrFileName: name of the error file
|
||||
* IN const char *InfoFileName: name of the information file
|
||||
* IN int size: Size of the buffer
|
||||
* IN int starLength: This parameter provides the width of the banner
|
||||
*
|
||||
* Description:
|
||||
* This functions takes the buffer and writes the buffer in the file as
|
||||
* per the requested banner
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
void
|
||||
UpnpSetLogFileNames ( IN const char *ErrFileName,
|
||||
IN const char *InfoFileName )
|
||||
{
|
||||
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) {
|
||||
if( ErrFileName ) {
|
||||
errFileName = ErrFileName;
|
||||
}
|
||||
if (InfoFileName) {
|
||||
if( InfoFileName ) {
|
||||
infoFileName = InfoFileName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpInitLog
|
||||
*
|
||||
* Parameters: void
|
||||
*
|
||||
* Description:
|
||||
* This functions initializes the log files
|
||||
*
|
||||
* Returns: int
|
||||
* -1 : If fails
|
||||
* UPNP_E_SUCCESS : if success
|
||||
***************************************************************************/
|
||||
int
|
||||
UpnpInitLog()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpSetLogLevel
|
||||
*
|
||||
* Parameters: Upnp_LogLevel log_level
|
||||
*
|
||||
* Description:
|
||||
* This functions set the log level (see {\tt Upnp_LogLevel}
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
void
|
||||
UpnpSetLogLevel (Upnp_LogLevel log_level)
|
||||
{
|
||||
g_log_level = log_level;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpCloseLog
|
||||
*
|
||||
* Parameters: void
|
||||
*
|
||||
* Description:
|
||||
* This functions closes the log files
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
void
|
||||
UpnpCloseLog()
|
||||
{
|
||||
if( DEBUG_TARGET == 1 ) {
|
||||
fflush( ErrFileHnd );
|
||||
fflush( InfoFileHnd );
|
||||
fclose( ErrFileHnd );
|
||||
fclose( InfoFileHnd );
|
||||
}
|
||||
ithread_mutex_destroy( &GlobalDebugMutex );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : DebugAtThisLevel
|
||||
*
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
*
|
||||
* Description:
|
||||
* This functions returns true if debug output should be done in this
|
||||
* module.
|
||||
*
|
||||
* Returns: int
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
int DebugAtThisLevel(
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module)
|
||||
IN Upnp_LogLevel DLevel,
|
||||
IN Dbg_Module Module)
|
||||
{
|
||||
int ret = DLevel <= g_log_level;
|
||||
ret &=
|
||||
@@ -130,15 +186,38 @@ int DebugAtThisLevel(
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpPrintf
|
||||
*
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
* IN char *DbgFileName: Name of the file from where debug statement is
|
||||
* coming
|
||||
* IN int DbgLineNo : Line number of the file from where debug statement
|
||||
* is coming
|
||||
* IN char * FmtStr, ...: Variable number of arguments that will go
|
||||
* in the debug statement
|
||||
*
|
||||
* Description:
|
||||
* This functions prints the debug statement either on the startdard
|
||||
* output or log file along with the information from where this debug
|
||||
* statement is coming
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void UpnpPrintf(
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo,
|
||||
const char *FmtStr,
|
||||
...)
|
||||
IN Upnp_LogLevel DLevel,
|
||||
IN Dbg_Module Module,
|
||||
IN const char *DbgFileName,
|
||||
IN int DbgLineNo,
|
||||
IN const char *FmtStr,
|
||||
... )
|
||||
{
|
||||
va_list ArgList;
|
||||
|
||||
@@ -149,7 +228,7 @@ void UpnpPrintf(
|
||||
ithread_mutex_lock(&GlobalDebugMutex);
|
||||
va_start(ArgList, FmtStr);
|
||||
if (!DEBUG_TARGET) {
|
||||
if (DbgFileName) {
|
||||
if( DbgFileName ) {
|
||||
UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);
|
||||
}
|
||||
vfprintf(stdout, FmtStr, ArgList);
|
||||
@@ -170,9 +249,27 @@ void UpnpPrintf(
|
||||
va_end(ArgList);
|
||||
ithread_mutex_unlock(&GlobalDebugMutex);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
FILE *GetDebugFile(Upnp_LogLevel DLevel, Dbg_Module Module)
|
||||
/***************************************************************************
|
||||
* Function : UpnpGetDebugFile
|
||||
*
|
||||
* Parameters:
|
||||
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
|
||||
* whether debug statement will go to standard output,
|
||||
* or any of the log files.
|
||||
* IN Dbg_Module Module: debug will go in the name of this module
|
||||
*
|
||||
* Description:
|
||||
* This function checks if the module is turned on for debug
|
||||
* and returns the file descriptor corresponding to the debug level
|
||||
* Returns: FILE *
|
||||
* NULL : if the module is turn off for debug
|
||||
* else returns the right file descriptor
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
FILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module )
|
||||
{
|
||||
FILE *ret;
|
||||
|
||||
@@ -190,12 +287,28 @@ FILE *GetDebugFile(Upnp_LogLevel DLevel, Dbg_Module Module)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpDisplayFileAndLine
|
||||
*
|
||||
* Parameters:
|
||||
* IN FILE *fd: File descriptor where line number and file name will be
|
||||
* written
|
||||
* IN char *DbgFileName: Name of the file
|
||||
* IN int DbgLineNo : Line number of the file
|
||||
*
|
||||
* Description:
|
||||
* This function writes the file name and file number from where
|
||||
* debug statement is coming to the log file
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo)
|
||||
IN FILE * fd,
|
||||
IN const char *DbgFileName,
|
||||
IN int DbgLineNo)
|
||||
{
|
||||
#define NLINES 2
|
||||
#define MAX_LINE_SIZE 512
|
||||
@@ -211,12 +324,7 @@ void UpnpDisplayFileAndLine(
|
||||
|
||||
/* 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
|
||||
);
|
||||
(unsigned long int)ithread_self());
|
||||
if (DbgFileName) {
|
||||
sprintf(buf[1],
|
||||
"FILE: %s, LINE: %d",
|
||||
@@ -228,13 +336,29 @@ void UpnpDisplayFileAndLine(
|
||||
UpnpDisplayBanner(fd, lines, NLINES, NUMBER_OF_STARS);
|
||||
fflush(fd);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Function : UpnpDisplayBanner
|
||||
*
|
||||
* Parameters:
|
||||
* IN FILE *fd: file descriptor where the banner will be written
|
||||
* IN char **lines: The buffer that will be written
|
||||
* IN int size: Size of the buffer
|
||||
* IN int starLength: This parameter provides the width of the banner
|
||||
*
|
||||
* Description:
|
||||
* This functions takes the buffer and writes the buffer in the file as
|
||||
* per the requested banner
|
||||
* Returns: void
|
||||
***************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void UpnpDisplayBanner(
|
||||
FILE * fd,
|
||||
const char **lines,
|
||||
size_t size,
|
||||
int starLength)
|
||||
IN FILE * fd,
|
||||
IN const char **lines,
|
||||
IN size_t size,
|
||||
IN int starLength)
|
||||
{
|
||||
int leftMarginLength = starLength / 2 + 1;
|
||||
int rightMarginLength = starLength / 2 + 1;
|
||||
@@ -275,54 +399,12 @@ void UpnpDisplayBanner(
|
||||
rightMargin[rightMarginLength] = 0;
|
||||
fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin );
|
||||
}
|
||||
fprintf(fd, "%s\n\n", stars);
|
||||
fprintf( fd, "%s\n\n", stars );
|
||||
|
||||
free(currentLine);
|
||||
free(stars);
|
||||
free(rightMargin);
|
||||
free(leftMargin);
|
||||
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 */
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,191 +1,182 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/*! Maximum action header buffer length. */
|
||||
#include "upnptools.h"
|
||||
#include "uri.h"
|
||||
#define HEADER_LENGTH 2000
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Structure to maintain a error code and string associated with the
|
||||
* error code.
|
||||
*/
|
||||
// Structure to maintain a error code and string associated with the
|
||||
// error code
|
||||
struct ErrorString {
|
||||
/*! Error code. */
|
||||
int rc;
|
||||
/*! Error description. */
|
||||
const char *rcError;
|
||||
int rc; /* error code */
|
||||
const char *rcError; /* error description */
|
||||
|
||||
};
|
||||
|
||||
|
||||
/*!
|
||||
* \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"},
|
||||
// Initializing the 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_MEMOR"},
|
||||
{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_BAD_HTTPMSG, "UPNP_E_BAD_HTTPMSG"},
|
||||
{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_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_INTERNAL_ERROR, "UPNP_E_INTERNAL_ERROR"},
|
||||
{UPNP_E_INVALID_ARGUMENT, "UPNP_E_INVALID_ARGUMENT"},
|
||||
{UPNP_E_OUTOF_BOUNDS, "UPNP_E_OUTOF_BOUNDS"}
|
||||
};
|
||||
|
||||
|
||||
const char *UpnpGetErrorMessage(int rc)
|
||||
/************************************************************************
|
||||
* Function : UpnpGetErrorMessage
|
||||
*
|
||||
* Parameters:
|
||||
* IN int rc: error code
|
||||
*
|
||||
* Description:
|
||||
* This functions returns the error string mapped to the error code
|
||||
* Returns: const char *
|
||||
* return either the right string or "Unknown Error"
|
||||
***************************************************************************/
|
||||
const char *
|
||||
UpnpGetErrorMessage( IN int rc )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < sizeof (ErrorMessages) / sizeof (ErrorMessages[0]); ++i) {
|
||||
if (rc == ErrorMessages[i].rc) {
|
||||
for( i = 0; i < sizeof( ErrorMessages ) / sizeof( ErrorMessages[0] );
|
||||
i++ ) {
|
||||
if( rc == ErrorMessages[i].rc )
|
||||
return ErrorMessages[i].rcError;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return "Unknown error code";
|
||||
return "Unknown Error";
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \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)
|
||||
/************************************************************************
|
||||
* Function : UpnpResolveURL
|
||||
*
|
||||
* Parameters:
|
||||
* IN char * BaseURL: Base URL string
|
||||
* IN char * RelURL: relative URL string
|
||||
* OUT char * AbsURL: Absolute URL string
|
||||
* Description:
|
||||
* This functions concatinates the base URL and relative URL to generate
|
||||
* the absolute URL
|
||||
* Returns: int
|
||||
* return either UPNP_E_SUCCESS or appropriate error
|
||||
***************************************************************************/
|
||||
int
|
||||
UpnpResolveURL( IN const char *BaseURL,
|
||||
IN const char *RelURL,
|
||||
OUT char *AbsURL )
|
||||
{
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
char *tempRel = NULL;
|
||||
// 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
|
||||
|
||||
if (RelURL == NULL) {
|
||||
ret = UPNP_E_INVALID_PARAM;
|
||||
goto ExitFunction;
|
||||
}
|
||||
char *tempRel;
|
||||
|
||||
tempRel = resolve_rel_url((char *)BaseURL, (char *)RelURL);
|
||||
if (tempRel) {
|
||||
strcpy(AbsURL, tempRel);
|
||||
free(tempRel);
|
||||
if( RelURL == NULL )
|
||||
return UPNP_E_INVALID_PARAM;
|
||||
|
||||
tempRel = NULL;
|
||||
|
||||
tempRel = resolve_rel_url((char*) BaseURL, (char*) RelURL );
|
||||
|
||||
if( tempRel ) {
|
||||
strcpy( AbsURL, tempRel );
|
||||
free( tempRel );
|
||||
} else {
|
||||
ret = UPNP_E_INVALID_URL;
|
||||
return 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)
|
||||
/************************************************************************
|
||||
* Function : addToAction
|
||||
*
|
||||
* Parameters:
|
||||
* IN int response: flag to tell if the ActionDoc is for response
|
||||
* or request
|
||||
* INOUT IXML_Document **ActionDoc: request or response document
|
||||
* IN char *ActionName: Name of the action request or response
|
||||
* IN char *ServType: Service type
|
||||
* IN char * ArgName: Name of the argument
|
||||
* IN char * ArgValue: Value of the argument
|
||||
*
|
||||
* Description:
|
||||
* This function adds the argument in the action request or response.
|
||||
* This function creates the action request or response if it is a first
|
||||
* argument else it will add the argument in the document
|
||||
*
|
||||
* Returns: int
|
||||
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
***************************************************************************/
|
||||
static int
|
||||
addToAction( IN int response,
|
||||
INOUT IXML_Document ** ActionDoc,
|
||||
IN const char *ActionName,
|
||||
IN const char *ServType,
|
||||
IN const char *ArgName,
|
||||
IN const char *ArgValue )
|
||||
{
|
||||
char *ActBuff = NULL;
|
||||
IXML_Node *node = NULL;
|
||||
@@ -193,30 +184,30 @@ static int addToAction(
|
||||
IXML_Node *Txt = NULL;
|
||||
int rc = 0;
|
||||
|
||||
if (ActionName == NULL || ServType == NULL) {
|
||||
if( ActionName == NULL || ServType == NULL ) {
|
||||
return UPNP_E_INVALID_PARAM;
|
||||
}
|
||||
|
||||
if (*ActionDoc == NULL) {
|
||||
ActBuff = (char *)malloc(HEADER_LENGTH);
|
||||
if (ActBuff == NULL) {
|
||||
if( *ActionDoc == NULL ) {
|
||||
ActBuff = ( char * )malloc( HEADER_LENGTH );
|
||||
if( ActBuff == NULL ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
|
||||
if (response) {
|
||||
sprintf(ActBuff,
|
||||
if( response ) {
|
||||
sprintf( ActBuff,
|
||||
"<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
|
||||
ActionName, ServType, ActionName);
|
||||
ActionName, ServType, ActionName );
|
||||
} else {
|
||||
sprintf(ActBuff,
|
||||
sprintf( ActBuff,
|
||||
"<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
|
||||
ActionName, ServType, ActionName);
|
||||
ActionName, ServType, ActionName );
|
||||
}
|
||||
|
||||
rc = ixmlParseBufferEx(ActBuff, ActionDoc);
|
||||
free(ActBuff);
|
||||
if (rc != IXML_SUCCESS) {
|
||||
if (rc == IXML_INSUFFICIENT_MEMORY) {
|
||||
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;
|
||||
@@ -224,39 +215,46 @@ static int addToAction(
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
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)
|
||||
/************************************************************************
|
||||
* Function : makeAction
|
||||
*
|
||||
* Parameters:
|
||||
* IN int response: flag to tell if the ActionDoc is for response
|
||||
* or request
|
||||
* IN char * ActionName: Name of the action request or response
|
||||
* IN char * ServType: Service type
|
||||
* IN int NumArg :Number of arguments in the action request or response
|
||||
* IN char * Arg : pointer to the first argument
|
||||
* IN va_list ArgList: Argument list
|
||||
*
|
||||
* Description:
|
||||
* This function creates the action request or response from the argument
|
||||
* list.
|
||||
* Returns: IXML_Document *
|
||||
* returns action request or response document if successful
|
||||
* else returns NULL
|
||||
***************************************************************************/
|
||||
static IXML_Document *
|
||||
makeAction( IN int response,
|
||||
IN const char *ActionName,
|
||||
IN const char *ServType,
|
||||
IN int NumArg,
|
||||
IN const char *Arg,
|
||||
IN va_list ArgList )
|
||||
{
|
||||
const char *ArgName;
|
||||
const char *ArgValue;
|
||||
@@ -267,50 +265,56 @@ static IXML_Document *makeAction(
|
||||
IXML_Element *Ele;
|
||||
IXML_Node *Txt = NULL;
|
||||
|
||||
if (ActionName == NULL || ServType == NULL) {
|
||||
if( ActionName == NULL || ServType == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ActBuff = (char *)malloc(HEADER_LENGTH);
|
||||
if (ActBuff == NULL) {
|
||||
ActBuff = ( char * )malloc( HEADER_LENGTH );
|
||||
if( ActBuff == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (response) {
|
||||
sprintf(ActBuff,
|
||||
if( response ) {
|
||||
sprintf( ActBuff,
|
||||
"<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
|
||||
ActionName, ServType, ActionName);
|
||||
ActionName, ServType, ActionName );
|
||||
} else {
|
||||
sprintf(ActBuff,
|
||||
sprintf( ActBuff,
|
||||
"<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
|
||||
ActionName, ServType, ActionName);
|
||||
ActionName, ServType, ActionName );
|
||||
}
|
||||
if (ixmlParseBufferEx(ActBuff, &ActionDoc) != IXML_SUCCESS) {
|
||||
free(ActBuff);
|
||||
|
||||
if( ixmlParseBufferEx( ActBuff, &ActionDoc ) != IXML_SUCCESS ) {
|
||||
free( ActBuff );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
free(ActBuff);
|
||||
if(ActionDoc == NULL) {
|
||||
free( ActBuff );
|
||||
|
||||
if( ActionDoc == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (NumArg > 0) {
|
||||
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);
|
||||
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);
|
||||
|
||||
ixmlNode_appendChild( node, ( IXML_Node * ) Ele );
|
||||
}
|
||||
|
||||
if (++Idx < NumArg) {
|
||||
ArgName = va_arg(ArgList, const char *);
|
||||
ArgName = va_arg( ArgList, const char * );
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@@ -321,75 +325,219 @@ static IXML_Document *makeAction(
|
||||
return ActionDoc;
|
||||
}
|
||||
|
||||
|
||||
IXML_Document *UpnpMakeAction(
|
||||
const char *ActionName,
|
||||
/************************************************************************
|
||||
* Function : UpnpMakeAction
|
||||
*
|
||||
* Parameters:
|
||||
* IN char * ActionName: Name of the action request or response
|
||||
* IN char * ServType: Service type
|
||||
* IN int NumArg :Number of arguments in the action request or response
|
||||
* IN char * Arg : pointer to the first argument
|
||||
* IN ... : variable argument list
|
||||
* IN va_list ArgList: Argument list
|
||||
*
|
||||
* Description:
|
||||
* This function creates the action request from the argument
|
||||
* list. Its a wrapper function that calls makeAction function to create
|
||||
* the action request.
|
||||
*
|
||||
* Returns: IXML_Document *
|
||||
* returns action request document if successful
|
||||
* else returns NULL
|
||||
***************************************************************************/
|
||||
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);
|
||||
va_start( ArgList, Arg );
|
||||
out = makeAction( 0, ActionName, ServType, NumArg, Arg, ArgList );
|
||||
va_end( ArgList );
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
IXML_Document *UpnpMakeActionResponse(
|
||||
const char *ActionName,
|
||||
/************************************************************************
|
||||
* Function : UpnpMakeActionResponse
|
||||
*
|
||||
* Parameters:
|
||||
* IN char * ActionName: Name of the action request or response
|
||||
* IN char * ServType: Service type
|
||||
* IN int NumArg :Number of arguments in the action request or response
|
||||
* IN char * Arg : pointer to the first argument
|
||||
* IN ... : variable argument list
|
||||
* IN va_list ArgList: Argument list
|
||||
*
|
||||
* Description:
|
||||
* This function creates the action response from the argument
|
||||
* list. Its a wrapper function that calls makeAction function to create
|
||||
* the action response.
|
||||
*
|
||||
* Returns: IXML_Document *
|
||||
* returns action response document if successful
|
||||
* else returns NULL
|
||||
***************************************************************************/
|
||||
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);
|
||||
va_start( ArgList, Arg );
|
||||
out = makeAction( 1, ActionName, ServType, NumArg, Arg, ArgList );
|
||||
va_end( ArgList );
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : UpnpAddToActionResponse
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT IXML_Document **ActionResponse: action response document
|
||||
* IN char * ActionName: Name of the action request or response
|
||||
* IN char * ServType: Service type
|
||||
* IN int ArgName :Name of argument to be added in the action response
|
||||
* IN char * ArgValue : value of the argument
|
||||
*
|
||||
* Description:
|
||||
* This function adds the argument in the action response. Its a wrapper
|
||||
* function that calls addToAction function to add the argument in the
|
||||
* action response.
|
||||
*
|
||||
* Returns: int
|
||||
* returns UPNP_E_SUCCESS if successful
|
||||
* else returns appropriate error
|
||||
***************************************************************************/
|
||||
int
|
||||
UpnpAddToActionResponse( INOUT IXML_Document ** ActionResponse,
|
||||
IN const char *ActionName,
|
||||
IN const char *ServType,
|
||||
IN const char *ArgName,
|
||||
IN const char *ArgValue )
|
||||
{
|
||||
return addToAction( 1, ActionResponse, ActionName, ServType, ArgName,
|
||||
ArgValue );
|
||||
}
|
||||
|
||||
int UpnpAddToAction(
|
||||
IXML_Document **ActionDoc,
|
||||
/************************************************************************
|
||||
* Function : UpnpAddToAction
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT IXML_Document **ActionDoc: action request document
|
||||
* IN char * ActionName: Name of the action request or response
|
||||
* IN char * ServType: Service type
|
||||
* IN int ArgName :Name of argument to be added in the action response
|
||||
* IN char * ArgValue : value of the argument
|
||||
*
|
||||
* Description:
|
||||
* This function adds the argument in the action request. Its a wrapper
|
||||
* function that calls addToAction function to add the argument in the
|
||||
* action request.
|
||||
*
|
||||
* Returns: int
|
||||
* returns UPNP_E_SUCCESS if successful
|
||||
* else returns appropriate error
|
||||
***************************************************************************/
|
||||
int
|
||||
UpnpAddToAction( IXML_Document ** ActionDoc,
|
||||
const char *ActionName,
|
||||
const char *ServType,
|
||||
const char *ArgName,
|
||||
const char *ArgValue)
|
||||
const char *ArgValue )
|
||||
{
|
||||
return addToAction(0, ActionDoc, ActionName, ServType, ArgName, 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)
|
||||
/************************************************************************
|
||||
* Function : UpnpAddToPropertySet
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT IXML_Document **PropSet: propertyset document
|
||||
* IN char *ArgName: Name of the argument
|
||||
* IN char *ArgValue: value of the argument
|
||||
*
|
||||
* Description:
|
||||
* This function adds the argument in the propertyset node
|
||||
*
|
||||
* Returns: int
|
||||
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
***************************************************************************/
|
||||
int
|
||||
UpnpAddToPropertySet( INOUT IXML_Document ** PropSet,
|
||||
IN const char *ArgName,
|
||||
IN const char *ArgValue )
|
||||
{
|
||||
return addToAction(1, ActionResponse, ActionName, ServType, ArgName, ArgValue);
|
||||
|
||||
char BlankDoc[] = "<e:propertyset xmlns:e=\"urn:schemas"
|
||||
"-upnp-org:event-1-0\"></e:propertyset>";
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
IXML_Document *UpnpCreatePropertySet(
|
||||
int NumArg,
|
||||
const char *Arg,
|
||||
...)
|
||||
/************************************************************************
|
||||
* Function : UpnpCreatePropertySet
|
||||
*
|
||||
* Parameters:
|
||||
* IN int NumArg: Number of argument that will go in the propertyset node
|
||||
* IN char * Args: argument strings
|
||||
*
|
||||
* Description:
|
||||
* This function creates a propertyset node and put all the input
|
||||
* parameters in the node as elements
|
||||
*
|
||||
* Returns: IXML_Document *
|
||||
* returns the document containing propertyset node.
|
||||
***************************************************************************/
|
||||
IXML_Document *
|
||||
UpnpCreatePropertySet( IN int NumArg,
|
||||
IN const char *Arg,
|
||||
... )
|
||||
{
|
||||
va_list ArgList;
|
||||
int Idx = 0;
|
||||
char BlankDoc[] =
|
||||
"<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">"
|
||||
"</e:propertyset>";
|
||||
char BlankDoc[] = "<e:propertyset xmlns:e=\"urn:schemas-"
|
||||
"upnp-org:event-1-0\"></e:propertyset>";
|
||||
const char *ArgName,
|
||||
*ArgValue;
|
||||
IXML_Node *node;
|
||||
@@ -398,78 +546,40 @@ IXML_Document *UpnpCreatePropertySet(
|
||||
IXML_Node *Txt;
|
||||
IXML_Document *PropSet;
|
||||
|
||||
if(ixmlParseBufferEx(BlankDoc, &PropSet) != IXML_SUCCESS) {
|
||||
if( ixmlParseBufferEx( BlankDoc, &PropSet ) != IXML_SUCCESS ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (NumArg < 1) {
|
||||
return PropSet;
|
||||
if( NumArg < 1 ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
va_start(ArgList, Arg);
|
||||
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);
|
||||
|
||||
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[] =
|
||||
"<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">"
|
||||
"</e:propertyset>";
|
||||
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 */
|
||||
#endif // EXCLUDE_DOM == 0
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,329 +1,209 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 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
|
||||
************************************************************************/
|
||||
|
||||
* 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 <stdlib.h> // for calloc(), free()
|
||||
|
||||
|
||||
struct SClientSubscription {
|
||||
int m_renewEventId;
|
||||
UpnpString *m_SID;
|
||||
UpnpString *m_actualSID;
|
||||
UpnpString *m_eventURL;
|
||||
struct SClientSubscription *m_next;
|
||||
};
|
||||
|
||||
|
||||
/** Constructor */
|
||||
ClientSubscription *UpnpClientSubscription_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;
|
||||
}
|
||||
|
||||
|
||||
/** Destructor */
|
||||
void UpnpClientSubscription_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);
|
||||
}
|
||||
|
||||
|
||||
/** Copy Constructor */
|
||||
ClientSubscription *UpnpClientSubscription_dup(const ClientSubscription *p)
|
||||
{
|
||||
ClientSubscription *q = UpnpClientSubscription_new();
|
||||
|
||||
UpnpClientSubscription_assign(q, p);
|
||||
|
||||
return q;
|
||||
}
|
||||
|
||||
|
||||
/** Assignment operator */
|
||||
void UpnpClientSubscription_assign(ClientSubscription *q, const ClientSubscription *p)
|
||||
{
|
||||
if (q != p) {
|
||||
// Do not copy RenewEventId
|
||||
((struct SClientSubscription *)q)->m_renewEventId = -1;
|
||||
UpnpClientSubscription_set_SID(q, UpnpClientSubscription_get_SID(p));
|
||||
UpnpClientSubscription_set_ActualSID(q, UpnpClientSubscription_get_ActualSID(p));
|
||||
UpnpClientSubscription_set_EventURL(q, UpnpClientSubscription_get_EventURL(p));
|
||||
// Do not copy m_next
|
||||
((struct SClientSubscription *)q)->m_next = NULL;
|
||||
/************************************************************************
|
||||
* Function : copy_client_subscription
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription * in ; - source client subscription
|
||||
* client_subscription * out ; - destination client subscription
|
||||
*
|
||||
* Description : Make a copy of the client subscription data
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_OUTOF_MEMORY - On Failure to allocate memory
|
||||
* HTTP_SUCCESS - On Success
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
CLIENTONLY( int copy_client_subscription( client_subscription * in,
|
||||
client_subscription * out ) {
|
||||
int len = strlen( in->ActualSID ) + 1;
|
||||
int len1 = strlen( in->EventURL ) + 1;
|
||||
memcpy( out->sid, in->sid, SID_SIZE );
|
||||
out->sid[SID_SIZE] = 0;
|
||||
out->ActualSID = ( char * )malloc( len );
|
||||
if( out->ActualSID == NULL )
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
out->EventURL = ( char * )malloc( len1 );
|
||||
if( out->EventURL == NULL ) {
|
||||
free(out->ActualSID);
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
}
|
||||
memcpy( out->ActualSID, in->ActualSID, len );
|
||||
memcpy( out->EventURL, in->EventURL, len1 );
|
||||
//copies do not get RenewEvent Ids or next
|
||||
out->RenewEventId = -1; out->next = NULL; return HTTP_SUCCESS;}
|
||||
|
||||
/************************************************************************
|
||||
* Function : free_client_subscription
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription * sub ; - Client subscription to be freed
|
||||
*
|
||||
* Description : Free memory allocated for client subscription data.
|
||||
* Remove timer thread associated with this subscription event.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void free_client_subscription( client_subscription * sub ) {
|
||||
upnp_timeout * event; ThreadPoolJob tempJob; if( sub ) {
|
||||
if( sub->ActualSID )
|
||||
free( sub->ActualSID ); if( sub->EventURL )
|
||||
free( sub->EventURL ); if( sub->RenewEventId != -1 ) //do not remove timer event of copy
|
||||
//invalid timer event id
|
||||
{
|
||||
if( TimerThreadRemove
|
||||
( &gTimerThread, sub->RenewEventId, &tempJob ) == 0 ) {
|
||||
event = ( upnp_timeout * ) tempJob.arg;
|
||||
free_upnp_timeout( event );}
|
||||
}
|
||||
|
||||
int UpnpClientSubscription_get_RenewEventId(const ClientSubscription *p)
|
||||
{
|
||||
return ((struct SClientSubscription *)p)->m_renewEventId;
|
||||
}
|
||||
sub->RenewEventId = -1;}
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : freeClientSubList
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription * list ; Client subscription
|
||||
*
|
||||
* Description : Free the client subscription table.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void freeClientSubList( client_subscription * list ) {
|
||||
client_subscription * next; while( list ) {
|
||||
free_client_subscription( list );
|
||||
next = list->next; free( list ); list = next;}
|
||||
}
|
||||
|
||||
void UpnpClientSubscription_set_RenewEventId(ClientSubscription *p, int n)
|
||||
{
|
||||
((struct SClientSubscription *)p)->m_renewEventId = n;
|
||||
}
|
||||
|
||||
|
||||
const UpnpString *UpnpClientSubscription_get_SID(const ClientSubscription *p)
|
||||
{
|
||||
return ((struct SClientSubscription *)p)->m_SID;
|
||||
}
|
||||
|
||||
const char *UpnpClientSubscription_get_SID_cstr(const ClientSubscription *p)
|
||||
{
|
||||
return UpnpString_get_String(UpnpClientSubscription_get_SID(p));
|
||||
}
|
||||
|
||||
|
||||
void UpnpClientSubscription_set_SID(ClientSubscription *p, const UpnpString *s)
|
||||
{
|
||||
UpnpString_delete(((struct SClientSubscription *)p)->m_SID);
|
||||
((struct SClientSubscription *)p)->m_SID = UpnpString_dup(s);
|
||||
}
|
||||
|
||||
|
||||
void UpnpClientSubscription_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 *UpnpClientSubscription_get_ActualSID(const ClientSubscription *p)
|
||||
{
|
||||
return ((struct SClientSubscription *)p)->m_actualSID;
|
||||
}
|
||||
|
||||
|
||||
const char *UpnpClientSubscription_get_ActualSID_cstr(const ClientSubscription *p)
|
||||
{
|
||||
return UpnpString_get_String(UpnpClientSubscription_get_ActualSID(p));
|
||||
}
|
||||
|
||||
|
||||
void UpnpClientSubscription_set_ActualSID(ClientSubscription *p, const UpnpString *s)
|
||||
{
|
||||
UpnpString_delete(((struct SClientSubscription *)p)->m_actualSID);
|
||||
((struct SClientSubscription *)p)->m_actualSID = UpnpString_dup(s);
|
||||
}
|
||||
|
||||
|
||||
void UpnpClientSubscription_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 *UpnpClientSubscription_get_EventURL(const ClientSubscription *p)
|
||||
{
|
||||
return ((struct SClientSubscription *)p)->m_eventURL;
|
||||
}
|
||||
|
||||
|
||||
const char *UpnpClientSubscription_get_EventURL_cstr(const ClientSubscription *p)
|
||||
{
|
||||
return UpnpString_get_String(UpnpClientSubscription_get_EventURL(p));
|
||||
}
|
||||
|
||||
|
||||
void UpnpClientSubscription_set_EventURL(ClientSubscription *p, const UpnpString *s)
|
||||
{
|
||||
UpnpString_delete(((struct SClientSubscription *)p)->m_eventURL);
|
||||
((struct SClientSubscription *)p)->m_eventURL = UpnpString_dup(s);
|
||||
}
|
||||
|
||||
|
||||
void UpnpClientSubscription_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 *UpnpClientSubscription_get_Next(const ClientSubscription *p)
|
||||
{
|
||||
return (ClientSubscription *)(((struct SClientSubscription *)p)->m_next);
|
||||
}
|
||||
|
||||
|
||||
void UpnpClientSubscription_set_Next(ClientSubscription *p, ClientSubscription *q)
|
||||
{
|
||||
((struct SClientSubscription *)p)->m_next = (struct SClientSubscription *)q;
|
||||
}
|
||||
|
||||
|
||||
void free_client_subscription(ClientSubscription *sub)
|
||||
{
|
||||
upnp_timeout *event;
|
||||
ThreadPoolJob tempJob;
|
||||
if (sub) {
|
||||
int renewEventId = UpnpClientSubscription_get_RenewEventId(sub);
|
||||
UpnpClientSubscription_strcpy_ActualSID(sub, "");
|
||||
UpnpClientSubscription_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);
|
||||
/************************************************************************
|
||||
* Function : RemoveClientSubClientSID
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription **head ; Head of the subscription list
|
||||
* const Upnp_SID sid ; Subscription ID to be mactched
|
||||
*
|
||||
* Description : Remove the client subscription matching the
|
||||
* subscritpion id represented by the const Upnp_SID sid parameter
|
||||
* from the table and update the table.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void RemoveClientSubClientSID( client_subscription ** head,
|
||||
const Upnp_SID sid ) {
|
||||
client_subscription * finger = ( *head );
|
||||
client_subscription * previous = NULL; while( finger ) {
|
||||
if( !( strcmp( sid, finger->sid ) ) ) {
|
||||
if( previous )
|
||||
previous->next = finger->next;
|
||||
else
|
||||
( *head ) = finger->next;
|
||||
finger->next = NULL;
|
||||
freeClientSubList( finger ); finger = NULL;}
|
||||
else
|
||||
{
|
||||
previous = finger; finger = finger->next;}
|
||||
}
|
||||
}
|
||||
UpnpClientSubscription_set_RenewEventId(sub, -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void freeClientSubList(ClientSubscription *list)
|
||||
{
|
||||
ClientSubscription *next;
|
||||
while (list) {
|
||||
free_client_subscription(list);
|
||||
next = UpnpClientSubscription_get_Next(list);
|
||||
UpnpClientSubscription_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),
|
||||
UpnpClientSubscription_get_SID_cstr(finger));
|
||||
if (found) {
|
||||
if (previous) {
|
||||
UpnpClientSubscription_set_Next(previous,
|
||||
UpnpClientSubscription_get_Next(finger));
|
||||
} else {
|
||||
*head = UpnpClientSubscription_get_Next(finger);
|
||||
}
|
||||
UpnpClientSubscription_set_Next(finger, NULL);
|
||||
freeClientSubList(finger);
|
||||
finger = NULL;
|
||||
} else {
|
||||
previous = finger;
|
||||
finger = UpnpClientSubscription_get_Next(finger);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ClientSubscription *GetClientSubClientSID(ClientSubscription *head, const UpnpString *sid)
|
||||
{
|
||||
ClientSubscription *next = head;
|
||||
int found = 0;
|
||||
while (next) {
|
||||
found = !strcmp(
|
||||
UpnpClientSubscription_get_SID_cstr(next),
|
||||
UpnpString_get_String(sid));
|
||||
if(found) {
|
||||
/************************************************************************
|
||||
* Function : GetClientSubClientSID
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription *head ; Head of the subscription list
|
||||
* const Upnp_SID sid ; Subscription ID to be matched
|
||||
*
|
||||
* Description : Return the client subscription from the client table
|
||||
* that matches const Upnp_SID sid subscrition id value.
|
||||
*
|
||||
* Return : client_subscription * ; The matching subscription
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
client_subscription *
|
||||
GetClientSubClientSID( client_subscription * head,
|
||||
const Upnp_SID sid ) {
|
||||
client_subscription * next = head; while( next ) {
|
||||
if( !strcmp( next->sid, sid ) )
|
||||
break;
|
||||
} else {
|
||||
next = UpnpClientSubscription_get_Next(next);
|
||||
}
|
||||
else
|
||||
{
|
||||
next = next->next;}
|
||||
}
|
||||
return next;}
|
||||
|
||||
return next;
|
||||
}
|
||||
/************************************************************************
|
||||
* Function : GetClientSubActualSID
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription *head ; Head of the subscription list
|
||||
* token * sid ; Subscription ID to be matched
|
||||
*
|
||||
* Description : Returns the client subscription from the client
|
||||
* subscription table that has the matching token * sid buffer
|
||||
* value.
|
||||
*
|
||||
* Return : client_subscription * ; The matching subscription
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
client_subscription *
|
||||
GetClientSubActualSID( client_subscription * head,
|
||||
token * sid ) {
|
||||
client_subscription * next = head; while( next ) {
|
||||
|
||||
|
||||
ClientSubscription *GetClientSubActualSID(ClientSubscription *head, token *sid)
|
||||
{
|
||||
ClientSubscription *next = head;
|
||||
while (next) {
|
||||
if (!memcmp(
|
||||
UpnpClientSubscription_get_ActualSID_cstr(next),
|
||||
sid->buff, sid->size)) {
|
||||
if( !memcmp( next->ActualSID, sid->buff, sid->size ) )
|
||||
break;
|
||||
} else {
|
||||
next = UpnpClientSubscription_get_Next(next);
|
||||
}
|
||||
else
|
||||
{
|
||||
next = next->next;}
|
||||
}
|
||||
return next;}
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
|
||||
)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,65 +1,52 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 scanner and parser for http
|
||||
* messages.
|
||||
************************************************************************/
|
||||
|
||||
#define _GNU_SOURCE // For strcasestr() in string.h
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include "strintmap.h"
|
||||
#include "httpparser.h"
|
||||
#include "statcodes.h"
|
||||
#include "unixutil.h"
|
||||
#include "upnpdebug.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/* entity positions */
|
||||
|
||||
// entity positions
|
||||
|
||||
#define NUM_HTTP_METHODS 9
|
||||
static str_int_entry Http_Method_Table[NUM_HTTP_METHODS] = {
|
||||
@@ -72,6 +59,7 @@ static str_int_entry Http_Method_Table[NUM_HTTP_METHODS] = {
|
||||
{"SUBSCRIBE", HTTPMETHOD_SUBSCRIBE},
|
||||
{"UNSUBSCRIBE", HTTPMETHOD_UNSUBSCRIBE},
|
||||
{"POST", SOAPMETHOD_POST},
|
||||
|
||||
};
|
||||
|
||||
#define NUM_HTTP_HEADER_NAMES 33
|
||||
@@ -112,7 +100,9 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = {
|
||||
};
|
||||
|
||||
/***********************************************************************/
|
||||
|
||||
/************* scanner *************/
|
||||
|
||||
/***********************************************************************/
|
||||
|
||||
#define TOKCHAR_CR 0xD
|
||||
@@ -131,7 +121,9 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = {
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE void scanner_init(OUT scanner_t *scanner, IN membuffer *bufptr)
|
||||
static UPNP_INLINE void
|
||||
scanner_init( OUT scanner_t * scanner,
|
||||
IN membuffer * bufptr )
|
||||
{
|
||||
scanner->cursor = 0;
|
||||
scanner->msg = bufptr;
|
||||
@@ -150,9 +142,10 @@ static UPNP_INLINE void scanner_init(OUT scanner_t *scanner, IN membuffer *bufpt
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE xboolean is_separator_char(IN char c)
|
||||
static UPNP_INLINE xboolean
|
||||
is_separator_char( IN char c )
|
||||
{
|
||||
return strchr(" \t()<>@,;:\\\"/[]?={}", c) != NULL;
|
||||
return strchr( " \t()<>@,;:\\\"/[]?={}", c ) != NULL;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -167,9 +160,10 @@ static UPNP_INLINE xboolean is_separator_char(IN char c)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE xboolean is_identifier_char(IN char c)
|
||||
static UPNP_INLINE xboolean
|
||||
is_identifier_char( IN char c )
|
||||
{
|
||||
return c >= 32 && c <= 126 && !is_separator_char(c);
|
||||
return ( c >= 32 && c <= 126 ) && !is_separator_char( c );
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -184,9 +178,10 @@ static UPNP_INLINE xboolean is_identifier_char(IN char c)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE xboolean is_control_char(IN char c)
|
||||
static UPNP_INLINE xboolean
|
||||
is_control_char( IN char c )
|
||||
{
|
||||
return (c >= 0 && c <= 31) || c == 127;
|
||||
return ( ( c >= 0 && c <= 31 ) || ( c == 127 ) );
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -201,7 +196,8 @@ static UPNP_INLINE xboolean is_control_char(IN char c)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE xboolean is_qdtext_char(IN char cc)
|
||||
static UPNP_INLINE xboolean
|
||||
is_qdtext_char( IN char cc )
|
||||
{
|
||||
unsigned char c = ( unsigned char )cc;
|
||||
|
||||
@@ -235,10 +231,10 @@ static UPNP_INLINE xboolean is_qdtext_char(IN char cc)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static parse_status_t scanner_get_token(
|
||||
INOUT scanner_t *scanner,
|
||||
OUT memptr *token,
|
||||
OUT token_type_t *tok_type)
|
||||
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
|
||||
@@ -379,11 +375,57 @@ static parse_status_t scanner_get_token(
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE char *scanner_get_str(IN scanner_t * scanner)
|
||||
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 :
|
||||
************************************************************************/
|
||||
#ifndef WIN32
|
||||
#warning The only use of the function 'scanner_pushback()' in the code is commented out.
|
||||
#warning 'scanner_pushback()' is a candidate for removal.
|
||||
#else
|
||||
#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.")
|
||||
#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
|
||||
@@ -398,14 +440,15 @@ static UPNP_INLINE char *scanner_get_str(IN scanner_t * scanner)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static int httpmsg_compare(void *param1, void *param2)
|
||||
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;
|
||||
return ( ( http_header_t * ) param1 )->name_id ==
|
||||
( ( http_header_t * ) param2 )->name_id;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -420,7 +463,8 @@ static int httpmsg_compare(void *param1, void *param2)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static void httpheader_free(void *msg)
|
||||
static void
|
||||
httpheader_free( void *msg )
|
||||
{
|
||||
http_header_t *hdr = ( http_header_t * ) msg;
|
||||
|
||||
@@ -441,7 +485,8 @@ static void httpheader_free(void *msg)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void httpmsg_init(INOUT http_message_t *msg)
|
||||
void
|
||||
httpmsg_init( INOUT http_message_t * msg )
|
||||
{
|
||||
msg->initialized = 1;
|
||||
msg->entity.buf = NULL;
|
||||
@@ -463,7 +508,8 @@ void httpmsg_init(INOUT http_message_t *msg)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void httpmsg_destroy( INOUT http_message_t * msg )
|
||||
void
|
||||
httpmsg_destroy( INOUT http_message_t * msg )
|
||||
{
|
||||
assert( msg != NULL );
|
||||
|
||||
@@ -491,9 +537,9 @@ void httpmsg_destroy( INOUT http_message_t * msg )
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
http_header_t *httpmsg_find_hdr_str(
|
||||
IN http_message_t *msg,
|
||||
IN const char *header_name)
|
||||
http_header_t *
|
||||
httpmsg_find_hdr_str( IN http_message_t * msg,
|
||||
IN const char *header_name )
|
||||
{
|
||||
http_header_t *header;
|
||||
|
||||
@@ -528,21 +574,27 @@ http_header_t *httpmsg_find_hdr_str(
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
http_header_t *httpmsg_find_hdr(
|
||||
IN http_message_t *msg,
|
||||
http_header_t *
|
||||
httpmsg_find_hdr( IN http_message_t * msg,
|
||||
IN int header_name_id,
|
||||
OUT memptr *value)
|
||||
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;
|
||||
@@ -551,6 +603,12 @@ http_header_t *httpmsg_find_hdr(
|
||||
return data;
|
||||
}
|
||||
|
||||
/***********************************************************************/
|
||||
|
||||
/************* http_parser_t **************/
|
||||
|
||||
/***********************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Function : skip_blank_lines
|
||||
*
|
||||
@@ -563,20 +621,23 @@ http_header_t *httpmsg_find_hdr(
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE int skip_blank_lines(INOUT scanner_t *scanner)
|
||||
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 */
|
||||
// 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 */
|
||||
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;
|
||||
@@ -597,7 +658,8 @@ static UPNP_INLINE int skip_blank_lines(INOUT scanner_t *scanner)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE int skip_lws(INOUT scanner_t *scanner)
|
||||
static UPNP_INLINE int
|
||||
skip_lws( INOUT scanner_t * scanner )
|
||||
{
|
||||
memptr token;
|
||||
token_type_t tok_type;
|
||||
@@ -651,9 +713,9 @@ static UPNP_INLINE int skip_lws(INOUT scanner_t *scanner)
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE parse_status_t match_non_ws_string(
|
||||
INOUT scanner_t *scanner,
|
||||
OUT memptr *str)
|
||||
static UPNP_INLINE parse_status_t
|
||||
match_non_ws_string( INOUT scanner_t * scanner,
|
||||
OUT memptr * str )
|
||||
{
|
||||
memptr token;
|
||||
token_type_t tok_type;
|
||||
@@ -717,9 +779,9 @@ static UPNP_INLINE parse_status_t match_non_ws_string(
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static UPNP_INLINE parse_status_t match_raw_value(
|
||||
INOUT scanner_t * scanner,
|
||||
OUT memptr *raw_value)
|
||||
static UPNP_INLINE parse_status_t
|
||||
match_raw_value( INOUT scanner_t * scanner,
|
||||
OUT memptr * raw_value )
|
||||
{
|
||||
memptr token;
|
||||
token_type_t tok_type;
|
||||
@@ -808,10 +870,10 @@ static UPNP_INLINE parse_status_t match_raw_value(
|
||||
* PARSE_FAILURE -- bad input
|
||||
* PARSE_INCOMPLETE
|
||||
************************************************************************/
|
||||
static UPNP_INLINE int match_int(
|
||||
INOUT scanner_t *scanner,
|
||||
static UPNP_INLINE int
|
||||
match_int( INOUT scanner_t * scanner,
|
||||
IN int base,
|
||||
OUT int *value)
|
||||
OUT int *value )
|
||||
{
|
||||
memptr token;
|
||||
token_type_t tok_type;
|
||||
@@ -895,6 +957,36 @@ read_until_crlf( INOUT scanner_t * scanner,
|
||||
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
|
||||
************************************************************************/
|
||||
#ifndef WIN32
|
||||
#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.
|
||||
#else
|
||||
#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.")
|
||||
#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
|
||||
*
|
||||
@@ -1440,9 +1532,7 @@ parser_parse_responseline( INOUT http_parser_t * parser )
|
||||
|
||||
if( num_scanned != 3 ||
|
||||
hmsg->major_version < 0 ||
|
||||
/* HTTP version equals to 1.0 should fail as required by the
|
||||
* UPnP certification tool */
|
||||
hmsg->minor_version < 1 || hmsg->status_code < 0 ) {
|
||||
hmsg->minor_version < 0 || hmsg->status_code < 0 ) {
|
||||
// bad response line
|
||||
return PARSE_FAILURE;
|
||||
}
|
||||
@@ -1649,6 +1739,140 @@ parser_parse_headers( INOUT http_parser_t * parser )
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
#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
|
||||
*
|
||||
@@ -1670,9 +1894,9 @@ parser_parse_entity_using_clen( INOUT http_parser_t * parser )
|
||||
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 +
|
||||
parser->msg.entity_offset;
|
||||
parser->msg.msg.length - parser->entity_start_position;
|
||||
|
||||
if( parser->msg.entity.length < parser->content_length ) {
|
||||
// more data to be read
|
||||
@@ -1680,8 +1904,7 @@ parser_parse_entity_using_clen( INOUT http_parser_t * parser )
|
||||
} else {
|
||||
if( parser->msg.entity.length > parser->content_length ) {
|
||||
// silently discard extra data
|
||||
parser->msg.msg.buf[parser->entity_start_position -
|
||||
parser->msg.entity_offset +
|
||||
parser->msg.msg.buf[parser->entity_start_position +
|
||||
parser->content_length] = '\0';
|
||||
}
|
||||
// save entity length
|
||||
@@ -2066,7 +2289,6 @@ parser_response_init( OUT http_parser_t * parser,
|
||||
parser_init( parser );
|
||||
parser->msg.is_request = FALSE;
|
||||
parser->msg.request_method = request_method;
|
||||
parser->msg.entity_offset = 0;
|
||||
parser->position = POS_RESPONSE_LINE;
|
||||
}
|
||||
|
||||
@@ -2162,6 +2384,10 @@ parser_append( INOUT http_parser_t * parser,
|
||||
return parser_parse( parser );
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
********** end of parser ***********
|
||||
************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Function: raw_to_int
|
||||
*
|
||||
@@ -2174,7 +2400,9 @@ parser_append( INOUT http_parser_t * parser,
|
||||
* Returns:
|
||||
* int
|
||||
************************************************************************/
|
||||
int raw_to_int(IN memptr *raw_value, IN int base)
|
||||
int
|
||||
raw_to_int( IN memptr * raw_value,
|
||||
IN int base )
|
||||
{
|
||||
long num;
|
||||
char *end_ptr;
|
||||
@@ -2211,7 +2439,9 @@ int raw_to_int(IN memptr *raw_value, IN int base)
|
||||
* Returns:
|
||||
* int - index at which the substring is found.
|
||||
************************************************************************/
|
||||
int raw_find_str(IN memptr *raw_value, IN const char *str)
|
||||
int
|
||||
raw_find_str( IN memptr *raw_value,
|
||||
IN const char *str )
|
||||
{
|
||||
char c;
|
||||
char *ptr;
|
||||
@@ -2254,7 +2484,8 @@ int raw_find_str(IN memptr *raw_value, IN const char *str)
|
||||
* Returns:
|
||||
* const char* ptr - Ptr to the HTTP Method
|
||||
************************************************************************/
|
||||
const char *method_to_str(IN http_method_t method)
|
||||
const char *
|
||||
method_to_str( IN http_method_t method )
|
||||
{
|
||||
int index;
|
||||
|
||||
@@ -2265,15 +2496,26 @@ const char *method_to_str(IN http_method_t method)
|
||||
return index == -1 ? NULL : Http_Method_Table[index].name;
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: print_http_headers
|
||||
*
|
||||
* Parameters:
|
||||
* http_message_t* hmsg ; HTTP Message object
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void print_http_headers(http_message_t *hmsg)
|
||||
void
|
||||
print_http_headers( http_message_t * hmsg )
|
||||
{
|
||||
ListNode *node;
|
||||
/* NNS: dlist_node *node; */
|
||||
// NNS: dlist_node *node;
|
||||
http_header_t *header;
|
||||
|
||||
/* print start line */
|
||||
// print start line
|
||||
if( hmsg->is_request ) {
|
||||
printf( "method = %d, version = %d.%d, url = %.*s\n",
|
||||
hmsg->method, hmsg->major_version, hmsg->minor_version,
|
||||
@@ -2284,19 +2526,19 @@ void print_http_headers(http_message_t *hmsg)
|
||||
(int)hmsg->status_msg.length, hmsg->status_msg.buf);
|
||||
}
|
||||
|
||||
/* print headers */
|
||||
// print headers
|
||||
node = ListHead( &hmsg->headers );
|
||||
/* NNS: node = dlist_first_node( &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; */
|
||||
// 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 ); */
|
||||
// NNS: node = dlist_next( &hmsg->headers, node );
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,7 +36,7 @@
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "upnputil.h"
|
||||
#include "util.h"
|
||||
#include "membuffer.h"
|
||||
#include "httpparser.h"
|
||||
#include "statcodes.h"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "upnputil.h"
|
||||
#include "util.h"
|
||||
#include "statcodes.h"
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,159 +1,236 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 Implements the sockets functionality.
|
||||
*/
|
||||
/************************************************************************
|
||||
* Purpose: This file implements the sockets functionality
|
||||
************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "sock.h"
|
||||
|
||||
#include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */
|
||||
#include "upnp.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "sock.h"
|
||||
#include "upnp.h"
|
||||
#ifndef WIN32
|
||||
#include <arpa/inet.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#include "unixutil.h"
|
||||
|
||||
#ifndef MSG_NOSIGNAL
|
||||
#define MSG_NOSIGNAL 0
|
||||
#define MSG_NOSIGNAL 0
|
||||
#endif
|
||||
|
||||
int sock_init(OUT SOCKINFO *info, IN SOCKET sockfd)
|
||||
/************************************************************************
|
||||
* Function : sock_init
|
||||
*
|
||||
* Parameters :
|
||||
* OUT SOCKINFO* info ; Socket Information Object
|
||||
* IN int 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 int sockfd )
|
||||
{
|
||||
assert(info);
|
||||
assert( info );
|
||||
|
||||
memset( info, 0, sizeof( SOCKINFO ) );
|
||||
|
||||
memset(info, 0, sizeof(SOCKINFO));
|
||||
info->socket = sockfd;
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
int sock_init_with_ip(OUT SOCKINFO *info, IN SOCKET sockfd,
|
||||
IN struct sockaddr *foreign_sockaddr)
|
||||
/************************************************************************
|
||||
* Function : sock_init_with_ip
|
||||
*
|
||||
* Parameters :
|
||||
* OUT SOCKINFO* info ; Socket Information Object
|
||||
* IN int sockfd ; Socket Descriptor
|
||||
* IN struct in_addr foreign_ip_addr ; Remote IP Address
|
||||
* IN unsigned short foreign_ip_port ; Remote Port number
|
||||
*
|
||||
* 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 int sockfd,
|
||||
IN struct in_addr foreign_ip_addr,
|
||||
IN unsigned short foreign_ip_port )
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sock_init(info, sockfd);
|
||||
if (ret != UPNP_E_SUCCESS) {
|
||||
ret = sock_init( info, sockfd );
|
||||
if( ret != UPNP_E_SUCCESS ) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
memcpy(&info->foreign_sockaddr, foreign_sockaddr,
|
||||
sizeof(info->foreign_sockaddr));
|
||||
info->foreign_ip_addr = foreign_ip_addr;
|
||||
info->foreign_ip_port = foreign_ip_port;
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
int sock_destroy(INOUT SOCKINFO *info, int ShutdownMethod)
|
||||
/************************************************************************
|
||||
* 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 )
|
||||
{
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
|
||||
if (info->socket != -1) {
|
||||
shutdown(info->socket, ShutdownMethod);
|
||||
if (sock_close(info->socket) == -1) {
|
||||
ret = UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
info->socket = -1;
|
||||
shutdown( info->socket, ShutdownMethod );
|
||||
if( UpnpCloseSocket( info->socket ) == -1 ) {
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Receives or sends data. Also returns the time taken to receive or
|
||||
* send data.
|
||||
*
|
||||
* \return
|
||||
* \li \c numBytes - On Success, no of bytes received or sent or
|
||||
* \li \c UPNP_E_TIMEDOUT - Timeout
|
||||
* \li \c UPNP_E_SOCKET_ERROR - Error on socket calls
|
||||
*/
|
||||
static int sock_read_write(
|
||||
/*! Socket Information Object. */
|
||||
IN SOCKINFO *info,
|
||||
/*! Buffer to get data to or send data from. */
|
||||
/************************************************************************
|
||||
* 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,
|
||||
/*! Size of the buffer. */
|
||||
IN size_t bufsize,
|
||||
/*! timeout value. */
|
||||
IN int *timeoutSecs,
|
||||
/*! Boolean value specifying read or write option. */
|
||||
IN xboolean bRead)
|
||||
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;
|
||||
time_t start_time = time( NULL );
|
||||
int sockfd = info->socket;
|
||||
long bytes_sent = 0,
|
||||
byte_left = 0,
|
||||
num_written;
|
||||
|
||||
if (*timeoutSecs < 0) {
|
||||
if( *timeoutSecs < 0 ) {
|
||||
return UPNP_E_TIMEDOUT;
|
||||
}
|
||||
FD_ZERO(&readSet);
|
||||
FD_ZERO(&writeSet);
|
||||
if (bRead) {
|
||||
FD_SET(sockfd, &readSet);
|
||||
|
||||
FD_ZERO( &readSet );
|
||||
FD_ZERO( &writeSet );
|
||||
if( bRead ) {
|
||||
FD_SET( ( unsigned )sockfd, &readSet );
|
||||
} else {
|
||||
FD_SET(sockfd, &writeSet);
|
||||
FD_SET( ( unsigned )sockfd, &writeSet );
|
||||
}
|
||||
|
||||
timeout.tv_sec = *timeoutSecs;
|
||||
timeout.tv_usec = 0;
|
||||
while (TRUE) {
|
||||
if (*timeoutSecs == 0) {
|
||||
retCode = select(sockfd + 1, &readSet, &writeSet,
|
||||
NULL, NULL);
|
||||
|
||||
while( TRUE ) {
|
||||
if( *timeoutSecs == 0 ) {
|
||||
retCode =
|
||||
select( sockfd + 1, &readSet, &writeSet, NULL, NULL );
|
||||
} else {
|
||||
retCode = select(sockfd + 1, &readSet, &writeSet,
|
||||
NULL, &timeout);
|
||||
retCode =
|
||||
select( sockfd + 1, &readSet, &writeSet, NULL, &timeout );
|
||||
}
|
||||
if (retCode == 0) {
|
||||
|
||||
if( retCode == 0 ) {
|
||||
return UPNP_E_TIMEDOUT;
|
||||
}
|
||||
if (retCode == -1) {
|
||||
if (errno == EINTR)
|
||||
if( retCode == -1 ) {
|
||||
if( errno == EINTR )
|
||||
continue;
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
return UPNP_E_SOCKET_ERROR; // error
|
||||
} else {
|
||||
/* read or write. */
|
||||
break;
|
||||
break; // read or write
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SO_NOSIGPIPE
|
||||
{
|
||||
int old;
|
||||
@@ -162,53 +239,96 @@ static int sock_read_write(
|
||||
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);
|
||||
|
||||
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) {
|
||||
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);
|
||||
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) {
|
||||
|
||||
if( numBytes < 0 ) {
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
/* subtract time used for reading/writing. */
|
||||
if (*timeoutSecs != 0) {
|
||||
*timeoutSecs -= time(NULL) - start_time;
|
||||
// subtract time used for reading/writing
|
||||
if( *timeoutSecs != 0 ) {
|
||||
*timeoutSecs -= time( NULL ) - start_time;
|
||||
}
|
||||
|
||||
return numBytes;
|
||||
}
|
||||
|
||||
int sock_read(IN SOCKINFO *info, OUT char *buffer, IN size_t bufsize,
|
||||
INOUT int *timeoutSecs)
|
||||
/************************************************************************
|
||||
* 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);
|
||||
return sock_read_write( info, buffer, bufsize, timeoutSecs, TRUE );
|
||||
}
|
||||
|
||||
int sock_write(IN SOCKINFO *info, IN 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 : 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);
|
||||
return sock_read_write( info, buffer, bufsize, timeoutSecs, FALSE );
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +1,33 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
@@ -117,8 +116,25 @@ RemoveSubscriptionSID( Upnp_SID sid,
|
||||
|
||||
}
|
||||
|
||||
|
||||
subscription *GetSubscriptionSID(const Upnp_SID sid, service_info *service)
|
||||
/************************************************************************
|
||||
* Function : GetSubscriptionSID
|
||||
*
|
||||
* Parameters :
|
||||
* Upnp_SID sid ; subscription ID
|
||||
* service_info * service ; service object providing the list of
|
||||
* subscriptions
|
||||
*
|
||||
* Description : Return the subscription from the service table
|
||||
* that matches const Upnp_SID sid value.
|
||||
*
|
||||
* Return : subscription * - Pointer to the matching subscription
|
||||
* node;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
subscription *
|
||||
GetSubscriptionSID( Upnp_SID sid,
|
||||
service_info * service )
|
||||
{
|
||||
subscription *next = service->subscriptionList;
|
||||
subscription *previous = NULL;
|
||||
@@ -153,15 +169,31 @@ subscription *GetSubscriptionSID(const Upnp_SID sid, service_info *service)
|
||||
|
||||
}
|
||||
|
||||
|
||||
subscription *GetNextSubscription(service_info *service, subscription *current)
|
||||
/************************************************************************
|
||||
* Function : GetNextSubscription
|
||||
*
|
||||
* Parameters :
|
||||
* service_info * service ; service object providing the list of
|
||||
* subscriptions
|
||||
* subscription *current ; current subscription object
|
||||
*
|
||||
* Description : Get current and valid subscription from the service
|
||||
* table.
|
||||
*
|
||||
* Return : subscription * - Pointer to the next subscription node;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
subscription *
|
||||
GetNextSubscription( service_info * service,
|
||||
subscription * current )
|
||||
{
|
||||
time_t current_time;
|
||||
subscription *next = NULL;
|
||||
subscription *previous = NULL;
|
||||
int notDone = 1;
|
||||
|
||||
// get the current_time
|
||||
//get the current_time
|
||||
time( ¤t_time );
|
||||
while( ( notDone ) && ( current ) ) {
|
||||
previous = current;
|
||||
@@ -186,25 +218,51 @@ subscription *GetNextSubscription(service_info *service, subscription *current)
|
||||
return next;
|
||||
}
|
||||
|
||||
|
||||
subscription *GetFirstSubscription(service_info *service)
|
||||
/************************************************************************
|
||||
* Function : GetFirstSubscription
|
||||
*
|
||||
* Parameters :
|
||||
* service_info *service ; service object providing the list of
|
||||
* subscriptions
|
||||
*
|
||||
* Description : Gets pointer to the first subscription node in the
|
||||
* service table.
|
||||
*
|
||||
* Return : subscription * - pointer to the first subscription node ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
subscription *
|
||||
GetFirstSubscription( service_info * service )
|
||||
{
|
||||
subscription temp;
|
||||
subscription *next = NULL;
|
||||
|
||||
temp.next = service->subscriptionList;
|
||||
next = GetNextSubscription(service, &temp);
|
||||
next = GetNextSubscription( service, &temp );
|
||||
service->subscriptionList = temp.next;
|
||||
// service->subscriptionList = next;
|
||||
|
||||
// service->subscriptionList=next;
|
||||
return next;
|
||||
}
|
||||
|
||||
|
||||
void freeSubscription(subscription *sub)
|
||||
/************************************************************************
|
||||
* Function : freeSubscription
|
||||
*
|
||||
* Parameters :
|
||||
* subscription * sub ; subscription to be freed
|
||||
*
|
||||
* Description : Free's the memory allocated for storing the URL of
|
||||
* the subscription.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
freeSubscription( subscription * sub )
|
||||
{
|
||||
if (sub) {
|
||||
free_URL_list(&sub->DeliveryURLs);
|
||||
if( sub ) {
|
||||
free_URL_list( &sub->DeliveryURLs );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -871,10 +929,8 @@ getServiceList( IXML_Node * node,
|
||||
( *end ) = current;
|
||||
|
||||
return head;
|
||||
} else {
|
||||
( *end ) = NULL;
|
||||
} else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -920,7 +976,6 @@ getAllServiceList( IXML_Node * node,
|
||||
if( head ) {
|
||||
end->next =
|
||||
getServiceList( currentDevice, &next_end, URLBase );
|
||||
if ( next_end )
|
||||
end = next_end;
|
||||
} else
|
||||
head = getServiceList( currentDevice, &end, URLBase );
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
@@ -491,8 +491,6 @@ membuffer_delete( INOUT membuffer * m,
|
||||
|
||||
assert( m != NULL );
|
||||
|
||||
if (!m) return;
|
||||
|
||||
if( m->length == 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,59 +1,65 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 a function for freeing the memory associated
|
||||
* wuth a upnp time out event.
|
||||
************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include "upnp_timeout.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <stdlib.h> /* for free() */
|
||||
|
||||
|
||||
void free_upnp_timeout(upnp_timeout *event)
|
||||
/************************************************************************
|
||||
* Function : free_upnp_timeout
|
||||
*
|
||||
* Parameters :
|
||||
* upnp_timeout *event ; Event which needs to be freed
|
||||
*
|
||||
* Description : Free memory associated with event and memory for any
|
||||
* sub-elements
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
free_upnp_timeout( upnp_timeout * event )
|
||||
{
|
||||
if (event) {
|
||||
if (event->Event) {
|
||||
free(event->Event);
|
||||
}
|
||||
free(event);
|
||||
|
||||
if( event ) {
|
||||
if( event->Event )
|
||||
free( event->Event );
|
||||
free( event );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,47 +1,42 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "upnputil.h"
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
/************************************************************************
|
||||
* Function : linecopy
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
|
||||
|
||||
#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 <tt> 0</tt>: The file contains no more data (EOF).
|
||||
* \li <tt> > 0</tt>: A successful read of the number of bytes in the
|
||||
* return code.
|
||||
* \li <tt> < 0</tt>: 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 */
|
||||
|
||||
@@ -1,248 +1,167 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 CLIENT_TABLE_H
|
||||
#define CLIENT_TABLE_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#ifndef _CLIENT_TABLE
|
||||
#define _CLIENT_TABLE
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "service_table.h"
|
||||
#include "upnp.h"
|
||||
#include "UpnpString.h"
|
||||
#include "upnp_timeout.h"
|
||||
#include "uri.h"
|
||||
#include "TimerThread.h"
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
//#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include "uri.h"
|
||||
#include "service_table.h"
|
||||
|
||||
#include "TimerThread.h"
|
||||
#include "upnp_timeout.h"
|
||||
|
||||
extern TimerThread gTimerThread;
|
||||
|
||||
CLIENTONLY(
|
||||
typedef struct CLIENT_SUBSCRIPTION {
|
||||
Upnp_SID sid;
|
||||
char * ActualSID;
|
||||
char * EventURL;
|
||||
int RenewEventId;
|
||||
struct CLIENT_SUBSCRIPTION * next;
|
||||
} client_subscription;
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
/************************************************************************
|
||||
* Function : copy_client_subscription
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription * in ; - source client subscription
|
||||
* client_subscription * out ; - destination client subscription
|
||||
*
|
||||
* Description : Make a copy of the client subscription data
|
||||
*
|
||||
* Return : int ;
|
||||
* UPNP_E_OUTOF_MEMORY - On Failure to allocate memory
|
||||
* HTTP_SUCCESS - On Success
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int copy_client_subscription(client_subscription * in, client_subscription * out);
|
||||
|
||||
/************************************************************************
|
||||
* Function : free_client_subscription
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription * sub ; - Client subscription to be freed
|
||||
*
|
||||
* Description : Free memory allocated for client subscription data.
|
||||
* Remove timer thread associated with this subscription event.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void free_client_subscription(client_subscription * sub);
|
||||
|
||||
|
||||
typedef struct s_ClientSubscription ClientSubscription;
|
||||
/************************************************************************
|
||||
* Function : freeClientSubList
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription * list ; Client subscription
|
||||
*
|
||||
* Description : Free the client subscription table.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void freeClientSubList(client_subscription * list);
|
||||
|
||||
/************************************************************************
|
||||
* Function : RemoveClientSubClientSID
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription **head ; Head of the subscription list
|
||||
* const Upnp_SID sid ; Subscription ID to be mactched
|
||||
*
|
||||
* Description : Remove the client subscription matching the
|
||||
* subscritpion id represented by the const Upnp_SID sid parameter
|
||||
* from the table and update the table.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void RemoveClientSubClientSID(client_subscription **head,
|
||||
const Upnp_SID sid);
|
||||
|
||||
/*!
|
||||
* \brief Constructor.
|
||||
*/
|
||||
ClientSubscription *UpnpClientSubscription_new();
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Destructor.
|
||||
*/
|
||||
void UpnpClientSubscription_delete(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Copy Constructor.
|
||||
*/
|
||||
ClientSubscription *UpnpClientSubscription_dup(
|
||||
/*! [in] The \b this pointer. */
|
||||
const ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Assignment operator.
|
||||
*/
|
||||
void UpnpClientSubscription_assign(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *q,
|
||||
const ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
int UpnpClientSubscription_get_RenewEventId(
|
||||
/*! [in] The \b this pointer. */
|
||||
const ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_set_RenewEventId(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
/*! [in] . */
|
||||
int n);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
const UpnpString *UpnpClientSubscription_get_SID(
|
||||
/*! [in] The \b this pointer. */
|
||||
const ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_set_SID(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
const UpnpString *s);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_strcpy_SID(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
const char *s);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
const UpnpString *UpnpClientSubscription_get_ActualSID(
|
||||
/*! [in] The \b this pointer. */
|
||||
const ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_set_ActualSID(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
const UpnpString *s);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_strcpy_ActualSID(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
const char *s);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
const UpnpString *UpnpClientSubscription_get_EventURL(
|
||||
/*! [in] The \b this pointer. */
|
||||
const ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_set_EventURL(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
const UpnpString *s);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_strcpy_EventURL(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
const char *s);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
ClientSubscription *UpnpClientSubscription_get_Next(
|
||||
/*! [in] The \b this pointer. */
|
||||
const ClientSubscription *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void UpnpClientSubscription_set_Next(
|
||||
/*! [in] The \b this pointer. */
|
||||
ClientSubscription *p,
|
||||
ClientSubscription *q);
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \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 */
|
||||
/************************************************************************
|
||||
* Function : GetClientSubClientSID
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription *head ; Head of the subscription list
|
||||
* const Upnp_SID sid ; Subscription ID to be matched
|
||||
*
|
||||
* Description : Return the client subscription from the client table
|
||||
* that matches const Upnp_SID sid subscrition id value.
|
||||
*
|
||||
* Return : client_subscription * ; The matching subscription
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
client_subscription * GetClientSubClientSID(client_subscription *head
|
||||
, const Upnp_SID sid);
|
||||
|
||||
/************************************************************************
|
||||
* Function : GetClientSubActualSID
|
||||
*
|
||||
* Parameters :
|
||||
* client_subscription *head ; Head of the subscription list
|
||||
* token * sid ; Subscription ID to be matched
|
||||
*
|
||||
* Description : Returns the client subscription from the client
|
||||
* subscription table that has the matching token * sid buffer
|
||||
* value.
|
||||
*
|
||||
* Return : client_subscription * ; The matching subscription
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
client_subscription * GetClientSubActualSID(client_subscription *head
|
||||
, token * sid);
|
||||
)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif /* CLIENT_TABLE_H */
|
||||
#endif
|
||||
|
||||
#endif /* _CLIENT_TABLE */
|
||||
|
||||
@@ -1,33 +1,33 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
**************************************************************************/
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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
|
||||
@@ -36,66 +36,52 @@
|
||||
#include "autoconfig.h"
|
||||
|
||||
|
||||
/*!
|
||||
* \name Compile time configuration options
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
@@ -104,111 +90,60 @@
|
||||
* 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 THREAD_STACK_SIZE
|
||||
*
|
||||
* The {\tt THREAD_STACK_SIZE} constant defines the minimum stack size (in
|
||||
* bytes) allocated for the stack of each thread 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. This value will not be used if it
|
||||
* is lower than ITHREAD_STACK_MIN or greater than a system-imposed limit.
|
||||
* This value can be used to lower memory overhead in embedded systems.
|
||||
* The default value is 0 (so it is not used by default).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define THREAD_STACK_SIZE 0
|
||||
/* @} */
|
||||
|
||||
|
||||
/*! \name MAX_JOBS_TOTAL
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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 WEB_SERVER_CONTENT_LANGUAGE
|
||||
*
|
||||
* This configuration parameter sets the value of the Content-Language
|
||||
* header for the webserver. Thanks to this parameter, the use can advertize
|
||||
* the language used by the device in the description (friendlyName) and
|
||||
* presentation steps of UPnP. The default value is empty string so no
|
||||
* Content-Language header is added.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define WEB_SERVER_CONTENT_LANGUAGE ""
|
||||
/* @} */
|
||||
|
||||
/*!
|
||||
* \name AUTO_RENEW_TIME
|
||||
*
|
||||
/** @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
|
||||
@@ -216,87 +151,71 @@
|
||||
* 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
|
||||
*
|
||||
//@{
|
||||
#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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
*
|
||||
/** @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
|
||||
@@ -312,8 +231,9 @@
|
||||
* \item {\tt EXCLUDE_JNI[0,1]}
|
||||
* \end{itemize}
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define EXCLUDE_SSDP 0
|
||||
#define EXCLUDE_SOAP 0
|
||||
#define EXCLUDE_GENA 0
|
||||
@@ -325,28 +245,24 @@
|
||||
#else
|
||||
# define EXCLUDE_JNI 1
|
||||
#endif
|
||||
/* @} */
|
||||
//@}
|
||||
|
||||
|
||||
/*!
|
||||
* \name DEBUG_TARGET
|
||||
*
|
||||
/** @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 <upnp/inc/upnpdebug.h>
|
||||
/** @name Other debugging features
|
||||
The UPnP SDK contains other features to aid in debugging:
|
||||
see <upnp/inc/upnpdebug.h>
|
||||
*/
|
||||
|
||||
#define DEBUG_ALL 1
|
||||
@@ -359,44 +275,36 @@
|
||||
#define DEBUG_HTTP 0
|
||||
#define DEBUG_API 0
|
||||
|
||||
|
||||
/*
|
||||
* @} Compile time configuration options
|
||||
*/
|
||||
//@} // Compile time configuration options
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Do not change, Internal purpose only!!!
|
||||
***************************************************************************/
|
||||
|
||||
/*!
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
|
||||
/*
|
||||
* Set additional defines based on requested configuration
|
||||
*/
|
||||
|
||||
|
||||
/* configure --enable-client */
|
||||
// configure --enable-client
|
||||
#if UPNP_HAVE_CLIENT
|
||||
# define INCLUDE_CLIENT_APIS 1
|
||||
#endif
|
||||
|
||||
|
||||
/* configure --enable-device */
|
||||
// configure --enable-device
|
||||
#if UPNP_HAVE_DEVICE
|
||||
# define INCLUDE_DEVICE_APIS 1
|
||||
#endif
|
||||
|
||||
|
||||
/* configure --enable-webserver --enable-device */
|
||||
// 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
|
||||
@@ -407,7 +315,6 @@
|
||||
# define EXCLUDE_MINISERVER 1
|
||||
#endif
|
||||
|
||||
|
||||
#if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# define EXCLUDE_MINISERVER 1
|
||||
@@ -416,7 +323,6 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# define EXCLUDE_MINISERVER 0
|
||||
@@ -426,9 +332,13 @@
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* INTERNAL_CONFIG_H */
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
# define CLIENTONLY(x) x
|
||||
#else
|
||||
# define CLIENTONLY(x)
|
||||
#endif
|
||||
|
||||
//@}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,83 +1,65 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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_
|
||||
#define _GENA_
|
||||
#include "config.h"
|
||||
#include "service_table.h"
|
||||
#include "miniserver.h"
|
||||
#include "uri.h"
|
||||
#include "upnp.h"
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#include "ThreadPool.h"
|
||||
#include <string.h>
|
||||
#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 extern "C"
|
||||
#else
|
||||
#ifndef EXTERN_C
|
||||
#define EXTERN_C
|
||||
#endif /* EXTERN_C */
|
||||
#endif /* __cplusplus */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief XML version comment. Not used because it is not interopeable with
|
||||
* other UPnP vendors.
|
||||
*/
|
||||
#define XML_VERSION "<?xml version='1.0' encoding='ISO-8859-1' ?>\n"
|
||||
#define XML_PROPERTYSET_HEADER \
|
||||
"<e:propertyset xmlns:e=\"urn:schemas-upnp-org:event-1-0\">\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 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"
|
||||
@@ -92,8 +74,6 @@
|
||||
#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
|
||||
@@ -102,23 +82,16 @@
|
||||
#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.
|
||||
*/
|
||||
// Lock the subscription
|
||||
#define SubscribeLock() \
|
||||
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
|
||||
"Trying Subscribe Lock"); \
|
||||
@@ -126,10 +99,7 @@ extern ithread_mutex_t GlobalClientSubscribeMutex;
|
||||
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
|
||||
"Subscribe Lock");
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Unlocks the subscription.
|
||||
*/
|
||||
// Unlock the subscription
|
||||
#define SubscribeUnlock() \
|
||||
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
|
||||
"Trying Subscribe UnLock"); \
|
||||
@@ -138,14 +108,12 @@ extern ithread_mutex_t GlobalClientSubscribeMutex;
|
||||
"Subscribe UnLock");
|
||||
|
||||
|
||||
/*!
|
||||
* Structure to send NOTIFY message to all subscribed control points
|
||||
*/
|
||||
// Structure to send NOTIFY message to all subscribed control points
|
||||
typedef struct NOTIFY_THREAD_STRUCT {
|
||||
char *headers;
|
||||
char * headers;
|
||||
DOMString propertySet;
|
||||
char *servId;
|
||||
char *UDN;
|
||||
char * servId;
|
||||
char * UDN;
|
||||
Upnp_SID sid;
|
||||
int eventKey;
|
||||
int *reference_count;
|
||||
@@ -153,233 +121,282 @@ typedef struct NOTIFY_THREAD_STRUCT {
|
||||
} 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);
|
||||
/************************************************************************
|
||||
* 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
|
||||
***************************************************************************/
|
||||
EXTERN_C void genaCallback (IN http_parser_t *parser,
|
||||
IN http_message_t* request,
|
||||
IN 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
|
||||
*/
|
||||
/************************************************************************
|
||||
* Function : genaSubscribe
|
||||
*
|
||||
* Parameters:
|
||||
* IN UpnpClient_Handle client_handle:
|
||||
* IN char * PublisherURL: NULL Terminated, of the form :
|
||||
* "http://134.134.156.80:4000/RedBulb/Event"
|
||||
* INOUT int * TimeOut: requested Duration, if -1, then "infinite".
|
||||
* in the OUT case: actual Duration granted
|
||||
* by Service, -1 for infinite
|
||||
* OUT Upnp_SID out_sid:sid of subscription, memory passed in by caller
|
||||
*
|
||||
* Description:
|
||||
* This function subscribes to a PublisherURL ( also mentioned as EventURL
|
||||
* 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
|
||||
*
|
||||
* Returns: int
|
||||
* return UPNP_E_SUCCESS if service response is OK else
|
||||
* returns appropriate error
|
||||
***************************************************************************/
|
||||
#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 */
|
||||
char * PublisherURL,
|
||||
int * TimeOut,
|
||||
Upnp_SID out_sid );
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \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.
|
||||
*/
|
||||
/************************************************************************
|
||||
* Function : genaUnSubscribe
|
||||
*
|
||||
* Parameters:
|
||||
* IN UpnpClient_Handle client_handle: UPnP client handle
|
||||
* IN SID in_sid: The subscription ID
|
||||
*
|
||||
* Description:
|
||||
* This function 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
|
||||
*
|
||||
* Returns: int
|
||||
* return UPNP_E_SUCCESS if service response is OK else
|
||||
* returns appropriate error
|
||||
***************************************************************************/
|
||||
#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 */
|
||||
const Upnp_SID in_sid);
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \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.
|
||||
*/
|
||||
/************************************************************************
|
||||
* Function : genaUnregisterClient
|
||||
*
|
||||
* Parameters:
|
||||
* IN UpnpClient_Handle client_handle: Handle containing all the control
|
||||
* point related information
|
||||
*
|
||||
* Description:
|
||||
* This function unsubcribes all the outstanding subscriptions and cleans
|
||||
* the subscription list. This function is called when control point
|
||||
* unregisters.
|
||||
*
|
||||
* Returns: int
|
||||
* return UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
***************************************************************************/
|
||||
#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 */
|
||||
EXTERN_C int genaUnregisterClient(UpnpClient_Handle client_handle);
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* DEVICE
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Cleans the service table of the device.
|
||||
*
|
||||
* \return UPNP_E_SUCCESS if successful, otherwise returns GENA_E_BAD_HANDLE
|
||||
*/
|
||||
//server
|
||||
/************************************************************************
|
||||
* Function : genaUnregisterDevice
|
||||
*
|
||||
* Parameters:
|
||||
* IN UpnpDevice_Handle device_handle: Handle of the root device
|
||||
*
|
||||
* Description:
|
||||
* This function cleans the service table of the device.
|
||||
*
|
||||
* Returns: int
|
||||
* returns UPNP_E_SUCCESS if successful else 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 */
|
||||
EXTERN_C int genaUnregisterDevice(UpnpDevice_Handle device_handle);
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \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.
|
||||
*/
|
||||
/************************************************************************
|
||||
* Function : genaRenewSubscription
|
||||
*
|
||||
* Parameters:
|
||||
* IN UpnpClient_Handle client_handle: Client handle
|
||||
* IN const Upnp_SID in_sid: subscription ID
|
||||
* INOUT int * TimeOut: requested Duration, if -1, then "infinite".
|
||||
* in the OUT case: actual Duration granted
|
||||
* by Service, -1 for infinite
|
||||
*
|
||||
* Description:
|
||||
* This function 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.
|
||||
*
|
||||
* Returns: int
|
||||
* return UPNP_E_SUCCESS if service response is OK else
|
||||
* returns appropriate error
|
||||
***************************************************************************/
|
||||
#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.
|
||||
*/
|
||||
IN UpnpClient_Handle client_handle,
|
||||
IN const Upnp_SID in_sid,
|
||||
OUT int * TimeOut);
|
||||
#endif
|
||||
/****************************************************************************
|
||||
* Function : genaNotifyAll
|
||||
*
|
||||
* Parameters :
|
||||
* IN UpnpDevice_Handle device_handle : Device handle
|
||||
* IN char *UDN : Device udn
|
||||
* IN char *servId : Service ID
|
||||
* IN char **VarNames : array of varible names
|
||||
* IN char **VarValues : array of variable values
|
||||
* IN int var_count : number of variables
|
||||
*
|
||||
* Description : This function 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 */
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \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.
|
||||
*/
|
||||
/****************************************************************************
|
||||
* Function : genaNotifyAllExt
|
||||
*
|
||||
* Parameters :
|
||||
* IN UpnpDevice_Handle device_handle : Device handle
|
||||
* IN char *UDN : Device udn
|
||||
* IN char *servId : Service ID
|
||||
* IN IXML_Document *PropSet : XML document Event varible property set
|
||||
*
|
||||
* Description : This function 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 */
|
||||
IN IXML_Document *PropSet);
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \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.
|
||||
*/
|
||||
/****************************************************************************
|
||||
* Function : genaInitNotify
|
||||
*
|
||||
* Parameters :
|
||||
* IN UpnpDevice_Handle device_handle : Device handle
|
||||
* IN char *UDN : Device udn
|
||||
* IN char *servId : Service ID
|
||||
* IN char **VarNames : Array of variable names
|
||||
* IN char **VarValues : Array of variable values
|
||||
* IN int var_count : array size
|
||||
* IN Upnp_SID sid : subscription ID
|
||||
*
|
||||
* Description : This function sends the intial state table dump to
|
||||
* newly subscribed control point.
|
||||
*
|
||||
* Return : int
|
||||
* returns GENA_E_SUCCESS if successful else returns appropriate error
|
||||
*
|
||||
* 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 */
|
||||
EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle,
|
||||
IN char *UDN,
|
||||
IN char *servId,
|
||||
IN char **VarNames,
|
||||
IN char **VarValues,
|
||||
IN int var_count,
|
||||
IN Upnp_SID sid);
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \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.
|
||||
*/
|
||||
/****************************************************************************
|
||||
* Function : genaInitNotifyExt
|
||||
*
|
||||
* Parameters :
|
||||
* IN UpnpDevice_Handle device_handle : Device handle
|
||||
* IN char *UDN : Device udn
|
||||
* IN char *servId : Service ID
|
||||
* IN IXML_Document *PropSet : Document of the state table
|
||||
* IN Upnp_SID sid : subscription ID
|
||||
*
|
||||
* Description : This function is 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 : int
|
||||
* returns GENA_E_SUCCESS if successful else returns appropriate error
|
||||
*
|
||||
* 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 */
|
||||
IN UpnpDevice_Handle device_handle,
|
||||
IN char *UDN,
|
||||
IN char *servId,
|
||||
IN IXML_Document *PropSet,
|
||||
IN Upnp_SID sid);
|
||||
#endif
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* 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 );
|
||||
|
||||
|
||||
#endif // GENA
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \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 */
|
||||
|
||||
|
||||
@@ -1,64 +1,52 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "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 */
|
||||
|
||||
/************************************************************************
|
||||
* Function : gena_process_notification_event
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info: Socket structure containing the device socket
|
||||
* information
|
||||
* IN http_message_t* event: The http message contains the GENA
|
||||
* notification
|
||||
*
|
||||
* Description:
|
||||
* This function processes NOTIFY events that are sent by devices.
|
||||
* called by genacallback()
|
||||
*
|
||||
* Returns: void
|
||||
*
|
||||
* Note : called by genacallback()
|
||||
****************************************************************************/
|
||||
void gena_process_notification_event( INOUT SOCKINFO *info,
|
||||
IN http_message_t* request );
|
||||
|
||||
@@ -1,79 +1,88 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "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);
|
||||
/****************************************************************************
|
||||
* Function : gena_process_subscription_request
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info : socket info of the device
|
||||
* IN http_message_t* request : SUBSCRIPTION request from the control
|
||||
* point
|
||||
*
|
||||
* Description : This function handles a subscription request from a
|
||||
* ctrl point. The socket is not closed on return.
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
void gena_process_subscription_request( IN SOCKINFO *info,
|
||||
IN 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);
|
||||
/****************************************************************************
|
||||
* Function : gena_process_subscription_renewal_request
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info : socket info of the device
|
||||
* IN http_message_t* request : subscription renewal request from the
|
||||
* control point
|
||||
*
|
||||
* Description : This function handles a subscription renewal request
|
||||
* from a ctrl point. The connection is not destroyed on return.
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
void gena_process_subscription_renewal_request( IN SOCKINFO *info,
|
||||
IN 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 */
|
||||
|
||||
/****************************************************************************
|
||||
* Function : gena_process_unsubscribe_request
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info : socket info of the device
|
||||
* IN http_message_t* request : UNSUBSCRIBE request from the control
|
||||
* point
|
||||
*
|
||||
* Description : This function Handles a subscription cancellation request
|
||||
* from a ctrl point. The connection is not destroyed on return.
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
void gena_process_unsubscribe_request( IN SOCKINFO *info,
|
||||
IN http_message_t* request );
|
||||
|
||||
@@ -1,50 +1,44 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* 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
|
||||
The following makes PROTOTYPES default to 0 if it has not already
|
||||
been defined with C compiler flags.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef PROTOTYPES
|
||||
#define PROTOTYPES 1
|
||||
#define PROTOTYPES 0
|
||||
#endif
|
||||
|
||||
/* POINTER defines a generic pointer type */
|
||||
@@ -56,17 +50,13 @@ 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.
|
||||
/* 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
|
||||
#define PROTO_LIST(list) list
|
||||
#else
|
||||
#define PROTO_LIST(list) ()
|
||||
#define PROTO_LIST(list) ()
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* GLOBAL_H */
|
||||
|
||||
|
||||
314
upnp/src/inc/http_client.h
Normal file
314
upnp/src/inc/http_client.h
Normal file
@@ -0,0 +1,314 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 _http_client_h_
|
||||
#define _http_client_h_
|
||||
#ifdef __cplusplus
|
||||
#define EXTERN_C extern "C"
|
||||
#else
|
||||
#define EXTERN_C
|
||||
#endif
|
||||
#include "genlib/closesocket/upnpclosesocket.h"
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
//#include <malloc.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/time.h>
|
||||
#include "tools/config.h"
|
||||
#include "upnp.h"
|
||||
//#include "upnp_debug.h"
|
||||
|
||||
|
||||
#define HTTP_DATE_LENGTH 37 // length for HTTP DATE:
|
||||
//"DATE: Sun, 01 Jul 2000 08:15:23 GMT<cr><lf>"
|
||||
#define SEPARATORS "()<>@,;:\\\"/[]?={} \t"
|
||||
#define MARK "-_.!~*'()"
|
||||
#define RESERVED ";/?:@&=+$,"
|
||||
#define HTTP_SUCCESS 1
|
||||
#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 FALSE 0
|
||||
#define TAB 9
|
||||
#define CR 13
|
||||
#define LF 10
|
||||
#define RESPONSE_TIMEOUT 30
|
||||
#define SOCKET_BUFFER_SIZE 5000
|
||||
|
||||
enum hostType { HOSTNAME, IPv4address };
|
||||
enum pathType { ABS_PATH, REL_PATH, OPAQUE_PART };
|
||||
enum uriType { ABSOLUTE, RELATIVE };
|
||||
|
||||
//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;
|
||||
|
||||
//Buffer used in parsing
|
||||
//http messages, urls, etc.
|
||||
//generally this simply
|
||||
//holds a pointer into a larger array
|
||||
typedef struct TOKEN {
|
||||
char * buff;
|
||||
size_t size;
|
||||
} token;
|
||||
|
||||
|
||||
//Represents a host port:
|
||||
//e.g. :"127.127.0.1:80"
|
||||
//text is a token pointing to
|
||||
//the full string representation
|
||||
typedef struct HOSTPORT {
|
||||
token text; //full host port
|
||||
struct sockaddr_in IPv4address; //Network Byte Order
|
||||
} hostport_type;
|
||||
|
||||
//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;
|
||||
|
||||
//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;
|
||||
char * URLs; //all the urls, delimited by <>
|
||||
uri_type *parsedURLs;
|
||||
} URL_list;
|
||||
|
||||
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;
|
||||
|
||||
|
||||
EXTERN_C int transferHTTP( char * request, char * toSend,
|
||||
int toSendSize, char **out, char * Url);
|
||||
|
||||
|
||||
EXTERN_C int transferHTTPRaw( char * toSend, int toSendSize,
|
||||
char **out, char *URL);
|
||||
|
||||
//helper function
|
||||
EXTERN_C int transferHTTPparsedURL( char * request,
|
||||
char * toSend, int toSendSize,
|
||||
char **out, uri_type *URL);
|
||||
|
||||
//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"
|
||||
EXTERN_C void currentTmToHttpDate(char *out);
|
||||
|
||||
//returns dynamic memory or NULL on error
|
||||
EXTERN_C char * resolve_rel_url( char * base_url, char * rel_url);
|
||||
|
||||
EXTERN_C int parse_uri( char * in, int max, uri_type * out);
|
||||
|
||||
EXTERN_C int token_cmp( token *in1, token *in2);
|
||||
|
||||
EXTERN_C int token_string_casecmp( token * in1, char * in2);
|
||||
|
||||
EXTERN_C int token_string_cmp( token * in1, char * in2);
|
||||
|
||||
EXTERN_C int parse_http_response( char * in, http_message * out,
|
||||
int max_len);
|
||||
|
||||
EXTERN_C int parse_http_request( char * in, http_message *out,
|
||||
int max_len);
|
||||
|
||||
EXTERN_C int search_for_header( http_message * in,
|
||||
char * header, token *out_value);
|
||||
|
||||
|
||||
|
||||
EXTERN_C int parse_hostport( char* in, int max, hostport_type *out );
|
||||
|
||||
EXTERN_C size_t write_bytes(int fd, char * bytes, size_t n,
|
||||
int timeout);
|
||||
EXTERN_C void free_http_message(http_message * message);
|
||||
EXTERN_C int copy_URL_list( URL_list *in, URL_list *out);
|
||||
EXTERN_C void free_URL_list(URL_list * list);
|
||||
EXTERN_C int parse_port(int max, char * port, unsigned short int * out);
|
||||
|
||||
EXTERN_C int parse_http_line( char * in, int max_size);
|
||||
EXTERN_C int parse_not_LWS( char *in, token *out, int max_size);
|
||||
EXTERN_C int parse_LWS( char * in, int max_size);
|
||||
EXTERN_C int parse_token( char * in, token * out, int max_size);
|
||||
EXTERN_C ssize_t readLine(int fd, char *out, int max, int *timeout);
|
||||
EXTERN_C int remove_dots(char * in, int size);
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
EXTERN_C void print_http_request(
|
||||
http_message *message,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static inline void print_http_request(
|
||||
http_message *message,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
EXTERN_C void print_http_response(
|
||||
http_message *message,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static inline void print_http_response(
|
||||
http_message *message,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
EXTERN_C void print_token(
|
||||
token *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static inline void print_token(
|
||||
token *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
EXTERN_C void print_status_line(
|
||||
http_status *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static inline void print_status_line(
|
||||
http_status *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
EXTERN_C void print_request_line(
|
||||
http_request *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static inline void print_request_line(
|
||||
http_request *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
EXTERN_C void print_uri(
|
||||
uri_type *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo);
|
||||
#else
|
||||
static inline void print_uri(
|
||||
uri_type *in,
|
||||
Upnp_LogLevel DLevel,
|
||||
Dbg_Module Module,
|
||||
char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,49 +1,42 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "util.h"
|
||||
#include "membuffer.h"
|
||||
#include "uri.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
#include "LinkedList.h"
|
||||
|
||||
////// private types ////////////
|
||||
|
||||
@@ -201,7 +194,6 @@ typedef struct // http_message_t
|
||||
// private fields
|
||||
membuffer msg; // entire raw message
|
||||
char *urlbuf; // storage for url string
|
||||
size_t entity_offset;
|
||||
} http_message_t;
|
||||
|
||||
typedef struct // http_parser_t
|
||||
@@ -485,22 +477,27 @@ int raw_find_str( IN memptr* raw_value, IN const char* str );
|
||||
************************************************************************/
|
||||
const char* method_to_str( IN http_method_t method );
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Print the HTTP headers.
|
||||
*/
|
||||
/************************************************************************
|
||||
* Function: print_http_headers
|
||||
*
|
||||
* Parameters:
|
||||
* http_message_t* hmsg ; HTTP Message object
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
#ifdef DEBUG
|
||||
void print_http_headers(
|
||||
/*! [in] HTTP Message object. */
|
||||
http_message_t *hmsg );
|
||||
void print_http_headers( IN http_message_t *hmsg );
|
||||
#else
|
||||
static UPNP_INLINE void print_http_headers(http_message_t *hmsg) {}
|
||||
static UPNP_INLINE void print_http_headers( IN http_message_t *hmsg ) {}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* __cplusplus */
|
||||
} // extern "C"
|
||||
#endif // __cplusplus
|
||||
|
||||
|
||||
#endif /* GENLIB_NET_HTTP_HTTPPARSER_H */
|
||||
#endif // GENLIB_NET_HTTP_HTTPPARSER_H
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#define GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
|
||||
#include "config.h"
|
||||
#include "upnputil.h"
|
||||
#include "util.h"
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
@@ -81,7 +81,7 @@ int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
|
||||
* UPNP_E_INVALID_URL
|
||||
* UPNP_E_SUCCESS
|
||||
************************************************************************/
|
||||
int http_FixStrUrl( IN const char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url );
|
||||
int http_FixStrUrl( IN char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
|
||||
@@ -1,103 +1,103 @@
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#ifndef INET_PTON
|
||||
#define INET_PTON
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#ifdef IPV6_
|
||||
#define INET_IPV6
|
||||
#endif
|
||||
|
||||
#include "unixutil.h"
|
||||
|
||||
#include <winsock2.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
typedef int socklen_t;
|
||||
#define EAFNOSUPPORT 97
|
||||
|
||||
|
||||
/*!
|
||||
* \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
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
/* const char *
|
||||
* inet_ntop4(src, dst, size)
|
||||
* format an IPv4 address
|
||||
* return:
|
||||
* `dst' (as a const)
|
||||
* notes:
|
||||
* (1) uses no statics
|
||||
* (2) takes a u_char* not an in_addr as input
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
extern const char *inet_ntop4(const u_char src, char *dst, socklen_t size);
|
||||
extern const char * inet_ntop4(const u_char src, char *dst, socklen_t size);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief convert IPv6 binary address into presentation (printable) format
|
||||
/* const char *
|
||||
* inet_ntop6(src, dst, size)
|
||||
* convert IPv6 binary address into presentation (printable) format
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
|
||||
#ifdef INET_IPV6
|
||||
extern const char *inet_ntop6(const u_char *src, char *dst, socklen_t size);
|
||||
|
||||
extern const char * inet_ntop6(src, dst, 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.
|
||||
/* int
|
||||
* inet_pton4(src, dst)
|
||||
* like inet_aton() but without all the hexadecimal and shorthand.
|
||||
* return:
|
||||
* 1 if `src' is a valid dotted quad, else 0.
|
||||
* notice:
|
||||
* does not touch `dst' unless it's returning 1.
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
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.
|
||||
/* int
|
||||
* inet_pton6(src, dst)
|
||||
* convert presentation level address to network order binary form.
|
||||
* return:
|
||||
* 1 if `src' is a valid [RFC1884 2.2] address, else 0.
|
||||
* notice:
|
||||
* (1) does not touch `dst' unless it's returning 1.
|
||||
* (2) :: in a full address is silently ignored.
|
||||
* credit:
|
||||
* inspired by Mark Andrews.
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
|
||||
#ifdef INET_IPV6
|
||||
extern int inet_pton6(const char *src, u_char *dst);
|
||||
|
||||
extern int inet_pton6(src, dst);
|
||||
|
||||
#endif /* INET_IPV6 */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief convert a network format address to presentation format.
|
||||
*
|
||||
* \return
|
||||
|
||||
/* char *
|
||||
* inet_ntop(af, src, dst, size)
|
||||
* convert a network format address to presentation format.
|
||||
* return:
|
||||
* pointer to presentation format address (`dst'), or NULL (see errno).
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
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)
|
||||
/* int
|
||||
* inet_pton(af, src, dst)
|
||||
* 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)
|
||||
* return:
|
||||
* 1 if the address was valid for the specified address family
|
||||
* 0 if the address wasn't valid (`dst' is untouched in this case)
|
||||
* -1 if some other error occurred (`dst' is untouched in this case, too)
|
||||
* author:
|
||||
* Paul Vixie, 1996.
|
||||
*/
|
||||
extern int inet_pton(int af,const char *src,void *dst);
|
||||
|
||||
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
||||
#endif /* INET_PTON */
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "upnputil.h"
|
||||
#include "util.h"
|
||||
|
||||
#define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) )
|
||||
#define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) )
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/**************************************************************************
|
||||
/************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
@@ -6,12 +6,12 @@
|
||||
* 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,
|
||||
* * 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,
|
||||
* * 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
|
||||
* 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.
|
||||
*
|
||||
@@ -27,17 +27,12 @@
|
||||
* 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
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
@@ -46,107 +41,103 @@ extern SOCKET gMiniServerStopSock;
|
||||
|
||||
|
||||
typedef struct MServerSockArray {
|
||||
/*! IPv4 socket for listening for miniserver requests. */
|
||||
SOCKET miniServerSock4;
|
||||
/*! IPv6 Socket for listening for miniserver requests. */
|
||||
SOCKET miniServerSock6;
|
||||
/*! Socket for stopping miniserver */
|
||||
SOCKET miniServerStopSock;
|
||||
/*! IPv4 SSDP Socket for incoming advertisments and search requests. */
|
||||
SOCKET ssdpSock4;
|
||||
/*! IPv6 SSDP Socket for incoming advertisments and search requests. */
|
||||
SOCKET ssdpSock6;
|
||||
/*! IPv6 SSDP Socket for incoming advertisments and search requests. */
|
||||
SOCKET ssdpSock6UlaGua;
|
||||
/* ! . */
|
||||
SOCKET stopPort;
|
||||
/* ! . */
|
||||
SOCKET miniServerPort4;
|
||||
/* ! . */
|
||||
SOCKET miniServerPort6;
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
/*! IPv4 SSDP socket for sending search requests and receiving search
|
||||
* replies */
|
||||
SOCKET ssdpReqSock4;
|
||||
/*! IPv6 SSDP socket for sending search requests and receiving search
|
||||
* replies */
|
||||
SOCKET ssdpReqSock6;
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
/* socket for listening for miniserver requests */
|
||||
int miniServerSock;
|
||||
/* socket for stopping miniserver */
|
||||
int miniServerStopSock;
|
||||
/* socket for incoming advertisments and search requests */
|
||||
int ssdpSock;
|
||||
|
||||
int stopPort;
|
||||
int miniServerPort;
|
||||
|
||||
/* socket for sending search requests and receiving search replies */
|
||||
CLIENTONLY(int ssdpReqSock;)
|
||||
} MiniServerSockArray;
|
||||
|
||||
|
||||
/*! . */
|
||||
typedef void (*MiniServerCallback)(
|
||||
/* ! . */
|
||||
IN http_parser_t *parser,
|
||||
/* ! . */
|
||||
IN http_message_t* request,
|
||||
/* ! . */
|
||||
IN SOCKINFO *info);
|
||||
IN SOCKINFO *info );
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/************************************************************************
|
||||
* Function: SetHTTPGetCallback
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerCallback callback; - HTTP Callback to be invoked
|
||||
*
|
||||
* Description: Set HTTP Get Callback
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void SetHTTPGetCallback( MiniServerCallback callback );
|
||||
|
||||
/*!
|
||||
* \brief Set HTTP Get Callback.
|
||||
*/
|
||||
void SetHTTPGetCallback(
|
||||
/*! [in] HTTP Callback to be invoked . */
|
||||
MiniServerCallback callback);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set SOAP Callback.
|
||||
*/
|
||||
/************************************************************************
|
||||
* Function: SetSoapCallback
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerCallback callback; - SOAP Callback to be invoked
|
||||
*
|
||||
* Description: Set SOAP Callback
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
void SetSoapCallback(
|
||||
/*! [in] SOAP Callback to be invoked . */
|
||||
MiniServerCallback callback);
|
||||
void SetSoapCallback( MiniServerCallback callback );
|
||||
#else /* INCLUDE_DEVICE_APIS */
|
||||
static inline void SetSoapCallback(MiniServerCallback callback) {}
|
||||
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.
|
||||
/************************************************************************
|
||||
* Function: SetGenaCallback
|
||||
*
|
||||
* Initialize a thread pool job to run the MiniServer and the job to the
|
||||
* thread pool.
|
||||
* Parameters:
|
||||
* MiniServerCallback callback; - GENA Callback to be invoked
|
||||
*
|
||||
* If listen port is 0, port is dynamically picked.
|
||||
* D6escription: Set GENA Callback
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void SetGenaCallback( MiniServerCallback callback );
|
||||
|
||||
/************************************************************************
|
||||
* Function: StartMiniServer
|
||||
*
|
||||
* Parameters:
|
||||
* unsigned short listen_port ; Port on which the server listens for
|
||||
* incoming connections
|
||||
*
|
||||
* Description: 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);
|
||||
* Return: int;
|
||||
* Actual port socket is bound to - On Success:
|
||||
* A negative number UPNP_E_XXX - On Error
|
||||
************************************************************************/
|
||||
int StartMiniServer( unsigned short listen_port );
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Stop and Shutdown the MiniServer and free socket resources.
|
||||
/************************************************************************
|
||||
* Function: StopMiniServer
|
||||
*
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
* Parameters:
|
||||
* void;
|
||||
*
|
||||
* Description: Stop and Shutdown the MiniServer and free socket resources.
|
||||
*
|
||||
* Return : int;
|
||||
* Always returns 0
|
||||
************************************************************************/
|
||||
int StopMiniServer();
|
||||
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#ifndef GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
#define GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
|
||||
#include "upnputil.h"
|
||||
#include "util.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user