Compare commits
31 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
593b8d0a2b | ||
![]() |
890c1b6ef8 | ||
![]() |
c127a3a87e | ||
![]() |
bd5758186c | ||
![]() |
cc472bc2cd | ||
![]() |
6128296e5f | ||
![]() |
d84c6a7e9f | ||
![]() |
113ebd1f91 | ||
![]() |
bf1450bf81 | ||
![]() |
56b9c75056 | ||
![]() |
2bdc9e075e | ||
![]() |
923eee2393 | ||
![]() |
f74746ff3f | ||
![]() |
8401a59ed5 | ||
![]() |
5b40cfa272 | ||
![]() |
fcda28ba75 | ||
![]() |
7cd434225f | ||
![]() |
78e5ba89fa | ||
![]() |
ebb8f209b0 | ||
![]() |
73afd667e1 | ||
![]() |
cc294a6cf1 | ||
![]() |
458a9416c6 | ||
![]() |
b9eeb89250 | ||
![]() |
a6e68b481d | ||
![]() |
a19a896e88 | ||
![]() |
cdee5b7cde | ||
![]() |
dec78c8ef1 | ||
![]() |
fb62a5d42a | ||
![]() |
a9b5081a08 | ||
![]() |
3886a697b5 | ||
![]() |
3dab2bd00a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -101,4 +101,5 @@ upnp/inc/upnpconfig.h
|
|||||||
upnp/sample/upnp_tv_combo
|
upnp/sample/upnp_tv_combo
|
||||||
upnp/sample/upnp_tv_ctrlpt
|
upnp/sample/upnp_tv_ctrlpt
|
||||||
upnp/sample/upnp_tv_device
|
upnp/sample/upnp_tv_device
|
||||||
|
docs/doxygen
|
||||||
|
|
||||||
|
44
ChangeLog
44
ChangeLog
@@ -1,3 +1,47 @@
|
|||||||
|
*******************************************************************************
|
||||||
|
Version 1.6.8
|
||||||
|
*******************************************************************************
|
||||||
|
|
||||||
|
2010-10-20 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
|
||||||
|
Fix a long date memory leak in webserver.c:StrStr().
|
||||||
|
|
||||||
|
2010-10-19 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
|
||||||
|
Bug fix in select of miniserver.c
|
||||||
|
|
||||||
|
Fix a bug in miniserver.c, in which maxMiniSock was wrongly declared as
|
||||||
|
unsigned int and as a result it was beeng set to ((unsigned int)(-1)).
|
||||||
|
As a result, after beeing incremented, it became zero, and this value
|
||||||
|
was beeing used in the select() call.
|
||||||
|
|
||||||
|
Thanks to Fabrice Fontaine for helping and testing with this issue.
|
||||||
|
|
||||||
|
2010-10-15 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||||
|
|
||||||
|
Fix for 100% CPU issue in select() in miniserv.c. I have also removed
|
||||||
|
the sleep() call, it was just a workaround.
|
||||||
|
|
||||||
|
SF Bug Tracker [ 3086852 ] 99% CPU loop in miniserver.c on a non ipv6
|
||||||
|
system.
|
||||||
|
|
||||||
|
Submitted by: Jin ( jin_eld ) - 2010-10-13 19:29:13 UTC
|
||||||
|
|
||||||
|
I cross compiled libupnp 1.6.7 for ARM9 using the --disable-ipv6
|
||||||
|
option, my system is an ipv4 only setup.
|
||||||
|
|
||||||
|
I do not know why this problem only appears when running the app in the
|
||||||
|
background (for instance using nohup &), but then it starts using 99%
|
||||||
|
CPU.
|
||||||
|
|
||||||
|
I traced the problem down to the select() call in miniserver.c in the
|
||||||
|
RunMiniServer() function. Select returns code 1, but errno is set to
|
||||||
|
"Socket operation on non-socket", I also see this when running my app
|
||||||
|
under strace.
|
||||||
|
|
||||||
|
I set all ...Sock6 variables to INVALID_SOCKET to make sure that they
|
||||||
|
do not get added to the FD_SET and the problem is gone.
|
||||||
|
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
Version 1.6.7
|
Version 1.6.7
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
|
2
Doxyfile
2
Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = libUPnP
|
|||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
# if some version control system is used.
|
# if some version control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 1.6.7
|
PROJECT_NUMBER = 1.6.8
|
||||||
|
|
||||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||||
# base path where the generated documentation will be put.
|
# base path where the generated documentation will be put.
|
||||||
|
@@ -26,7 +26,6 @@ EXTRA_DIST = \
|
|||||||
build/libupnp.dsp \
|
build/libupnp.dsp \
|
||||||
build/libupnp.dsw \
|
build/libupnp.dsw \
|
||||||
build/inc/autoconfig.h \
|
build/inc/autoconfig.h \
|
||||||
build/inc/config.h \
|
|
||||||
build/inc/upnpconfig.h \
|
build/inc/upnpconfig.h \
|
||||||
build/msvc/inttypes.h \
|
build/msvc/inttypes.h \
|
||||||
build/msvc/stdint.h \
|
build/msvc/stdint.h \
|
||||||
|
1
THANKS
1
THANKS
@@ -19,6 +19,7 @@ exempt of errors.
|
|||||||
- Chris Pickel
|
- Chris Pickel
|
||||||
- Chuck Thomason (cyt4)
|
- Chuck Thomason (cyt4)
|
||||||
- Craig Nelson
|
- Craig Nelson
|
||||||
|
- David Blanchet
|
||||||
- David Maass
|
- David Maass
|
||||||
- Emil Ljungdahl
|
- Emil Ljungdahl
|
||||||
- Erik Johansson
|
- Erik Johansson
|
||||||
|
23
TODO
23
TODO
@@ -2,28 +2,5 @@
|
|||||||
To Be Done
|
To Be Done
|
||||||
==========
|
==========
|
||||||
|
|
||||||
- add FreeBSD patches
|
|
||||||
( http://sf.net/tracker/index.php?func=detail&aid=1332618&group_id=7189&atid=307189 ?)
|
|
||||||
|
|
||||||
- non-regression testing
|
- 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,9 +67,6 @@
|
|||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||||
#define HAVE_SYS_STAT_H 1
|
#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 to 1 if you have the <sys/time.h> header file. */
|
||||||
#define HAVE_SYS_TIME_H 1
|
#define HAVE_SYS_TIME_H 1
|
||||||
|
|
||||||
@@ -82,6 +79,13 @@
|
|||||||
/* Define to 1 if you have the `vprintf' function. */
|
/* Define to 1 if you have the `vprintf' function. */
|
||||||
#define HAVE_VPRINTF 1
|
#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 to 1 to prevent compilation of assert() */
|
||||||
#define NDEBUG 1
|
#define NDEBUG 1
|
||||||
|
|
||||||
@@ -101,13 +105,13 @@
|
|||||||
#define PACKAGE_NAME "libupnp"
|
#define PACKAGE_NAME "libupnp"
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
/* Define to the full name and version of this package. */
|
||||||
#define PACKAGE_STRING "libupnp 1.4.7"
|
#define PACKAGE_STRING "libupnp 1.6.8"
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
/* Define to the one symbol short name of this package. */
|
||||||
#define PACKAGE_TARNAME "libupnp"
|
#define PACKAGE_TARNAME "libupnp"
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
/* Define to the version of this package. */
|
||||||
#define PACKAGE_VERSION "1.4.7"
|
#define PACKAGE_VERSION "1.6.8"
|
||||||
|
|
||||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
/* Define to necessary symbol if this constant uses a non-standard name on
|
||||||
your system. */
|
your system. */
|
||||||
@@ -116,6 +120,12 @@
|
|||||||
/* Define to 1 if you have the ANSI C header files. */
|
/* Define to 1 if you have the ANSI C header files. */
|
||||||
#define STDC_HEADERS 1
|
#define STDC_HEADERS 1
|
||||||
|
|
||||||
|
/* see upnpconfig.h */
|
||||||
|
/* #undef UPNP_ENABLE_IPV6 */
|
||||||
|
|
||||||
|
/* see upnpconfig.h */
|
||||||
|
#define UPNP_ENABLE_NOTIFICATION_REORDERING 1
|
||||||
|
|
||||||
/* see upnpconfig.h */
|
/* see upnpconfig.h */
|
||||||
#define UPNP_HAVE_CLIENT 1
|
#define UPNP_HAVE_CLIENT 1
|
||||||
|
|
||||||
@@ -131,20 +141,23 @@
|
|||||||
/* see upnpconfig.h */
|
/* see upnpconfig.h */
|
||||||
#define UPNP_HAVE_WEBSERVER 1
|
#define UPNP_HAVE_WEBSERVER 1
|
||||||
|
|
||||||
|
/* Do not use pthread_rwlock_t */
|
||||||
|
#define UPNP_USE_RWLOCK 1
|
||||||
|
|
||||||
/* see upnpconfig.h */
|
/* see upnpconfig.h */
|
||||||
#define UPNP_VERSION_MAJOR 1
|
#define UPNP_VERSION_MAJOR 1
|
||||||
|
|
||||||
/* see upnpconfig.h */
|
/* see upnpconfig.h */
|
||||||
#define UPNP_VERSION_MINOR 4
|
#define UPNP_VERSION_MINOR 6
|
||||||
|
|
||||||
/* see upnpconfig.h */
|
/* see upnpconfig.h */
|
||||||
#define UPNP_VERSION_PATCH 7
|
#define UPNP_VERSION_PATCH 8
|
||||||
|
|
||||||
/* see upnpconfig.h */
|
/* see upnpconfig.h */
|
||||||
#define UPNP_VERSION_STRING "1.4.7"
|
#define UPNP_VERSION_STRING "1.6.8"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "1.4.7"
|
#define VERSION "1.6.8"
|
||||||
|
|
||||||
/* File Offset size */
|
/* File Offset size */
|
||||||
#define _FILE_OFFSET_BITS 64
|
#define _FILE_OFFSET_BITS 64
|
||||||
@@ -153,7 +166,7 @@
|
|||||||
/* #undef _LARGEFILE_SOURCE */
|
/* #undef _LARGEFILE_SOURCE */
|
||||||
|
|
||||||
/* Large files support */
|
/* Large files support */
|
||||||
#define _LARGE_FILE_SOURCE
|
#define _LARGE_FILE_SOURCE /**/
|
||||||
|
|
||||||
/* Define to empty if `const' does not conform to ANSI C. */
|
/* Define to empty if `const' does not conform to ANSI C. */
|
||||||
/* #undef const */
|
/* #undef const */
|
||||||
@@ -164,5 +177,5 @@
|
|||||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||||
/* #undef size_t */
|
/* #undef size_t */
|
||||||
|
|
||||||
/* Substitute for socklen_t */
|
/* Type for storing the length of struct sockaddr */
|
||||||
/* #undef socklen_t */
|
/* #undef socklen_t */
|
||||||
|
@@ -1,434 +0,0 @@
|
|||||||
/**************************************************************************
|
|
||||||
*
|
|
||||||
* 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 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
|
|
||||||
*
|
|
||||||
* 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 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
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* INTERNAL_CONFIG_H */
|
|
||||||
|
|
@@ -1,35 +1,35 @@
|
|||||||
/* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in by configure. */
|
/* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in by configure. */
|
||||||
// -*- C -*-
|
/* -*- C -*- */
|
||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2006 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
* Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
******************************************************************************/
|
||||||
|
|
||||||
#ifndef UPNP_CONFIG_H
|
#ifndef UPNP_CONFIG_H
|
||||||
#define UPNP_CONFIG_H
|
#define UPNP_CONFIG_H
|
||||||
@@ -40,20 +40,20 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
/** The library version (string) e.g. "1.3.0" */
|
/** The library version (string) e.g. "1.3.0" */
|
||||||
#define UPNP_VERSION_STRING "1.4.7"
|
#define UPNP_VERSION_STRING "1.6.8"
|
||||||
|
|
||||||
/** Major version of the library */
|
/** Major version of the library */
|
||||||
#define UPNP_VERSION_MAJOR 1
|
#define UPNP_VERSION_MAJOR 1
|
||||||
|
|
||||||
/** Minor version of the library */
|
/** Minor version of the library */
|
||||||
#define UPNP_VERSION_MINOR 4
|
#define UPNP_VERSION_MINOR 6
|
||||||
|
|
||||||
/** Patch version of the library */
|
/** Patch version of the library */
|
||||||
#define UPNP_VERSION_PATCH 7
|
#define UPNP_VERSION_PATCH 8
|
||||||
|
|
||||||
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
|
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
|
||||||
#define UPNP_VERSION \
|
#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,7 +91,9 @@
|
|||||||
* (i.e. configure --enable-tools) : <upnp/upnptools.h> file is available */
|
* (i.e. configure --enable-tools) : <upnp/upnptools.h> file is available */
|
||||||
#define UPNP_HAVE_TOOLS 1
|
#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
|
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||||
|
|
||||||
CFG=libupnp - Win32 Debug
|
CFG=libupnp - Win32 Debug
|
||||||
!MESSAGE Dies ist kein g<EFBFBD>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
||||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<EFBFBD>hren Sie den Befehl
|
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "libupnp.mak".
|
!MESSAGE NMAKE /f "libupnp.mak".
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE Sie k<EFBFBD>nnen beim Ausf<EFBFBD>hren von NMAKE eine Konfiguration angeben
|
!MESSAGE Sie können beim Ausf?hren von NMAKE eine Konfiguration angeben
|
||||||
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
|
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE F<EFBFBD>r die Konfiguration stehen zur Auswahl:
|
!MESSAGE Für die Konfiguration stehen zur Auswahl:
|
||||||
!MESSAGE
|
!MESSAGE
|
||||||
!MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
!MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
||||||
!MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
!MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library")
|
||||||
@@ -389,10 +389,6 @@ SOURCE=..\upnp\src\inc\upnpapi.h
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\upnp\src\inc\upnpclosesocket.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\upnp\src\inc\uri.h
|
SOURCE=..\upnp\src\inc\uri.h
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
@@ -603,10 +603,6 @@
|
|||||||
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
||||||
>
|
>
|
||||||
|
@@ -599,10 +599,6 @@
|
|||||||
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
||||||
>
|
>
|
||||||
|
44
configure.ac
44
configure.ac
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
AC_PREREQ(2.60)
|
AC_PREREQ(2.60)
|
||||||
|
|
||||||
AC_INIT([libupnp], [1.6.7], [mroberto@users.sourceforge.net])
|
AC_INIT([libupnp], [1.6.8], [mroberto@users.sourceforge.net])
|
||||||
dnl ############################################################################
|
dnl ############################################################################
|
||||||
dnl # *Independently* of the above libupnp package version, the libtool version
|
dnl # *Independently* of the above libupnp package version, the libtool version
|
||||||
dnl # of the 3 libraries need to be updated whenever there is a change released:
|
dnl # of the 3 libraries need to be updated whenever there is a change released:
|
||||||
@@ -147,22 +147,42 @@ dnl ############################################################################
|
|||||||
dnl # Release 1.6.7:
|
dnl # Release 1.6.7:
|
||||||
dnl # "current:revision:age"
|
dnl # "current:revision:age"
|
||||||
dnl #
|
dnl #
|
||||||
dnl # - Code has changed in upnp
|
|
||||||
dnl # revision: 5 -> 6
|
|
||||||
dnl # - Code has changed in threadutil
|
dnl # - Code has changed in threadutil
|
||||||
dnl # revision: 3 -> 4
|
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 # - Interfaces have been changed, added and removed in upnp
|
||||||
dnl # current: 4 -> 5
|
dnl # current: 3 -> 4
|
||||||
dnl # revision: 4 -> 0
|
dnl # revision: 6 -> 0
|
||||||
|
dnl # - Interfaces removed in upnp:
|
||||||
|
dnl # age: -> 0
|
||||||
dnl #
|
dnl #
|
||||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:0:2])
|
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:0:2])
|
||||||
dnl #AC_SUBST([LT_VERSION_UPNP], [3:5:0])
|
dnl #AC_SUBST([LT_VERSION_UPNP], [3:5:0])
|
||||||
dnl #
|
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 ############################################################################
|
||||||
AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
dnl # Release 1.6.8:
|
||||||
AC_SUBST([LT_VERSION_THREADUTIL], [5:0:2])
|
dnl # "current:revision:age"
|
||||||
AC_SUBST([LT_VERSION_UPNP], [3:5:0])
|
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 #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 ############################################################################
|
||||||
|
AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||||
|
AC_SUBST([LT_VERSION_THREADUTIL], [5:1:2])
|
||||||
|
AC_SUBST([LT_VERSION_UPNP], [4:1:0])
|
||||||
dnl ############################################################################
|
dnl ############################################################################
|
||||||
dnl # Repeating the algorithm to place it closer to the modificatin place:
|
dnl # Repeating the algorithm to place it closer to the modificatin place:
|
||||||
dnl # - library code modified: revision++
|
dnl # - library code modified: revision++
|
||||||
@@ -492,3 +512,11 @@ AC_CONFIG_FILES([
|
|||||||
|
|
||||||
AC_OUTPUT
|
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"
|
# "Makefile.am" for "libupnp/ixml"
|
||||||
#
|
#
|
||||||
# (C) Copyright 2005 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
# (C) Copyright 2005 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||||
#
|
#
|
||||||
|
|
||||||
SUBDIRS = doc
|
SUBDIRS = doc
|
||||||
|
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "UpnpGlobal.h"
|
#include "UpnpGlobal.h"
|
||||||
|
#include "ixml.h"
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -20,6 +21,13 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void IxmlPrintf(
|
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. */
|
/*! [in] Printf like format specification. */
|
||||||
const char* FmtStr,
|
const char* FmtStr,
|
||||||
/*! [in] Printf like Variable number of arguments that will go in the debug
|
/*! [in] Printf like Variable number of arguments that will go in the debug
|
||||||
@@ -27,7 +35,7 @@ void IxmlPrintf(
|
|||||||
...)
|
...)
|
||||||
#if (__GNUC__ >= 3)
|
#if (__GNUC__ >= 3)
|
||||||
/* This enables printf like format checking by the compiler */
|
/* This enables printf like format checking by the compiler */
|
||||||
__attribute__((format (__printf__, 1, 2)))
|
__attribute__((format (__printf__, 4, 5)))
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
#else /* DEBUG */
|
#else /* DEBUG */
|
||||||
@@ -37,5 +45,23 @@ static UPNP_INLINE void IxmlPrintf(
|
|||||||
#endif /* DEBUG */
|
#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 */
|
#endif /* IXMLDEBUG_H */
|
||||||
|
|
||||||
|
@@ -444,17 +444,17 @@ int ixmlDocument_createElementNSEx(
|
|||||||
IXML_Element **rtElement)
|
IXML_Element **rtElement)
|
||||||
{
|
{
|
||||||
IXML_Element *newElement = NULL;
|
IXML_Element *newElement = NULL;
|
||||||
int errCode = IXML_SUCCESS;
|
int ret = IXML_SUCCESS;
|
||||||
int line = 0;
|
int line = 0;
|
||||||
|
|
||||||
if (doc == NULL || namespaceURI == NULL || qualifiedName == NULL) {
|
if (doc == NULL || namespaceURI == NULL || qualifiedName == NULL) {
|
||||||
line = __LINE__;
|
line = __LINE__;
|
||||||
errCode = IXML_INVALID_PARAMETER;
|
ret = IXML_INVALID_PARAMETER;
|
||||||
goto ErrorHandler;
|
goto ErrorHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
errCode = ixmlDocument_createElementEx(doc, qualifiedName, &newElement);
|
ret = ixmlDocument_createElementEx(doc, qualifiedName, &newElement);
|
||||||
if (errCode != IXML_SUCCESS) {
|
if (ret != IXML_SUCCESS) {
|
||||||
line = __LINE__;
|
line = __LINE__;
|
||||||
goto ErrorHandler;
|
goto ErrorHandler;
|
||||||
}
|
}
|
||||||
@@ -464,16 +464,16 @@ int ixmlDocument_createElementNSEx(
|
|||||||
line = __LINE__;
|
line = __LINE__;
|
||||||
ixmlElement_free(newElement);
|
ixmlElement_free(newElement);
|
||||||
newElement = NULL;
|
newElement = NULL;
|
||||||
errCode = IXML_INSUFFICIENT_MEMORY;
|
ret = IXML_INSUFFICIENT_MEMORY;
|
||||||
goto ErrorHandler;
|
goto ErrorHandler;
|
||||||
}
|
}
|
||||||
// set the localName and prefix
|
// set the localName and prefix
|
||||||
errCode = ixmlNode_setNodeName((IXML_Node *)newElement, qualifiedName);
|
ret = ixmlNode_setNodeName((IXML_Node *)newElement, qualifiedName);
|
||||||
if (errCode != IXML_SUCCESS) {
|
if (ret != IXML_SUCCESS) {
|
||||||
line = __LINE__;
|
line = __LINE__;
|
||||||
ixmlElement_free(newElement);
|
ixmlElement_free(newElement);
|
||||||
newElement = NULL;
|
newElement = NULL;
|
||||||
errCode = IXML_INSUFFICIENT_MEMORY;
|
ret = IXML_INSUFFICIENT_MEMORY;
|
||||||
goto ErrorHandler;
|
goto ErrorHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,12 +481,11 @@ int ixmlDocument_createElementNSEx(
|
|||||||
|
|
||||||
ErrorHandler:
|
ErrorHandler:
|
||||||
*rtElement = newElement;
|
*rtElement = newElement;
|
||||||
if (errCode != IXML_SUCCESS) {
|
if (ret != IXML_SUCCESS) {
|
||||||
IxmlPrintf("(%s::ixmlDocument_createElementNSEx): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "ixmlDocument_createElementNSEx", "Error %d\n", ret);
|
||||||
__FILE__, errCode, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return errCode;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -181,9 +181,9 @@ static void ixmlPrintDomTreeRecursive(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
IxmlPrintf("(%s::ixmlPrintDomTreeRecursive) line %d: "
|
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTreeRecursive",
|
||||||
"Warning, unknown node type %d\n",
|
"Warning, unknown node type %d\n",
|
||||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
ixmlNode_getNodeType(nodeptr));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,9 +253,9 @@ static void ixmlPrintDomTree(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
IxmlPrintf("(%s::ixmlPrintDomTree) line %d: "
|
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTree",
|
||||||
"Warning, unknown node type %d\n",
|
"Warning, unknown node type %d\n",
|
||||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
ixmlNode_getNodeType(nodeptr));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -324,9 +324,9 @@ static void ixmlDomTreetoString(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
IxmlPrintf("(%s::ixmlDomTreetoString) line %d: "
|
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTreeRecursive",
|
||||||
"Warning, unknown node type %d\n",
|
"Warning, unknown node type %d\n",
|
||||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
ixmlNode_getNodeType(nodeptr));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,15 +17,54 @@
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void IxmlPrintf(
|
void IxmlPrintf(
|
||||||
|
const char *DbgFileName,
|
||||||
|
int DbgLineNo,
|
||||||
|
const char *FunctionName,
|
||||||
const char *FmtStr,
|
const char *FmtStr,
|
||||||
...)
|
...)
|
||||||
{
|
{
|
||||||
va_list ArgList;
|
va_list ArgList;
|
||||||
|
|
||||||
va_start(ArgList, FmtStr);
|
FILE *fp = stdout;
|
||||||
vfprintf(stdout, FmtStr, ArgList);
|
fprintf(fp, "(%s::%s), line %d", DbgFileName, FunctionName, DbgLineNo);
|
||||||
fflush(stdout);
|
if (FmtStr) {
|
||||||
va_end(ArgList);
|
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
|
#endif
|
||||||
|
|
||||||
|
@@ -542,8 +542,7 @@ static int Parser_UTF8ToInt(
|
|||||||
*len = 0;
|
*len = 0;
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
IxmlPrintf("(%s::Parser_UTF8ToInt): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_UTF8ToInt", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1305,8 +1304,7 @@ fail_entity:
|
|||||||
|
|
||||||
ExitFunction:
|
ExitFunction:
|
||||||
if (ret == -1 || (g_error_char && ret == g_error_char)) {
|
if (ret == -1 || (g_error_char && ret == g_error_char)) {
|
||||||
IxmlPrintf("(%s::Parser_getChar): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_getChar", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1373,8 +1371,7 @@ static int Parser_copyToken(
|
|||||||
|
|
||||||
ExitFunction:
|
ExitFunction:
|
||||||
if (ret != IXML_SUCCESS) {
|
if (ret != IXML_SUCCESS) {
|
||||||
IxmlPrintf("(%s::Parser_copyToken): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_copyToken", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1921,8 +1918,7 @@ static int Parser_xmlNamespace(
|
|||||||
|
|
||||||
ExitFunction:
|
ExitFunction:
|
||||||
if (ret != IXML_SUCCESS && ret != IXML_FILE_DONE) {
|
if (ret != IXML_SUCCESS && ret != IXML_FILE_DONE) {
|
||||||
IxmlPrintf("(%s::Parser_xmlNamespace): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_xmlNamespace", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -2251,8 +2247,7 @@ static int Parser_processContent(
|
|||||||
|
|
||||||
ExitFunction:
|
ExitFunction:
|
||||||
if (ret != IXML_SUCCESS) {
|
if (ret != IXML_SUCCESS) {
|
||||||
IxmlPrintf("(%s::Parser_processContent): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_processContent", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -2324,8 +2319,7 @@ static int Parser_processETag(
|
|||||||
|
|
||||||
ExitFunction:
|
ExitFunction:
|
||||||
if (ret != IXML_SUCCESS) {
|
if (ret != IXML_SUCCESS) {
|
||||||
IxmlPrintf("(%s::Parser_processETag): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_processETag", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -2580,8 +2574,7 @@ static int Parser_processAttribute(
|
|||||||
|
|
||||||
ExitFunction:
|
ExitFunction:
|
||||||
if (ret != IXML_SUCCESS && ret != IXML_FILE_DONE) {
|
if (ret != IXML_SUCCESS && ret != IXML_FILE_DONE) {
|
||||||
IxmlPrintf("(%s::Parser_processAttribute): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_processAttribute", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -2684,8 +2677,7 @@ static int Parser_getNextNode(
|
|||||||
|
|
||||||
ExitFunction:
|
ExitFunction:
|
||||||
if (ret != IXML_SUCCESS && ret != IXML_FILE_DONE) {
|
if (ret != IXML_SUCCESS && ret != IXML_FILE_DONE) {
|
||||||
IxmlPrintf("(%s::Parser_getNextNode): Error %d, line %d\n",
|
IxmlPrintf(__FILE__, line, "Parser_getNextNode", "Error %d\n", ret);
|
||||||
__FILE__, ret, line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
Version: 1.6.7
|
Version: 1.6.8
|
||||||
Summary: Universal Plug and Play (UPnP) SDK
|
Summary: Universal Plug and Play (UPnP) SDK
|
||||||
Name: libupnp
|
Name: libupnp
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
|
@@ -29,14 +29,24 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef FREE_LIST_H
|
#ifndef FREE_LIST_H
|
||||||
#define FREE_LIST_H
|
#define FREE_LIST_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "ithread.h"
|
#include "ithread.h"
|
||||||
|
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@@ -29,21 +29,32 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef LINKED_LIST_H
|
#ifndef LINKED_LIST_H
|
||||||
#define LINKED_LIST_H
|
#define LINKED_LIST_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "FreeList.h"
|
#include "FreeList.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define EOUTOFMEM (-7 & 1<<29)
|
#define EOUTOFMEM (-7 & 1<<29)
|
||||||
|
|
||||||
|
|
||||||
#define FREELISTSIZE 100
|
#define FREELISTSIZE 100
|
||||||
#define LIST_SUCCESS 1
|
#define LIST_SUCCESS 1
|
||||||
#define LIST_FAIL 0
|
#define LIST_FAIL 0
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: free_routine
|
* Name: free_routine
|
||||||
*
|
*
|
||||||
@@ -52,6 +63,7 @@ extern "C" {
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
typedef void (*free_function)(void *arg);
|
typedef void (*free_function)(void *arg);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: cmp_routine
|
* Name: cmp_routine
|
||||||
*
|
*
|
||||||
@@ -61,6 +73,7 @@ typedef void (*free_function)(void *arg);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
typedef int (*cmp_routine)(void *itemA,void *itemB);
|
typedef int (*cmp_routine)(void *itemA,void *itemB);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: ListNode
|
* Name: ListNode
|
||||||
*
|
*
|
||||||
@@ -75,6 +88,7 @@ typedef struct LISTNODE
|
|||||||
void *item;
|
void *item;
|
||||||
} ListNode;
|
} ListNode;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: LinkedList
|
* Name: LinkedList
|
||||||
*
|
*
|
||||||
@@ -104,6 +118,7 @@ typedef struct LINKEDLIST
|
|||||||
cmp_routine cmp_func; /* compare function to use */
|
cmp_routine cmp_func; /* compare function to use */
|
||||||
} LinkedList;
|
} LinkedList;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListInit
|
* Function: ListInit
|
||||||
*
|
*
|
||||||
@@ -119,6 +134,7 @@ typedef struct LINKEDLIST
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func);
|
int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListAddHead
|
* Function: ListAddHead
|
||||||
*
|
*
|
||||||
@@ -135,6 +151,7 @@ int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
ListNode *ListAddHead(LinkedList *list, void *item);
|
ListNode *ListAddHead(LinkedList *list, void *item);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListAddTail
|
* Function: ListAddTail
|
||||||
*
|
*
|
||||||
@@ -151,6 +168,7 @@ ListNode *ListAddHead(LinkedList *list, void *item);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
ListNode *ListAddTail(LinkedList *list, void *item);
|
ListNode *ListAddTail(LinkedList *list, void *item);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListAddAfter
|
* Function: ListAddAfter
|
||||||
*
|
*
|
||||||
@@ -205,6 +223,7 @@ ListNode *ListAddBefore(LinkedList *list,void *item, ListNode *anode);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void *ListDelNode(LinkedList *list,ListNode *dnode, int freeItem);
|
void *ListDelNode(LinkedList *list,ListNode *dnode, int freeItem);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListDestroy
|
* Function: ListDestroy
|
||||||
*
|
*
|
||||||
@@ -240,6 +259,7 @@ int ListDestroy(LinkedList *list, int freeItem);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
ListNode* ListHead(LinkedList *list);
|
ListNode* ListHead(LinkedList *list);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListTail
|
* Function: ListTail
|
||||||
*
|
*
|
||||||
@@ -256,6 +276,7 @@ ListNode* ListHead(LinkedList *list);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
ListNode* ListTail(LinkedList *list);
|
ListNode* ListTail(LinkedList *list);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListNext
|
* Function: ListNext
|
||||||
*
|
*
|
||||||
@@ -272,6 +293,7 @@ ListNode* ListTail(LinkedList *list);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
ListNode* ListNext(LinkedList *list, ListNode * node);
|
ListNode* ListNext(LinkedList *list, ListNode * node);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListPrev
|
* Function: ListPrev
|
||||||
*
|
*
|
||||||
@@ -288,6 +310,7 @@ ListNode* ListNext(LinkedList *list, ListNode * node);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
ListNode* ListPrev(LinkedList *list, ListNode * node);
|
ListNode* ListPrev(LinkedList *list, ListNode * node);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListFind
|
* Function: ListFind
|
||||||
*
|
*
|
||||||
@@ -307,6 +330,7 @@ ListNode* ListPrev(LinkedList *list, ListNode * node);
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
ListNode* ListFind(LinkedList *list, ListNode *start, void * item);
|
ListNode* ListFind(LinkedList *list, ListNode *start, void * item);
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Function: ListSize
|
* Function: ListSize
|
||||||
*
|
*
|
||||||
|
@@ -29,160 +29,139 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef TIMERTHREAD_H
|
#ifndef TIMERTHREAD_H
|
||||||
#define TIMERTHREAD_H
|
#define TIMERTHREAD_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "FreeList.h"
|
||||||
#include "ithread.h"
|
#include "ithread.h"
|
||||||
#include "LinkedList.h"
|
#include "LinkedList.h"
|
||||||
#include "FreeList.h"
|
|
||||||
#include "ThreadPool.h"
|
#include "ThreadPool.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define INVALID_EVENT_ID (-10 & 1<<29)
|
#define INVALID_EVENT_ID (-10 & 1<<29)
|
||||||
|
|
||||||
|
|
||||||
/* Timeout Types */
|
/* Timeout Types */
|
||||||
/* absolute means in seconds from Jan 1, 1970 */
|
/* absolute means in seconds from Jan 1, 1970 */
|
||||||
/* relative means in seconds from current time */
|
/* relative means in seconds from current time */
|
||||||
typedef enum timeoutType {ABS_SEC,REL_SEC} TimeoutType;
|
typedef enum timeoutType {ABS_SEC,REL_SEC} TimeoutType;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/*!
|
||||||
* Name: TimerThread
|
* 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.
|
||||||
* Description:
|
*
|
||||||
* A timer thread similar to the one in the Upnp SDK that allows
|
* Because the timer thread uses the thread pool there is no
|
||||||
* the scheduling of a job to run at a specified time in the future
|
* gurantee of timing, only approximate timing.
|
||||||
* 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
|
typedef struct TIMERTHREAD
|
||||||
{
|
{
|
||||||
ithread_mutex_t mutex;
|
ithread_mutex_t mutex;
|
||||||
ithread_cond_t condition;
|
ithread_cond_t condition;
|
||||||
int lastEventId;
|
int lastEventId;
|
||||||
LinkedList eventQ;
|
LinkedList eventQ;
|
||||||
int shutdown;
|
int shutdown;
|
||||||
FreeList freeEvents;
|
FreeList freeEvents;
|
||||||
ThreadPool *tp;
|
ThreadPool *tp;
|
||||||
} TimerThread;
|
} TimerThread;
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/*!
|
||||||
* Name: TimerEvent
|
* Struct to contain information for a timer event.
|
||||||
*
|
*
|
||||||
* Description:
|
* Internal to the TimerThread.
|
||||||
*
|
*/
|
||||||
* Struct to contain information for a timer event.
|
|
||||||
* Internal to the TimerThread
|
|
||||||
*
|
|
||||||
*****************************************************************************/
|
|
||||||
typedef struct TIMEREVENT
|
typedef struct TIMEREVENT
|
||||||
{
|
{
|
||||||
ThreadPoolJob job;
|
ThreadPoolJob job;
|
||||||
time_t eventTime; /* absolute time for event in seconds since Jan 1, 1970 */
|
/*! [in] Absolute time for event in seconds since Jan 1, 1970. */
|
||||||
Duration persistent; /* long term or short term job */
|
time_t eventTime;
|
||||||
int id;
|
/*! [in] Long term or short term job. */
|
||||||
|
Duration persistent;
|
||||||
|
int id;
|
||||||
} TimerEvent;
|
} TimerEvent;
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Initializes and starts timer thread.
|
||||||
/************************************************************************
|
|
||||||
* Function: TimerThreadInit
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Initializes and starts timer thread.
|
|
||||||
*
|
*
|
||||||
* Parameters:
|
* \return 0 on success, nonzero on failure. Returns error from
|
||||||
* timer - valid timer thread pointer.
|
* ThreadPoolAddPersistent on failure.
|
||||||
* tp - valid thread pool to use. Must be
|
*/
|
||||||
* started. Must be valid for lifetime
|
int TimerThreadInit(
|
||||||
* of timer. Timer must be shutdown
|
/*! [in] Valid timer thread pointer. */
|
||||||
* BEFORE thread pool.
|
TimerThread *timer,
|
||||||
* Return:
|
/*! [in] Valid thread pool to use. Must be started. Must be valid for
|
||||||
* 0 on success, nonzero on failure
|
* lifetime of timer. Timer must be shutdown BEFORE thread pool. */
|
||||||
* Returns error from ThreadPoolAddPersistent on failure.
|
ThreadPool *tp);
|
||||||
*
|
|
||||||
************************************************************************/
|
|
||||||
int TimerThreadInit(TimerThread *timer,
|
|
||||||
ThreadPool *tp);
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function: TimerThreadSchedule
|
* \brief Schedules an event to run at a specified time.
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Schedules an event to run at a specified time.
|
|
||||||
*
|
*
|
||||||
* Parameters:
|
* \return 0 on success, nonzero on failure, EOUTOFMEM if not enough memory
|
||||||
* timer - valid timer thread pointer.
|
* to schedule job.
|
||||||
* time_t - time of event.
|
*/
|
||||||
* either in absolute seconds,
|
int TimerThreadSchedule(
|
||||||
* or relative seconds in the future.
|
/*! [in] Valid timer thread pointer. */
|
||||||
* timeoutType - either ABS_SEC, or REL_SEC.
|
TimerThread* timer,
|
||||||
* if REL_SEC, then the event
|
/*! [in] time of event. Either in absolute seconds, or relative
|
||||||
* will be scheduled at the
|
* seconds in the future. */
|
||||||
* current time + REL_SEC.
|
time_t time,
|
||||||
* job-> valid Thread pool job with following fields
|
/*! [in] either ABS_SEC, or REL_SEC. If REL_SEC, then the event
|
||||||
* func - function to schedule
|
* will be scheduled at the current time + REL_SEC. */
|
||||||
* arg - argument to function
|
TimeoutType type,
|
||||||
* priority - priority of job.
|
/*! [in] Valid Thread pool job with following fields. */
|
||||||
*
|
ThreadPoolJob *job,
|
||||||
* id - id of timer event. (out, can be null)
|
/*! [in] . */
|
||||||
* Return:
|
Duration duration,
|
||||||
* 0 on success, nonzero on failure
|
/*! [in] Id of timer event. (out, can be null). */
|
||||||
* EOUTOFMEM if not enough memory to schedule job.
|
int *id);
|
||||||
*
|
|
||||||
************************************************************************/
|
|
||||||
int TimerThreadSchedule(TimerThread* timer,
|
|
||||||
time_t time,
|
|
||||||
TimeoutType type,
|
|
||||||
ThreadPoolJob *job,
|
|
||||||
Duration duration,
|
|
||||||
int *id);
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* 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.
|
|
||||||
* ThreadPoolJob *out - space for thread pool job.
|
|
||||||
* Return:
|
|
||||||
* 0 on success,
|
|
||||||
* INVALID_EVENT_ID on failure
|
|
||||||
*
|
|
||||||
************************************************************************/
|
|
||||||
int TimerThreadRemove(TimerThread *timer,
|
|
||||||
int id,
|
|
||||||
ThreadPoolJob *out);
|
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function: TimerThreadShutdown
|
* \brief Removes an event from the timer Q.
|
||||||
*
|
*
|
||||||
* Description:
|
* Events can only be removed before they have been placed in the thread pool.
|
||||||
* Shutdown the timer thread
|
*
|
||||||
* Events scheduled in the future will NOT be run.
|
* \return 0 on success, INVALID_EVENT_ID on failure.
|
||||||
* Timer thread should be shutdown BEFORE it's associated
|
*/
|
||||||
* thread pool.
|
int TimerThreadRemove(
|
||||||
* Returns:
|
/*! [in] Valid timer thread pointer. */
|
||||||
* returns 0 if succesfull,
|
TimerThread *timer,
|
||||||
* nonzero otherwise.
|
/*! [in] Id of event to remove. */
|
||||||
* Always returns 0.
|
int id,
|
||||||
***********************************************************************/
|
/*! [in] Space for thread pool job. */
|
||||||
int TimerThreadShutdown(TimerThread *timer);
|
ThreadPoolJob *out);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Shutdown the timer thread.
|
||||||
|
*
|
||||||
|
* Events scheduled in the future will NOT be run.
|
||||||
|
*
|
||||||
|
* Timer thread should be shutdown BEFORE it's associated thread pool.
|
||||||
|
*
|
||||||
|
* \return 0 if succesfull, nonzero otherwise. Always returns 0.
|
||||||
|
*/
|
||||||
|
int TimerThreadShutdown(
|
||||||
|
/*! [in] Valid timer thread pointer. */
|
||||||
|
TimerThread *timer);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -1,45 +1,55 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/**************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#include "LinkedList.h"
|
#include "LinkedList.h"
|
||||||
#ifndef WIN32
|
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
/* Do not #include <sys/param.h> */
|
||||||
|
#else
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__)
|
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__)
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#else
|
#else
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
freeListNode( ListNode * node,
|
freeListNode( ListNode * node,
|
||||||
LinkedList * list )
|
LinkedList * list )
|
||||||
|
@@ -1,68 +1,69 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "TimerThread.h"
|
#include "TimerThread.h"
|
||||||
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Function: FreeTimerEvent
|
/*!
|
||||||
*
|
* \brief Deallocates a dynamically allocated TimerEvent.
|
||||||
* Description:
|
*/
|
||||||
* Deallocates a dynamically allocated TimerEvent.
|
static void FreeTimerEvent(
|
||||||
* Parameters:
|
/*! [in] Valid timer thread pointer. */
|
||||||
* TimerEvent *event - must be allocated with CreateTimerEvent
|
TimerThread *timer,
|
||||||
*****************************************************************************/
|
/*! [in] Must be allocated with CreateTimerEvent*/
|
||||||
static void
|
TimerEvent *event)
|
||||||
FreeTimerEvent( TimerThread * timer,
|
|
||||||
TimerEvent * event )
|
|
||||||
{
|
{
|
||||||
|
assert(timer != NULL);
|
||||||
|
|
||||||
assert( timer != NULL );
|
FreeListFree(&timer->freeEvents, event);
|
||||||
|
|
||||||
FreeListFree( &timer->freeEvents, event );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Function: TimerThreadWorker
|
/*!
|
||||||
|
* \brief Implements timer thread.
|
||||||
*
|
*
|
||||||
* Description:
|
* Waits for next event to occur and schedules associated job into threadpool.
|
||||||
* Implements timer thread.
|
*/
|
||||||
* Waits for next event to occur and schedules
|
static void *TimerThreadWorker(
|
||||||
* associated job into threadpool.
|
/*! [in] arg is cast to (TimerThread *). */
|
||||||
* Internal Only.
|
void *arg)
|
||||||
* Parameters:
|
|
||||||
* void * arg -> is cast to TimerThread *
|
|
||||||
*****************************************************************************/
|
|
||||||
static void *
|
|
||||||
TimerThreadWorker( void *arg )
|
|
||||||
{
|
{
|
||||||
TimerThread *timer = ( TimerThread * ) arg;
|
TimerThread *timer = ( TimerThread * ) arg;
|
||||||
ListNode *head = NULL;
|
ListNode *head = NULL;
|
||||||
@@ -81,19 +82,14 @@ TimerThreadWorker( void *arg )
|
|||||||
|
|
||||||
while( 1 )
|
while( 1 )
|
||||||
{
|
{
|
||||||
|
|
||||||
//mutex should always be locked at top of loop
|
//mutex should always be locked at top of loop
|
||||||
|
|
||||||
//Check for shutdown
|
//Check for shutdown
|
||||||
|
|
||||||
if( timer->shutdown )
|
if( timer->shutdown )
|
||||||
{
|
{
|
||||||
|
|
||||||
timer->shutdown = 0;
|
timer->shutdown = 0;
|
||||||
ithread_cond_signal( &timer->condition );
|
ithread_cond_signal( &timer->condition );
|
||||||
ithread_mutex_unlock( &timer->mutex );
|
ithread_mutex_unlock( &timer->mutex );
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nextEvent = NULL;
|
nextEvent = NULL;
|
||||||
@@ -102,7 +98,6 @@ TimerThreadWorker( void *arg )
|
|||||||
if( timer->eventQ.size > 0 )
|
if( timer->eventQ.size > 0 )
|
||||||
{
|
{
|
||||||
head = ListHead( &timer->eventQ );
|
head = ListHead( &timer->eventQ );
|
||||||
|
|
||||||
nextEvent = ( TimerEvent * ) head->item;
|
nextEvent = ( TimerEvent * ) head->item;
|
||||||
nextEventTime = nextEvent->eventTime;
|
nextEventTime = nextEvent->eventTime;
|
||||||
}
|
}
|
||||||
@@ -110,54 +105,42 @@ TimerThreadWorker( void *arg )
|
|||||||
currentTime = time( NULL );
|
currentTime = time( NULL );
|
||||||
|
|
||||||
//If time has elapsed, schedule job
|
//If time has elapsed, schedule job
|
||||||
|
|
||||||
if( ( nextEvent != NULL ) && ( currentTime >= nextEventTime ) )
|
if( ( nextEvent != NULL ) && ( currentTime >= nextEventTime ) )
|
||||||
{
|
{
|
||||||
|
|
||||||
if( nextEvent->persistent ) {
|
if( nextEvent->persistent ) {
|
||||||
|
|
||||||
ThreadPoolAddPersistent( timer->tp, &nextEvent->job,
|
ThreadPoolAddPersistent( timer->tp, &nextEvent->job,
|
||||||
&tempId );
|
&tempId );
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
ThreadPoolAdd( timer->tp, &nextEvent->job, &tempId );
|
ThreadPoolAdd( timer->tp, &nextEvent->job, &tempId );
|
||||||
}
|
}
|
||||||
|
|
||||||
ListDelNode( &timer->eventQ, head, 0 );
|
ListDelNode( &timer->eventQ, head, 0 );
|
||||||
FreeTimerEvent( timer, nextEvent );
|
FreeTimerEvent( timer, nextEvent );
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( nextEvent != NULL ) {
|
if( nextEvent != NULL ) {
|
||||||
timeToWait.tv_nsec = 0;
|
timeToWait.tv_nsec = 0;
|
||||||
timeToWait.tv_sec = nextEvent->eventTime;
|
timeToWait.tv_sec = nextEvent->eventTime;
|
||||||
|
|
||||||
ithread_cond_timedwait( &timer->condition, &timer->mutex,
|
ithread_cond_timedwait( &timer->condition, &timer->mutex,
|
||||||
&timeToWait );
|
&timeToWait );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ithread_cond_wait( &timer->condition, &timer->mutex );
|
ithread_cond_wait( &timer->condition, &timer->mutex );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Function: CalculateEventTime
|
/*!
|
||||||
|
* \brief Calculates the appropriate timeout in absolute seconds
|
||||||
|
* since Jan 1, 1970.
|
||||||
*
|
*
|
||||||
* Description:
|
* \return
|
||||||
* Calculates the appropriate timeout in absolute seconds since
|
*/
|
||||||
* Jan 1, 1970
|
static int CalculateEventTime(
|
||||||
* Internal Only.
|
/*! [in] Timeout. */
|
||||||
* Parameters:
|
time_t *timeout,
|
||||||
* time_t *timeout - timeout
|
/*! [in] Timeout type. */
|
||||||
*
|
TimeoutType type)
|
||||||
*****************************************************************************/
|
|
||||||
static int
|
|
||||||
CalculateEventTime( time_t * timeout,
|
|
||||||
TimeoutType type )
|
|
||||||
{
|
{
|
||||||
time_t now;
|
time_t now;
|
||||||
|
|
||||||
@@ -175,29 +158,22 @@ CalculateEventTime( time_t * timeout,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/*!
|
||||||
* Function: CreateTimerEvent
|
* \brief Creates a Timer Event. (Dynamically allocated).
|
||||||
*
|
*
|
||||||
* Description:
|
* \return (TimerEvent *) on success, NULL on failure.
|
||||||
* Creates a Timer Event. (Dynamically allocated)
|
*/
|
||||||
* Internal to timer thread.
|
static TimerEvent *CreateTimerEvent(
|
||||||
* Parameters:
|
/*! [in] Valid timer thread pointer. */
|
||||||
* func - thread function to run.
|
TimerThread *timer,
|
||||||
* arg - argument to function.
|
/*! [in] . */
|
||||||
* priority - priority of job.
|
ThreadPoolJob *job,
|
||||||
* eventTime - the absoule time of the event
|
/*! [in] . */
|
||||||
* in seconds from Jan, 1970
|
Duration persistent,
|
||||||
* id - id of job
|
/*! [in] The absoule time of the event in seconds from Jan, 1970. */
|
||||||
*
|
time_t eventTime,
|
||||||
* Returns:
|
/*! [in] Id of job. */
|
||||||
* TimerEvent * on success, NULL on failure.
|
int id)
|
||||||
****************************************************************************/
|
|
||||||
static TimerEvent *
|
|
||||||
CreateTimerEvent( TimerThread * timer,
|
|
||||||
ThreadPoolJob * job,
|
|
||||||
Duration persistent,
|
|
||||||
time_t eventTime,
|
|
||||||
int id )
|
|
||||||
{
|
{
|
||||||
TimerEvent *temp = NULL;
|
TimerEvent *temp = NULL;
|
||||||
|
|
||||||
@@ -215,25 +191,8 @@ CreateTimerEvent( TimerThread * timer,
|
|||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: TimerThreadInit
|
int TimerThreadInit(TimerThread *timer, ThreadPool *tp)
|
||||||
*
|
|
||||||
* 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;
|
int rc = 0;
|
||||||
@@ -290,37 +249,14 @@ TimerThreadInit( TimerThread * timer,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: TimerThreadSchedule
|
int TimerThreadSchedule(
|
||||||
*
|
TimerThread *timer,
|
||||||
* Description:
|
time_t timeout,
|
||||||
* Schedules an event to run at a specified time.
|
TimeoutType type,
|
||||||
*
|
ThreadPoolJob *job,
|
||||||
* Parameters:
|
Duration duration,
|
||||||
* timer - valid timer thread pointer.
|
int *id)
|
||||||
* 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,
|
|
||||||
Duration duration,
|
|
||||||
int *id )
|
|
||||||
{
|
{
|
||||||
|
|
||||||
int rc = EOUTOFMEM;
|
int rc = EOUTOFMEM;
|
||||||
@@ -394,28 +330,11 @@ TimerThreadSchedule( TimerThread * timer,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: TimerThreadRemove
|
int TimerThreadRemove(
|
||||||
*
|
TimerThread *timer,
|
||||||
* Description:
|
int id,
|
||||||
* Removes an event from the timer Q.
|
ThreadPoolJob *out)
|
||||||
* 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 )
|
|
||||||
{
|
{
|
||||||
int rc = INVALID_EVENT_ID;
|
int rc = INVALID_EVENT_ID;
|
||||||
ListNode *tempNode = NULL;
|
ListNode *tempNode = NULL;
|
||||||
@@ -450,21 +369,8 @@ TimerThreadRemove( TimerThread * timer,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: TimerThreadShutdown
|
int TimerThreadShutdown(TimerThread *timer)
|
||||||
*
|
|
||||||
* 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 *tempNode2 = NULL;
|
||||||
ListNode *tempNode = NULL;
|
ListNode *tempNode = NULL;
|
||||||
@@ -517,3 +423,4 @@ TimerThreadShutdown( TimerThread * timer )
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -67,7 +67,6 @@ libupnp_la_SOURCES = \
|
|||||||
src/inc/sysdep.h \
|
src/inc/sysdep.h \
|
||||||
src/inc/unixutil.h \
|
src/inc/unixutil.h \
|
||||||
src/inc/upnpapi.h \
|
src/inc/upnpapi.h \
|
||||||
src/inc/upnpclosesocket.h \
|
|
||||||
src/inc/upnp_timeout.h \
|
src/inc/upnp_timeout.h \
|
||||||
src/inc/uri.h \
|
src/inc/uri.h \
|
||||||
src/inc/urlconfig.h \
|
src/inc/urlconfig.h \
|
||||||
|
@@ -12,8 +12,11 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
#include <iphlpapi.h>
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <Ws2tcpip.h>
|
#include <Ws2tcpip.h>
|
||||||
|
|
||||||
|
#define UpnpCloseSocket closesocket
|
||||||
#else
|
#else
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#if (defined(BSD) && BSD >= 199306) || defined (__FreeBSD_kernel__)
|
#if (defined(BSD) && BSD >= 199306) || defined (__FreeBSD_kernel__)
|
||||||
@@ -23,6 +26,11 @@
|
|||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#endif
|
#endif
|
||||||
#include <netinet/in.h>
|
#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
|
||||||
|
|
||||||
|
|
||||||
|
@@ -69,22 +69,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <iphlpapi.h>
|
|
||||||
#else
|
|
||||||
#define SOCKET int
|
|
||||||
#define INVALID_SOCKET (SOCKET)(~0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#define UpnpCloseSocket closesocket
|
|
||||||
#define fseeko fseek
|
|
||||||
#else
|
|
||||||
#define UpnpCloseSocket close
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define LINE_SIZE 180
|
#define LINE_SIZE 180
|
||||||
#define NAME_SIZE 256
|
#define NAME_SIZE 256
|
||||||
#define MNFT_NAME_SIZE 64
|
#define MNFT_NAME_SIZE 64
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/* -*- C -*- */
|
/* -*- C -*- */
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (c) 2006 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
* Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* 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 */
|
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
|
||||||
#define UPNP_VERSION \
|
#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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -304,24 +304,6 @@ static UPNP_INLINE void PrintThreadPoolStats(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \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
|
|
||||||
|
|
||||||
|
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@@ -29,201 +29,237 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
/** @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
|
#ifndef UPNP_TOOLS_H
|
||||||
#define UPNP_TOOLS_H
|
#define UPNP_TOOLS_H
|
||||||
|
|
||||||
#include "upnp.h"
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \defgroup UPnPTools Optional Tool API
|
||||||
|
*
|
||||||
|
* \brief Additional, optional utility API that can be helpful in writing
|
||||||
|
* applications.
|
||||||
|
*
|
||||||
|
* This additional API can be compiled out in order to save code size in the
|
||||||
|
* library. Refer to the file README for details.
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "ixml.h" /* for IXML_Document */
|
||||||
|
|
||||||
|
|
||||||
/* Function declarations only if tools compiled into the library */
|
/* Function declarations only if tools compiled into the library */
|
||||||
#if UPNP_HAVE_TOOLS
|
#if UPNP_HAVE_TOOLS
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** {\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
|
* \brief Converts an SDK error code into a string error message suitable for
|
||||||
* {\bf BaseURL} and {\bf RelURL} combined.
|
* display. The memory returned from this function should NOT be freed.
|
||||||
*
|
*
|
||||||
* @return [int] An integer representing one of the following:
|
* \return An ASCII text string representation of the error message associated
|
||||||
* \begin{itemize}
|
* with the error code or the string "Unknown error code"
|
||||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
*/
|
||||||
* \item {\tt UPNP_E_INVALID_PARAM}: {\bf RelURL} is {\tt NULL}.
|
EXPORT_SPEC const char *UpnpGetErrorMessage(
|
||||||
* \item {\tt UPNP_E_INVALID_URL}: The {\bf BaseURL} / {\bf RelURL}
|
/*! [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
|
||||||
* combination does not form a valid URL.
|
* combination does not form a valid URL.
|
||||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||||
* complete this operation.
|
* complete this operation.
|
||||||
* \end{itemize}
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EXPORT_SPEC int UpnpResolveURL(
|
EXPORT_SPEC int UpnpResolveURL(
|
||||||
IN const char * BaseURL, /** The base URL to combine. */
|
/*! [in] The base URL to combine. */
|
||||||
IN const char * RelURL, /** The relative URL to {\bf BaseURL}. */
|
const char *BaseURL,
|
||||||
OUT char * AbsURL /** A pointer to a buffer to store the
|
/*! [in] The relative URL to \b BaseURL. */
|
||||||
absolute URL. */
|
const char *RelURL,
|
||||||
);
|
/*! [out] A pointer to a buffer to store the absolute URL. */
|
||||||
|
char *AbsURL);
|
||||||
|
|
||||||
/** {\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.
|
|
||||||
*
|
|
||||||
* @return [IXML_Document*] The action node of {\bf Upnp_Document} type or
|
|
||||||
* {\tt NULL} if the operation failed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
EXPORT_SPEC IXML_Document* UpnpMakeAction(
|
/*!
|
||||||
IN const char * ActionName, /** The action name. */
|
* \brief Creates an action request packet based on its input parameters
|
||||||
IN const char * ServType, /** The service type. */
|
* (status variable name and value pair).
|
||||||
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. */
|
|
||||||
);
|
|
||||||
|
|
||||||
/** {\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.
|
|
||||||
*
|
*
|
||||||
* @return [int] An integer representing one of the following:
|
* Any number of input parameters can be passed to this function but every
|
||||||
* \begin{itemize}
|
* input variable name should have a matching value argument.
|
||||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
*
|
||||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
* It is a wrapper function that calls makeAction() function to create the
|
||||||
* are invalid.
|
* action request.
|
||||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
*
|
||||||
* complete this operation.
|
* \return The action node of \b Upnp_Document type or <tt>NULL</tt> if the
|
||||||
* \end{itemize}
|
* operation failed.
|
||||||
*/
|
*/
|
||||||
|
EXPORT_SPEC IXML_Document *UpnpMakeAction(
|
||||||
|
/*! [in] Name of the action request or response. */
|
||||||
|
const char *ActionName,
|
||||||
|
/*! [in] The service type. */
|
||||||
|
const char *ServType,
|
||||||
|
/*! [in] Number of argument pairs to be passed. */
|
||||||
|
int NumArg,
|
||||||
|
/*! [in] pointer to the first argument. */
|
||||||
|
const char *Arg,
|
||||||
|
/*! [in] Argument list. */
|
||||||
|
...);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Ceates an action response packet based on its output parameters
|
||||||
|
* (status variable name and value pair).
|
||||||
|
*
|
||||||
|
* Any number of input parameters can be passed to this function but every
|
||||||
|
* output variable name should have a matching value argument.
|
||||||
|
*
|
||||||
|
* It is a wrapper function that calls makeAction() function to create the
|
||||||
|
* action request.
|
||||||
|
*
|
||||||
|
* \return The action node of \b Upnp_Document type or <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
|
||||||
|
* complete this operation.
|
||||||
|
*/
|
||||||
EXPORT_SPEC int UpnpAddToAction(
|
EXPORT_SPEC int UpnpAddToAction(
|
||||||
IN OUT IXML_Document ** ActionDoc,
|
/*! [in,out] A pointer to store the action document node. */
|
||||||
/** A pointer to store the action
|
IXML_Document **ActionDoc,
|
||||||
document node. */
|
/*! [in] The action name. */
|
||||||
IN const char * ActionName, /** The action name. */
|
const char *ActionName,
|
||||||
IN const char * ServType, /** The service type. */
|
/*! [in] The service type. */
|
||||||
IN const char * ArgName, /** The status variable name. */
|
const char *ServType,
|
||||||
IN const char * ArgVal /** The status variable value. */
|
/*! [in] The status variable name. */
|
||||||
);
|
const char *ArgName,
|
||||||
|
/*! [in] The status variable value. */
|
||||||
|
const char *ArgVal);
|
||||||
|
|
||||||
/** {\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.
|
|
||||||
*
|
|
||||||
* @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. */
|
* \brief Creates an action response packet based on its output parameters
|
||||||
IN const char * ServType, /** The service type. */
|
* (status variable name and value pair).
|
||||||
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:
|
* This API is especially suitable inside a loop to add any number of input
|
||||||
* \begin{itemize}
|
* parameters into an existing action response. If no action document exists
|
||||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
* in the beginning, a \b Upnp_Document variable initialized with <tt>NULL</tt>
|
||||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
* should be passed as a parameter.
|
||||||
* are invalid.
|
*
|
||||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
* It is a wrapper function that calls addToAction() function to add the
|
||||||
* complete this operation.
|
* argument in the action request.
|
||||||
* \end{itemize}
|
*
|
||||||
|
* \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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EXPORT_SPEC int UpnpAddToActionResponse(
|
EXPORT_SPEC int UpnpAddToActionResponse(
|
||||||
IN OUT IXML_Document ** ActionResponse,
|
/*! [in,out] Pointer to a document to store the action document node. */
|
||||||
/** Pointer to a document to
|
IXML_Document **ActionResponse,
|
||||||
store the action document
|
/*! [in] The action name. */
|
||||||
node. */
|
const char *ActionName,
|
||||||
IN const char * ActionName, /** The action name. */
|
/*! [in] The service type. */
|
||||||
IN const char * ServType, /** The service type. */
|
const char *ServType,
|
||||||
IN const char * ArgName, /** The status variable name. */
|
/*! [in] The status variable name. */
|
||||||
IN const char * ArgVal /** The status variable value. */
|
const char *ArgName,
|
||||||
);
|
/*! [in] The status variable value. */
|
||||||
|
const char *ArgVal);
|
||||||
|
|
||||||
/** {\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
|
* \brief Creates a property set message packet.
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* @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}
|
|
||||||
*
|
*
|
||||||
|
* 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
|
||||||
|
* complete this operation.
|
||||||
|
*/
|
||||||
EXPORT_SPEC int UpnpAddToPropertySet(
|
EXPORT_SPEC int UpnpAddToPropertySet(
|
||||||
IN OUT IXML_Document **PropSet,
|
/*! [in,out] A pointer to the document containing the property set document node. */
|
||||||
/** A pointer to the document containing
|
IXML_Document **PropSet,
|
||||||
the property set document node. */
|
/*! [in] The status variable name. */
|
||||||
IN const char * ArgName, /** The status variable name. */
|
const char *ArgName,
|
||||||
IN const char * ArgVal /** The status variable value. */
|
/*! [in] The status variable value. */
|
||||||
);
|
const char *ArgVal);
|
||||||
|
|
||||||
/** {\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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*! @} */
|
||||||
|
|
||||||
|
|
||||||
#endif /* UPNP_HAVE_TOOLS */
|
#endif /* UPNP_HAVE_TOOLS */
|
||||||
|
|
||||||
|
|
||||||
#endif /* UPNP_TOOLS_H */
|
#endif /* UPNP_TOOLS_H */
|
||||||
|
|
||||||
|
@@ -428,8 +428,9 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
|||||||
{
|
{
|
||||||
ithread_mutex_lock(&display_mutex);
|
ithread_mutex_lock(&display_mutex);
|
||||||
|
|
||||||
SampleUtil_Print("======================================================================\n");
|
SampleUtil_Print(
|
||||||
SampleUtil_Print("----------------------------------------------------------------------\n");
|
"======================================================================\n"
|
||||||
|
"----------------------------------------------------------------------\n");
|
||||||
SampleUtil_PrintEventType(EventType);
|
SampleUtil_PrintEventType(EventType);
|
||||||
switch (EventType) {
|
switch (EventType) {
|
||||||
/* SSDP */
|
/* SSDP */
|
||||||
@@ -467,7 +468,7 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
|||||||
SampleUtil_Print("ServiceID = %s\n", a_event->ServiceID);
|
SampleUtil_Print("ServiceID = %s\n", a_event->ServiceID);
|
||||||
if (a_event->ActionRequest) {
|
if (a_event->ActionRequest) {
|
||||||
xmlbuff = ixmlPrintNode((IXML_Node *)a_event->ActionRequest);
|
xmlbuff = ixmlPrintNode((IXML_Node *)a_event->ActionRequest);
|
||||||
if ( xmlbuff ) {
|
if (xmlbuff) {
|
||||||
SampleUtil_Print("ActRequest = %s\n", xmlbuff);
|
SampleUtil_Print("ActRequest = %s\n", xmlbuff);
|
||||||
ixmlFreeDOMString(xmlbuff);
|
ixmlFreeDOMString(xmlbuff);
|
||||||
}
|
}
|
||||||
@@ -541,6 +542,7 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
|||||||
SampleUtil_Print("CurrentVal = %s\n", sv_event->CurrentVal);
|
SampleUtil_Print("CurrentVal = %s\n", sv_event->CurrentVal);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GENA */
|
/* GENA */
|
||||||
case UPNP_EVENT_SUBSCRIPTION_REQUEST: {
|
case UPNP_EVENT_SUBSCRIPTION_REQUEST: {
|
||||||
struct Upnp_Subscription_Request *sr_event =
|
struct Upnp_Subscription_Request *sr_event =
|
||||||
@@ -585,7 +587,6 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
|||||||
SampleUtil_Print("TimeOut = %d\n", es_event->TimeOut);
|
SampleUtil_Print("TimeOut = %d\n", es_event->TimeOut);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case UPNP_EVENT_AUTORENEWAL_FAILED:
|
case UPNP_EVENT_AUTORENEWAL_FAILED:
|
||||||
case UPNP_EVENT_SUBSCRIPTION_EXPIRED: {
|
case UPNP_EVENT_SUBSCRIPTION_EXPIRED: {
|
||||||
struct Upnp_Event_Subscribe *es_event =
|
struct Upnp_Event_Subscribe *es_event =
|
||||||
@@ -599,8 +600,10 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SampleUtil_Print("----------------------------------------------------------------------\n");
|
SampleUtil_Print(
|
||||||
SampleUtil_Print("======================================================================\n");
|
"----------------------------------------------------------------------\n"
|
||||||
|
"======================================================================\n"
|
||||||
|
"\n\n\n");
|
||||||
|
|
||||||
ithread_mutex_unlock(&display_mutex);
|
ithread_mutex_unlock(&display_mutex);
|
||||||
|
|
||||||
|
@@ -1,51 +1,55 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef SAMPLE_UTIL_H
|
#ifndef SAMPLE_UTIL_H
|
||||||
#define SAMPLE_UTIL_H
|
#define SAMPLE_UTIL_H
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "ithread.h"
|
#include "ithread.h"
|
||||||
#include "ixml.h"
|
#include "ixml.h" /* for IXML_Document, IXML_Element */
|
||||||
|
#include "upnp.h" /* for Upnp_EventType */
|
||||||
#include "upnptools.h"
|
#include "upnptools.h"
|
||||||
|
|
||||||
|
|
||||||
// mutex to control displaying of events
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* mutex to control displaying of events */
|
||||||
extern ithread_mutex_t display_mutex;
|
extern ithread_mutex_t display_mutex;
|
||||||
|
|
||||||
|
|
||||||
@@ -166,7 +170,7 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType,
|
|||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
int SampleUtil_FindAndParseService (
|
int SampleUtil_FindAndParseService (
|
||||||
IN IXML_Document *DescDoc,
|
IN IXML_Document *DescDoc,
|
||||||
IN const char *location,
|
IN const char* location,
|
||||||
IN char *serviceType,
|
IN char *serviceType,
|
||||||
OUT char **serviceId,
|
OUT char **serviceId,
|
||||||
OUT char **eventURL,
|
OUT char **eventURL,
|
||||||
|
@@ -29,9 +29,14 @@
|
|||||||
*
|
*
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#include "upnp_tv_ctrlpt.h"
|
#include "upnp_tv_ctrlpt.h"
|
||||||
|
|
||||||
/*
|
|
||||||
|
#include "upnp.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
Mutex for protecting the global device list
|
Mutex for protecting the global device list
|
||||||
in a multi-threaded, asynchronous environment.
|
in a multi-threaded, asynchronous environment.
|
||||||
All functions should lock this mutex before reading
|
All functions should lock this mutex before reading
|
||||||
@@ -48,7 +53,7 @@ char *TvServiceType[] = {
|
|||||||
};
|
};
|
||||||
char *TvServiceName[] = { "Control", "Picture" };
|
char *TvServiceName[] = { "Control", "Picture" };
|
||||||
|
|
||||||
/*
|
/*!
|
||||||
Global arrays for storing variable names and counts for
|
Global arrays for storing variable names and counts for
|
||||||
TvControl and TvPicture services
|
TvControl and TvPicture services
|
||||||
*/
|
*/
|
||||||
@@ -59,12 +64,12 @@ char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS] = {
|
|||||||
char TvVarCount[TV_SERVICE_SERVCOUNT] =
|
char TvVarCount[TV_SERVICE_SERVCOUNT] =
|
||||||
{ TV_CONTROL_VARCOUNT, TV_PICTURE_VARCOUNT };
|
{ TV_CONTROL_VARCOUNT, TV_PICTURE_VARCOUNT };
|
||||||
|
|
||||||
/*
|
/*!
|
||||||
Timeout to request during subscriptions
|
Timeout to request during subscriptions
|
||||||
*/
|
*/
|
||||||
int default_timeout = 1801;
|
int default_timeout = 1801;
|
||||||
|
|
||||||
/*
|
/*!
|
||||||
The first node in the global device list, or NULL if empty
|
The first node in the global device list, or NULL if empty
|
||||||
*/
|
*/
|
||||||
struct TvDeviceNode *GlobalDeviceList = NULL;
|
struct TvDeviceNode *GlobalDeviceList = NULL;
|
||||||
@@ -937,7 +942,7 @@ TvStateUpdate( char *UDN,
|
|||||||
*
|
*
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
void TvCtrlPointHandleEvent(
|
void TvCtrlPointHandleEvent(
|
||||||
const Upnp_SID sid,
|
const char *sid,
|
||||||
int evntkey,
|
int evntkey,
|
||||||
IXML_Document *changes)
|
IXML_Document *changes)
|
||||||
{
|
{
|
||||||
@@ -949,11 +954,11 @@ void TvCtrlPointHandleEvent(
|
|||||||
tmpdevnode = GlobalDeviceList;
|
tmpdevnode = GlobalDeviceList;
|
||||||
while (tmpdevnode) {
|
while (tmpdevnode) {
|
||||||
for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) {
|
for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) {
|
||||||
if(strcmp(tmpdevnode->device.TvService[service].SID, sid) == 0) {
|
if (strcmp(tmpdevnode->device.TvService[service].SID, sid) == 0) {
|
||||||
SampleUtil_Print("Received Tv %s Event: %d for SID %s",
|
SampleUtil_Print("Received Tv %s Event: %d for SID %s",
|
||||||
TvServiceName[service],
|
TvServiceName[service],
|
||||||
evntkey,
|
evntkey,
|
||||||
sid );
|
sid);
|
||||||
TvStateUpdate(
|
TvStateUpdate(
|
||||||
tmpdevnode->device.UDN,
|
tmpdevnode->device.UDN,
|
||||||
service,
|
service,
|
||||||
@@ -1330,8 +1335,9 @@ int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionP
|
|||||||
|
|
||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"UPnP Initialized\n"
|
"UPnP Initialized\n"
|
||||||
"\tipaddress= %s port = %u\n",
|
"\tipaddress = %s port = %u\n",
|
||||||
ip_address, port);
|
ip_address ? ip_address : "{NULL}",
|
||||||
|
port);
|
||||||
|
|
||||||
SampleUtil_Print("Registering Control Point");
|
SampleUtil_Print("Registering Control Point");
|
||||||
rc = UpnpRegisterClient(TvCtrlPointCallbackEventHandler,
|
rc = UpnpRegisterClient(TvCtrlPointCallbackEventHandler,
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/*******************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@@ -27,29 +27,40 @@
|
|||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef UPNP_TV_CTRLPT_H
|
#ifndef UPNP_TV_CTRLPT_H
|
||||||
#define UPNP_TV_CTRLPT_H
|
#define UPNP_TV_CTRLPT_H
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
#include "sample_util.h"
|
||||||
|
|
||||||
|
|
||||||
#include "ithread.h"
|
#include "ithread.h"
|
||||||
#ifndef WIN32
|
#include "upnp.h"
|
||||||
#include <unistd.h>
|
#include "UpnpString.h"
|
||||||
#endif
|
#include "upnptools.h"
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "upnp.h"
|
|
||||||
#include "upnptools.h"
|
#ifdef WIN32
|
||||||
#include "sample_util.h"
|
/* Do not #include <unistd.h> */
|
||||||
|
#else
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define TV_SERVICE_SERVCOUNT 2
|
#define TV_SERVICE_SERVCOUNT 2
|
||||||
#define TV_SERVICE_CONTROL 0
|
#define TV_SERVICE_CONTROL 0
|
||||||
@@ -68,12 +79,12 @@ extern "C" {
|
|||||||
|
|
||||||
#define TV_MAX_VAL_LEN 5
|
#define TV_MAX_VAL_LEN 5
|
||||||
|
|
||||||
#define TV_SUCCESS 0
|
#define TV_SUCCESS 0
|
||||||
#define TV_ERROR (-1)
|
#define TV_ERROR (-1)
|
||||||
#define TV_WARNING 1
|
#define TV_WARNING 1
|
||||||
|
|
||||||
/* This should be the maximum VARCOUNT from above */
|
/* This should be the maximum VARCOUNT from above */
|
||||||
#define TV_MAXVARS TV_PICTURE_VARCOUNT
|
#define TV_MAXVARS TV_PICTURE_VARCOUNT
|
||||||
|
|
||||||
extern char TvDeviceType[];
|
extern char TvDeviceType[];
|
||||||
extern char *TvServiceType[];
|
extern char *TvServiceType[];
|
||||||
@@ -110,11 +121,11 @@ extern ithread_mutex_t DeviceListMutex;
|
|||||||
|
|
||||||
extern UpnpClient_Handle ctrlpt_handle;
|
extern UpnpClient_Handle ctrlpt_handle;
|
||||||
|
|
||||||
void TvCtrlPointPrintHelp( void );
|
void TvCtrlPointPrintHelp(void);
|
||||||
int TvCtrlPointDeleteNode(struct TvDeviceNode *);
|
int TvCtrlPointDeleteNode(struct TvDeviceNode *);
|
||||||
int TvCtrlPointRemoveDevice(const char *);
|
int TvCtrlPointRemoveDevice(const char *);
|
||||||
int TvCtrlPointRemoveAll( void );
|
int TvCtrlPointRemoveAll(void);
|
||||||
int TvCtrlPointRefresh( void );
|
int TvCtrlPointRefresh(void);
|
||||||
|
|
||||||
|
|
||||||
int TvCtrlPointSendAction(int, int, char *, char **, char **, int);
|
int TvCtrlPointSendAction(int, int, char *, char **, char **, int);
|
||||||
@@ -138,20 +149,20 @@ int TvCtrlPointGetContrast(int);
|
|||||||
int TvCtrlPointGetBrightness(int);
|
int TvCtrlPointGetBrightness(int);
|
||||||
|
|
||||||
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
|
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
|
||||||
int TvCtrlPointPrintList( void );
|
int TvCtrlPointPrintList(void);
|
||||||
int TvCtrlPointPrintDevice(int);
|
int TvCtrlPointPrintDevice(int);
|
||||||
void TvCtrlPointAddDevice(IXML_Document *, const char *, int);
|
void TvCtrlPointAddDevice(IXML_Document *, const char *, int);
|
||||||
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
||||||
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
||||||
void TvCtrlPointHandleEvent(const Upnp_SID, int, IXML_Document *);
|
void TvCtrlPointHandleEvent(const char *, int, IXML_Document *);
|
||||||
void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int);
|
void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int);
|
||||||
int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *);
|
int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *);
|
||||||
void TvCtrlPointVerifyTimeouts(int);
|
void TvCtrlPointVerifyTimeouts(int);
|
||||||
void TvCtrlPointPrintCommands( void );
|
void TvCtrlPointPrintCommands(void);
|
||||||
void* TvCtrlPointCommandLoop( void* );
|
void* TvCtrlPointCommandLoop(void *);
|
||||||
int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr );
|
int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionPtr);
|
||||||
int TvCtrlPointStop( void );
|
int TvCtrlPointStop(void);
|
||||||
int TvCtrlPointProcessCommand( char *cmdline );
|
int TvCtrlPointProcessCommand(char *cmdline);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
};
|
};
|
||||||
|
@@ -371,23 +371,26 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
|||||||
* sr_event -- The subscription request event structure
|
* sr_event -- The subscription request event structure
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_event)
|
||||||
TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
|
||||||
*sr_event )
|
|
||||||
{
|
{
|
||||||
unsigned int i = 0; //,j=0;
|
unsigned int i = 0;
|
||||||
|
int cmp1 = 0;
|
||||||
// IXML_Document *PropSet = NULL;
|
int cmp2 = 0;
|
||||||
|
const char *l_serviceId = NULL;
|
||||||
|
const char *l_udn = NULL;
|
||||||
|
const char *l_sid = NULL;
|
||||||
|
|
||||||
// lock state mutex
|
// lock state mutex
|
||||||
ithread_mutex_lock( &TVDevMutex );
|
ithread_mutex_lock(&TVDevMutex);
|
||||||
|
|
||||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
l_serviceId = sr_event->ServiceId;
|
||||||
if( ( strcmp( sr_event->UDN, tv_service_table[i].UDN ) == 0 ) &&
|
l_udn = sr_event->UDN;
|
||||||
( strcmp( sr_event->ServiceId, tv_service_table[i].ServiceId )
|
l_sid = sr_event->Sid;
|
||||||
== 0 ) ) {
|
for (i = 0; i < TV_SERVICE_SERVCOUNT; ++i) {
|
||||||
|
cmp1 = strcmp(l_udn, tv_service_table[i].UDN);
|
||||||
/*
|
cmp2 = strcmp(l_serviceId, tv_service_table[i].ServiceId);
|
||||||
|
if (cmp1 == 0 && cmp2 == 0) {
|
||||||
|
#if 0
|
||||||
PropSet = NULL;
|
PropSet = NULL;
|
||||||
|
|
||||||
for (j = 0; j< tv_service_table[i].VariableCount; ++j) {
|
for (j = 0; j< tv_service_table[i].VariableCount; ++j) {
|
||||||
@@ -402,29 +405,27 @@ TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
|||||||
// dump initial state
|
// dump initial state
|
||||||
UpnpAcceptSubscriptionExt(
|
UpnpAcceptSubscriptionExt(
|
||||||
device_handle,
|
device_handle,
|
||||||
sr_event->UDN,
|
l_udn,
|
||||||
sr_event->ServiceId,
|
l_serviceId,
|
||||||
PropSet,
|
PropSet,
|
||||||
sr_event->Sid);
|
l_sid);
|
||||||
// free document
|
// free document
|
||||||
Document_free(PropSet);
|
Document_free(PropSet);
|
||||||
|
#endif
|
||||||
*/
|
UpnpAcceptSubscription(
|
||||||
|
device_handle,
|
||||||
UpnpAcceptSubscription( device_handle,
|
l_udn,
|
||||||
sr_event->UDN,
|
l_serviceId,
|
||||||
sr_event->ServiceId,
|
|
||||||
(const char **)tv_service_table[i].
|
(const char **)tv_service_table[i].
|
||||||
VariableName,
|
VariableName,
|
||||||
(const char **)tv_service_table[i].
|
(const char **)tv_service_table[i].
|
||||||
VariableStrVal,
|
VariableStrVal,
|
||||||
tv_service_table[i].VariableCount,
|
tv_service_table[i].VariableCount,
|
||||||
sr_event->Sid);
|
l_sid);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ithread_mutex_unlock( &TVDevMutex );
|
ithread_mutex_unlock(&TVDevMutex);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -442,52 +443,52 @@ TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
|||||||
* cgv_event -- The control get variable request event structure
|
* cgv_event -- The control get variable request event structure
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||||
TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request
|
|
||||||
*cgv_event )
|
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
unsigned int j = 0;
|
unsigned int j = 0;
|
||||||
int getvar_succeeded = 0;
|
int getvar_succeeded = 0;
|
||||||
|
|
||||||
cgv_event->CurrentVal = NULL;
|
cgv_event->CurrentVal = NULL;
|
||||||
|
|
||||||
ithread_mutex_lock( &TVDevMutex );
|
ithread_mutex_lock(&TVDevMutex);
|
||||||
|
|
||||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
for (i = 0; i < TV_SERVICE_SERVCOUNT; i++) {
|
||||||
// check udn and service id
|
// check udn and service id
|
||||||
if( ( strcmp( cgv_event->DevUDN, tv_service_table[i].UDN ) == 0 )
|
const char *devUDN =
|
||||||
&&
|
cgv_event->DevUDN;
|
||||||
( strcmp( cgv_event->ServiceID, tv_service_table[i].ServiceId )
|
const char *serviceID =
|
||||||
== 0 ) ) {
|
cgv_event->ServiceID;
|
||||||
// check variable name
|
if (strcmp(devUDN, tv_service_table[i].UDN) == 0 &&
|
||||||
for( j = 0; j < tv_service_table[i].VariableCount; j++ ) {
|
strcmp(serviceID, tv_service_table[i].ServiceId) == 0) {
|
||||||
if( strcmp( cgv_event->StateVarName,
|
// check variable name
|
||||||
tv_service_table[i].VariableName[j] ) == 0 ) {
|
for (j = 0; j < tv_service_table[i].VariableCount; j++) {
|
||||||
getvar_succeeded = 1;
|
const char *stateVarName =
|
||||||
cgv_event->CurrentVal =
|
cgv_event->StateVarName;
|
||||||
ixmlCloneDOMString( tv_service_table[i].
|
if (strcmp(stateVarName,
|
||||||
VariableStrVal[j] );
|
tv_service_table[i].VariableName[j]) == 0) {
|
||||||
break;
|
getvar_succeeded = 1;
|
||||||
}
|
cgv_event->CurrentVal = ixmlCloneDOMString(
|
||||||
}
|
tv_service_table[i].VariableStrVal[j]);
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
cgv_event->ErrCode = 404;
|
||||||
|
strcpy(cgv_event->ErrStr, "Invalid Variable");
|
||||||
|
}
|
||||||
|
|
||||||
if( getvar_succeeded ) {
|
ithread_mutex_unlock(&TVDevMutex);
|
||||||
cgv_event->ErrCode = UPNP_E_SUCCESS;
|
|
||||||
} else {
|
|
||||||
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" );
|
|
||||||
}
|
|
||||||
|
|
||||||
ithread_mutex_unlock( &TVDevMutex );
|
return cgv_event->ErrCode == UPNP_E_SUCCESS;
|
||||||
|
|
||||||
return ( cgv_event->ErrCode == UPNP_E_SUCCESS );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -502,99 +503,79 @@ TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request
|
|||||||
* ca_event -- The control action request event structure
|
* ca_event -- The control action request event structure
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||||
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 action_found = 0;
|
int service = -1;
|
||||||
int i = 0;
|
int retCode = 0;
|
||||||
int service = -1;
|
char *errorString = NULL;
|
||||||
int retCode = 0;
|
const char *devUDN = NULL;
|
||||||
char *errorString = NULL;
|
const char *serviceID = NULL;
|
||||||
|
const char *actionName = NULL;
|
||||||
|
|
||||||
ca_event->ErrCode = 0;
|
ca_event->ErrCode = 0;
|
||||||
ca_event->ActionResult = NULL;
|
ca_event->ActionResult = NULL;
|
||||||
|
|
||||||
if( ( strcmp( ca_event->DevUDN,
|
devUDN = ca_event->DevUDN;
|
||||||
tv_service_table[TV_SERVICE_CONTROL].UDN ) == 0 ) &&
|
serviceID = ca_event->ServiceID;
|
||||||
( strcmp
|
actionName = ca_event->ActionName;
|
||||||
( ca_event->ServiceID,
|
if (strcmp(devUDN, tv_service_table[TV_SERVICE_CONTROL].UDN) == 0 &&
|
||||||
tv_service_table[TV_SERVICE_CONTROL].ServiceId ) == 0 ) ) {
|
strcmp(serviceID, tv_service_table[TV_SERVICE_CONTROL].ServiceId) == 0) {
|
||||||
/*
|
/* Request for action in the TvDevice Control Service. */
|
||||||
Request for action in the TvDevice Control Service
|
service = TV_SERVICE_CONTROL;
|
||||||
*/
|
} else if (strcmp(devUDN, tv_service_table[TV_SERVICE_PICTURE].UDN) == 0 &&
|
||||||
service = TV_SERVICE_CONTROL;
|
strcmp(serviceID, tv_service_table[TV_SERVICE_PICTURE].ServiceId) == 0) {
|
||||||
} else if( ( strcmp( ca_event->DevUDN,
|
/* Request for action in the TvDevice Picture Service. */
|
||||||
tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 )
|
service = TV_SERVICE_PICTURE;
|
||||||
&&
|
}
|
||||||
( strcmp
|
/* Find and call appropriate procedure based on action name.
|
||||||
( ca_event->ServiceID,
|
* Each action name has an associated procedure stored in the
|
||||||
tv_service_table[TV_SERVICE_PICTURE].ServiceId ) ==
|
* service table. These are set at initialization. */
|
||||||
0 ) ) {
|
for (i = 0;
|
||||||
/*
|
i < TV_MAXACTIONS && tv_service_table[service].ActionNames[i] != NULL;
|
||||||
Request for action in the TvDevice Picture Service
|
i++) {
|
||||||
*/
|
if (!strcmp(actionName, tv_service_table[service].ActionNames[i])) {
|
||||||
service = TV_SERVICE_PICTURE;
|
if (!strcmp(tv_service_table[TV_SERVICE_CONTROL].
|
||||||
}
|
VariableStrVal[TV_CONTROL_POWER], "1") ||
|
||||||
//Find and call appropriate procedure based on action name
|
!strcmp(actionName, "PowerOn")) {
|
||||||
//Each action name has an associated procedure stored in the
|
retCode = tv_service_table[service].actions[i](
|
||||||
//service table. These are set at initialization.
|
ca_event->ActionRequest,
|
||||||
|
&ca_event->ActionResult,
|
||||||
|
&errorString);
|
||||||
|
} else {
|
||||||
|
errorString = "Power is Off";
|
||||||
|
retCode = UPNP_E_INTERNAL_ERROR;
|
||||||
|
}
|
||||||
|
action_found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for( i = 0; ( ( i < TV_MAXACTIONS ) &&
|
if (!action_found) {
|
||||||
( tv_service_table[service].ActionNames[i] != NULL ) );
|
ca_event->ActionResult = NULL;
|
||||||
i++ ) {
|
strcpy(ca_event->ErrStr, "Invalid Action");
|
||||||
|
ca_event->ErrCode = 401;
|
||||||
|
} else {
|
||||||
|
if (retCode == UPNP_E_SUCCESS) {
|
||||||
|
ca_event->ErrCode = UPNP_E_SUCCESS;
|
||||||
|
} else {
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( !strcmp( ca_event->ActionName,
|
return ca_event->ErrCode;
|
||||||
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;
|
|
||||||
}
|
|
||||||
action_found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !action_found ) {
|
|
||||||
ca_event->ActionResult = NULL;
|
|
||||||
strcpy( ca_event->ErrStr, "Invalid Action" );
|
|
||||||
ca_event->ErrCode = 401;
|
|
||||||
} else {
|
|
||||||
if( retCode == UPNP_E_SUCCESS ) {
|
|
||||||
ca_event->ErrCode = UPNP_E_SUCCESS;
|
|
||||||
} else {
|
|
||||||
// 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 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -1770,48 +1751,43 @@ TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
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:
|
case UPNP_EVENT_SUBSCRIPTION_REQUEST:
|
||||||
|
TvDeviceHandleSubscriptionRequest((struct Upnp_Subscription_Request *)Event);
|
||||||
|
break;
|
||||||
|
|
||||||
TvDeviceHandleSubscriptionRequest( ( struct
|
case UPNP_CONTROL_GET_VAR_REQUEST:
|
||||||
Upnp_Subscription_Request
|
TvDeviceHandleGetVarRequest((struct Upnp_State_Var_Request *)Event);
|
||||||
* )Event );
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case UPNP_CONTROL_GET_VAR_REQUEST:
|
case UPNP_CONTROL_ACTION_REQUEST:
|
||||||
TvDeviceHandleGetVarRequest( ( struct Upnp_State_Var_Request
|
TvDeviceHandleActionRequest((struct Upnp_Action_Request *)Event);
|
||||||
* )Event );
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case UPNP_CONTROL_ACTION_REQUEST:
|
/*
|
||||||
TvDeviceHandleActionRequest( ( struct Upnp_Action_Request * )
|
ignore these cases, since this is not a control point
|
||||||
Event );
|
*/
|
||||||
break;
|
case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
|
||||||
|
case UPNP_DISCOVERY_SEARCH_RESULT:
|
||||||
|
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
||||||
|
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
|
||||||
|
case UPNP_CONTROL_ACTION_COMPLETE:
|
||||||
|
case UPNP_CONTROL_GET_VAR_COMPLETE:
|
||||||
|
case UPNP_EVENT_RECEIVED:
|
||||||
|
case UPNP_EVENT_RENEWAL_COMPLETE:
|
||||||
|
case UPNP_EVENT_SUBSCRIBE_COMPLETE:
|
||||||
|
case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
default:
|
||||||
ignore these cases, since this is not a control point
|
SampleUtil_Print("Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
||||||
*/
|
EventType);
|
||||||
case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
|
}
|
||||||
case UPNP_DISCOVERY_SEARCH_RESULT:
|
|
||||||
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
|
||||||
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
|
|
||||||
case UPNP_CONTROL_ACTION_COMPLETE:
|
|
||||||
case UPNP_CONTROL_GET_VAR_COMPLETE:
|
|
||||||
case UPNP_EVENT_RECEIVED:
|
|
||||||
case UPNP_EVENT_RENEWAL_COMPLETE:
|
|
||||||
case UPNP_EVENT_SUBSCRIBE_COMPLETE:
|
|
||||||
case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
/* Print a summary of the event received */
|
||||||
SampleUtil_Print( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
SampleUtil_PrintEvent(EventType, Event);
|
||||||
EventType );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print a summary of the event received */
|
return 0;
|
||||||
SampleUtil_PrintEvent( EventType, Event );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -1823,8 +1799,7 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co
|
|||||||
* Parameters:
|
* Parameters:
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceStop(void)
|
||||||
TvDeviceStop()
|
|
||||||
{
|
{
|
||||||
UpnpUnRegisterRootDevice( device_handle );
|
UpnpUnRegisterRootDevice( device_handle );
|
||||||
UpnpFinish();
|
UpnpFinish();
|
||||||
|
@@ -1,53 +1,66 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/**************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef UPNP_TV_DEVICE_H
|
#ifndef UPNP_TV_DEVICE_H
|
||||||
#define UPNP_TV_DEVICE_H
|
#define UPNP_TV_DEVICE_H
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "ithread.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#ifndef WIN32
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
#include <string.h>
|
|
||||||
#include "upnp.h"
|
|
||||||
#include "sample_util.h"
|
#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>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//Color constants
|
//Color constants
|
||||||
#define MAX_COLOR 10
|
#define MAX_COLOR 10
|
||||||
#define MIN_COLOR 1
|
#define MIN_COLOR 1
|
||||||
@@ -148,8 +161,7 @@ extern char *TvServiceType[];
|
|||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out,
|
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out, char **errorString);
|
||||||
char **errorString);
|
|
||||||
|
|
||||||
/* Structure for storing Tv Service
|
/* Structure for storing Tv Service
|
||||||
identifiers and state table */
|
identifiers and state table */
|
||||||
@@ -193,7 +205,7 @@ extern ithread_mutex_t TVDevMutex;
|
|||||||
* struct TvService *out - service containing action table to set.
|
* struct TvService *out - service containing action table to set.
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int SetActionTable(int serviceType, struct TvService * out);
|
int SetActionTable(int serviceType, struct TvService *out);
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceStateTableInit
|
* TvDeviceStateTableInit
|
||||||
@@ -313,8 +325,7 @@ int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*);
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,
|
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDevicePowerOff
|
* TvDevicePowerOff
|
||||||
@@ -329,8 +340,7 @@ int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetChannel
|
* TvDeviceSetChannel
|
||||||
@@ -347,8 +357,7 @@ int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseChannel
|
* TvDeviceIncreaseChannel
|
||||||
@@ -363,8 +372,7 @@ int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseChannel
|
* TvDeviceDecreaseChannel
|
||||||
*
|
*
|
||||||
@@ -378,8 +386,7 @@ int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetVolume
|
* TvDeviceSetVolume
|
||||||
*
|
*
|
||||||
@@ -395,8 +402,7 @@ int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseVolume
|
* TvDeviceIncreaseVolume
|
||||||
@@ -411,8 +417,7 @@ int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* IXML_Document **out - action result document
|
* IXML_Document **out - action result document
|
||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -428,8 +433,7 @@ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
|
|
||||||
//Picture Service Actions
|
//Picture Service Actions
|
||||||
@@ -449,8 +453,7 @@ int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -465,8 +468,7 @@ int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* IXML_Document **out - action result document
|
* IXML_Document **out - action result document
|
||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseColor
|
* TvDeviceDecreaseColor
|
||||||
@@ -480,8 +482,7 @@ int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
|||||||
* IXML_Document **out - action result document
|
* IXML_Document **out - action result document
|
||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetTint
|
* TvDeviceSetTint
|
||||||
@@ -498,8 +499,7 @@ int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseTint
|
* TvDeviceIncreaseTint
|
||||||
@@ -514,8 +514,7 @@ int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseTint
|
* TvDeviceDecreaseTint
|
||||||
@@ -530,8 +529,7 @@ int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* TvDeviceSetContrast
|
* TvDeviceSetContrast
|
||||||
@@ -548,8 +546,7 @@ int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseContrast
|
* TvDeviceIncreaseContrast
|
||||||
@@ -565,8 +562,7 @@ int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseContrast
|
* TvDeviceDecreaseContrast
|
||||||
*
|
*
|
||||||
@@ -580,8 +576,7 @@ int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetBrightness
|
* TvDeviceSetBrightness
|
||||||
@@ -595,8 +590,7 @@ int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* brightness -- The brightness value to change to.
|
* brightness -- The brightness value to change to.
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseBrightness
|
* TvDeviceIncreaseBrightness
|
||||||
@@ -611,8 +605,7 @@ int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseBrightness
|
* TvDeviceDecreaseBrightness
|
||||||
@@ -626,12 +619,11 @@ int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name,
|
int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name,
|
||||||
char *web_dir_path, print_string pfun);
|
char *web_dir_path, print_string pfun);
|
||||||
int TvDeviceStop();
|
int TvDeviceStop(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@@ -143,8 +143,7 @@ TvCtrlPointDeleteNode( struct TvDeviceNode *node )
|
|||||||
* UDN -- The Unique Device Name for the device to remove
|
* UDN -- The Unique Device Name for the device to remove
|
||||||
*
|
*
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
int
|
int TvCtrlPointRemoveDevice(const char *UDN)
|
||||||
TvCtrlPointRemoveDevice(const char *UDN)
|
|
||||||
{
|
{
|
||||||
struct TvDeviceNode *curdevnode;
|
struct TvDeviceNode *curdevnode;
|
||||||
struct TvDeviceNode *prevdevnode;
|
struct TvDeviceNode *prevdevnode;
|
||||||
@@ -943,7 +942,7 @@ TvStateUpdate( char *UDN,
|
|||||||
*
|
*
|
||||||
********************************************************************************/
|
********************************************************************************/
|
||||||
void TvCtrlPointHandleEvent(
|
void TvCtrlPointHandleEvent(
|
||||||
const Upnp_SID sid,
|
const char *sid,
|
||||||
int evntkey,
|
int evntkey,
|
||||||
IXML_Document *changes)
|
IXML_Document *changes)
|
||||||
{
|
{
|
||||||
@@ -955,7 +954,7 @@ void TvCtrlPointHandleEvent(
|
|||||||
tmpdevnode = GlobalDeviceList;
|
tmpdevnode = GlobalDeviceList;
|
||||||
while (tmpdevnode) {
|
while (tmpdevnode) {
|
||||||
for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) {
|
for (service = 0; service < TV_SERVICE_SERVCOUNT; ++service) {
|
||||||
if (strcmp(tmpdevnode->device.TvService[service].SID, sid) == 0) {
|
if (strcmp(tmpdevnode->device.TvService[service].SID, sid) == 0) {
|
||||||
SampleUtil_Print("Received Tv %s Event: %d for SID %s",
|
SampleUtil_Print("Received Tv %s Event: %d for SID %s",
|
||||||
TvServiceName[service],
|
TvServiceName[service],
|
||||||
evntkey,
|
evntkey,
|
||||||
@@ -1019,10 +1018,10 @@ void TvCtrlPointHandleSubscribeUpdate(
|
|||||||
ithread_mutex_unlock( &DeviceListMutex );
|
ithread_mutex_unlock( &DeviceListMutex );
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void TvCtrlPointHandleGetVar(
|
||||||
TvCtrlPointHandleGetVar( const char *controlURL,
|
const char *controlURL,
|
||||||
const char *varName,
|
const char *varName,
|
||||||
const DOMString varValue )
|
const DOMString varValue)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct TvDeviceNode *tmpdevnode;
|
struct TvDeviceNode *tmpdevnode;
|
||||||
@@ -1033,9 +1032,9 @@ TvCtrlPointHandleGetVar( const char *controlURL,
|
|||||||
tmpdevnode = GlobalDeviceList;
|
tmpdevnode = GlobalDeviceList;
|
||||||
while (tmpdevnode) {
|
while (tmpdevnode) {
|
||||||
for (service = 0; service < TV_SERVICE_SERVCOUNT; service++) {
|
for (service = 0; service < TV_SERVICE_SERVCOUNT; service++) {
|
||||||
if (strcmp(tmpdevnode->device.TvService[service].ControlURL, controlURL ) == 0 ) {
|
if (strcmp(tmpdevnode->device.TvService[service].ControlURL, controlURL) == 0) {
|
||||||
SampleUtil_StateUpdate(
|
SampleUtil_StateUpdate(
|
||||||
varName, varValue, tmpdevnode->device.UDN, GET_VAR_COMPLETE );
|
varName, varValue, tmpdevnode->device.UDN, GET_VAR_COMPLETE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1076,29 +1075,24 @@ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void
|
|||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"Error in Discovery Callback -- %d", d_event->ErrCode);
|
"Error in Discovery Callback -- %d", d_event->ErrCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = UpnpDownloadXmlDoc(d_event->Location, &DescDoc);
|
ret = UpnpDownloadXmlDoc(d_event->Location, &DescDoc);
|
||||||
if (ret != UPNP_E_SUCCESS) {
|
if (ret != UPNP_E_SUCCESS) {
|
||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"Error obtaining device description from %s -- error = %d",
|
"Error obtaining device description from %s -- error = %d",
|
||||||
d_event->Location, ret );
|
d_event->Location, ret);
|
||||||
} else {
|
} else {
|
||||||
TvCtrlPointAddDevice(
|
TvCtrlPointAddDevice(
|
||||||
DescDoc, d_event->Location, d_event->Expires);
|
DescDoc, d_event->Location, d_event->Expires);
|
||||||
}
|
}
|
||||||
|
if (DescDoc) {
|
||||||
if( DescDoc ) {
|
|
||||||
ixmlDocument_free(DescDoc);
|
ixmlDocument_free(DescDoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
TvCtrlPointPrintList();
|
TvCtrlPointPrintList();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
||||||
/* Nothing to do here... */
|
/* Nothing to do here... */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: {
|
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: {
|
||||||
struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event;
|
struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event;
|
||||||
|
|
||||||
@@ -1106,13 +1100,10 @@ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void
|
|||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"Error in Discovery ByeBye Callback -- %d", d_event->ErrCode);
|
"Error in Discovery ByeBye Callback -- %d", d_event->ErrCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
SampleUtil_Print("Received ByeBye for Device: %s", d_event->DeviceId);
|
SampleUtil_Print("Received ByeBye for Device: %s", d_event->DeviceId);
|
||||||
TvCtrlPointRemoveDevice(d_event->DeviceId);
|
TvCtrlPointRemoveDevice(d_event->DeviceId);
|
||||||
|
|
||||||
SampleUtil_Print("After byebye:");
|
SampleUtil_Print("After byebye:");
|
||||||
TvCtrlPointPrintList();
|
TvCtrlPointPrintList();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* SOAP Stuff */
|
/* SOAP Stuff */
|
||||||
@@ -1121,13 +1112,10 @@ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void
|
|||||||
|
|
||||||
if (a_event->ErrCode != UPNP_E_SUCCESS) {
|
if (a_event->ErrCode != UPNP_E_SUCCESS) {
|
||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"Error in Action Complete Callback -- %d",
|
"Error in Action Complete Callback -- %d", a_event->ErrCode);
|
||||||
a_event->ErrCode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* No need for any processing here, just print out results.
|
/* No need for any processing here, just print out results.
|
||||||
* Service state table updates are handled by events. */
|
* Service state table updates are handled by events. */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case UPNP_CONTROL_GET_VAR_COMPLETE: {
|
case UPNP_CONTROL_GET_VAR_COMPLETE: {
|
||||||
@@ -1135,8 +1123,7 @@ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void
|
|||||||
|
|
||||||
if (sv_event->ErrCode != UPNP_E_SUCCESS) {
|
if (sv_event->ErrCode != UPNP_E_SUCCESS) {
|
||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"Error in Get Var Complete Callback -- %d",
|
"Error in Get Var Complete Callback -- %d", sv_event->ErrCode);
|
||||||
sv_event->ErrCode);
|
|
||||||
} else {
|
} else {
|
||||||
TvCtrlPointHandleGetVar(
|
TvCtrlPointHandleGetVar(
|
||||||
sv_event->CtrlUrl,
|
sv_event->CtrlUrl,
|
||||||
@@ -1162,15 +1149,13 @@ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void
|
|||||||
|
|
||||||
if (es_event->ErrCode != UPNP_E_SUCCESS) {
|
if (es_event->ErrCode != UPNP_E_SUCCESS) {
|
||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"Error in Event Subscribe Callback -- %d",
|
"Error in Event Subscribe Callback -- %d", es_event->ErrCode);
|
||||||
es_event->ErrCode);
|
|
||||||
} else {
|
} else {
|
||||||
TvCtrlPointHandleSubscribeUpdate(
|
TvCtrlPointHandleSubscribeUpdate(
|
||||||
es_event->PublisherUrl,
|
es_event->PublisherUrl,
|
||||||
es_event->Sid,
|
es_event->Sid,
|
||||||
es_event->TimeOut);
|
es_event->TimeOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case UPNP_EVENT_AUTORENEWAL_FAILED:
|
case UPNP_EVENT_AUTORENEWAL_FAILED:
|
||||||
@@ -1185,7 +1170,6 @@ int TvCtrlPointCallbackEventHandler(Upnp_EventType EventType, void *Event, void
|
|||||||
es_event->PublisherUrl,
|
es_event->PublisherUrl,
|
||||||
&TimeOut,
|
&TimeOut,
|
||||||
newSID);
|
newSID);
|
||||||
|
|
||||||
if (ret == UPNP_E_SUCCESS) {
|
if (ret == UPNP_E_SUCCESS) {
|
||||||
SampleUtil_Print("Subscribed to EventURL with SID=%s", newSID);
|
SampleUtil_Print("Subscribed to EventURL with SID=%s", newSID);
|
||||||
TvCtrlPointHandleSubscribeUpdate(
|
TvCtrlPointHandleSubscribeUpdate(
|
||||||
|
@@ -44,6 +44,7 @@ extern "C" {
|
|||||||
|
|
||||||
#include "ithread.h"
|
#include "ithread.h"
|
||||||
#include "upnp.h"
|
#include "upnp.h"
|
||||||
|
#include "UpnpString.h"
|
||||||
#include "upnptools.h"
|
#include "upnptools.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -120,8 +121,8 @@ extern ithread_mutex_t DeviceListMutex;
|
|||||||
|
|
||||||
extern UpnpClient_Handle ctrlpt_handle;
|
extern UpnpClient_Handle ctrlpt_handle;
|
||||||
|
|
||||||
void TvCtrlPointPrintHelp(void);
|
void TvCtrlPointPrintHelp(void);
|
||||||
int TvCtrlPointDeleteNode(struct TvDeviceNode*);
|
int TvCtrlPointDeleteNode(struct TvDeviceNode *);
|
||||||
int TvCtrlPointRemoveDevice(const char *);
|
int TvCtrlPointRemoveDevice(const char *);
|
||||||
int TvCtrlPointRemoveAll(void);
|
int TvCtrlPointRemoveAll(void);
|
||||||
int TvCtrlPointRefresh(void);
|
int TvCtrlPointRefresh(void);
|
||||||
@@ -148,20 +149,20 @@ int TvCtrlPointGetContrast(int);
|
|||||||
int TvCtrlPointGetBrightness(int);
|
int TvCtrlPointGetBrightness(int);
|
||||||
|
|
||||||
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
|
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
|
||||||
int TvCtrlPointPrintList( void );
|
int TvCtrlPointPrintList(void);
|
||||||
int TvCtrlPointPrintDevice(int);
|
int TvCtrlPointPrintDevice(int);
|
||||||
void TvCtrlPointAddDevice(IXML_Document *, const char *, int);
|
void TvCtrlPointAddDevice(IXML_Document *, const char *, int);
|
||||||
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
||||||
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
||||||
void TvCtrlPointHandleEvent(const Upnp_SID, int, IXML_Document *);
|
void TvCtrlPointHandleEvent(const char *, int, IXML_Document *);
|
||||||
void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int);
|
void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int);
|
||||||
int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *);
|
int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *);
|
||||||
void TvCtrlPointVerifyTimeouts(int);
|
void TvCtrlPointVerifyTimeouts(int);
|
||||||
void TvCtrlPointPrintCommands( void );
|
void TvCtrlPointPrintCommands(void);
|
||||||
void* TvCtrlPointCommandLoop( void* );
|
void* TvCtrlPointCommandLoop(void *);
|
||||||
int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr );
|
int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionPtr);
|
||||||
int TvCtrlPointStop( void );
|
int TvCtrlPointStop(void);
|
||||||
int TvCtrlPointProcessCommand( char *cmdline );
|
int TvCtrlPointProcessCommand(char *cmdline);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
};
|
};
|
||||||
|
@@ -373,23 +373,26 @@ TvDeviceStateTableInit( IN char *DescDocURL )
|
|||||||
* sr_event -- The subscription request event structure
|
* sr_event -- The subscription request event structure
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceHandleSubscriptionRequest(IN struct Upnp_Subscription_Request *sr_event)
|
||||||
TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
|
||||||
*sr_event )
|
|
||||||
{
|
{
|
||||||
unsigned int i = 0; //,j=0;
|
unsigned int i = 0;
|
||||||
|
int cmp1 = 0;
|
||||||
// IXML_Document *PropSet = NULL;
|
int cmp2 = 0;
|
||||||
|
const char *l_serviceId = NULL;
|
||||||
|
const char *l_udn = NULL;
|
||||||
|
const char *l_sid = NULL;
|
||||||
|
|
||||||
// lock state mutex
|
// lock state mutex
|
||||||
ithread_mutex_lock( &TVDevMutex );
|
ithread_mutex_lock(&TVDevMutex);
|
||||||
|
|
||||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
l_serviceId = sr_event->ServiceId;
|
||||||
if( ( strcmp( sr_event->UDN, tv_service_table[i].UDN ) == 0 ) &&
|
l_udn = sr_event->UDN;
|
||||||
( strcmp( sr_event->ServiceId, tv_service_table[i].ServiceId )
|
l_sid = sr_event->Sid;
|
||||||
== 0 ) ) {
|
for (i = 0; i < TV_SERVICE_SERVCOUNT; ++i) {
|
||||||
|
cmp1 = strcmp(l_udn, tv_service_table[i].UDN);
|
||||||
/*
|
cmp2 = strcmp(l_serviceId, tv_service_table[i].ServiceId);
|
||||||
|
if (cmp1 == 0 && cmp2 == 0) {
|
||||||
|
#if 0
|
||||||
PropSet = NULL;
|
PropSet = NULL;
|
||||||
|
|
||||||
for (j = 0; j< tv_service_table[i].VariableCount; ++j) {
|
for (j = 0; j< tv_service_table[i].VariableCount; ++j) {
|
||||||
@@ -404,29 +407,27 @@ TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
|||||||
// dump initial state
|
// dump initial state
|
||||||
UpnpAcceptSubscriptionExt(
|
UpnpAcceptSubscriptionExt(
|
||||||
device_handle,
|
device_handle,
|
||||||
sr_event->UDN,
|
l_udn,
|
||||||
sr_event->ServiceId,
|
l_serviceId,
|
||||||
PropSet,
|
PropSet,
|
||||||
sr_event->Sid);
|
l_sid);
|
||||||
// free document
|
// free document
|
||||||
Document_free(PropSet);
|
Document_free(PropSet);
|
||||||
|
#endif
|
||||||
*/
|
UpnpAcceptSubscription(
|
||||||
|
device_handle,
|
||||||
UpnpAcceptSubscription( device_handle,
|
l_udn,
|
||||||
sr_event->UDN,
|
l_serviceId,
|
||||||
sr_event->ServiceId,
|
|
||||||
(const char **)tv_service_table[i].
|
(const char **)tv_service_table[i].
|
||||||
VariableName,
|
VariableName,
|
||||||
(const char **)tv_service_table[i].
|
(const char **)tv_service_table[i].
|
||||||
VariableStrVal,
|
VariableStrVal,
|
||||||
tv_service_table[i].VariableCount,
|
tv_service_table[i].VariableCount,
|
||||||
sr_event->Sid);
|
l_sid);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ithread_mutex_unlock( &TVDevMutex );
|
ithread_mutex_unlock(&TVDevMutex);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -444,52 +445,52 @@ TvDeviceHandleSubscriptionRequest( IN struct Upnp_Subscription_Request
|
|||||||
* cgv_event -- The control get variable request event structure
|
* cgv_event -- The control get variable request event structure
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceHandleGetVarRequest(INOUT struct Upnp_State_Var_Request *cgv_event)
|
||||||
TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request
|
|
||||||
*cgv_event )
|
|
||||||
{
|
{
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
unsigned int j = 0;
|
unsigned int j = 0;
|
||||||
int getvar_succeeded = 0;
|
int getvar_succeeded = 0;
|
||||||
|
|
||||||
cgv_event->CurrentVal = NULL;
|
cgv_event->CurrentVal = NULL;
|
||||||
|
|
||||||
ithread_mutex_lock( &TVDevMutex );
|
ithread_mutex_lock(&TVDevMutex);
|
||||||
|
|
||||||
for( i = 0; i < TV_SERVICE_SERVCOUNT; i++ ) {
|
for (i = 0; i < TV_SERVICE_SERVCOUNT; i++) {
|
||||||
// check udn and service id
|
// check udn and service id
|
||||||
if( ( strcmp( cgv_event->DevUDN, tv_service_table[i].UDN ) == 0 )
|
const char *devUDN =
|
||||||
&&
|
cgv_event->DevUDN;
|
||||||
( strcmp( cgv_event->ServiceID, tv_service_table[i].ServiceId )
|
const char *serviceID =
|
||||||
== 0 ) ) {
|
cgv_event->ServiceID;
|
||||||
// check variable name
|
if (strcmp(devUDN, tv_service_table[i].UDN) == 0 &&
|
||||||
for( j = 0; j < tv_service_table[i].VariableCount; j++ ) {
|
strcmp(serviceID, tv_service_table[i].ServiceId) == 0) {
|
||||||
if( strcmp( cgv_event->StateVarName,
|
// check variable name
|
||||||
tv_service_table[i].VariableName[j] ) == 0 ) {
|
for (j = 0; j < tv_service_table[i].VariableCount; j++) {
|
||||||
getvar_succeeded = 1;
|
const char *stateVarName =
|
||||||
cgv_event->CurrentVal =
|
cgv_event->StateVarName;
|
||||||
ixmlCloneDOMString( tv_service_table[i].
|
if (strcmp(stateVarName,
|
||||||
VariableStrVal[j] );
|
tv_service_table[i].VariableName[j]) == 0) {
|
||||||
break;
|
getvar_succeeded = 1;
|
||||||
}
|
cgv_event->CurrentVal = ixmlCloneDOMString(
|
||||||
}
|
tv_service_table[i].VariableStrVal[j]);
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
cgv_event->ErrCode = 404;
|
||||||
|
strcpy(cgv_event->ErrStr, "Invalid Variable");
|
||||||
|
}
|
||||||
|
|
||||||
if( getvar_succeeded ) {
|
ithread_mutex_unlock(&TVDevMutex);
|
||||||
cgv_event->ErrCode = UPNP_E_SUCCESS;
|
|
||||||
} else {
|
|
||||||
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" );
|
|
||||||
}
|
|
||||||
|
|
||||||
ithread_mutex_unlock( &TVDevMutex );
|
return cgv_event->ErrCode == UPNP_E_SUCCESS;
|
||||||
|
|
||||||
return ( cgv_event->ErrCode == UPNP_E_SUCCESS );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -504,99 +505,79 @@ TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request
|
|||||||
* ca_event -- The control action request event structure
|
* ca_event -- The control action request event structure
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceHandleActionRequest(INOUT struct Upnp_Action_Request *ca_event)
|
||||||
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 action_found = 0;
|
int service = -1;
|
||||||
int i = 0;
|
int retCode = 0;
|
||||||
int service = -1;
|
char *errorString = NULL;
|
||||||
int retCode = 0;
|
const char *devUDN = NULL;
|
||||||
char *errorString = NULL;
|
const char *serviceID = NULL;
|
||||||
|
const char *actionName = NULL;
|
||||||
|
|
||||||
ca_event->ErrCode = 0;
|
ca_event->ErrCode = 0;
|
||||||
ca_event->ActionResult = NULL;
|
ca_event->ActionResult = NULL;
|
||||||
|
|
||||||
if( ( strcmp( ca_event->DevUDN,
|
devUDN = ca_event->DevUDN;
|
||||||
tv_service_table[TV_SERVICE_CONTROL].UDN ) == 0 ) &&
|
serviceID = ca_event->ServiceID;
|
||||||
( strcmp
|
actionName = ca_event->ActionName;
|
||||||
( ca_event->ServiceID,
|
if (strcmp(devUDN, tv_service_table[TV_SERVICE_CONTROL].UDN) == 0 &&
|
||||||
tv_service_table[TV_SERVICE_CONTROL].ServiceId ) == 0 ) ) {
|
strcmp(serviceID, tv_service_table[TV_SERVICE_CONTROL].ServiceId) == 0) {
|
||||||
/*
|
/* Request for action in the TvDevice Control Service. */
|
||||||
Request for action in the TvDevice Control Service
|
service = TV_SERVICE_CONTROL;
|
||||||
*/
|
} else if (strcmp(devUDN, tv_service_table[TV_SERVICE_PICTURE].UDN) == 0 &&
|
||||||
service = TV_SERVICE_CONTROL;
|
strcmp(serviceID, tv_service_table[TV_SERVICE_PICTURE].ServiceId) == 0) {
|
||||||
} else if( ( strcmp( ca_event->DevUDN,
|
/* Request for action in the TvDevice Picture Service. */
|
||||||
tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 )
|
service = TV_SERVICE_PICTURE;
|
||||||
&&
|
}
|
||||||
( strcmp
|
/* Find and call appropriate procedure based on action name.
|
||||||
( ca_event->ServiceID,
|
* Each action name has an associated procedure stored in the
|
||||||
tv_service_table[TV_SERVICE_PICTURE].ServiceId ) ==
|
* service table. These are set at initialization. */
|
||||||
0 ) ) {
|
for (i = 0;
|
||||||
/*
|
i < TV_MAXACTIONS && tv_service_table[service].ActionNames[i] != NULL;
|
||||||
Request for action in the TvDevice Picture Service
|
i++) {
|
||||||
*/
|
if (!strcmp(actionName, tv_service_table[service].ActionNames[i])) {
|
||||||
service = TV_SERVICE_PICTURE;
|
if (!strcmp(tv_service_table[TV_SERVICE_CONTROL].
|
||||||
}
|
VariableStrVal[TV_CONTROL_POWER], "1") ||
|
||||||
//Find and call appropriate procedure based on action name
|
!strcmp(actionName, "PowerOn")) {
|
||||||
//Each action name has an associated procedure stored in the
|
retCode = tv_service_table[service].actions[i](
|
||||||
//service table. These are set at initialization.
|
ca_event->ActionRequest,
|
||||||
|
&ca_event->ActionResult,
|
||||||
|
&errorString);
|
||||||
|
} else {
|
||||||
|
errorString = "Power is Off";
|
||||||
|
retCode = UPNP_E_INTERNAL_ERROR;
|
||||||
|
}
|
||||||
|
action_found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for( i = 0; ( ( i < TV_MAXACTIONS ) &&
|
if (!action_found) {
|
||||||
( tv_service_table[service].ActionNames[i] != NULL ) );
|
ca_event->ActionResult = NULL;
|
||||||
i++ ) {
|
strcpy(ca_event->ErrStr, "Invalid Action");
|
||||||
|
ca_event->ErrCode = 401;
|
||||||
|
} else {
|
||||||
|
if (retCode == UPNP_E_SUCCESS) {
|
||||||
|
ca_event->ErrCode = UPNP_E_SUCCESS;
|
||||||
|
} else {
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( !strcmp( ca_event->ActionName,
|
return ca_event->ErrCode;
|
||||||
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;
|
|
||||||
}
|
|
||||||
action_found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !action_found ) {
|
|
||||||
ca_event->ActionResult = NULL;
|
|
||||||
strcpy( ca_event->ErrStr, "Invalid Action" );
|
|
||||||
ca_event->ErrCode = 401;
|
|
||||||
} else {
|
|
||||||
if( retCode == UPNP_E_SUCCESS ) {
|
|
||||||
ca_event->ErrCode = UPNP_E_SUCCESS;
|
|
||||||
} else {
|
|
||||||
// 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 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -1772,48 +1753,43 @@ TvDeviceDecreaseBrightness( IN IXML_Document *in, OUT IXML_Document **out, OUT c
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
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:
|
case UPNP_EVENT_SUBSCRIPTION_REQUEST:
|
||||||
|
TvDeviceHandleSubscriptionRequest((struct Upnp_Subscription_Request *)Event);
|
||||||
|
break;
|
||||||
|
|
||||||
TvDeviceHandleSubscriptionRequest( ( struct
|
case UPNP_CONTROL_GET_VAR_REQUEST:
|
||||||
Upnp_Subscription_Request
|
TvDeviceHandleGetVarRequest((struct Upnp_State_Var_Request *)Event);
|
||||||
* )Event );
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case UPNP_CONTROL_GET_VAR_REQUEST:
|
case UPNP_CONTROL_ACTION_REQUEST:
|
||||||
TvDeviceHandleGetVarRequest( ( struct Upnp_State_Var_Request
|
TvDeviceHandleActionRequest((struct Upnp_Action_Request *)Event);
|
||||||
* )Event );
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case UPNP_CONTROL_ACTION_REQUEST:
|
/*
|
||||||
TvDeviceHandleActionRequest( ( struct Upnp_Action_Request * )
|
ignore these cases, since this is not a control point
|
||||||
Event );
|
*/
|
||||||
break;
|
case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
|
||||||
|
case UPNP_DISCOVERY_SEARCH_RESULT:
|
||||||
|
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
||||||
|
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
|
||||||
|
case UPNP_CONTROL_ACTION_COMPLETE:
|
||||||
|
case UPNP_CONTROL_GET_VAR_COMPLETE:
|
||||||
|
case UPNP_EVENT_RECEIVED:
|
||||||
|
case UPNP_EVENT_RENEWAL_COMPLETE:
|
||||||
|
case UPNP_EVENT_SUBSCRIBE_COMPLETE:
|
||||||
|
case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
|
||||||
|
break;
|
||||||
|
|
||||||
/*
|
default:
|
||||||
ignore these cases, since this is not a control point
|
SampleUtil_Print("Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
||||||
*/
|
EventType);
|
||||||
case UPNP_DISCOVERY_ADVERTISEMENT_ALIVE:
|
}
|
||||||
case UPNP_DISCOVERY_SEARCH_RESULT:
|
|
||||||
case UPNP_DISCOVERY_SEARCH_TIMEOUT:
|
|
||||||
case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE:
|
|
||||||
case UPNP_CONTROL_ACTION_COMPLETE:
|
|
||||||
case UPNP_CONTROL_GET_VAR_COMPLETE:
|
|
||||||
case UPNP_EVENT_RECEIVED:
|
|
||||||
case UPNP_EVENT_RENEWAL_COMPLETE:
|
|
||||||
case UPNP_EVENT_SUBSCRIBE_COMPLETE:
|
|
||||||
case UPNP_EVENT_UNSUBSCRIBE_COMPLETE:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
/* Print a summary of the event received */
|
||||||
SampleUtil_Print( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n",
|
SampleUtil_PrintEvent(EventType, Event);
|
||||||
EventType );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print a summary of the event received */
|
return 0;
|
||||||
SampleUtil_PrintEvent( EventType, Event );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -1825,8 +1801,7 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co
|
|||||||
* Parameters:
|
* Parameters:
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int
|
int TvDeviceStop(void)
|
||||||
TvDeviceStop(void)
|
|
||||||
{
|
{
|
||||||
UpnpUnRegisterRootDevice( device_handle );
|
UpnpUnRegisterRootDevice( device_handle );
|
||||||
UpnpFinish();
|
UpnpFinish();
|
||||||
@@ -1874,7 +1849,8 @@ TvDeviceStart( char *ip_address,
|
|||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"Initializing UPnP Sdk with\n"
|
"Initializing UPnP Sdk with\n"
|
||||||
"\tipaddress = %s port = %u\n",
|
"\tipaddress = %s port = %u\n",
|
||||||
ip_address, port );
|
ip_address ? ip_address : "{NULL}",
|
||||||
|
port);
|
||||||
|
|
||||||
ret = UpnpInit( ip_address, port );
|
ret = UpnpInit( ip_address, port );
|
||||||
if( ret != UPNP_E_SUCCESS ) {
|
if( ret != UPNP_E_SUCCESS ) {
|
||||||
@@ -1888,8 +1864,9 @@ TvDeviceStart( char *ip_address,
|
|||||||
|
|
||||||
SampleUtil_Print(
|
SampleUtil_Print(
|
||||||
"UPnP Initialized\n"
|
"UPnP Initialized\n"
|
||||||
"\tipaddress= %s port = %u\n",
|
"\tipaddress = %s port = %u\n",
|
||||||
ip_address, port );
|
ip_address ? ip_address : "{NULL}",
|
||||||
|
port);
|
||||||
|
|
||||||
if( desc_doc_name == NULL ) {
|
if( desc_doc_name == NULL ) {
|
||||||
desc_doc_name = "tvdevicedesc.xml";
|
desc_doc_name = "tvdevicedesc.xml";
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
/*******************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
@@ -27,28 +27,40 @@
|
|||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
******************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef UPNP_TV_DEVICE_H
|
#ifndef UPNP_TV_DEVICE_H
|
||||||
#define UPNP_TV_DEVICE_H
|
#define UPNP_TV_DEVICE_H
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "ithread.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#ifndef WIN32
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
#include <string.h>
|
|
||||||
#include "upnp.h"
|
|
||||||
#include "sample_util.h"
|
#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>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//Color constants
|
//Color constants
|
||||||
#define MAX_COLOR 10
|
#define MAX_COLOR 10
|
||||||
#define MIN_COLOR 1
|
#define MIN_COLOR 1
|
||||||
@@ -149,8 +161,7 @@ extern char *TvServiceType[];
|
|||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out,
|
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out, char **errorString);
|
||||||
char **errorString);
|
|
||||||
|
|
||||||
/* Structure for storing Tv Service
|
/* Structure for storing Tv Service
|
||||||
identifiers and state table */
|
identifiers and state table */
|
||||||
@@ -194,7 +205,7 @@ extern ithread_mutex_t TVDevMutex;
|
|||||||
* struct TvService *out - service containing action table to set.
|
* struct TvService *out - service containing action table to set.
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int SetActionTable(int serviceType, struct TvService * out);
|
int SetActionTable(int serviceType, struct TvService *out);
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceStateTableInit
|
* TvDeviceStateTableInit
|
||||||
@@ -314,8 +325,7 @@ int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*);
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,
|
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDevicePowerOff
|
* TvDevicePowerOff
|
||||||
@@ -330,8 +340,7 @@ int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetChannel
|
* TvDeviceSetChannel
|
||||||
@@ -348,8 +357,7 @@ int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseChannel
|
* TvDeviceIncreaseChannel
|
||||||
@@ -364,8 +372,7 @@ int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseChannel
|
* TvDeviceDecreaseChannel
|
||||||
*
|
*
|
||||||
@@ -379,8 +386,7 @@ int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetVolume
|
* TvDeviceSetVolume
|
||||||
*
|
*
|
||||||
@@ -396,8 +402,7 @@ int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseVolume
|
* TvDeviceIncreaseVolume
|
||||||
@@ -412,8 +417,7 @@ int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* IXML_Document **out - action result document
|
* IXML_Document **out - action result document
|
||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -429,8 +433,7 @@ int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
|
|
||||||
//Picture Service Actions
|
//Picture Service Actions
|
||||||
@@ -450,8 +453,7 @@ int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -466,8 +468,7 @@ int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* IXML_Document **out - action result document
|
* IXML_Document **out - action result document
|
||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseColor
|
* TvDeviceDecreaseColor
|
||||||
@@ -481,8 +482,7 @@ int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
|||||||
* IXML_Document **out - action result document
|
* IXML_Document **out - action result document
|
||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetTint
|
* TvDeviceSetTint
|
||||||
@@ -499,8 +499,7 @@ int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseTint
|
* TvDeviceIncreaseTint
|
||||||
@@ -515,8 +514,7 @@ int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseTint
|
* TvDeviceDecreaseTint
|
||||||
@@ -531,8 +529,7 @@ int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* TvDeviceSetContrast
|
* TvDeviceSetContrast
|
||||||
@@ -549,8 +546,7 @@ int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseContrast
|
* TvDeviceIncreaseContrast
|
||||||
@@ -566,8 +562,7 @@ int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseContrast
|
* TvDeviceDecreaseContrast
|
||||||
*
|
*
|
||||||
@@ -581,8 +576,7 @@ int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceSetBrightness
|
* TvDeviceSetBrightness
|
||||||
@@ -596,8 +590,7 @@ int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* brightness -- The brightness value to change to.
|
* brightness -- The brightness value to change to.
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceIncreaseBrightness
|
* TvDeviceIncreaseBrightness
|
||||||
@@ -612,8 +605,7 @@ int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* TvDeviceDecreaseBrightness
|
* TvDeviceDecreaseBrightness
|
||||||
@@ -627,8 +619,7 @@ int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
|||||||
* char **errorString - errorString (in case action was unsuccessful)
|
* char **errorString - errorString (in case action was unsuccessful)
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
|
int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out, OUT char **errorString);
|
||||||
OUT char **errorString);
|
|
||||||
|
|
||||||
int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name,
|
int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name,
|
||||||
char *web_dir_path, print_string pfun);
|
char *web_dir_path, print_string pfun);
|
||||||
|
@@ -149,7 +149,7 @@ void UpnpPrintf(
|
|||||||
ithread_mutex_lock(&GlobalDebugMutex);
|
ithread_mutex_lock(&GlobalDebugMutex);
|
||||||
va_start(ArgList, FmtStr);
|
va_start(ArgList, FmtStr);
|
||||||
if (!DEBUG_TARGET) {
|
if (!DEBUG_TARGET) {
|
||||||
if( DbgFileName ) {
|
if (DbgFileName) {
|
||||||
UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);
|
UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);
|
||||||
}
|
}
|
||||||
vfprintf(stdout, FmtStr, ArgList);
|
vfprintf(stdout, FmtStr, ArgList);
|
||||||
@@ -324,32 +324,5 @@ void PrintThreadPoolStats(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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);
|
|
||||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
|
||||||
"DEPTH-%2d-IXML_Node Type %d, "
|
|
||||||
"IXML_Node Name: %s, IXML_Node Value: %s\n",
|
|
||||||
depth, NodeType, NodeName, NodeValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* DEBUG */
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -68,6 +68,7 @@
|
|||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#define fseeko fseek
|
||||||
#else
|
#else
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -29,304 +29,186 @@
|
|||||||
*
|
*
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
/*!
|
||||||
/************************************************************************
|
* \file
|
||||||
* Purpose: This file implements the sockets functionality
|
*
|
||||||
************************************************************************/
|
* \brief Implements the sockets functionality.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
|
|
||||||
|
#include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */
|
||||||
#include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */
|
|
||||||
#include "upnp.h"
|
#include "upnp.h"
|
||||||
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
#ifndef MSG_NOSIGNAL
|
#ifndef MSG_NOSIGNAL
|
||||||
#define MSG_NOSIGNAL 0
|
#define MSG_NOSIGNAL 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/************************************************************************
|
int sock_init(OUT SOCKINFO *info, IN SOCKET sockfd)
|
||||||
* Function : sock_init
|
|
||||||
*
|
|
||||||
* Parameters :
|
|
||||||
* OUT SOCKINFO* info ; Socket Information Object
|
|
||||||
* IN SOCKET sockfd ; Socket Descriptor
|
|
||||||
*
|
|
||||||
* Description : Assign the passed in socket descriptor to socket
|
|
||||||
* descriptor in the SOCKINFO structure.
|
|
||||||
*
|
|
||||||
* Return : int;
|
|
||||||
* UPNP_E_SUCCESS
|
|
||||||
* UPNP_E_OUTOF_MEMORY
|
|
||||||
* UPNP_E_SOCKET_ERROR
|
|
||||||
*
|
|
||||||
* Note :
|
|
||||||
************************************************************************/
|
|
||||||
int
|
|
||||||
sock_init( OUT SOCKINFO * info,
|
|
||||||
IN SOCKET sockfd )
|
|
||||||
{
|
{
|
||||||
assert( info );
|
assert(info);
|
||||||
|
|
||||||
memset( info, 0, sizeof( SOCKINFO ) );
|
memset(info, 0, sizeof(SOCKINFO));
|
||||||
|
info->socket = sockfd;
|
||||||
|
|
||||||
info->socket = sockfd;
|
return UPNP_E_SUCCESS;
|
||||||
|
|
||||||
return UPNP_E_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
int sock_init_with_ip(OUT SOCKINFO *info, IN SOCKET sockfd,
|
||||||
* Function : sock_init_with_ip
|
IN struct sockaddr *foreign_sockaddr)
|
||||||
*
|
|
||||||
* Parameters :
|
|
||||||
* OUT SOCKINFO* info ; Socket Information Object
|
|
||||||
* IN SOCKET sockfd ; Socket Descriptor
|
|
||||||
* IN struct sockaddr* foreign_sockaddr; remote socket address.
|
|
||||||
*
|
|
||||||
* Description : Calls the sock_init function and assigns the passed in
|
|
||||||
* IP address and port to the IP address and port in the SOCKINFO
|
|
||||||
* structure.
|
|
||||||
*
|
|
||||||
* Return : int;
|
|
||||||
* UPNP_E_SUCCESS
|
|
||||||
* UPNP_E_OUTOF_MEMORY
|
|
||||||
* UPNP_E_SOCKET_ERROR
|
|
||||||
*
|
|
||||||
* Note :
|
|
||||||
************************************************************************/
|
|
||||||
int
|
|
||||||
sock_init_with_ip( OUT SOCKINFO * info,
|
|
||||||
IN SOCKET sockfd,
|
|
||||||
IN struct sockaddr* foreign_sockaddr )
|
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = sock_init( info, sockfd );
|
ret = sock_init(info, sockfd);
|
||||||
if( ret != UPNP_E_SUCCESS ) {
|
if (ret != UPNP_E_SUCCESS) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy( &info->foreign_sockaddr, foreign_sockaddr,
|
memcpy(&info->foreign_sockaddr, foreign_sockaddr,
|
||||||
sizeof( info->foreign_sockaddr) );
|
sizeof(info->foreign_sockaddr));
|
||||||
|
|
||||||
return UPNP_E_SUCCESS;
|
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 )
|
|
||||||
{
|
{
|
||||||
if( info->socket != INVALID_SOCKET ) {
|
int ret = UPNP_E_SUCCESS;
|
||||||
shutdown( info->socket, ShutdownMethod );
|
|
||||||
if( UpnpCloseSocket( info->socket ) == -1 ) {
|
|
||||||
return UPNP_E_SOCKET_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function : sock_read_write
|
* \brief Receives or sends data. Also returns the time taken to receive or
|
||||||
*
|
* send data.
|
||||||
* Parameters :
|
*
|
||||||
* IN SOCKINFO *info ; Socket Information Object
|
* \return
|
||||||
* OUT char* buffer ; Buffer to get data to or send data from
|
* \li \c numBytes - On Success, no of bytes received or sent or
|
||||||
* IN size_t bufsize ; Size of the buffer
|
* \li \c UPNP_E_TIMEDOUT - Timeout
|
||||||
* IN int *timeoutSecs ; timeout value
|
* \li \c UPNP_E_SOCKET_ERROR - Error on socket calls
|
||||||
* IN xboolean bRead ; Boolean value specifying read or write option
|
*/
|
||||||
*
|
static int sock_read_write(
|
||||||
* Description : Receives or sends data. Also returns the time taken
|
/*! Socket Information Object. */
|
||||||
* to receive or send data.
|
IN SOCKINFO *info,
|
||||||
*
|
/*! Buffer to get data to or send data from. */
|
||||||
* Return :int ;
|
OUT char *buffer,
|
||||||
* numBytes - On Success, no of bytes received or sent
|
/*! Size of the buffer. */
|
||||||
* UPNP_E_TIMEDOUT - Timeout
|
IN size_t bufsize,
|
||||||
* UPNP_E_SOCKET_ERROR - Error on socket calls
|
/*! timeout value. */
|
||||||
*
|
IN int *timeoutSecs,
|
||||||
* Note :
|
/*! Boolean value specifying read or write option. */
|
||||||
************************************************************************/
|
IN xboolean bRead)
|
||||||
static int
|
|
||||||
sock_read_write( IN SOCKINFO * info,
|
|
||||||
OUT char *buffer,
|
|
||||||
IN size_t bufsize,
|
|
||||||
IN int *timeoutSecs,
|
|
||||||
IN xboolean bRead )
|
|
||||||
{
|
{
|
||||||
int retCode;
|
int retCode;
|
||||||
fd_set readSet;
|
fd_set readSet;
|
||||||
fd_set writeSet;
|
fd_set writeSet;
|
||||||
struct timeval timeout;
|
struct timeval timeout;
|
||||||
int numBytes;
|
int numBytes;
|
||||||
time_t start_time = time( NULL );
|
time_t start_time = time(NULL);
|
||||||
SOCKET sockfd = info->socket;
|
SOCKET sockfd = info->socket;
|
||||||
long bytes_sent = 0,
|
long bytes_sent = 0, byte_left = 0, num_written;
|
||||||
byte_left = 0,
|
|
||||||
num_written;
|
|
||||||
|
|
||||||
if( *timeoutSecs < 0 ) {
|
|
||||||
return UPNP_E_TIMEDOUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
FD_ZERO( &readSet );
|
|
||||||
FD_ZERO( &writeSet );
|
|
||||||
if( bRead ) {
|
|
||||||
FD_SET( sockfd, &readSet );
|
|
||||||
} else {
|
|
||||||
FD_SET( sockfd, &writeSet );
|
|
||||||
}
|
|
||||||
|
|
||||||
timeout.tv_sec = *timeoutSecs;
|
|
||||||
timeout.tv_usec = 0;
|
|
||||||
|
|
||||||
while( TRUE ) {
|
|
||||||
if( *timeoutSecs == 0 ) {
|
|
||||||
retCode =
|
|
||||||
select( sockfd + 1, &readSet, &writeSet, NULL, NULL );
|
|
||||||
} else {
|
|
||||||
retCode =
|
|
||||||
select( sockfd + 1, &readSet, &writeSet, NULL, &timeout );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( retCode == 0 ) {
|
|
||||||
return UPNP_E_TIMEDOUT;
|
|
||||||
}
|
|
||||||
if( retCode == -1 ) {
|
|
||||||
if( errno == EINTR )
|
|
||||||
continue;
|
|
||||||
return UPNP_E_SOCKET_ERROR; // error
|
|
||||||
} else {
|
|
||||||
break; // read or write
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (*timeoutSecs < 0) {
|
||||||
|
return UPNP_E_TIMEDOUT;
|
||||||
|
}
|
||||||
|
FD_ZERO(&readSet);
|
||||||
|
FD_ZERO(&writeSet);
|
||||||
|
if (bRead) {
|
||||||
|
FD_SET(sockfd, &readSet);
|
||||||
|
} else {
|
||||||
|
FD_SET(sockfd, &writeSet);
|
||||||
|
}
|
||||||
|
timeout.tv_sec = *timeoutSecs;
|
||||||
|
timeout.tv_usec = 0;
|
||||||
|
while (TRUE) {
|
||||||
|
if (*timeoutSecs == 0) {
|
||||||
|
retCode = select(sockfd + 1, &readSet, &writeSet,
|
||||||
|
NULL, NULL);
|
||||||
|
} else {
|
||||||
|
retCode = select(sockfd + 1, &readSet, &writeSet,
|
||||||
|
NULL, &timeout);
|
||||||
|
}
|
||||||
|
if (retCode == 0) {
|
||||||
|
return UPNP_E_TIMEDOUT;
|
||||||
|
}
|
||||||
|
if (retCode == -1) {
|
||||||
|
if (errno == EINTR)
|
||||||
|
continue;
|
||||||
|
return UPNP_E_SOCKET_ERROR;
|
||||||
|
} else {
|
||||||
|
/* read or write. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
#ifdef SO_NOSIGPIPE
|
#ifdef SO_NOSIGPIPE
|
||||||
{
|
{
|
||||||
int old;
|
int old;
|
||||||
int set = 1;
|
int set = 1;
|
||||||
socklen_t olen = sizeof(old);
|
socklen_t olen = sizeof(old);
|
||||||
getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen);
|
getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen);
|
||||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set));
|
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set));
|
||||||
#endif
|
#endif
|
||||||
|
if (bRead) {
|
||||||
if( bRead ) {
|
/* read data. */
|
||||||
// read data
|
numBytes = recv(sockfd, buffer, bufsize, MSG_NOSIGNAL);
|
||||||
numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL);
|
} else {
|
||||||
} else {
|
byte_left = bufsize;
|
||||||
byte_left = bufsize;
|
bytes_sent = 0;
|
||||||
bytes_sent = 0;
|
while (byte_left > 0) {
|
||||||
while( byte_left > 0 ) {
|
/* write data. */
|
||||||
// write data
|
num_written = send(sockfd,
|
||||||
num_written =
|
buffer + bytes_sent, byte_left,
|
||||||
send( sockfd, buffer + bytes_sent, byte_left,
|
MSG_DONTROUTE | MSG_NOSIGNAL);
|
||||||
MSG_DONTROUTE|MSG_NOSIGNAL);
|
if (num_written == -1) {
|
||||||
if( num_written == -1 ) {
|
|
||||||
#ifdef SO_NOSIGPIPE
|
#ifdef SO_NOSIGPIPE
|
||||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
setsockopt(sockfd, SOL_SOCKET,
|
||||||
|
SO_NOSIGPIPE, &old, olen);
|
||||||
#endif
|
#endif
|
||||||
return num_written;
|
return num_written;
|
||||||
}
|
}
|
||||||
|
byte_left = byte_left - num_written;
|
||||||
byte_left = byte_left - num_written;
|
bytes_sent += num_written;
|
||||||
bytes_sent += num_written;
|
}
|
||||||
}
|
numBytes = bytes_sent;
|
||||||
|
}
|
||||||
numBytes = bytes_sent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SO_NOSIGPIPE
|
#ifdef SO_NOSIGPIPE
|
||||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (numBytes < 0) {
|
||||||
|
return UPNP_E_SOCKET_ERROR;
|
||||||
|
}
|
||||||
|
/* subtract time used for reading/writing. */
|
||||||
|
if (*timeoutSecs != 0) {
|
||||||
|
*timeoutSecs -= time(NULL) - start_time;
|
||||||
|
}
|
||||||
|
|
||||||
if( numBytes < 0 ) {
|
return numBytes;
|
||||||
return UPNP_E_SOCKET_ERROR;
|
|
||||||
}
|
|
||||||
// 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,
|
||||||
* Function : sock_read
|
INOUT int *timeoutSecs)
|
||||||
*
|
|
||||||
* 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,
|
||||||
* Function : sock_write
|
INOUT int *timeoutSecs)
|
||||||
*
|
|
||||||
* 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -153,31 +153,15 @@ subscription *GetSubscriptionSID(const Upnp_SID sid, service_info *service)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function : GetNextSubscription
|
subscription *GetNextSubscription(service_info *service, subscription *current)
|
||||||
*
|
|
||||||
* 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;
|
time_t current_time;
|
||||||
subscription *next = NULL;
|
subscription *next = NULL;
|
||||||
subscription *previous = NULL;
|
subscription *previous = NULL;
|
||||||
int notDone = 1;
|
int notDone = 1;
|
||||||
|
|
||||||
//get the current_time
|
// get the current_time
|
||||||
time( ¤t_time );
|
time( ¤t_time );
|
||||||
while( ( notDone ) && ( current ) ) {
|
while( ( notDone ) && ( current ) ) {
|
||||||
previous = current;
|
previous = current;
|
||||||
@@ -202,52 +186,26 @@ GetNextSubscription( service_info * service,
|
|||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* 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;
|
subscription *GetFirstSubscription(service_info *service)
|
||||||
next = GetNextSubscription( service, &temp );
|
{
|
||||||
service->subscriptionList = temp.next;
|
subscription temp;
|
||||||
// service->subscriptionList=next;
|
subscription *next = NULL;
|
||||||
return next;
|
|
||||||
|
temp.next = service->subscriptionList;
|
||||||
|
next = GetNextSubscription(service, &temp);
|
||||||
|
service->subscriptionList = temp.next;
|
||||||
|
// service->subscriptionList = next;
|
||||||
|
|
||||||
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function : freeSubscription
|
void freeSubscription(subscription *sub)
|
||||||
*
|
|
||||||
* 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 ) {
|
if (sub) {
|
||||||
free_URL_list( &sub->DeliveryURLs );
|
free_URL_list(&sub->DeliveryURLs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
|
@@ -1,65 +1,59 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Purpose: This file contains a function for freeing the memory associated
|
|
||||||
* wuth a upnp time out event.
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
|
||||||
#include "upnp_timeout.h"
|
#include "upnp_timeout.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/************************************************************************
|
#include <stdlib.h> /* for free() */
|
||||||
* Function : free_upnp_timeout
|
|
||||||
*
|
|
||||||
* Parameters :
|
void free_upnp_timeout(upnp_timeout *event)
|
||||||
* 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 ) {
|
if (event->Event) {
|
||||||
if( event->Event )
|
free(event->Event);
|
||||||
free( event->Event );
|
}
|
||||||
free( event );
|
free(event);
|
||||||
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,52 +1,64 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GENA_CTRLPT_H
|
||||||
|
#define GENA_CTRLPT_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function : gena_process_notification_event
|
/*!
|
||||||
*
|
* \brief This function processes NOTIFY events that are sent by devices.
|
||||||
* Parameters:
|
*
|
||||||
* IN SOCKINFO *info: Socket structure containing the device socket
|
* Parameters:
|
||||||
* information
|
* IN SOCKINFO *info: Socket structure containing the device socket
|
||||||
* IN http_message_t* event: The http message contains the GENA
|
* information
|
||||||
* notification
|
* IN http_message_t *event: The http message contains the GENA
|
||||||
*
|
* notification
|
||||||
* Description:
|
*
|
||||||
* This function processes NOTIFY events that are sent by devices.
|
* \note called by genacallback()
|
||||||
* called by genacallback()
|
*/
|
||||||
*
|
void gena_process_notification_event(
|
||||||
* Returns: void
|
/*! [in] Socket info of the device. */
|
||||||
*
|
SOCKINFO *info,
|
||||||
* Note : called by genacallback()
|
/*! [in] The http message contains the GENA notification. */
|
||||||
****************************************************************************/
|
http_message_t *event);
|
||||||
void gena_process_notification_event( INOUT SOCKINFO *info,
|
|
||||||
IN http_message_t* request );
|
|
||||||
|
#endif /* GENA_CTRLPT_H */
|
||||||
|
|
||||||
|
@@ -1,88 +1,79 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GENA_DEVICE_H
|
||||||
|
#define GENA_DEVICE_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Function : gena_process_subscription_request
|
/*!
|
||||||
*
|
* \brief Handles a subscription request from a ctrl point. The socket is not
|
||||||
* Parameters :
|
* closed on return.
|
||||||
* IN SOCKINFO *info : socket info of the device
|
*/
|
||||||
* IN http_message_t* request : SUBSCRIPTION request from the control
|
void gena_process_subscription_request(
|
||||||
* point
|
/*! [in] Socket info of the device. */
|
||||||
*
|
SOCKINFO *info,
|
||||||
* Description : This function handles a subscription request from a
|
/*! [in] Subscription request from the control point. */
|
||||||
* ctrl point. The socket is not closed on return.
|
http_message_t *request);
|
||||||
*
|
|
||||||
* Return : void
|
|
||||||
*
|
|
||||||
* Note :
|
|
||||||
****************************************************************************/
|
|
||||||
void gena_process_subscription_request( IN SOCKINFO *info,
|
|
||||||
IN http_message_t* request );
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/*!
|
||||||
* Function : gena_process_subscription_renewal_request
|
* \brief Handles a subscription renewal request from a ctrl point.
|
||||||
*
|
* The connection is not destroyed on return.
|
||||||
* Parameters :
|
*/
|
||||||
* IN SOCKINFO *info : socket info of the device
|
void gena_process_subscription_renewal_request(
|
||||||
* IN http_message_t* request : subscription renewal request from the
|
/*! [in] Socket info of the device. */
|
||||||
* control point
|
SOCKINFO *info,
|
||||||
*
|
/*! [in] Subscription renewal request from the control point. */
|
||||||
* Description : This function handles a subscription renewal request
|
http_message_t *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 );
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/*!
|
||||||
* Function : gena_process_unsubscribe_request
|
* \brief Handles a subscription cancellation request from a ctrl point.
|
||||||
*
|
* The connection is not destroyed on return.
|
||||||
* Parameters :
|
*/
|
||||||
* IN SOCKINFO *info : socket info of the device
|
void gena_process_unsubscribe_request(
|
||||||
* IN http_message_t* request : UNSUBSCRIBE request from the control
|
/*! [in] Socket info of the device. */
|
||||||
* point
|
SOCKINFO *info,
|
||||||
*
|
/*! [in] UNSUBSCRIBE request from the control point. */
|
||||||
* Description : This function Handles a subscription cancellation request
|
http_message_t *request);
|
||||||
* from a ctrl point. The connection is not destroyed on return.
|
|
||||||
*
|
|
||||||
* Return : void
|
#endif /* GENA_DEVICE_H */
|
||||||
*
|
|
||||||
* Note :
|
|
||||||
****************************************************************************/
|
|
||||||
void gena_process_unsubscribe_request( IN SOCKINFO *info,
|
|
||||||
IN http_message_t* request );
|
|
||||||
|
@@ -1,42 +1,49 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef GENLIB_NET_HTTP_HTTPPARSER_H
|
#ifndef GENLIB_NET_HTTP_HTTPPARSER_H
|
||||||
#define GENLIB_NET_HTTP_HTTPPARSER_H
|
#define GENLIB_NET_HTTP_HTTPPARSER_H
|
||||||
|
|
||||||
#include "util.h"
|
|
||||||
#include "membuffer.h"
|
/*!
|
||||||
#include "uri.h"
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "LinkedList.h"
|
#include "LinkedList.h"
|
||||||
|
#include "membuffer.h"
|
||||||
|
#include "uri.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
////// private types ////////////
|
////// private types ////////////
|
||||||
|
|
||||||
@@ -478,27 +485,22 @@ int raw_find_str( IN memptr* raw_value, IN const char* str );
|
|||||||
************************************************************************/
|
************************************************************************/
|
||||||
const char* method_to_str( IN http_method_t method );
|
const char* method_to_str( IN http_method_t method );
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: print_http_headers
|
/*!
|
||||||
*
|
* \brief Print the HTTP headers.
|
||||||
* Parameters:
|
*/
|
||||||
* http_message_t* hmsg ; HTTP Message object
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* void
|
|
||||||
************************************************************************/
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void print_http_headers( IN http_message_t *hmsg );
|
void print_http_headers(
|
||||||
|
/*! [in] HTTP Message object. */
|
||||||
|
http_message_t *hmsg );
|
||||||
#else
|
#else
|
||||||
static UPNP_INLINE void print_http_headers( IN http_message_t *hmsg ) {}
|
static UPNP_INLINE void print_http_headers(http_message_t *hmsg) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} /* extern "C" */
|
||||||
#endif // __cplusplus
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
#endif // GENLIB_NET_HTTP_HTTPPARSER_H
|
#endif /* GENLIB_NET_HTTP_HTTPPARSER_H */
|
||||||
|
|
||||||
|
@@ -1,38 +1,43 @@
|
|||||||
/************************************************************************
|
/**************************************************************************
|
||||||
*
|
|
||||||
* Copyright (c) 2000-2003 Intel Corporation
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
* modification, are permitted provided that the following conditions are met:
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* * Redistributions of source code must retain the above copyright notice,
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* this list of conditions and the following disclaimer.
|
* modification, are permitted provided that the following conditions are met:
|
||||||
* * Redistributions in binary form must reproduce the above copyright notice,
|
*
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
* and/or other materials provided with the distribution.
|
* this list of conditions and the following disclaimer.
|
||||||
* Neither name of Intel Corporation nor the names of its contributors
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
* may be used to endorse or promote products derived from this software
|
* 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.
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#ifndef MINISERVER_H
|
#ifndef MINISERVER_H
|
||||||
#define MINISERVER_H
|
#define MINISERVER_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "sock.h"
|
#include "sock.h"
|
||||||
#include "httpparser.h"
|
#include "httpparser.h"
|
||||||
|
|
||||||
@@ -41,32 +46,43 @@ extern SOCKET gMiniServerStopSock;
|
|||||||
|
|
||||||
|
|
||||||
typedef struct MServerSockArray {
|
typedef struct MServerSockArray {
|
||||||
/* socket for listening for miniserver requests */
|
/*! IPv4 socket for listening for miniserver requests. */
|
||||||
SOCKET miniServerSock4;
|
SOCKET miniServerSock4;
|
||||||
|
/*! IPv6 Socket for listening for miniserver requests. */
|
||||||
SOCKET miniServerSock6;
|
SOCKET miniServerSock6;
|
||||||
/* socket for stopping miniserver */
|
/*! Socket for stopping miniserver */
|
||||||
SOCKET miniServerStopSock;
|
SOCKET miniServerStopSock;
|
||||||
/* socket for incoming advertisments and search requests */
|
/*! IPv4 SSDP Socket for incoming advertisments and search requests. */
|
||||||
SOCKET ssdpSock4;
|
SOCKET ssdpSock4;
|
||||||
|
/*! IPv6 SSDP Socket for incoming advertisments and search requests. */
|
||||||
SOCKET ssdpSock6;
|
SOCKET ssdpSock6;
|
||||||
|
/*! IPv6 SSDP Socket for incoming advertisments and search requests. */
|
||||||
SOCKET ssdpSock6UlaGua;
|
SOCKET ssdpSock6UlaGua;
|
||||||
|
/* ! . */
|
||||||
SOCKET stopPort;
|
SOCKET stopPort;
|
||||||
|
/* ! . */
|
||||||
SOCKET miniServerPort4;
|
SOCKET miniServerPort4;
|
||||||
|
/* ! . */
|
||||||
SOCKET miniServerPort6;
|
SOCKET miniServerPort6;
|
||||||
|
|
||||||
#ifdef INCLUDE_CLIENT_APIS
|
#ifdef INCLUDE_CLIENT_APIS
|
||||||
/* socket for sending search requests and receiving search replies */
|
/*! IPv4 SSDP socket for sending search requests and receiving search
|
||||||
|
* replies */
|
||||||
SOCKET ssdpReqSock4;
|
SOCKET ssdpReqSock4;
|
||||||
|
/*! IPv6 SSDP socket for sending search requests and receiving search
|
||||||
|
* replies */
|
||||||
SOCKET ssdpReqSock6;
|
SOCKET ssdpReqSock6;
|
||||||
#endif /* INCLUDE_CLIENT_APIS */
|
#endif /* INCLUDE_CLIENT_APIS */
|
||||||
} MiniServerSockArray;
|
} MiniServerSockArray;
|
||||||
|
|
||||||
|
|
||||||
|
/*! . */
|
||||||
typedef void (*MiniServerCallback)(
|
typedef void (*MiniServerCallback)(
|
||||||
|
/* ! . */
|
||||||
IN http_parser_t *parser,
|
IN http_parser_t *parser,
|
||||||
|
/* ! . */
|
||||||
IN http_message_t* request,
|
IN http_message_t* request,
|
||||||
IN SOCKINFO *info );
|
/* ! . */
|
||||||
|
IN SOCKINFO *info);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -118,9 +134,11 @@ void SetGenaCallback(
|
|||||||
* \li On error: UPNP_E_XXX.
|
* \li On error: UPNP_E_XXX.
|
||||||
*/
|
*/
|
||||||
int StartMiniServer(
|
int StartMiniServer(
|
||||||
/*! [in,out] Port on which the server listens for incoming IPv4 connections. */
|
/*! [in,out] Port on which the server listens for incoming IPv4
|
||||||
|
* connections. */
|
||||||
unsigned short *listen_port4,
|
unsigned short *listen_port4,
|
||||||
/*! [in,out] Port on which the server listens for incoming IPv6 connections. */
|
/*! [in,out] Port on which the server listens for incoming IPv6
|
||||||
|
* connections. */
|
||||||
unsigned short *listen_port6);
|
unsigned short *listen_port6);
|
||||||
|
|
||||||
|
|
||||||
|
@@ -29,149 +29,143 @@
|
|||||||
*
|
*
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#ifndef GENLIB_NET_SOCK_H
|
#ifndef GENLIB_NET_SOCK_H
|
||||||
#define GENLIB_NET_SOCK_H
|
#define GENLIB_NET_SOCK_H
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
/* Do not #include <netinet/in.h> */
|
/* Do not #include <netinet/in.h> */
|
||||||
#else
|
#else
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* The following are not defined under winsock.h */
|
||||||
/* Following variable is not defined under winsock.h */
|
|
||||||
#ifndef SD_RECEIVE
|
#ifndef SD_RECEIVE
|
||||||
#define SD_RECEIVE 0x00
|
#define SD_RECEIVE 0x00
|
||||||
#define SD_SEND 0x01
|
#define SD_SEND 0x01
|
||||||
#define SD_BOTH 0x02
|
#define SD_BOTH 0x02
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*! */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* handle/descriptor to a socket */
|
/*! Handle/descriptor to a socket. */
|
||||||
SOCKET socket;
|
SOCKET socket;
|
||||||
|
/*! The following two fields are filled only in incoming requests. */
|
||||||
/* the following two fields are filled only in incoming requests; */
|
|
||||||
struct sockaddr_storage foreign_sockaddr;
|
struct sockaddr_storage foreign_sockaddr;
|
||||||
} SOCKINFO;
|
} SOCKINFO;
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#extern "C" {
|
#extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Assign the passed in socket descriptor to socket descriptor in the
|
||||||
|
* SOCKINFO structure.
|
||||||
|
*
|
||||||
|
* \return Integer:
|
||||||
|
* \li \c UPNP_E_SUCCESS
|
||||||
|
* \li \c UPNP_E_OUTOF_MEMORY
|
||||||
|
* \li \c UPNP_E_SOCKET_ERROR
|
||||||
|
*/
|
||||||
|
int sock_init(
|
||||||
|
/*! Socket Information Object. */
|
||||||
|
OUT SOCKINFO *info,
|
||||||
|
/*! Socket Descriptor. */
|
||||||
|
IN SOCKET sockfd);
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function : sock_init
|
* \brief Calls the sock_init function and assigns the passed in IP address
|
||||||
*
|
* and port to the IP address and port in the SOCKINFO structure.
|
||||||
* Parameters :
|
*
|
||||||
* OUT SOCKINFO* info ; Socket Information Object
|
* \return Integer:
|
||||||
* IN SOCKET sockfd ; Socket Descriptor
|
* \li \c UPNP_E_SUCCESS
|
||||||
*
|
* \li \c UPNP_E_OUTOF_MEMORY
|
||||||
* Description : Assign the passed in socket descriptor to socket
|
* \li \c UPNP_E_SOCKET_ERROR
|
||||||
* descriptor in the SOCKINFO structure.
|
*/
|
||||||
*
|
|
||||||
* Return : int;
|
|
||||||
* UPNP_E_SUCCESS
|
|
||||||
* UPNP_E_OUTOF_MEMORY
|
|
||||||
* UPNP_E_SOCKET_ERROR
|
|
||||||
* Note :
|
|
||||||
************************************************************************/
|
|
||||||
int sock_init(OUT SOCKINFO* info, IN SOCKET sockfd);
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function : sock_init_with_ip
|
|
||||||
*
|
|
||||||
* Parameters :
|
|
||||||
* OUT SOCKINFO* info ; Socket Information Object
|
|
||||||
* IN SOCKET sockfd ; Socket Descriptor
|
|
||||||
* IN struct sockaddr* foreign_sockaddr; Remote socket address
|
|
||||||
*
|
|
||||||
* Description : Calls the sock_init function and assigns the passed in
|
|
||||||
* IP address and port to the IP address and port in the SOCKINFO
|
|
||||||
* structure.
|
|
||||||
*
|
|
||||||
* Return : int;
|
|
||||||
* UPNP_E_SUCCESS
|
|
||||||
* UPNP_E_OUTOF_MEMORY
|
|
||||||
* UPNP_E_SOCKET_ERROR
|
|
||||||
*
|
|
||||||
* Note :
|
|
||||||
************************************************************************/
|
|
||||||
int sock_init_with_ip(
|
int sock_init_with_ip(
|
||||||
|
/*! Socket Information Object. */
|
||||||
OUT SOCKINFO* info,
|
OUT SOCKINFO* info,
|
||||||
|
/*! Socket Descriptor. */
|
||||||
IN SOCKET sockfd,
|
IN SOCKET sockfd,
|
||||||
|
/*! Remote socket address. */
|
||||||
IN struct sockaddr *foreign_sockaddr);
|
IN struct sockaddr *foreign_sockaddr);
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function : sock_read
|
* \brief Reads data on socket in sockinfo.
|
||||||
*
|
*
|
||||||
* Parameters :
|
* \return Integer:
|
||||||
* IN SOCKINFO *info ; Socket Information Object
|
* \li \c numBytes - On Success, no of bytes received.
|
||||||
* OUT char* buffer ; Buffer to get data to
|
* \li \c UPNP_E_TIMEDOUT - Timeout.
|
||||||
* IN size_t bufsize ; Size of the buffer
|
* \li \c UPNP_E_SOCKET_ERROR - Error on socket calls.
|
||||||
* IN int *timeoutSecs ; timeout value
|
*/
|
||||||
*
|
int sock_read(
|
||||||
* Description : Reads data on socket in sockinfo
|
/*! Socket Information Object. */
|
||||||
*
|
IN SOCKINFO *info,
|
||||||
* Return : int;
|
/*! Buffer to get data to. */
|
||||||
* numBytes - On Success, no of bytes received
|
OUT char* buffer,
|
||||||
* UPNP_E_TIMEDOUT - Timeout
|
/*! Size of the buffer. */
|
||||||
* UPNP_E_SOCKET_ERROR - Error on socket calls
|
IN size_t bufsize,
|
||||||
*
|
/*! timeout value. */
|
||||||
* Note :
|
INOUT int *timeoutSecs);
|
||||||
************************************************************************/
|
|
||||||
int sock_read( IN SOCKINFO *info, OUT char* buffer, IN size_t bufsize,
|
|
||||||
INOUT int *timeoutSecs );
|
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function : sock_write
|
* \brief Writes data on the socket in sockinfo.
|
||||||
*
|
*
|
||||||
* Parameters :
|
* \return Integer:
|
||||||
* IN SOCKINFO *info ; Socket Information Object
|
* \li \c numBytes - On Success, no of bytes received.
|
||||||
* IN char* buffer ; Buffer to send data from
|
* \li \c UPNP_E_TIMEDOUT - Timeout.
|
||||||
* IN size_t bufsize ; Size of the buffer
|
* \li \c UPNP_E_SOCKET_ERROR - Error on socket calls.
|
||||||
* IN int *timeoutSecs ; timeout value
|
*/
|
||||||
*
|
int sock_write(
|
||||||
* Description : Writes data on the socket in sockinfo
|
/*! Socket Information Object. */
|
||||||
*
|
IN SOCKINFO *info,
|
||||||
* Return : int;
|
/*! Buffer to send data from. */
|
||||||
* numBytes - On Success, no of bytes sent
|
IN char* buffer,
|
||||||
* UPNP_E_TIMEDOUT - Timeout
|
/*! Size of the buffer. */
|
||||||
* UPNP_E_SOCKET_ERROR - Error on socket calls
|
IN size_t bufsize,
|
||||||
*
|
/*! timeout value. */
|
||||||
* Note :
|
INOUT int *timeoutSecs);
|
||||||
************************************************************************/
|
|
||||||
int sock_write( IN SOCKINFO *info, IN char* buffer, IN size_t bufsize,
|
|
||||||
INOUT int *timeoutSecs );
|
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function : sock_destroy
|
* \brief Shutsdown the socket using the ShutdownMethod to indicate whether
|
||||||
*
|
* sends and receives on the socket will be dis-allowed.
|
||||||
* Parameters :
|
*
|
||||||
* INOUT SOCKINFO* info ; Socket Information Object
|
* After shutting down the socket, closesocket is called to release system
|
||||||
* int ShutdownMethod ; How to shutdown the socket. Used by
|
* resources used by the socket calls.
|
||||||
* sockets's shutdown()
|
*
|
||||||
*
|
* \return Integer:
|
||||||
* Description : Shutsdown the socket using the ShutdownMethod to
|
* \li \c UPNP_E_SOCKET_ERROR on failure.
|
||||||
* indicate whether sends and receives on the socket will be
|
* \li \c UPNP_E_SUCCESS on success.
|
||||||
* dis-allowed. After shutting down the socket, closesocket is called
|
*/
|
||||||
* to release system resources used by the socket calls.
|
int sock_destroy(
|
||||||
*
|
/*! Socket Information Object. */
|
||||||
* Return : int;
|
INOUT SOCKINFO* info,
|
||||||
* UPNP_E_SOCKET_ERROR on failure
|
/*! How to shutdown the socket. Used by sockets's shutdown(). */
|
||||||
* UPNP_E_SUCCESS on success
|
int ShutdownMethod);
|
||||||
*
|
|
||||||
* Note :
|
|
||||||
************************************************************************/
|
|
||||||
int sock_destroy(INOUT SOCKINFO* info, int);
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Closes the socket if it is different from -1.
|
||||||
|
*
|
||||||
|
* \return -1 if an error occurred or if the socket is -1.
|
||||||
|
*/
|
||||||
|
static inline int sock_close(
|
||||||
|
/*! Socket descriptor. */
|
||||||
|
int sock)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (sock != -1) {
|
||||||
|
ret = UpnpCloseSocket(sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* #extern "C" */
|
} /* #extern "C" */
|
||||||
|
@@ -140,12 +140,12 @@ typedef void (* SsdpFunPtr)(Event *);
|
|||||||
|
|
||||||
typedef Event SsdpEvent ;
|
typedef Event SsdpEvent ;
|
||||||
|
|
||||||
//Structure to contain Discovery response
|
// Structure to contain Discovery response
|
||||||
typedef struct resultData
|
typedef struct resultData
|
||||||
{
|
{
|
||||||
struct Upnp_Discovery param;
|
struct Upnp_Discovery param;
|
||||||
void *cookie;
|
void *cookie;
|
||||||
Upnp_FunPtr ctrlpt_callback;
|
Upnp_FunPtr ctrlpt_callback;
|
||||||
}ResultData;
|
}ResultData;
|
||||||
|
|
||||||
|
|
||||||
@@ -224,12 +224,12 @@ int Make_Socket_NoBlocking (int sock);
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#ifdef INCLUDE_DEVICE_APIS
|
#ifdef INCLUDE_DEVICE_APIS
|
||||||
void ssdp_handle_device_request(
|
void ssdp_handle_device_request(
|
||||||
IN http_message_t* hmsg,
|
IN http_message_t *hmsg,
|
||||||
IN struct sockaddr* dest_addr );
|
IN struct sockaddr *dest_addr);
|
||||||
#else
|
#else
|
||||||
static inline void ssdp_handle_device_request(
|
static inline void ssdp_handle_device_request(
|
||||||
IN http_message_t* hmsg,
|
IN http_message_t *hmsg,
|
||||||
IN struct sockaddr* dest_addr ) {}
|
IN struct sockaddr* dest_addr) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@@ -253,10 +253,10 @@ static inline void ssdp_handle_device_request(
|
|||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
void ssdp_handle_ctrlpt_msg(
|
void ssdp_handle_ctrlpt_msg(
|
||||||
IN http_message_t* hmsg,
|
IN http_message_t *hmsg,
|
||||||
IN struct sockaddr* dest_addr,
|
IN struct sockaddr *dest_addr,
|
||||||
IN xboolean timeout,
|
IN xboolean timeout,
|
||||||
IN void* cookie );
|
IN void *cookie);
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Function : unique_service_name
|
* Function : unique_service_name
|
||||||
|
@@ -1,58 +1,62 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
******************************************************************************/
|
||||||
|
|
||||||
#ifndef _UPNPTIMEOUTH_
|
|
||||||
#define _UPNPTIMEOUTH_
|
|
||||||
|
|
||||||
|
#ifndef UPNPTIMEOUT_H
|
||||||
|
#define UPNPTIMEOUT_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* The upnp_timeout structure definition.
|
||||||
|
*/
|
||||||
typedef struct UPNP_TIMEOUT {
|
typedef struct UPNP_TIMEOUT {
|
||||||
int EventType;
|
int EventType;
|
||||||
int handle;
|
int handle;
|
||||||
int eventId;
|
int eventId;
|
||||||
void *Event;
|
void *Event;
|
||||||
} upnp_timeout;
|
} upnp_timeout;
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function : free_upnp_timeout
|
* \brief Free memory associated with event and memory for any sub-elements.
|
||||||
*
|
*/
|
||||||
* Parameters :
|
void free_upnp_timeout(
|
||||||
* upnp_timeout *event ; Event which needs to be freed
|
/*! [in] Event which needs to be freed. */
|
||||||
*
|
upnp_timeout *event);
|
||||||
* Description : Free memory associated with event and memory for any
|
|
||||||
* sub-elements
|
|
||||||
*
|
#endif /* UPNPTIMEOUT_H */
|
||||||
* Return : void ;
|
|
||||||
*
|
|
||||||
* Note :
|
|
||||||
************************************************************************/
|
|
||||||
void free_upnp_timeout(upnp_timeout *event);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@@ -1,37 +0,0 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
|
||||||
// and/or other materials provided with the distribution.
|
|
||||||
// * Neither name of Intel Corporation nor the names of its contributors
|
|
||||||
// may be used to endorse or promote products derived from this software
|
|
||||||
// without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifndef UPNPCLOSESOCKET_H
|
|
||||||
#define UPNPCLOSESOCKET_H
|
|
||||||
|
|
||||||
#define UpnpCloseSocket close
|
|
||||||
|
|
||||||
#endif
|
|
@@ -1,33 +1,33 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////
|
/**************************************************************************
|
||||||
//
|
*
|
||||||
// Copyright (c) 2000-2003 Intel Corporation
|
* Copyright (c) 2000-2003 Intel Corporation
|
||||||
// All rights reserved.
|
* All rights reserved.
|
||||||
//
|
*
|
||||||
// Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are met:
|
* 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.
|
* 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
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
// and/or other materials provided with the distribution.
|
* 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
|
* may be used to endorse or promote products derived from this software
|
||||||
// without specific prior written permission.
|
* without specific prior written permission.
|
||||||
//
|
*
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
*
|
||||||
///////////////////////////////////////////////////////////////////////////
|
**************************************************************************/
|
||||||
|
|
||||||
#ifndef GENLIB_NET_HTTP_WEBSERVER_H
|
#ifndef GENLIB_NET_HTTP_WEBSERVER_H
|
||||||
#define GENLIB_NET_HTTP_WEBSERVER_H
|
#define GENLIB_NET_HTTP_WEBSERVER_H
|
||||||
@@ -50,97 +50,83 @@ struct SendInstruction
|
|||||||
char RangeHeader[200];
|
char RangeHeader[200];
|
||||||
char AcceptLanguageHeader[200];
|
char AcceptLanguageHeader[200];
|
||||||
off_t RangeOffset;
|
off_t RangeOffset;
|
||||||
off_t ReadSendSize; // Read from local source and send on the network.
|
/*! Read from local source and send on the network. */
|
||||||
long RecvWriteSize; // Recv from the network and write into local file.
|
off_t ReadSendSize;
|
||||||
|
/*! Recv from the network and write into local file. */
|
||||||
//Later few more member could be added depending on the requirement.
|
long RecvWriteSize;
|
||||||
|
/* Later few more member could be added depending
|
||||||
|
* on the requirement.*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: web_server_init
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* none
|
|
||||||
*
|
|
||||||
* Description: Initilialize the different documents. Initialize the
|
|
||||||
* memory for root directory for web server. Call to initialize global
|
|
||||||
* XML document. Sets bWebServerState to WEB_SERVER_ENABLED
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* 0 - OK
|
|
||||||
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
|
|
||||||
************************************************************************/
|
|
||||||
int web_server_init( void );
|
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function: web_server_destroy
|
* \brief Initilialize the different documents. Initialize the memory
|
||||||
*
|
* for root directory for web server. Call to initialize global XML
|
||||||
* Parameters:
|
* document. Sets bWebServerState to WEB_SERVER_ENABLED.
|
||||||
* none
|
*
|
||||||
*
|
* \note alias_content is not freed here
|
||||||
* Description: Release memory allocated for the global web server root
|
*
|
||||||
* directory and the global XML document
|
* \return
|
||||||
* Resets the flag bWebServerState to WEB_SERVER_DISABLED
|
* \li \c 0 - OK
|
||||||
*
|
* \li \c UPNP_E_OUTOF_MEMORY
|
||||||
* Returns:
|
*/
|
||||||
* void
|
int web_server_init(void);
|
||||||
************************************************************************/
|
|
||||||
void web_server_destroy( void );
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: web_server_set_alias
|
|
||||||
*
|
|
||||||
* Parameters:
|
|
||||||
* alias_name: webserver name of alias; created by caller and freed by
|
|
||||||
* caller (doesn't even have to be malloc()d .)
|
|
||||||
* alias_content: the xml doc; this is allocated by the caller; and
|
|
||||||
* freed by the web server
|
|
||||||
* alias_content_length: length of alias body in bytes
|
|
||||||
* last_modified: time when the contents of alias were last
|
|
||||||
* changed (local time)
|
|
||||||
*
|
|
||||||
* Description: Replaces current alias with the given alias. To remove
|
|
||||||
* the current alias, set alias_name to NULL.
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* 0 - OK
|
|
||||||
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
|
|
||||||
************************************************************************/
|
|
||||||
int web_server_set_alias( IN const char* alias_name,
|
|
||||||
IN const char* alias_content, IN size_t alias_content_length,
|
|
||||||
IN time_t last_modified );
|
|
||||||
|
|
||||||
/************************************************************************
|
/*!
|
||||||
* Function: web_server_set_root_dir
|
* \brief Release memory allocated for the global web server root
|
||||||
*
|
* directory and the global XML document. Resets the flag bWebServerState
|
||||||
* Parameters:
|
* to WEB_SERVER_DISABLED.
|
||||||
* IN const char* root_dir ; String having the root directory for the
|
*/
|
||||||
* document
|
void web_server_destroy(void);
|
||||||
*
|
|
||||||
* Description: Assign the path specfied by the IN const char* root_dir
|
|
||||||
* parameter to the global Document root directory. Also check for
|
|
||||||
* path names ending in '/'
|
|
||||||
*
|
|
||||||
* Returns:
|
|
||||||
* int
|
|
||||||
************************************************************************/
|
|
||||||
int web_server_set_root_dir( IN const char* root_dir );
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* Function: web_server_callback
|
/*!
|
||||||
*
|
* \brief Replaces current alias with the given alias. To remove the current
|
||||||
* Parameters:
|
* alias, set alias_name to NULL.
|
||||||
* IN http_parser_t *parser,
|
*
|
||||||
* INOUT http_message_t* req,
|
* \note alias_content is not freed here
|
||||||
* IN SOCKINFO *info
|
*
|
||||||
*
|
* \return
|
||||||
* Description: main entry point into web server;
|
* \li \c 0 - OK
|
||||||
* handles HTTP GET and HEAD requests
|
* \li \c UPNP_E_OUTOF_MEMORY
|
||||||
*
|
*/
|
||||||
* Returns:
|
int web_server_set_alias(
|
||||||
* void
|
/*! [in] Webserver name of alias; created by caller and freed by caller
|
||||||
************************************************************************/
|
* (doesn't even have to be malloc()d. */
|
||||||
void web_server_callback( IN http_parser_t *parser, IN http_message_t* req, INOUT SOCKINFO *info );
|
const char* alias_name,
|
||||||
|
/*! [in] The xml doc; this is allocated by the caller; and freed by
|
||||||
|
* the web server. */
|
||||||
|
const char* alias_content,
|
||||||
|
/*! [in] Length of alias body in bytes. */
|
||||||
|
size_t alias_content_length,
|
||||||
|
/*! [in] Time when the contents of alias were last changed (local time). */
|
||||||
|
time_t last_modified);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Assign the path specfied by the input const char* root_dir parameter
|
||||||
|
* to the global Document root directory. Also check for path names ending
|
||||||
|
* in '/'.
|
||||||
|
*
|
||||||
|
* \return Integer.
|
||||||
|
*/
|
||||||
|
int web_server_set_root_dir(
|
||||||
|
/*! [in] String having the root directory for the document. */
|
||||||
|
const char* root_dir);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Main entry point into web server; Handles HTTP GET and HEAD
|
||||||
|
* requests.
|
||||||
|
*/
|
||||||
|
void web_server_callback(
|
||||||
|
/*! [in] . */
|
||||||
|
http_parser_t *parser,
|
||||||
|
/*! [in] . */
|
||||||
|
http_message_t *req,
|
||||||
|
/*! [in,out] . */
|
||||||
|
SOCKINFO *info);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@@ -74,11 +74,10 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
void send_search_result(IN void *data)
|
void send_search_result(IN void *data)
|
||||||
{
|
{
|
||||||
ResultData *temp = ( ResultData * ) data;
|
ResultData *temp = ( ResultData * ) data;
|
||||||
|
|
||||||
temp->ctrlpt_callback( UPNP_DISCOVERY_SEARCH_RESULT,
|
temp->ctrlpt_callback(UPNP_DISCOVERY_SEARCH_RESULT, &temp->param, temp->cookie);
|
||||||
&temp->param, temp->cookie );
|
free(temp);
|
||||||
free( temp );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@@ -127,7 +126,7 @@ void ssdp_handle_ctrlpt_msg(
|
|||||||
ListNode *node = NULL;
|
ListNode *node = NULL;
|
||||||
SsdpSearchArg *searchArg = NULL;
|
SsdpSearchArg *searchArg = NULL;
|
||||||
int matched = 0;
|
int matched = 0;
|
||||||
ResultData *threadData;
|
ResultData *threadData = NULL;
|
||||||
ThreadPoolJob job;
|
ThreadPoolJob job;
|
||||||
|
|
||||||
// we are assuming that there can be only one client supported at a time
|
// we are assuming that there can be only one client supported at a time
|
||||||
@@ -136,7 +135,7 @@ void ssdp_handle_ctrlpt_msg(
|
|||||||
|
|
||||||
if ( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
if ( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
|
||||||
HandleUnlock();
|
HandleUnlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// copy
|
// copy
|
||||||
ctrlpt_callback = ctrlpt_info->Callback;
|
ctrlpt_callback = ctrlpt_info->Callback;
|
||||||
@@ -146,14 +145,15 @@ void ssdp_handle_ctrlpt_msg(
|
|||||||
// search timeout
|
// search timeout
|
||||||
if ( timeout ) {
|
if ( timeout ) {
|
||||||
ctrlpt_callback( UPNP_DISCOVERY_SEARCH_TIMEOUT, NULL, cookie );
|
ctrlpt_callback( UPNP_DISCOVERY_SEARCH_TIMEOUT, NULL, cookie );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
param.ErrCode = UPNP_E_SUCCESS;
|
param.ErrCode = UPNP_E_SUCCESS;
|
||||||
|
|
||||||
// MAX-AGE
|
// MAX-AGE
|
||||||
param.Expires = -1; // assume error
|
// assume error
|
||||||
if( httpmsg_find_hdr( hmsg, HDR_CACHE_CONTROL, &hdr_value ) != NULL ) {
|
param.Expires = -1;
|
||||||
|
if ( httpmsg_find_hdr( hmsg, HDR_CACHE_CONTROL, &hdr_value ) != NULL ) {
|
||||||
if( matchstr( hdr_value.buf, hdr_value.length,
|
if( matchstr( hdr_value.buf, hdr_value.length,
|
||||||
"%imax-age = %d%0", ¶m.Expires ) != PARSE_OK )
|
"%imax-age = %d%0", ¶m.Expires ) != PARSE_OK )
|
||||||
return;
|
return;
|
||||||
@@ -161,7 +161,7 @@ void ssdp_handle_ctrlpt_msg(
|
|||||||
|
|
||||||
// DATE
|
// DATE
|
||||||
param.Date[0] = '\0';
|
param.Date[0] = '\0';
|
||||||
if( httpmsg_find_hdr( hmsg, HDR_DATE, &hdr_value ) != NULL ) {
|
if ( httpmsg_find_hdr( hmsg, HDR_DATE, &hdr_value ) != NULL ) {
|
||||||
linecopylen( param.Date, hdr_value.buf, hdr_value.length );
|
linecopylen( param.Date, hdr_value.buf, hdr_value.length );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,17 +170,17 @@ void ssdp_handle_ctrlpt_msg(
|
|||||||
|
|
||||||
// EXT
|
// EXT
|
||||||
param.Ext[0] = '\0';
|
param.Ext[0] = '\0';
|
||||||
if( httpmsg_find_hdr( hmsg, HDR_EXT, &hdr_value ) != NULL ) {
|
if ( httpmsg_find_hdr( hmsg, HDR_EXT, &hdr_value ) != NULL ) {
|
||||||
linecopylen( param.Ext, hdr_value.buf, hdr_value.length );
|
linecopylen( param.Ext, hdr_value.buf, hdr_value.length );
|
||||||
}
|
}
|
||||||
// LOCATION
|
// LOCATION
|
||||||
param.Location[0] = '\0';
|
param.Location[0] = '\0';
|
||||||
if( httpmsg_find_hdr( hmsg, HDR_LOCATION, &hdr_value ) != NULL ) {
|
if ( httpmsg_find_hdr( hmsg, HDR_LOCATION, &hdr_value ) != NULL ) {
|
||||||
linecopylen( param.Location, hdr_value.buf, hdr_value.length );
|
linecopylen( param.Location, hdr_value.buf, hdr_value.length );
|
||||||
}
|
}
|
||||||
// SERVER / USER-AGENT
|
// SERVER / USER-AGENT
|
||||||
param.Os[0] = '\0';
|
param.Os[0] = '\0';
|
||||||
if( httpmsg_find_hdr( hmsg, HDR_SERVER, &hdr_value ) != NULL ||
|
if ( httpmsg_find_hdr( hmsg, HDR_SERVER, &hdr_value ) != NULL ||
|
||||||
httpmsg_find_hdr( hmsg, HDR_USER_AGENT, &hdr_value ) != NULL ) {
|
httpmsg_find_hdr( hmsg, HDR_USER_AGENT, &hdr_value ) != NULL ) {
|
||||||
linecopylen( param.Os, hdr_value.buf, hdr_value.length );
|
linecopylen( param.Os, hdr_value.buf, hdr_value.length );
|
||||||
}
|
}
|
||||||
@@ -327,7 +327,7 @@ void ssdp_handle_ctrlpt_msg(
|
|||||||
TPJobInit( &job, ( start_routine ) send_search_result,
|
TPJobInit( &job, ( start_routine ) send_search_result,
|
||||||
threadData );
|
threadData );
|
||||||
TPJobSetPriority(&job, MED_PRIORITY);
|
TPJobSetPriority(&job, MED_PRIORITY);
|
||||||
TPJobSetFreeFunction( &job, ( free_routine ) free );
|
TPJobSetFreeFunction(&job, (free_routine)free);
|
||||||
ThreadPoolAdd(&gRecvThreadPool, &job, NULL);
|
ThreadPoolAdd(&gRecvThreadPool, &job, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -102,9 +102,9 @@ advertiseAndReplyThread( IN void *data )
|
|||||||
* 1 if successful else appropriate error
|
* 1 if successful else appropriate error
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
#ifdef INCLUDE_DEVICE_APIS
|
#ifdef INCLUDE_DEVICE_APIS
|
||||||
void
|
void ssdp_handle_device_request(
|
||||||
ssdp_handle_device_request( IN http_message_t *hmsg,
|
IN http_message_t *hmsg,
|
||||||
IN struct sockaddr *dest_addr )
|
IN struct sockaddr *dest_addr)
|
||||||
{
|
{
|
||||||
#define MX_FUDGE_FACTOR 10
|
#define MX_FUDGE_FACTOR 10
|
||||||
|
|
||||||
|
@@ -743,7 +743,7 @@ start_event_handler( void *Data )
|
|||||||
* Returns: void
|
* Returns: void
|
||||||
*
|
*
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static void ssdp_event_handler_thread(void * the_data)
|
static void ssdp_event_handler_thread(void *the_data)
|
||||||
{
|
{
|
||||||
ssdp_thread_data *data = (ssdp_thread_data *)the_data;
|
ssdp_thread_data *data = (ssdp_thread_data *)the_data;
|
||||||
http_message_t *hmsg = &data->parser.msg;
|
http_message_t *hmsg = &data->parser.msg;
|
||||||
@@ -755,10 +755,10 @@ static void ssdp_event_handler_thread(void * the_data)
|
|||||||
if (hmsg->method == HTTPMETHOD_NOTIFY ||
|
if (hmsg->method == HTTPMETHOD_NOTIFY ||
|
||||||
hmsg->request_method == HTTPMETHOD_MSEARCH) {
|
hmsg->request_method == HTTPMETHOD_MSEARCH) {
|
||||||
#ifdef INCLUDE_CLIENT_APIS
|
#ifdef INCLUDE_CLIENT_APIS
|
||||||
ssdp_handle_ctrlpt_msg(hmsg, (struct sockaddr*)&data->dest_addr, FALSE, NULL);
|
ssdp_handle_ctrlpt_msg(hmsg, (struct sockaddr *)&data->dest_addr, FALSE, NULL);
|
||||||
#endif /* INCLUDE_CLIENT_APIS */
|
#endif /* INCLUDE_CLIENT_APIS */
|
||||||
} else {
|
} else {
|
||||||
ssdp_handle_device_request(hmsg, (struct sockaddr*)&data->dest_addr);
|
ssdp_handle_device_request(hmsg, (struct sockaddr *)&data->dest_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* free data */
|
/* free data */
|
||||||
|
Reference in New Issue
Block a user