Compare commits
	
		
			41 Commits
		
	
	
		
			release-1.
			...
			release-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 6ac867bbb1 | ||
|   | 9052ca95be | ||
|   | ef7edf6cf8 | ||
|   | c65ec8a720 | ||
|   | 2d22e997e1 | ||
|   | 96dc968f18 | ||
|   | 8e846368e0 | ||
|   | d6671c464f | ||
|   | 699dd3c82e | ||
|   | 9be360bcd1 | ||
|   | 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 | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										92
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,3 +1,95 @@ | |||||||
|  | ******************************************************************************* | ||||||
|  | Version 1.6.9 | ||||||
|  | ******************************************************************************* | ||||||
|  |  | ||||||
|  | 2010-10-20 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  |  | ||||||
|  | 	Fix for bug introduced in samples code in svn revision 502, commit | ||||||
|  | 	git:25c908c558c8e60eb386c155a6b93add447ffec0 | ||||||
|  |  | ||||||
|  | 	Sample device and combo were aborting with the message: | ||||||
|  | 	"***** SampleUtil_Initialize was called multiple times!" | ||||||
|  |  | ||||||
|  | 2010-11-08 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com> | ||||||
|  |  | ||||||
|  | 	Make multiple SSDP advertisements faster. | ||||||
|  |  | ||||||
|  | 	Put the loop to send multiple copies of each SSDP advertisements in | ||||||
|  | 	ssdp_server.c instead of ssdp_device.c so we have only one call to | ||||||
|  | 	imillisleep ( SSDP_PAUSE ) to speed up advertisements. | ||||||
|  |  | ||||||
|  | 2010-11-05 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com> | ||||||
|  |  | ||||||
|  | 	Removing unused NUM_COPY variable. | ||||||
|  |  | ||||||
|  | 	Previously, NUM_COPY was used in ssdp_device.c to send multiple copies  | ||||||
|  | 	of each advertisements but also multiple replies to each M-SEARCH | ||||||
|  | 	request. As sending multiple replies is not compliant with HTTPU/MU | ||||||
|  | 	spec, NUM_COPY has been set to 1 in an older patch. However, as this | ||||||
|  | 	variable is not needed and has been replaced with SSDP_COPY, it has | ||||||
|  | 	been removed. | ||||||
|  |  | ||||||
|  | 2010-11-05 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com> | ||||||
|  |  | ||||||
|  | 	Use SSDP_COPY to send multiple SSDP advertisements. | ||||||
|  |  | ||||||
|  | 	Currently, SSDP_COPY is used only to send multiple M-SEARCH requests (in | ||||||
|  | 	ssdp_ctrlpt.c). With this patch, SSDP_COPY is also used to send multiple | ||||||
|  | 	copies of each advertisements packets (in ssdp_device.c). | ||||||
|  |  | ||||||
|  | 2010-11-01 Carl Benson <carl.benson(at)windriver.com> | ||||||
|  |  | ||||||
|  | 	Fix for Android build. | ||||||
|  |  | ||||||
|  | 	I had to do some modifications myself though, because the Android | ||||||
|  | 	build system insists on having a file named "util.h" taking precedence | ||||||
|  | 	in its include path, libupnp gets confused because of the same filename | ||||||
|  | 	in upnp/src/inc/util.h | ||||||
|  |  | ||||||
|  | ******************************************************************************* | ||||||
|  | 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.9 | ||||||
|  |  | ||||||
| # 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 \ | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								THANKS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								THANKS
									
									
									
									
									
								
							| @@ -13,12 +13,14 @@ exempt of errors. | |||||||
| - Arno Willig | - Arno Willig | ||||||
| - Bob Ciora | - Bob Ciora | ||||||
| - Carlo Parata | - Carlo Parata | ||||||
|  | - Carl Benson | ||||||
| - Chandra (inactiveneurons) | - Chandra (inactiveneurons) | ||||||
| - Chaos | - Chaos | ||||||
| - Charles Nepveu (cnepveu) | - Charles Nepveu (cnepveu) | ||||||
| - 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.9" | ||||||
|  |  | ||||||
| /* 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.9" | ||||||
|  |  | ||||||
| /* 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 9 | ||||||
|  |  | ||||||
| /* see upnpconfig.h */ | /* see upnpconfig.h */ | ||||||
| #define UPNP_VERSION_STRING "1.4.7" | #define UPNP_VERSION_STRING "1.6.9" | ||||||
|  |  | ||||||
| /* Version number of package */ | /* Version number of package */ | ||||||
| #define VERSION "1.4.7" | #define VERSION "1.6.9" | ||||||
|  |  | ||||||
| /* 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.9" | ||||||
|  |  | ||||||
| /** 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 9 | ||||||
|  |  | ||||||
| /** 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" | ||||||
| 				> | 				> | ||||||
|   | |||||||
							
								
								
									
										58
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								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.9], [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,56 @@ 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 # | ||||||
|  | dnl #AC_SUBST([LT_VERSION_IXML],       [2:5:0]) | ||||||
|  | dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:1:2]) | ||||||
|  | dnl #AC_SUBST([LT_VERSION_UPNP],       [4:1:0]) | ||||||
|  | dnl # | ||||||
|  | dnl ############################################################################ | ||||||
|  | dnl # Release 1.6.9: | ||||||
|  | dnl # "current:revision:age" | ||||||
|  | dnl # | ||||||
|  | dnl # - Code has changed in threadutil | ||||||
|  | dnl #	revision: 1 -> 2 | ||||||
|  | dnl # - Code has changed in upnp | ||||||
|  | dnl #	revision: 1 -> 2 | ||||||
|  | dnl # | ||||||
|  | dnl #AC_SUBST([LT_VERSION_IXML],       [2:5:0]) | ||||||
|  | dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:2:2]) | ||||||
|  | dnl #AC_SUBST([LT_VERSION_UPNP],       [4:2:0]) | ||||||
|  | dnl # | ||||||
|  |  ############################################################################ | ||||||
|  | AC_SUBST([LT_VERSION_IXML],       [2:5:0]) | ||||||
|  | AC_SUBST([LT_VERSION_THREADUTIL], [5:2:2]) | ||||||
|  | AC_SUBST([LT_VERSION_UPNP],       [4:2:0]) | ||||||
| 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 +526,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; | ||||||
| 	 | 	 | ||||||
|  | 	FILE *fp = stdout; | ||||||
|  | 	fprintf(fp, "(%s::%s), line %d", DbgFileName, FunctionName, DbgLineNo); | ||||||
|  | 	if (FmtStr) { | ||||||
|  | 		fprintf(fp, ": "); | ||||||
| 		va_start(ArgList, FmtStr); | 		va_start(ArgList, FmtStr); | ||||||
| 	vfprintf(stdout, FmtStr, ArgList); | 		vfprintf(fp, FmtStr, ArgList); | ||||||
| 	fflush(stdout); | 		fflush(fp); | ||||||
| 		va_end(ArgList); | 		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.9 | ||||||
| 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,38 +29,45 @@ | |||||||
|  * |  * | ||||||
|  ******************************************************************************/ |  ******************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
| #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 |  | ||||||
|  *  |  | ||||||
|  *   Description: |  | ||||||
|  * A timer thread similar to the one in the Upnp SDK that allows |  * 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 |  * the scheduling of a job to run at a specified time in the future. | ||||||
|  |  * | ||||||
|  * Because the timer thread uses the thread pool there is no  |  * Because the timer thread uses the thread pool there is no  | ||||||
|  * gurantee of timing, only approximate timing. |  * 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; | ||||||
| @@ -73,116 +80,88 @@ typedef struct TIMERTHREAD | |||||||
| } TimerThread; | } TimerThread; | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /*! | ||||||
|  * Name: TimerEvent |  | ||||||
|  *  |  | ||||||
|  *   Description: |  | ||||||
|  *      |  | ||||||
|  * Struct to contain information for a timer event. |  * Struct to contain information for a timer event. | ||||||
|  *     Internal to the TimerThread |  | ||||||
|  * |  * | ||||||
|  *****************************************************************************/ |  * 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; | ||||||
|  | 	/*! [in] Long term or short term job. */ | ||||||
|  | 	Duration persistent; | ||||||
| 	int id; | 	int id; | ||||||
| } TimerEvent; | } TimerEvent; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /*! | ||||||
|  |  * \brief Initializes and starts timer thread. | ||||||
| /************************************************************************ |  | ||||||
|  * Function: TimerThreadInit |  | ||||||
|  * |  * | ||||||
|  *  Description: |  * \return 0 on success, nonzero on failure. Returns error from | ||||||
|  *     Initializes and starts timer thread. |  * 	ThreadPoolAddPersistent on failure. | ||||||
|  * |  */ | ||||||
|  *  Parameters: | int TimerThreadInit( | ||||||
|  *             timer - valid timer thread pointer. | 	/*! [in] Valid timer thread pointer. */ | ||||||
|  *             tp  - valid thread pool to use. Must be | 	TimerThread *timer, | ||||||
|  *                   started. Must be valid for lifetime | 	/*! [in] Valid thread pool to use. Must be started. Must be valid for | ||||||
|  *                   of timer.  Timer must be shutdown | 	 * lifetime of timer. Timer must be shutdown BEFORE thread pool. */ | ||||||
|  *                   BEFORE thread pool. |  | ||||||
|  *  Return: |  | ||||||
|  *            0 on success, nonzero on failure |  | ||||||
|  *            Returns error from ThreadPoolAddPersistent on failure. |  | ||||||
|  * |  | ||||||
|  ************************************************************************/ |  | ||||||
| int TimerThreadInit(TimerThread *timer, |  | ||||||
| 	ThreadPool *tp); | 	ThreadPool *tp); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /*! | ||||||
|  * Function: TimerThreadSchedule |  * \brief Schedules an event to run at a specified time. | ||||||
|  * |  * | ||||||
|  *  Description: |  * \return 0 on success, nonzero on failure, EOUTOFMEM if not enough memory | ||||||
|  *     Schedules an event to run at a specified time. |  * 	to schedule job. | ||||||
|  * |  */ | ||||||
|  *  Parameters: | int TimerThreadSchedule( | ||||||
|  *             timer - valid timer thread pointer. | 	/*! [in] Valid timer thread pointer. */ | ||||||
|  *             time_t - time of event. | 	TimerThread* timer, | ||||||
|  *                      either in absolute seconds, | 	/*! [in] time of event. Either in absolute seconds, or relative | ||||||
|  *                      or relative seconds in the future. | 	 * seconds in the future. */ | ||||||
|  *             timeoutType - either ABS_SEC, or REL_SEC. |  | ||||||
|  *                           if REL_SEC, then the event |  | ||||||
|  *                           will be scheduled at the |  | ||||||
|  *                           current time + REL_SEC. |  | ||||||
|  *             job-> valid Thread pool job with following fields |  | ||||||
|  *             func - function to schedule |  | ||||||
|  *             arg - argument to function |  | ||||||
|  *             priority - priority of job. |  | ||||||
|  *          |  | ||||||
|  *             id - id of timer event. (out, can be null) |  | ||||||
|  *  Return: |  | ||||||
|  *            0 on success, nonzero on failure |  | ||||||
|  *            EOUTOFMEM if not enough memory to schedule job. |  | ||||||
|  * |  | ||||||
|  ************************************************************************/ |  | ||||||
| int TimerThreadSchedule(TimerThread* timer, |  | ||||||
| 	time_t time,  | 	time_t time,  | ||||||
|  | 	/*! [in] either ABS_SEC, or REL_SEC. If REL_SEC, then the event | ||||||
|  | 	 * will be scheduled at the current time + REL_SEC. */ | ||||||
| 	TimeoutType type, | 	TimeoutType type, | ||||||
|  | 	/*! [in] Valid Thread pool job with following fields. */ | ||||||
| 	ThreadPoolJob *job, | 	ThreadPoolJob *job, | ||||||
|  | 	/*! [in] . */ | ||||||
| 	Duration duration, | 	Duration duration, | ||||||
|  | 	/*! [in] Id of timer event. (out, can be null). */ | ||||||
| 	int *id); | 	int *id); | ||||||
|  |  | ||||||
| /************************************************************************ |  | ||||||
|  * Function: TimerThreadRemove | /*! | ||||||
|  |  * \brief Removes an event from the timer Q. | ||||||
|  * |  * | ||||||
|  *  Description: |  * Events can only be removed before they have been placed in the thread pool. | ||||||
|  *     Removes an event from the timer Q. |  | ||||||
|  *     Events can only be removed  |  | ||||||
|  *     before they have been placed in the |  | ||||||
|  *     thread pool. |  | ||||||
|  * |  * | ||||||
|  *  Parameters: |  * \return 0 on success, INVALID_EVENT_ID on failure. | ||||||
|  *             timer - valid timer thread pointer. |  */ | ||||||
|  *             id - id of event to remove. | int TimerThreadRemove( | ||||||
|  *             ThreadPoolJob *out - space for thread pool job. | 	/*! [in] Valid timer thread pointer. */ | ||||||
|  *  Return: | 	TimerThread *timer, | ||||||
|  *            0 on success,  | 	/*! [in] Id of event to remove. */ | ||||||
|  *            INVALID_EVENT_ID on failure |  | ||||||
|  *			  |  | ||||||
|  ************************************************************************/ |  | ||||||
| int TimerThreadRemove(TimerThread *timer, |  | ||||||
| 	int id, | 	int id, | ||||||
|  | 	/*! [in] Space for thread pool job. */ | ||||||
| 	ThreadPoolJob *out); | 	ThreadPoolJob *out); | ||||||
|  |  | ||||||
| /************************************************************************ |  | ||||||
|  * Function: TimerThreadShutdown | /*! | ||||||
|  |  * \brief Shutdown the timer thread. | ||||||
|  * |  * | ||||||
|  *  Description: |  | ||||||
|  *    Shutdown the timer thread |  | ||||||
|  * Events scheduled in the future will NOT be run. |  * Events scheduled in the future will NOT be run. | ||||||
|  *    Timer thread should be shutdown BEFORE it's associated |  * | ||||||
|  *    thread pool. |  * Timer thread should be shutdown BEFORE it's associated thread pool. | ||||||
|  *  Returns: |  * | ||||||
|  *    returns 0 if succesfull, |  * \return 0 if succesfull, nonzero otherwise. Always returns 0. | ||||||
|  *            nonzero otherwise. |  */ | ||||||
|  *            Always returns 0. | int TimerThreadShutdown( | ||||||
|  ***********************************************************************/    | 	/*! [in] Valid timer thread pointer. */ | ||||||
| int TimerThreadShutdown(TimerThread *timer); | 	TimerThread *timer); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
|   | |||||||
| @@ -188,7 +188,10 @@ typedef pthread_rwlockattr_t ithread_rwlockattr_t; | |||||||
|  *      Internal Use Only |  *      Internal Use Only | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #if UPNP_USE_RWLOCK | #if UPNP_USE_RWLOCK | ||||||
| typedef pthread_rwlock_t ithread_rwlock_t; | 	typedef pthread_rwlock_t ithread_rwlock_t; | ||||||
|  | #else | ||||||
|  | 	/* Read-write locks aren't available: use mutex instead. */ | ||||||
|  | 	typedef ithread_mutex_t ithread_rwlock_t; | ||||||
| #endif /* UPNP_USE_RWLOCK */ | #endif /* UPNP_USE_RWLOCK */ | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -337,7 +340,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) { | |||||||
| 	#define ithread_mutexattr_setkind_np pthread_mutexattr_settype | 	#define ithread_mutexattr_setkind_np pthread_mutexattr_settype | ||||||
| #else | #else | ||||||
| 	#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np | 	#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np | ||||||
| #endif | #endif /* UPNP_USE_RWLOCK */ | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_mutexattr_getkind_np |  * Function: ithread_mutexattr_getkind_np | ||||||
| @@ -362,7 +365,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) { | |||||||
| 	#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype | 	#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype | ||||||
| #else | #else | ||||||
| 	#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np | 	#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np | ||||||
| #endif | #endif /* UPNP_USE_RWLOCK */ | ||||||
|  |  | ||||||
|    |    | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -536,8 +539,10 @@ static UPNP_INLINE int ithread_cleanup_thread(void) { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #if UPNP_USE_RWLOCK | #if UPNP_USE_RWLOCK | ||||||
| 	#define ithread_rwlock_init pthread_rwlock_init | 	#define ithread_rwlock_init pthread_rwlock_init | ||||||
| #endif /* UPNP_USE_RWLOCK */ | #else | ||||||
|  | 	/* Read-write locks aren't available: use mutex instead. */ | ||||||
|  | 	#define ithread_rwlock_init ithread_mutex_init | ||||||
|  | #endif | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_rwlock_rdlock |  * Function: ithread_rwlock_rdlock | ||||||
| @@ -555,9 +560,11 @@ static UPNP_INLINE int ithread_cleanup_thread(void) { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #if UPNP_USE_RWLOCK | #if UPNP_USE_RWLOCK | ||||||
| 	#define ithread_rwlock_rdlock pthread_rwlock_rdlock | 	#define ithread_rwlock_rdlock pthread_rwlock_rdlock | ||||||
|  | #else | ||||||
|  | 	/* Read-write locks aren't available: use mutex instead. */ | ||||||
|  | 	#define ithread_rwlock_rdlock ithread_mutex_lock | ||||||
| #endif /* UPNP_USE_RWLOCK */ | #endif /* UPNP_USE_RWLOCK */ | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_rwlock_wrlock |  * Function: ithread_rwlock_wrlock | ||||||
|  * |  * | ||||||
| @@ -574,6 +581,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #if UPNP_USE_RWLOCK | #if UPNP_USE_RWLOCK | ||||||
| 	#define ithread_rwlock_wrlock pthread_rwlock_wrlock | 	#define ithread_rwlock_wrlock pthread_rwlock_wrlock | ||||||
|  | #else | ||||||
|  | 	/* Read-write locks aren't available: use mutex instead. */ | ||||||
|  | 	#define ithread_rwlock_wrlock ithread_mutex_lock | ||||||
| #endif /* UPNP_USE_RWLOCK */ | #endif /* UPNP_USE_RWLOCK */ | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -594,6 +604,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #if UPNP_USE_RWLOCK | #if UPNP_USE_RWLOCK | ||||||
| 	#define ithread_rwlock_unlock pthread_rwlock_unlock | 	#define ithread_rwlock_unlock pthread_rwlock_unlock | ||||||
|  | #else | ||||||
|  | 	/* Read-write locks aren't available: use mutex instead. */ | ||||||
|  | 	#define ithread_rwlock_unlock ithread_mutex_unlock | ||||||
| #endif /* UPNP_USE_RWLOCK */ | #endif /* UPNP_USE_RWLOCK */ | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -615,6 +628,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #if UPNP_USE_RWLOCK | #if UPNP_USE_RWLOCK | ||||||
| 	#define ithread_rwlock_destroy pthread_rwlock_destroy | 	#define ithread_rwlock_destroy pthread_rwlock_destroy | ||||||
|  | #else | ||||||
|  | 	/* Read-write locks aren't available: use mutex instead. */ | ||||||
|  | 	#define ithread_rwlock_destroy ithread_mutex_destroy | ||||||
| #endif /* UPNP_USE_RWLOCK */ | #endif /* UPNP_USE_RWLOCK */ | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 |  | ||||||
|  *      id - id of job |  | ||||||
|  *       |  | ||||||
|  *  Returns: |  | ||||||
|  *      TimerEvent * on success, NULL on failure. |  | ||||||
|  ****************************************************************************/ |  | ||||||
| static TimerEvent * |  | ||||||
| CreateTimerEvent( TimerThread * timer, |  | ||||||
|                   ThreadPoolJob * job, |  | ||||||
| 	Duration persistent, | 	Duration persistent, | ||||||
|  | 	/*! [in] The absoule time of the event in seconds from Jan, 1970. */ | ||||||
| 	time_t eventTime, | 	time_t eventTime, | ||||||
|                   int id ) | 	/*! [in] Id of job. */ | ||||||
|  | 	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: |  | ||||||
|  *     Schedules an event to run at a specified time. |  | ||||||
|  * |  | ||||||
|  *  Parameters: |  | ||||||
|  *             timer - valid timer thread pointer. |  | ||||||
|  *             time_t - time of event. |  | ||||||
|  *                      either in absolute seconds, |  | ||||||
|  *                      or relative seconds in the future. |  | ||||||
|  *             timeoutType - either ABS_SEC, or REL_SEC. |  | ||||||
|  *                           if REL_SEC, then the event |  | ||||||
|  *                           will be scheduled at the |  | ||||||
|  *                           current time + REL_SEC. |  | ||||||
|  *              |  | ||||||
|  *             func - function to schedule |  | ||||||
|  *             arg - argument to function |  | ||||||
|  *             priority - priority of job. |  | ||||||
|  *             id - id of timer event. (out) |  | ||||||
|  *  Return: |  | ||||||
|  *            0 on success, nonzero on failure |  | ||||||
|  *			  EOUTOFMEM if not enough memory to schedule job |  | ||||||
|  ************************************************************************/ |  | ||||||
| int |  | ||||||
| TimerThreadSchedule( TimerThread * timer, |  | ||||||
| 	time_t timeout, | 	time_t timeout, | ||||||
| 	TimeoutType type, | 	TimeoutType type, | ||||||
|                      ThreadPoolJob * job, | 	ThreadPoolJob *job, | ||||||
| 	Duration duration, | 	Duration duration, | ||||||
|                      int *id ) | 	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: |  | ||||||
|  *     Removes an event from the timer Q. |  | ||||||
|  *     Events can only be removed  |  | ||||||
|  *     before they have been placed in the |  | ||||||
|  *     thread pool. |  | ||||||
|  * |  | ||||||
|  *  Parameters: |  | ||||||
|  *             timer - valid timer thread pointer. |  | ||||||
|  *             id - id of event to remove. |  | ||||||
|  *             out - space for returned job (Can be NULL) |  | ||||||
|  *  Return: |  | ||||||
|  *            0 on success. |  | ||||||
|  *            INVALID_EVENT_ID on error. |  | ||||||
|  * |  | ||||||
|  ************************************************************************/ |  | ||||||
| int |  | ||||||
| TimerThreadRemove( TimerThread * timer, |  | ||||||
| 	int id, | 	int id, | ||||||
|                    ThreadPoolJob * out ) | 	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,12 +67,10 @@ 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 \ | ||||||
| 	src/inc/util.h \ | 	src/inc/upnputil.h \ | ||||||
| 	src/inc/utilall.h \ |  | ||||||
| 	src/inc/uuid.h \ | 	src/inc/uuid.h \ | ||||||
| 	src/inc/VirtualDir.h \ | 	src/inc/VirtualDir.h \ | ||||||
| 	src/inc/webserver.h | 	src/inc/webserver.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  |  * \brief Creates an action request packet based on its input parameters | ||||||
|  *  should have a matching value argument.  |  * (status variable name and value pair). | ||||||
|  * |  * | ||||||
|  *  @return [IXML_Document*] The action node of {\bf Upnp_Document} type or  |  * Any number of input parameters can be passed to this function but every | ||||||
|  *                      {\tt NULL} if the operation failed. |  * input variable name should have a matching value argument.  | ||||||
|  |  * | ||||||
|  |  * It is a wrapper function that calls makeAction() function to create the | ||||||
|  |  * action request. | ||||||
|  |  *  | ||||||
|  |  * \return The action node of \b Upnp_Document type or <tt>NULL</tt> if the | ||||||
|  |  * 	operation failed. | ||||||
|  */ |  */ | ||||||
|  | EXPORT_SPEC IXML_Document *UpnpMakeAction( | ||||||
|  | 	/*! [in] Name of the action request or response. */ | ||||||
|  | 	const char *ActionName, | ||||||
|  | 	/*! [in] The service type. */ | ||||||
|  | 	const char *ServType, | ||||||
|  | 	/*! [in] Number of argument pairs to be passed. */ | ||||||
|  | 	int NumArg, | ||||||
|  | 	/*! [in] pointer to the first argument. */ | ||||||
|  | 	const char *Arg, | ||||||
|  | 	/*! [in] Argument list. */ | ||||||
|  | 	...); | ||||||
|  |  | ||||||
| EXPORT_SPEC IXML_Document* UpnpMakeAction( |  | ||||||
|     IN const char * ActionName, /** The action name. */ |  | ||||||
|     IN const char * ServType,   /** The service type.  */ |  | ||||||
|     IN int NumArg,              /** Number of argument pairs to be passed. */  |  | ||||||
|     IN const char * Arg,        /** Status variable name and value pair. */ |  | ||||||
|     IN ...                   /*  Other status variable name and value pairs. */ |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
| /** {\bf UpnpAddToAction} creates an action request packet based on its input  | /*! | ||||||
|  *  parameters (status variable name and value pair). This API is specially  |  * \brief Ceates an action response packet based on its output parameters | ||||||
|  *  suitable inside a loop to add any number input parameters into an existing |  * (status variable name and value pair). | ||||||
|  *  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} |  * output 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  |  *  | ||||||
|  |  * \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. |  *		complete this operation. | ||||||
|  *    \end{itemize} |  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| 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 |  * \brief Creates an action response packet based on its output parameters | ||||||
|  *  variable name should have a matching value argument.  |  * (status variable name and value pair). | ||||||
|  * |  * | ||||||
|  *  @return [IXML_Document*] The action node of {\bf Upnp_Document} type or  |  * This API is especially suitable inside a loop to add any number of input | ||||||
|  *                           {\tt NULL} if the operation failed. |  * parameters into an existing action response. If no action document exists | ||||||
|  */ |  * in the beginning, a \b Upnp_Document variable initialized with <tt>NULL</tt> | ||||||
|  |  * should be passed as a parameter. | ||||||
| EXPORT_SPEC IXML_Document* UpnpMakeActionResponse( |  | ||||||
|     IN const char * ActionName, /** The action name. */ |  | ||||||
|     IN const char * ServType,   /** The service type.  */ |  | ||||||
|     IN int NumArg,              /** The number of argument pairs passed. */   |  | ||||||
|     IN const char * Arg,        /** The status variable name and value pair. */ |  | ||||||
|     IN ...                   /*  Other status variable name and value pairs. */ |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
| /** {\bf UpnpAddToActionResponse} creates an action response |  | ||||||
|  *  packet based on its output parameters (status variable name |  | ||||||
|  *  and value pair). This API is especially suitable inside |  | ||||||
|  *  a loop to add any number of input parameters into an existing action  |  | ||||||
|  *  response. If no action document exists in the beginning, a  |  | ||||||
|  *  {\bf Upnp_Document} variable initialized with {\tt NULL} should be passed  |  | ||||||
|  *  as a parameter. |  | ||||||
|  * |  * | ||||||
|  *  @return [int] An integer representing one of the following: |  * It is a wrapper function that calls addToAction() function to add the | ||||||
|  *    \begin{itemize} |  * argument in the action request. | ||||||
|  *      \item {\tt UPNP_E_SUCCESS}: The operation completed successfully. |  *  | ||||||
|  *      \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters  |  * \return An integer representing one of the following: | ||||||
|  *                                        are invalid. |  *	\li <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully. | ||||||
|  *      \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to  |  *	\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. |  *		complete this operation. | ||||||
|  *    \end{itemize} |  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| 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: |  * Any number of input parameters can be passed to this function but every | ||||||
|  *    \begin{itemize} |  * input variable name should have a matching value input argument. | ||||||
|  *      \item {\tt UPNP_E_SUCCESS}: The operation completed successfully. |  *   | ||||||
|  *      \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters  |  * \return <tt>NULL</tt> on failure, or the property-set document node. | ||||||
|  *                                        are invalid. |  */ | ||||||
|  *      \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to  | 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. |  *		complete this operation. | ||||||
|  *    \end{itemize} |  | ||||||
|  * |  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| 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 */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -82,9 +82,6 @@ int SampleUtil_Initialize(print_string print_function) | |||||||
| 		ithread_mutex_unlock(&display_mutex); | 		ithread_mutex_unlock(&display_mutex); | ||||||
|  |  | ||||||
| 		initialize_init = 0; | 		initialize_init = 0; | ||||||
| 	} else { |  | ||||||
| 		SampleUtil_Print("***** SampleUtil_Initialize was called multiple times!\n"); |  | ||||||
| 		abort(); |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return UPNP_E_SUCCESS; | 	return UPNP_E_SUCCESS; | ||||||
| @@ -428,8 +425,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 +465,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 +539,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 +584,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 +597,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 | ||||||
| @@ -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,9 +443,7 @@ 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; | ||||||
| @@ -452,42 +451,44 @@ TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request | |||||||
|  |  | ||||||
| 	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; | ||||||
|  | 		if (strcmp(devUDN, tv_service_table[i].UDN) == 0 && | ||||||
|  | 		    strcmp(serviceID, tv_service_table[i].ServiceId) == 0) { | ||||||
| 			// check variable name | 			// check variable name | ||||||
|             for( j = 0; j < tv_service_table[i].VariableCount; j++ ) { | 			for (j = 0; j < tv_service_table[i].VariableCount; j++) { | ||||||
|                 if( strcmp( cgv_event->StateVarName, | 				const char *stateVarName = | ||||||
|                             tv_service_table[i].VariableName[j] ) == 0 ) { | 					cgv_event->StateVarName; | ||||||
|  | 				if (strcmp(stateVarName, | ||||||
|  | 					   tv_service_table[i].VariableName[j]) == 0) { | ||||||
| 					getvar_succeeded = 1; | 					getvar_succeeded = 1; | ||||||
|                     cgv_event->CurrentVal = | 					cgv_event->CurrentVal = ixmlCloneDOMString( | ||||||
|                         ixmlCloneDOMString( tv_service_table[i]. | 						tv_service_table[i].VariableStrVal[j]); | ||||||
|                                             VariableStrVal[j] ); |  | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	if (getvar_succeeded) { | ||||||
|     if( getvar_succeeded ) { |  | ||||||
| 		cgv_event->ErrCode = UPNP_E_SUCCESS; | 		cgv_event->ErrCode = UPNP_E_SUCCESS; | ||||||
| 	} else { | 	} else { | ||||||
|         SampleUtil_Print | 		SampleUtil_Print( | ||||||
|             ( "Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" ); | 			"Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" | ||||||
|         SampleUtil_Print( "   Unknown variable name = %s\n", | 			"   Unknown variable name = %s\n", | ||||||
|                           cgv_event->StateVarName ); | 			cgv_event->StateVarName); | ||||||
| 		cgv_event->ErrCode = 404; | 		cgv_event->ErrCode = 404; | ||||||
|         strcpy( cgv_event->ErrStr, "Invalid Variable" ); | 		strcpy(cgv_event->ErrStr, "Invalid Variable"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     ithread_mutex_unlock( &TVDevMutex ); | 	ithread_mutex_unlock(&TVDevMutex); | ||||||
|  |  | ||||||
|     return ( cgv_event->ErrCode == UPNP_E_SUCCESS ); | 	return cgv_event->ErrCode == UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
| @@ -502,62 +503,47 @@ 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 action_found = 0; | ||||||
| 	int i = 0; | 	int i = 0; | ||||||
| 	int service = -1; | 	int service = -1; | ||||||
| 	int retCode = 0; | 	int retCode = 0; | ||||||
| 	char *errorString = NULL; | 	char *errorString = NULL; | ||||||
|  | 	const char *devUDN = 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; | 		service = TV_SERVICE_CONTROL; | ||||||
|     } else if( ( strcmp( ca_event->DevUDN, | 	} else if (strcmp(devUDN,    tv_service_table[TV_SERVICE_PICTURE].UDN) == 0 && | ||||||
|                          tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 ) | 		   strcmp(serviceID, tv_service_table[TV_SERVICE_PICTURE].ServiceId) == 0) { | ||||||
|                && | 		/* Request for action in the TvDevice Picture Service. */ | ||||||
|                ( strcmp |  | ||||||
|                  ( ca_event->ServiceID, |  | ||||||
|                    tv_service_table[TV_SERVICE_PICTURE].ServiceId ) == |  | ||||||
|                  0 ) ) { |  | ||||||
|         /* |  | ||||||
|            Request for action in the TvDevice Picture Service  |  | ||||||
|          */ |  | ||||||
| 		service = TV_SERVICE_PICTURE; | 		service = TV_SERVICE_PICTURE; | ||||||
| 	} | 	} | ||||||
|     //Find and call appropriate procedure based on action name | 	/* Find and call appropriate procedure based on action name. | ||||||
|     //Each action name has an associated procedure stored in the | 	 * Each action name has an associated procedure stored in the | ||||||
|     //service table. These are set at initialization. | 	 * service table. These are set at initialization. */ | ||||||
|  | 	for (i = 0; | ||||||
|     for( i = 0; ( ( i < TV_MAXACTIONS ) && | 	     i < TV_MAXACTIONS && tv_service_table[service].ActionNames[i] != NULL; | ||||||
|                   ( tv_service_table[service].ActionNames[i] != NULL ) ); | 	     i++) { | ||||||
|          i++ ) { | 		if (!strcmp(actionName, tv_service_table[service].ActionNames[i])) { | ||||||
|  | 			if (!strcmp(tv_service_table[TV_SERVICE_CONTROL]. | ||||||
|         if( !strcmp( ca_event->ActionName, | 					VariableStrVal[TV_CONTROL_POWER], "1") || | ||||||
|                      tv_service_table[service].ActionNames[i] ) ) { | 			    !strcmp(actionName, "PowerOn")) { | ||||||
|  | 				retCode = tv_service_table[service].actions[i]( | ||||||
|             if( ( !strcmp( tv_service_table[TV_SERVICE_CONTROL]. | 					ca_event->ActionRequest, | ||||||
|                            VariableStrVal[TV_CONTROL_POWER], "1" ) ) | 					&ca_event->ActionResult, | ||||||
|                 || ( !strcmp( ca_event->ActionName, "PowerOn" ) ) ) { | 					&errorString); | ||||||
|                 retCode = |  | ||||||
|                     tv_service_table[service].actions[i] ( ca_event-> |  | ||||||
|                                                            ActionRequest, |  | ||||||
|                                                            &ca_event-> |  | ||||||
|                                                            ActionResult, |  | ||||||
|                     &errorString ); |  | ||||||
| 			} else { | 			} else { | ||||||
| 				errorString = "Power is Off"; | 				errorString = "Power is Off"; | ||||||
| 				retCode = UPNP_E_INTERNAL_ERROR; | 				retCode = UPNP_E_INTERNAL_ERROR; | ||||||
| @@ -567,34 +553,29 @@ TvDeviceHandleActionRequest( INOUT struct Upnp_Action_Request *ca_event ) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     if( !action_found ) { | 	if (!action_found) { | ||||||
| 		ca_event->ActionResult = NULL; | 		ca_event->ActionResult = NULL; | ||||||
|         strcpy( ca_event->ErrStr, "Invalid Action" ); | 		strcpy(ca_event->ErrStr, "Invalid Action"); | ||||||
| 		ca_event->ErrCode = 401; | 		ca_event->ErrCode = 401; | ||||||
| 	} else { | 	} else { | ||||||
|         if( retCode == UPNP_E_SUCCESS ) { | 		if (retCode == UPNP_E_SUCCESS) { | ||||||
| 			ca_event->ErrCode = UPNP_E_SUCCESS; | 			ca_event->ErrCode = UPNP_E_SUCCESS; | ||||||
| 		} else { | 		} else { | ||||||
| 			// copy the error string | 			// copy the error string | ||||||
|             strcpy( ca_event->ErrStr, errorString ); | 			strcpy(ca_event->ErrStr, errorString); | ||||||
|             switch ( retCode ) { | 			switch (retCode) { | ||||||
| 			case UPNP_E_INVALID_PARAM: | 			case UPNP_E_INVALID_PARAM: | ||||||
|                     { |  | ||||||
| 				ca_event->ErrCode = 402; | 				ca_event->ErrCode = 402; | ||||||
| 				break; | 				break; | ||||||
|                     } |  | ||||||
| 			case UPNP_E_INTERNAL_ERROR: | 			case UPNP_E_INTERNAL_ERROR: | ||||||
| 			default: | 			default: | ||||||
|                     { |  | ||||||
| 				ca_event->ErrCode = 501; | 				ca_event->ErrCode = 501; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|             } |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     return ( ca_event->ErrCode ); | 	return ca_event->ErrCode; | ||||||
| } | } | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
| @@ -1770,22 +1751,17 @@ 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); | ||||||
|             TvDeviceHandleSubscriptionRequest( ( struct |  | ||||||
|                                                  Upnp_Subscription_Request |  | ||||||
|                                                  * )Event ); |  | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case UPNP_CONTROL_GET_VAR_REQUEST: | 	case UPNP_CONTROL_GET_VAR_REQUEST: | ||||||
|             TvDeviceHandleGetVarRequest( ( struct Upnp_State_Var_Request | 		TvDeviceHandleGetVarRequest((struct Upnp_State_Var_Request *)Event); | ||||||
|                                            * )Event ); |  | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case UPNP_CONTROL_ACTION_REQUEST: | 	case UPNP_CONTROL_ACTION_REQUEST: | ||||||
|             TvDeviceHandleActionRequest( ( struct Upnp_Action_Request * ) | 		TvDeviceHandleActionRequest((struct Upnp_Action_Request *)Event); | ||||||
|                                          Event ); |  | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| @@ -1804,12 +1780,12 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co | |||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
|             SampleUtil_Print( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n", | 		SampleUtil_Print("Error in TvDeviceCallbackEventHandler: unknown event type %d\n", | ||||||
|                 EventType ); | 			EventType); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Print a summary of the event received */ | 	/* Print a summary of the event received */ | ||||||
|     SampleUtil_PrintEvent( EventType, Event ); | 	SampleUtil_PrintEvent(EventType, Event); | ||||||
|  |  | ||||||
| 	return 0; | 	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) | ||||||
| { | { | ||||||
| @@ -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" | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -121,7 +122,7 @@ 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,9 +445,7 @@ 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; | ||||||
| @@ -454,42 +453,44 @@ TvDeviceHandleGetVarRequest( INOUT struct Upnp_State_Var_Request | |||||||
|  |  | ||||||
| 	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; | ||||||
|  | 		if (strcmp(devUDN, tv_service_table[i].UDN) == 0 && | ||||||
|  | 		    strcmp(serviceID, tv_service_table[i].ServiceId) == 0) { | ||||||
| 			// check variable name | 			// check variable name | ||||||
|             for( j = 0; j < tv_service_table[i].VariableCount; j++ ) { | 			for (j = 0; j < tv_service_table[i].VariableCount; j++) { | ||||||
|                 if( strcmp( cgv_event->StateVarName, | 				const char *stateVarName = | ||||||
|                             tv_service_table[i].VariableName[j] ) == 0 ) { | 					cgv_event->StateVarName; | ||||||
|  | 				if (strcmp(stateVarName, | ||||||
|  | 					   tv_service_table[i].VariableName[j]) == 0) { | ||||||
| 					getvar_succeeded = 1; | 					getvar_succeeded = 1; | ||||||
|                     cgv_event->CurrentVal = | 					cgv_event->CurrentVal = ixmlCloneDOMString( | ||||||
|                         ixmlCloneDOMString( tv_service_table[i]. | 						tv_service_table[i].VariableStrVal[j]); | ||||||
|                                             VariableStrVal[j] ); |  | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	if (getvar_succeeded) { | ||||||
|     if( getvar_succeeded ) { |  | ||||||
| 		cgv_event->ErrCode = UPNP_E_SUCCESS; | 		cgv_event->ErrCode = UPNP_E_SUCCESS; | ||||||
| 	} else { | 	} else { | ||||||
|         SampleUtil_Print | 		SampleUtil_Print( | ||||||
|             ( "Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" ); | 			"Error in UPNP_CONTROL_GET_VAR_REQUEST callback:\n" | ||||||
|         SampleUtil_Print( "   Unknown variable name = %s\n", | 			"   Unknown variable name = %s\n", | ||||||
|                           cgv_event->StateVarName ); | 			cgv_event->StateVarName); | ||||||
| 		cgv_event->ErrCode = 404; | 		cgv_event->ErrCode = 404; | ||||||
|         strcpy( cgv_event->ErrStr, "Invalid Variable" ); | 		strcpy(cgv_event->ErrStr, "Invalid Variable"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     ithread_mutex_unlock( &TVDevMutex ); | 	ithread_mutex_unlock(&TVDevMutex); | ||||||
|  |  | ||||||
|     return ( cgv_event->ErrCode == UPNP_E_SUCCESS ); | 	return cgv_event->ErrCode == UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
| @@ -504,62 +505,47 @@ 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 action_found = 0; | ||||||
| 	int i = 0; | 	int i = 0; | ||||||
| 	int service = -1; | 	int service = -1; | ||||||
| 	int retCode = 0; | 	int retCode = 0; | ||||||
| 	char *errorString = NULL; | 	char *errorString = NULL; | ||||||
|  | 	const char *devUDN = 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; | 		service = TV_SERVICE_CONTROL; | ||||||
|     } else if( ( strcmp( ca_event->DevUDN, | 	} else if (strcmp(devUDN,    tv_service_table[TV_SERVICE_PICTURE].UDN) == 0 && | ||||||
|                          tv_service_table[TV_SERVICE_PICTURE].UDN ) == 0 ) | 		   strcmp(serviceID, tv_service_table[TV_SERVICE_PICTURE].ServiceId) == 0) { | ||||||
|                && | 		/* Request for action in the TvDevice Picture Service. */ | ||||||
|                ( strcmp |  | ||||||
|                  ( ca_event->ServiceID, |  | ||||||
|                    tv_service_table[TV_SERVICE_PICTURE].ServiceId ) == |  | ||||||
|                  0 ) ) { |  | ||||||
|         /* |  | ||||||
|            Request for action in the TvDevice Picture Service  |  | ||||||
|          */ |  | ||||||
| 		service = TV_SERVICE_PICTURE; | 		service = TV_SERVICE_PICTURE; | ||||||
| 	} | 	} | ||||||
|     //Find and call appropriate procedure based on action name | 	/* Find and call appropriate procedure based on action name. | ||||||
|     //Each action name has an associated procedure stored in the | 	 * Each action name has an associated procedure stored in the | ||||||
|     //service table. These are set at initialization. | 	 * service table. These are set at initialization. */ | ||||||
|  | 	for (i = 0; | ||||||
|     for( i = 0; ( ( i < TV_MAXACTIONS ) && | 	     i < TV_MAXACTIONS && tv_service_table[service].ActionNames[i] != NULL; | ||||||
|                   ( tv_service_table[service].ActionNames[i] != NULL ) ); | 	     i++) { | ||||||
|          i++ ) { | 		if (!strcmp(actionName, tv_service_table[service].ActionNames[i])) { | ||||||
|  | 			if (!strcmp(tv_service_table[TV_SERVICE_CONTROL]. | ||||||
|         if( !strcmp( ca_event->ActionName, | 					VariableStrVal[TV_CONTROL_POWER], "1") || | ||||||
|                      tv_service_table[service].ActionNames[i] ) ) { | 			    !strcmp(actionName, "PowerOn")) { | ||||||
|  | 				retCode = tv_service_table[service].actions[i]( | ||||||
|             if( ( !strcmp( tv_service_table[TV_SERVICE_CONTROL]. | 					ca_event->ActionRequest, | ||||||
|                            VariableStrVal[TV_CONTROL_POWER], "1" ) ) | 					&ca_event->ActionResult, | ||||||
|                 || ( !strcmp( ca_event->ActionName, "PowerOn" ) ) ) { | 					&errorString); | ||||||
|                 retCode = |  | ||||||
|                     tv_service_table[service].actions[i] ( ca_event-> |  | ||||||
|                                                            ActionRequest, |  | ||||||
|                                                            &ca_event-> |  | ||||||
|                                                            ActionResult, |  | ||||||
|                     &errorString ); |  | ||||||
| 			} else { | 			} else { | ||||||
| 				errorString = "Power is Off"; | 				errorString = "Power is Off"; | ||||||
| 				retCode = UPNP_E_INTERNAL_ERROR; | 				retCode = UPNP_E_INTERNAL_ERROR; | ||||||
| @@ -569,34 +555,29 @@ TvDeviceHandleActionRequest( INOUT struct Upnp_Action_Request *ca_event ) | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     if( !action_found ) { | 	if (!action_found) { | ||||||
| 		ca_event->ActionResult = NULL; | 		ca_event->ActionResult = NULL; | ||||||
|         strcpy( ca_event->ErrStr, "Invalid Action" ); | 		strcpy(ca_event->ErrStr, "Invalid Action"); | ||||||
| 		ca_event->ErrCode = 401; | 		ca_event->ErrCode = 401; | ||||||
| 	} else { | 	} else { | ||||||
|         if( retCode == UPNP_E_SUCCESS ) { | 		if (retCode == UPNP_E_SUCCESS) { | ||||||
| 			ca_event->ErrCode = UPNP_E_SUCCESS; | 			ca_event->ErrCode = UPNP_E_SUCCESS; | ||||||
| 		} else { | 		} else { | ||||||
| 			// copy the error string | 			// copy the error string | ||||||
|             strcpy( ca_event->ErrStr, errorString ); | 			strcpy(ca_event->ErrStr, errorString); | ||||||
|             switch ( retCode ) { | 			switch (retCode) { | ||||||
| 			case UPNP_E_INVALID_PARAM: | 			case UPNP_E_INVALID_PARAM: | ||||||
|                     { |  | ||||||
| 				ca_event->ErrCode = 402; | 				ca_event->ErrCode = 402; | ||||||
| 				break; | 				break; | ||||||
|                     } |  | ||||||
| 			case UPNP_E_INTERNAL_ERROR: | 			case UPNP_E_INTERNAL_ERROR: | ||||||
| 			default: | 			default: | ||||||
|                     { |  | ||||||
| 				ca_event->ErrCode = 501; | 				ca_event->ErrCode = 501; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|             } |  | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     return ( ca_event->ErrCode ); | 	return ca_event->ErrCode; | ||||||
| } | } | ||||||
|  |  | ||||||
| /****************************************************************************** | /****************************************************************************** | ||||||
| @@ -1772,22 +1753,17 @@ 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); | ||||||
|             TvDeviceHandleSubscriptionRequest( ( struct |  | ||||||
|                                                  Upnp_Subscription_Request |  | ||||||
|                                                  * )Event ); |  | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case UPNP_CONTROL_GET_VAR_REQUEST: | 	case UPNP_CONTROL_GET_VAR_REQUEST: | ||||||
|             TvDeviceHandleGetVarRequest( ( struct Upnp_State_Var_Request | 		TvDeviceHandleGetVarRequest((struct Upnp_State_Var_Request *)Event); | ||||||
|                                            * )Event ); |  | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	case UPNP_CONTROL_ACTION_REQUEST: | 	case UPNP_CONTROL_ACTION_REQUEST: | ||||||
|             TvDeviceHandleActionRequest( ( struct Upnp_Action_Request * ) | 		TvDeviceHandleActionRequest((struct Upnp_Action_Request *)Event); | ||||||
|                                          Event ); |  | ||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| @@ -1806,12 +1782,12 @@ int TvDeviceCallbackEventHandler(Upnp_EventType EventType, void *Event, void *Co | |||||||
| 		break; | 		break; | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
|             SampleUtil_Print( "Error in TvDeviceCallbackEventHandler: unknown event type %d\n", | 		SampleUtil_Print("Error in TvDeviceCallbackEventHandler: unknown event type %d\n", | ||||||
|                 EventType ); | 			EventType); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* Print a summary of the event received */ | 	/* Print a summary of the event received */ | ||||||
|     SampleUtil_PrintEvent( EventType, Event ); | 	SampleUtil_PrintEvent(EventType, Event); | ||||||
|  |  | ||||||
| 	return 0; | 	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); | ||||||
|   | |||||||
| @@ -122,6 +122,7 @@ ithread_mutex_t GlobalClientSubscribeMutex; | |||||||
| /*! rwlock to synchronize handles (root device or control point handle). */ | /*! rwlock to synchronize handles (root device or control point handle). */ | ||||||
| ithread_rwlock_t GlobalHndRWLock; | ithread_rwlock_t GlobalHndRWLock; | ||||||
|  |  | ||||||
|  |  | ||||||
| /*! Mutex to synchronize the uuid creation process. */ | /*! Mutex to synchronize the uuid creation process. */ | ||||||
| ithread_mutex_t gUUIDMutex; | ithread_mutex_t gUUIDMutex; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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> | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ | |||||||
|  |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
| #include "membuffer.h" | #include "membuffer.h" | ||||||
| #include "httpparser.h" | #include "httpparser.h" | ||||||
| #include "statcodes.h" | #include "statcodes.h" | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ | |||||||
| #include "config.h" | #include "config.h" | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
| #include "statcodes.h" | #include "statcodes.h" | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -29,206 +29,131 @@ | |||||||
|  * |  * | ||||||
|  **************************************************************************/ |  **************************************************************************/ | ||||||
|  |  | ||||||
|  | /*! | ||||||
| /************************************************************************ |  * \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 ) { | 	if (info->socket != -1) { | ||||||
|             return UPNP_E_SOCKET_ERROR; | 		shutdown(info->socket, ShutdownMethod); | ||||||
|  | 		if (sock_close(info->socket) == -1) { | ||||||
|  | 			ret = UPNP_E_SOCKET_ERROR; | ||||||
| 		} | 		} | ||||||
|  | 		info->socket = -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|     return UPNP_E_SUCCESS; | 	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 ; |  | ||||||
| *		numBytes - On Success, no of bytes received or sent		 |  | ||||||
| *		UPNP_E_TIMEDOUT - Timeout |  | ||||||
| *		UPNP_E_SOCKET_ERROR - Error on socket calls |  | ||||||
| * |  | ||||||
| *	Note : |  | ||||||
| ************************************************************************/ |  | ||||||
| static int |  | ||||||
| sock_read_write( IN SOCKINFO * info, |  | ||||||
| 	OUT char *buffer, | 	OUT char *buffer, | ||||||
|  | 	/*! Size of the buffer. */ | ||||||
| 	IN size_t bufsize, | 	IN size_t bufsize, | ||||||
|  | 	/*! timeout value. */ | ||||||
| 	IN int *timeoutSecs, | 	IN int *timeoutSecs, | ||||||
|                  IN xboolean bRead ) | 	/*! Boolean value specifying read or write option. */ | ||||||
|  | 	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 ) { | 	if (*timeoutSecs < 0) { | ||||||
| 		return UPNP_E_TIMEDOUT; | 		return UPNP_E_TIMEDOUT; | ||||||
| 	} | 	} | ||||||
|  | 	FD_ZERO(&readSet); | ||||||
|     FD_ZERO( &readSet ); | 	FD_ZERO(&writeSet); | ||||||
|     FD_ZERO( &writeSet ); | 	if (bRead) { | ||||||
|     if( bRead ) { | 		FD_SET(sockfd, &readSet); | ||||||
|         FD_SET( sockfd, &readSet ); |  | ||||||
| 	} else { | 	} else { | ||||||
|         FD_SET( sockfd, &writeSet ); | 		FD_SET(sockfd, &writeSet); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	timeout.tv_sec = *timeoutSecs; | 	timeout.tv_sec = *timeoutSecs; | ||||||
| 	timeout.tv_usec = 0; | 	timeout.tv_usec = 0; | ||||||
|  | 	while (TRUE) { | ||||||
|     while( TRUE ) { | 		if (*timeoutSecs == 0) { | ||||||
|         if( *timeoutSecs == 0 ) { | 			retCode = select(sockfd + 1, &readSet, &writeSet, | ||||||
|             retCode = | 				NULL, NULL); | ||||||
|                 select( sockfd + 1, &readSet, &writeSet, NULL, NULL ); |  | ||||||
| 		} else { | 		} else { | ||||||
|             retCode = | 			retCode = select(sockfd + 1, &readSet, &writeSet, | ||||||
|                 select( sockfd + 1, &readSet, &writeSet, NULL, &timeout ); | 				NULL, &timeout); | ||||||
| 		} | 		} | ||||||
|  | 		if (retCode == 0) { | ||||||
|         if( retCode == 0 ) { |  | ||||||
| 			return UPNP_E_TIMEDOUT; | 			return UPNP_E_TIMEDOUT; | ||||||
| 		} | 		} | ||||||
|         if( retCode == -1 ) { | 		if (retCode == -1) { | ||||||
|             if( errno == EINTR ) | 			if (errno == EINTR) | ||||||
| 				continue; | 				continue; | ||||||
|             return UPNP_E_SOCKET_ERROR; // error | 			return UPNP_E_SOCKET_ERROR; | ||||||
| 		} else { | 		} else { | ||||||
|             break;              // read or write | 			/* read or write. */ | ||||||
|  | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| #ifdef SO_NOSIGPIPE | #ifdef SO_NOSIGPIPE | ||||||
| 	{ | 	{ | ||||||
| 		int old; | 		int old; | ||||||
| @@ -237,96 +162,53 @@ sock_read_write( IN SOCKINFO * info, | |||||||
| 		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 = | 				num_written = send(sockfd, | ||||||
|                 send( sockfd, buffer + bytes_sent, byte_left, | 					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) { | ||||||
|     if( numBytes < 0 ) { |  | ||||||
| 		return UPNP_E_SOCKET_ERROR; | 		return UPNP_E_SOCKET_ERROR; | ||||||
| 	} | 	} | ||||||
|     // subtract time used for reading/writing | 	/* subtract time used for reading/writing. */ | ||||||
|     if( *timeoutSecs != 0 ) { | 	if (*timeoutSecs != 0) { | ||||||
|         *timeoutSecs -= time( NULL ) - start_time; | 		*timeoutSecs -= time(NULL) - start_time; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return numBytes; | 	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,51 +186,25 @@ GetNextSubscription( service_info * service, | |||||||
|     return next; |     return next; | ||||||
| } | } | ||||||
|  |  | ||||||
| /************************************************************************ |  | ||||||
| *	Function :	GetFirstSubscription | subscription *GetFirstSubscription(service_info *service) | ||||||
| * |  | ||||||
| *	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 temp; | ||||||
| 	subscription *next = NULL; | 	subscription *next = NULL; | ||||||
|  |  | ||||||
| 	temp.next = service->subscriptionList; | 	temp.next = service->subscriptionList; | ||||||
|     next = GetNextSubscription( service, &temp ); | 	next = GetNextSubscription(service, &temp); | ||||||
| 	service->subscriptionList = temp.next; | 	service->subscriptionList = temp.next; | ||||||
|     //  service->subscriptionList=next; | 	// service->subscriptionList = next; | ||||||
|  | 	 | ||||||
| 	return 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); | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -37,7 +37,7 @@ | |||||||
|  |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include "upnp.h" | #include "upnp.h" | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <string.h> | #include <string.h> | ||||||
|   | |||||||
| @@ -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 "upnputil.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 */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ | |||||||
| #define GENLIB_NET_HTTP_HTTPREADWRITE_H | #define GENLIB_NET_HTTP_HTTPREADWRITE_H | ||||||
|  |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
| #include "sock.h" | #include "sock.h" | ||||||
| #include "httpparser.h" | #include "httpparser.h" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
|  |  | ||||||
| #define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) ) | #define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) ) | ||||||
| #define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) ) | #define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) ) | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /************************************************************************ | /************************************************************************** | ||||||
|  * |  * | ||||||
|  * Copyright (c) 2000-2003 Intel Corporation |  * Copyright (c) 2000-2003 Intel Corporation | ||||||
|  * All rights reserved. |  * All rights reserved. | ||||||
| @@ -6,12 +6,12 @@ | |||||||
|  * 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. | ||||||
|  * |  * | ||||||
| @@ -27,12 +27,17 @@ | |||||||
|  * 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); | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,7 +32,7 @@ | |||||||
| #ifndef GENLIB_NET_HTTP_PARSETOOLS_H | #ifndef GENLIB_NET_HTTP_PARSETOOLS_H | ||||||
| #define GENLIB_NET_HTTP_PARSETOOLS_H | #define GENLIB_NET_HTTP_PARSETOOLS_H | ||||||
|  |  | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
| #include "httpparser.h" | #include "httpparser.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -29,13 +29,14 @@ | |||||||
|  * |  * | ||||||
|  **************************************************************************/ |  **************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
| #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 "upnputil.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
| 	/* Do not #include <netinet/in.h> */ | 	/* Do not #include <netinet/in.h> */ | ||||||
| @@ -43,135 +44,128 @@ | |||||||
| 	#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" */ | ||||||
|   | |||||||
| @@ -90,7 +90,6 @@ typedef enum SsdpCmdType{ | |||||||
| #define SSDP_IPV6_SITELOCAL "FF05::C" | #define SSDP_IPV6_SITELOCAL "FF05::C" | ||||||
| #define SSDP_PORT 1900 | #define SSDP_PORT 1900 | ||||||
| #define NUM_TRY 3 | #define NUM_TRY 3 | ||||||
| #define NUM_COPY 1 |  | ||||||
| #define THREAD_LIMIT 50 | #define THREAD_LIMIT 50 | ||||||
| #define COMMAND_LEN  300 | #define COMMAND_LEN  300 | ||||||
|  |  | ||||||
| @@ -140,7 +139,7 @@ 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; | ||||||
| @@ -224,12 +223,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 +252,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 | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ | |||||||
| #define GENLIB_UTIL_STRINTMAP_H | #define GENLIB_UTIL_STRINTMAP_H | ||||||
|  |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
|  |  | ||||||
| // Util to map from a string to an integer and vice versa | // Util to map from a string to an integer and vice versa | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,37 +1,47 @@ | |||||||
| /////////////////////////////////////////////////////////////////////////// | /******************************************************************************* | ||||||
| // |  * | ||||||
| // 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; | ||||||
| @@ -40,19 +50,13 @@ typedef struct UPNP_TIMEOUT { | |||||||
| } 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 |  | ||||||
|   | |||||||
| @@ -109,10 +109,8 @@ struct Handle_Info | |||||||
| #endif | #endif | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| extern ithread_rwlock_t GlobalHndRWLock; | extern ithread_rwlock_t GlobalHndRWLock; | ||||||
|  |  | ||||||
|  |  | ||||||
| /*! | /*! | ||||||
|  * \brief Get handle information. |  * \brief Get handle information. | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -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,34 +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. |  | ||||||
| // |  | ||||||
| /////////////////////////////////////////////////////////////////////////// |  | ||||||
|  |  | ||||||
| #include <genlib/util/util.h> |  | ||||||
| #include <genlib/util/xstring.h> |  | ||||||
|  |  | ||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ | |||||||
| #include "config.h" | #include "config.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef INCLUDE_CLIENT_APIS | #ifdef INCLUDE_CLIENT_APIS | ||||||
| @@ -76,9 +76,8 @@ 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 | ||||||
| @@ -152,8 +151,9 @@ void ssdp_handle_ctrlpt_msg( | |||||||
|     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 | ||||||
|  |  | ||||||
| @@ -223,7 +223,6 @@ NewRequestHandler( IN struct sockaddr *DestAddr, | |||||||
|     char errorBuffer[ERROR_BUFFER_LEN]; |     char errorBuffer[ERROR_BUFFER_LEN]; | ||||||
|     SOCKET ReplySock; |     SOCKET ReplySock; | ||||||
|     int socklen = sizeof( struct sockaddr_storage ); |     int socklen = sizeof( struct sockaddr_storage ); | ||||||
|     int NumCopy; |  | ||||||
|     int Index; |     int Index; | ||||||
|     unsigned long replyAddr = inet_addr( gIF_IPV4 ); |     unsigned long replyAddr = inet_addr( gIF_IPV4 ); | ||||||
|     int ttl = 4; // a/c to UPNP Spec |     int ttl = 4; // a/c to UPNP Spec | ||||||
| @@ -265,19 +264,6 @@ NewRequestHandler( IN struct sockaddr *DestAddr, | |||||||
|  |  | ||||||
|     for( Index = 0; Index < NumPacket; Index++ ) { |     for( Index = 0; Index < NumPacket; Index++ ) { | ||||||
|         int rc; |         int rc; | ||||||
|         // The reason to keep this loop is purely historical/documentation, |  | ||||||
|         // according to section 9.2 of HTTPU spec: |  | ||||||
|         //  |  | ||||||
|         // "If a multicast resource would send a response(s) to any copy of the  |  | ||||||
|         //  request, it SHOULD send its response(s) to each copy of the request  |  | ||||||
|         //  it receives. It MUST NOT repeat its response(s) per copy of the  |  | ||||||
|         //  request." |  | ||||||
|         //   |  | ||||||
|         // http://www.upnp.org/download/draft-goland-http-udp-04.txt |  | ||||||
|         // |  | ||||||
|         // So, NUM_COPY has been changed from 2 to 1. |  | ||||||
|         NumCopy = 0; |  | ||||||
|         while( NumCopy < NUM_COPY ) { |  | ||||||
|         UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |         UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|             ">>> SSDP SEND to %s >>>\n%s\n", |             ">>> SSDP SEND to %s >>>\n%s\n", | ||||||
|             buf_ntop, *( RqPacket + Index ) ); |             buf_ntop, *( RqPacket + Index ) ); | ||||||
| @@ -293,11 +279,6 @@ NewRequestHandler( IN struct sockaddr *DestAddr, | |||||||
|             ret = UPNP_E_SOCKET_WRITE; |             ret = UPNP_E_SOCKET_WRITE; | ||||||
|             goto end_NewRequestHandler; |             goto end_NewRequestHandler; | ||||||
|         } |         } | ||||||
|              |  | ||||||
|             imillisleep( SSDP_PAUSE ); |  | ||||||
|  |  | ||||||
|             ++NumCopy; |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| end_NewRequestHandler: | end_NewRequestHandler: | ||||||
| @@ -502,7 +483,7 @@ DeviceAdvertisement( IN char *DevType, | |||||||
|     //char Mil_Nt[LINE_SIZE] |     //char Mil_Nt[LINE_SIZE] | ||||||
|     char Mil_Usn[LINE_SIZE]; |     char Mil_Usn[LINE_SIZE]; | ||||||
|     char *msgs[3]; |     char *msgs[3]; | ||||||
|     int ret_code; |     int ret_code = UPNP_E_SUCCESS; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |     UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|         "In function DeviceAdvertisement\n" ); |         "In function DeviceAdvertisement\n" ); | ||||||
| @@ -751,7 +732,7 @@ ServiceAdvertisement( IN char *Udn, | |||||||
| { | { | ||||||
|     char Mil_Usn[LINE_SIZE]; |     char Mil_Usn[LINE_SIZE]; | ||||||
|     char *szReq[1]; |     char *szReq[1]; | ||||||
|     int RetVal; |     int RetVal = UPNP_E_SUCCESS; | ||||||
|     struct sockaddr_storage __ss; |     struct sockaddr_storage __ss; | ||||||
|     struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; |     struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; | ||||||
|     struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; |     struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; | ||||||
| @@ -860,7 +841,7 @@ ServiceShutdown( IN char *Udn, | |||||||
|     struct sockaddr_storage __ss; |     struct sockaddr_storage __ss; | ||||||
|     struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; |     struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss; | ||||||
|     struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; |     struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; | ||||||
|     int RetVal; |     int RetVal = UPNP_E_SUCCESS; | ||||||
|  |  | ||||||
|     memset( &__ss, 0, sizeof(__ss) ); |     memset( &__ss, 0, sizeof(__ss) ); | ||||||
|     if( AddressFamily == AF_INET ) { |     if( AddressFamily == AF_INET ) { | ||||||
| @@ -926,7 +907,7 @@ DeviceShutdown( IN char *DevType, | |||||||
|     struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; |     struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss; | ||||||
|     char *msgs[3]; |     char *msgs[3]; | ||||||
|     char Mil_Usn[LINE_SIZE]; |     char Mil_Usn[LINE_SIZE]; | ||||||
|     int ret_code; |     int ret_code = UPNP_E_SUCCESS; | ||||||
|  |  | ||||||
|     msgs[0] = NULL; |     msgs[0] = NULL; | ||||||
|     msgs[1] = NULL; |     msgs[1] = NULL; | ||||||
|   | |||||||
| @@ -135,6 +135,7 @@ int AdvertiseAndReply( | |||||||
| 	const DOMString tmpStr; | 	const DOMString tmpStr; | ||||||
| 	char SERVER[200]; | 	char SERVER[200]; | ||||||
| 	const DOMString dbgStr; | 	const DOMString dbgStr; | ||||||
|  | 	int NumCopy = 0; | ||||||
|  |  | ||||||
| 	UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, | 	UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, | ||||||
| 		"Inside AdvertiseAndReply with AdFlag = %d\n", AdFlag); | 		"Inside AdvertiseAndReply with AdFlag = %d\n", AdFlag); | ||||||
| @@ -152,6 +153,11 @@ int AdvertiseAndReply( | |||||||
| 	get_sdk_info(SERVER); | 	get_sdk_info(SERVER); | ||||||
|  |  | ||||||
| 	/* parse the device list and send advertisements/replies */ | 	/* parse the device list and send advertisements/replies */ | ||||||
|  | 	while (NumCopy == 0 || (AdFlag && NumCopy < NUM_SSDP_COPY)) { | ||||||
|  | 		if (NumCopy != 0) | ||||||
|  | 			imillisleep(SSDP_PAUSE); | ||||||
|  | 		NumCopy++; | ||||||
|  |  | ||||||
| 		for (i = 0;; i++) { | 		for (i = 0;; i++) { | ||||||
| 			UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, | 			UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__, | ||||||
| 				"Entering new device list with i = %d\n\n", i); | 				"Entering new device list with i = %d\n\n", i); | ||||||
| @@ -392,6 +398,7 @@ int AdvertiseAndReply( | |||||||
| 			ixmlNodeList_free(nodeList); | 			ixmlNodeList_free(nodeList); | ||||||
| 			nodeList = NULL; | 			nodeList = NULL; | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| end_function: | end_function: | ||||||
| 	ixmlNodeList_free(tmpNodeList); | 	ixmlNodeList_free(tmpNodeList); | ||||||
| @@ -743,7 +750,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 +762,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 */ | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ | |||||||
| #include "UpnpInet.h" | #include "UpnpInet.h" | ||||||
| #include "uri.h" | #include "uri.h" | ||||||
| #include "urlconfig.h" | #include "urlconfig.h" | ||||||
| #include "util.h" | #include "upnputil.h" | ||||||
| #include "webserver.h" | #include "webserver.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user