Compare commits
	
		
			30 Commits
		
	
	
		
			release-1.
			...
			release-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | bf601218cd | ||
|   | 0c67e186f5 | ||
|   | 8bc61b1a5c | ||
|   | aec58e6c9e | ||
|   | 4bcb9dd5e1 | ||
|   | 8cfa0e488c | ||
|   | 9e775e662e | ||
|   | 03400550cd | ||
|   | 62a5d7c5ef | ||
|   | df80fbae36 | ||
|   | 9c6ea48583 | ||
|   | 8da593fae3 | ||
|   | b4816a33a9 | ||
|   | 1b029e80af | ||
|   | 907b103439 | ||
|   | ecd755d3f8 | ||
|   | b8cac59dd9 | ||
|   | 591e0d3e25 | ||
|   | bd3bf7ad0a | ||
|   | 374ff706fd | ||
|   | 44564d16f8 | ||
|   | c0a5ccc174 | ||
|   | 522dee807f | ||
|   | 062d62bbc4 | ||
|   | ca1d800b96 | ||
|   | bd8ea3ac77 | ||
|   | 191814ec13 | ||
|   | 854cc93854 | ||
|   | 6a0f25b290 | ||
|   | ed0a4d2222 | 
							
								
								
									
										318
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										318
									
								
								ChangeLog
									
									
									
									
									
								
							| @@ -1,305 +1,7 @@ | |||||||
| ******************************************************************************* |  | ||||||
| Version 1.6.1 |  | ||||||
| ******************************************************************************* |  | ||||||
|  |  | ||||||
| 2007-11-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ************************************************************************* | ||||||
| 	* SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out |  | ||||||
| 	Applied patch from Alex (afaucher) to change some write locks to read |  | ||||||
| 	locks. |  | ||||||
|  |  | ||||||
| 2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Adjusting libtool library numbers to reflect the last changes. |  | ||||||
|  |  | ||||||
| 2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out |  | ||||||
| 	GlobalHndMutex, which was a mutex is now GlobalHndRWLock, which is a |  | ||||||
| 	rwlock. HandleLock() is mapped to HandleWriteLock() while all other |  | ||||||
| 	instances have not been checked. One instance in AdvertiseAndReply() |  | ||||||
| 	has been changed to HandleReadLock(). Thanks to Alex (afaucher) for the  |  | ||||||
| 	bug report and suggestions. |  | ||||||
|  |  | ||||||
| 2007-11-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Added support for rwlocks. |  | ||||||
|  |  | ||||||
| 2007-11-05 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* SF Bug Tracker [ 1825929 ] woker thread still alive after UpnpFinish() |  | ||||||
| 	Submitted By: Luke Kim - nereusuj |  | ||||||
| 	Worker thread still alive after calling UpnpFinish() because |  | ||||||
| 	ThreadPoolShutdown() is in the #ifdef DEBUG block. |  | ||||||
| 	421 |  | ||||||
| 	422 #ifdef DEBUG |  | ||||||
| 	423 ThreadPoolShutdown( &gSendThreadPool ); |  | ||||||
| 	424 ThreadPoolShutdown( &gRecvThreadPool ); |  | ||||||
|  |  | ||||||
| 2007-08-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Changed the calls to virtualDirCallback.open(filename, UPNP_WRITE) |  | ||||||
| 	to (virtualDirCallback.open)(filename, UPNP_WRITE) (notice the |  | ||||||
| 	parenthesis) due to a change in glibc that produces compilation |  | ||||||
| 	errors. |  | ||||||
|  |  | ||||||
| 2007-08-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Initialization of the "randomness" struct so that valgrind does not |  | ||||||
| 	complain. |  | ||||||
|  |  | ||||||
| 2007-08-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Merge of patch submitted By Keith Brindley - brindlk |  | ||||||
| 	SF Bug Tracker [ 1762758 ] Seek not working for large files |  | ||||||
| 	Problem: |  | ||||||
| 	Requests from the uPnP client to seek to a position beyond 2GB in a large |  | ||||||
| 	file are handled as a request to see from the 2GB point. |  | ||||||
|  |  | ||||||
| 	Impact: |  | ||||||
| 	Varies depending on client. The Xbox 360 kills the connection when it |  | ||||||
| 	realises. |  | ||||||
|  |  | ||||||
| 	Solution: |  | ||||||
| 	GetNextRange function (webserver.c) is updated to handle large file sizes. |  | ||||||
| 	Fix should also recognise when built on a 32bit platform rather than 64 and |  | ||||||
| 	handle accordingly. |  | ||||||
|  |  | ||||||
| 2007-08-05 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Merge of Mac OS X patch from St<53>phane Corth<74>sy (davelopper), |  | ||||||
| 	SF Bug Tracker [ 1686420 ] Modifications for MacOSX. |  | ||||||
| 	Some of the proposed changes were already done by Rene Hexel's patch. |  | ||||||
|  |  | ||||||
| ******************************************************************************* |  | ||||||
| Version 1.6.0 |  | ||||||
| ******************************************************************************* |  | ||||||
|  |  | ||||||
| 2007-06-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* More fixes to Mac OS X and NetBSD from Rene Hexel: |  | ||||||
| 	[pupnp-devel] NetBSD & Mac OS X packages and patches |  | ||||||
|  |  | ||||||
| 	  Okay, I found a couple more things.  I have attached a patch file |  | ||||||
| 	against the trunk (version 206) that make the repository code compile |  | ||||||
| 	and run on both Mac OS X and NetBSD. |  | ||||||
|  |  | ||||||
| 	This fixes the following issues: |  | ||||||
|  |  | ||||||
| 	   upnp/src/api/upnpapi.c: SIOCGIFCONF didn't work properly, use |  | ||||||
| 	getifaddrs() instead (on BSD systems). |  | ||||||
|  |  | ||||||
| 	  threadutil/src/ThreadPool.c: priorities only work if |  | ||||||
| 	_POSIX_PRIORITY_SCHEDULING is defined (and greater than 0). |  | ||||||
|  |  | ||||||
| 	  threadutil/src/LinkedList.c and threadutil/src/iasnprintf.c: use |  | ||||||
| 	stdlib.h instead of malloc.h on all BSD systems (not just FreeBSD). |  | ||||||
| 	This is important, because malloc.h does not exist on Darwin/Mac OS X. |  | ||||||
|  |  | ||||||
| 	  Cheers |  | ||||||
| 	      , |  | ||||||
| 	   Rene |  | ||||||
|  |  | ||||||
| 2007-06-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* [pupnp-devel] NetBSD & Mac OS X packages and patches. |  | ||||||
| 	Rene Hexel's <rh@netbsd.org> patch to compile in NetBSD and Mac OS X. |  | ||||||
|  |  | ||||||
| 2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Updated the macro files acx_pthread.m4, ax_cflags_gcc_option.m4, |  | ||||||
| 	ax_cflags_warn_all.m4, m4/ax_cflags_warn_all_ansi.m4, |  | ||||||
| 	m4/type_socklen_t.m4. |  | ||||||
|  |  | ||||||
| 2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Fixed an issue with the instalation of the file upnpdebug.h. Since |  | ||||||
| 	the last modifications that removed the macro DEBUV_ONLY, this file |  | ||||||
| 	must be installed even on a non-debug build. |  | ||||||
|  |  | ||||||
| 2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* SF Bug Tracker [ 1711325 ] Bad DestAddr in Upnp_Discovery structure |  | ||||||
| 	Submitted By: Bob Ciora |  | ||||||
| 	The field DestAddr of the structure Upnp_Discovery is now a full |  | ||||||
| 	SOCKADDRIN instead of a pointer to SOCKADDRIN. Commented code sugests |  | ||||||
| 	that in a previous moment, the function ssdp_handle_ctrlpt_msg() did |  | ||||||
| 	not use a postponed thread to call ctrlpt_callback(). Now the code |  | ||||||
| 	uses a thread, and most probably the original data would get lost and |  | ||||||
| 	the pointer would point to an invalid memory region. This fix caused |  | ||||||
| 	an interface change in the library and the minor library version was |  | ||||||
| 	bumped. Also, the libtool library numbers were changed accordingly. |  | ||||||
|  |  | ||||||
| 2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Added support for the Basic Device |  | ||||||
| 	(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by |  | ||||||
| 	Titus Winters. |  | ||||||
|  |  | ||||||
| 2007-05-25 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Fixed the file libupnp.pc.in to generate a correct path for the |  | ||||||
| 	include files. |  | ||||||
|  |  | ||||||
| 2007-05-25 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Removing the Dbg_Level, InitLog, SetLogFileNames and CloseLog |  | ||||||
| 	defines. These were just aliases, no reason to keep them. |  | ||||||
|  |  | ||||||
| 2007-05-25 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Changed the comments of the include files that expose the UPnP API |  | ||||||
| 	to use only C89 comments and no C99 comments. |  | ||||||
|  |  | ||||||
| 2007-05-24 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com> |  | ||||||
| 	* Added tvcombo sample that demonstrates coexistence of a device and a |  | ||||||
| 	control point in the same application. |  | ||||||
|  |  | ||||||
| 2007-05-24 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com> |  | ||||||
| 	* SF Tracker FR [ 1570020 ]. |  | ||||||
| 	* Enable both device and control point in the same application. Resolve |  | ||||||
| 	deadlock in the SSDP processing threads. |  | ||||||
| 	* Fix Threadpool expansion condition. |  | ||||||
| 	Thanks to Siva Chandran P. for the original patch. |  | ||||||
|  |  | ||||||
| 2007-05-24 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com> |  | ||||||
| 	* Modified tvdevice (control and picture) service descriptions to make |  | ||||||
| 	compatible with WinXP/IE control point. 'in' arguments must appear before |  | ||||||
| 	'out' arguments in argument list. |  | ||||||
| 	Thanks to Martin Tremblay for pointing out the solution originally provided |  | ||||||
| 	by MORIOKA Yasuhiro. |  | ||||||
|  |  | ||||||
| 2007-05-21 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* More MSVC fixes, using XINLINE instead of inline, MSVC has troubles |  | ||||||
| 	with inline. Thanks to David Maass for reporting. |  | ||||||
| 	* Changed XINLINE to UPNP_INLINE. |  | ||||||
|  |  | ||||||
| 2007-05-21 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Added the file build/inc/msvc/inttypes.h. This file is for use with |  | ||||||
| 	MSVC only, because it does not provide C99 compatibility. |  | ||||||
|  |  | ||||||
| 2007-05-18 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Removed all uses of the DEVICEONLY(x) macro. |  | ||||||
|  |  | ||||||
| 2007-05-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Removed all uses of the DBGONLY(x) macro. A static inline empty |  | ||||||
| 	function now is used and the compiler takes care of optimizing it out. |  | ||||||
|  |  | ||||||
| 2007-05-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Fixed a bug in UpnpPrintf, function could call va_start() and return |  | ||||||
| 	befor calling va_end(). |  | ||||||
|  |  | ||||||
| 2007-05-15 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* EXPORT_SPEC missing on some declarations in ixml/inc/ixml.h. |  | ||||||
| 	Thanks to David Maass. |  | ||||||
|  |  | ||||||
| 2007-05-15 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* sizeof is unsigned, so %zu is more adequate than %zd. |  | ||||||
|  |  | ||||||
| 2007-05-15 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Using an invented printf directive PRIzu that on MSVC |  | ||||||
| 	expands to "lu", and on normal C99 compilers expands to "zu". |  | ||||||
|  |  | ||||||
| 2007-05-15 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Rewrote raw_find_str. Now it no longer uses strcasestr(), but it |  | ||||||
| 	transforms the first input buffer into lowercase. |  | ||||||
|  |  | ||||||
| 2007-05-08 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Fix for debug printf format strings. size_t are not expected |  | ||||||
| 	in a string format like "%.*s". |  | ||||||
|  |  | ||||||
| 2007-05-08 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Added inttypes.h as a header requirement in configure.ac. |  | ||||||
|  |  | ||||||
| 2007-05-11 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Moved upnp_tv_ctrlpt and upnp_tv_device executables from folder |  | ||||||
| 	upnp to folder upnp/sample. Moved folder upnp/sample/tvdevice/web |  | ||||||
| 	to folder upnp/sample/web. This way, if someone compiles the |  | ||||||
| 	tarball and executes upnp_tv_device from its creation directory, |  | ||||||
| 	there will be no error -108 for not finding directory web. |  | ||||||
|  |  | ||||||
| ******************************************************************************* |  | ||||||
| Version 1.4.6 |  | ||||||
| ******************************************************************************* |  | ||||||
|  |  | ||||||
| 2007-04-19 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Fix for freebsd host_os in configure.ac. |  | ||||||
|  |  | ||||||
| ******************************************************************************* |  | ||||||
| Version 1.4.5 |  | ||||||
| ******************************************************************************* |  | ||||||
|  |  | ||||||
| 2007-04-19 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* Case insensitive comparison in raw_find_str() (httpparser.c) as |  | ||||||
| 	suggested by Craig Nelson in SF Tracker [ 1689382 ] DLINK DIR-625 |  | ||||||
| 	patch. |  | ||||||
|  |  | ||||||
| 2007-04-07 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com> |  | ||||||
| 	* Fix for a bug in makeAction where va_arg was beeing called one |  | ||||||
| 	extra time. |  | ||||||
|  |  | ||||||
| 2007-04-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* SF Tracker [ 1703533 ] Patch to make it compile under FreeBSD |  | ||||||
| 	Submitted By: Timothy Redaelli - drittz |  | ||||||
| 	I made some patches to make it compile under FreeBSD using |  | ||||||
| 	gethostbyaddr_r when supported. |  | ||||||
|  |  | ||||||
| 2007-04-28 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* [pupnp-devel] Type mixup on x86_64 causes UPNP_E_OUTOF_MEMORY |  | ||||||
| 	Submitted By: Glen Masgai |  | ||||||
| 	after an UpnpSendActionAsync() for example, i get UPNP_E_OUTOF_MEMORY |  | ||||||
| 	in the callback using 1.4.4 on a x86_64 system. This happens in |  | ||||||
| 	http_MakeMessage(), which in some cases get called with wrong types |  | ||||||
| 	(int instead of size_t) in combination with format "b" and "Q". |  | ||||||
| 	The attached patch should fix this. |  | ||||||
|  |  | ||||||
| ******************************************************************************* |  | ||||||
| Version 1.4.4 |  | ||||||
| ******************************************************************************* |  | ||||||
|  |  | ||||||
| 2007-04-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* SF Tracker [ 1695399 ] Typo in util.h |  | ||||||
| 	Submitted By: Luke Kim - nereusuj |  | ||||||
| 	Unix sleep is in seconds but WIN32 Sleep is in milliseconds. |  | ||||||
|  |  | ||||||
| 2007-04-17 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* SF Tracker [ 1652827 ] UpnpRegisterRootDevice returned -104 |  | ||||||
| 	Submitted By: Michael Andersen - miwer |  | ||||||
| 	 |  | ||||||
| 	Issue was found to be related to sizeof (size_t) != sizeof (int) |  | ||||||
| 	on AMD64 systems. Emil Ljungdahl's AMD64 patch has been applied along |  | ||||||
| 	with some other fixes. Original user report follows: |  | ||||||
|  |  | ||||||
| 	When I run upnpd I get the above mentioned error (UPNP_E_OUTOF_MEMORY). |  | ||||||
| 	I've tried with 1.4.1 and 1.4.2-RC3, it's the same. I don't understand why, |  | ||||||
| 	because I have plenty of RAM, and I even tried closing some applications, |  | ||||||
| 	but it didn't help. |  | ||||||
|  |  | ||||||
| 	$ upnpd eth1 br0 |  | ||||||
|  |  | ||||||
| 	The following is logged in the /var/log/messages: |  | ||||||
| 	Feb 6 01:33:47 server upnpd[6933]: Error registering the root device with |  | ||||||
| 	descDocUrl: http://192.168.0.1:49152/gatedesc.xml |  | ||||||
| 	Feb 6 01:33:47 server upnpd[6933]: UpnpRegisterRootDevice returned -104 |  | ||||||
|  |  | ||||||
|  |  | ||||||
| 	I tried enabling debugging and it looks like it cannot allocate memory |  | ||||||
| 	through the membuffer_append function. It's wierd because it's only a few |  | ||||||
| 	bytes. |  | ||||||
|  |  | ||||||
| 	Please note, that I enabled some extra debugging lines that were commented, |  | ||||||
| 	in order to get more information. See attached files. |  | ||||||
|  |  | ||||||
| ******************************************************************************* |  | ||||||
| Version 1.4.3 | Version 1.4.3 | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
|  |  | ||||||
| 2007-03-13 Marcelo Jimenez <mroberto(at)users.sourceforge.net> |  | ||||||
| 	* SF Tracker [ 1663004 ] Compile on Cygwin |  | ||||||
| 	Submitted By: Jon Foster - jongfoster |  | ||||||
| 	This patch gives basic support for building under Cygwin - it compiles, |  | ||||||
| 	links, and a simple UPnP device application can initialise. I'm not sure |  | ||||||
| 	if it actually works yet, but this is definitely a step in the right |  | ||||||
| 	direction. |  | ||||||
| 	 |  | ||||||
| 	Patch is against the 1.4.1 release. Changes are: |  | ||||||
| 	 |  | ||||||
| 	* threadutil/inc/ithread.h: Fix the ithread mutex support to use |  | ||||||
| 	documented, portable APIs (if present) rather than the Non-Portable (_NP) |  | ||||||
| 	ones it uses now. This is required because Cygwin implements only the |  | ||||||
| 	portable API. |  | ||||||
| 	 |  | ||||||
| 	* threadutil/src/ThreadPool.c: Fake SetPolicyType() to do nothing on Cygwin |  | ||||||
| 	because otherwise it fails. Should probably investigate why it fails and |  | ||||||
| 	add a proper implementation later. |  | ||||||
| 	 |  | ||||||
| 	* upnp/src/api/upnpapi.c: On Cygwin, zero out the GlobalHndMutex structure |  | ||||||
| 	before initialising it. Without this, the initialisation fails. This |  | ||||||
| 	appears to be a bug in Cygwin. |  | ||||||
| 	 |  | ||||||
| 	* upnp/src/genlib/net/uri/uri.c: Use gethostbyname() on Cygwin. |  | ||||||
|  |  | ||||||
| 2007-03-05 Oxy <oxygenic(at)users.sourceforge.net> | 2007-03-05 Oxy <oxygenic(at)users.sourceforge.net> | ||||||
| 	* Code adapted and typedefs added to compile cleanly under Windows | 	* Code adapted and typedefs added to compile cleanly under Windows | ||||||
| @@ -309,9 +11,9 @@ Version 1.4.3 | |||||||
|  |  | ||||||
| 	* Fixed nasty segmentation fault bug on membuffer.c. | 	* Fixed nasty segmentation fault bug on membuffer.c. | ||||||
|  |  | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
| Version 1.4.2 | Version 1.4.2 | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
|  |  | ||||||
| 2007-02-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | 2007-02-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net> | ||||||
|  |  | ||||||
| @@ -413,9 +115,9 @@ Version 1.4.2 | |||||||
| 	* support for large files (>2 GBytes) added | 	* support for large files (>2 GBytes) added | ||||||
|  |  | ||||||
|  |  | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
| Version 1.4.1 | Version 1.4.1 | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
|  |  | ||||||
| 2006-07-07 Oxy <virtual_worlds(at)gmx.de> | 2006-07-07 Oxy <virtual_worlds(at)gmx.de> | ||||||
|  |  | ||||||
| @@ -446,9 +148,9 @@ Version 1.4.1 | |||||||
| 	* Patch to fix memory leaks and reasons for crashes added (thanks | 	* Patch to fix memory leaks and reasons for crashes added (thanks | ||||||
| 	to loigu) | 	to loigu) | ||||||
|  |  | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
| Version 1.4.0 | Version 1.4.0 | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
|  |  | ||||||
| 2006-05-26 Oxy <virtual_worlds(at)gmx.de> | 2006-05-26 Oxy <virtual_worlds(at)gmx.de> | ||||||
|  |  | ||||||
| @@ -474,9 +176,9 @@ Version 1.4.0 | |||||||
| 	 | 	 | ||||||
| 	* Bugfix for M-Search packet | 	* Bugfix for M-Search packet | ||||||
|  |  | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
| FORK FROM DEAD libupnp | FORK FROM DEAD libupnp | ||||||
| ******************************************************************************* | ************************************************************************* | ||||||
|  |  | ||||||
| 2006-04-29  R<>mi Turboult  <r3mi(at)users.sourceforge.net> | 2006-04-29  R<>mi Turboult  <r3mi(at)users.sourceforge.net> | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -1,3 +1,4 @@ | |||||||
|  | # $Id: Makefile.am,v 1.5 2006/04/29 20:12:50 r3mi Exp $ | ||||||
| # | # | ||||||
| # Top-level "Makefile.am" for libupnp | # Top-level "Makefile.am" for libupnp | ||||||
| # | # | ||||||
| @@ -8,11 +9,7 @@ ACLOCAL_AMFLAGS = -I m4 | |||||||
|  |  | ||||||
| DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-samples | DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-samples | ||||||
|  |  | ||||||
| SUBDIRS = \ | SUBDIRS = ixml threadutil upnp docs/dist | ||||||
| 	ixml \ |  | ||||||
| 	threadutil \ |  | ||||||
| 	upnp \ |  | ||||||
| 	docs/dist |  | ||||||
|  |  | ||||||
|  |  | ||||||
| EXTRA_DIST = \ | EXTRA_DIST = \ | ||||||
| @@ -26,8 +23,7 @@ EXTRA_DIST = \ | |||||||
| 	build/libupnp.dsw \ | 	build/libupnp.dsw \ | ||||||
| 	build/inc/autoconfig.h \ | 	build/inc/autoconfig.h \ | ||||||
| 	build/inc/config.h \ | 	build/inc/config.h \ | ||||||
| 	build/inc/upnpconfig.h \ | 	build/inc/upnpconfig.h | ||||||
| 	build/msvc/inttypes.h |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # This variable must have 'exec' in its name, in order to be installed  | # This variable must have 'exec' in its name, in order to be installed  | ||||||
| @@ -35,7 +31,6 @@ EXTRA_DIST = \ | |||||||
| pkgconfigexecdir = $(libdir)/pkgconfig | pkgconfigexecdir = $(libdir)/pkgconfig | ||||||
| pkgconfigexec_DATA = libupnp.pc | pkgconfigexec_DATA = libupnp.pc | ||||||
|  |  | ||||||
|  |  | ||||||
| $(pkgconfigexec_DATA): config.status | $(pkgconfigexec_DATA): config.status | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								THANKS
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								THANKS
									
									
									
									
									
								
							| @@ -6,34 +6,23 @@ suggesting various improvements or submitting actual code. | |||||||
| Here is a list of these people. Help us keep it complete and | Here is a list of these people. Help us keep it complete and | ||||||
| exempt of errors. | exempt of errors. | ||||||
|  |  | ||||||
| - Alex (afaucher) |  | ||||||
| - Arno Willig | - Arno Willig | ||||||
| - Bob Ciora |  | ||||||
| - Chaos | - Chaos | ||||||
| - Craig Nelson |  | ||||||
| - David Maass | - David Maass | ||||||
| - Emil Ljungdahl |  | ||||||
| - Erik Johansson | - Erik Johansson | ||||||
| - Eric Tanguy | - Eric Tanguy | ||||||
| - Erwan Velu | - Erwan Velu | ||||||
| - Fredrik Svensson | - Fredrik Svensson | ||||||
| - Glen Masgai |  | ||||||
| - Jiri Zouhar | - Jiri Zouhar | ||||||
| - John Dennis | - John Dennis | ||||||
| - Jonathan (no_dice) | - Jonathan (no_dice) | ||||||
| - Keith Brindley |  | ||||||
| - Leuk_He | - Leuk_He | ||||||
| - Loigu | - Loigu | ||||||
| - Luke Kim | - Marcelo Roberto Jimenez | ||||||
| - Marcelo Roberto Jimenez (mroberto) |  | ||||||
| - Markus Strobl | - Markus Strobl | ||||||
| - Nektarios K. Papadopoulos | - Nektarios K. Papadopoulos | ||||||
| - Oskar Liljeblad | - Oskar Liljeblad | ||||||
| - Michael (Oxy) | - Michael (Oxy) | ||||||
| - Paul Vixie | - Paul Vixie | ||||||
| - Rene Hexel |  | ||||||
| - Siva Chandran | - Siva Chandran | ||||||
| - Stéphane Corthésy |  | ||||||
| - Timothy Redaelli |  | ||||||
| - Titus Winters |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,3 +13,7 @@ autoreconf --force --install -Wall -Wno-obsolete $* || exit 1 | |||||||
| echo "Now run ./configure and then make." | echo "Now run ./configure and then make." | ||||||
| exit 0 | exit 0 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /* autoconfig.h.  Generated from autoconfig.h.in by configure.  */ | /* autoconfig.h.  Generated by configure.  */ | ||||||
| /* autoconfig.h.in.  Generated from configure.ac by autoheader.  */ | /* autoconfig.h.in.  Generated from configure.ac by autoheader.  */ | ||||||
|  |  | ||||||
| /* Define to 1 to compile debug code */ | /* Define to 1 to compile debug code */ | ||||||
| @@ -19,18 +19,15 @@ | |||||||
| /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ | /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ | ||||||
| #define HAVE_FSEEKO 1 | #define HAVE_FSEEKO 1 | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `ftime' function. */ |  | ||||||
| #define HAVE_FTIME 1 |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <inttypes.h> header file. */ | /* Define to 1 if you have the <inttypes.h> header file. */ | ||||||
| #define HAVE_INTTYPES_H 1 | #define HAVE_INTTYPES_H 1 | ||||||
|  |  | ||||||
| /* Define to 1 if you have the `compat' library (-lcompat). */ |  | ||||||
| /* #undef HAVE_LIBCOMPAT */ |  | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <limits.h> header file. */ | /* Define to 1 if you have the <limits.h> header file. */ | ||||||
| #define HAVE_LIMITS_H 1 | #define HAVE_LIMITS_H 1 | ||||||
|  |  | ||||||
|  | /* Define to 1 if you have the <malloc.h> header file. */ | ||||||
|  | #define HAVE_MALLOC_H 1 | ||||||
|  |  | ||||||
| /* Define to 1 if you have the <memory.h> header file. */ | /* Define to 1 if you have the <memory.h> header file. */ | ||||||
| #define HAVE_MEMORY_H 1 | #define HAVE_MEMORY_H 1 | ||||||
|  |  | ||||||
| @@ -95,19 +92,19 @@ | |||||||
| #define PACKAGE "libupnp" | #define PACKAGE "libupnp" | ||||||
|  |  | ||||||
| /* Define to the address where bug reports for this package should be sent. */ | /* Define to the address where bug reports for this package should be sent. */ | ||||||
| #define PACKAGE_BUGREPORT "mroberto@users.sourceforge.net" | #define PACKAGE_BUGREPORT "virtual_worlds@gmx.de" | ||||||
|  |  | ||||||
| /* Define to the full name of this package. */ | /* Define to the full name of this package. */ | ||||||
| #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.4.0" | ||||||
|  |  | ||||||
| /* 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.4.0" | ||||||
|  |  | ||||||
| /* 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. */ | ||||||
| @@ -138,30 +135,27 @@ | |||||||
| #define UPNP_VERSION_MINOR 4 | #define UPNP_VERSION_MINOR 4 | ||||||
|  |  | ||||||
| /* see upnpconfig.h */ | /* see upnpconfig.h */ | ||||||
| #define UPNP_VERSION_PATCH 7 | #define UPNP_VERSION_PATCH 0 | ||||||
|  |  | ||||||
| /* see upnpconfig.h */ | /* see upnpconfig.h */ | ||||||
| #define UPNP_VERSION_STRING "1.4.7" | #define UPNP_VERSION_STRING "1.4.0" | ||||||
|  |  | ||||||
| /* Version number of package */ | /* Version number of package */ | ||||||
| #define VERSION "1.4.7" | #define VERSION "1.4.0" | ||||||
|  |  | ||||||
| /* File Offset size */ | /* Number of bits in a file offset, on hosts where this is settable. */ | ||||||
| #define _FILE_OFFSET_BITS 64 | #define _FILE_OFFSET_BITS 64 | ||||||
|  |  | ||||||
| /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ | /* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ | ||||||
| /* #undef _LARGEFILE_SOURCE */ | /* #undef _LARGEFILE_SOURCE */ | ||||||
|  |  | ||||||
| /* Large files support */ | /* Define for large files, on AIX-style hosts. */ | ||||||
| #define _LARGE_FILE_SOURCE  | /* #undef _LARGE_FILES */ | ||||||
|  |  | ||||||
| /* 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 */ | ||||||
|  |  | ||||||
| /* Define to `long int' if <sys/types.h> does not define. */ | /* Define to `unsigned' if <sys/types.h> does not define. */ | ||||||
| /* #undef off_t */ |  | ||||||
|  |  | ||||||
| /* Define to `unsigned int' if <sys/types.h> does not define. */ |  | ||||||
| /* #undef size_t */ | /* #undef size_t */ | ||||||
|  |  | ||||||
| /* Substitute for socklen_t */ | /* Substitute for socklen_t */ | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ | |||||||
|  |  | ||||||
| #include "autoconfig.h" | #include "autoconfig.h" | ||||||
|  |  | ||||||
|  | #define MAX_JOBS_TOTAL 10 | ||||||
|  |  | ||||||
| /** @name Compile time configuration options | /** @name Compile time configuration options | ||||||
|  *  The Linux SDK for UPnP Devices contains some compile-time parameters  |  *  The Linux SDK for UPnP Devices contains some compile-time parameters  | ||||||
| @@ -95,17 +96,6 @@ | |||||||
| #define MAX_THREADS 12  | #define MAX_THREADS 12  | ||||||
| //@} | //@} | ||||||
|  |  | ||||||
| /** @name MAX_JOBS_TOTAL |  | ||||||
|  *  The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs |  | ||||||
|  *  that can be queued. If this limit is reached further jobs will be thrown |  | ||||||
|  *  to avoid memory exhaustion. The default value 100. |  | ||||||
|  *  (Added by Axis.) |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| //@{ |  | ||||||
| #define MAX_JOBS_TOTAL 100 |  | ||||||
| //@} |  | ||||||
|  |  | ||||||
| /** @name DEFAULT_SOAP_CONTENT_LENGTH | /** @name DEFAULT_SOAP_CONTENT_LENGTH | ||||||
|  * SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.   |  * SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.   | ||||||
|  * This prevents devices that have a misbehaving web server to send  |  * This prevents devices that have a misbehaving web server to send  | ||||||
| @@ -261,7 +251,7 @@ | |||||||
|  |  | ||||||
| /** @name Other debugging features | /** @name Other debugging features | ||||||
|           The UPnP SDK contains other features to aid in debugging: |           The UPnP SDK contains other features to aid in debugging: | ||||||
| 	  see <upnp/inc/upnpdebug.h> | 	  see <upnp/upnpdebug.h> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define DEBUG_ALL		1    | #define DEBUG_ALL		1    | ||||||
| @@ -304,6 +294,27 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** @name DBGONLY | ||||||
|  |           The {\bf DBGONLY} macro allows code to be marked so that it | ||||||
|  |           is only included in the DEBUG build and not the release.  To | ||||||
|  |           use this macro, put the code inside of the parentheses: | ||||||
|  |  | ||||||
|  |           {\tt DBGONLY(int i;)} | ||||||
|  |  | ||||||
|  |           This will cause a declaration of the integer {\tt i} only | ||||||
|  |           in the debug build. | ||||||
|  |   */ | ||||||
|  |  | ||||||
|  | //@{ | ||||||
|  | #ifdef DEBUG | ||||||
|  |  #define DBGONLY(x) x | ||||||
|  | #else | ||||||
|  |  #define DBGONLY(x) | ||||||
|  | #endif | ||||||
|  | //@} | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #undef  EXCLUDE_WEB_SERVER | #undef  EXCLUDE_WEB_SERVER | ||||||
| #undef  EXCLUDE_MINISERVER | #undef  EXCLUDE_MINISERVER | ||||||
| #ifdef  INTERNAL_WEB_SERVER | #ifdef  INTERNAL_WEB_SERVER | ||||||
| @@ -338,6 +349,13 @@ | |||||||
|  #define CLIENTONLY(x) |  #define CLIENTONLY(x) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef INCLUDE_DEVICE_APIS | ||||||
|  |  #define DEVICEONLY(x) x | ||||||
|  | #else | ||||||
|  |  #define DEVICEONLY(x) | ||||||
|  | #endif | ||||||
|  |  | ||||||
| //@} | //@} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| /* upnp/inc/upnpconfig.h.  Generated from upnpconfig.h.in by configure.  */ | /* upnp/inc/upnpconfig.h.  Generated by configure.  */ | ||||||
| // -*- C -*- | // -*- C -*- | ||||||
| /////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////// | ||||||
| // | // | ||||||
| @@ -40,7 +40,7 @@ | |||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
|  |  | ||||||
| /** 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.4.0" | ||||||
|  |  | ||||||
| /** Major version of the library */ | /** Major version of the library */ | ||||||
| #define UPNP_VERSION_MAJOR 1 | #define UPNP_VERSION_MAJOR 1 | ||||||
| @@ -49,7 +49,7 @@ | |||||||
| #define UPNP_VERSION_MINOR 4 | #define UPNP_VERSION_MINOR 4 | ||||||
|  |  | ||||||
| /** Patch version of the library */ | /** Patch version of the library */ | ||||||
| #define UPNP_VERSION_PATCH 7 | #define UPNP_VERSION_PATCH 0 | ||||||
|  |  | ||||||
| /** 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	\ | ||||||
| @@ -69,7 +69,7 @@ | |||||||
|  |  | ||||||
| /** Defined to 1 if the library has been compiled with DEBUG enabled | /** Defined to 1 if the library has been compiled with DEBUG enabled | ||||||
|  *  (i.e. configure --enable-debug) : <upnp/upnpdebug.h> file is available */ |  *  (i.e. configure --enable-debug) : <upnp/upnpdebug.h> file is available */ | ||||||
| /* #undef UPNP_HAVE_DEBUG */ | #undef UPNP_HAVE_DEBUG | ||||||
|  |  | ||||||
|  |  | ||||||
| /** Defined to 1 if the library has been compiled with client API enabled | /** Defined to 1 if the library has been compiled with client API enabled | ||||||
|   | |||||||
| @@ -1,301 +0,0 @@ | |||||||
| // ISO C9x  compliant inttypes.h for Microsoft Visual Studio |  | ||||||
| // Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124  |  | ||||||
| //  |  | ||||||
| //  Copyright (c) 2006 Alexander Chemeris |  | ||||||
| //  |  | ||||||
| // Redistribution and use in source and binary forms, with or without |  | ||||||
| // modification, are permitted provided that the following conditions are met: |  | ||||||
| //  |  | ||||||
| //   1. Redistributions of source code must retain the above copyright notice, |  | ||||||
| //      this list of conditions and the following disclaimer. |  | ||||||
| //  |  | ||||||
| //   2. Redistributions in binary form must reproduce the above copyright |  | ||||||
| //      notice, this list of conditions and the following disclaimer in the |  | ||||||
| //      documentation and/or other materials provided with the distribution. |  | ||||||
| //  |  | ||||||
| //   3. The name of the author may be used to endorse or promote products |  | ||||||
| //      derived from this software without specific prior written permission. |  | ||||||
| //  |  | ||||||
| // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |  | ||||||
| // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |  | ||||||
| // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |  | ||||||
| // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |  | ||||||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |  | ||||||
| // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |  | ||||||
| // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  |  | ||||||
| // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |  | ||||||
| // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |  | ||||||
| // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |  | ||||||
| //  |  | ||||||
| /////////////////////////////////////////////////////////////////////////////// |  | ||||||
|  |  | ||||||
| #ifndef _MSC_VER // [ |  | ||||||
| #error "Use this header only with Microsoft Visual C++ compilers!" |  | ||||||
| #endif // _MSC_VER ] |  | ||||||
|  |  | ||||||
| #ifndef _MSC_INTTYPES_H_ // [ |  | ||||||
| #define _MSC_INTTYPES_H_ |  | ||||||
|  |  | ||||||
| #if _MSC_VER > 1000 |  | ||||||
| #pragma once |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <stdint.h> |  | ||||||
|  |  | ||||||
| // 7.8 Format conversion of integer types |  | ||||||
|  |  | ||||||
| typedef struct { |  | ||||||
|    intmax_t quot; |  | ||||||
|    intmax_t rem; |  | ||||||
| } imaxdiv_t; |  | ||||||
|  |  | ||||||
| // 7.8.1 Macros for format specifiers |  | ||||||
|  |  | ||||||
| // The fprintf macros for signed integers are: |  | ||||||
| #define PRId8       "d" |  | ||||||
| #define PRIi8       "i" |  | ||||||
| #define PRIdLEAST8  "d" |  | ||||||
| #define PRIiLEAST8  "i" |  | ||||||
| #define PRIdFAST8   "d" |  | ||||||
| #define PRIiFAST8   "i" |  | ||||||
|  |  | ||||||
| #define PRId16       "hd" |  | ||||||
| #define PRIi16       "hi" |  | ||||||
| #define PRIdLEAST16  "hd" |  | ||||||
| #define PRIiLEAST16  "hi" |  | ||||||
| #define PRIdFAST16   "hd" |  | ||||||
| #define PRIiFAST16   "hi" |  | ||||||
|  |  | ||||||
| #define PRId32       "I32d" |  | ||||||
| #define PRIi32       "I32i" |  | ||||||
| #define PRIdLEAST32  "I32d" |  | ||||||
| #define PRIiLEAST32  "I32i" |  | ||||||
| #define PRIdFAST32   "I32d" |  | ||||||
| #define PRIiFAST32   "I32i" |  | ||||||
|  |  | ||||||
| #define PRId64       "I64d" |  | ||||||
| #define PRIi64       "I64i" |  | ||||||
| #define PRIdLEAST64  "I64d" |  | ||||||
| #define PRIiLEAST64  "I64i" |  | ||||||
| #define PRIdFAST64   "I64d" |  | ||||||
| #define PRIiFAST64   "I64i" |  | ||||||
|  |  | ||||||
| #define PRIdMAX     "I64d" |  | ||||||
| #define PRIiMAX     "I64i" |  | ||||||
|  |  | ||||||
| #define PRIdPTR     "Id" |  | ||||||
| #define PRIiPTR     "Ii" |  | ||||||
|  |  | ||||||
| // The fprintf macros for unsigned integers are: |  | ||||||
| #define PRIo8       "o" |  | ||||||
| #define PRIu8       "u" |  | ||||||
| #define PRIx8       "x" |  | ||||||
| #define PRIX8       "X" |  | ||||||
| #define PRIoLEAST8  "o" |  | ||||||
| #define PRIuLEAST8  "u" |  | ||||||
| #define PRIxLEAST8  "x" |  | ||||||
| #define PRIXLEAST8  "X" |  | ||||||
| #define PRIoFAST8   "o" |  | ||||||
| #define PRIuFAST8   "u" |  | ||||||
| #define PRIxFAST8   "x" |  | ||||||
| #define PRIXFAST8   "X" |  | ||||||
|  |  | ||||||
| #define PRIo16       "ho" |  | ||||||
| #define PRIu16       "hu" |  | ||||||
| #define PRIx16       "hx" |  | ||||||
| #define PRIX16       "hX" |  | ||||||
| #define PRIoLEAST16  "ho" |  | ||||||
| #define PRIuLEAST16  "hu" |  | ||||||
| #define PRIxLEAST16  "hx" |  | ||||||
| #define PRIXLEAST16  "hX" |  | ||||||
| #define PRIoFAST16   "ho" |  | ||||||
| #define PRIuFAST16   "hu" |  | ||||||
| #define PRIxFAST16   "hx" |  | ||||||
| #define PRIXFAST16   "hX" |  | ||||||
|  |  | ||||||
| #define PRIo32       "I32o" |  | ||||||
| #define PRIu32       "I32u" |  | ||||||
| #define PRIx32       "I32x" |  | ||||||
| #define PRIX32       "I32X" |  | ||||||
| #define PRIoLEAST32  "I32o" |  | ||||||
| #define PRIuLEAST32  "I32u" |  | ||||||
| #define PRIxLEAST32  "I32x" |  | ||||||
| #define PRIXLEAST32  "I32X" |  | ||||||
| #define PRIoFAST32   "I32o" |  | ||||||
| #define PRIuFAST32   "I32u" |  | ||||||
| #define PRIxFAST32   "I32x" |  | ||||||
| #define PRIXFAST32   "I32X" |  | ||||||
|  |  | ||||||
| #define PRIo64       "I64o" |  | ||||||
| #define PRIu64       "I64u" |  | ||||||
| #define PRIx64       "I64x" |  | ||||||
| #define PRIX64       "I64X" |  | ||||||
| #define PRIoLEAST64  "I64o" |  | ||||||
| #define PRIuLEAST64  "I64u" |  | ||||||
| #define PRIxLEAST64  "I64x" |  | ||||||
| #define PRIXLEAST64  "I64X" |  | ||||||
| #define PRIoFAST64   "I64o" |  | ||||||
| #define PRIuFAST64   "I64u" |  | ||||||
| #define PRIxFAST64   "I64x" |  | ||||||
| #define PRIXFAST64   "I64X" |  | ||||||
|  |  | ||||||
| #define PRIoMAX     "I64o" |  | ||||||
| #define PRIuMAX     "I64u" |  | ||||||
| #define PRIxMAX     "I64x" |  | ||||||
| #define PRIXMAX     "I64X" |  | ||||||
|  |  | ||||||
| #define PRIoPTR     "Io" |  | ||||||
| #define PRIuPTR     "Iu" |  | ||||||
| #define PRIxPTR     "Ix" |  | ||||||
| #define PRIXPTR     "IX" |  | ||||||
|  |  | ||||||
| // The fscanf macros for signed integers are: |  | ||||||
| #define SCNd8       "d" |  | ||||||
| #define SCNi8       "i" |  | ||||||
| #define SCNdLEAST8  "d" |  | ||||||
| #define SCNiLEAST8  "i" |  | ||||||
| #define SCNdFAST8   "d" |  | ||||||
| #define SCNiFAST8   "i" |  | ||||||
|  |  | ||||||
| #define SCNd16       "hd" |  | ||||||
| #define SCNi16       "hi" |  | ||||||
| #define SCNdLEAST16  "hd" |  | ||||||
| #define SCNiLEAST16  "hi" |  | ||||||
| #define SCNdFAST16   "hd" |  | ||||||
| #define SCNiFAST16   "hi" |  | ||||||
|  |  | ||||||
| #define SCNd32       "ld" |  | ||||||
| #define SCNi32       "li" |  | ||||||
| #define SCNdLEAST32  "ld" |  | ||||||
| #define SCNiLEAST32  "li" |  | ||||||
| #define SCNdFAST32   "ld" |  | ||||||
| #define SCNiFAST32   "li" |  | ||||||
|  |  | ||||||
| #define SCNd64       "I64d" |  | ||||||
| #define SCNi64       "I64i" |  | ||||||
| #define SCNdLEAST64  "I64d" |  | ||||||
| #define SCNiLEAST64  "I64i" |  | ||||||
| #define SCNdFAST64   "I64d" |  | ||||||
| #define SCNiFAST64   "I64i" |  | ||||||
|  |  | ||||||
| #define SCNdMAX     "I64d" |  | ||||||
| #define SCNiMAX     "I64i" |  | ||||||
|  |  | ||||||
| #ifdef _WIN64 // [ |  | ||||||
| #  define SCNdPTR     "I64d" |  | ||||||
| #  define SCNiPTR     "I64i" |  | ||||||
| #else  // _WIN64 ][ |  | ||||||
| #  define SCNdPTR     "ld" |  | ||||||
| #  define SCNiPTR     "li" |  | ||||||
| #endif  // _WIN64 ] |  | ||||||
|  |  | ||||||
| // The fscanf macros for unsigned integers are: |  | ||||||
| #define SCNo8       "o" |  | ||||||
| #define SCNu8       "u" |  | ||||||
| #define SCNx8       "x" |  | ||||||
| #define SCNX8       "X" |  | ||||||
| #define SCNoLEAST8  "o" |  | ||||||
| #define SCNuLEAST8  "u" |  | ||||||
| #define SCNxLEAST8  "x" |  | ||||||
| #define SCNXLEAST8  "X" |  | ||||||
| #define SCNoFAST8   "o" |  | ||||||
| #define SCNuFAST8   "u" |  | ||||||
| #define SCNxFAST8   "x" |  | ||||||
| #define SCNXFAST8   "X" |  | ||||||
|  |  | ||||||
| #define SCNo16       "ho" |  | ||||||
| #define SCNu16       "hu" |  | ||||||
| #define SCNx16       "hx" |  | ||||||
| #define SCNX16       "hX" |  | ||||||
| #define SCNoLEAST16  "ho" |  | ||||||
| #define SCNuLEAST16  "hu" |  | ||||||
| #define SCNxLEAST16  "hx" |  | ||||||
| #define SCNXLEAST16  "hX" |  | ||||||
| #define SCNoFAST16   "ho" |  | ||||||
| #define SCNuFAST16   "hu" |  | ||||||
| #define SCNxFAST16   "hx" |  | ||||||
| #define SCNXFAST16   "hX" |  | ||||||
|  |  | ||||||
| #define SCNo32       "lo" |  | ||||||
| #define SCNu32       "lu" |  | ||||||
| #define SCNx32       "lx" |  | ||||||
| #define SCNX32       "lX" |  | ||||||
| #define SCNoLEAST32  "lo" |  | ||||||
| #define SCNuLEAST32  "lu" |  | ||||||
| #define SCNxLEAST32  "lx" |  | ||||||
| #define SCNXLEAST32  "lX" |  | ||||||
| #define SCNoFAST32   "lo" |  | ||||||
| #define SCNuFAST32   "lu" |  | ||||||
| #define SCNxFAST32   "lx" |  | ||||||
| #define SCNXFAST32   "lX" |  | ||||||
|  |  | ||||||
| #define SCNo64       "I64o" |  | ||||||
| #define SCNu64       "I64u" |  | ||||||
| #define SCNx64       "I64x" |  | ||||||
| #define SCNX64       "I64X" |  | ||||||
| #define SCNoLEAST64  "I64o" |  | ||||||
| #define SCNuLEAST64  "I64u" |  | ||||||
| #define SCNxLEAST64  "I64x" |  | ||||||
| #define SCNXLEAST64  "I64X" |  | ||||||
| #define SCNoFAST64   "I64o" |  | ||||||
| #define SCNuFAST64   "I64u" |  | ||||||
| #define SCNxFAST64   "I64x" |  | ||||||
| #define SCNXFAST64   "I64X" |  | ||||||
|  |  | ||||||
| #define SCNoMAX     "I64o" |  | ||||||
| #define SCNuMAX     "I64u" |  | ||||||
| #define SCNxMAX     "I64x" |  | ||||||
| #define SCNXMAX     "I64X" |  | ||||||
|  |  | ||||||
| #ifdef _WIN64 // [ |  | ||||||
| #  define SCNoPTR     "I64o" |  | ||||||
| #  define SCNuPTR     "I64u" |  | ||||||
| #  define SCNxPTR     "I64x" |  | ||||||
| #  define SCNXPTR     "I64X" |  | ||||||
| #else  // _WIN64 ][ |  | ||||||
| #  define SCNoPTR     "lo" |  | ||||||
| #  define SCNuPTR     "lu" |  | ||||||
| #  define SCNxPTR     "lx" |  | ||||||
| #  define SCNXPTR     "lX" |  | ||||||
| #endif  // _WIN64 ] |  | ||||||
|  |  | ||||||
| // 7.8.2 Functions for greatest-width integer types |  | ||||||
|  |  | ||||||
| // 7.8.2.1 The imaxabs function |  | ||||||
| #define imaxabs _abs64 |  | ||||||
|  |  | ||||||
| // 7.8.2.2 The imaxdiv function |  | ||||||
|  |  | ||||||
| // This is modified version of div() function from Microsoft's div.c found |  | ||||||
| // in %MSVC.NET%\crt\src\div.c |  | ||||||
| #ifdef STATIC_IMAXDIV // [ |  | ||||||
| static |  | ||||||
| #else // STATIC_IMAXDIV ][ |  | ||||||
| _inline |  | ||||||
| #endif // STATIC_IMAXDIV ] |  | ||||||
| imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom) |  | ||||||
| { |  | ||||||
|    imaxdiv_t result; |  | ||||||
|  |  | ||||||
|    result.quot = numer / denom; |  | ||||||
|    result.rem = numer % denom; |  | ||||||
|  |  | ||||||
|    if (numer < 0 && result.rem > 0) { |  | ||||||
|       // did division wrong; must fix up |  | ||||||
|       ++result.quot; |  | ||||||
|       result.rem -= denom; |  | ||||||
|    } |  | ||||||
|  |  | ||||||
|    return result; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 7.8.2.3 The strtoimax and strtoumax functions |  | ||||||
| #define strtoimax _strtoi64 |  | ||||||
| #define strtoumax _strtoui64 |  | ||||||
|  |  | ||||||
| // 7.8.2.4 The wcstoimax and wcstoumax functions |  | ||||||
| #define wcstoimax _wcstoi64 |  | ||||||
| #define wcstoumax _wcstoui64 |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif // _MSC_INTTYPES_H_ ] |  | ||||||
							
								
								
									
										140
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										140
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,16 +1,16 @@ | |||||||
| # -*- Autoconf -*- | # -*- Autoconf -*- | ||||||
|  | # $Id: configure.ac,v 1.11 2006/04/09 13:59:44 r3mi Exp $ | ||||||
| # | # | ||||||
| # Top-level configure.ac file for libupnp | # Top-level configure.ac file for libupnp | ||||||
| # | # | ||||||
| # Process this file with autoconf to produce a configure script. | # Process this file with autoconf to produce a configure script. | ||||||
| # | # | ||||||
| # (C) Copyright 2005-2007 R<>mi Turboult <r3mi@users.sourceforge.net> | # (C) Copyright 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net> | ||||||
| # | # | ||||||
|  |  | ||||||
| AC_PREREQ(2.60) | AC_PREREQ(2.60) | ||||||
|  |  | ||||||
| AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net]) | AC_INIT([libupnp], [1.4.3], [mroberto@users.sourceforge.net]) | ||||||
| ############################################################################### |  | ||||||
| # *Independently* of the above libupnp package version, the libtool version | # *Independently* of the above libupnp package version, the libtool version | ||||||
| # of the 3 libraries need to be updated whenever there is a change released : | # of the 3 libraries need to be updated whenever there is a change released : | ||||||
| # "current:revision:age" (this is NOT the same as the package version), where: | # "current:revision:age" (this is NOT the same as the package version), where: | ||||||
| @@ -20,14 +20,11 @@ AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net]) | |||||||
| # 	- interfaces removed:			age=0 | # 	- interfaces removed:			age=0 | ||||||
| # *please update only once, before a formal release, not for each change* | # *please update only once, before a formal release, not for each change* | ||||||
| # | # | ||||||
| ############################################################################### | # For release 1.4.1, we had: | ||||||
| # Release 1.4.1: |  | ||||||
| #AC_SUBST([LT_VERSION_IXML],       [2:2:0]) | #AC_SUBST([LT_VERSION_IXML],       [2:2:0]) | ||||||
| #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) | #AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) | ||||||
| #AC_SUBST([LT_VERSION_UPNP],       [2:2:0]) | #AC_SUBST([LT_VERSION_UPNP],       [2:2:0]) | ||||||
| # | # | ||||||
| ############################################################################### |  | ||||||
| # Release 1.4.6: |  | ||||||
| # "current:revision:age" | # "current:revision:age" | ||||||
| # | # | ||||||
| # - Code has changed in ixml | # - Code has changed in ixml | ||||||
| @@ -38,78 +35,19 @@ AC_INIT([libupnp], [1.6.1], [mroberto@users.sourceforge.net]) | |||||||
| #	current: 2 -> 3 | #	current: 2 -> 3 | ||||||
| #	revisiion: 3 -> 0 | #	revisiion: 3 -> 0 | ||||||
| #	age: 0 -> 1 | #	age: 0 -> 1 | ||||||
| # - Code has changed in upnp | # - Code has changed in upnp (revision 2 -> 3) | ||||||
| #	revision: 2 -> 3 | #	revision: 2 -> 3 | ||||||
| # | AC_SUBST([LT_VERSION_IXML],       [2:3:0]) | ||||||
| #AC_SUBST([LT_VERSION_IXML],       [2:3:0]) | AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1]) | ||||||
| #AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1]) | AC_SUBST([LT_VERSION_UPNP],       [2:3:0]) | ||||||
| #AC_SUBST([LT_VERSION_UPNP],       [2:3:0]) |  | ||||||
| # |  | ||||||
| ############################################################################### |  | ||||||
| # Release 1.6.0: |  | ||||||
| # "current:revision:age" |  | ||||||
| # |  | ||||||
| # - Code has changed in ixml |  | ||||||
| #	revision: 3 -> 4 |  | ||||||
| # - Code has changed in threadutil |  | ||||||
| #	revision: 0 -> 1 |  | ||||||
| # - Code has changed in upnp |  | ||||||
| #	revision: 3 -> 4 |  | ||||||
| # - Interface changed in upnp |  | ||||||
| #	current: 2 -> 3 |  | ||||||
| #	revision: 4 -> 0 |  | ||||||
| # - Interface removed in upnp |  | ||||||
| #	age: 0 -> 0 |  | ||||||
| # |  | ||||||
| #AC_SUBST([LT_VERSION_IXML],       [2:4:0]) |  | ||||||
| #AC_SUBST([LT_VERSION_THREADUTIL], [3:1:1]) |  | ||||||
| #AC_SUBST([LT_VERSION_UPNP],       [3:0:0]) |  | ||||||
| # |  | ||||||
| ############################################################################### |  | ||||||
| # Release 1.6.1: |  | ||||||
| # "current:revision:age" |  | ||||||
| # |  | ||||||
| # - Code has changed in threadutil |  | ||||||
| #	revision: 1 -> 2 |  | ||||||
| # - Interface added in threadutil |  | ||||||
| #	current: 3 -> 4 |  | ||||||
| #	revision: 2 -> 0 |  | ||||||
| # - Interface added in threadutil |  | ||||||
| #	age: 1 -> 2 |  | ||||||
| # - Code has changed in upnp |  | ||||||
| #	revision: 0 -> 1 |  | ||||||
| # |  | ||||||
| #AC_SUBST([LT_VERSION_IXML],       [2:4:0]) |  | ||||||
| #AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) |  | ||||||
| #AC_SUBST([LT_VERSION_UPNP],       [3:1:0]) |  | ||||||
| # |  | ||||||
| ############################################################################### |  | ||||||
| AC_SUBST([LT_VERSION_IXML],       [2:4:0]) |  | ||||||
| AC_SUBST([LT_VERSION_THREADUTIL], [4:0:2]) |  | ||||||
| AC_SUBST([LT_VERSION_UPNP],       [3:1:0]) |  | ||||||
| ############################################################################### |  | ||||||
| # Repeating the algorithm so that it is closer to the modificatin place: |  | ||||||
| # 	- library code modified:		revision++ |  | ||||||
| # 	- interfaces changed/added/removed:	current++ and revision=0 |  | ||||||
| # 	- interfaces added: 			age++ |  | ||||||
| # 	- interfaces removed:			age=0 |  | ||||||
| # *please update only once, before a formal release, not for each change* |  | ||||||
| ############################################################################### |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AC_CONFIG_AUX_DIR(config.aux) | AC_CONFIG_AUX_DIR(config.aux) | ||||||
| AC_CONFIG_MACRO_DIR(m4) | AC_CONFIG_MACRO_DIR(m4) | ||||||
| AC_CONFIG_SRCDIR(upnp/inc/upnp.h) | AC_CONFIG_SRCDIR(upnp/inc/upnp.h) | ||||||
|  |  | ||||||
|  |  | ||||||
| AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2]) | AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2]) | ||||||
|  |  | ||||||
|  |  | ||||||
| # |  | ||||||
| # Get canonical host names in host and host_os |  | ||||||
| # |  | ||||||
| AC_CANONICAL_HOST |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # There are 3 configuration files : | # There are 3 configuration files : | ||||||
| # 1) "./autoconfig.h" is auto-generated and used only internally during build | # 1) "./autoconfig.h" is auto-generated and used only internally during build | ||||||
| @@ -193,14 +131,11 @@ RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code]) | |||||||
| # version on that. | # version on that. | ||||||
| docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}" | docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}" | ||||||
| AC_MSG_CHECKING([for documentation directory]) | AC_MSG_CHECKING([for documentation directory]) | ||||||
| AC_ARG_WITH( | AC_ARG_WITH([documentation],  | ||||||
| 	[documentation],  | 	AS_HELP_STRING([--with-documentation=directory_name], | ||||||
| 	AS_HELP_STRING( |  | ||||||
| 		[--with-documentation=directory_name], |  | ||||||
| 		[where documentation is installed  | 		[where documentation is installed  | ||||||
| 		 @<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@]) | 		 @<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@]) | ||||||
| AS_HELP_STRING( | AS_HELP_STRING([--without-documentation], | ||||||
| 		[--without-documentation], |  | ||||||
| 		[do not install the documentation]), | 		[do not install the documentation]), | ||||||
| 	[], | 	[], | ||||||
| 	[with_documentation=no]) | 	[with_documentation=no]) | ||||||
| @@ -224,19 +159,10 @@ AC_PROG_INSTALL | |||||||
| AC_PROG_MAKE_SET | AC_PROG_MAKE_SET | ||||||
| AC_PROG_EGREP | AC_PROG_EGREP | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # Default compilation flags | # Default compilation flags | ||||||
| # | # | ||||||
| echo "--------------------- Default compilation flags -------------------------------" |  | ||||||
| echo host is $host |  | ||||||
| echo host_os is $host_os |  | ||||||
| case $host_os in |  | ||||||
| freebsd*) |  | ||||||
| 	echo "Using FreeBSD specific compiler settings" |  | ||||||
| 	# Put FreeBSD specific compiler flags here |  | ||||||
| 	;; |  | ||||||
| *) |  | ||||||
| 	echo "Using non-specific system compiler settings" |  | ||||||
| if test x"$enable_debug" = xyes; then | if test x"$enable_debug" = xyes; then | ||||||
| 	# AC_PROG_CC already sets CFLAGS to "-g -O2" by default | 	# AC_PROG_CC already sets CFLAGS to "-g -O2" by default | ||||||
| 	: | 	: | ||||||
| @@ -244,20 +170,14 @@ freebsd*) | |||||||
| 	# add optimise for size | 	# add optimise for size | ||||||
| 	AX_CFLAGS_GCC_OPTION([-Os]) | 	AX_CFLAGS_GCC_OPTION([-Os]) | ||||||
| fi | fi | ||||||
| 	;; |  | ||||||
| esac |  | ||||||
|  |  | ||||||
| AX_CFLAGS_WARN_ALL | AX_CFLAGS_WARN_ALL | ||||||
| echo "-------------------------------------------------------------------------------" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # Lot's of stuff to ensure large file support | # Lot's of stuff to ensure large file support | ||||||
| # | # | ||||||
| AC_TYPE_SIZE_T |  | ||||||
| AC_TYPE_OFF_T | AC_TYPE_OFF_T | ||||||
| AC_DEFINE([_LARGE_FILE_SOURCE], [], [Large files support]) | AC_DEFINE(_LARGE_FILE_SOURCE, [], [Large files support]) | ||||||
| AC_DEFINE([_FILE_OFFSET_BITS], [64], [File Offset size]) | AC_DEFINE(_FILE_OFFSET_BITS, [64], [File Offset size]) | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| @@ -266,25 +186,7 @@ AC_DEFINE([_FILE_OFFSET_BITS], [64], [File Offset size]) | |||||||
| AC_HEADER_STDC | AC_HEADER_STDC | ||||||
| # libupnp code doesn't use autoconf variables yet, | # libupnp code doesn't use autoconf variables yet, | ||||||
| # so just abort if a header file is not found. | # so just abort if a header file is not found. | ||||||
| AC_CHECK_HEADERS( | AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h sys/ioctl.h sys/socket.h sys/time.h sys/timeb.h syslog.h unistd.h],[],[AC_MSG_ERROR([required header file missing])]) | ||||||
| 	[ \ |  | ||||||
| 	arpa/inet.h \ |  | ||||||
| 	fcntl.h \ |  | ||||||
| 	inttypes.h \ |  | ||||||
| 	limits.h \ |  | ||||||
| 	netdb.h \ |  | ||||||
| 	netinet/in.h \ |  | ||||||
| 	stdlib.h \ |  | ||||||
| 	string.h \ |  | ||||||
| 	sys/ioctl.h \ |  | ||||||
| 	sys/socket.h \ |  | ||||||
| 	sys/time.h \ |  | ||||||
| 	sys/timeb.h \ |  | ||||||
| 	syslog.h \ |  | ||||||
| 	unistd.h \ |  | ||||||
| 	], |  | ||||||
| 	[], |  | ||||||
| 	[AC_MSG_ERROR([required header file missing])]) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| @@ -300,29 +202,25 @@ TYPE_SOCKLEN_T | |||||||
| # | # | ||||||
| AC_FUNC_VPRINTF | AC_FUNC_VPRINTF | ||||||
| AC_FUNC_FSEEKO | AC_FUNC_FSEEKO | ||||||
| AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)]) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # | # | ||||||
| # Checks for POSIX Threads | # Checks for POSIX Threads | ||||||
| # | # | ||||||
| ACX_PTHREAD( | ACX_PTHREAD([],[AC_MSG_ERROR([POSIX threads are required to build this program])]) | ||||||
| 	[], |  | ||||||
| 	[AC_MSG_ERROR([POSIX threads are required to build this program])]) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| AC_CONFIG_FILES([ |  | ||||||
| 	Makefile |  | ||||||
|  | AC_CONFIG_FILES([Makefile | ||||||
| 		 ixml/Makefile | 		 ixml/Makefile | ||||||
| 		 ixml/doc/Makefile | 		 ixml/doc/Makefile | ||||||
|                  threadutil/Makefile |                  threadutil/Makefile | ||||||
| 		 upnp/Makefile | 		 upnp/Makefile | ||||||
| 		 upnp/doc/Makefile | 		 upnp/doc/Makefile | ||||||
| 	upnp/sample/Makefile |  | ||||||
| 		 docs/dist/Makefile | 		 docs/dist/Makefile | ||||||
| 		 libupnp.pc | 		 libupnp.pc | ||||||
|                  ]) |                  ]) | ||||||
|  |  | ||||||
|  |  | ||||||
| AC_OUTPUT | AC_OUTPUT | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										125
									
								
								ixml/inc/ixml.h
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								ixml/inc/ixml.h
									
									
									
									
									
								
							| @@ -1,47 +1,46 @@ | |||||||
| /******************************************************************************* | /////////////////////////////////////////////////////////////////////////// | ||||||
|  * | // | ||||||
|  * 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 _IXML_H_ | #ifndef _IXML_H_ | ||||||
| #define _IXML_H_ | #define _IXML_H_ | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
|  | //#include <malloc.h> | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|  #ifndef UPNP_STATIC_LIB |  #ifndef UPNP_STATIC_LIB | ||||||
|   #ifdef LIBUPNP_EXPORTS |   #ifdef LIBUPNP_EXPORTS | ||||||
| 			/* set up declspec for dll export to make functions visible to library users */ |   // set up declspec for dll export to make functions visible to library users | ||||||
|    #define EXPORT_SPEC __declspec(dllexport) |    #define EXPORT_SPEC __declspec(dllexport) | ||||||
|   #else |   #else | ||||||
|    #define EXPORT_SPEC __declspec(dllimport) |    #define EXPORT_SPEC __declspec(dllimport) | ||||||
| @@ -55,7 +54,6 @@ | |||||||
|  |  | ||||||
| typedef int BOOL; | typedef int BOOL; | ||||||
|  |  | ||||||
|  |  | ||||||
| #define DOMString   char * | #define DOMString   char * | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -90,7 +88,7 @@ typedef int BOOL; | |||||||
|  * etc., refer to section 1.1 of the DOM2-Core recommendation. |  * etc., refer to section 1.1 of the DOM2-Core recommendation. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| * | * | ||||||
| @@ -123,7 +121,7 @@ typedef enum | |||||||
| * | * | ||||||
| *=================================================================*/ | *=================================================================*/ | ||||||
| typedef enum  | typedef enum  | ||||||
| {   /* see DOM spec */ | {   // see DOM spec | ||||||
|     IXML_INDEX_SIZE_ERR                 = 1, |     IXML_INDEX_SIZE_ERR                 = 1, | ||||||
|     IXML_DOMSTRING_SIZE_ERR             = 2, |     IXML_DOMSTRING_SIZE_ERR             = 2, | ||||||
|     IXML_HIERARCHY_REQUEST_ERR          = 3, |     IXML_HIERARCHY_REQUEST_ERR          = 3, | ||||||
| @@ -242,7 +240,7 @@ extern "C" { | |||||||
|  * its functionality.  For more information, refer to DOM2-Core page 34. |  * its functionality.  For more information, refer to DOM2-Core page 34. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|   /** Returns the name of the {\bf Node}, depending on what type of  |   /** Returns the name of the {\bf Node}, depending on what type of  | ||||||
|    *  {\bf Node} it is, in a read-only string. Refer to the table in the  |    *  {\bf Node} it is, in a read-only string. Refer to the table in the  | ||||||
| @@ -622,7 +620,7 @@ ixmlNode_cloneNode(IXML_Node *nodeptr, | |||||||
|    */ |    */ | ||||||
|  |  | ||||||
| EXPORT_SPEC BOOL     | EXPORT_SPEC BOOL     | ||||||
| ixmlNode_hasAttributes(IXML_Node *nodeptr | ixmlNode_hasAttributes(IXML_Node *node   | ||||||
| 		         /** The {\bf Node} to query for attributes. */ | 		         /** The {\bf Node} to query for attributes. */ | ||||||
|                       ); |                       ); | ||||||
|  |  | ||||||
| @@ -632,11 +630,11 @@ ixmlNode_hasAttributes(IXML_Node *nodeptr | |||||||
|    */ |    */ | ||||||
|  |  | ||||||
| EXPORT_SPEC void     | EXPORT_SPEC void     | ||||||
| ixmlNode_free(IXML_Node *nodeptr | ixmlNode_free(IXML_Node *IXML_Node   | ||||||
| 		/** The {\bf Node} to free. */ | 		/** The {\bf Node} to free. */ | ||||||
|              ); |              ); | ||||||
|  |  | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| * | * | ||||||
| @@ -651,7 +649,7 @@ ixmlNode_free(IXML_Node *nodeptr | |||||||
|  * allowable attributes and values for a particular element.  For more  |  * allowable attributes and values for a particular element.  For more  | ||||||
|  * information, refer to the {\it Interface Attr} section in the DOM2-Core. |  * information, refer to the {\it Interface Attr} section in the DOM2-Core. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|  |  | ||||||
|   /** Frees an {\bf Attr} node. |   /** Frees an {\bf Attr} node. | ||||||
| @@ -664,7 +662,7 @@ ixmlAttr_free(IXML_Attr *attrNode | |||||||
| 		/** The {\bf Attr} node to free.  */ | 		/** The {\bf Attr} node to free.  */ | ||||||
|              ); |              ); | ||||||
|  |  | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| @@ -682,7 +680,7 @@ ixmlAttr_free(IXML_Attr *attrNode | |||||||
|  * information, refer to the {\it Interface CDATASection} section in the |  * information, refer to the {\it Interface CDATASection} section in the | ||||||
|  * DOM2-Core. |  * DOM2-Core. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|  |  | ||||||
|   /** Initializes a {\bf CDATASection} node. |   /** Initializes a {\bf CDATASection} node. | ||||||
| @@ -706,7 +704,7 @@ ixmlCDATASection_free(IXML_CDATASection *nodeptr | |||||||
| 		        /** The {\bf CDATASection} node to free. */ | 		        /** The {\bf CDATASection} node to free. */ | ||||||
|                      ); |                      ); | ||||||
|  |  | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| * | * | ||||||
| @@ -721,7 +719,7 @@ ixmlCDATASection_free(IXML_CDATASection *nodeptr | |||||||
|  * primary interface to the elements of the document.  For more information, |  * primary interface to the elements of the document.  For more information, | ||||||
|  * refer to the {\it Interface Document} section in the DOM2Core. |  * refer to the {\it Interface Document} section in the DOM2Core. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|   /** Initializes a {\bf Document} node. |   /** Initializes a {\bf Document} node. | ||||||
|    * |    * | ||||||
| @@ -949,7 +947,7 @@ ixmlDocument_getElementsByTagName(IXML_Document *doc, | |||||||
| 				    /** The tag name to find. */ | 				    /** The tag name to find. */ | ||||||
|                                  ); |                                  ); | ||||||
|  |  | ||||||
| /* introduced in DOM level 2 */ | // introduced in DOM level 2 | ||||||
|  |  | ||||||
|   /** Creates a new {\bf Element} node in the given qualified name and |   /** Creates a new {\bf Element} node in the given qualified name and | ||||||
|    *  namespace URI. |    *  namespace URI. | ||||||
| @@ -1130,7 +1128,7 @@ ixmlDocument_importNode(IXML_Document* doc, | |||||||
| 			  /** A pointer to a new {\bf Node} owned by {\bf  | 			  /** A pointer to a new {\bf Node} owned by {\bf  | ||||||
| 			      doc}. */ | 			      doc}. */ | ||||||
|                        ); |                        ); | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| * | * | ||||||
| @@ -1146,7 +1144,7 @@ ixmlDocument_importNode(IXML_Document* doc, | |||||||
|  * extends the {\bf Node} interface and adds more operations to manipulate |  * extends the {\bf Node} interface and adds more operations to manipulate | ||||||
|  * attributes. |  * attributes. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|   /** Initializes a {\bf IXML_Element} node. |   /** Initializes a {\bf IXML_Element} node. | ||||||
|    * |    * | ||||||
| @@ -1316,7 +1314,7 @@ ixmlElement_getElementsByTagName(IXML_Element* element, | |||||||
| 				       search. */ | 				       search. */ | ||||||
|                                 ); |                                 ); | ||||||
|  |  | ||||||
| /* introduced in DOM 2 */ | // introduced in DOM 2 | ||||||
|  |  | ||||||
|   /** Retrieves an attribute value using the local name and namespace URI. |   /** Retrieves an attribute value using the local name and namespace URI. | ||||||
|    * |    * | ||||||
| @@ -1495,7 +1493,7 @@ ixmlElement_free(IXML_Element* element | |||||||
| 		   /** The {\bf Element} to free. */ | 		   /** The {\bf Element} to free. */ | ||||||
|                 ); |                 ); | ||||||
|  |  | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| * | * | ||||||
| @@ -1510,7 +1508,7 @@ ixmlElement_free(IXML_Element* element | |||||||
|  * no particular order.  The {\bf Node} interface uses a {\bf NamedNodeMap} |  * no particular order.  The {\bf Node} interface uses a {\bf NamedNodeMap} | ||||||
|  * to maintain the attributes of a node. |  * to maintain the attributes of a node. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|   /** Returns the number of items contained in this {\bf NamedNodeMap}. |   /** Returns the number of items contained in this {\bf NamedNodeMap}. | ||||||
|    * |    * | ||||||
| @@ -1581,7 +1579,7 @@ ixmlNamedNodeMap_item(IXML_NamedNodeMap *nnMap, | |||||||
| 		        /** The index into the map to remove. */ | 		        /** The index into the map to remove. */ | ||||||
|                      ); |                      ); | ||||||
|  |  | ||||||
| /* introduced in DOM level 2 */ | // introduced in DOM level 2 | ||||||
|  |  | ||||||
|   /** Retrieves a {\bf Node} from a {\bf NamedNodeMap} specified by |   /** Retrieves a {\bf Node} from a {\bf NamedNodeMap} specified by | ||||||
|    *  namespace URI and local name. |    *  namespace URI and local name. | ||||||
| @@ -1648,7 +1646,7 @@ ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap | |||||||
| 		        /** The {\bf NamedNodeMap to free}. */ | 		        /** The {\bf NamedNodeMap to free}. */ | ||||||
|                      ); |                      ); | ||||||
|  |  | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| * | * | ||||||
| @@ -1663,7 +1661,7 @@ ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap | |||||||
|  * the nodes contained in a {\bf NodeList}.  The DOM2-Core refers to |  * the nodes contained in a {\bf NodeList}.  The DOM2-Core refers to | ||||||
|  * this as being {\it live}. |  * this as being {\it live}. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|   /** Retrieves a {\bf Node} from a {\bf NodeList} specified by a  |   /** Retrieves a {\bf Node} from a {\bf NodeList} specified by a  | ||||||
|    *  numerical index. |    *  numerical index. | ||||||
| @@ -1703,8 +1701,8 @@ ixmlNodeList_free(IXML_NodeList *nList | |||||||
| 		    /** The {\bf NodeList} to free.  */ | 		    /** The {\bf NodeList} to free.  */ | ||||||
|                  ); |                  ); | ||||||
|  |  | ||||||
| /*! @} */ /* Interface NodeList */ | //@} Interface NodeList | ||||||
| /*! @} */ /* DOM Interfaces */ | //@} DOM Interfaces | ||||||
|  |  | ||||||
| /**@name IXML API | /**@name IXML API | ||||||
|  * The IXML API contains utility functions that are not part of the standard |  * The IXML API contains utility functions that are not part of the standard | ||||||
| @@ -1712,7 +1710,7 @@ ixmlNodeList_free(IXML_NodeList *nList | |||||||
|  * file or buffer, create an XML file from a DOM structure, and manipulate  |  * file or buffer, create an XML file from a DOM structure, and manipulate  | ||||||
|  * DOMString objects. |  * DOMString objects. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /*================================================================ | /*================================================================ | ||||||
| *  | *  | ||||||
| @@ -1740,7 +1738,7 @@ ixmlNodeList_free(IXML_NodeList *nList | |||||||
|    *                      of the DOM tree or {\tt NULL} on an error. |    *                      of the DOM tree or {\tt NULL} on an error. | ||||||
|    */ |    */ | ||||||
|  |  | ||||||
| EXPORT_SPEC DOMString | DOMString | ||||||
| ixmlPrintDocument(IXML_Document *doc); | ixmlPrintDocument(IXML_Document *doc); | ||||||
|  |  | ||||||
|   /** Renders a {\bf Node} and all sub-elements into an XML text |   /** Renders a {\bf Node} and all sub-elements into an XML text | ||||||
| @@ -1758,7 +1756,7 @@ ixmlPrintDocument(IXML_Document *doc); | |||||||
|    *                      of the DOM tree or {\tt NULL} on an error. |    *                      of the DOM tree or {\tt NULL} on an error. | ||||||
|    */ |    */ | ||||||
|  |  | ||||||
| EXPORT_SPEC DOMString    | DOMString    | ||||||
| ixmlPrintNode(IXML_Node *doc   | ixmlPrintNode(IXML_Node *doc   | ||||||
|                 /** The root of the {\bf Node} tree to render to XML text. */ |                 /** The root of the {\bf Node} tree to render to XML text. */ | ||||||
|              ); |              ); | ||||||
| @@ -1779,7 +1777,7 @@ ixmlPrintNode(IXML_Node *doc | |||||||
|    *                      of the DOM tree or {\tt NULL} on an error. |    *                      of the DOM tree or {\tt NULL} on an error. | ||||||
|    */ |    */ | ||||||
|  |  | ||||||
| EXPORT_SPEC DOMString | DOMString | ||||||
| ixmlDocumenttoString(IXML_Document *doc); | ixmlDocumenttoString(IXML_Document *doc); | ||||||
|  |  | ||||||
|   /** Renders a {\bf Node} and all sub-elements into an XML text |   /** Renders a {\bf Node} and all sub-elements into an XML text | ||||||
| @@ -1811,7 +1809,7 @@ ixmlNodetoString(IXML_Node *doc | |||||||
|    * characters are replaced by the {\bf errorChar}, and invalid "&" entities  |    * characters are replaced by the {\bf errorChar}, and invalid "&" entities  | ||||||
|    * are left untranslated. The parsing is then allowed to continue. |    * are left untranslated. The parsing is then allowed to continue. | ||||||
|    */ |    */ | ||||||
| EXPORT_SPEC void | void | ||||||
| ixmlRelaxParser(char errorChar); | ixmlRelaxParser(char errorChar); | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -1915,7 +1913,6 @@ ixmlFreeDOMString(DOMString buf | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /*! @} */ /* IXML API */ | //@} IXML API | ||||||
|  |  | ||||||
| #endif  /* _IXML_H_ */ |  | ||||||
|  |  | ||||||
|  | #endif  // _IXML_H_ | ||||||
|   | |||||||
| @@ -39,7 +39,7 @@ | |||||||
| #define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) ) | #define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) ) | ||||||
|  |  | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  #define	UPNP_INLINE inline |  #define	XINLINE inline | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #define MEMBUF_DEF_SIZE_INC		20 | #define MEMBUF_DEF_SIZE_INC		20 | ||||||
|   | |||||||
| @@ -7,5 +7,6 @@ Name: libupnp | |||||||
| Description: Linux SDK for UPnP Devices | Description: Linux SDK for UPnP Devices | ||||||
| Version: @VERSION@ | Version: @VERSION@ | ||||||
| Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml  | Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml  | ||||||
| Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp | Cflags: @PTHREAD_CFLAGS@ -I${includedir} | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,88 +1,50 @@ | |||||||
| ##### http://autoconf-archive.cryp.to/acx_pthread.html | dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) | ||||||
| # | dnl | ||||||
| # SYNOPSIS | dnl @summary figure out how to build C programs using POSIX threads | ||||||
| # | dnl | ||||||
| #   ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) | dnl This macro figures out how to build C programs using POSIX threads. | ||||||
| # | dnl It sets the PTHREAD_LIBS output variable to the threads library and | ||||||
| # DESCRIPTION | dnl linker flags, and the PTHREAD_CFLAGS output variable to any special | ||||||
| # | dnl C compiler flags that are needed. (The user can also force certain | ||||||
| #   This macro figures out how to build C programs using POSIX threads. | dnl compiler flags/libs to be tested by setting these environment | ||||||
| #   It sets the PTHREAD_LIBS output variable to the threads library and | dnl variables.) | ||||||
| #   linker flags, and the PTHREAD_CFLAGS output variable to any special | dnl | ||||||
| #   C compiler flags that are needed. (The user can also force certain | dnl Also sets PTHREAD_CC to any special C compiler that is needed for | ||||||
| #   compiler flags/libs to be tested by setting these environment | dnl multi-threaded programs (defaults to the value of CC otherwise). | ||||||
| #   variables.) | dnl (This is necessary on AIX to use the special cc_r compiler alias.) | ||||||
| # | dnl | ||||||
| #   Also sets PTHREAD_CC to any special C compiler that is needed for | dnl NOTE: You are assumed to not only compile your program with these | ||||||
| #   multi-threaded programs (defaults to the value of CC otherwise). | dnl flags, but also link it with them as well. e.g. you should link | ||||||
| #   (This is necessary on AIX to use the special cc_r compiler alias.) | dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS | ||||||
| # | dnl $LIBS | ||||||
| #   NOTE: You are assumed to not only compile your program with these | dnl | ||||||
| #   flags, but also link it with them as well. e.g. you should link | dnl If you are only building threads programs, you may wish to use | ||||||
| #   with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS | dnl these variables in your default LIBS, CFLAGS, and CC: | ||||||
| #   $LIBS | dnl | ||||||
| # | dnl        LIBS="$PTHREAD_LIBS $LIBS" | ||||||
| #   If you are only building threads programs, you may wish to use | dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS" | ||||||
| #   these variables in your default LIBS, CFLAGS, and CC: | dnl        CC="$PTHREAD_CC" | ||||||
| # | dnl | ||||||
| #          LIBS="$PTHREAD_LIBS $LIBS" | dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute | ||||||
| #          CFLAGS="$CFLAGS $PTHREAD_CFLAGS" | dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to | ||||||
| #          CC="$PTHREAD_CC" | dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). | ||||||
| # | dnl | ||||||
| #   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute | dnl ACTION-IF-FOUND is a list of shell commands to run if a threads | ||||||
| #   constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to | dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to | ||||||
| #   that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). | dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the | ||||||
| # | dnl default action will define HAVE_PTHREAD. | ||||||
| #   ACTION-IF-FOUND is a list of shell commands to run if a threads | dnl | ||||||
| #   library is found, and ACTION-IF-NOT-FOUND is a list of commands to | dnl Please let the authors know if this macro fails on any platform, or | ||||||
| #   run it if it is not found. If ACTION-IF-FOUND is not specified, the | dnl if you have any other suggestions or comments. This macro was based | ||||||
| #   default action will define HAVE_PTHREAD. | dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with | ||||||
| # | dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros | ||||||
| #   Please let the authors know if this macro fails on any platform, or | dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. | ||||||
| #   if you have any other suggestions or comments. This macro was based | dnl We are also grateful for the helpful feedback of numerous users. | ||||||
| #   on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) | dnl | ||||||
| #   (with help from M. Frigo), as well as ac_pthread and hb_pthread | dnl @category InstalledPackages | ||||||
| #   macros posted by Alejandro Forero Cuervo to the autoconf macro | dnl @author Steven G. Johnson <stevenj@alum.mit.edu> | ||||||
| #   repository. We are also grateful for the helpful feedback of | dnl @version 2005-06-15 | ||||||
| #   numerous users. | dnl @license GPLWithACException | ||||||
| # |  | ||||||
| # LAST MODIFICATION |  | ||||||
| # |  | ||||||
| #   2006-05-29 |  | ||||||
| # |  | ||||||
| # COPYLEFT |  | ||||||
| # |  | ||||||
| #   Copyright (c) 2006 Steven G. Johnson <stevenj@alum.mit.edu> |  | ||||||
| # |  | ||||||
| #   This program is free software; you can redistribute it and/or |  | ||||||
| #   modify it under the terms of the GNU General Public License as |  | ||||||
| #   published by the Free Software Foundation; either version 2 of the |  | ||||||
| #   License, or (at your option) any later version. |  | ||||||
| # |  | ||||||
| #   This program is distributed in the hope that it will be useful, but |  | ||||||
| #   WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |  | ||||||
| #   General Public License for more details. |  | ||||||
| # |  | ||||||
| #   You should have received a copy of the GNU General Public License |  | ||||||
| #   along with this program; if not, write to the Free Software |  | ||||||
| #   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |  | ||||||
| #   02111-1307, USA. |  | ||||||
| # |  | ||||||
| #   As a special exception, the respective Autoconf Macro's copyright |  | ||||||
| #   owner gives unlimited permission to copy, distribute and modify the |  | ||||||
| #   configure scripts that are the output of Autoconf when processing |  | ||||||
| #   the Macro. You need not follow the terms of the GNU General Public |  | ||||||
| #   License when using or distributing such scripts, even though |  | ||||||
| #   portions of the text of the Macro appear in them. The GNU General |  | ||||||
| #   Public License (GPL) does govern all other use of the material that |  | ||||||
| #   constitutes the Autoconf Macro. |  | ||||||
| # |  | ||||||
| #   This special exception to the GPL applies to versions of the |  | ||||||
| #   Autoconf Macro released by the Autoconf Macro Archive. When you |  | ||||||
| #   make and distribute a modified version of the Autoconf Macro, you |  | ||||||
| #   may extend this special exception to the GPL to apply to your |  | ||||||
| #   modified version as well. |  | ||||||
|  |  | ||||||
| AC_DEFUN([ACX_PTHREAD], [ | AC_DEFUN([ACX_PTHREAD], [ | ||||||
| AC_REQUIRE([AC_CANONICAL_HOST]) | AC_REQUIRE([AC_CANONICAL_HOST]) | ||||||
| @@ -254,12 +216,8 @@ if test "x$acx_pthread_ok" = xyes; then | |||||||
|         LIBS="$save_LIBS" |         LIBS="$save_LIBS" | ||||||
|         CFLAGS="$save_CFLAGS" |         CFLAGS="$save_CFLAGS" | ||||||
|  |  | ||||||
|         # More AIX lossage: must compile with xlc_r or cc_r |         # More AIX lossage: must compile with cc_r | ||||||
| 	if test x"$GCC" != xyes; then |         AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) | ||||||
|           AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) |  | ||||||
|         else |  | ||||||
|           PTHREAD_CC=$CC |  | ||||||
| 	fi |  | ||||||
| else | else | ||||||
|         PTHREAD_CC="$CC" |         PTHREAD_CC="$CC" | ||||||
| fi | fi | ||||||
|   | |||||||
| @@ -1,87 +1,48 @@ | |||||||
| ##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html | dnl @synopsis AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) | ||||||
| # | dnl | ||||||
| # SYNOPSIS | dnl AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like | ||||||
| # | dnl "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the | ||||||
| #   AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) | dnl optionflag to CFLAGS if it is understood. You can override the | ||||||
| # | dnl shellvar-default of CFLAGS of course. The order of arguments stems | ||||||
| # DESCRIPTION | dnl from the explicit macros like AX_CFLAGS_WARN_ALL. | ||||||
| # | dnl | ||||||
| #   AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like | dnl The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add | ||||||
| #   "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the | dnl to CXXFLAGS - and it uses the autoconf setup for C++ instead of C | ||||||
| #   optionflag to CFLAGS if it is understood. You can override the | dnl (since it is possible to use different compilers for C and C++). | ||||||
| #   shellvar-default of CFLAGS of course. The order of arguments stems | dnl | ||||||
| #   from the explicit macros like AX_CFLAGS_WARN_ALL. | dnl The macro is a lot simpler than any special AX_CFLAGS_* macro (or | ||||||
| # | dnl ac_cxx_rtti.m4 macro) but allows to check for arbitrary options. | ||||||
| #   The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add | dnl However, if you use this macro in a few places, it would be great | ||||||
| #   to CXXFLAGS - and it uses the autoconf setup for C++ instead of C | dnl if you would make up a new function-macro and submit it to the | ||||||
| #   (since it is possible to use different compilers for C and C++). | dnl ac-archive. | ||||||
| # | dnl | ||||||
| #   The macro is a lot simpler than any special AX_CFLAGS_* macro (or | dnl   - $1 option-to-check-for : required ("-option" as non-value) | ||||||
| #   ac_cxx_rtti.m4 macro) but allows to check for arbitrary options. | dnl   - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) | ||||||
| #   However, if you use this macro in a few places, it would be great | dnl   - $3 action-if-found : add value to shellvariable | ||||||
| #   if you would make up a new function-macro and submit it to the | dnl   - $4 action-if-not-found : nothing | ||||||
| #   ac-archive. | dnl | ||||||
| # | dnl note: in earlier versions, $1-$2 were swapped. We try to detect the | ||||||
| #     - $1 option-to-check-for : required ("-option" as non-value) | dnl situation and accept a $2=~/-/ as being the old | ||||||
| #     - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) | dnl option-to-check-for. | ||||||
| #     - $3 action-if-found : add value to shellvariable | dnl | ||||||
| #     - $4 action-if-not-found : nothing | dnl also: there are other variants that emerged from the original macro | ||||||
| # | dnl variant which did just test an option to be possibly added. | ||||||
| #   note: in earlier versions, $1-$2 were swapped. We try to detect the | dnl However, some compilers accept an option silently, or possibly for | ||||||
| #   situation and accept a $2=~/-/ as being the old | dnl just another option that was not intended. Therefore, we have to do | ||||||
| #   option-to-check-for. | dnl a generic test for a compiler family. For gcc we check "-pedantic" | ||||||
| # | dnl being accepted which is also understood by compilers who just want | ||||||
| #   also: there are other variants that emerged from the original macro | dnl to be compatible with gcc even when not being made from gcc | ||||||
| #   variant which did just test an option to be possibly added. | dnl sources. | ||||||
| #   However, some compilers accept an option silently, or possibly for | dnl | ||||||
| #   just another option that was not intended. Therefore, we have to do | dnl see also: | ||||||
| #   a generic test for a compiler family. For gcc we check "-pedantic" | dnl | ||||||
| #   being accepted which is also understood by compilers who just want | dnl       AX_CFLAGS_SUN_OPTION               AX_CFLAGS_HPUX_OPTION | ||||||
| #   to be compatible with gcc even when not being made from gcc | dnl       AX_CFLAGS_AIX_OPTION               AX_CFLAGS_IRIX_OPTION | ||||||
| #   sources. | dnl | ||||||
| # | dnl @category C | ||||||
| #   see also: | dnl @author Guido Draheim <guidod@gmx.de> | ||||||
| # | dnl @version 2003-11-04 | ||||||
| #         AX_CFLAGS_SUN_OPTION               AX_CFLAGS_HPUX_OPTION | dnl @license GPLWithACException | ||||||
| #         AX_CFLAGS_AIX_OPTION               AX_CFLAGS_IRIX_OPTION |  | ||||||
| # |  | ||||||
| # LAST MODIFICATION |  | ||||||
| # |  | ||||||
| #   2006-12-12 |  | ||||||
| # |  | ||||||
| # COPYLEFT |  | ||||||
| # |  | ||||||
| #   Copyright (c) 2006 Guido U. Draheim <guidod@gmx.de> |  | ||||||
| # |  | ||||||
| #   This program is free software; you can redistribute it and/or |  | ||||||
| #   modify it under the terms of the GNU General Public License as |  | ||||||
| #   published by the Free Software Foundation; either version 2 of the |  | ||||||
| #   License, or (at your option) any later version. |  | ||||||
| # |  | ||||||
| #   This program is distributed in the hope that it will be useful, but |  | ||||||
| #   WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |  | ||||||
| #   General Public License for more details. |  | ||||||
| # |  | ||||||
| #   You should have received a copy of the GNU General Public License |  | ||||||
| #   along with this program; if not, write to the Free Software |  | ||||||
| #   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |  | ||||||
| #   02111-1307, USA. |  | ||||||
| # |  | ||||||
| #   As a special exception, the respective Autoconf Macro's copyright |  | ||||||
| #   owner gives unlimited permission to copy, distribute and modify the |  | ||||||
| #   configure scripts that are the output of Autoconf when processing |  | ||||||
| #   the Macro. You need not follow the terms of the GNU General Public |  | ||||||
| #   License when using or distributing such scripts, even though |  | ||||||
| #   portions of the text of the Macro appear in them. The GNU General |  | ||||||
| #   Public License (GPL) does govern all other use of the material that |  | ||||||
| #   constitutes the Autoconf Macro. |  | ||||||
| # |  | ||||||
| #   This special exception to the GPL applies to versions of the |  | ||||||
| #   Autoconf Macro released by the Autoconf Macro Archive. When you |  | ||||||
| #   make and distribute a modified version of the Autoconf Macro, you |  | ||||||
| #   may extend this special exception to the GPL to apply to your |  | ||||||
| #   modified version as well. |  | ||||||
|  |  | ||||||
| AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl | AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl | ||||||
| AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl | AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl | ||||||
| @@ -92,8 +53,7 @@ VAR,[VAR="no, unknown" | |||||||
|  AC_LANG_C |  AC_LANG_C | ||||||
|  ac_save_[]FLAGS="$[]FLAGS" |  ac_save_[]FLAGS="$[]FLAGS" | ||||||
| for ac_arg dnl | for ac_arg dnl | ||||||
| in "-pedantic -Werror % m4_ifval($2,$2,-option)"  dnl   GCC | in "-pedantic  % m4_ifval($2,$2,-option)"  dnl   GCC | ||||||
|    "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete"  dnl new GCC |  | ||||||
|    # |    # | ||||||
| do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | ||||||
|    AC_TRY_COMPILE([],[return 0;], |    AC_TRY_COMPILE([],[return 0;], | ||||||
| @@ -125,11 +85,10 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl | |||||||
| AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], | AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], | ||||||
| VAR,[VAR="no, unknown" | VAR,[VAR="no, unknown" | ||||||
|  AC_LANG_SAVE |  AC_LANG_SAVE | ||||||
|  AC_LANG_CPLUSPLUS |  AC_LANG_CXX | ||||||
|  ac_save_[]FLAGS="$[]FLAGS" |  ac_save_[]FLAGS="$[]FLAGS" | ||||||
| for ac_arg dnl | for ac_arg dnl | ||||||
| in "-pedantic -Werror % m4_ifval($2,$2,-option)"  dnl   GCC | in "-pedantic  % m4_ifval($2,$2,-option)"  dnl   GCC | ||||||
|    "-pedantic % m4_ifval($2,$2,-option) %% no, obsolete"  dnl new GCC |  | ||||||
|    # |    # | ||||||
| do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | ||||||
|    AC_TRY_COMPILE([],[return 0;], |    AC_TRY_COMPILE([],[return 0;], | ||||||
| @@ -163,8 +122,7 @@ VAR,[VAR="no, unknown" | |||||||
|  AC_LANG_C |  AC_LANG_C | ||||||
|  ac_save_[]FLAGS="$[]FLAGS" |  ac_save_[]FLAGS="$[]FLAGS" | ||||||
| for ac_arg dnl | for ac_arg dnl | ||||||
| in "-pedantic -Werror % m4_ifval($1,$1,-option)"  dnl   GCC | in "-pedantic  % m4_ifval($1,$1,-option)"  dnl   GCC | ||||||
|    "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete"  dnl new GCC |  | ||||||
|    # |    # | ||||||
| do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | ||||||
|    AC_TRY_COMPILE([],[return 0;], |    AC_TRY_COMPILE([],[return 0;], | ||||||
| @@ -196,11 +154,10 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl | |||||||
| AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], | AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], | ||||||
| VAR,[VAR="no, unknown" | VAR,[VAR="no, unknown" | ||||||
|  AC_LANG_SAVE |  AC_LANG_SAVE | ||||||
|  AC_LANG_CPLUSPLUS |  AC_LANG_CXX | ||||||
|  ac_save_[]FLAGS="$[]FLAGS" |  ac_save_[]FLAGS="$[]FLAGS" | ||||||
| for ac_arg dnl | for ac_arg dnl | ||||||
| in "-pedantic -Werror % m4_ifval($1,$1,-option)"  dnl   GCC | in "-pedantic  % m4_ifval($1,$1,-option)"  dnl   GCC | ||||||
|    "-pedantic % m4_ifval($1,$1,-option) %% no, obsolete"  dnl new GCC |  | ||||||
|    # |    # | ||||||
| do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` | ||||||
|    AC_TRY_COMPILE([],[return 0;], |    AC_TRY_COMPILE([],[return 0;], | ||||||
|   | |||||||
| @@ -1,66 +1,27 @@ | |||||||
| ##### http://autoconf-archive.cryp.to/ax_cflags_warn_all.html | dnl @synopsis AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] | ||||||
| # | dnl | ||||||
| # SYNOPSIS | dnl Try to find a compiler option that enables most reasonable | ||||||
| # | dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS | ||||||
| #   AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] | dnl which is split up into two AX_CFLAGS_WARN_ALL and | ||||||
| # | dnl AX_CFLAGS_WARN_ALL_ANSI | ||||||
| # DESCRIPTION | dnl | ||||||
| # | dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The | ||||||
| #   Try to find a compiler option that enables most reasonable | dnl result is added to the shellvar being CFLAGS by default. | ||||||
| #   warnings. This macro is directly derived from VL_PROG_CC_WARNINGS | dnl | ||||||
| #   which is split up into two AX_CFLAGS_WARN_ALL and | dnl Currently this macro knows about GCC, Solaris C compiler, Digital | ||||||
| #   AX_CFLAGS_WARN_ALL_ANSI | dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C | ||||||
| # | dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos | ||||||
| #   For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The | dnl 10.0.0.8) C compiler. | ||||||
| #   result is added to the shellvar being CFLAGS by default. | dnl | ||||||
| # | dnl  - $1 shell-variable-to-add-to : CFLAGS | ||||||
| #   Currently this macro knows about GCC, Solaris C compiler, Digital | dnl  - $2 add-value-if-not-found : nothing | ||||||
| #   Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C | dnl  - $3 action-if-found : add value to shellvariable | ||||||
| #   compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos | dnl  - $4 action-if-not-found : nothing | ||||||
| #   10.0.0.8) C compiler. | dnl | ||||||
| # | dnl @category C | ||||||
| #    - $1 shell-variable-to-add-to : CFLAGS | dnl @author Guido Draheim <guidod@gmx.de> | ||||||
| #    - $2 add-value-if-not-found : nothing | dnl @version 2003-01-06 | ||||||
| #    - $3 action-if-found : add value to shellvariable | dnl @license GPLWithACException | ||||||
| #    - $4 action-if-not-found : nothing |  | ||||||
| # |  | ||||||
| # LAST MODIFICATION |  | ||||||
| # |  | ||||||
| #   2006-12-12 |  | ||||||
| # |  | ||||||
| # COPYLEFT |  | ||||||
| # |  | ||||||
| #   Copyright (c) 2006 Guido U. Draheim <guidod@gmx.de> |  | ||||||
| # |  | ||||||
| #   This program is free software; you can redistribute it and/or |  | ||||||
| #   modify it under the terms of the GNU General Public License as |  | ||||||
| #   published by the Free Software Foundation; either version 2 of the |  | ||||||
| #   License, or (at your option) any later version. |  | ||||||
| # |  | ||||||
| #   This program is distributed in the hope that it will be useful, but |  | ||||||
| #   WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |  | ||||||
| #   General Public License for more details. |  | ||||||
| # |  | ||||||
| #   You should have received a copy of the GNU General Public License |  | ||||||
| #   along with this program; if not, write to the Free Software |  | ||||||
| #   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |  | ||||||
| #   02111-1307, USA. |  | ||||||
| # |  | ||||||
| #   As a special exception, the respective Autoconf Macro's copyright |  | ||||||
| #   owner gives unlimited permission to copy, distribute and modify the |  | ||||||
| #   configure scripts that are the output of Autoconf when processing |  | ||||||
| #   the Macro. You need not follow the terms of the GNU General Public |  | ||||||
| #   License when using or distributing such scripts, even though |  | ||||||
| #   portions of the text of the Macro appear in them. The GNU General |  | ||||||
| #   Public License (GPL) does govern all other use of the material that |  | ||||||
| #   constitutes the Autoconf Macro. |  | ||||||
| # |  | ||||||
| #   This special exception to the GPL applies to versions of the |  | ||||||
| #   Autoconf Macro released by the Autoconf Macro Archive. When you |  | ||||||
| #   make and distribute a modified version of the Autoconf Macro, you |  | ||||||
| #   may extend this special exception to the GPL to apply to your |  | ||||||
| #   modified version as well. |  | ||||||
|  |  | ||||||
| AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl | AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl | ||||||
| AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl | AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl | ||||||
| @@ -111,7 +72,7 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all])dnl | |||||||
| AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], | AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], | ||||||
| VAR,[VAR="no, unknown" | VAR,[VAR="no, unknown" | ||||||
|  AC_LANG_SAVE |  AC_LANG_SAVE | ||||||
|  AC_LANG_CPLUSPLUS |  AC_LANG_CXX | ||||||
|  ac_save_[]FLAGS="$[]FLAGS" |  ac_save_[]FLAGS="$[]FLAGS" | ||||||
| for ac_arg dnl | for ac_arg dnl | ||||||
| in "-pedantic  % -Wall"       dnl   GCC | in "-pedantic  % -Wall"       dnl   GCC | ||||||
| @@ -154,5 +115,4 @@ dnl   compilers will fail about it. That was needed since a lot of | |||||||
| dnl   compilers will give false positives for some option-syntax | dnl   compilers will give false positives for some option-syntax | ||||||
| dnl   like -Woption or -Xoption as they think of it is a pass-through | dnl   like -Woption or -Xoption as they think of it is a pass-through | ||||||
| dnl   to later compile stages or something. The "%" is used as a | dnl   to later compile stages or something. The "%" is used as a | ||||||
| dnl   delimimiter. A non-option comment can be given after "%%" marks | dnl   delimimiter. A non-option comment can be given after "%%" marks. | ||||||
| dnl   which will be shown but not added to the respective C/CXXFLAGS. |  | ||||||
|   | |||||||
| @@ -1,66 +1,27 @@ | |||||||
| ##### http://autoconf-archive.cryp.to/ax_cflags_warn_all_ansi.html | dnl @synopsis AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])] | ||||||
| # | dnl | ||||||
| # SYNOPSIS | dnl Try to find a compiler option that enables most reasonable | ||||||
| # | dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS | ||||||
| #   AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])] | dnl which is split up into two AX_CFLAGS_WARN_ALL and | ||||||
| # | dnl AX_CFLAGS_WARN_ALL_ANSI | ||||||
| # DESCRIPTION | dnl | ||||||
| # | dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The | ||||||
| #   Try to find a compiler option that enables most reasonable | dnl result is added to the shellvar being CFLAGS by default. | ||||||
| #   warnings. This macro is directly derived from VL_PROG_CC_WARNINGS | dnl | ||||||
| #   which is split up into two AX_CFLAGS_WARN_ALL and | dnl Currently this macro knows about GCC, Solaris C compiler, Digital | ||||||
| #   AX_CFLAGS_WARN_ALL_ANSI | dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C | ||||||
| # | dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos | ||||||
| #   For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The | dnl 10.0.0.8) C compiler. | ||||||
| #   result is added to the shellvar being CFLAGS by default. | dnl | ||||||
| # | dnl  - $1 shell-variable-to-add-to : CFLAGS | ||||||
| #   Currently this macro knows about GCC, Solaris C compiler, Digital | dnl  - $2 add-value-if-not-found : nothing | ||||||
| #   Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C | dnl  - $3 action-if-found : add value to shellvariable | ||||||
| #   compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos | dnl  - $4 action-if-not-found : nothing | ||||||
| #   10.0.0.8) C compiler. | dnl | ||||||
| # | dnl @category C | ||||||
| #    - $1 shell-variable-to-add-to : CFLAGS | dnl @author Guido Draheim <guidod@gmx.de> | ||||||
| #    - $2 add-value-if-not-found : nothing | dnl @version 2003-01-06 | ||||||
| #    - $3 action-if-found : add value to shellvariable | dnl @license GPLWithACException | ||||||
| #    - $4 action-if-not-found : nothing |  | ||||||
| # |  | ||||||
| # LAST MODIFICATION |  | ||||||
| # |  | ||||||
| #   2006-12-12 |  | ||||||
| # |  | ||||||
| # COPYLEFT |  | ||||||
| # |  | ||||||
| #   Copyright (c) 2006 Guido U. Draheim <guidod@gmx.de> |  | ||||||
| # |  | ||||||
| #   This program is free software; you can redistribute it and/or |  | ||||||
| #   modify it under the terms of the GNU General Public License as |  | ||||||
| #   published by the Free Software Foundation; either version 2 of the |  | ||||||
| #   License, or (at your option) any later version. |  | ||||||
| # |  | ||||||
| #   This program is distributed in the hope that it will be useful, but |  | ||||||
| #   WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |  | ||||||
| #   General Public License for more details. |  | ||||||
| # |  | ||||||
| #   You should have received a copy of the GNU General Public License |  | ||||||
| #   along with this program; if not, write to the Free Software |  | ||||||
| #   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |  | ||||||
| #   02111-1307, USA. |  | ||||||
| # |  | ||||||
| #   As a special exception, the respective Autoconf Macro's copyright |  | ||||||
| #   owner gives unlimited permission to copy, distribute and modify the |  | ||||||
| #   configure scripts that are the output of Autoconf when processing |  | ||||||
| #   the Macro. You need not follow the terms of the GNU General Public |  | ||||||
| #   License when using or distributing such scripts, even though |  | ||||||
| #   portions of the text of the Macro appear in them. The GNU General |  | ||||||
| #   Public License (GPL) does govern all other use of the material that |  | ||||||
| #   constitutes the Autoconf Macro. |  | ||||||
| # |  | ||||||
| #   This special exception to the GPL applies to versions of the |  | ||||||
| #   Autoconf Macro released by the Autoconf Macro Archive. When you |  | ||||||
| #   make and distribute a modified version of the Autoconf Macro, you |  | ||||||
| #   may extend this special exception to the GPL to apply to your |  | ||||||
| #   modified version as well. |  | ||||||
|  |  | ||||||
| AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[dnl | AC_DEFUN([AX_CFLAGS_WARN_ALL_ANSI],[dnl | ||||||
| AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl | AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl | ||||||
| @@ -116,7 +77,7 @@ AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_warn_all_ansi])dnl | |||||||
| AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings], | AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum ansi warnings], | ||||||
| VAR,[VAR="no, unknown" | VAR,[VAR="no, unknown" | ||||||
|  AC_LANG_SAVE |  AC_LANG_SAVE | ||||||
|  AC_LANG_CPLUSPLUS |  AC_LANG_CXX | ||||||
|  ac_save_[]FLAGS="$[]FLAGS" |  ac_save_[]FLAGS="$[]FLAGS" | ||||||
| # IRIX C compiler: | # IRIX C compiler: | ||||||
| #      -use_readonly_const is the default for IRIX C, | #      -use_readonly_const is the default for IRIX C, | ||||||
|   | |||||||
| @@ -1,52 +1,13 @@ | |||||||
| ##### http://autoconf-archive.cryp.to/type_socklen_t.html | dnl @synopsis TYPE_SOCKLEN_T | ||||||
| # | dnl | ||||||
| # SYNOPSIS | dnl Check whether sys/socket.h defines type socklen_t. Please note that | ||||||
| # | dnl some systems require sys/types.h to be included before sys/socket.h | ||||||
| #   TYPE_SOCKLEN_T | dnl can be compiled. | ||||||
| # | dnl | ||||||
| # DESCRIPTION | dnl @category Misc | ||||||
| # | dnl @author Lars Brinkhoff <lars@nocrew.org> | ||||||
| #   Check whether sys/socket.h defines type socklen_t. Please note that | dnl @version 2005-01-11 | ||||||
| #   some systems require sys/types.h to be included before sys/socket.h | dnl @license GPLWithACException | ||||||
| #   can be compiled. |  | ||||||
| # |  | ||||||
| # LAST MODIFICATION |  | ||||||
| # |  | ||||||
| #   2005-01-11 |  | ||||||
| # |  | ||||||
| # COPYLEFT |  | ||||||
| # |  | ||||||
| #   Copyright (c) 2005 Lars Brinkhoff <lars@nocrew.org> |  | ||||||
| # |  | ||||||
| #   This program is free software; you can redistribute it and/or |  | ||||||
| #   modify it under the terms of the GNU General Public License as |  | ||||||
| #   published by the Free Software Foundation; either version 2 of the |  | ||||||
| #   License, or (at your option) any later version. |  | ||||||
| # |  | ||||||
| #   This program is distributed in the hope that it will be useful, but |  | ||||||
| #   WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |  | ||||||
| #   General Public License for more details. |  | ||||||
| # |  | ||||||
| #   You should have received a copy of the GNU General Public License |  | ||||||
| #   along with this program; if not, write to the Free Software |  | ||||||
| #   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |  | ||||||
| #   02111-1307, USA. |  | ||||||
| # |  | ||||||
| #   As a special exception, the respective Autoconf Macro's copyright |  | ||||||
| #   owner gives unlimited permission to copy, distribute and modify the |  | ||||||
| #   configure scripts that are the output of Autoconf when processing |  | ||||||
| #   the Macro. You need not follow the terms of the GNU General Public |  | ||||||
| #   License when using or distributing such scripts, even though |  | ||||||
| #   portions of the text of the Macro appear in them. The GNU General |  | ||||||
| #   Public License (GPL) does govern all other use of the material that |  | ||||||
| #   constitutes the Autoconf Macro. |  | ||||||
| # |  | ||||||
| #   This special exception to the GPL applies to versions of the |  | ||||||
| #   Autoconf Macro released by the Autoconf Macro Archive. When you |  | ||||||
| #   make and distribute a modified version of the Autoconf Macro, you |  | ||||||
| #   may extend this special exception to the GPL to apply to your |  | ||||||
| #   modified version as well. |  | ||||||
|  |  | ||||||
| AC_DEFUN([TYPE_SOCKLEN_T], | AC_DEFUN([TYPE_SOCKLEN_T], | ||||||
| [AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t, | [AC_CACHE_CHECK([for socklen_t], ac_cv_type_socklen_t, | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								svnignore
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								svnignore
									
									
									
									
									
								
							| @@ -1,14 +0,0 @@ | |||||||
| .deps |  | ||||||
| .dirstamp |  | ||||||
| .libs |  | ||||||
| .*.swp |  | ||||||
| *~ |  | ||||||
| Makefile |  | ||||||
| Makefile.in |  | ||||||
| aclocal.m4 |  | ||||||
| autoconfig.h* |  | ||||||
| autom4te.cache |  | ||||||
| config* |  | ||||||
| libtool |  | ||||||
| libupnp.pc |  | ||||||
| stamp-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 FREE_LIST_H | #ifndef FREE_LIST_H | ||||||
| #define FREE_LIST_H | #define FREE_LIST_H | ||||||
| @@ -36,6 +36,9 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | //#include <malloc.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| #include "ithread.h" | #include "ithread.h" | ||||||
| #include <errno.h> | #include <errno.h> | ||||||
|  |  | ||||||
| @@ -49,7 +52,7 @@ extern "C" { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| typedef struct FREELISTNODE | typedef struct FREELISTNODE | ||||||
| { | { | ||||||
| 	struct FREELISTNODE *next; | 	struct FREELISTNODE*next; //pointer to next free node | ||||||
| } FreeListNode; | } FreeListNode; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -62,10 +65,12 @@ typedef struct FREELISTNODE | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| typedef struct FREELIST | typedef struct FREELIST | ||||||
| { | { | ||||||
| 	FreeListNode *head; | 	FreeListNode *head; //head of free list | ||||||
| 	size_t element_size; | 	size_t element_size;	//size of elements in free  | ||||||
|  	int maxFreeListLength; |  							//list | ||||||
| 	int freeListLength; |  	int maxFreeListLength; //max size of free structures  | ||||||
|  | 						 //to keep | ||||||
|  | 	int freeListLength; //current size of free list | ||||||
|          |          | ||||||
| }FreeList; | }FreeList; | ||||||
|  |  | ||||||
| @@ -136,5 +141,4 @@ int FreeListDestroy (FreeList *free_list); | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* FREE_LIST_H */ | #endif // FREE_LIST_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 LINKED_LIST_H | #ifndef LINKED_LIST_H | ||||||
| #define LINKED_LIST_H | #define LINKED_LIST_H | ||||||
| @@ -70,9 +70,9 @@ typedef int (*cmp_routine)(void *itemA,void *itemB); | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| typedef struct LISTNODE | typedef struct LISTNODE | ||||||
| { | { | ||||||
|   struct LISTNODE *prev; |   struct LISTNODE *prev; //previous node | ||||||
|   struct LISTNODE *next; |   struct LISTNODE *next; //next node | ||||||
|   void *item; |   void *item; //item | ||||||
| } ListNode; | } ListNode; | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -96,12 +96,12 @@ typedef struct LISTNODE | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| typedef struct LINKEDLIST | typedef struct LINKEDLIST | ||||||
| { | { | ||||||
|   ListNode head; /* head, first item is stored at: head->next */ |   ListNode head; //head, first item is stored at: head->next | ||||||
|   ListNode tail; /* tail, last item is stored at: tail->prev  */ |   ListNode tail; //tail, last item is stored at: tail->prev | ||||||
|   long size;     /* size of list */ |   long size;      //size of list | ||||||
|   FreeList freeNodeList;   /* free list to use */ |   FreeList freeNodeList; //free list to use | ||||||
|   free_function free_func; /* free function to use */ |   free_function free_func; //free function to use | ||||||
|   cmp_routine cmp_func;    /* compare function to use */ |   cmp_routine cmp_func; //compare function to use | ||||||
| } LinkedList; | } LinkedList; | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -327,5 +327,4 @@ int ListSize(LinkedList* list); | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* LINKED_LIST_H */ | #endif //LINKED_LIST_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 THREADPOOL_H | #ifndef THREADPOOL_H | ||||||
| #define THREADPOOL_H | #define THREADPOOL_H | ||||||
| @@ -36,17 +36,17 @@ | |||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* Size of job free list */ | //Size of job free list | ||||||
| #define JOBFREELISTSIZE 100 | #define JOBFREELISTSIZE 100 | ||||||
|  |  | ||||||
| #define INFINITE_THREADS -1 | #define INFINITE_THREADS -1 | ||||||
|  |  | ||||||
| #define EMAXTHREADS (-8 & 1<<29) | #define EMAXTHREADS (-8 & 1<<29) | ||||||
|  |  | ||||||
| /* Invalid Policy */ | //Invalid Policy | ||||||
| #define INVALID_POLICY (-9 & 1<<29) | #define INVALID_POLICY (-9 & 1<<29) | ||||||
|  |  | ||||||
| /* Invalid JOB Id */ | //Invalid JOB Id | ||||||
| #define INVALID_JOB_ID (-2 & 1<<29) | #define INVALID_JOB_ID (-2 & 1<<29) | ||||||
|  |  | ||||||
| typedef enum duration {SHORT_TERM,PERSISTENT} Duration; | typedef enum duration {SHORT_TERM,PERSISTENT} Duration; | ||||||
| @@ -55,20 +55,20 @@ typedef enum priority {LOW_PRIORITY, | |||||||
| 		       MED_PRIORITY, | 		       MED_PRIORITY, | ||||||
| 		       HIGH_PRIORITY} ThreadPriority; | 		       HIGH_PRIORITY} ThreadPriority; | ||||||
|  |  | ||||||
| #define DEFAULT_PRIORITY MED_PRIORITY /* default priority used by TPJobInit */ | #define DEFAULT_PRIORITY MED_PRIORITY //default priority used by TPJobInit | ||||||
| #define DEFAULT_MIN_THREADS 1	      /* default minimum used by TPAttrInit */ | #define DEFAULT_MIN_THREADS 1	      //default minimum used by TPAttrInit | ||||||
| #define DEFAULT_MAX_THREADS 10	      /* default max used by TPAttrInit	*/ | #define DEFAULT_MAX_THREADS 10	      //default max used by TPAttrInit	 | ||||||
| #define DEFAULT_JOBS_PER_THREAD 10    /* default jobs per thread used by TPAttrInit */ | #define DEFAULT_JOBS_PER_THREAD 10    //default jobs per thread used by TPAttrInit | ||||||
| #define DEFAULT_STARVATION_TIME	500   /* default starvation time used by TPAttrInit */ | #define DEFAULT_STARVATION_TIME	500   //default starvation time used by TPAttrInit | ||||||
| #define DEFAULT_IDLE_TIME 10 * 1000   /* default idle time used by TPAttrInit */ | #define DEFAULT_IDLE_TIME 10 * 1000   //default idle time used by TPAttrInit | ||||||
| #define DEFAULT_FREE_ROUTINE NULL     /* default free routine used TPJobInit */ | #define DEFAULT_FREE_ROUTINE NULL     //default free routine used TPJobInit | ||||||
| #define DEFAULT_MAX_JOBS_TOTAL 100    /* default max jobs used TPAttrInit */ | #define DEFAULT_MAX_JOBS_TOTAL 100    //default max jobs used TPAttrInit | ||||||
|  |  | ||||||
| #define STATS 1 /* always include stats because code change is minimal */ | #define STATS 1 //always include stats because code change is minimal | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Statistics */ | //Statistics | ||||||
| #ifdef WIN32 /* TODO: check why STATSONLY fails during compilation */ | #ifdef WIN32 // todo: check why STATSONLY fails during compilation | ||||||
|  #undef STATS |  #undef STATS | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -82,6 +82,15 @@ typedef enum priority {LOW_PRIORITY, | |||||||
|  #define DEBUG 1 |  #define DEBUG 1 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | //DEBUGGING | ||||||
|  | #ifndef WIN32 | ||||||
|  |  #ifdef DEBUG | ||||||
|  |   #define DBGONLY(x) x | ||||||
|  |  #else | ||||||
|  |   #define DBGONLY(x) | ||||||
|  |  #endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include "LinkedList.h" | #include "LinkedList.h" | ||||||
| #include <sys/timeb.h> | #include <sys/timeb.h> | ||||||
| #include "FreeList.h" | #include "FreeList.h" | ||||||
| @@ -92,7 +101,7 @@ typedef enum priority {LOW_PRIORITY, | |||||||
| #define EXPORT | #define EXPORT | ||||||
| typedef int PolicyType; | typedef int PolicyType; | ||||||
| #define DEFAULT_POLICY SCHED_OTHER | #define DEFAULT_POLICY SCHED_OTHER | ||||||
| #define DEFAULT_SCHED_PARAM 0 /* default priority */ | #define DEFAULT_SCHED_PARAM 0 //default priority | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Name: free_routine |  * Name: free_routine | ||||||
| @@ -111,25 +120,25 @@ typedef void (*free_routine)(void *arg); | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| typedef struct THREADPOOLATTR | typedef struct THREADPOOLATTR | ||||||
| { | { | ||||||
|   int minThreads;     /* minThreads, ThreadPool will always maintain at least |   int minThreads;     // minThreads, ThreadPool will always maintain at least | ||||||
|                          this many threads */ |                       // this many threads | ||||||
|  |  | ||||||
|   int maxThreads;     /* maxThreads, ThreadPool will never have more than this |   int maxThreads;     // maxThreads, ThreadPool will never have more than this | ||||||
|                          number of threads */ |                       // number of threads | ||||||
|  |  | ||||||
|   int maxIdleTime;    /* maxIdleTime (in milliseconds) |   int maxIdleTime;    // maxIdleTime (in milliseconds) | ||||||
|                          this is the maximum time a thread will remain idle |                       // this is the maximum time a thread will remain idle | ||||||
|                          before dying */ |                       // before dying | ||||||
|  |  | ||||||
|   int jobsPerThread;  /* jobs per thread to maintain */ |   int jobsPerThread;  // jobs per thread to maintain | ||||||
|  |  | ||||||
|   int maxJobsTotal;   /* maximum number of jobs that can be queued totally. */ |   int maxJobsTotal;   // maximum number of jobs that can be queued totally. | ||||||
|  |  | ||||||
|   int starvationTime; /* the time a low priority or med priority |   int starvationTime; // the time a low priority or med priority | ||||||
| 	                 job waits before getting bumped | 	              // job waits before getting bumped | ||||||
|                          up a priority (in milliseconds) */ |                       // up a priority (in milliseconds) | ||||||
|  |  | ||||||
|   PolicyType schedPolicy; /* scheduling policy to use */ |   PolicyType schedPolicy; // scheduling policy to use | ||||||
|  |  | ||||||
| } ThreadPoolAttr; | } ThreadPoolAttr; | ||||||
|  |  | ||||||
| @@ -141,12 +150,12 @@ typedef struct THREADPOOLATTR | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| typedef struct THREADPOOLJOB | typedef struct THREADPOOLJOB | ||||||
| { | { | ||||||
|   start_routine func; |   start_routine func; //function | ||||||
|   void *arg; |   void *arg;          //arg | ||||||
|   free_routine free_func; |   free_routine free_func; //free function | ||||||
|   struct timeb requestTime; |   struct timeb requestTime; //time of request | ||||||
|   int priority; |   int priority;       //priority of request | ||||||
|   int jobId; |   int jobId;         //id | ||||||
| } ThreadPoolJob; | } ThreadPoolJob; | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -156,32 +165,32 @@ typedef struct THREADPOOLJOB | |||||||
|  *     Structure to hold statistics |  *     Structure to hold statistics | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
|  |  | ||||||
| #ifdef STATS | STATSONLY( | ||||||
|  |  | ||||||
| typedef struct TPOOLSTATS | typedef struct TPOOLSTATS | ||||||
| { | { | ||||||
|   double totalTimeHQ; |   double totalTimeHQ; //total time spent by all jobs in high priority Q | ||||||
|   int totalJobsHQ; |   int totalJobsHQ;    //total jobs in HQ run so far | ||||||
|   double avgWaitHQ; |   double avgWaitHQ;   //average wait in HQ | ||||||
|   double totalTimeMQ; |   double totalTimeMQ; //total time spent by all jobs in med priority Q | ||||||
|   int totalJobsMQ; |   int totalJobsMQ;    //total jobs in MQ run so far | ||||||
|   double avgWaitMQ; |   double avgWaitMQ;   //average wait in MQ | ||||||
|   double totalTimeLQ; |   double totalTimeLQ; //total time spent by all jobs in low priority Q | ||||||
|   int totalJobsLQ; |   int totalJobsLQ;    //total jobs in LQ run so far | ||||||
|   double avgWaitLQ; |   double avgWaitLQ;	//average wait in LQ | ||||||
|   double totalWorkTime; |   double totalWorkTime; //total time spent working for all threads | ||||||
|   double totalIdleTime; |   double totalIdleTime; //total time spent idle for all threads | ||||||
|   int workerThreads; |   int workerThreads; //number of current workerThreads | ||||||
|   int idleThreads; |   int idleThreads;   //number of current idle threads | ||||||
|   int persistentThreads; |   int persistentThreads; //number of persistent threads | ||||||
|   int totalThreads; |   int totalThreads; //total number of current threads | ||||||
|   int maxThreads; |   int maxThreads; //max threads so far | ||||||
|   int currentJobsHQ; |   int currentJobsHQ; // current jobs in Q | ||||||
|   int currentJobsLQ; |   int currentJobsLQ; //current jobs in Q | ||||||
|   int currentJobsMQ; |   int currentJobsMQ; //current jobs in Q | ||||||
| }ThreadPoolStats; | }ThreadPoolStats; | ||||||
|  |  | ||||||
| #endif | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -206,26 +215,24 @@ typedef struct TPOOLSTATS | |||||||
|  |  | ||||||
| typedef struct THREADPOOL | typedef struct THREADPOOL | ||||||
| { | { | ||||||
|   ithread_mutex_t mutex; /* mutex to protect job qs */ |   ithread_mutex_t mutex; //mutex to protect job qs | ||||||
|   ithread_cond_t condition; /* condition variable to signal Q */ |   ithread_cond_t condition; //condition variable to signal Q | ||||||
|   ithread_cond_t start_and_shutdown; /* condition variable for start  |   ithread_cond_t start_and_shutdown; //condition variable for start  | ||||||
|                                         and stop */ |                                      //and stop      | ||||||
|   int lastJobId; /* ids for jobs */ |   int lastJobId; //ids for jobs  | ||||||
|   int shutdown;  /* whether or not we are shutting down */ |   int shutdown;   //whether or not we are shutting down | ||||||
|   int totalThreads;      /* total number of threads */ |   int totalThreads;       //total number of threads	 | ||||||
|   int persistentThreads; /* number of persistent threads */ |   int persistentThreads; //number of persistent threads | ||||||
|   FreeList jobFreeList;  /* free list of jobs */ |   FreeList jobFreeList; //free list of jobs | ||||||
|   LinkedList lowJobQ;    /* low priority job Q */ |   LinkedList lowJobQ;    //low priority job Q | ||||||
|   LinkedList medJobQ;    /* med priority job Q */ |   LinkedList medJobQ;    //med priority job Q | ||||||
|   LinkedList highJobQ;   /* high priority job Q */ |   LinkedList highJobQ;   //high priority job Q | ||||||
|   ThreadPoolJob *persistentJob; /* persistent job */ |   ThreadPoolJob *persistentJob; //persistent job | ||||||
|   |   | ||||||
|   ThreadPoolAttr attr; /* thread pool attributes */ |   ThreadPoolAttr attr; //thread pool attributes | ||||||
|    |    | ||||||
| #ifdef STATS |   //statistics  | ||||||
|   /* statistics */ |   STATSONLY(ThreadPoolStats stats;) | ||||||
|   ThreadPoolStats stats; |  | ||||||
| #endif |  | ||||||
|   |   | ||||||
| } ThreadPool; | } ThreadPool; | ||||||
|  |  | ||||||
| @@ -543,19 +550,12 @@ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal); | |||||||
|  *  Returns: |  *  Returns: | ||||||
|  *      Always returns 0. |  *      Always returns 0. | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #ifdef STATS | STATSONLY( EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);); | ||||||
| 	EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats); |  | ||||||
|  |  | ||||||
| 	EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats); | STATSONLY(EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats);); | ||||||
| #else |  | ||||||
| 	static UPNP_INLINE int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats) {} |  | ||||||
|  |  | ||||||
| 	static UPNP_INLINE void ThreadPoolPrintStats(ThreadPoolStats *stats) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* ThreadPool */ | #endif //ThreadPool | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 TIMERTHREAD_H | #ifndef TIMERTHREAD_H | ||||||
| #define TIMERTHREAD_H | #define TIMERTHREAD_H | ||||||
| @@ -43,9 +43,9 @@ extern "C" { | |||||||
|  |  | ||||||
| #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; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -63,13 +63,13 @@ typedef enum timeoutType {ABS_SEC,REL_SEC} TimeoutType; | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| typedef struct TIMERTHREAD | typedef struct TIMERTHREAD | ||||||
| { | { | ||||||
|   ithread_mutex_t mutex; |   ithread_mutex_t mutex; //mutex to protect eventQ | ||||||
|   ithread_cond_t condition; |   ithread_cond_t condition; //condition variable | ||||||
|   int lastEventId; |   int lastEventId;	//last event id | ||||||
|   LinkedList eventQ; |   LinkedList eventQ; //event q | ||||||
|   int shutdown; |   int shutdown;      //whether or not we are shutdown   | ||||||
|   FreeList freeEvents; |   FreeList freeEvents; //FreeList for events | ||||||
|   ThreadPool *tp; |   ThreadPool *tp;	 //ThreadPool to use | ||||||
| } TimerThread; | } TimerThread; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -85,9 +85,9 @@ typedef struct TIMERTHREAD | |||||||
| typedef struct TIMEREVENT | typedef struct TIMEREVENT | ||||||
| { | { | ||||||
|   ThreadPoolJob job; |   ThreadPoolJob job; | ||||||
|   time_t eventTime; /* absolute time for event in seconds since Jan 1, 1970 */ |   time_t eventTime; //absolute time for event in seconds since Jan 1, 1970 | ||||||
|   Duration persistent;  /* long term or short term job */ |   Duration persistent;          //long term or short term job | ||||||
|   int id; |   int id;                //id of job | ||||||
| } TimerEvent; | } TimerEvent; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -188,5 +188,4 @@ int TimerThreadShutdown(TimerThread *timer); | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* TIMER_THREAD_H */ | #endif //TIMER_THREAD_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. | ||||||
|  * | // | ||||||
|  ******************************************************************************/ | /////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| #include <stdarg.h> | #include <stdarg.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 ITHREADH | #ifndef ITHREADH | ||||||
| #define ITHREADH | #define ITHREADH | ||||||
| @@ -36,33 +36,20 @@ extern "C" { | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef DEBUG | ||||||
|  | #define DEBUG_ONLY(x) x | ||||||
|  | #else | ||||||
|  | #define DEBUG_ONLY(x) | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #include <pthread.h> | #include <pthread.h> | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  #include <unistd.h> |  #include <unistd.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef __FreeBSD__ |  | ||||||
| 	#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef PTHREAD_MUTEX_RECURSIVE |  | ||||||
| 	/* This system has SuS2-compliant mutex attributes. |  | ||||||
| 	 * E.g. on Cygwin, where we don't have the old nonportable (NP) symbols |  | ||||||
| 	 */ |  | ||||||
| 	#define ITHREAD_MUTEX_FAST_NP       PTHREAD_MUTEX_NORMAL |  | ||||||
| 	#define ITHREAD_MUTEX_RECURSIVE_NP  PTHREAD_MUTEX_RECURSIVE |  | ||||||
| 	#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK |  | ||||||
| #else /* PTHREAD_MUTEX_RECURSIVE */ |  | ||||||
| #define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP | #define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP | ||||||
| #define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP | #define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP | ||||||
| #define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP | #define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP | ||||||
| #endif /* PTHREAD_MUTEX_RECURSIVE */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE |  | ||||||
| #define ITHREAD_PROCESS_SHARED  PTHREAD_PROCESS_SHARED |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #define ITHREAD_CANCELED PTHREAD_CANCELED | #define ITHREAD_CANCELED PTHREAD_CANCELED | ||||||
|    |    | ||||||
|    |    | ||||||
| @@ -141,28 +128,6 @@ typedef pthread_mutex_t ithread_mutex_t; | |||||||
|    ***************************************************************************/ |    ***************************************************************************/ | ||||||
|   typedef pthread_condattr_t ithread_condattr_t;	 |   typedef pthread_condattr_t ithread_condattr_t;	 | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Name: ithread_rwlockattr_t |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Mutex attribute. |  | ||||||
|  *      typedef to pthread_rwlockattr_t |  | ||||||
|  *      Internal Use Only |  | ||||||
|  ***************************************************************************/ |  | ||||||
| typedef pthread_rwlockattr_t ithread_rwlockattr_t;	 |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Name: ithread_rwlock_t |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Condition attribute. |  | ||||||
|  *      typedef to pthread_rwlock_t |  | ||||||
|  *      Internal Use Only |  | ||||||
|  ***************************************************************************/ |  | ||||||
| typedef pthread_rwlock_t ithread_rwlock_t;	 |  | ||||||
|  |  | ||||||
|   /**************************************************************************** |   /**************************************************************************** | ||||||
|    * Function: ithread_mutexattr_init |    * Function: ithread_mutexattr_init | ||||||
|    * |    * | ||||||
| @@ -177,8 +142,8 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
|    *      Always returns 0. |    *      Always returns 0. | ||||||
|    *      See man page for pthread_mutexattr_init |    *      See man page for pthread_mutexattr_init | ||||||
|    ***************************************************************************/ |    ***************************************************************************/ | ||||||
| #define ithread_mutexattr_init pthread_mutexattr_init |  | ||||||
|    |    | ||||||
|  | #define ithread_mutexattr_init pthread_mutexattr_init | ||||||
|    |    | ||||||
|   /**************************************************************************** |   /**************************************************************************** | ||||||
|    * Function: ithread_mutexattr_destroy |    * Function: ithread_mutexattr_destroy | ||||||
| @@ -207,7 +172,7 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
|  *                       ITHREAD_MUTEX_ERRORCHECK_NP |  *                       ITHREAD_MUTEX_ERRORCHECK_NP | ||||||
|  * |  * | ||||||
|  *  Parameters: |  *  Parameters: | ||||||
|  *      ithread_mutexattr_t * attr (must be valid non NULL pointer to  |  *      ithread_mutexattr_t * mutex (must be valid non NULL pointer to  | ||||||
|  *                                   ithread_mutexattr_t) |  *                                   ithread_mutexattr_t) | ||||||
|  *      int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP |  *      int kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP | ||||||
|  *                or ITHREAD_MUTEX_ERRORCHECK_NP) |  *                or ITHREAD_MUTEX_ERRORCHECK_NP) | ||||||
| @@ -216,11 +181,8 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
|  *      Returns EINVAL if the kind is not supported. |  *      Returns EINVAL if the kind is not supported. | ||||||
|  *      See man page for pthread_mutexattr_setkind_np |  *      See man page for pthread_mutexattr_setkind_np | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #ifdef PTHREAD_MUTEX_RECURSIVE |  | ||||||
| 	#define ithread_mutexattr_setkind_np pthread_mutexattr_settype |  | ||||||
| #else |  | ||||||
| #define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np | #define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_mutexattr_getkind_np |  * Function: ithread_mutexattr_getkind_np | ||||||
| @@ -232,7 +194,7 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
|  *                       ITHREAD_MUTEX_ERRORCHECK_NP |  *                       ITHREAD_MUTEX_ERRORCHECK_NP | ||||||
|  * |  * | ||||||
|  *  Parameters: |  *  Parameters: | ||||||
|  *      ithread_mutexattr_t * attr (must be valid non NULL pointer to  |  *      ithread_mutexattr_t * mutex (must be valid non NULL pointer to  | ||||||
|  *                                   pthread_mutexattr_t) |  *                                   pthread_mutexattr_t) | ||||||
|  *      int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP |  *      int *kind (one of ITHREAD_MUTEX_FAST_NP or ITHREAD_MUTEX_RECURSIVE_NP | ||||||
|  *                or ITHREAD_MUTEX_ERRORCHECK_NP) |  *                or ITHREAD_MUTEX_ERRORCHECK_NP) | ||||||
| @@ -241,11 +203,7 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
|  *      Always returns 0. |  *      Always returns 0. | ||||||
|  *      See man page for pthread_mutexattr_getkind_np |  *      See man page for pthread_mutexattr_getkind_np | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #ifdef PTHREAD_MUTEX_RECURSIVE |  | ||||||
| 	#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype |  | ||||||
| #else |  | ||||||
| #define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np | #define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np | ||||||
| #endif |  | ||||||
|  |  | ||||||
|    |    | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -265,7 +223,6 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #define ithread_mutex_init pthread_mutex_init | #define ithread_mutex_init pthread_mutex_init | ||||||
|    |    | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_mutex_lock |  * Function: ithread_mutex_lock | ||||||
|  * |  * | ||||||
| @@ -320,169 +277,6 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
| #define ithread_mutex_destroy pthread_mutex_destroy | #define ithread_mutex_destroy pthread_mutex_destroy | ||||||
|  |  | ||||||
|    |    | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlockattr_init |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Initializes a rwlock attribute variable to default values. |  | ||||||
|  *  Parameters: |  | ||||||
|  *      const ithread_rwlockattr_init *attr (must be valid non NULL pointer to  |  | ||||||
|  *                                           pthread_rwlockattr_t) |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success, Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlockattr_init |  | ||||||
|  ***************************************************************************/ |  | ||||||
| #define ithread_rwlockattr_init pthread_rwlockattr_init |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlockattr_destroy |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Releases any resources held by the rwlock attribute. |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlockattr_t *attr (must be valid non NULL pointer to  |  | ||||||
|  *                                  pthread_rwlockattr_t) |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success, Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlockattr_destroy |  | ||||||
|  ***************************************************************************/ |  | ||||||
| #define ithread_rwlockattr_destroy pthread_rwlockattr_destroy |  | ||||||
|    |  | ||||||
|    |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlockatttr_setpshared |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Sets the rwlock type in the attribute. |  | ||||||
|  *      Valid types are: ITHREAD_PROCESS_PRIVATE  |  | ||||||
|  *                       ITHREAD_PROCESS_SHARED |  | ||||||
|  * |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlockattr_t * attr (must be valid non NULL pointer to  |  | ||||||
|  *                                   ithread_rwlockattr_t) |  | ||||||
|  *      int kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED) |  | ||||||
|  * |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success. Nonzero on failure. |  | ||||||
|  *      Returns EINVAL if the kind is not supported. |  | ||||||
|  *      See man page for pthread_rwlockattr_setkind_np |  | ||||||
|  *****************************************************************************/ |  | ||||||
| #define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlockatttr_getpshared |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Gets the rwlock type in the attribute. |  | ||||||
|  *      Valid types are: ITHREAD_PROCESS_PRIVATE  |  | ||||||
|  *                       ITHREAD_PROCESS_SHARED  |  | ||||||
|  * |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlockattr_t * attr (must be valid non NULL pointer to  |  | ||||||
|  *                                   pthread_rwlockattr_t) |  | ||||||
|  *      int *kind (one of ITHREAD_PROCESS_PRIVATE or ITHREAD_PROCESS_SHARED) |  | ||||||
|  * |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success. Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlockatttr_getpshared |  | ||||||
|  *****************************************************************************/ |  | ||||||
| #define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared |  | ||||||
|  |  | ||||||
|    |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlock_init |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Initializes rwlock. |  | ||||||
|  *      Must be called before use. |  | ||||||
|  *       |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) |  | ||||||
|  *      const ithread_rwlockattr_t * rwlock_attr  |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success, Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlock_init |  | ||||||
|  *****************************************************************************/ |  | ||||||
| #define ithread_rwlock_init pthread_rwlock_init |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlock_rdlock |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Locks rwlock for reading. |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) |  | ||||||
|  *      rwlock must be initialized. |  | ||||||
|  *       |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success, Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlock_rdlock |  | ||||||
|  *****************************************************************************/ |  | ||||||
| #define ithread_rwlock_rdlock pthread_rwlock_rdlock |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlock_wrlock |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Locks rwlock for writting. |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) |  | ||||||
|  *      rwlock must be initialized. |  | ||||||
|  *       |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success, Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlock_wrlock |  | ||||||
|  *****************************************************************************/ |  | ||||||
| #define ithread_rwlock_wrlock pthread_rwlock_wrlock |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlock_unlock |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Unlocks rwlock. |  | ||||||
|  * |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) |  | ||||||
|  *      rwlock must be initialized. |  | ||||||
|  *       |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success, Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlock_unlock |  | ||||||
|  *****************************************************************************/ |  | ||||||
| #define ithread_rwlock_unlock pthread_rwlock_unlock |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** |  | ||||||
|  * Function: ithread_rwlock_destroy |  | ||||||
|  * |  | ||||||
|  *  Description: |  | ||||||
|  *      Releases any resources held by the rwlock.  |  | ||||||
|  *		rwlock can no longer be used after this call. |  | ||||||
|  *		rwlock is only destroyed when there are no longer any threads waiting on it.  |  | ||||||
|  *		rwlock cannot be destroyed if it is locked. |  | ||||||
|  *  Parameters: |  | ||||||
|  *      ithread_rwlock_t * rwlock (must be valid non NULL pointer to pthread_rwlock_t) |  | ||||||
|  *      rwlock must be initialized. |  | ||||||
|  *  Returns: |  | ||||||
|  *      0 on success. Nonzero on failure. |  | ||||||
|  *      Always returns 0. |  | ||||||
|  *      See man page for pthread_rwlock_destroy |  | ||||||
|  *****************************************************************************/ |  | ||||||
| #define ithread_rwlock_destroy pthread_rwlock_destroy |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
|  * Function: ithread_cond_init |  * Function: ithread_cond_init | ||||||
|  * |  * | ||||||
| @@ -735,7 +529,7 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|  #ifndef UPNP_STATIC_LIB |  #ifndef UPNP_STATIC_LIB | ||||||
|   #ifdef LIBUPNP_EXPORTS |   #ifdef LIBUPNP_EXPORTS | ||||||
| 			/* set up declspec for dll export to make functions visible to library users */ |    // set up declspec for dll export to make functions visible to library users | ||||||
|    #define EXPORT_SPEC __declspec(dllexport) |    #define EXPORT_SPEC __declspec(dllexport) | ||||||
|   #else |   #else | ||||||
|    #define EXPORT_SPEC __declspec(dllimport) |    #define EXPORT_SPEC __declspec(dllimport) | ||||||
| @@ -748,14 +542,11 @@ typedef pthread_rwlock_t ithread_rwlock_t; | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef PTHREAD_MUTEX_RECURSIVE | //NK: Added for satisfying the gcc compiler   | ||||||
| /* NK: Added for satisfying the gcc compiler */ |  | ||||||
| EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind); | EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind); | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* ITHREADH */ | #endif //ITHREADH | ||||||
|  |  | ||||||
|   | |||||||
| @@ -30,8 +30,7 @@ | |||||||
| /////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| #include "LinkedList.h" | #include "LinkedList.h" | ||||||
| #include <sys/param.h> | #ifdef __FreeBSD__ | ||||||
| #if (defined(BSD) && BSD >= 199306) || defined(__OSX__) |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #else | #else | ||||||
| #include <malloc.h> | #include <malloc.h> | ||||||
|   | |||||||
| @@ -90,22 +90,14 @@ FreeThreadPoolJob( ThreadPool * tp, | |||||||
| static int | static int | ||||||
| SetPolicyType( PolicyType in ) | SetPolicyType( PolicyType in ) | ||||||
| { | { | ||||||
| #ifdef __CYGWIN__ |     #ifdef WIN32 | ||||||
|     /* TODO not currently working... */ |  | ||||||
|     return 0; |  | ||||||
| #elif defined(__OSX__) |  | ||||||
|     setpriority(PRIO_PROCESS, 0, 0); |  | ||||||
|     return 0; |  | ||||||
| #elif defined(WIN32) |  | ||||||
|      return sched_setscheduler( 0, in); |      return sched_setscheduler( 0, in); | ||||||
| #elif defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0 |     #else | ||||||
|      struct sched_param current; |      struct sched_param current; | ||||||
|  |  | ||||||
|      sched_getparam( 0, ¤t ); |      sched_getparam( 0, ¤t ); | ||||||
|      current.sched_priority = DEFAULT_SCHED_PARAM; |      current.sched_priority = DEFAULT_SCHED_PARAM; | ||||||
|      return sched_setscheduler( 0, in, ¤t ); |      return sched_setscheduler( 0, in, ¤t ); | ||||||
| #else |  | ||||||
|      return 0; |  | ||||||
|     #endif |     #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -126,7 +118,7 @@ SetPolicyType( PolicyType in ) | |||||||
| static int | static int | ||||||
| SetPriority( ThreadPriority priority ) | SetPriority( ThreadPriority priority ) | ||||||
| { | { | ||||||
| #if defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0 |  | ||||||
|     int currentPolicy; |     int currentPolicy; | ||||||
|     int minPriority = 0; |     int minPriority = 0; | ||||||
|     int maxPriority = 0; |     int maxPriority = 0; | ||||||
| @@ -158,9 +150,7 @@ SetPriority( ThreadPriority priority ) | |||||||
|  |  | ||||||
|     return pthread_setschedparam( ithread_self(  ), currentPolicy, |     return pthread_setschedparam( ithread_self(  ), currentPolicy, | ||||||
|                                   &newPriority ); |                                   &newPriority ); | ||||||
| #else |  | ||||||
|     return 0; |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -225,8 +215,10 @@ BumpPriority( ThreadPool * tp ) | |||||||
|                 //starvation time |                 //starvation time | ||||||
|                 //bump priority (add to higher priority Q) |                 //bump priority (add to higher priority Q) | ||||||
|  |  | ||||||
|                 STATSONLY( tp->stats.totalJobsMQ++; ) |                 STATSONLY( tp->stats.totalJobsMQ++; | ||||||
|                 STATSONLY( tp->stats.totalTimeMQ += diffTime; ) |                      ); | ||||||
|  |                 STATSONLY( tp->stats.totalTimeMQ += diffTime; | ||||||
|  |                      ); | ||||||
|  |  | ||||||
|                 ListDelNode( &tp->medJobQ, tp->medJobQ.head.next, 0 ); |                 ListDelNode( &tp->medJobQ, tp->medJobQ.head.next, 0 ); | ||||||
|                 ListAddTail( &tp->highJobQ, tempJob ); |                 ListAddTail( &tp->highJobQ, tempJob ); | ||||||
| @@ -244,8 +236,10 @@ BumpPriority( ThreadPool * tp ) | |||||||
|                 //starvation time |                 //starvation time | ||||||
|                 //bump priority (add to higher priority Q) |                 //bump priority (add to higher priority Q) | ||||||
|  |  | ||||||
|                 STATSONLY( tp->stats.totalJobsLQ++; ) |                 STATSONLY( tp->stats.totalJobsLQ++; | ||||||
|                 STATSONLY( tp->stats.totalTimeLQ += diffTime; ) |                      ); | ||||||
|  |                 STATSONLY( tp->stats.totalTimeLQ += diffTime; | ||||||
|  |                      ); | ||||||
|  |  | ||||||
|                 ListDelNode( &tp->lowJobQ, tp->lowJobQ.head.next, 0 ); |                 ListDelNode( &tp->lowJobQ, tp->lowJobQ.head.next, 0 ); | ||||||
|                 ListAddTail( &tp->medJobQ, tempJob ); |                 ListAddTail( &tp->medJobQ, tempJob ); | ||||||
| @@ -294,26 +288,14 @@ SetRelTimeout( struct timespec *time, | |||||||
|  *      ThreadPoolStats *stats must be valid non null stats structure |  *      ThreadPoolStats *stats must be valid non null stats structure | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #ifdef STATS | #ifdef STATS | ||||||
| static void StatsInit( ThreadPoolStats * stats ) | static void StatsInit( ThreadPoolStats * stats ) { | ||||||
| { |            assert( stats != NULL ); stats->totalIdleTime = 0; stats->totalJobsHQ = 0; stats->totalJobsLQ = 0; stats->totalJobsMQ = 0; stats->totalTimeHQ = 0; stats->totalTimeMQ = 0; stats->totalTimeLQ = 0; stats->totalWorkTime = 0; stats->totalIdleTime = 0; stats->avgWaitHQ = 0; //average wait in HQ | ||||||
|            assert( stats != NULL ); |            stats->avgWaitMQ = 0;    //average wait in MQ | ||||||
| 	   stats->totalIdleTime = 0; |  | ||||||
| 	   stats->totalJobsHQ = 0; |  | ||||||
| 	   stats->totalJobsLQ = 0; |  | ||||||
| 	   stats->totalJobsMQ = 0; |  | ||||||
| 	   stats->totalTimeHQ = 0; |  | ||||||
| 	   stats->totalTimeMQ = 0; |  | ||||||
| 	   stats->totalTimeLQ = 0; |  | ||||||
| 	   stats->totalWorkTime = 0; |  | ||||||
| 	   stats->totalIdleTime = 0; |  | ||||||
| 	   stats->avgWaitHQ = 0; |  | ||||||
|            stats->avgWaitMQ = 0; |  | ||||||
|            stats->avgWaitLQ = 0; |            stats->avgWaitLQ = 0; | ||||||
|            stats->workerThreads = 0; |            stats->workerThreads = 0; | ||||||
|            stats->idleThreads = 0; |            stats->idleThreads = 0; | ||||||
|            stats->persistentThreads = 0; |            stats->persistentThreads = 0; | ||||||
|            stats->maxThreads = 0; stats->totalThreads = 0; |            stats->maxThreads = 0; stats->totalThreads = 0;} | ||||||
| } |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| @@ -365,17 +347,10 @@ static void SetSeed() { | |||||||
|     ftime( &t ); |     ftime( &t ); | ||||||
| #if defined(WIN32) | #if defined(WIN32) | ||||||
|     srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id(  ).p ); |     srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id(  ).p ); | ||||||
| #elif defined(__FreeBSD__) || defined(__OSX__) | #elif defined(__FreeBSD__) | ||||||
|     srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id(  ) ); |     srand( ( unsigned int )t.millitm + (unsigned int)ithread_get_current_thread_id(  ) ); | ||||||
| #elif defined(__linux__) |  | ||||||
| 	srand( ( unsigned int )t.millitm + ithread_get_current_thread_id() ); |  | ||||||
| #else | #else | ||||||
| 	{ |     srand( ( unsigned int )t.millitm + ithread_get_current_thread_id(  ) ); | ||||||
| 		volatile union { volatile pthread_t tid; volatile unsigned i; } idu; |  | ||||||
|  |  | ||||||
| 		idu.tid = ithread_get_current_thread_id(); |  | ||||||
| 		srand( ( unsigned int )t.millitm + idu.i ); |  | ||||||
| 	} |  | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -395,7 +370,8 @@ static void SetSeed() { | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
|     static void *WorkerThread( void *arg ) { |     static void *WorkerThread( void *arg ) { | ||||||
|  |  | ||||||
|         STATSONLY( time_t start = 0; ) |         STATSONLY( time_t start = 0; | ||||||
|  |              ) | ||||||
|  |  | ||||||
|         ThreadPoolJob *job = NULL; |         ThreadPoolJob *job = NULL; | ||||||
|         ListNode *head = NULL; |         ListNode *head = NULL; | ||||||
| @@ -421,7 +397,8 @@ static void SetSeed() { | |||||||
|  |  | ||||||
|         SetSeed(  ); |         SetSeed(  ); | ||||||
|  |  | ||||||
|         STATSONLY( time( &start ); ) |         STATSONLY( time( &start ); | ||||||
|  |              ); | ||||||
|  |  | ||||||
|         while( 1 ) { |         while( 1 ) { | ||||||
|  |  | ||||||
| @@ -436,9 +413,12 @@ static void SetSeed() { | |||||||
|  |  | ||||||
|             retCode = 0; |             retCode = 0; | ||||||
|  |  | ||||||
|             STATSONLY( tp->stats.idleThreads++; ) |             STATSONLY( tp->stats.idleThreads++; | ||||||
|             STATSONLY( tp->stats.totalWorkTime += ( time( NULL ) - start ); ) //work time |                  ); | ||||||
|             STATSONLY( time( &start ); )  // idle time |             STATSONLY( tp->stats.totalWorkTime += ( time( NULL ) - start ); | ||||||
|  |                  );             //work time | ||||||
|  |             STATSONLY( time( &start ); | ||||||
|  |                  );             //idle time | ||||||
|  |  | ||||||
|             if( persistent == 1 ) { |             if( persistent == 1 ) { | ||||||
|                 //Persistent thread |                 //Persistent thread | ||||||
| @@ -446,7 +426,8 @@ static void SetSeed() { | |||||||
|                 tp->persistentThreads--; |                 tp->persistentThreads--; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             STATSONLY( if( persistent == 0 ) tp->stats.workerThreads--; ) |             STATSONLY( if( persistent == 0 ) | ||||||
|  |                        tp->stats.workerThreads--; ); | ||||||
|  |  | ||||||
|             //Check for a job or shutdown |             //Check for a job or shutdown | ||||||
|             while( ( tp->lowJobQ.size == 0 ) |             while( ( tp->lowJobQ.size == 0 ) | ||||||
| @@ -467,7 +448,7 @@ static void SetSeed() { | |||||||
|                          && ( ( tp->totalThreads ) > |                          && ( ( tp->totalThreads ) > | ||||||
|                               tp->attr.maxThreads ) ) ) { |                               tp->attr.maxThreads ) ) ) { | ||||||
|  |  | ||||||
|                     STATSONLY( tp->stats.idleThreads--; ) |                     STATSONLY( tp->stats.idleThreads-- ); | ||||||
|  |  | ||||||
|                     tp->totalThreads--; |                     tp->totalThreads--; | ||||||
|                     ithread_cond_broadcast( &tp->start_and_shutdown ); |                     ithread_cond_broadcast( &tp->start_and_shutdown ); | ||||||
| @@ -489,9 +470,12 @@ static void SetSeed() { | |||||||
|  |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             STATSONLY( tp->stats.idleThreads--; ) |             STATSONLY( tp->stats.idleThreads--; | ||||||
|             STATSONLY( tp->stats.totalIdleTime += ( time( NULL ) - start ); )  // idle time |                  ); | ||||||
|             STATSONLY( time( &start ); ) // work time |             STATSONLY( tp->stats.totalIdleTime += ( time( NULL ) - start ); | ||||||
|  |                  );             //idle time | ||||||
|  |             STATSONLY( time( &start ); | ||||||
|  |                  );             //work time | ||||||
|  |  | ||||||
|             //bump priority of starved jobs |             //bump priority of starved jobs | ||||||
|             BumpPriority( tp ); |             BumpPriority( tp ); | ||||||
| @@ -523,33 +507,34 @@ static void SetSeed() { | |||||||
|                     ithread_cond_broadcast( &tp->start_and_shutdown ); |                     ithread_cond_broadcast( &tp->start_and_shutdown ); | ||||||
|  |  | ||||||
|                 } else { |                 } else { | ||||||
|                     STATSONLY( tp->stats.workerThreads++; ) |                     STATSONLY( tp->stats.workerThreads++ ); | ||||||
|                     persistent = 0; |                     persistent = 0; | ||||||
|  |  | ||||||
|                     //Pick the highest priority job |                     //Pick the highest priority job | ||||||
|                     if( tp->highJobQ.size > 0 ) { |                     if( tp->highJobQ.size > 0 ) { | ||||||
|                         head = ListHead( &tp->highJobQ ); |                         head = ListHead( &tp->highJobQ ); | ||||||
|                         job = ( ThreadPoolJob * ) head->item; |                         job = ( ThreadPoolJob * ) head->item; | ||||||
|                         STATSONLY( CalcWaitTime( tp, HIGH_PRIORITY, job ); ) |                         STATSONLY( CalcWaitTime | ||||||
|  |                                    ( tp, HIGH_PRIORITY, job ) ); | ||||||
|                         ListDelNode( &tp->highJobQ, head, 0 ); |                         ListDelNode( &tp->highJobQ, head, 0 ); | ||||||
|  |  | ||||||
|                     } else if( tp->medJobQ.size > 0 ) { |                     } else if( tp->medJobQ.size > 0 ) { | ||||||
|                         head = ListHead( &tp->medJobQ ); |                         head = ListHead( &tp->medJobQ ); | ||||||
|                         job = ( ThreadPoolJob * ) head->item; |                         job = ( ThreadPoolJob * ) head->item; | ||||||
|                         STATSONLY( CalcWaitTime( tp, MED_PRIORITY, job ); ) |                         STATSONLY( CalcWaitTime( tp, MED_PRIORITY, job ) ); | ||||||
|                         ListDelNode( &tp->medJobQ, head, 0 ); |                         ListDelNode( &tp->medJobQ, head, 0 ); | ||||||
|  |  | ||||||
|                     } else if( tp->lowJobQ.size > 0 ) { |                     } else if( tp->lowJobQ.size > 0 ) { | ||||||
|                         head = ListHead( &tp->lowJobQ ); |                         head = ListHead( &tp->lowJobQ ); | ||||||
|                         job = ( ThreadPoolJob * ) head->item; |                         job = ( ThreadPoolJob * ) head->item; | ||||||
|                         STATSONLY( CalcWaitTime( tp, LOW_PRIORITY, job ); ) |                         STATSONLY( CalcWaitTime( tp, LOW_PRIORITY, job ) ); | ||||||
|                         ListDelNode( &tp->lowJobQ, head, 0 ); |                         ListDelNode( &tp->lowJobQ, head, 0 ); | ||||||
|  |  | ||||||
|                     } else { |                     } else { | ||||||
|  |  | ||||||
|                         // Should never get here |                         // Should never get here | ||||||
|                         assert( 0 ); |                         assert( 0 ); | ||||||
|                         STATSONLY( tp->stats.workerThreads--; ) |                         STATSONLY( tp->stats.workerThreads-- ); | ||||||
|                         tp->totalThreads--; |                         tp->totalThreads--; | ||||||
|                         ithread_cond_broadcast( &tp->start_and_shutdown ); |                         ithread_cond_broadcast( &tp->start_and_shutdown ); | ||||||
|                         ithread_mutex_unlock( &tp->mutex ); |                         ithread_mutex_unlock( &tp->mutex ); | ||||||
| @@ -654,11 +639,9 @@ static void SetSeed() { | |||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
| #ifdef STATS |         STATSONLY( if( tp->stats.maxThreads < tp->totalThreads ) { | ||||||
|         if( tp->stats.maxThreads < tp->totalThreads ) { |                    tp->stats.maxThreads = tp->totalThreads;} | ||||||
|                    tp->stats.maxThreads = tp->totalThreads; |          ) | ||||||
|         } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|             return rc; |             return rc; | ||||||
|     } |     } | ||||||
| @@ -686,7 +669,7 @@ static void SetSeed() { | |||||||
|         threads = tp->totalThreads - tp->persistentThreads; |         threads = tp->totalThreads - tp->persistentThreads; | ||||||
|  |  | ||||||
|         while( ( threads == 0 ) |         while( ( threads == 0 ) | ||||||
|                || ( ( jobs / threads ) >= tp->attr.jobsPerThread ) ) { |                || ( ( jobs / threads ) > tp->attr.jobsPerThread ) ) { | ||||||
|  |  | ||||||
|             if( CreateWorker( tp ) != 0 ) |             if( CreateWorker( tp ) != 0 ) | ||||||
|                 return; |                 return; | ||||||
| @@ -778,7 +761,7 @@ static void SetSeed() { | |||||||
|                                  JOBFREELISTSIZE ); |                                  JOBFREELISTSIZE ); | ||||||
|         assert( retCode == 0 ); |         assert( retCode == 0 ); | ||||||
|  |  | ||||||
|         STATSONLY( StatsInit( &tp->stats ); ) |         STATSONLY( StatsInit( &tp->stats ) ); | ||||||
|  |  | ||||||
|         retCode += ListInit( &tp->highJobQ, CmpThreadPoolJob, NULL ); |         retCode += ListInit( &tp->highJobQ, CmpThreadPoolJob, NULL ); | ||||||
|         assert( retCode == 0 ); |         assert( retCode == 0 ); | ||||||
| @@ -1511,33 +1494,36 @@ static void SetSeed() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef STATS | #ifdef STATS | ||||||
| void ThreadPoolPrintStats(ThreadPoolStats * stats) |     void ThreadPoolPrintStats( ThreadPoolStats * stats ) { | ||||||
| { |                assert( stats != NULL ); if( stats == NULL ) { | ||||||
| 	assert( stats != NULL ); |                return;} | ||||||
| 	if (stats == NULL) { |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	       #ifdef __FreeBSD__ | 	       #ifdef __FreeBSD__ | ||||||
|                printf( "ThreadPoolStats at Time: %d\n", time( NULL ) ); |                printf( "ThreadPoolStats at Time: %d\n", time( NULL ) ); | ||||||
| #else /* __FreeBSD__ */ | 	       #else | ||||||
|                printf( "ThreadPoolStats at Time: %ld\n", time( NULL ) ); |                printf( "ThreadPoolStats at Time: %ld\n", time( NULL ) ); | ||||||
| #endif /* __FreeBSD__ */ | 	       #endif | ||||||
| 	printf("High Jobs pending: %d\n", stats->currentJobsHQ); |                printf | ||||||
| 	printf("Med Jobs Pending: %d\n", stats->currentJobsMQ); |                ( "Average Wait in High Priority Q in milliseconds: %f\n", | ||||||
| 	printf("Low Jobs Pending: %d\n", stats->currentJobsLQ); |                  stats->avgWaitHQ ); | ||||||
| 	printf("Average Wait in High Priority Q in milliseconds: %f\n", stats->avgWaitHQ); |                printf | ||||||
| 	printf("Average Wait in Med Priority Q in milliseconds: %f\n", stats->avgWaitMQ); |                ( "Average Wait in Med Priority Q in milliseconds: %f\n", | ||||||
| 	printf("Averate Wait in Low Priority Q in milliseconds: %f\n", stats->avgWaitLQ); |                  stats->avgWaitMQ ); | ||||||
|  |                printf | ||||||
|  |                ( "Averate Wait in Low Priority Q in milliseconds: %f\n", | ||||||
|  |                  stats->avgWaitLQ ); | ||||||
|                printf( "Max Threads Active: %d\n", stats->maxThreads ); |                printf( "Max Threads Active: %d\n", stats->maxThreads ); | ||||||
| 	printf("Current Worker Threads: %d\n", stats->workerThreads); |                printf( "Current Worker Threads: %d\n", | ||||||
| 	printf("Current Persistent Threads: %d\n", stats->persistentThreads); |                        stats->workerThreads ); | ||||||
|  |                printf( "Current Persistent Threads: %d\n", | ||||||
|  |                        stats->persistentThreads ); | ||||||
|                printf( "Current Idle Threads: %d\n", stats->idleThreads ); |                printf( "Current Idle Threads: %d\n", stats->idleThreads ); | ||||||
|                printf( "Total Threads : %d\n", stats->totalThreads ); |                printf( "Total Threads : %d\n", stats->totalThreads ); | ||||||
| 	printf("Total Time spent Working in seconds: %f\n", stats->totalWorkTime); |                printf( "Total Time spent Working in seconds: %f\n", | ||||||
| 	printf("Total Time spent Idle in seconds : %f\n", stats->totalIdleTime); |                        stats->totalWorkTime ); | ||||||
| } |                printf( "Total Time spent Idle in seconds : %f\n", | ||||||
| #endif /* STATS */ |                        stats->totalIdleTime );} | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  /**************************************************************************** |  /**************************************************************************** | ||||||
|  * Function: TPAttrSetMaxJobsTotal |  * Function: TPAttrSetMaxJobsTotal | ||||||
| @@ -1550,10 +1536,8 @@ void ThreadPoolPrintStats(ThreadPoolStats * stats) | |||||||
|  *  Returns: |  *  Returns: | ||||||
|  *      Always returns 0. |  *      Always returns 0. | ||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| int TPAttrSetMaxJobsTotal( |     int TPAttrSetMaxJobsTotal( ThreadPoolAttr * attr, | ||||||
| 	ThreadPoolAttr * attr, |                                int  maxJobsTotal ) { | ||||||
| 	int  maxJobsTotal ) |  | ||||||
| { |  | ||||||
|         assert( attr != NULL ); |         assert( attr != NULL ); | ||||||
|  |  | ||||||
|         if( attr == NULL ) { |         if( attr == NULL ) { | ||||||
| @@ -1579,54 +1563,40 @@ int TPAttrSetMaxJobsTotal( | |||||||
|  *****************************************************************************/ |  *****************************************************************************/ | ||||||
| #ifdef STATS | #ifdef STATS | ||||||
| int | int | ||||||
| ThreadPoolGetStats( |                    ThreadPoolGetStats( ThreadPool * tp, | ||||||
|     ThreadPool *tp, |                                        ThreadPoolStats * stats ) { | ||||||
|     ThreadPoolStats *stats) |  | ||||||
| { |  | ||||||
|                    assert( tp != NULL ); |                    assert( tp != NULL ); | ||||||
|                    assert( stats != NULL ); |                    assert( stats != NULL ); | ||||||
|  |                    if( ( tp == NULL ) || ( stats == NULL ) ) { | ||||||
| 	if (tp == NULL || stats == NULL) { |                    return EINVAL;} | ||||||
| 		return EINVAL; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
|                    //if not shutdown then acquire mutex |                    //if not shutdown then acquire mutex | ||||||
|                    if( !tp->shutdown ) { |                    if( !tp->shutdown ) { | ||||||
| 		ithread_mutex_lock(&tp->mutex); |                    ithread_mutex_lock( &tp->mutex );} | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	*stats = tp->stats; |                    ( *stats ) = tp->stats; if( stats->totalJobsHQ > 0 ) | ||||||
| 	if (stats->totalJobsHQ > 0) { |                    stats->avgWaitHQ = | ||||||
| 		stats->avgWaitHQ = stats->totalTimeHQ / stats->totalJobsHQ; |                    stats->totalTimeHQ / stats->totalJobsHQ; | ||||||
| 	} else { |                    else | ||||||
| 		stats->avgWaitHQ = 0; |                    stats->avgWaitHQ = 0; if( stats->totalJobsMQ > 0 ) | ||||||
| 	} |                    stats->avgWaitMQ = | ||||||
| 	 |                    stats->totalTimeMQ / stats->totalJobsMQ; | ||||||
| 	if( stats->totalJobsMQ > 0 ) { |                    else | ||||||
| 		stats->avgWaitMQ = stats->totalTimeMQ / stats->totalJobsMQ; |                    stats->avgWaitMQ = 0; if( stats->totalJobsLQ > 0 ) | ||||||
| 	} else { |                    stats->avgWaitLQ = | ||||||
| 		stats->avgWaitMQ = 0; |                    stats->totalTimeLQ / stats->totalJobsLQ; | ||||||
| 	} |                    else | ||||||
| 	 |  | ||||||
| 	if( stats->totalJobsLQ > 0 ) { |  | ||||||
| 		stats->avgWaitLQ = stats->totalTimeLQ / stats->totalJobsLQ; |  | ||||||
| 	} else { |  | ||||||
|                    stats->avgWaitLQ = 0; |                    stats->avgWaitLQ = 0; | ||||||
| 	} |  | ||||||
|  |  | ||||||
|                    stats->totalThreads = tp->totalThreads; |                    stats->totalThreads = tp->totalThreads; | ||||||
|                    stats->persistentThreads = tp->persistentThreads; |                    stats->persistentThreads = tp->persistentThreads; | ||||||
|                    stats->currentJobsHQ = ListSize( &tp->highJobQ ); |                    stats->currentJobsHQ = ListSize( &tp->highJobQ ); | ||||||
|                    stats->currentJobsLQ = ListSize( &tp->lowJobQ ); |                    stats->currentJobsLQ = ListSize( &tp->lowJobQ ); | ||||||
|                    stats->currentJobsMQ = ListSize( &tp->medJobQ ); |                    stats->currentJobsMQ = ListSize( &tp->medJobQ ); | ||||||
|  |  | ||||||
|                    //if not shutdown then release mutex |                    //if not shutdown then release mutex | ||||||
|                    if( !tp->shutdown ) { |                    if( !tp->shutdown ) { | ||||||
| 		ithread_mutex_unlock( &tp->mutex ); |                    ithread_mutex_unlock( &tp->mutex );} | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return 0; |                    return 0;} | ||||||
| } |  | ||||||
|  |  | ||||||
| #endif /* STATS */ |  | ||||||
|  |  | ||||||
|  | #endif | ||||||
|   | |||||||
| @@ -31,8 +31,7 @@ | |||||||
|  |  | ||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <sys/param.h> | #ifdef __FreeBSD__ | ||||||
| #if (defined(BSD) && BSD >= 199306) || defined(__OSX__) |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #else | #else | ||||||
| #include <malloc.h> | #include <malloc.h> | ||||||
|   | |||||||
							
								
								
									
										140
									
								
								upnp/Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										140
									
								
								upnp/Makefile.am
									
									
									
									
									
								
							| @@ -1,13 +1,13 @@ | |||||||
|  | # $Id: Makefile.am,v 1.10 2006/04/08 15:22:22 r3mi Exp $ | ||||||
| # | # | ||||||
| # "Makefile.am" for "libupnp/upnp" | # "Makefile.am" for "libupnp/upnp" | ||||||
| # | # | ||||||
| # Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net> | # Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net> | ||||||
| # | # | ||||||
|  |  | ||||||
| SUBDIRS = doc . sample | SUBDIRS 		= doc | ||||||
|  |  | ||||||
| AM_CPPFLAGS = \ | AM_CPPFLAGS		= -I$(srcdir)/inc \ | ||||||
| 	-I$(srcdir)/inc \ |  | ||||||
| 			  -I$(top_srcdir)/threadutil/inc \ | 			  -I$(top_srcdir)/threadutil/inc \ | ||||||
| 			  -I$(top_srcdir)/ixml/inc | 			  -I$(top_srcdir)/ixml/inc | ||||||
|  |  | ||||||
| @@ -15,79 +15,55 @@ AM_CFLAGS = $(PTHREAD_CFLAGS) | |||||||
|  |  | ||||||
| AM_LDFLAGS		= $(PTHREAD_LIBS) | AM_LDFLAGS		= $(PTHREAD_LIBS) | ||||||
|  |  | ||||||
| LDADD = \ | LDADD			= libupnp.la \ | ||||||
| 	libupnp.la \ |  | ||||||
| 			  $(top_builddir)/threadutil/libthreadutil.la \ | 			  $(top_builddir)/threadutil/libthreadutil.la \ | ||||||
| 			  $(top_builddir)/ixml/libixml.la | 			  $(top_builddir)/ixml/libixml.la | ||||||
|  |  | ||||||
|  |  | ||||||
| upnpincludedir          = $(includedir)/upnp | upnpincludedir          = $(includedir)/upnp | ||||||
| upnpinclude_HEADERS = \ | upnpinclude_HEADERS     = inc/upnp.h  | ||||||
| 	inc/upnp.h \ |  | ||||||
| 	inc/upnpdebug.h |  | ||||||
|  |  | ||||||
| nodist_upnpinclude_HEADERS = inc/upnpconfig.h  | nodist_upnpinclude_HEADERS = inc/upnpconfig.h  | ||||||
| if ENABLE_TOOLS | if ENABLE_TOOLS | ||||||
| upnpinclude_HEADERS	+= inc/upnptools.h  | upnpinclude_HEADERS	+= inc/upnptools.h  | ||||||
| endif | endif | ||||||
|  | if ENABLE_DEBUG | ||||||
|  | upnpinclude_HEADERS	+= inc/upnpdebug.h | ||||||
|  | endif | ||||||
|  |  | ||||||
| lib_LTLIBRARIES		= libupnp.la | lib_LTLIBRARIES		= libupnp.la | ||||||
|  |  | ||||||
| libupnp_la_CPPFLAGS	= $(AM_CPPFLAGS) -I$(srcdir)/src/inc  | libupnp_la_CPPFLAGS	= $(AM_CPPFLAGS) -I$(srcdir)/src/inc  | ||||||
|  | libupnp_la_LDFLAGS	= -version-info $(LT_VERSION_UPNP) \ | ||||||
| libupnp_la_LDFLAGS = \ |  | ||||||
| 	-version-info $(LT_VERSION_UPNP) \ |  | ||||||
| 			  -export-symbols-regex '^Upnp.*' \ | 			  -export-symbols-regex '^Upnp.*' \ | ||||||
| 			  $(top_builddir)/threadutil/libthreadutil.la \ | 			  $(top_builddir)/threadutil/libthreadutil.la \ | ||||||
| 			  $(top_builddir)/ixml/libixml.la | 			  $(top_builddir)/ixml/libixml.la | ||||||
|  |  | ||||||
| libupnp_la_SOURCES	= \ | libupnp_la_SOURCES	= \ | ||||||
| 			src/inc/config.h \ | 			src/inc/config.h \ | ||||||
| 	src/inc/client_table.h \ | 			src/inc/client_table.h src/inc/global.h \ | ||||||
| 	src/inc/gena.h \ | 			src/inc/md5.h src/inc/ssdplib.h \ | ||||||
| 	src/inc/gena_ctrlpt.h \ | 			src/inc/unixutil.h src/inc/urlconfig.h \ | ||||||
| 	src/inc/gena_device.h \ | 			src/inc/gmtdate.h src/inc/membuffer.h \ | ||||||
| 	src/inc/global.h \ | 			src/inc/server.h src/inc/statcodes.h \ | ||||||
| 	src/inc/gmtdate.h \ | 			src/inc/upnpapi.h src/inc/utilall.h \ | ||||||
| 	src/inc/http_client.h \ | 			src/inc/gena_ctrlpt.h src/inc/http_client.h \ | ||||||
| 	src/inc/httpparser.h \ | 			src/inc/miniserver.h src/inc/service_table.h \ | ||||||
| 	src/inc/httpreadwrite.h \ | 			src/inc/statuscodes.h src/inc/upnpclosesocket.h \ | ||||||
| 	src/inc/md5.h \ | 			src/inc/util.h src/inc/gena_device.h \ | ||||||
| 	src/inc/membuffer.h \ | 			src/inc/httpparser.h src/inc/netall.h \ | ||||||
| 	src/inc/miniserver.h \ | 			src/inc/soaplib.h src/inc/strintmap.h \ | ||||||
| 	src/inc/netall.h \ | 			src/inc/upnp_timeout.h src/inc/uuid.h \ | ||||||
| 	src/inc/parsetools.h \ | 			src/inc/gena.h src/inc/httpreadwrite.h \ | ||||||
| 	src/inc/server.h \ | 			src/inc/parsetools.h src/inc/sock.h \ | ||||||
| 	src/inc/service_table.h \ | 			src/inc/sysdep.h src/inc/uri.h \ | ||||||
| 	src/inc/soaplib.h \ |  | ||||||
| 	src/inc/sock.h \ |  | ||||||
| 	src/inc/statcodes.h \ |  | ||||||
| 	src/inc/statuscodes.h \ |  | ||||||
| 	src/inc/strintmap.h \ |  | ||||||
| 	src/inc/ssdplib.h \ |  | ||||||
| 	src/inc/sysdep.h \ |  | ||||||
| 	src/inc/unixutil.h \ |  | ||||||
| 	src/inc/upnpapi.h \ |  | ||||||
| 	src/inc/upnpclosesocket.h \ |  | ||||||
| 	src/inc/upnp_timeout.h \ |  | ||||||
| 	src/inc/uri.h \ |  | ||||||
| 	src/inc/urlconfig.h \ |  | ||||||
| 	src/inc/util.h \ |  | ||||||
| 	src/inc/utilall.h \ |  | ||||||
| 	src/inc/uuid.h \ |  | ||||||
| 			src/inc/webserver.h | 			src/inc/webserver.h | ||||||
|  |  | ||||||
| # ssdp | # ssdp | ||||||
| libupnp_la_SOURCES += \ | libupnp_la_SOURCES	+= src/ssdp/ssdp_device.c src/ssdp/ssdp_ctrlpt.c \ | ||||||
| 	src/ssdp/ssdp_device.c \ |  | ||||||
| 	src/ssdp/ssdp_ctrlpt.c \ |  | ||||||
| 			src/ssdp/ssdp_server.c | 			src/ssdp/ssdp_server.c | ||||||
|  |  | ||||||
| # soap | # soap | ||||||
| libupnp_la_SOURCES += \ | libupnp_la_SOURCES	+= src/soap/soap_device.c src/soap/soap_ctrlpt.c \ | ||||||
| 	src/soap/soap_device.c \ |  | ||||||
| 	src/soap/soap_ctrlpt.c \ |  | ||||||
| 			src/soap/soap_common.c | 			src/soap/soap_common.c | ||||||
|  |  | ||||||
| # genlib | # genlib | ||||||
| @@ -108,9 +84,7 @@ libupnp_la_SOURCES += \ | |||||||
| 			src/genlib/net/uri/uri.c | 			src/genlib/net/uri/uri.c | ||||||
|  |  | ||||||
| # gena | # gena | ||||||
| libupnp_la_SOURCES += \ | libupnp_la_SOURCES	+= src/gena/gena_device.c src/gena/gena_ctrlpt.c \ | ||||||
| 	src/gena/gena_device.c \ |  | ||||||
| 	src/gena/gena_ctrlpt.c \ |  | ||||||
| 			src/gena/gena_callback2.c | 			src/gena/gena_callback2.c | ||||||
|  |  | ||||||
| # api | # api | ||||||
| @@ -122,32 +96,68 @@ if ENABLE_DEBUG | |||||||
|     libupnp_la_SOURCES	+= src/api/upnpdebug.c  |     libupnp_la_SOURCES	+= src/api/upnpdebug.c  | ||||||
| endif | endif | ||||||
|  |  | ||||||
|  |  | ||||||
| # uuid | # uuid | ||||||
| libupnp_la_SOURCES += \ | libupnp_la_SOURCES	+= src/uuid/md5.c src/uuid/sysdep.c src/uuid/uuid.c | ||||||
| 	src/uuid/md5.c \ |  | ||||||
| 	src/uuid/sysdep.c \ |  | ||||||
| 	src/uuid/uuid.c |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # urlconfig | # urlconfig | ||||||
| libupnp_la_SOURCES	+= src/urlconfig/urlconfig.c | libupnp_la_SOURCES	+= src/urlconfig/urlconfig.c | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # samples | ||||||
|  | noinst_PROGRAMS		= | ||||||
|  | if ENABLE_SAMPLES | ||||||
|  | if ENABLE_CLIENT | ||||||
|  |     noinst_PROGRAMS	+= upnp_tv_ctrlpt | ||||||
|  |     upnp_tv_ctrlpt_CPPFLAGS = $(AM_CPPFLAGS) \ | ||||||
|  | 			-I$(srcdir)/sample/common/ \ | ||||||
|  | 			-I$(srcdir)/sample/tvctrlpt | ||||||
|  | endif | ||||||
|  | if ENABLE_DEVICE | ||||||
|  |     noinst_PROGRAMS	+= upnp_tv_device  | ||||||
|  |     upnp_tv_device_CPPFLAGS = $(AM_CPPFLAGS) \ | ||||||
|  | 			-I$(srcdir)/sample/common/ \ | ||||||
|  | 			-I$(srcdir)/sample/tvdevice | ||||||
|  | endif | ||||||
|  | endif | ||||||
|  | upnp_tv_device_SOURCES = \ | ||||||
|  | 			sample/common/sample_util.c \ | ||||||
|  | 			sample/common/sample_util.h \ | ||||||
|  | 			sample/tvdevice/upnp_tv_device.c \ | ||||||
|  | 			sample/tvdevice/upnp_tv_device.h \ | ||||||
|  | 			sample/tvdevice/linux/upnp_tv_device_main.c | ||||||
|  | upnp_tv_ctrlpt_SOURCES = \ | ||||||
|  | 			sample/common/sample_util.c \ | ||||||
|  | 			sample/common/sample_util.h \ | ||||||
|  | 			sample/tvctrlpt/upnp_tv_ctrlpt.c \ | ||||||
|  | 			sample/tvctrlpt/upnp_tv_ctrlpt.h \ | ||||||
|  | 			sample/tvctrlpt/linux/upnp_tv_ctrlpt_main.c | ||||||
|  |  | ||||||
|  | if WITH_DOCUMENTATION | ||||||
|  |     examplesdir 	= $(docdir)/examples | ||||||
|  |     examples_DATA 	= $(upnp_tv_ctrlpt_SOURCES) $(upnp_tv_device_SOURCES) | ||||||
|  | endif | ||||||
|  |  | ||||||
|  |  | ||||||
| # check / distcheck tests | # check / distcheck tests | ||||||
| check_PROGRAMS		= test_init | check_PROGRAMS		= test_init | ||||||
| TESTS			= test_init | TESTS			= test_init | ||||||
|  |  | ||||||
| test_init_SOURCES	= test/test_init.c | test_init_SOURCES	= test/test_init.c | ||||||
|  |  | ||||||
|  |  | ||||||
| EXTRA_DIST = \ | EXTRA_DIST 		= LICENSE \ | ||||||
| 	LICENSE \ | 			sample/tvdevice/web/tvcontrolSCPD.xml \ | ||||||
|  | 			sample/tvdevice/web/tvdevicedesc.xml \ | ||||||
|  | 			sample/tvdevice/web/tvdevicepres.html \ | ||||||
|  | 			sample/tvdevice/web/tvpictureSCPD.xml \ | ||||||
| 			src/inc/inet_pton.h \ | 			src/inc/inet_pton.h \ | ||||||
| 			src/inet_pton.c \ | 			src/inet_pton.c \ | ||||||
| 			src/win_dll.c | 			src/win_dll.c | ||||||
|  |  | ||||||
|  |  | ||||||
| CLEANFILES = \ |  | ||||||
| 	IUpnpErrFile.txt \ | CLEANFILES		= IUpnpErrFile.txt IUpnpInfoFile.txt | ||||||
| 	IUpnpInfoFile.txt |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										396
									
								
								upnp/inc/upnp.h
									
									
									
									
									
								
							
							
						
						
									
										396
									
								
								upnp/inc/upnp.h
									
									
									
									
									
								
							| @@ -1,41 +1,40 @@ | |||||||
| /******************************************************************************* | /////////////////////////////////////////////////////////////////////////// | ||||||
|  * | // | ||||||
|  * 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_H | #ifndef UPNP_H | ||||||
| #define UPNP_H | #define UPNP_H | ||||||
|  |  | ||||||
| /** @name The API */ | /** @name The API */ | ||||||
|  |  | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined MYLIB_LARGEFILE_SENSITIVE && _FILE_OFFSET_BITS+0 != 64 | #if defined MYLIB_LARGEFILE_SENSITIVE && _FILE_OFFSET_BITS+0 != 64 | ||||||
|   #if defined __GNUC__ |   #if defined __GNUC__ | ||||||
| @@ -45,20 +44,20 @@ | |||||||
|   #endif |   #endif | ||||||
| #endif  | #endif  | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <sys/param.h> | #ifdef __FreeBSD__ | ||||||
| #if (defined(BSD) && BSD >= 199306) |  | ||||||
| #include <time.h> | #include <time.h> | ||||||
| #endif | #endif | ||||||
| #include "ixml.h" | #include "ixml.h" | ||||||
| #include "upnpconfig.h" | #include "upnpconfig.h" | ||||||
|  | #if UPNP_HAVE_DEBUG | ||||||
|  | #	include "upnpdebug.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|  #ifndef UPNP_STATIC_LIB |  #ifndef UPNP_STATIC_LIB | ||||||
|   #ifdef LIBUPNP_EXPORTS |   #ifdef LIBUPNP_EXPORTS | ||||||
| 			/* set up declspec for dll export to make functions visible to library users */ |    // set up declspec for dll export to make functions visible to library users | ||||||
|    #define EXPORT_SPEC __declspec(dllexport) |    #define EXPORT_SPEC __declspec(dllexport) | ||||||
|   #else |   #else | ||||||
|    #define EXPORT_SPEC __declspec(dllimport) |    #define EXPORT_SPEC __declspec(dllimport) | ||||||
| @@ -66,36 +65,16 @@ | |||||||
|  #else |  #else | ||||||
|   #define EXPORT_SPEC |   #define EXPORT_SPEC | ||||||
|  #endif |  #endif | ||||||
| 	#ifdef UPNP_USE_MSVCPP |  #ifdef UPNP_USE_MSVCPP // define some things the M$ VC++ doesn't knows | ||||||
| 		/* define some things the M$ VC++ doesn't know */ |  | ||||||
| 		#define UPNP_INLINE |  | ||||||
|   typedef __int64 int64_t; |   typedef __int64 int64_t; | ||||||
| 		#define PRId64 "I64d" |  | ||||||
| 		#define PRIzu "lu" |  | ||||||
|  #endif |  #endif | ||||||
| 	#ifdef UPNP_USE_BCBPP |  #ifdef UPNP_USE_BCBPP // define some things Borland Builder doesn't knows | ||||||
| 		/* define some things Borland Builder doesn't know */ |  | ||||||
| 		#define UPNP_INLINE inline |  | ||||||
|   typedef __int64 int64_t; |   typedef __int64 int64_t; | ||||||
| #warning The Borland C compiler is probably broken on PRId64, please someone provide a proper fix here |  | ||||||
| 		#define PRId64 "I64d" |  | ||||||
| 		#define PRIzu "zu" |  | ||||||
|  #endif |  #endif | ||||||
| #else | #else | ||||||
|  #define EXPORT_SPEC |  #define EXPORT_SPEC | ||||||
| 	#define UPNP_INLINE inline |  | ||||||
| 	/* Invented this macro so that we can live a little longer with MSVC lack of C99. */ |  | ||||||
| 	#define PRIzu "zu" |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * Defining this macro here gives some interesting information about unused |  | ||||||
|  * functions in the code. Of course, this should never go uncommented on a |  | ||||||
|  * release. |  | ||||||
|  */ |  | ||||||
| /*#define inline*/ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  #define UpnpCloseSocket         close |  #define UpnpCloseSocket         close | ||||||
| #else | #else | ||||||
| @@ -108,7 +87,6 @@ | |||||||
|  #define SOCKET                  int |  #define SOCKET                  int | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  #include <netinet/in.h> |  #include <netinet/in.h> | ||||||
| #else | #else | ||||||
| @@ -116,10 +94,8 @@ | |||||||
|  #include <time.h> |  #include <time.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| #define NUM_HANDLE 200 | #define NUM_HANDLE 200 | ||||||
| #define LINE_SIZE  180 | #define LINE_SIZE  180 | ||||||
| #define NAME_SIZE  256 | #define NAME_SIZE  256 | ||||||
| @@ -128,6 +104,7 @@ | |||||||
| #define SERL_NUMR_SIZE  64 | #define SERL_NUMR_SIZE  64 | ||||||
| #define MODL_DESC_SIZE  64 | #define MODL_DESC_SIZE  64 | ||||||
| #define UPNP_INFINITE -1 | #define UPNP_INFINITE -1 | ||||||
|  |  | ||||||
| #define UPNP_USING_CHUNKED			-3 | #define UPNP_USING_CHUNKED			-3 | ||||||
| #define UPNP_UNTIL_CLOSE			-4 | #define UPNP_UNTIL_CLOSE			-4 | ||||||
|  |  | ||||||
| @@ -139,7 +116,7 @@ | |||||||
|  *  code means.  Refer to the documentation for each function for a  |  *  code means.  Refer to the documentation for each function for a  | ||||||
|  *  description of what an error code means in that context. |  *  description of what an error code means in that context. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** @name UPNP_E_SUCCESS [0] | /** @name UPNP_E_SUCCESS [0] | ||||||
|  *  {\tt UPNP_E_SUCCESS} signifies that the operation completed successfully. |  *  {\tt UPNP_E_SUCCESS} signifies that the operation completed successfully. | ||||||
| @@ -147,35 +124,35 @@ | |||||||
|  *  the operation was successfully transmitted on the network.  The result of  |  *  the operation was successfully transmitted on the network.  The result of  | ||||||
|  *  the entire operation comes as part of the callback for that operation. |  *  the entire operation comes as part of the callback for that operation. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_SUCCESS          0 | #define UPNP_E_SUCCESS          0 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_INVALID_HANDLE [-100] | /** @name UPNP_E_INVALID_HANDLE [-100] | ||||||
|  *  {\tt UPNP_E_INVALID_HANDLE} signifies that the handle passed to a  |  *  {\tt UPNP_E_INVALID_HANDLE} signifies that the handle passed to a  | ||||||
|  *  function is not a recognized as a valid handle. |  *  function is not a recognized as a valid handle. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INVALID_HANDLE   -100 | #define UPNP_E_INVALID_HANDLE   -100 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_INVALID_PARAM [-101] | /** @name UPNP_E_INVALID_PARAM [-101] | ||||||
|  *  {\tt UPNP_E_INVALID_PARAM} signifies that one or more of the parameters  |  *  {\tt UPNP_E_INVALID_PARAM} signifies that one or more of the parameters  | ||||||
|  *  passed to the function is not valid.  Refer to the documentation for each  |  *  passed to the function is not valid.  Refer to the documentation for each  | ||||||
|  *  function for more information on the valid ranges of the parameters. |  *  function for more information on the valid ranges of the parameters. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INVALID_PARAM    -101 | #define UPNP_E_INVALID_PARAM    -101 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_OUTOF_HANDLE [-102] | /** @name UPNP_E_OUTOF_HANDLE [-102] | ||||||
|  *  {\tt UPNP_E_OUTOF_HANDLE} signifies that the SDK does not have any |  *  {\tt UPNP_E_OUTOF_HANDLE} signifies that the SDK does not have any | ||||||
|  *  more space for additional handles.  The SDK allocates space for only  |  *  more space for additional handles.  The SDK allocates space for only  | ||||||
|  *  a few handles in order to conserve memory. |  *  a few handles in order to conserve memory. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_OUTOF_HANDLE     -102 | #define UPNP_E_OUTOF_HANDLE     -102 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #define UPNP_E_OUTOF_CONTEXT    -103 | #define UPNP_E_OUTOF_CONTEXT    -103 | ||||||
|  |  | ||||||
| @@ -184,9 +161,9 @@ | |||||||
|  *  currently available to complete the operation.  Most operations require  |  *  currently available to complete the operation.  Most operations require  | ||||||
|  *  some free memory in order to complete their work. |  *  some free memory in order to complete their work. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_OUTOF_MEMORY     -104 | #define UPNP_E_OUTOF_MEMORY     -104 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_INIT [-105] | /** @name UPNP_E_INIT [-105] | ||||||
|  *  {\tt UPNP_E_INIT} signifies that the SDK has already been  |  *  {\tt UPNP_E_INIT} signifies that the SDK has already been  | ||||||
| @@ -194,9 +171,9 @@ | |||||||
|  *  Any additional initialization attempts simply return this error with |  *  Any additional initialization attempts simply return this error with | ||||||
|  *  no other ill effects. |  *  no other ill effects. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INIT             -105 | #define UPNP_E_INIT             -105 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #define UPNP_E_BUFFER_TOO_SMALL -106 | #define UPNP_E_BUFFER_TOO_SMALL -106 | ||||||
|  |  | ||||||
| @@ -205,9 +182,9 @@ | |||||||
|  *  to {\bf UpnpRegisterRootDevice} or {\bf UpnpRegisterRootDevice2} is an  |  *  to {\bf UpnpRegisterRootDevice} or {\bf UpnpRegisterRootDevice2} is an  | ||||||
|  *  invalid description document.   |  *  invalid description document.   | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INVALID_DESC     -107 | #define UPNP_E_INVALID_DESC     -107 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_INVALID_URL [-108] | /** @name UPNP_E_INVALID_URL [-108] | ||||||
|  *  {\tt UPNP_E_INVALID_URL} signifies that a URL passed into the function |  *  {\tt UPNP_E_INVALID_URL} signifies that a URL passed into the function | ||||||
| @@ -215,9 +192,9 @@ | |||||||
|  *  URL itself might be malformed (e.g. have invalid characters in it) or |  *  URL itself might be malformed (e.g. have invalid characters in it) or | ||||||
|  *  the host might be unreachable. |  *  the host might be unreachable. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INVALID_URL      -108 | #define UPNP_E_INVALID_URL      -108 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #define UPNP_E_INVALID_SID      -109 | #define UPNP_E_INVALID_SID      -109 | ||||||
| #define UPNP_E_INVALID_DEVICE   -110 | #define UPNP_E_INVALID_DEVICE   -110 | ||||||
| @@ -228,18 +205,18 @@ | |||||||
|  *  {\bf UpnpAcceptSubscriptionExt} to signify that the device ID/service |  *  {\bf UpnpAcceptSubscriptionExt} to signify that the device ID/service | ||||||
|  *  ID pair does not refer to a valid service. |  *  ID pair does not refer to a valid service. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INVALID_SERVICE  -111 | #define UPNP_E_INVALID_SERVICE  -111 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_BAD_RESPONSE [-113] | /** @name UPNP_E_BAD_RESPONSE [-113] | ||||||
|  *  {\tt UPNP_E_BAD_RESPONSE} signifies that the response received from the  |  *  {\tt UPNP_E_BAD_RESPONSE} signifies that the response received from the  | ||||||
|  *  remote side of a connection is not correct for the protocol.  This applies |  *  remote side of a connection is not correct for the protocol.  This applies | ||||||
|  *  to the GENA, SOAP, and HTTP protocols. |  *  to the GENA, SOAP, and HTTP protocols. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_BAD_RESPONSE     -113 | #define UPNP_E_BAD_RESPONSE     -113 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #define UPNP_E_BAD_REQUEST      -114 | #define UPNP_E_BAD_REQUEST      -114 | ||||||
|  |  | ||||||
| @@ -248,26 +225,26 @@ | |||||||
|  *  invalid.  This can be because the DOM document passed to the function was |  *  invalid.  This can be because the DOM document passed to the function was | ||||||
|  *  malformed or the action message is not correct for the given action. |  *  malformed or the action message is not correct for the given action. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INVALID_ACTION   -115 | #define UPNP_E_INVALID_ACTION   -115 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_FINISH [-116] | /** @name UPNP_E_FINISH [-116] | ||||||
|  *  {\tt UPNP_E_FINISH} signifies that {\bf UpnpInit} has not been called, or |  *  {\tt UPNP_E_FINISH} signifies that {\bf UpnpInit} has not been called, or | ||||||
|  *  that {\bf UpnpFinish} has already been called.  None of the API functions  |  *  that {\bf UpnpFinish} has already been called.  None of the API functions  | ||||||
|  *  operate until {\bf UpnpInit} successfully completes. |  *  operate until {\bf UpnpInit} successfully completes. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_FINISH           -116 | #define UPNP_E_FINISH           -116 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_INIT_FAILED [-117] | /** @name UPNP_E_INIT_FAILED [-117] | ||||||
|  *  {\tt UPNP_E_INIT_FAILED} signifies that {\bf UpnpInit} cannot complete.   |  *  {\tt UPNP_E_INIT_FAILED} signifies that {\bf UpnpInit} cannot complete.   | ||||||
|  *  The typical reason is failure to allocate sufficient resources. |  *  The typical reason is failure to allocate sufficient resources. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INIT_FAILED      -117 | #define UPNP_E_INIT_FAILED      -117 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_URL_TOO_BIG [-118] | /** @name UPNP_E_URL_TOO_BIG [-118] | ||||||
|  *  {\tt UPNP_E_URL_TOO_BIG} signifies that the URL passed into a function  |  *  {\tt UPNP_E_URL_TOO_BIG} signifies that the URL passed into a function  | ||||||
| @@ -283,18 +260,18 @@ | |||||||
|  *  message (e.g. {\bf UpnpSubscribe}), GENA event notifications (e.g. {\bf |  *  message (e.g. {\bf UpnpSubscribe}), GENA event notifications (e.g. {\bf | ||||||
|  *  UpnpNotify}), and HTTP transfers (e.g. {\bf UpnpDownloadXmlDoc}). |  *  UpnpNotify}), and HTTP transfers (e.g. {\bf UpnpDownloadXmlDoc}). | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_BAD_HTTPMSG      -119 | #define UPNP_E_BAD_HTTPMSG      -119 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_ALREADY_REGISTERED [-120] | /** @name UPNP_E_ALREADY_REGISTERED [-120] | ||||||
|  *  {\tt UPNP_E_ALREADY_REGISTERED} signifies that a client or a device is |  *  {\tt UPNP_E_ALREADY_REGISTERED} signifies that a client or a device is | ||||||
|  *  already registered.  The SDK currently has a limit of one registered  |  *  already registered.  The SDK currently has a limit of one registered  | ||||||
|  *  client and one registered device per process. |  *  client and one registered device per process. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_ALREADY_REGISTERED -120 | #define UPNP_E_ALREADY_REGISTERED -120 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_NETWORK_ERROR [-200] | /** @name UPNP_E_NETWORK_ERROR [-200] | ||||||
|  *  {\tt UPNP_E_NETWORK_ERROR} signifies that a network error occurred.  It  |  *  {\tt UPNP_E_NETWORK_ERROR} signifies that a network error occurred.  It  | ||||||
| @@ -303,9 +280,9 @@ | |||||||
|  *  failed to read the local IP address or had problems configuring one of |  *  failed to read the local IP address or had problems configuring one of | ||||||
|  *  the sockets. |  *  the sockets. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_NETWORK_ERROR    -200 | #define UPNP_E_NETWORK_ERROR    -200 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_SOCKET_WRITE [-201] | /** @name UPNP_E_SOCKET_WRITE [-201] | ||||||
|  *  {\tt UPNP_E_SOCKET_WRITE} signifies an error writing to a socket.  This |  *  {\tt UPNP_E_SOCKET_WRITE} signifies an error writing to a socket.  This | ||||||
| @@ -314,9 +291,9 @@ | |||||||
|  *  control (e.g. {\bf UpnpSendAction}), eventing (e.g. {\bf UpnpNotify}),  |  *  control (e.g. {\bf UpnpSendAction}), eventing (e.g. {\bf UpnpNotify}),  | ||||||
|  *  and HTTP functions (e.g. {\bf UpnpDownloadXmlDoc}). |  *  and HTTP functions (e.g. {\bf UpnpDownloadXmlDoc}). | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_SOCKET_WRITE     -201 | #define UPNP_E_SOCKET_WRITE     -201 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_SOCKET_READ [-202] | /** @name UPNP_E_SOCKET_READ [-202] | ||||||
|  *  {\tt UPNP_E_SOCKET_READ} signifies an error reading from a socket.  This |  *  {\tt UPNP_E_SOCKET_READ} signifies an error reading from a socket.  This | ||||||
| @@ -325,9 +302,9 @@ | |||||||
|  *  control (e.g. {\bf UpnpSendAction}), eventing (e.g. {\bf UpnpNotify}),  |  *  control (e.g. {\bf UpnpSendAction}), eventing (e.g. {\bf UpnpNotify}),  | ||||||
|  *  and HTTP functions (e.g. {\bf UpnpDownloadXmlDoc}). |  *  and HTTP functions (e.g. {\bf UpnpDownloadXmlDoc}). | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_SOCKET_READ      -202 | #define UPNP_E_SOCKET_READ      -202 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_SOCKET_BIND [-203] | /** @name UPNP_E_SOCKET_BIND [-203] | ||||||
|  *  {\tt UPNP_E_SOCKET_BIND} signifies that the SDK had a problem binding |  *  {\tt UPNP_E_SOCKET_BIND} signifies that the SDK had a problem binding | ||||||
| @@ -337,9 +314,9 @@ | |||||||
|  *  (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.  |  *  (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.  | ||||||
|  *  {\bf UpnpDownloadXmlDoc}). |  *  {\bf UpnpDownloadXmlDoc}). | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_SOCKET_BIND      -203 | #define UPNP_E_SOCKET_BIND      -203 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_SOCKET_CONNECT [-204] | /** @name UPNP_E_SOCKET_CONNECT [-204] | ||||||
|  *  {\tt UPNP_E_SOCKET_CONNECT} signifies that the SDK had a problem |  *  {\tt UPNP_E_SOCKET_CONNECT} signifies that the SDK had a problem | ||||||
| @@ -349,9 +326,9 @@ | |||||||
|  *  (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.  |  *  (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.  | ||||||
|  *  {\bf UpnpDownloadXmlDoc}). |  *  {\bf UpnpDownloadXmlDoc}). | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_SOCKET_CONNECT   -204 | #define UPNP_E_SOCKET_CONNECT   -204 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_OUTOF_SOCKET [-205] | /** @name UPNP_E_OUTOF_SOCKET [-205] | ||||||
|  *  {\tt UPNP_E_OUTOF_SOCKET} signifies that the SDK cannot create any |  *  {\tt UPNP_E_OUTOF_SOCKET} signifies that the SDK cannot create any | ||||||
| @@ -361,36 +338,36 @@ | |||||||
|  *  (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.  |  *  (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.  | ||||||
|  *  {\bf UpnpDownloadXmlDoc}). |  *  {\bf UpnpDownloadXmlDoc}). | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_OUTOF_SOCKET     -205 | #define UPNP_E_OUTOF_SOCKET     -205 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_LISTEN [-206] | /** @name UPNP_E_LISTEN [-206] | ||||||
|  *  {\tt UPNP_E_LISTEN} signifies that the SDK had a problem setting the |  *  {\tt UPNP_E_LISTEN} signifies that the SDK had a problem setting the | ||||||
|  *  socket to listen for incoming connections.  This error only happens during |  *  socket to listen for incoming connections.  This error only happens during | ||||||
|  *  initialization (i.e. {\bf UpnpInit}). |  *  initialization (i.e. {\bf UpnpInit}). | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_LISTEN           -206 | #define UPNP_E_LISTEN           -206 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_TIMEDOUT [-207] | /** @name UPNP_E_TIMEDOUT [-207] | ||||||
|  *  {\tt UPNP_E_TIMEDOUT} signifies that too much time elapsed before the |  *  {\tt UPNP_E_TIMEDOUT} signifies that too much time elapsed before the | ||||||
|  *  required number of bytes were sent or received over a socket.  This error |  *  required number of bytes were sent or received over a socket.  This error | ||||||
|  *  can be returned by any function that performs network operations. |  *  can be returned by any function that performs network operations. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_TIMEDOUT         -207 | #define UPNP_E_TIMEDOUT         -207 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_SOCKET_ERROR [-208] | /** @name UPNP_E_SOCKET_ERROR [-208] | ||||||
|  *  {\tt UPNP_E_SOCKET_ERROR} is the generic socket error code for |  *  {\tt UPNP_E_SOCKET_ERROR} is the generic socket error code for | ||||||
|  *  conditions not covered by other error codes.  This error can be returned |  *  conditions not covered by other error codes.  This error can be returned | ||||||
|  *  by any function that performs network operations. |  *  by any function that performs network operations. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_SOCKET_ERROR	    -208 | #define UPNP_E_SOCKET_ERROR	    -208 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #define UPNP_E_FILE_WRITE_ERROR -209 | #define UPNP_E_FILE_WRITE_ERROR -209 | ||||||
|  |  | ||||||
| @@ -399,9 +376,9 @@ | |||||||
|  *  error can be returned by any function that allows for external |  *  error can be returned by any function that allows for external | ||||||
|  *  cancelation. |  *  cancelation. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_CANCELED         -210 | #define UPNP_E_CANCELED         -210 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #define UPNP_E_EVENT_PROTOCOL         -300 | #define UPNP_E_EVENT_PROTOCOL         -300 | ||||||
|  |  | ||||||
| @@ -409,58 +386,58 @@ | |||||||
|  *  {\tt UPNP_E_SUBSCRIBE_UNACCEPTED} signifies that a subscription |  *  {\tt UPNP_E_SUBSCRIBE_UNACCEPTED} signifies that a subscription | ||||||
|  *  request was rejected from the remote side.   |  *  request was rejected from the remote side.   | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_SUBSCRIBE_UNACCEPTED   -301 | #define UPNP_E_SUBSCRIBE_UNACCEPTED   -301 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302] | /** @name UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302] | ||||||
|  *  {\tt UPNP_E_UNSUBSCRIBE_UNACCEPTED} signifies that an unsubscribe |  *  {\tt UPNP_E_UNSUBSCRIBE_UNACCEPTED} signifies that an unsubscribe | ||||||
|  *  request was rejected from the remote side. |  *  request was rejected from the remote side. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_UNSUBSCRIBE_UNACCEPTED -302 | #define UPNP_E_UNSUBSCRIBE_UNACCEPTED -302 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_NOTIFY_UNACCEPTED [-303] | /** @name UPNP_E_NOTIFY_UNACCEPTED [-303] | ||||||
|  *  {\tt UPNP_E_NOTIFY_UNACCEPTED} signifies that the remote host did not |  *  {\tt UPNP_E_NOTIFY_UNACCEPTED} signifies that the remote host did not | ||||||
|  *  accept the notify sent from the local device. |  *  accept the notify sent from the local device. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_NOTIFY_UNACCEPTED      -303 | #define UPNP_E_NOTIFY_UNACCEPTED      -303 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_INVALID_ARGUMENT [-501] | /** @name UPNP_E_INVALID_ARGUMENT [-501] | ||||||
|  *  {\tt UPNP_E_INVALID_ARGUMENT} signifies that one or more of the parameters |  *  {\tt UPNP_E_INVALID_ARGUMENT} signifies that one or more of the parameters | ||||||
|  *  passed to a function is invalid.  Refer to the individual function |  *  passed to a function is invalid.  Refer to the individual function | ||||||
|  *  descriptions for the acceptable ranges for parameters. |  *  descriptions for the acceptable ranges for parameters. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INVALID_ARGUMENT       -501 | #define UPNP_E_INVALID_ARGUMENT       -501 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_FILE_NOT_FOUND [-502] | /** @name UPNP_E_FILE_NOT_FOUND [-502] | ||||||
|  *  {\tt UPNP_E_FILE_NOT_FOUND} signifies that the filename passed |  *  {\tt UPNP_E_FILE_NOT_FOUND} signifies that the filename passed | ||||||
|  *  to one of the device registration functions was not found or was not |  *  to one of the device registration functions was not found or was not | ||||||
|  *  accessible. |  *  accessible. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_FILE_NOT_FOUND         -502 | #define UPNP_E_FILE_NOT_FOUND         -502 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_FILE_READ_ERROR [-503] | /** @name UPNP_E_FILE_READ_ERROR [-503] | ||||||
|  *  {\tt UPNP_E_FILE_READ_ERROR} signifies an error when reading a file. |  *  {\tt UPNP_E_FILE_READ_ERROR} signifies an error when reading a file. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_FILE_READ_ERROR        -503 | #define UPNP_E_FILE_READ_ERROR        -503 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_EXT_NOT_XML [-504] | /** @name UPNP_E_EXT_NOT_XML [-504] | ||||||
|  *  {\tt UPNP_E_EXT_NOT_XML} signifies that the file name of the description |  *  {\tt UPNP_E_EXT_NOT_XML} signifies that the file name of the description | ||||||
|  *  document passed to {\bf UpnpRegisterRootDevice2} does not end in ".xml". |  *  document passed to {\bf UpnpRegisterRootDevice2} does not end in ".xml". | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_EXT_NOT_XML            -504 | #define UPNP_E_EXT_NOT_XML            -504 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #define UPNP_E_NO_WEB_SERVER          -505 | #define UPNP_E_NO_WEB_SERVER          -505 | ||||||
| #define UPNP_E_OUTOF_BOUNDS	      -506 | #define UPNP_E_OUTOF_BOUNDS	      -506 | ||||||
| @@ -469,26 +446,26 @@ | |||||||
|  *  {\tt UPNP_E_NOT_FOUND} signifies that the response to a SOAP request |  *  {\tt UPNP_E_NOT_FOUND} signifies that the response to a SOAP request | ||||||
|  *  did not contain the required XML constructs.   |  *  did not contain the required XML constructs.   | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_NOT_FOUND	      -507 | #define UPNP_E_NOT_FOUND	      -507 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /** @name UPNP_E_INTERNAL_ERROR [-911] | /** @name UPNP_E_INTERNAL_ERROR [-911] | ||||||
|  *  {\tt UPNP_E_INTERNAL_ERROR} is the generic error code for internal |  *  {\tt UPNP_E_INTERNAL_ERROR} is the generic error code for internal | ||||||
|  *  conditions not covered by other error codes. |  *  conditions not covered by other error codes. | ||||||
|  */ |  */ | ||||||
| /*! @{ */ | //@{ | ||||||
| #define UPNP_E_INTERNAL_ERROR         -911 | #define UPNP_E_INTERNAL_ERROR         -911 | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| /* SOAP-related error codes */ | // SOAP-related error codes | ||||||
| #define UPNP_SOAP_E_INVALID_ACTION    401 | #define UPNP_SOAP_E_INVALID_ACTION    401 | ||||||
| #define UPNP_SOAP_E_INVALID_ARGS      402 | #define UPNP_SOAP_E_INVALID_ARGS      402 | ||||||
| #define UPNP_SOAP_E_OUT_OF_SYNC       403 | #define UPNP_SOAP_E_OUT_OF_SYNC       403 | ||||||
| #define UPNP_SOAP_E_INVALID_VAR       404 | #define UPNP_SOAP_E_INVALID_VAR       404 | ||||||
| #define UPNP_SOAP_E_ACTION_FAILED     501 | #define UPNP_SOAP_E_ACTION_FAILED     501 | ||||||
|  |  | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
| #ifndef OUT | #ifndef OUT | ||||||
| #define OUT | #define OUT | ||||||
| @@ -502,12 +479,10 @@ | |||||||
| #define INOUT | #define INOUT | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include "upnpdebug.h" |  | ||||||
|  |  | ||||||
| enum UpnpOpenFileMode{UPNP_READ, UPNP_WRITE}; | enum UpnpOpenFileMode{UPNP_READ, UPNP_WRITE}; | ||||||
|  |  | ||||||
| /*! @name Constants, Structures, and Types */ | /// @name Constants, Structures, and Types | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** Returned when a control point application registers with {\bf | /** Returned when a control point application registers with {\bf | ||||||
|  *  UpnpRegisterClient}.  Client handles can only be used with  |  *  UpnpRegisterClient}.  Client handles can only be used with  | ||||||
| @@ -530,9 +505,9 @@ typedef int  UpnpDevice_Handle; | |||||||
|  |  | ||||||
| enum Upnp_EventType_e { | enum Upnp_EventType_e { | ||||||
|  |  | ||||||
|   /* |   // | ||||||
|    * Control callbacks |   // Control callbacks | ||||||
|    */ |   // | ||||||
|  |  | ||||||
|   /** Received by a device when a control point issues a control |   /** Received by a device when a control point issues a control | ||||||
|    *  request.  The {\bf Event} parameter contains a pointer to a {\bf |    *  request.  The {\bf Event} parameter contains a pointer to a {\bf | ||||||
| @@ -560,9 +535,9 @@ enum Upnp_EventType_e { | |||||||
|  |  | ||||||
|   UPNP_CONTROL_GET_VAR_COMPLETE, |   UPNP_CONTROL_GET_VAR_COMPLETE, | ||||||
|  |  | ||||||
|   /* |   // | ||||||
|    * Discovery callbacks |   // Discovery callbacks | ||||||
|    */ |   // | ||||||
|  |  | ||||||
|   /** Received by a control point when a new device or service is available.   |   /** Received by a control point when a new device or service is available.   | ||||||
|    *  The {\bf Event} parameter contains a pointer to a {\bf |    *  The {\bf Event} parameter contains a pointer to a {\bf | ||||||
| @@ -591,9 +566,9 @@ enum Upnp_EventType_e { | |||||||
|  |  | ||||||
|   UPNP_DISCOVERY_SEARCH_TIMEOUT, |   UPNP_DISCOVERY_SEARCH_TIMEOUT, | ||||||
|  |  | ||||||
|   /* |   // | ||||||
|    * Eventing callbacks |   // Eventing callbacks | ||||||
|    */ |   // | ||||||
|  |  | ||||||
|   /** Received by a device when a subscription arrives. |   /** Received by a device when a subscription arrives. | ||||||
|    *  The {\bf Event} parameter contains a pointer to a {\bf |    *  The {\bf Event} parameter contains a pointer to a {\bf | ||||||
| @@ -824,15 +799,18 @@ struct Upnp_Event | |||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | // | ||||||
|  * This typedef is required by Doc++ to parse the last entry of the  | // This typedef is required by Doc++ to parse the last entry of the  | ||||||
|  * Upnp_Discovery structure correctly. | // Upnp_Discovery structure correctly. | ||||||
|  */ | // | ||||||
|  |  | ||||||
|  | typedef struct sockaddr_in SOCKADDRIN; | ||||||
|  |  | ||||||
| /** Returned in a {\bf UPNP_DISCOVERY_RESULT} callback. */ | /** Returned in a {\bf UPNP_DISCOVERY_RESULT} callback. */ | ||||||
|  |  | ||||||
| struct Upnp_Discovery | struct Upnp_Discovery | ||||||
| { | { | ||||||
|  |  | ||||||
|   /** The result code of the {\bf UpnpSearchAsync} call. */ |   /** The result code of the {\bf UpnpSearchAsync} call. */ | ||||||
|   int  ErrCode;                   |   int  ErrCode;                   | ||||||
| 				      | 				      | ||||||
| @@ -864,7 +842,8 @@ struct Upnp_Discovery | |||||||
|   char Ext[LINE_SIZE];            |   char Ext[LINE_SIZE];            | ||||||
| 				      | 				      | ||||||
|   /** The host address of the device responding to the search. */ |   /** The host address of the device responding to the search. */ | ||||||
| 	struct sockaddr_in DestAddr;  |   SOCKADDRIN * DestAddr;  | ||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf | /** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf | ||||||
| @@ -1068,14 +1047,14 @@ typedef int  (*Upnp_FunPtr) ( | |||||||
|     IN void *Cookie |     IN void *Cookie | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| /*! @} */ /* Constants, Structures, and Types */ | //@} // Constants, Structures, and Types | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif /* __cplusplus */ | #endif // __cplusplus | ||||||
|  |  | ||||||
| /*! @name Initialization and Registration */ | ///@name Initialization and Registration | ||||||
| /*! @{ */ | //@{ | ||||||
| /** Initializes the Linux SDK for UPnP Devices. This function must be called | /** Initializes the Linux SDK for UPnP Devices. This function must be called | ||||||
|  *  before any other API function can be called.  It should be called |  *  before any other API function can be called.  It should be called | ||||||
|  *  only once.  Subsequent calls to this API return a {\tt UPNP_E_INIT} |  *  only once.  Subsequent calls to this API return a {\tt UPNP_E_INIT} | ||||||
| @@ -1386,18 +1365,18 @@ EXPORT_SPEC int UpnpSetMaxContentLength( | |||||||
| 			           for incoming SOAP actions, in bytes. */ | 			           for incoming SOAP actions, in bytes. */ | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| /*! @} */ /* Initialization and Registration */ | //@} // Initialization and Registration | ||||||
|  |  | ||||||
| /****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  *                        D I S C O V E R Y                                   * | //                        D I S C O V E R Y                           // | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ******************************************************************************/ | //////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| /*! @name Discovery */ | ///@name Discovery | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** {\bf UpnpSearchAsync} searches for devices matching the given | /** {\bf UpnpSearchAsync} searches for devices matching the given | ||||||
|  *  search target.  The function returns immediately and the SDK  |  *  search target.  The function returns immediately and the SDK  | ||||||
| @@ -1456,18 +1435,18 @@ EXPORT_SPEC int UpnpSendAdvertisement( | |||||||
|                                   the announcements. */ |                                   the announcements. */ | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| /*! @} */ /* Discovery */ | //@} // Discovery | ||||||
|  |  | ||||||
| /****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  *                            C O N T R O L                                   * | //                            C O N T R O L                           // | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ******************************************************************************/ | //////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| /*! @name Control */ | ///@name Control | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** {\bf UpnpGetServiceVarStatus} queries the state of a state  | /** {\bf UpnpGetServiceVarStatus} queries the state of a state  | ||||||
|  *  variable of a service on another device.  This is a synchronous call. |  *  variable of a service on another device.  This is a synchronous call. | ||||||
| @@ -1690,18 +1669,18 @@ EXPORT_SPEC int UpnpSendActionExAsync( | |||||||
|                                     passed to the callback when invoked. */ |                                     passed to the callback when invoked. */ | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| /*! @} */ /* Control */ | //@} // Control | ||||||
|  |  | ||||||
| /****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  *                        E V E N T I N G                                     * | //                        E V E N T I N G                             // | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ******************************************************************************/ | //////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| /*! @name Eventing */ | ///@name Eventing | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** {\bf UpnpAcceptSubscription} accepts a subscription request and sends | /** {\bf UpnpAcceptSubscription} accepts a subscription request and sends | ||||||
|  *  out the current state of the eventable variables for a service.   |  *  out the current state of the eventable variables for a service.   | ||||||
| @@ -2204,19 +2183,19 @@ EXPORT_SPEC int UpnpUnSubscribeAsync( | |||||||
|                                   callback function when invoked. */ |                                   callback function when invoked. */ | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| /*! @} */ /* Eventing */ | //@} // Eventing | ||||||
|  |  | ||||||
|  |  | ||||||
| /****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  *                        C L I E N T - A P I                                 * | //                        C L I E N T - A P I                         // | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ******************************************************************************/ | //////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| /*! @name Control Point HTTP API */ | ///@name Control Point HTTP API | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** {\bf UpnpDownloadUrlItem} downloads a file specified in a URL. | /** {\bf UpnpDownloadUrlItem} downloads a file specified in a URL. | ||||||
|  *  The SDK allocates the memory for {\bf outBuf} and the  |  *  The SDK allocates the memory for {\bf outBuf} and the  | ||||||
| @@ -2609,18 +2588,18 @@ EXPORT_SPEC int UpnpDownloadXmlDoc( | |||||||
| 				     XML document. */ | 				     XML document. */ | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| /*! @} */ /* Control Point HTTP API */ | //@} // Control Point HTTP API | ||||||
|  |  | ||||||
| /****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  *                    W E B  S E R V E R  A P I                               * | //                    W E B  S E R V E R  A P I                       // | ||||||
|  *                                                                            * | //                                                                    // | ||||||
|  ****************************************************************************** | //////////////////////////////////////////////////////////////////////// | ||||||
|  ******************************************************************************/ | //////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| /*! @name Web Server API */ | ///@name Web Server API | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** {\bf UpnpSetWebServerRootDir} sets the document root directory for | /** {\bf UpnpSetWebServerRootDir} sets the document root directory for | ||||||
|  *  the internal web server. This directory is considered the |  *  the internal web server. This directory is considered the | ||||||
| @@ -2736,13 +2715,12 @@ EXPORT_SPEC void UpnpFree( | |||||||
|     IN void *item /* The item to free. */ |     IN void *item /* The item to free. */ | ||||||
|     ); |     ); | ||||||
|  |  | ||||||
| /*! @} */ /* Web Server API */ | //@} // Web Server API | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif /* __cplusplus */ | #endif // __cplusplus | ||||||
|  |  | ||||||
| /*! @} */ /* The API */ | //@} The API | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,34 +1,34 @@ | |||||||
| /* -*- C -*- */ | // -*- C -*- | ||||||
| /******************************************************************************* | /////////////////////////////////////////////////////////////////////////// | ||||||
|  * | // | ||||||
|  * Copyright (c) 2006 R<>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  | ||||||
| @@ -91,5 +91,6 @@ | |||||||
| #undef UPNP_HAVE_TOOLS | #undef UPNP_HAVE_TOOLS | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* UPNP_CONFIG_H */ | #endif // UPNP_CONFIG_H | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,41 +1,43 @@ | |||||||
| /******************************************************************************* | /////////////////////////////////////////////////////////////////////////// | ||||||
|  * | // | ||||||
|  * Copyright (c) 2000-2003 Intel Corporation  | // Copyright (c) 2000-2003 Intel Corporation  | ||||||
|  * Copyright (c) 2006 R<>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_DEBUG_H | #ifndef UPNP_DEBUG_H | ||||||
| #define UPNP_DEBUG_H  | #define UPNP_DEBUG_H  | ||||||
|  |  | ||||||
| #include "upnp.h" |  | ||||||
| #include "upnpconfig.h" | #include "upnpconfig.h" | ||||||
|  |  | ||||||
|  | // Function declarations only if debug compiled into the library | ||||||
|  | #if UPNP_HAVE_DEBUG | ||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| @@ -47,7 +49,7 @@ extern "C" { | |||||||
|           The UPnP SDK contains other features to aid in debugging. |           The UPnP SDK contains other features to aid in debugging. | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| /*! @{ */ | //@{ | ||||||
|  |  | ||||||
| /** @name Upnp_LogLevel | /** @name Upnp_LogLevel | ||||||
|  *  The user has the option to select 4 different types of debugging levels, |  *  The user has the option to select 4 different types of debugging levels, | ||||||
| @@ -68,25 +70,18 @@ extern "C" { | |||||||
|  *  \end{itemize} |  *  \end{itemize} | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| typedef enum Upnp_Module { | typedef enum Upnp_Module {SSDP,SOAP,GENA,TPOOL,MSERV,DOM,API, HTTP} Dbg_Module; | ||||||
| 	SSDP, | //@{ | ||||||
| 	SOAP, |  | ||||||
| 	GENA, |  | ||||||
| 	TPOOL, |  | ||||||
| 	MSERV, |  | ||||||
| 	DOM, |  | ||||||
| 	API, |  | ||||||
| 	HTTP |  | ||||||
| } Dbg_Module; |  | ||||||
|  |  | ||||||
| /*! @{ */ |  | ||||||
| typedef enum Upnp_LogLevel_e { | typedef enum Upnp_LogLevel_e { | ||||||
| 	UPNP_CRITICAL, | 	UPNP_CRITICAL, | ||||||
| 	UPNP_PACKET, | 	UPNP_PACKET, | ||||||
| 	UPNP_INFO, | 	UPNP_INFO, | ||||||
| 	UPNP_ALL | 	UPNP_ALL | ||||||
| } Upnp_LogLevel; | } Upnp_LogLevel; | ||||||
| /*! @} */ | //@} | ||||||
|  |  | ||||||
|  | // for backward compatibility | ||||||
|  | #define Dbg_Level	Upnp_LogLevel | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -103,32 +98,26 @@ typedef enum Upnp_LogLevel_e { | |||||||
|  *									 |  *									 | ||||||
|  * Description:								 |  * Description:								 | ||||||
|  *	This functions initializes the log files |  *	This functions initializes the log files | ||||||
|  * |  | ||||||
|  * Returns: int |  * Returns: int | ||||||
|  *	-1 : If fails |  *	-1 : If fails | ||||||
|  *	UPNP_E_SUCCESS : if success |  *	UPNP_E_SUCCESS : if success | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG |  | ||||||
| int UpnpInitLog(); | int UpnpInitLog(); | ||||||
| #else |  | ||||||
| static UPNP_INLINE int UpnpInitLog() { return UPNP_E_SUCCESS; } | // for backward compatibility | ||||||
| #endif | #define InitLog		UpnpInitLog | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|  * Function : UpnpSetLogLevel |  * Function : UpnpSetLogLevel | ||||||
|  *				 |  *				 | ||||||
|  * Parameters: Upnp_LogLevel log_level |  * Parameters:	void | ||||||
|  * |  * | ||||||
|  * Description:							 |  * Description:							 | ||||||
|  *	This functions set the log level (see {\tt Upnp_LogLevel} |  *	This functions set the log level (see {\tt Upnp_LogLevel} | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG | void UpnpSetLogLevel (Upnp_LogLevel); | ||||||
| void UpnpSetLogLevel(Upnp_LogLevel log_level); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
| @@ -140,11 +129,10 @@ static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {} | |||||||
|  *	This functions closes the log files |  *	This functions closes the log files | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG |  | ||||||
| void UpnpCloseLog(); | void UpnpCloseLog(); | ||||||
| #else |  | ||||||
| static UPNP_INLINE void UpnpCloseLog() {} | // for backward compatibility | ||||||
| #endif | #define CloseLog	UpnpCloseLog | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
| @@ -161,22 +149,17 @@ static UPNP_INLINE void UpnpCloseLog() {} | |||||||
|  *	per the requested banner	 |  *	per the requested banner	 | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG | void UpnpSetLogFileNames (const char* ErrFileName, const char* InfoFileName); | ||||||
| void UpnpSetLogFileNames( |  | ||||||
| 	const char *ErrFileName, | // for backward compatibility | ||||||
| 	const char *InfoFileName); | #define SetLogFileNames		UpnpSetLogFileNames | ||||||
| #else |  | ||||||
| static UPNP_INLINE void UpnpSetLogFileNames( |  | ||||||
| 	const char *ErrFileName, |  | ||||||
| 	const char *InfoFileName) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|  * Function : UpnpGetDebugFile		 |  * Function : UpnpGetDebugFile		 | ||||||
|  *						 |  *						 | ||||||
|  * Parameters:					 |  * Parameters:					 | ||||||
|  *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  |  *	IN Dbg_Level DLevel: The level of the debug logging. It will decide  | ||||||
|  *		whether debug statement will go to standard output,  |  *		whether debug statement will go to standard output,  | ||||||
|  *		or any of the log files. |  *		or any of the log files. | ||||||
|  *	IN Dbg_Module Module: debug will go in the name of this module |  *	IN Dbg_Module Module: debug will go in the name of this module | ||||||
| @@ -188,47 +171,17 @@ static UPNP_INLINE void UpnpSetLogFileNames( | |||||||
|  *	NULL : if the module is turn off for debug  |  *	NULL : if the module is turn off for debug  | ||||||
|  *	else returns the right file descriptor |  *	else returns the right file descriptor | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG |  | ||||||
| FILE* UpnpGetDebugFile (Upnp_LogLevel level, Dbg_Module module); | FILE* UpnpGetDebugFile (Upnp_LogLevel level, Dbg_Module module); | ||||||
| #else |  | ||||||
| static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module) |  | ||||||
| { |  | ||||||
| 	return NULL; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  | // for backward compatibility | ||||||
| /*************************************************************************** | #define GetDebugFile	UpnpGetDebugFile | ||||||
|  * Function : DebugAtThisLevel					 |  | ||||||
|  *									 |  | ||||||
|  * Parameters:			 |  | ||||||
|  *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  |  | ||||||
|  *		whether debug statement will go to standard output,  |  | ||||||
|  *		or any of the log files. |  | ||||||
|  *	IN Dbg_Module Module: debug will go in the name of this module |  | ||||||
|  *					 |  | ||||||
|  * Description:					 |  | ||||||
|  *	This functions returns true if debug output should be done in this |  | ||||||
|  *	module. |  | ||||||
|  * |  | ||||||
|  * Returns: int |  | ||||||
|  ***************************************************************************/ |  | ||||||
| #ifdef DEBUG |  | ||||||
| int DebugAtThisLevel( |  | ||||||
| 	IN Upnp_LogLevel DLevel, |  | ||||||
| 	IN Dbg_Module Module); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE int DebugAtThisLevel( |  | ||||||
| 	IN Upnp_LogLevel DLevel, |  | ||||||
| 	IN Dbg_Module Module) { return 0; } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|  * Function : UpnpPrintf				 |  * Function : UpnpPrintf				 | ||||||
|  *									 |  *									 | ||||||
|  * Parameters:								 |  * Parameters:								 | ||||||
|  *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  |  *	IN Dbg_Level DLevel: The level of the debug logging. It will decide  | ||||||
|  *		whether debug statement will go to standard output,  |  *		whether debug statement will go to standard output,  | ||||||
|  *		or any of the log files. |  *		or any of the log files. | ||||||
|  *	IN Dbg_Module Module: debug will go in the name of this module |  *	IN Dbg_Module Module: debug will go in the name of this module | ||||||
| @@ -245,28 +198,14 @@ static UPNP_INLINE int DebugAtThisLevel( | |||||||
|  *	debug statement is coming |  *	debug statement is coming | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/  |  ***************************************************************************/  | ||||||
| #ifdef DEBUG | void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module, | ||||||
| void UpnpPrintf( | 		 const char* DbgFileName, int DbgLineNo, | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	const char* DbgFileName, |  | ||||||
| 	int DbgLineNo, |  | ||||||
| 		 const char* FmtStr, | 		 const char* FmtStr, | ||||||
| 		 ...) | 		 ...) | ||||||
| #if (__GNUC__ >= 3) | #if (__GNUC__ >= 3) | ||||||
| 	/* This enables printf like format checking by the compiler */ |  | ||||||
| 	__attribute__((format (__printf__, 5, 6))) | 	__attribute__((format (__printf__, 5, 6))) | ||||||
| #endif | #endif | ||||||
| ; | ; | ||||||
| #else /* DEBUG */ |  | ||||||
| static UPNP_INLINE void UpnpPrintf( |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	const char* DbgFileName, |  | ||||||
| 	int DbgLineNo, |  | ||||||
| 	const char* FmtStr, |  | ||||||
| 	...) {} |  | ||||||
| #endif /* DEBUG */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
| @@ -283,19 +222,8 @@ static UPNP_INLINE void UpnpPrintf( | |||||||
|  *	per the requested banner			 |  *	per the requested banner			 | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG | void UpnpDisplayBanner (FILE *fd, | ||||||
| void UpnpDisplayBanner( | 			const char** lines, size_t size, int starlength); | ||||||
| 	FILE *fd, |  | ||||||
| 	const char **lines, |  | ||||||
| 	size_t size, |  | ||||||
| 	int starlength); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE void UpnpDisplayBanner( |  | ||||||
| 	FILE *fd, |  | ||||||
| 	const char **lines, |  | ||||||
| 	size_t size, |  | ||||||
| 	int starlength) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
| @@ -312,23 +240,19 @@ static UPNP_INLINE void UpnpDisplayBanner( | |||||||
|  *		debug statement is coming to the log file |  *		debug statement is coming to the log file | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG | void UpnpDisplayFileAndLine (FILE *fd, const char *DbgFileName, int DbgLineNo); | ||||||
| void UpnpDisplayFileAndLine( |  | ||||||
| 	FILE *fd, |  | ||||||
| 	const char *DbgFileName, | //@} | ||||||
| 	int DbgLineNo); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE void UpnpDisplayFileAndLine( |  | ||||||
| 	FILE *fd, |  | ||||||
| 	const char *DbgFileName, |  | ||||||
| 	int DbgLineNo) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /*! @} */ |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* UPNP_DEBUG_H */ | #endif // UPNP_HAVE_DEBUG | ||||||
|  |  | ||||||
|  | #endif // UPNP_DEBUG_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. | ||||||
|  * | // | ||||||
|  ******************************************************************************/ | /////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
| /** @name Optional Tool APIs | /** @name Optional Tool APIs | ||||||
|  *  The Linux SDK for UPnP Devices contains some additional, optional  |  *  The Linux SDK for UPnP Devices contains some additional, optional  | ||||||
| @@ -36,14 +36,14 @@ | |||||||
|  *  size in the SDK. Refer to the README for details. |  *  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" | #include "upnp.h" | ||||||
|  |  | ||||||
| /* 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 | ||||||
| @@ -217,13 +217,14 @@ EXPORT_SPEC const char * UpnpGetErrorMessage( | |||||||
|         int errorcode  /** The SDK error code to convert. */ |         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 */ |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,87 +0,0 @@ | |||||||
| # |  | ||||||
| # "Makefile.am" for "libupnp/upnp/sample" |  | ||||||
| # |  | ||||||
| # Copyright (C) 2007 Marcelo Roberto Jimenez <mroberto@users.sourceforge.net> |  | ||||||
| # |  | ||||||
|  |  | ||||||
| AM_CPPFLAGS = \ |  | ||||||
| 	-I$(top_srcdir)/upnp/inc \ |  | ||||||
| 	-I$(top_srcdir)/threadutil/inc \ |  | ||||||
| 	-I$(top_srcdir)/ixml/inc |  | ||||||
|  |  | ||||||
| AM_CFLAGS = $(PTHREAD_CFLAGS) |  | ||||||
|  |  | ||||||
| AM_LDFLAGS = $(PTHREAD_LIBS) |  | ||||||
|  |  | ||||||
| LDADD = \ |  | ||||||
| 	$(top_builddir)/upnp/libupnp.la \ |  | ||||||
| 	$(top_builddir)/threadutil/libthreadutil.la \ |  | ||||||
| 	$(top_builddir)/ixml/libixml.la |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # samples |  | ||||||
| noinst_PROGRAMS = |  | ||||||
| if ENABLE_SAMPLES |  | ||||||
| if ENABLE_CLIENT |  | ||||||
| noinst_PROGRAMS += upnp_tv_ctrlpt |  | ||||||
| upnp_tv_ctrlpt_CPPFLAGS = \ |  | ||||||
| 	$(AM_CPPFLAGS) \ |  | ||||||
| 	-I$(srcdir)/common/ \ |  | ||||||
| 	-I$(srcdir)/tvctrlpt |  | ||||||
| if ENABLE_DEVICE |  | ||||||
| noinst_PROGRAMS += upnp_tv_combo |  | ||||||
| upnp_tv_combo_CPPFLAGS = $(AM_CPPFLAGS) \ |  | ||||||
| 	-I$(srcdir)/common/ \ |  | ||||||
| 	-I$(srcdir)/tvcombo |  | ||||||
| endif |  | ||||||
| endif |  | ||||||
| if ENABLE_DEVICE |  | ||||||
| noinst_PROGRAMS += upnp_tv_device |  | ||||||
| upnp_tv_device_CPPFLAGS = \ |  | ||||||
| 	$(AM_CPPFLAGS) \ |  | ||||||
| 	-I$(srcdir)/common/ \ |  | ||||||
| 	-I$(srcdir)/tvdevice |  | ||||||
| endif |  | ||||||
| endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| upnp_tv_device_SOURCES = \ |  | ||||||
| 	common/sample_util.c \ |  | ||||||
| 	common/sample_util.h \ |  | ||||||
| 	tvdevice/upnp_tv_device.c \ |  | ||||||
| 	tvdevice/upnp_tv_device.h \ |  | ||||||
| 	tvdevice/linux/upnp_tv_device_main.c |  | ||||||
|  |  | ||||||
|  |  | ||||||
| upnp_tv_ctrlpt_SOURCES = \ |  | ||||||
| 	common/sample_util.c \ |  | ||||||
| 	common/sample_util.h \ |  | ||||||
| 	tvctrlpt/upnp_tv_ctrlpt.c \ |  | ||||||
| 	tvctrlpt/upnp_tv_ctrlpt.h \ |  | ||||||
| 	tvctrlpt/linux/upnp_tv_ctrlpt_main.c |  | ||||||
|  |  | ||||||
| upnp_tv_combo_SOURCES = \ |  | ||||||
| 	common/sample_util.c \ |  | ||||||
| 	common/sample_util.h \ |  | ||||||
| 	tvcombo/upnp_tv_ctrlpt.c \ |  | ||||||
| 	tvcombo/upnp_tv_ctrlpt.h \ |  | ||||||
| 	tvcombo/upnp_tv_device.c \ |  | ||||||
| 	tvcombo/upnp_tv_device.h \ |  | ||||||
| 	tvcombo/linux/upnp_tv_combo_main.c |  | ||||||
|  |  | ||||||
|  |  | ||||||
| if WITH_DOCUMENTATION |  | ||||||
| examplesdir = $(docdir)/examples |  | ||||||
| examples_DATA = \ |  | ||||||
| 		$(upnp_tv_ctrlpt_SOURCES) \ |  | ||||||
| 		$(upnp_tv_device_SOURCES) |  | ||||||
| endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| EXTRA_DIST = \ |  | ||||||
| 	web/tvcombodesc.xml \ |  | ||||||
| 	web/tvcontrolSCPD.xml \ |  | ||||||
| 	web/tvdevicedesc.xml \ |  | ||||||
| 	web/tvdevicepres.html \ |  | ||||||
| 	web/tvpictureSCPD.xml |  | ||||||
|  |  | ||||||
| @@ -1,489 +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 "sample_util.h" |  | ||||||
| #include "upnp_tv_ctrlpt.h" |  | ||||||
| #include "upnp_tv_device.h" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <string.h> |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|    Tags for valid commands issued at the command prompt  |  | ||||||
|  */ |  | ||||||
| enum cmdloop_tvcmds { |  | ||||||
|     PRTHELP = 0, PRTFULLHELP, POWON, POWOFF, |  | ||||||
|     SETCHAN, SETVOL, SETCOL, SETTINT, SETCONT, SETBRT, |  | ||||||
|     CTRLACTION, PICTACTION, CTRLGETVAR, PICTGETVAR, |  | ||||||
|     PRTDEV, LSTDEV, REFRESH, EXITCMD |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|    Data structure for parsing commands from the command line  |  | ||||||
|  */ |  | ||||||
| struct cmdloop_commands { |  | ||||||
|     char *str;                  // the string  |  | ||||||
|     int cmdnum;                 // the command |  | ||||||
|     int numargs;                // the number of arguments |  | ||||||
|     char *args;                 // the args |  | ||||||
| } cmdloop_commands; |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|    Mappings between command text names, command tag, |  | ||||||
|    and required command arguments for command line |  | ||||||
|    commands  |  | ||||||
|  */ |  | ||||||
| static struct cmdloop_commands cmdloop_cmdlist[] = { |  | ||||||
|     {"Help", PRTHELP, 1, ""}, |  | ||||||
|     {"HelpFull", PRTFULLHELP, 1, ""}, |  | ||||||
|     {"ListDev", LSTDEV, 1, ""}, |  | ||||||
|     {"Refresh", REFRESH, 1, ""}, |  | ||||||
|     {"PrintDev", PRTDEV, 2, "<devnum>"}, |  | ||||||
|     {"PowerOn", POWON, 2, "<devnum>"}, |  | ||||||
|     {"PowerOff", POWOFF, 2, "<devnum>"}, |  | ||||||
|     {"SetChannel", SETCHAN, 3, "<devnum> <channel (int)>"}, |  | ||||||
|     {"SetVolume", SETVOL, 3, "<devnum> <volume (int)>"}, |  | ||||||
|     {"SetColor", SETCOL, 3, "<devnum> <color (int)>"}, |  | ||||||
|     {"SetTint", SETTINT, 3, "<devnum> <tint (int)>"}, |  | ||||||
|     {"SetContrast", SETCONT, 3, "<devnum> <contrast (int)>"}, |  | ||||||
|     {"SetBrightness", SETBRT, 3, "<devnum> <brightness (int)>"}, |  | ||||||
|     {"CtrlAction", CTRLACTION, 2, "<devnum> <action (string)>"}, |  | ||||||
|     {"PictAction", PICTACTION, 2, "<devnum> <action (string)>"}, |  | ||||||
|     {"CtrlGetVar", CTRLGETVAR, 2, "<devnum> <varname (string)>"}, |  | ||||||
|     {"PictGetVar", PICTGETVAR, 2, "<devnum> <varname (string)>"}, |  | ||||||
|     {"Exit", EXITCMD, 1, ""} |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void |  | ||||||
| linux_print( const char *string ) |  | ||||||
| { |  | ||||||
|     puts( string ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /******************************************************************************** |  | ||||||
|  * TvCtrlPointPrintHelp |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Print help info for this application. |  | ||||||
|  ********************************************************************************/ |  | ||||||
| void |  | ||||||
| TvCtrlPointPrintShortHelp( void ) |  | ||||||
| { |  | ||||||
|     SampleUtil_Print( "Commands:" ); |  | ||||||
|     SampleUtil_Print( "  Help" ); |  | ||||||
|     SampleUtil_Print( "  HelpFull" ); |  | ||||||
|     SampleUtil_Print( "  ListDev" ); |  | ||||||
|     SampleUtil_Print( "  Refresh" ); |  | ||||||
|     SampleUtil_Print( "  PrintDev      <devnum>" ); |  | ||||||
|     SampleUtil_Print( "  PowerOn       <devnum>" ); |  | ||||||
|     SampleUtil_Print( "  PowerOff      <devnum>" ); |  | ||||||
|     SampleUtil_Print( "  SetChannel    <devnum> <channel>" ); |  | ||||||
|     SampleUtil_Print( "  SetVolume     <devnum> <volume>" ); |  | ||||||
|     SampleUtil_Print( "  SetColor      <devnum> <color>" ); |  | ||||||
|     SampleUtil_Print( "  SetTint       <devnum> <tint>" ); |  | ||||||
|     SampleUtil_Print( "  SetContrast   <devnum> <contrast>" ); |  | ||||||
|     SampleUtil_Print( "  SetBrightness <devnum> <brightness>" ); |  | ||||||
|     SampleUtil_Print( "  CtrlAction    <devnum> <action>" ); |  | ||||||
|     SampleUtil_Print( "  PictAction    <devnum> <action>" ); |  | ||||||
|     SampleUtil_Print( "  CtrlGetVar    <devnum> <varname>" ); |  | ||||||
|     SampleUtil_Print( "  PictGetVar    <devnum> <action>" ); |  | ||||||
|     SampleUtil_Print( "  Exit" ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void |  | ||||||
| TvCtrlPointPrintLongHelp( void ) |  | ||||||
| { |  | ||||||
|     SampleUtil_Print( "" ); |  | ||||||
|     SampleUtil_Print( "******************************" ); |  | ||||||
|     SampleUtil_Print( "* TV Control Point Help Info *" ); |  | ||||||
|     SampleUtil_Print( "******************************" ); |  | ||||||
|     SampleUtil_Print( "" ); |  | ||||||
|     SampleUtil_Print( "This sample control point application automatically searches" ); |  | ||||||
|     SampleUtil_Print( "for and subscribes to the services of television device emulator" ); |  | ||||||
|     SampleUtil_Print( "devices. While registers a tv device itself." ); |  | ||||||
|     SampleUtil_Print( "" ); |  | ||||||
|     SampleUtil_Print( "Commands:" ); |  | ||||||
|     SampleUtil_Print( "  Help" ); |  | ||||||
|     SampleUtil_Print( "       Print this help info." ); |  | ||||||
|     SampleUtil_Print( "  ListDev" ); |  | ||||||
|     SampleUtil_Print( "       Print the current list of TV Device Emulators that this" ); |  | ||||||
|     SampleUtil_Print( "         control point is aware of.  Each device is preceded by a" ); |  | ||||||
|     SampleUtil_Print( "         device number which corresponds to the devnum argument of" ); |  | ||||||
|     SampleUtil_Print( "         commands listed below." ); |  | ||||||
|     SampleUtil_Print( "  Refresh" ); |  | ||||||
|     SampleUtil_Print( "       Delete all of the devices from the device list and issue new" ); |  | ||||||
|     SampleUtil_Print( "         search request to rebuild the list from scratch." ); |  | ||||||
|     SampleUtil_Print( "  PrintDev       <devnum>" ); |  | ||||||
|     SampleUtil_Print( "       Print the state table for the device <devnum>." ); |  | ||||||
|     SampleUtil_Print( "         e.g., 'PrintDev 1' prints the state table for the first" ); |  | ||||||
|     SampleUtil_Print( "         device in the device list." ); |  | ||||||
|     SampleUtil_Print( "  PowerOn        <devnum>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the PowerOn action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>." ); |  | ||||||
|     SampleUtil_Print( "  PowerOff       <devnum>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the PowerOff action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>." ); |  | ||||||
|     SampleUtil_Print( "  SetChannel     <devnum> <channel>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the SetChannel action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>, requesting the channel to be changed" ); |  | ||||||
|     SampleUtil_Print( "         to <channel>." ); |  | ||||||
|     SampleUtil_Print( "  SetVolume      <devnum> <volume>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the SetVolume action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>, requesting the volume to be changed" ); |  | ||||||
|     SampleUtil_Print( "         to <volume>." ); |  | ||||||
|     SampleUtil_Print( "  SetColor       <devnum> <color>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the SetColor action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>, requesting the color to be changed" ); |  | ||||||
|     SampleUtil_Print( "         to <color>." ); |  | ||||||
|     SampleUtil_Print( "  SetTint        <devnum> <tint>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the SetTint action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>, requesting the tint to be changed" ); |  | ||||||
|     SampleUtil_Print( "         to <tint>." ); |  | ||||||
|     SampleUtil_Print( "  SetContrast    <devnum> <contrast>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the SetContrast action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>, requesting the contrast to be changed" ); |  | ||||||
|     SampleUtil_Print( "         to <contrast>." ); |  | ||||||
|     SampleUtil_Print( "  SetBrightness  <devnum> <brightness>" ); |  | ||||||
|     SampleUtil_Print( "       Sends the SetBrightness action to the Control Service of" ); |  | ||||||
|     SampleUtil_Print( "         device <devnum>, requesting the brightness to be changed" ); |  | ||||||
|     SampleUtil_Print( "         to <brightness>." ); |  | ||||||
|     SampleUtil_Print( "  CtrlAction     <devnum> <action>" ); |  | ||||||
|     SampleUtil_Print( "       Sends an action request specified by the string <action>" ); |  | ||||||
|     SampleUtil_Print( "         to the Control Service of device <devnum>.  This command" ); |  | ||||||
|     SampleUtil_Print( "         only works for actions that have no arguments." ); |  | ||||||
|     SampleUtil_Print( "         (e.g., \"CtrlAction 1 IncreaseChannel\")" ); |  | ||||||
|     SampleUtil_Print( "  PictAction     <devnum> <action>" ); |  | ||||||
|     SampleUtil_Print( "       Sends an action request specified by the string <action>" ); |  | ||||||
|     SampleUtil_Print( "         to the Picture Service of device <devnum>.  This command" ); |  | ||||||
|     SampleUtil_Print( "         only works for actions that have no arguments." ); |  | ||||||
|     SampleUtil_Print( "         (e.g., \"PictAction 1 DecreaseContrast\")" ); |  | ||||||
|     SampleUtil_Print( "  CtrlGetVar     <devnum> <varname>" ); |  | ||||||
|     SampleUtil_Print( "       Requests the value of a variable specified by the string <varname>" ); |  | ||||||
|     SampleUtil_Print( "         from the Control Service of device <devnum>." ); |  | ||||||
|     SampleUtil_Print( "         (e.g., \"CtrlGetVar 1 Volume\")" ); |  | ||||||
|     SampleUtil_Print( "  PictGetVar     <devnum> <action>" ); |  | ||||||
|     SampleUtil_Print( "       Requests the value of a variable specified by the string <varname>" ); |  | ||||||
|     SampleUtil_Print( "         from the Picture Service of device <devnum>." ); |  | ||||||
|     SampleUtil_Print( "         (e.g., \"PictGetVar 1 Tint\")" ); |  | ||||||
|     SampleUtil_Print( "  Exit" ); |  | ||||||
|     SampleUtil_Print( "       Exits the control point application." ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /******************************************************************************** |  | ||||||
|  * TvCtrlPointPrintCommands |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Print the list of valid command line commands to the user |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   None |  | ||||||
|  * |  | ||||||
|  ********************************************************************************/ |  | ||||||
| void |  | ||||||
| TvCtrlPointPrintCommands() |  | ||||||
| { |  | ||||||
|     int i; |  | ||||||
|     int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands ); |  | ||||||
|  |  | ||||||
|     SampleUtil_Print( "Valid Commands:" ); |  | ||||||
|     for( i = 0; i < numofcmds; i++ ) { |  | ||||||
|         SampleUtil_Print( "  %-14s %s", cmdloop_cmdlist[i].str, |  | ||||||
|                           cmdloop_cmdlist[i].args ); |  | ||||||
|     } |  | ||||||
|     SampleUtil_Print( "" ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /******************************************************************************** |  | ||||||
|  * TvCtrlPointCommandLoop |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Function that receives commands from the user at the command prompt |  | ||||||
|  *       during the lifetime of the control point, and calls the appropriate |  | ||||||
|  *       functions for those commands. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    None |  | ||||||
|  * |  | ||||||
|  ********************************************************************************/ |  | ||||||
| void * |  | ||||||
| TvCtrlPointCommandLoop( void *args ) |  | ||||||
| { |  | ||||||
|     char cmdline[100]; |  | ||||||
|  |  | ||||||
|     while( 1 ) { |  | ||||||
|         SampleUtil_Print( "\n>> " ); |  | ||||||
|         fgets( cmdline, 100, stdin ); |  | ||||||
|         TvCtrlPointProcessCommand( cmdline ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return NULL; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int |  | ||||||
| TvCtrlPointProcessCommand( char *cmdline ) |  | ||||||
| { |  | ||||||
|     char cmd[100]; |  | ||||||
|     char strarg[100]; |  | ||||||
|     int arg_val_err = -99999; |  | ||||||
|     int arg1 = arg_val_err; |  | ||||||
|     int arg2 = arg_val_err; |  | ||||||
|     int cmdnum = -1; |  | ||||||
|     int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands ); |  | ||||||
|     int cmdfound = 0; |  | ||||||
|     int i, |  | ||||||
|       rc; |  | ||||||
|     int invalidargs = 0; |  | ||||||
|     int validargs; |  | ||||||
|  |  | ||||||
|     validargs = sscanf( cmdline, "%s %d %d", cmd, &arg1, &arg2 ); |  | ||||||
|  |  | ||||||
|     for( i = 0; i < numofcmds; i++ ) { |  | ||||||
|         if( strcasecmp( cmd, cmdloop_cmdlist[i].str ) == 0 ) { |  | ||||||
|             cmdnum = cmdloop_cmdlist[i].cmdnum; |  | ||||||
|             cmdfound++; |  | ||||||
|             if( validargs != cmdloop_cmdlist[i].numargs ) |  | ||||||
|                 invalidargs++; |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if( !cmdfound ) { |  | ||||||
|         SampleUtil_Print( "Command not found; try 'Help'" ); |  | ||||||
|         return TV_SUCCESS; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if( invalidargs ) { |  | ||||||
|         SampleUtil_Print( "Invalid arguments; try 'Help'" ); |  | ||||||
|         return TV_SUCCESS; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     switch ( cmdnum ) { |  | ||||||
|         case PRTHELP: |  | ||||||
|             TvCtrlPointPrintShortHelp(); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case PRTFULLHELP: |  | ||||||
|             TvCtrlPointPrintLongHelp(); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case POWON: |  | ||||||
|             TvCtrlPointSendPowerOn( arg1 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case POWOFF: |  | ||||||
|             TvCtrlPointSendPowerOff( arg1 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case SETCHAN: |  | ||||||
|             TvCtrlPointSendSetChannel( arg1, arg2 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case SETVOL: |  | ||||||
|             TvCtrlPointSendSetVolume( arg1, arg2 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case SETCOL: |  | ||||||
|             TvCtrlPointSendSetColor( arg1, arg2 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case SETTINT: |  | ||||||
|             TvCtrlPointSendSetTint( arg1, arg2 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case SETCONT: |  | ||||||
|             TvCtrlPointSendSetContrast( arg1, arg2 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case SETBRT: |  | ||||||
|             TvCtrlPointSendSetBrightness( arg1, arg2 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case CTRLACTION: |  | ||||||
|             /* |  | ||||||
|                re-parse commandline since second arg is string  |  | ||||||
|              */ |  | ||||||
|             validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); |  | ||||||
|             if( 3 == validargs ) |  | ||||||
|                 TvCtrlPointSendAction( TV_SERVICE_CONTROL, arg1, strarg, |  | ||||||
|                                        NULL, NULL, 0 ); |  | ||||||
|             else |  | ||||||
|                 invalidargs++; |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case PICTACTION: |  | ||||||
|             /* |  | ||||||
|                re-parse commandline since second arg is string  |  | ||||||
|              */ |  | ||||||
|             validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); |  | ||||||
|             if( 3 == validargs ) |  | ||||||
|                 TvCtrlPointSendAction( TV_SERVICE_PICTURE, arg1, strarg, |  | ||||||
|                                        NULL, NULL, 0 ); |  | ||||||
|             else |  | ||||||
|                 invalidargs++; |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case CTRLGETVAR: |  | ||||||
|             /* |  | ||||||
|                re-parse commandline since second arg is string  |  | ||||||
|              */ |  | ||||||
|             validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); |  | ||||||
|             if( 3 == validargs ) |  | ||||||
|                 TvCtrlPointGetVar( TV_SERVICE_CONTROL, arg1, strarg ); |  | ||||||
|             else |  | ||||||
|                 invalidargs++; |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case PICTGETVAR: |  | ||||||
|             /* |  | ||||||
|                re-parse commandline since second arg is string  |  | ||||||
|              */ |  | ||||||
|             validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg ); |  | ||||||
|             if( 3 == validargs ) |  | ||||||
|                 TvCtrlPointGetVar( TV_SERVICE_PICTURE, arg1, strarg ); |  | ||||||
|             else |  | ||||||
|                 invalidargs++; |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case PRTDEV: |  | ||||||
|             TvCtrlPointPrintDevice( arg1 ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case LSTDEV: |  | ||||||
|             TvCtrlPointPrintList(); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case REFRESH: |  | ||||||
|             TvCtrlPointRefresh(); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         case EXITCMD: |  | ||||||
|             rc = TvCtrlPointStop(); |  | ||||||
|             exit( rc ); |  | ||||||
|             break; |  | ||||||
|  |  | ||||||
|         default: |  | ||||||
|             SampleUtil_Print( "Command not implemented; see 'Help'" ); |  | ||||||
|             break; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if( invalidargs ) |  | ||||||
|         SampleUtil_Print( "Invalid args in command; see 'Help'" ); |  | ||||||
|  |  | ||||||
|     return TV_SUCCESS; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int |  | ||||||
| device_main( int argc, char **argv ) |  | ||||||
| { |  | ||||||
|  |  | ||||||
|     unsigned int portTemp = 0; |  | ||||||
|     char *ip_address = NULL, |  | ||||||
|      *desc_doc_name = NULL, |  | ||||||
|      *web_dir_path = NULL; |  | ||||||
|     unsigned int port = 0; |  | ||||||
|  |  | ||||||
|     int i = 0; |  | ||||||
|  |  | ||||||
|     SampleUtil_Initialize( linux_print ); |  | ||||||
|  |  | ||||||
|     // Parse options |  | ||||||
|     for( i = 1; i < argc; i++ ) { |  | ||||||
|         if( strcmp( argv[i], "-ip" ) == 0 ) { |  | ||||||
|             ip_address = argv[++i]; |  | ||||||
|         } else if( strcmp( argv[i], "-port" ) == 0 ) { |  | ||||||
|             sscanf( argv[++i], "%u", &portTemp ); |  | ||||||
|         } else if( strcmp( argv[i], "-desc" ) == 0 ) { |  | ||||||
|             desc_doc_name = argv[++i]; |  | ||||||
|         } else if( strcmp( argv[i], "-webdir" ) == 0 ) { |  | ||||||
|             web_dir_path = argv[++i]; |  | ||||||
|         } else if( strcmp( argv[i], "-help" ) == 0 ) { |  | ||||||
|             SampleUtil_Print( "Usage: %s -ip ipaddress -port port" |  | ||||||
|                               " -desc desc_doc_name -webdir web_dir_path" |  | ||||||
|                               " -help (this message)\n", argv[0] ); |  | ||||||
|             SampleUtil_Print( "\tipaddress:     IP address of the device" |  | ||||||
|                               " (must match desc. doc)\n" ); |  | ||||||
|             SampleUtil_Print( "\t\te.g.: 192.168.0.4\n" ); |  | ||||||
|             SampleUtil_Print( "\tport:          Port number to use for " |  | ||||||
|                               "receiving UPnP messages (must match desc. doc)\n" ); |  | ||||||
|             SampleUtil_Print( "\t\te.g.: 5431\n" ); |  | ||||||
|             SampleUtil_Print |  | ||||||
|                 ( "\tdesc_doc_name: name of device description document\n" ); |  | ||||||
|             SampleUtil_Print( "\t\te.g.: tvcombodesc.xml\n" ); |  | ||||||
|             SampleUtil_Print |  | ||||||
|                 ( "\tweb_dir_path: Filesystem path where web files " |  | ||||||
|                   "related to the device are stored\n" ); |  | ||||||
|             SampleUtil_Print( "\t\te.g.: /upnp/sample/web\n" ); |  | ||||||
|             return 1; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     port = ( unsigned short )portTemp; |  | ||||||
|  |  | ||||||
|     return TvDeviceStart( |  | ||||||
|         ip_address, port, desc_doc_name, web_dir_path, linux_print ); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int |  | ||||||
| main( int argc, char **argv ) |  | ||||||
| { |  | ||||||
|     int rc; |  | ||||||
|     ithread_t cmdloop_thread; |  | ||||||
|     int sig; |  | ||||||
|     sigset_t sigs_to_catch; |  | ||||||
|     int code; |  | ||||||
|  |  | ||||||
|     device_main(argc, argv); |  | ||||||
|     rc = TvCtrlPointStart( linux_print, NULL ); |  | ||||||
|     if( rc != TV_SUCCESS ) { |  | ||||||
|         SampleUtil_Print( "Error starting UPnP TV Control Point" ); |  | ||||||
|         return rc; |  | ||||||
|     } |  | ||||||
|     // start a command loop thread |  | ||||||
|     code = |  | ||||||
|         ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop, |  | ||||||
|                         NULL ); |  | ||||||
|  |  | ||||||
|     /* |  | ||||||
|        Catch Ctrl-C and properly shutdown  |  | ||||||
|      */ |  | ||||||
|     sigemptyset( &sigs_to_catch ); |  | ||||||
|     sigaddset( &sigs_to_catch, SIGINT ); |  | ||||||
|     sigwait( &sigs_to_catch, &sig ); |  | ||||||
|  |  | ||||||
|     SampleUtil_Print( "Shutting down on signal %d...", sig ); |  | ||||||
|     TvDeviceStop(); |  | ||||||
|     rc = TvCtrlPointStop(); |  | ||||||
|      |  | ||||||
|     return rc; |  | ||||||
| } |  | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,158 +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 UPNP_TV_CTRLPT_H |  | ||||||
| #define UPNP_TV_CTRLPT_H |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <stdio.h> |  | ||||||
|  |  | ||||||
| #include "ithread.h" |  | ||||||
| #include <unistd.h> |  | ||||||
| #include <stdarg.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <signal.h> |  | ||||||
| #include <string.h> |  | ||||||
|  |  | ||||||
| #include "upnp.h" |  | ||||||
| #include "upnptools.h" |  | ||||||
| #include "sample_util.h" |  | ||||||
|  |  | ||||||
| #define TV_SERVICE_SERVCOUNT	2 |  | ||||||
| #define TV_SERVICE_CONTROL		0 |  | ||||||
| #define TV_SERVICE_PICTURE		1 |  | ||||||
|  |  | ||||||
| #define TV_CONTROL_VARCOUNT		3 |  | ||||||
| #define TV_CONTROL_POWER		0 |  | ||||||
| #define TV_CONTROL_CHANNEL		1 |  | ||||||
| #define TV_CONTROL_VOLUME		2 |  | ||||||
|  |  | ||||||
| #define TV_PICTURE_VARCOUNT		4 |  | ||||||
| #define TV_PICTURE_COLOR		0 |  | ||||||
| #define TV_PICTURE_TINT			1 |  | ||||||
| #define TV_PICTURE_CONTRAST		2 |  | ||||||
| #define TV_PICTURE_BRIGHTNESS	3 |  | ||||||
|  |  | ||||||
| #define TV_MAX_VAL_LEN			5 |  | ||||||
|  |  | ||||||
| #define TV_SUCCESS				0 |  | ||||||
| #define TV_ERROR				(-1) |  | ||||||
| #define TV_WARNING				1 |  | ||||||
|  |  | ||||||
| /* This should be the maximum VARCOUNT from above */ |  | ||||||
| #define TV_MAXVARS				TV_PICTURE_VARCOUNT |  | ||||||
|  |  | ||||||
| extern char TvDeviceType[]; |  | ||||||
| extern char *TvServiceType[]; |  | ||||||
| extern char *TvServiceName[]; |  | ||||||
| extern char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS]; |  | ||||||
| extern char TvVarCount[]; |  | ||||||
|  |  | ||||||
| struct tv_service { |  | ||||||
|     char ServiceId[NAME_SIZE]; |  | ||||||
|     char ServiceType[NAME_SIZE]; |  | ||||||
|     char *VariableStrVal[TV_MAXVARS]; |  | ||||||
|     char EventURL[NAME_SIZE]; |  | ||||||
|     char ControlURL[NAME_SIZE]; |  | ||||||
|     char SID[NAME_SIZE]; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| extern struct TvDeviceNode *GlobalDeviceList; |  | ||||||
|  |  | ||||||
| struct TvDevice { |  | ||||||
|     char UDN[250]; |  | ||||||
|     char DescDocURL[250]; |  | ||||||
|     char FriendlyName[250]; |  | ||||||
|     char PresURL[250]; |  | ||||||
|     int  AdvrTimeOut; |  | ||||||
|     struct tv_service TvService[TV_SERVICE_SERVCOUNT]; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| struct TvDeviceNode { |  | ||||||
|     struct TvDevice device; |  | ||||||
|     struct TvDeviceNode *next; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| extern ithread_mutex_t DeviceListMutex; |  | ||||||
|  |  | ||||||
| extern UpnpClient_Handle ctrlpt_handle; |  | ||||||
|  |  | ||||||
| void	TvCtrlPointPrintHelp( void ); |  | ||||||
| int		TvCtrlPointDeleteNode(struct TvDeviceNode*); |  | ||||||
| int		TvCtrlPointRemoveDevice(char*); |  | ||||||
| int		TvCtrlPointRemoveAll( void ); |  | ||||||
| int		TvCtrlPointRefresh( void ); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| int		TvCtrlPointSendAction(int, int, char *, char **, char **, int); |  | ||||||
| int		TvCtrlPointSendActionNumericArg(int devnum, int service, char *actionName, char *paramName, int paramValue); |  | ||||||
| int		TvCtrlPointSendPowerOn(int devnum); |  | ||||||
| int		TvCtrlPointSendPowerOff(int devnum); |  | ||||||
| int		TvCtrlPointSendSetChannel(int, int); |  | ||||||
| int		TvCtrlPointSendSetVolume(int, int); |  | ||||||
| int		TvCtrlPointSendSetColor(int, int); |  | ||||||
| int		TvCtrlPointSendSetTint(int, int); |  | ||||||
| int		TvCtrlPointSendSetContrast(int, int); |  | ||||||
| int		TvCtrlPointSendSetBrightness(int, int); |  | ||||||
|  |  | ||||||
| int		TvCtrlPointGetVar(int, int, char*); |  | ||||||
| int		TvCtrlPointGetPower(int devnum); |  | ||||||
| int		TvCtrlPointGetChannel(int); |  | ||||||
| int		TvCtrlPointGetVolume(int); |  | ||||||
| int		TvCtrlPointGetColor(int); |  | ||||||
| int		TvCtrlPointGetTint(int); |  | ||||||
| int		TvCtrlPointGetContrast(int); |  | ||||||
| int		TvCtrlPointGetBrightness(int); |  | ||||||
|  |  | ||||||
| int		TvCtrlPointGetDevice(int, struct TvDeviceNode **); |  | ||||||
| int		TvCtrlPointPrintList( void ); |  | ||||||
| int		TvCtrlPointPrintDevice(int); |  | ||||||
| void	TvCtrlPointAddDevice (IXML_Document *, char *, int);  |  | ||||||
| void    TvCtrlPointHandleGetVar(char *,char *,DOMString); |  | ||||||
| void	TvStateUpdate(char*,int, IXML_Document * , char **); |  | ||||||
| void	TvCtrlPointHandleEvent(Upnp_SID, int, IXML_Document *);  |  | ||||||
| void	TvCtrlPointHandleSubscribeUpdate(char *, Upnp_SID, int);  |  | ||||||
| int		TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *); |  | ||||||
| void	TvCtrlPointVerifyTimeouts(int); |  | ||||||
| void	TvCtrlPointPrintCommands( void ); |  | ||||||
| void*	TvCtrlPointCommandLoop( void* ); |  | ||||||
| int		TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr ); |  | ||||||
| int		TvCtrlPointStop( void ); |  | ||||||
| int		TvCtrlPointProcessCommand( char *cmdline ); |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| }; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif //UPNP_TV_CTRLPT_H |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,638 +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 UPNP_TV_DEVICE_H |  | ||||||
| #define UPNP_TV_DEVICE_H |  | ||||||
|  |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <signal.h> |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include "ithread.h" |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include <unistd.h> |  | ||||||
| #include <string.h> |  | ||||||
| #include "upnp.h" |  | ||||||
| #include "sample_util.h" |  | ||||||
|  |  | ||||||
| //Color constants |  | ||||||
| #define MAX_COLOR 10 |  | ||||||
| #define MIN_COLOR 1 |  | ||||||
|  |  | ||||||
| //Brightness constants |  | ||||||
| #define MAX_BRIGHTNESS 10 |  | ||||||
| #define MIN_BRIGHTNESS 1 |  | ||||||
|  |  | ||||||
| //Power constants |  | ||||||
| #define POWER_ON 1 |  | ||||||
| #define POWER_OFF 0 |  | ||||||
|  |  | ||||||
| //Tint constants |  | ||||||
| #define MAX_TINT 10 |  | ||||||
| #define MIN_TINT 1 |  | ||||||
|  |  | ||||||
| //Volume constants |  | ||||||
| #define MAX_VOLUME 10 |  | ||||||
| #define MIN_VOLUME 1 |  | ||||||
|  |  | ||||||
| //Contrast constants |  | ||||||
| #define MAX_CONTRAST 10 |  | ||||||
| #define MIN_CONTRAST 1 |  | ||||||
|  |  | ||||||
| //Channel constants |  | ||||||
| #define MAX_CHANNEL 100 |  | ||||||
| #define MIN_CHANNEL 1 |  | ||||||
|  |  | ||||||
| //Number of services. |  | ||||||
| #define TV_SERVICE_SERVCOUNT  2 |  | ||||||
|  |  | ||||||
| //Index of control service |  | ||||||
| #define TV_SERVICE_CONTROL    0 |  | ||||||
|  |  | ||||||
| //Index of picture service |  | ||||||
| #define TV_SERVICE_PICTURE    1 |  | ||||||
|  |  | ||||||
| //Number of control variables |  | ||||||
| #define TV_CONTROL_VARCOUNT   3 |  | ||||||
|  |  | ||||||
| //Index of power variable |  | ||||||
| #define TV_CONTROL_POWER      0 |  | ||||||
|  |  | ||||||
| //Index of channel variable |  | ||||||
| #define TV_CONTROL_CHANNEL    1 |  | ||||||
|  |  | ||||||
| //Index of volume variable |  | ||||||
| #define TV_CONTROL_VOLUME     2 |  | ||||||
|  |  | ||||||
| //Number of picture variables |  | ||||||
| #define TV_PICTURE_VARCOUNT   4 |  | ||||||
|  |  | ||||||
| //Index of color variable |  | ||||||
| #define TV_PICTURE_COLOR      0 |  | ||||||
|  |  | ||||||
| //Index of tint variable |  | ||||||
| #define TV_PICTURE_TINT       1 |  | ||||||
|  |  | ||||||
| //Index of contrast variable |  | ||||||
| #define TV_PICTURE_CONTRAST   2 |  | ||||||
|  |  | ||||||
| //Index of brightness variable |  | ||||||
| #define TV_PICTURE_BRIGHTNESS 3 |  | ||||||
|  |  | ||||||
| //Max value length |  | ||||||
| #define TV_MAX_VAL_LEN 5 |  | ||||||
|  |  | ||||||
| //Max actions |  | ||||||
| #define TV_MAXACTIONS 12 |  | ||||||
|  |  | ||||||
| /* This should be the maximum VARCOUNT from above */ |  | ||||||
| #define TV_MAXVARS TV_PICTURE_VARCOUNT |  | ||||||
|  |  | ||||||
|  |  | ||||||
| extern char TvDeviceType[]; |  | ||||||
|  |  | ||||||
| extern char *TvServiceType[]; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * upnp_action |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Prototype for all actions. For each action that a service  |  | ||||||
|  *       implements, there is a corresponding function with this prototype. |  | ||||||
|  *       Pointers to these functions, along with action names, are stored |  | ||||||
|  *       in the service table. When an action request comes in the action |  | ||||||
|  *       name is matched, and the appropriate function is called. |  | ||||||
|  *       Each function returns UPNP_E_SUCCESS, on success, and a nonzero  |  | ||||||
|  *       error code on failure. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  * |  | ||||||
|  *    IXML_Document * request - document of action request |  | ||||||
|  *    IXML_Document **out - action result |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
|  |  | ||||||
| typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out,  |  | ||||||
| 			    char **errorString); |  | ||||||
|  |  | ||||||
| /* Structure for storing Tv Service |  | ||||||
|    identifiers and state table */ |  | ||||||
| struct TvService { |  | ||||||
|    |  | ||||||
|   char UDN[NAME_SIZE]; /* Universally Unique Device Name */ |  | ||||||
|   char ServiceId[NAME_SIZE]; |  | ||||||
|   char ServiceType[NAME_SIZE]; |  | ||||||
|   char *VariableName[TV_MAXVARS];  |  | ||||||
|   char *VariableStrVal[TV_MAXVARS]; |  | ||||||
|   char *ActionNames[TV_MAXACTIONS]; |  | ||||||
|   upnp_action actions[TV_MAXACTIONS]; |  | ||||||
|   unsigned int  VariableCount; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| //Array of service structures |  | ||||||
| extern struct TvService tv_service_table[]; |  | ||||||
|  |  | ||||||
| //Device handle returned from sdk |  | ||||||
| extern UpnpDevice_Handle device_handle; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* Mutex for protecting the global state table data |  | ||||||
|    in a multi-threaded, asynchronous environment. |  | ||||||
|    All functions should lock this mutex before reading |  | ||||||
|    or writing the state table data. */ |  | ||||||
| extern ithread_mutex_t TVDevMutex; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * SetActionTable |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Initializes the action table for the specified service. |  | ||||||
|  *       Note that  |  | ||||||
|  *       knowledge of the service description is |  | ||||||
|  *       assumed.  Action names are hardcoded. |  | ||||||
|  * Parameters: |  | ||||||
|  *   int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE |  | ||||||
|  *   struct TvService *out - service containing action table to set. |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int SetActionTable(int serviceType, struct TvService * out); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceStateTableInit |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Initialize the device state table for  |  | ||||||
|  * 	 this TvDevice, pulling identifier info |  | ||||||
|  *       from the description Document.  Note that  |  | ||||||
|  *       knowledge of the service description is |  | ||||||
|  *       assumed.  State table variables and default |  | ||||||
|  *       values are currently hardcoded in this file |  | ||||||
|  *       rather than being read from service description |  | ||||||
|  *       documents. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   DescDocURL -- The description document URL |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceStateTableInit(char*); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceHandleSubscriptionRequest |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Called during a subscription request callback.  If the |  | ||||||
|  *       subscription request is for this device and either its |  | ||||||
|  *       control service or picture service, then accept it. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   sr_event -- The subscription request event structure |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceHandleSubscriptionRequest(struct Upnp_Subscription_Request *); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceHandleGetVarRequest |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Called during a get variable request callback.  If the |  | ||||||
|  *       request is for this device and either its control service |  | ||||||
|  *       or picture service, then respond with the variable value. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   cgv_event -- The control get variable request event structure |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceHandleGetVarRequest(struct Upnp_State_Var_Request *); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceHandleActionRequest |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Called during an action request callback.  If the |  | ||||||
|  *       request is for this device and either its control service |  | ||||||
|  *       or picture service, then perform the action and respond. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   ca_event -- The control action request event structure |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceHandleActionRequest(struct Upnp_Action_Request *); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceCallbackEventHandler |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       The callback handler registered with the SDK while registering |  | ||||||
|  *       root device.  Dispatches the request to the appropriate procedure |  | ||||||
|  *       based on the value of EventType. The four requests handled by the  |  | ||||||
|  *       device are:  |  | ||||||
|  *                   1) Event Subscription requests.   |  | ||||||
|  *                   2) Get Variable requests.  |  | ||||||
|  *                   3) Action requests. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  * |  | ||||||
|  *   EventType -- The type of callback event |  | ||||||
|  *   Event -- Data structure containing event data |  | ||||||
|  *   Cookie -- Optional data specified during callback registration |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceCallbackEventHandler(Upnp_EventType, void*, void*); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceSetServiceTableVar |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Update the TvDevice service state table, and notify all subscribed  |  | ||||||
|  *       control points of the updated state.  Note that since this function |  | ||||||
|  *       blocks on the mutex TVDevMutex, to avoid a hang this function should  |  | ||||||
|  *       not be called within any other function that currently has this mutex  |  | ||||||
|  *       locked. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   service -- The service number (TV_SERVICE_CONTROL or TV_SERVICE_PICTURE) |  | ||||||
|  *   variable -- The variable number (TV_CONTROL_POWER, TV_CONTROL_CHANNEL, |  | ||||||
|  *                   TV_CONTROL_VOLUME, TV_PICTURE_COLOR, TV_PICTURE_TINT, |  | ||||||
|  *                   TV_PICTURE_CONTRAST, or TV_PICTURE_BRIGHTNESS) |  | ||||||
|  *   value -- The string representation of the new value |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*); |  | ||||||
|  |  | ||||||
| //Control Service Actions |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDevicePowerOn |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Turn the power on. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  * |  | ||||||
|  *    IXML_Document * in - document of action request |  | ||||||
|  *    IXML_Document **out - action result |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,  |  | ||||||
| 		    OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDevicePowerOff |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Turn the power off. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *     |  | ||||||
|  *    IXML_Document * in - document of action request |  | ||||||
|  *    IXML_Document **out - action result |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 		     OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceSetChannel |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Change the channel, update the TvDevice control service |  | ||||||
|  *       state table, and notify all subscribed control points of the |  | ||||||
|  *       updated state. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *     |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 		       OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceIncreaseChannel |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Increase the channel.   |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			    OUT char **errorString); |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceDecreaseChannel |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Decrease the channel.   |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			    OUT char **errorString); |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceSetVolume |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Change the volume, update the TvDevice control service |  | ||||||
|  *       state table, and notify all subscribed control points of the |  | ||||||
|  *       updated state. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 		      OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceIncreaseVolume |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Increase the volume.  |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  * |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,  |  | ||||||
| 			   OUT char **errorString); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceDecreaseVolume |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Decrease the volume. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,  |  | ||||||
| 			   OUT char **errorString); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //Picture Service Actions |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceSetColor |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Change the color, update the TvDevice picture service |  | ||||||
|  *       state table, and notify all subscribed control points of the |  | ||||||
|  *       updated state. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 		     OUT char **errorString); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceIncreaseColor |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Increase the color. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  * |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,  |  | ||||||
| 			  OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceDecreaseColor |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Decrease the color.   |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,  |  | ||||||
| 			  OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceSetTint |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Change the tint, update the TvDevice picture service |  | ||||||
|  *       state table, and notify all subscribed control points of the |  | ||||||
|  *       updated state. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  * |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 		    OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceIncreaseTint |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Increase tint. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			 OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceDecreaseTint |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Decrease tint. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			 OUT char **errorString); |  | ||||||
|  |  | ||||||
| /***************************************************************************** |  | ||||||
|  * TvDeviceSetContrast |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Change the contrast, update the TvDevice picture service |  | ||||||
|  *       state table, and notify all subscribed control points of the |  | ||||||
|  *       updated state. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  ****************************************************************************/ |  | ||||||
| int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceIncreaseContrast |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  * |  | ||||||
|  *      Increase the contrast. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *        |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			     OUT char **errorString); |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceDecreaseContrast |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *      Decrease the contrast. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *           |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			     OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceSetBrightness |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Change the brightness, update the TvDevice picture service |  | ||||||
|  *       state table, and notify all subscribed control points of the |  | ||||||
|  *       updated state. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *   brightness -- The brightness value to change to. |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			  OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceIncreaseBrightness |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Increase brightness. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  * |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			       OUT char **errorString); |  | ||||||
|  |  | ||||||
| /****************************************************************************** |  | ||||||
|  * TvDeviceDecreaseBrightness |  | ||||||
|  * |  | ||||||
|  * Description:  |  | ||||||
|  *       Decrease brightnesss. |  | ||||||
|  * |  | ||||||
|  * Parameters: |  | ||||||
|  *    IXML_Document * in -  action request document |  | ||||||
|  *    IXML_Document **out - action result document |  | ||||||
|  *    char **errorString - errorString (in case action was unsuccessful) |  | ||||||
|  * |  | ||||||
|  *****************************************************************************/ |  | ||||||
| int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,  |  | ||||||
| 			       OUT char **errorString); |  | ||||||
|  |  | ||||||
| int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name, |  | ||||||
| 				  char *web_dir_path, print_string pfun); |  | ||||||
| int TvDeviceStop(); |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
| @@ -1362,7 +1362,7 @@ TvCtrlPointStart( print_string printFunctionPtr, | |||||||
|  |  | ||||||
|     ithread_mutex_init( &DeviceListMutex, 0 ); |     ithread_mutex_init( &DeviceListMutex, 0 ); | ||||||
|  |  | ||||||
|     SampleUtil_Print( "Initializing UPnP with ipaddress=%s port=%d", |     SampleUtil_Print( "Intializing UPnP with ipaddress=%s port=%d", | ||||||
|                       ip_address, port ); |                       ip_address, port ); | ||||||
|     rc = UpnpInit( ip_address, port ); |     rc = UpnpInit( ip_address, port ); | ||||||
|     if( UPNP_E_SUCCESS != rc ) { |     if( UPNP_E_SUCCESS != rc ) { | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ | |||||||
|   </specVersion> |   </specVersion> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|   <actionList> |   <actionList> | ||||||
| 
 | 
 | ||||||
|     <action> |     <action> | ||||||
| @@ -37,12 +38,6 @@ | |||||||
|       <name>SetChannel</name> |       <name>SetChannel</name> | ||||||
|       <argumentList> |       <argumentList> | ||||||
| 
 | 
 | ||||||
|         <argument> |  | ||||||
|         <name>Channel</name> |  | ||||||
|           <relatedStateVariable>Channel</relatedStateVariable> |  | ||||||
|           <direction>in</direction> |  | ||||||
|         </argument> |  | ||||||
| 
 |  | ||||||
|         <argument> |         <argument> | ||||||
|          <name>NewChannel</name> |          <name>NewChannel</name> | ||||||
|          <retval /> |          <retval /> | ||||||
| @@ -50,6 +45,11 @@ | |||||||
|          <direction>out</direction> |          <direction>out</direction> | ||||||
|         </argument> |         </argument> | ||||||
| 
 | 
 | ||||||
|  |         <argument> | ||||||
|  |         <name>Channel</name> | ||||||
|  |           <relatedStateVariable>Channel</relatedStateVariable> | ||||||
|  |           <direction>in</direction> | ||||||
|  |         </argument> | ||||||
|       </argumentList> |       </argumentList> | ||||||
|     </action> |     </action> | ||||||
| 
 | 
 | ||||||
| @@ -80,11 +80,6 @@ | |||||||
|     <action> |     <action> | ||||||
|       <name>SetVolume</name> |       <name>SetVolume</name> | ||||||
|       <argumentList> |       <argumentList> | ||||||
|         <argument> |  | ||||||
|         <name>Volume</name> |  | ||||||
|           <relatedStateVariable>Volume</relatedStateVariable> |  | ||||||
|           <direction>in</direction> |  | ||||||
|         </argument> |  | ||||||
| 
 | 
 | ||||||
|         <argument> |         <argument> | ||||||
|          <name>NewVolume</name> |          <name>NewVolume</name> | ||||||
| @@ -92,6 +87,11 @@ | |||||||
|          <relatedStateVariable>Volume</relatedStateVariable> |          <relatedStateVariable>Volume</relatedStateVariable> | ||||||
|          <direction>out</direction> |          <direction>out</direction> | ||||||
|          </argument> |          </argument> | ||||||
|  |         <argument> | ||||||
|  |         <name>Volume</name> | ||||||
|  |           <relatedStateVariable>Volume</relatedStateVariable> | ||||||
|  |           <direction>in</direction> | ||||||
|  |         </argument> | ||||||
|       </argumentList> |       </argumentList> | ||||||
|     </action> |     </action> | ||||||
| 
 | 
 | ||||||
| @@ -124,6 +124,9 @@ | |||||||
| 
 | 
 | ||||||
|   </actionList> |   </actionList> | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|   <serviceStateTable> |   <serviceStateTable> | ||||||
| 
 | 
 | ||||||
|     <stateVariable sendEvents="yes"> |     <stateVariable sendEvents="yes"> | ||||||
| @@ -12,12 +12,6 @@ | |||||||
|     <action> |     <action> | ||||||
|       <name>SetColor</name> |       <name>SetColor</name> | ||||||
|       <argumentList> |       <argumentList> | ||||||
|         <argument> |  | ||||||
|         <name>Color</name> |  | ||||||
|           <relatedStateVariable>Color</relatedStateVariable> |  | ||||||
|           <direction>in</direction> |  | ||||||
|         </argument> |  | ||||||
| 
 |  | ||||||
|         <argument> |         <argument> | ||||||
|         <name>NewColor</name> |         <name>NewColor</name> | ||||||
|           <retval /> |           <retval /> | ||||||
| @@ -25,6 +19,11 @@ | |||||||
|           <direction>out</direction> |           <direction>out</direction> | ||||||
|         </argument> |         </argument> | ||||||
| 
 | 
 | ||||||
|  |         <argument> | ||||||
|  |         <name>Color</name> | ||||||
|  |           <relatedStateVariable>Color</relatedStateVariable> | ||||||
|  |           <direction>in</direction> | ||||||
|  |         </argument> | ||||||
|       </argumentList> |       </argumentList> | ||||||
|     </action> |     </action> | ||||||
| 
 | 
 | ||||||
| @@ -55,11 +54,6 @@ | |||||||
|     <action> |     <action> | ||||||
|       <name>SetTint</name> |       <name>SetTint</name> | ||||||
|       <argumentList> |       <argumentList> | ||||||
|         <argument> |  | ||||||
|         <name>Tint</name> |  | ||||||
|           <relatedStateVariable>Tint</relatedStateVariable> |  | ||||||
|           <direction>in</direction> |  | ||||||
|         </argument> |  | ||||||
|          <argument> |          <argument> | ||||||
|         <name>NewTint</name> |         <name>NewTint</name> | ||||||
|           <retval /> |           <retval /> | ||||||
| @@ -67,6 +61,11 @@ | |||||||
|           <direction>out</direction> |           <direction>out</direction> | ||||||
|         </argument> |         </argument> | ||||||
| 
 | 
 | ||||||
|  |         <argument> | ||||||
|  |         <name>Tint</name> | ||||||
|  |           <relatedStateVariable>Tint</relatedStateVariable> | ||||||
|  |           <direction>in</direction> | ||||||
|  |         </argument> | ||||||
|       </argumentList> |       </argumentList> | ||||||
|     </action> |     </action> | ||||||
| 
 | 
 | ||||||
| @@ -97,17 +96,17 @@ | |||||||
|     <action> |     <action> | ||||||
|       <name>SetContrast</name> |       <name>SetContrast</name> | ||||||
|       <argumentList> |       <argumentList> | ||||||
|     	<argument> |  | ||||||
|         	<name>Contrast</name> |  | ||||||
| 	          <relatedStateVariable>Contrast</relatedStateVariable> |  | ||||||
|     	      <direction>in</direction> |  | ||||||
|        	</argument> |  | ||||||
|         <argument> |         <argument> | ||||||
|         <name>NewContrast</name> |         <name>NewContrast</name> | ||||||
|           <retval /> |           <retval /> | ||||||
|           <relatedStateVariable>Contrast</relatedStateVariable> |           <relatedStateVariable>Contrast</relatedStateVariable> | ||||||
|           <direction>out</direction> |           <direction>out</direction> | ||||||
|         </argument>   |         </argument>   | ||||||
|  |         <argument> | ||||||
|  |         <name>Contrast</name> | ||||||
|  |           <relatedStateVariable>Contrast</relatedStateVariable> | ||||||
|  |           <direction>in</direction> | ||||||
|  |         </argument> | ||||||
|       </argumentList> |       </argumentList> | ||||||
|     </action> |     </action> | ||||||
| 
 | 
 | ||||||
| @@ -138,17 +137,19 @@ | |||||||
|     <action> |     <action> | ||||||
|       <name>SetBrightness</name> |       <name>SetBrightness</name> | ||||||
|       <argumentList> |       <argumentList> | ||||||
| 		<argument> | 
 | ||||||
|         <name>Brightness</name> |  | ||||||
|           <relatedStateVariable>Brightness</relatedStateVariable> |  | ||||||
|           <direction>in</direction> |  | ||||||
|         </argument> |  | ||||||
|          <argument> |          <argument> | ||||||
|         <name>NewBrightness</name> |         <name>NewBrightness</name> | ||||||
|           <retval /> |           <retval /> | ||||||
|           <relatedStateVariable>Brightness</relatedStateVariable> |           <relatedStateVariable>Brightness</relatedStateVariable> | ||||||
|           <direction>out</direction> |           <direction>out</direction> | ||||||
|         </argument> |         </argument> | ||||||
|  | 
 | ||||||
|  |         <argument> | ||||||
|  |         <name>Brightness</name> | ||||||
|  |           <relatedStateVariable>Brightness</relatedStateVariable> | ||||||
|  |           <direction>in</direction> | ||||||
|  |         </argument> | ||||||
|       </argumentList> |       </argumentList> | ||||||
|     </action> |     </action> | ||||||
| 
 | 
 | ||||||
| @@ -181,6 +182,7 @@ | |||||||
|   </actionList> |   </actionList> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|   <serviceStateTable> |   <serviceStateTable> | ||||||
| 
 | 
 | ||||||
|     <stateVariable sendEvents="yes"> |     <stateVariable sendEvents="yes"> | ||||||
| @@ -1,37 +0,0 @@ | |||||||
| <?xml version="1.0"?> |  | ||||||
| <root xmlns="urn:schemas-upnp-org:device-1-0"> |  | ||||||
|   <specVersion> |  | ||||||
|     <major>1</major> |  | ||||||
|     <minor>0</minor> |  | ||||||
|   </specVersion> |  | ||||||
|   <device> |  | ||||||
|     <deviceType>urn:schemas-upnp-org:device:tvdevice:1</deviceType> |  | ||||||
|     <friendlyName>UPnP Television Emulator</friendlyName> |  | ||||||
|     <manufacturer>TV Manufacturer Name</manufacturer> |  | ||||||
|     <manufacturerURL>http://www.manufacturer.com</manufacturerURL> |  | ||||||
|     <modelDescription>UPnP Television Device Emulator 1.0</modelDescription> |  | ||||||
|     <modelName>TVEmulator</modelName> |  | ||||||
|     <modelNumber>1.0</modelNumber> |  | ||||||
|     <modelURL>http://www.manufacturer.com/TVEmulator/</modelURL> |  | ||||||
|     <serialNumber>123456789001</serialNumber> |  | ||||||
|     <UDN>uuid:Upnp-TVEmulator-1_0-1234567890002</UDN> |  | ||||||
|     <UPC>123456789</UPC> |  | ||||||
|     <serviceList> |  | ||||||
|       <service> |  | ||||||
|         <serviceType>urn:schemas-upnp-org:service:tvcontrol:1</serviceType> |  | ||||||
|         <serviceId>urn:upnp-org:serviceId:tvcontrol1</serviceId> |  | ||||||
|         <controlURL>/upnp/control/tvcontrol1</controlURL> |  | ||||||
|         <eventSubURL>/upnp/event/tvcontrol1</eventSubURL> |  | ||||||
|         <SCPDURL>/tvcontrolSCPD.xml</SCPDURL> |  | ||||||
|       </service> |  | ||||||
|       <service> |  | ||||||
|         <serviceType>urn:schemas-upnp-org:service:tvpicture:1</serviceType> |  | ||||||
|         <serviceId>urn:upnp-org:serviceId:tvpicture1</serviceId> |  | ||||||
|         <controlURL>/upnp/control/tvpicture1</controlURL> |  | ||||||
|         <eventSubURL>/upnp/event/tvpicture1</eventSubURL> |  | ||||||
|         <SCPDURL>/tvpictureSCPD.xml</SCPDURL> |  | ||||||
|       </service> |  | ||||||
|     </serviceList> |  | ||||||
|    <presentationURL>/tvdevicepres.html</presentationURL> |  | ||||||
| </device> |  | ||||||
| </root> |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -94,7 +94,6 @@ UpnpSetLogFileNames ( IN const char *ErrFileName, | |||||||
|  *						 |  *						 | ||||||
|  * Description:							 |  * Description:							 | ||||||
|  *	This functions initializes the log files |  *	This functions initializes the log files | ||||||
|  * |  | ||||||
|  * Returns: int |  * Returns: int | ||||||
|  *	-1 : If fails |  *	-1 : If fails | ||||||
|  *	UPNP_E_SUCCESS : if success |  *	UPNP_E_SUCCESS : if success | ||||||
| @@ -117,7 +116,7 @@ UpnpInitLog() | |||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|  * Function : UpnpSetLogLevel |  * Function : UpnpSetLogLevel | ||||||
|  *				 |  *				 | ||||||
|  * Parameters:	Upnp_LogLevel log_level |  * Parameters:	void | ||||||
|  * |  * | ||||||
|  * Description:							 |  * Description:							 | ||||||
|  *	This functions set the log level (see {\tt Upnp_LogLevel} |  *	This functions set the log level (see {\tt Upnp_LogLevel} | ||||||
| @@ -153,47 +152,11 @@ UpnpCloseLog() | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** |  | ||||||
|  * Function : DebugAtThisLevel					 |  | ||||||
|  *									 |  | ||||||
|  * Parameters:			 |  | ||||||
|  *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  |  | ||||||
|  *		whether debug statement will go to standard output,  |  | ||||||
|  *		or any of the log files. |  | ||||||
|  *	IN Dbg_Module Module: debug will go in the name of this module |  | ||||||
|  *					 |  | ||||||
|  * Description:					 |  | ||||||
|  *	This functions returns true if debug output should be done in this |  | ||||||
|  *	module. |  | ||||||
|  * |  | ||||||
|  * Returns: int |  | ||||||
|  ***************************************************************************/ |  | ||||||
| #ifdef DEBUG |  | ||||||
| int DebugAtThisLevel( |  | ||||||
| 	IN Upnp_LogLevel DLevel, |  | ||||||
| 	IN Dbg_Module Module) |  | ||||||
| { |  | ||||||
| 	int ret = DLevel <= g_log_level; |  | ||||||
| 	ret &= |  | ||||||
| 		DEBUG_ALL || |  | ||||||
| 		(Module == SSDP  && DEBUG_SSDP ) || |  | ||||||
| 		(Module == SOAP  && DEBUG_SOAP ) || |  | ||||||
| 		(Module == GENA  && DEBUG_GENA ) || |  | ||||||
| 		(Module == TPOOL && DEBUG_TPOOL) || |  | ||||||
| 		(Module == MSERV && DEBUG_MSERV) || |  | ||||||
| 		(Module == DOM   && DEBUG_DOM  ) || |  | ||||||
| 		(Module == HTTP  && DEBUG_HTTP ); |  | ||||||
| 	 |  | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|  * Function : UpnpPrintf					 |  * Function : UpnpPrintf					 | ||||||
|  *									 |  *									 | ||||||
|  * Parameters:			 |  * Parameters:			 | ||||||
|  *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  |  *	IN Dbg_Level DLevel: The level of the debug logging. It will decide  | ||||||
|  *		whether debug statement will go to standard output,  |  *		whether debug statement will go to standard output,  | ||||||
|  *		or any of the log files. |  *		or any of the log files. | ||||||
|  *	IN Dbg_Module Module: debug will go in the name of this module |  *	IN Dbg_Module Module: debug will go in the name of this module | ||||||
| @@ -210,53 +173,71 @@ int DebugAtThisLevel( | |||||||
|  *	statement is coming |  *	statement is coming | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY( void UpnpPrintf( IN Upnp_LogLevel DLevel, | ||||||
| void UpnpPrintf( |  | ||||||
| 	IN Upnp_LogLevel DLevel, |  | ||||||
|                           IN Dbg_Module Module, |                           IN Dbg_Module Module, | ||||||
|                           IN const char *DbgFileName, |                           IN const char *DbgFileName, | ||||||
|                           IN int DbgLineNo, |                           IN int DbgLineNo, | ||||||
|                           IN const char *FmtStr, |                           IN const char *FmtStr, | ||||||
| 	... ) |                           ... ) { | ||||||
| { |  | ||||||
|          va_list ArgList; |          va_list ArgList; | ||||||
| 	 |  | ||||||
| 	if (!DebugAtThisLevel(DLevel, Module)) { |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 	 |  | ||||||
| 	ithread_mutex_lock(&GlobalDebugMutex); |  | ||||||
|          va_start( ArgList, FmtStr ); |          va_start( ArgList, FmtStr ); | ||||||
| 	if (!DEBUG_TARGET) { |          if( g_log_level < DLevel ) return; if( DEBUG_ALL == 0 ) { | ||||||
|  |          switch ( Module ) { | ||||||
|  | case SSDP: | ||||||
|  |          if( DEBUG_SSDP == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; case SOAP: | ||||||
|  |          if( DEBUG_SOAP == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; case GENA: | ||||||
|  |          if( DEBUG_GENA == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; case TPOOL: | ||||||
|  |          if( DEBUG_TPOOL == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; case MSERV: | ||||||
|  |          if( DEBUG_MSERV == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; case DOM: | ||||||
|  |          if( DEBUG_DOM == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; case HTTP: | ||||||
|  |          if( DEBUG_HTTP == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; case API: | ||||||
|  |          if( DEBUG_API == 1 ) break; | ||||||
|  |          else | ||||||
|  | return; default: | ||||||
|  |          return;} | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          ithread_mutex_lock( &GlobalDebugMutex ); if( DEBUG_TARGET == 0 ) { | ||||||
|          if( DbgFileName ) { |          if( DbgFileName ) { | ||||||
| 			UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo); |          UpnpDisplayFileAndLine( stdout, DbgFileName, DbgLineNo );} | ||||||
| 		} |          vfprintf( stdout, FmtStr, ArgList ); fflush( stdout );} | ||||||
| 		vfprintf(stdout, FmtStr, ArgList); |          else | ||||||
| 		fflush(stdout); |          { | ||||||
| 	} else if (DLevel == 0) { |          if( DLevel == 0 ) { | ||||||
|          if( DbgFileName ) { |          if( DbgFileName ) { | ||||||
| 			UpnpDisplayFileAndLine(ErrFileHnd, DbgFileName, DbgLineNo); |          UpnpDisplayFileAndLine( ErrFileHnd, DbgFileName, DbgLineNo );} | ||||||
| 		} |          vfprintf( ErrFileHnd, FmtStr, ArgList ); fflush( ErrFileHnd );} | ||||||
| 		vfprintf(ErrFileHnd, FmtStr, ArgList); |          else | ||||||
| 		fflush(ErrFileHnd); |          { | ||||||
| 	} else { |  | ||||||
|          if( DbgFileName ) { |          if( DbgFileName ) { | ||||||
| 			UpnpDisplayFileAndLine(InfoFileHnd, DbgFileName, DbgLineNo); |          UpnpDisplayFileAndLine( InfoFileHnd, DbgFileName, DbgLineNo );} | ||||||
|  |          vfprintf( InfoFileHnd, FmtStr, ArgList ); fflush( InfoFileHnd );} | ||||||
|          } |          } | ||||||
| 		vfprintf(InfoFileHnd, FmtStr, ArgList); |          va_end( ArgList ); ithread_mutex_unlock( &GlobalDebugMutex );} | ||||||
| 		fflush(InfoFileHnd); |  | ||||||
| 	} |  ) | ||||||
| 	va_end(ArgList); |  | ||||||
| 	ithread_mutex_unlock(&GlobalDebugMutex); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
|  * Function : UpnpGetDebugFile					 |  * Function : UpnpGetDebugFile					 | ||||||
|  *				 |  *				 | ||||||
|  * Parameters:			 |  * Parameters:			 | ||||||
|  *	IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide  |  *	IN Dbg_Level DLevel: The level of the debug logging. It will decide  | ||||||
|  *		whether debug statement will go to standard output,  |  *		whether debug statement will go to standard output,  | ||||||
|  *		or any of the log files. |  *		or any of the log files. | ||||||
|  *	IN Dbg_Module Module: debug will go in the name of this module |  *	IN Dbg_Module Module: debug will go in the name of this module | ||||||
| @@ -268,26 +249,46 @@ void UpnpPrintf( | |||||||
|  *	NULL : if the module is turn off for debug  |  *	NULL : if the module is turn off for debug  | ||||||
|  *	else returns the right file descriptor |  *	else returns the right file descriptor | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG |     DBGONLY( FILE * GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module ) { | ||||||
| FILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module ) |              if( g_log_level < DLevel ) return NULL; if( DEBUG_ALL == 0 ) { | ||||||
|  |              switch ( Module ) { | ||||||
|  | case SSDP: | ||||||
|  |              if( DEBUG_SSDP == 1 ) break; | ||||||
|  |              else | ||||||
|  | return NULL; case SOAP: | ||||||
|  |              if( DEBUG_SOAP == 1 ) break; | ||||||
|  |              else | ||||||
|  | return NULL; case GENA: | ||||||
|  |              if( DEBUG_GENA == 1 ) break; | ||||||
|  |              else | ||||||
|  | return NULL; case TPOOL: | ||||||
|  |              if( DEBUG_TPOOL == 1 ) break; | ||||||
|  |              else | ||||||
|  | return NULL; case MSERV: | ||||||
|  |              if( DEBUG_MSERV == 1 ) break; | ||||||
|  |              else | ||||||
|  | return NULL; case DOM: | ||||||
|  |              if( DEBUG_DOM == 1 ) break; | ||||||
|  |              else | ||||||
|  | return NULL; case API: | ||||||
|  |              if( DEBUG_API == 1 ) break; | ||||||
|  |              else | ||||||
|  | return NULL; default: | ||||||
|  |              return NULL;} | ||||||
|  |              } | ||||||
|  |  | ||||||
|  |              if( DEBUG_TARGET == 0 ) { | ||||||
|  |              return stdout;} | ||||||
|  |              else | ||||||
|              { |              { | ||||||
| 	FILE *ret; |              if( DLevel == 0 ) { | ||||||
|  |              return ErrFileHnd;} | ||||||
| 	if (!DebugAtThisLevel(DLevel, Module)) { |              else | ||||||
| 		ret = NULL; |              { | ||||||
|  |              return InfoFileHnd;} | ||||||
|              } |              } | ||||||
| 	 |  | ||||||
| 	if (!DEBUG_TARGET) { |  | ||||||
| 		ret = stdout; |  | ||||||
| 	} else if (DLevel == 0) { |  | ||||||
| 		ret = ErrFileHnd; |  | ||||||
| 	} else { |  | ||||||
| 		ret = InfoFileHnd; |  | ||||||
|              } |              } | ||||||
|  |  ) | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
| @@ -304,26 +305,17 @@ FILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module ) | |||||||
|  *		debug statement is coming to the log file |  *		debug statement is coming to the log file | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG |     DBGONLY( void UpnpDisplayFileAndLine( IN FILE * fd, | ||||||
| void UpnpDisplayFileAndLine( |  | ||||||
| 	IN FILE * fd, |  | ||||||
|                                           IN const char *DbgFileName, |                                           IN const char *DbgFileName, | ||||||
| 	IN int DbgLineNo) |                                           IN int DbgLineNo ) { | ||||||
| { |  | ||||||
|              int starlength = 66; |              int starlength = 66; | ||||||
|              const char *lines[2]; |              const char *lines[2]; | ||||||
| 	char FileAndLine[500]; |              char FileAndLine[500]; lines[0] = "DEBUG"; if( DbgFileName ) { | ||||||
| 	lines[0] = "DEBUG"; |              sprintf( FileAndLine, "FILE: %s, LINE: %d", DbgFileName, | ||||||
| 	if (DbgFileName) { |                       DbgLineNo ); lines[1] = FileAndLine;} | ||||||
| 		sprintf(FileAndLine, |  | ||||||
| 			"FILE: %s, LINE: %d", |              UpnpDisplayBanner( fd, lines, 2, starlength ); fflush( fd );} | ||||||
| 			DbgFileName, DbgLineNo); |  ) | ||||||
| 		lines[1] = FileAndLine; |  | ||||||
| 	} |  | ||||||
| 	UpnpDisplayBanner(fd, lines, 2, starlength); |  | ||||||
| 	fflush(fd); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /*************************************************************************** | /*************************************************************************** | ||||||
| @@ -340,58 +332,47 @@ void UpnpDisplayFileAndLine( | |||||||
|  *	per the requested banner |  *	per the requested banner | ||||||
|  * Returns: void |  * Returns: void | ||||||
|  ***************************************************************************/ |  ***************************************************************************/ | ||||||
| #ifdef DEBUG |     DBGONLY( void UpnpDisplayBanner( IN FILE * fd, | ||||||
| void UpnpDisplayBanner( |  | ||||||
| 	IN FILE * fd, |  | ||||||
|                                      IN const char **lines, |                                      IN const char **lines, | ||||||
|                                      IN size_t size, |                                      IN size_t size, | ||||||
| 	IN int starLength) |                                      IN int starLength ) { | ||||||
| { |              char *stars = ( char * )malloc( starLength + 1 ); | ||||||
|  |              const char *line = NULL; | ||||||
|              int leftMarginLength = starLength / 2 + 1; |              int leftMarginLength = starLength / 2 + 1; | ||||||
|              int rightMarginLength = starLength / 2 + 1; |              int rightMarginLength = starLength / 2 + 1; | ||||||
| 	int i = 0; |  | ||||||
| 	int LineSize = 0; |  | ||||||
| 	int starLengthMinus2 = starLength - 2; |  | ||||||
|  |  | ||||||
|              char *leftMargin = ( char * )malloc( leftMarginLength ); |              char *leftMargin = ( char * )malloc( leftMarginLength ); | ||||||
|              char *rightMargin = ( char * )malloc( rightMarginLength ); |              char *rightMargin = ( char * )malloc( rightMarginLength ); | ||||||
| 	char *stars = ( char * )malloc( starLength + 1 ); |              int i = 0; | ||||||
|  |              int LineSize = 0; | ||||||
|              char *currentLine = ( char * )malloc( starLength + 1 ); |              char *currentLine = ( char * )malloc( starLength + 1 ); | ||||||
| 	const char *line = NULL; |  | ||||||
|  |  | ||||||
|              memset( stars, '*', starLength ); |              memset( stars, '*', starLength ); | ||||||
|              stars[starLength] = 0; |              stars[starLength] = 0; | ||||||
|              memset( leftMargin, 0, leftMarginLength ); |              memset( leftMargin, 0, leftMarginLength ); | ||||||
|              memset( rightMargin, 0, rightMarginLength ); |              memset( rightMargin, 0, rightMarginLength ); | ||||||
| 	fprintf( fd, "\n%s\n", stars ); |              fprintf( fd, "\n%s\n", stars ); for( i = 0; i < size; i++ ) { | ||||||
| 	for( i = 0; i < size; i++ ) { |  | ||||||
|              LineSize = strlen( lines[i] ); |              LineSize = strlen( lines[i] ); | ||||||
| 		line = lines[i]; |              line = lines[i]; while( LineSize > ( starLength - 2 ) ) { | ||||||
| 		while( LineSize > starLengthMinus2 ) { |              memcpy( currentLine, line, ( starLength - 2 ) ); | ||||||
| 			memcpy( currentLine, line, starLengthMinus2 ); |              currentLine[( starLength - 2 )] = 0; | ||||||
| 			currentLine[starLengthMinus2] = 0; |  | ||||||
|              fprintf( fd, "*%s*\n", currentLine ); |              fprintf( fd, "*%s*\n", currentLine ); | ||||||
| 			LineSize -= starLengthMinus2; |              LineSize -= ( starLength - 2 ); line += ( starLength - 2 );} | ||||||
| 			line += starLengthMinus2; |  | ||||||
| 		} |  | ||||||
| 		leftMarginLength = (starLengthMinus2 - LineSize)/2; |  | ||||||
|              if( LineSize % 2 == 0 ) { |              if( LineSize % 2 == 0 ) { | ||||||
| 			rightMarginLength = leftMarginLength; |              leftMarginLength = rightMarginLength = | ||||||
| 		} else { |              ( ( starLength - 2 ) - LineSize ) / 2;} | ||||||
| 			rightMarginLength = leftMarginLength + 1; |              else | ||||||
| 		} |              { | ||||||
|  |              leftMarginLength = ( ( starLength - 2 ) - LineSize ) / 2; | ||||||
|  |              rightMarginLength = | ||||||
|  |              ( ( starLength - 2 ) - LineSize ) / 2 + 1;} | ||||||
|  |  | ||||||
|              memset( leftMargin, ' ', leftMarginLength ); |              memset( leftMargin, ' ', leftMarginLength ); | ||||||
|              memset( rightMargin, ' ', rightMarginLength ); |              memset( rightMargin, ' ', rightMarginLength ); | ||||||
|              leftMargin[leftMarginLength] = 0; |              leftMargin[leftMarginLength] = 0; | ||||||
|              rightMargin[rightMarginLength] = 0; |              rightMargin[rightMarginLength] = 0; | ||||||
| 		fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin ); |              fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin );} | ||||||
| 	} |  | ||||||
|              fprintf( fd, "%s\n\n", stars ); |              fprintf( fd, "%s\n\n", stars ); | ||||||
|  |  | ||||||
| 	free( currentLine ); |  | ||||||
| 	free( stars ); |  | ||||||
| 	free( rightMargin ); |  | ||||||
|              free( leftMargin ); |              free( leftMargin ); | ||||||
| } |              free( rightMargin ); free( stars ); free( currentLine );} | ||||||
| #endif |  ) | ||||||
|   |  | ||||||
|   | |||||||
| @@ -44,7 +44,7 @@ struct ErrorString { | |||||||
|  |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Initializing the array of error structures.  | //Intializing the array of error structures.  | ||||||
| struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"}, | struct ErrorString ErrorMessages[] = { {UPNP_E_SUCCESS, "UPNP_E_SUCCESS"}, | ||||||
| {UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"}, | {UPNP_E_INVALID_HANDLE, "UPNP_E_INVALID_HANDLE"}, | ||||||
| {UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"}, | {UPNP_E_INVALID_PARAM, "UPNP_E_INVALID_PARAM"}, | ||||||
| @@ -256,8 +256,8 @@ makeAction( IN int response, | |||||||
|             IN const char *Arg, |             IN const char *Arg, | ||||||
|             IN va_list ArgList ) |             IN va_list ArgList ) | ||||||
| { | { | ||||||
|     const char *ArgName; |     const char *ArgName, | ||||||
|     const char *ArgValue; |      *ArgValue; | ||||||
|     char *ActBuff; |     char *ActBuff; | ||||||
|     int Idx = 0; |     int Idx = 0; | ||||||
|     IXML_Document *ActionDoc; |     IXML_Document *ActionDoc; | ||||||
| @@ -298,7 +298,7 @@ makeAction( IN int response, | |||||||
|     if( NumArg > 0 ) { |     if( NumArg > 0 ) { | ||||||
|         //va_start(ArgList, Arg); |         //va_start(ArgList, Arg); | ||||||
|         ArgName = Arg; |         ArgName = Arg; | ||||||
|         for ( ; ; ) { |         while( Idx++ != NumArg ) { | ||||||
|             ArgValue = va_arg( ArgList, const char * ); |             ArgValue = va_arg( ArgList, const char * ); | ||||||
|  |  | ||||||
|             if( ArgName != NULL ) { |             if( ArgName != NULL ) { | ||||||
| @@ -313,11 +313,7 @@ makeAction( IN int response, | |||||||
|                 ixmlNode_appendChild( node, ( IXML_Node * ) Ele ); |                 ixmlNode_appendChild( node, ( IXML_Node * ) Ele ); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (++Idx < NumArg) { |  | ||||||
|             ArgName = va_arg( ArgList, const char * ); |             ArgName = va_arg( ArgList, const char * ); | ||||||
|             } else { |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         //va_end(ArgList); |         //va_end(ArgList); | ||||||
|     } |     } | ||||||
| @@ -581,5 +577,4 @@ UpnpCreatePropertySet( IN int NumArg, | |||||||
|     return PropSet; |     return PropSet; | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif // EXCLUDE_DOM == 0 | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -93,29 +93,32 @@ genaCallback( IN http_parser_t * parser, | |||||||
|     xboolean found_function = FALSE; |     xboolean found_function = FALSE; | ||||||
|  |  | ||||||
|     if( request->method == HTTPMETHOD_SUBSCRIBE ) { |     if( request->method == HTTPMETHOD_SUBSCRIBE ) { | ||||||
| #ifdef INCLUDE_DEVICE_APIS |         DEVICEONLY( found_function = TRUE; | ||||||
|         found_function = TRUE; |                     if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) | ||||||
|         if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) { |                     { | ||||||
|                     // renew subscription |                     // renew subscription | ||||||
|                     gena_process_subscription_renewal_request |                     gena_process_subscription_renewal_request | ||||||
|             ( info, request ); |                     ( info, request );} | ||||||
| 	} else { |                     else | ||||||
|  |                     { | ||||||
|                     // subscribe |                     // subscribe | ||||||
|             gena_process_subscription_request( info, request ); |                     gena_process_subscription_request( info, request );} | ||||||
|  |  | ||||||
|  |                     DBGONLY( UpnpPrintf | ||||||
|  |                              ( UPNP_ALL, GENA, __FILE__, __LINE__, | ||||||
|  |                                "got subscription request\n" ); ) | ||||||
|  |              ) | ||||||
|             } |             } | ||||||
|         UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__, |             else | ||||||
|             "got subscription request\n" ); |         if( request->method == HTTPMETHOD_UNSUBSCRIBE ) { | ||||||
|     } else if( request->method == HTTPMETHOD_UNSUBSCRIBE ) { |             DEVICEONLY( found_function = TRUE; | ||||||
|         found_function = TRUE; |  | ||||||
|                         // unsubscribe |                         // unsubscribe | ||||||
|         gena_process_unsubscribe_request( info, request ); |                         gena_process_unsubscribe_request( info, | ||||||
| #endif |                                                           request ); ) | ||||||
|         } else if( request->method == HTTPMETHOD_NOTIFY ) { |         } else if( request->method == HTTPMETHOD_NOTIFY ) { | ||||||
| #ifdef INCLUDE_CLIENT_APIS |             CLIENTONLY( found_function = TRUE; | ||||||
|         found_function = TRUE; |  | ||||||
|                         // notify |                         // notify | ||||||
|         gena_process_notification_event( info, request ); |                         gena_process_notification_event( info, request ); ) | ||||||
| #endif |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if( !found_function ) { |         if( !found_function ) { | ||||||
| @@ -124,4 +127,3 @@ genaCallback( IN http_parser_t * parser, | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| #endif // EXCLUDE_GENA | #endif // EXCLUDE_GENA | ||||||
|  |  | ||||||
|   | |||||||
| @@ -72,14 +72,14 @@ GenaAutoRenewSubscription( IN void *input ) | |||||||
|     int eventType = 0; |     int eventType = 0; | ||||||
|  |  | ||||||
|     if( AUTO_RENEW_TIME == 0 ) { |     if( AUTO_RENEW_TIME == 0 ) { | ||||||
|         UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|             "GENA SUB EXPIRED" ); |                              "GENA SUB EXPIRED" ) ); | ||||||
|         sub_struct->ErrCode = UPNP_E_SUCCESS; |         sub_struct->ErrCode = UPNP_E_SUCCESS; | ||||||
|         send_callback = 1; |         send_callback = 1; | ||||||
|         eventType = UPNP_EVENT_SUBSCRIPTION_EXPIRED; |         eventType = UPNP_EVENT_SUBSCRIPTION_EXPIRED; | ||||||
|     } else { |     } else { | ||||||
|         UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|             "GENA AUTO RENEW" ); |                              "GENA AUTO RENEW" ) ); | ||||||
|         if( ( ( sub_struct->ErrCode = genaRenewSubscription( event->handle, |         if( ( ( sub_struct->ErrCode = genaRenewSubscription( event->handle, | ||||||
|                                                              sub_struct-> |                                                              sub_struct-> | ||||||
|                                                              Sid, |                                                              Sid, | ||||||
| @@ -93,14 +93,14 @@ GenaAutoRenewSubscription( IN void *input ) | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     if( send_callback ) { |     if( send_callback ) { | ||||||
|         HandleReadLock(); |         HandleLock(  ); | ||||||
|         if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) { |         if( GetHandleInfo( event->handle, &handle_info ) != HND_CLIENT ) { | ||||||
|             HandleUnlock(  ); |             HandleUnlock(  ); | ||||||
|             free_upnp_timeout( event ); |             free_upnp_timeout( event ); | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|             "HANDLE IS VALID" ); |                              "HANDLE IS VALID" ) ); | ||||||
|         callback_fun = handle_info->Callback; |         callback_fun = handle_info->Callback; | ||||||
|         cookie = handle_info->Cookie; |         cookie = handle_info->Cookie; | ||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
| @@ -449,7 +449,6 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle ) | |||||||
| *	return UPNP_E_SUCCESS if service response is OK else  | *	return UPNP_E_SUCCESS if service response is OK else  | ||||||
| *	returns appropriate error | *	returns appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_CLIENT_APIS |  | ||||||
| int | int | ||||||
| genaUnSubscribe( IN UpnpClient_Handle client_handle, | genaUnSubscribe( IN UpnpClient_Handle client_handle, | ||||||
|                  IN const Upnp_SID in_sid ) |                  IN const Upnp_SID in_sid ) | ||||||
| @@ -502,7 +501,6 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle, | |||||||
|  |  | ||||||
|     return return_code; |     return return_code; | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| * Function : genaSubscribe | * Function : genaSubscribe | ||||||
| @@ -526,7 +524,6 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle, | |||||||
| *	return UPNP_E_SUCCESS if service response is OK else  | *	return UPNP_E_SUCCESS if service response is OK else  | ||||||
| *	returns appropriate error | *	returns appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_CLIENT_APIS |  | ||||||
| int | int | ||||||
| genaSubscribe( IN UpnpClient_Handle client_handle, | genaSubscribe( IN UpnpClient_Handle client_handle, | ||||||
|                IN char *PublisherURL, |                IN char *PublisherURL, | ||||||
| @@ -541,12 +538,12 @@ genaSubscribe( IN UpnpClient_Handle client_handle, | |||||||
|     struct Handle_Info *handle_info; |     struct Handle_Info *handle_info; | ||||||
|     char *EventURL = NULL; |     char *EventURL = NULL; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "GENA SUBSCRIBE BEGIN" ); |                          "GENA SUBSCRIBE BEGIN" ) ); | ||||||
|  |     HandleLock(  ); | ||||||
|  |  | ||||||
|     memset( out_sid, 0, sizeof( Upnp_SID ) ); |     memset( out_sid, 0, sizeof( Upnp_SID ) ); | ||||||
|  |  | ||||||
|     HandleReadLock(); |  | ||||||
|     // validate handle |     // validate handle | ||||||
|     if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { |     if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
| @@ -560,9 +557,9 @@ genaSubscribe( IN UpnpClient_Handle client_handle, | |||||||
|         gena_subscribe( PublisherURL, TimeOut, NULL, &ActualSID ); |         gena_subscribe( PublisherURL, TimeOut, NULL, &ActualSID ); | ||||||
|     HandleLock(  ); |     HandleLock(  ); | ||||||
|     if( return_code != UPNP_E_SUCCESS ) { |     if( return_code != UPNP_E_SUCCESS ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__, | ||||||
|                              "SUBSCRIBE FAILED in transfer error code: %d returned\n", |                              "SUBSCRIBE FAILED in transfer error code: %d returned\n", | ||||||
|             return_code ); |                              return_code ) ); | ||||||
|         goto error_handler; |         goto error_handler; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -612,7 +609,6 @@ genaSubscribe( IN UpnpClient_Handle client_handle, | |||||||
|     SubscribeUnlock(  ); |     SubscribeUnlock(  ); | ||||||
|     return return_code; |     return return_code; | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| * Function : genaRenewSubscription | * Function : genaRenewSubscription | ||||||
| @@ -667,8 +663,8 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle, | |||||||
|         free_upnp_timeout( ( upnp_timeout * ) tempJob.arg ); |         free_upnp_timeout( ( upnp_timeout * ) tempJob.arg ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "REMOVED AUTO RENEW  EVENT" ); |                          "REMOVED AUTO RENEW  EVENT" ) ); | ||||||
|  |  | ||||||
|     sub->RenewEventId = -1; |     sub->RenewEventId = -1; | ||||||
|     return_code = copy_client_subscription( sub, &sub_copy ); |     return_code = copy_client_subscription( sub, &sub_copy ); | ||||||
| @@ -881,4 +877,3 @@ gena_process_notification_event( IN SOCKINFO * info, | |||||||
|  |  | ||||||
| #endif // INCLUDE_CLIENT_APIS | #endif // INCLUDE_CLIENT_APIS | ||||||
| #endif // EXCLUDE_GENA | #endif // EXCLUDE_GENA | ||||||
|  |  | ||||||
|   | |||||||
| @@ -65,9 +65,9 @@ genaUnregisterDevice( IN UpnpDevice_Handle device_handle ) | |||||||
|     HandleLock(  ); |     HandleLock(  ); | ||||||
|     if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) { |     if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) { | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__, | ||||||
|                              "genaUnregisterDevice : BAD Handle : %d\n", |                              "genaUnregisterDevice : BAD Handle : %d\n", | ||||||
|             device_handle ); |                              device_handle ) ); | ||||||
|  |  | ||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
|         return GENA_E_BAD_HANDLE; |         return GENA_E_BAD_HANDLE; | ||||||
| @@ -188,7 +188,7 @@ free_notify_struct( IN notify_thread_struct * input ) | |||||||
| * | * | ||||||
| *	Note : called by genaNotify | *	Note : called by genaNotify | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| notify_send_and_recv( IN uri_type * destination_url, | notify_send_and_recv( IN uri_type * destination_url, | ||||||
|                       IN membuffer * mid_msg, |                       IN membuffer * mid_msg, | ||||||
|                       IN char *propertySet, |                       IN char *propertySet, | ||||||
| @@ -203,10 +203,10 @@ notify_send_and_recv( IN uri_type * destination_url, | |||||||
|     SOCKINFO info; |     SOCKINFO info; | ||||||
|  |  | ||||||
|     // connect |     // connect | ||||||
|     UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__, | ||||||
|                          "gena notify to: %.*s\n", |                          "gena notify to: %.*s\n", | ||||||
|         (int)destination_url->hostport.text.size, |                          destination_url->hostport.text.size, | ||||||
|         destination_url->hostport.text.buff ); |                          destination_url->hostport.text.buff ); ) | ||||||
|  |  | ||||||
|         conn_fd = http_Connect( destination_url, &url ); |         conn_fd = http_Connect( destination_url, &url ); | ||||||
|     if( conn_fd < 0 ) { |     if( conn_fd < 0 ) { | ||||||
| @@ -365,7 +365,7 @@ genaNotifyThread( IN void *input ) | |||||||
|     struct Handle_Info *handle_info; |     struct Handle_Info *handle_info; | ||||||
|     ThreadPoolJob job; |     ThreadPoolJob job; | ||||||
|  |  | ||||||
|     HandleReadLock(); |     HandleLock(  ); | ||||||
|     //validate context |     //validate context | ||||||
|  |  | ||||||
|     if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { |     if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { | ||||||
| @@ -477,8 +477,8 @@ genaInitNotify( IN UpnpDevice_Handle device_handle, | |||||||
|  |  | ||||||
|     notify_thread_struct *thread_struct = NULL; |     notify_thread_struct *thread_struct = NULL; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "GENA BEGIN INITIAL NOTIFY " ); |                          "GENA BEGIN INITIAL NOTIFY " ) ); | ||||||
|  |  | ||||||
|     reference_count = ( int * )malloc( sizeof( int ) ); |     reference_count = ( int * )malloc( sizeof( int ) ); | ||||||
|  |  | ||||||
| @@ -523,9 +523,9 @@ genaInitNotify( IN UpnpDevice_Handle device_handle, | |||||||
|         return GENA_E_BAD_SERVICE; |         return GENA_E_BAD_SERVICE; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                          "FOUND SERVICE IN INIT NOTFY: UDN %s, ServID: %s ", |                          "FOUND SERVICE IN INIT NOTFY: UDN %s, ServID: %s ", | ||||||
|         UDN, servId ); |                          UDN, servId ) ); | ||||||
|  |  | ||||||
|     if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) || |     if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) || | ||||||
|         ( sub->active ) ) { |         ( sub->active ) ) { | ||||||
| @@ -536,8 +536,9 @@ genaInitNotify( IN UpnpDevice_Handle device_handle, | |||||||
|         return GENA_E_BAD_SID; |         return GENA_E_BAD_SID; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ", sid ); |                          "FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ", | ||||||
|  |                          sid ) ); | ||||||
|  |  | ||||||
|     sub->active = 1; |     sub->active = 1; | ||||||
|  |  | ||||||
| @@ -552,9 +553,9 @@ genaInitNotify( IN UpnpDevice_Handle device_handle, | |||||||
|         return return_code; |         return return_code; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                          "GENERATED PROPERY SET IN INIT NOTIFY: \n'%s'\n", |                          "GENERATED PROPERY SET IN INIT NOTIFY: \n'%s'\n", | ||||||
|         propertySet ); |                          propertySet ) ); | ||||||
|  |  | ||||||
|     headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) + |     headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) + | ||||||
|         strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH + |         strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH + | ||||||
| @@ -573,7 +574,7 @@ genaInitNotify( IN UpnpDevice_Handle device_handle, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: " |     sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: " | ||||||
|              "%"PRIzu"\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n", |              "%zd\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n", | ||||||
|              strlen( propertySet ) + 1 ); |              strlen( propertySet ) + 1 ); | ||||||
|  |  | ||||||
|     //schedule thread for initial notification |     //schedule thread for initial notification | ||||||
| @@ -667,8 +668,8 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle, | |||||||
|  |  | ||||||
|     notify_thread_struct *thread_struct = NULL; |     notify_thread_struct *thread_struct = NULL; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "GENA BEGIN INITIAL NOTIFY EXT" ); |                          "GENA BEGIN INITIAL NOTIFY EXT" ) ); | ||||||
|     reference_count = ( int * )malloc( sizeof( int ) ); |     reference_count = ( int * )malloc( sizeof( int ) ); | ||||||
|  |  | ||||||
|     if( reference_count == NULL ) { |     if( reference_count == NULL ) { | ||||||
| @@ -711,9 +712,9 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle, | |||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
|         return GENA_E_BAD_SERVICE; |         return GENA_E_BAD_SERVICE; | ||||||
|     } |     } | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                          "FOUND SERVICE IN INIT NOTFY EXT: UDN %s, ServID: %s\n", |                          "FOUND SERVICE IN INIT NOTFY EXT: UDN %s, ServID: %s\n", | ||||||
|         UDN, servId ); |                          UDN, servId ) ); | ||||||
|  |  | ||||||
|     if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) || |     if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) || | ||||||
|         ( sub->active ) ) { |         ( sub->active ) ) { | ||||||
| @@ -723,8 +724,9 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle, | |||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
|         return GENA_E_BAD_SID; |         return GENA_E_BAD_SID; | ||||||
|     } |     } | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s", sid ); |                          "FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s", | ||||||
|  |                          sid ) ); | ||||||
|  |  | ||||||
|     sub->active = 1; |     sub->active = 1; | ||||||
|  |  | ||||||
| @@ -737,9 +739,9 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle, | |||||||
|         return UPNP_E_INVALID_PARAM; |         return UPNP_E_INVALID_PARAM; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                          "GENERATED PROPERY SET IN INIT EXT NOTIFY: %s", |                          "GENERATED PROPERY SET IN INIT EXT NOTIFY: %s", | ||||||
|         propertySet ); |                          propertySet ) ); | ||||||
|  |  | ||||||
|     headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) + |     headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) + | ||||||
|         strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH + |         strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH + | ||||||
| @@ -1315,8 +1317,8 @@ gena_process_subscription_request( IN SOCKINFO * info, | |||||||
|     memptr callback_hdr; |     memptr callback_hdr; | ||||||
|     memptr timeout_hdr; |     memptr timeout_hdr; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|         "Subscription Request Received:\n" ); |                          "Subscription Request Received:\n" ) ); | ||||||
|  |  | ||||||
|     if( httpmsg_find_hdr( request, HDR_NT, &nt_hdr ) == NULL ) { |     if( httpmsg_find_hdr( request, HDR_NT, &nt_hdr ) == NULL ) { | ||||||
|         error_respond( info, HTTP_BAD_REQUEST, request ); |         error_respond( info, HTTP_BAD_REQUEST, request ); | ||||||
| @@ -1345,9 +1347,10 @@ gena_process_subscription_request( IN SOCKINFO * info, | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                          "SubscriptionRequest for event URL path: %s\n", |                          "SubscriptionRequest for event URL path: %s\n", | ||||||
|                          event_url_path ); |                          event_url_path ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         HandleLock(  ); |         HandleLock(  ); | ||||||
|  |  | ||||||
| @@ -1368,11 +1371,11 @@ gena_process_subscription_request( IN SOCKINFO * info, | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                          "Subscription Request: Number of Subscriptions already %d\n " |                          "Subscription Request: Number of Subscriptions already %d\n " | ||||||
|                          "Max Subscriptions allowed: %d\n", |                          "Max Subscriptions allowed: %d\n", | ||||||
|                          service->TotalSubscriptions, |                          service->TotalSubscriptions, | ||||||
|         handle_info->MaxSubscriptions ); |                          handle_info->MaxSubscriptions ) ); | ||||||
|  |  | ||||||
|     // too many subscriptions |     // too many subscriptions | ||||||
|     if( handle_info->MaxSubscriptions != -1 && |     if( handle_info->MaxSubscriptions != -1 && | ||||||
| @@ -1545,11 +1548,12 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info, | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                          "Renew request: Number of subscriptions already: %d\n " |                          "Renew request: Number of subscriptions already: %d\n " | ||||||
|                          "Max Subscriptions allowed:%d\n", |                          "Max Subscriptions allowed:%d\n", | ||||||
|                          service->TotalSubscriptions, |                          service->TotalSubscriptions, | ||||||
|                          handle_info->MaxSubscriptions ); |                          handle_info->MaxSubscriptions ); | ||||||
|  |          ) | ||||||
|         // too many subscriptions |         // too many subscriptions | ||||||
|         if( handle_info->MaxSubscriptions != -1 && |         if( handle_info->MaxSubscriptions != -1 && | ||||||
|             service->TotalSubscriptions > handle_info->MaxSubscriptions ) { |             service->TotalSubscriptions > handle_info->MaxSubscriptions ) { | ||||||
|   | |||||||
| @@ -174,8 +174,10 @@ dispatch_request( IN SOCKINFO * info, | |||||||
|         case HTTPMETHOD_NOTIFY: |         case HTTPMETHOD_NOTIFY: | ||||||
|         case HTTPMETHOD_SUBSCRIBE: |         case HTTPMETHOD_SUBSCRIBE: | ||||||
|         case HTTPMETHOD_UNSUBSCRIBE: |         case HTTPMETHOD_UNSUBSCRIBE: | ||||||
|             UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf | ||||||
|  |                      ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                        "miniserver %d: got GENA msg\n", info->socket ); |                        "miniserver %d: got GENA msg\n", info->socket ); | ||||||
|  |                  ) | ||||||
|                 callback = gGenaCallback; |                 callback = gGenaCallback; | ||||||
|             break; |             break; | ||||||
|  |  | ||||||
| @@ -215,7 +217,7 @@ dispatch_request( IN SOCKINFO * info, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| handle_error( IN SOCKINFO * info, | handle_error( IN SOCKINFO * info, | ||||||
|               int http_error_code, |               int http_error_code, | ||||||
|               int major, |               int major, | ||||||
| @@ -273,8 +275,10 @@ handle_request( void *args ) | |||||||
|     struct mserv_request_t *request = ( struct mserv_request_t * )args; |     struct mserv_request_t *request = ( struct mserv_request_t * )args; | ||||||
|     int connfd = request->connfd; |     int connfd = request->connfd; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|  |              ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                "miniserver %d: READING\n", connfd ); |                "miniserver %d: READING\n", connfd ); | ||||||
|  |          ) | ||||||
|         //parser_request_init( &parser ); ////LEAK_FIX_MK |         //parser_request_init( &parser ); ////LEAK_FIX_MK | ||||||
|         hmsg = &parser.msg; |         hmsg = &parser.msg; | ||||||
|  |  | ||||||
| @@ -291,8 +295,10 @@ handle_request( void *args ) | |||||||
|         goto error_handler; |         goto error_handler; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|  |              ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                "miniserver %d: PROCESSING...\n", connfd ); |                "miniserver %d: PROCESSING...\n", connfd ); | ||||||
|  |          ) | ||||||
|         // dispatch |         // dispatch | ||||||
|         http_error_code = dispatch_request( &info, &parser ); |         http_error_code = dispatch_request( &info, &parser ); | ||||||
|     if( http_error_code != 0 ) { |     if( http_error_code != 0 ) { | ||||||
| @@ -310,8 +316,10 @@ handle_request( void *args ) | |||||||
|         handle_error( &info, http_error_code, major, minor ); |         handle_error( &info, http_error_code, major, minor ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|  |              ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                "miniserver %d: COMPLETE\n", connfd ); |                "miniserver %d: COMPLETE\n", connfd ); | ||||||
|  |          ) | ||||||
|         sock_destroy( &info, SD_BOTH ); //should shutdown completely |         sock_destroy( &info, SD_BOTH ); //should shutdown completely | ||||||
|  |  | ||||||
|     httpmsg_destroy( hmsg ); |     httpmsg_destroy( hmsg ); | ||||||
| @@ -333,7 +341,7 @@ handle_request( void *args ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| schedule_request_job( IN int connfd, | schedule_request_job( IN int connfd, | ||||||
|                       IN struct sockaddr_in *clientAddr ) |                       IN struct sockaddr_in *clientAddr ) | ||||||
| { | { | ||||||
| @@ -344,8 +352,10 @@ schedule_request_job( IN int connfd, | |||||||
|         ( struct mserv_request_t * ) |         ( struct mserv_request_t * ) | ||||||
|         malloc( sizeof( struct mserv_request_t ) ); |         malloc( sizeof( struct mserv_request_t ) ); | ||||||
|     if( request == NULL ) { |     if( request == NULL ) { | ||||||
|         UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf | ||||||
|  |                  ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                    "mserv %d: out of memory\n", connfd ); |                    "mserv %d: out of memory\n", connfd ); | ||||||
|  |              ) | ||||||
|             shutdown( request->connfd, SD_BOTH ); |             shutdown( request->connfd, SD_BOTH ); | ||||||
|         UpnpCloseSocket( connfd ); |         UpnpCloseSocket( connfd ); | ||||||
|         return; |         return; | ||||||
| @@ -359,9 +369,11 @@ schedule_request_job( IN int connfd, | |||||||
|     TPJobSetFreeFunction( &job, free_handle_request_arg ); |     TPJobSetFreeFunction( &job, free_handle_request_arg ); | ||||||
|     TPJobSetPriority( &job, MED_PRIORITY ); |     TPJobSetPriority( &job, MED_PRIORITY ); | ||||||
|  |  | ||||||
|     if( ThreadPoolAdd( &gMiniServerThreadPool, &job, NULL ) != 0 ) { |     if( ThreadPoolAdd( &gRecvThreadPool, &job, NULL ) != 0 ) { | ||||||
|         UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf | ||||||
|  |                  ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                    "mserv %d: cannot schedule request\n", connfd ); |                    "mserv %d: cannot schedule request\n", connfd ); | ||||||
|  |              ) | ||||||
|             free( request ); |             free( request ); | ||||||
|         shutdown( connfd, SD_BOTH ); |         shutdown( connfd, SD_BOTH ); | ||||||
|         UpnpCloseSocket( connfd ); |         UpnpCloseSocket( connfd ); | ||||||
| @@ -434,8 +446,10 @@ RunMiniServer( MiniServerSockArray * miniSock ) | |||||||
|  |  | ||||||
|         if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == |         if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == | ||||||
|             UPNP_SOCKETERROR ) { |             UPNP_SOCKETERROR ) { | ||||||
|             UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf | ||||||
|  |                      ( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, | ||||||
|                        "Error in select call !!!\n" ); |                        "Error in select call !!!\n" ); | ||||||
|  |                  ) | ||||||
|                 continue; |                 continue; | ||||||
|         } else { |         } else { | ||||||
|  |  | ||||||
| @@ -445,9 +459,11 @@ RunMiniServer( MiniServerSockArray * miniSock ) | |||||||
|                                      ( struct sockaddr * )&clientAddr, |                                      ( struct sockaddr * )&clientAddr, | ||||||
|                                      &clientLen ); |                                      &clientLen ); | ||||||
|                 if( connectHnd == UPNP_INVALID_SOCKET ) { |                 if( connectHnd == UPNP_INVALID_SOCKET ) { | ||||||
|                     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |                     DBGONLY( UpnpPrintf | ||||||
|  |                              ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                                "miniserver: Error" |                                "miniserver: Error" | ||||||
|                                " in accepting connection\n" ); |                                " in accepting connection\n" ); | ||||||
|  |                          ) | ||||||
|                         continue; |                         continue; | ||||||
|                 } |                 } | ||||||
|                 schedule_request_job( connectHnd, &clientAddr ); |                 schedule_request_job( connectHnd, &clientAddr ); | ||||||
| @@ -473,19 +489,24 @@ RunMiniServer( MiniServerSockArray * miniSock ) | |||||||
|                               &clientLen ); |                               &clientLen ); | ||||||
|                 if( byteReceived > 0 ) { |                 if( byteReceived > 0 ) { | ||||||
|                     requestBuf[byteReceived] = '\0'; |                     requestBuf[byteReceived] = '\0'; | ||||||
|                     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |                     DBGONLY( UpnpPrintf | ||||||
|  |                              ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                                "Received response !!!  %s From host %s \n", |                                "Received response !!!  %s From host %s \n", | ||||||
|                         requestBuf, inet_ntoa( clientAddr.sin_addr ) ); |                                requestBuf, | ||||||
|                     UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__, |                                inet_ntoa( clientAddr.sin_addr ) ); | ||||||
|  |                          ) | ||||||
|  |                         DBGONLY( UpnpPrintf | ||||||
|  |                                  ( UPNP_PACKET, MSERV, __FILE__, __LINE__, | ||||||
|                                    "Received multicast packet: \n %s\n", |                                    "Received multicast packet: \n %s\n", | ||||||
|                                    requestBuf ); |                                    requestBuf ); | ||||||
|  |                          ) | ||||||
|  |  | ||||||
|                     if( NULL != strstr( requestBuf, "ShutDown" ) ) { |                         if( NULL != strstr( requestBuf, "ShutDown" ) ) | ||||||
|                         break; |                         break; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     shutdown( miniServSock, SD_BOTH ); |     shutdown( miniServSock, SD_BOTH ); | ||||||
| @@ -534,8 +555,10 @@ get_port( int sockfd ) | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     port = ntohs( sockinfo.sin_port ); |     port = ntohs( sockinfo.sin_port ); | ||||||
|     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|  |              ( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                "sockfd = %d, .... port = %d\n", sockfd, port ); |                "sockfd = %d, .... port = %d\n", sockfd, port ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         return port; |         return port; | ||||||
| } | } | ||||||
| @@ -600,10 +623,16 @@ get_miniserver_sockets( MiniServerSockArray * out, | |||||||
|         //THIS MAY CAUSE TCP TO BECOME LESS RELIABLE |         //THIS MAY CAUSE TCP TO BECOME LESS RELIABLE | ||||||
|         //HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS |         //HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                              "mserv start: resuseaddr set\n" ); |                              "mserv start: resuseaddr set\n" ); | ||||||
|         sockError = setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, |              ) | ||||||
|             ( const char * )&reuseaddr_on, sizeof( int )); |  | ||||||
|  |             sockError = setsockopt( listenfd, | ||||||
|  |                                     SOL_SOCKET, | ||||||
|  |                                     SO_REUSEADDR, | ||||||
|  |                                     ( const char * )&reuseaddr_on, | ||||||
|  |                                     sizeof( int ) | ||||||
|  |              ); | ||||||
|         if( sockError == UPNP_SOCKETERROR ) { |         if( sockError == UPNP_SOCKETERROR ) { | ||||||
|             shutdown( listenfd, SD_BOTH ); |             shutdown( listenfd, SD_BOTH ); | ||||||
|             UpnpCloseSocket( listenfd ); |             UpnpCloseSocket( listenfd ); | ||||||
| @@ -636,14 +665,16 @@ get_miniserver_sockets( MiniServerSockArray * out, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if( sockError == UPNP_SOCKETERROR ) { |     if( sockError == UPNP_SOCKETERROR ) { | ||||||
|         perror( "mserv start: bind failed" ); |         DBGONLY( perror( "mserv start: bind failed" ); | ||||||
|  |              ) | ||||||
|             shutdown( listenfd, SD_BOTH ); |             shutdown( listenfd, SD_BOTH ); | ||||||
|         UpnpCloseSocket( listenfd ); |         UpnpCloseSocket( listenfd ); | ||||||
|         return UPNP_E_SOCKET_BIND;  // bind failed |         return UPNP_E_SOCKET_BIND;  // bind failed | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, | ||||||
|                          "mserv start: bind success\n" ); |                          "mserv start: bind success\n" ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         success = listen( listenfd, SOMAXCONN ); |         success = listen( listenfd, SOMAXCONN ); | ||||||
|     if( success == UPNP_SOCKETERROR ) { |     if( success == UPNP_SOCKETERROR ) { | ||||||
| @@ -663,9 +694,10 @@ get_miniserver_sockets( MiniServerSockArray * out, | |||||||
|  |  | ||||||
|     if( ( miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == |     if( ( miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == | ||||||
|         UPNP_INVALID_SOCKET ) { |         UPNP_INVALID_SOCKET ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         DBGONLY( UpnpPrintf( UPNP_CRITICAL, | ||||||
|                              MSERV, __FILE__, __LINE__, |                              MSERV, __FILE__, __LINE__, | ||||||
|                              "Error in socket operation !!!\n" ); |                              "Error in socket operation !!!\n" ); | ||||||
|  |              ) | ||||||
|             shutdown( listenfd, SD_BOTH ); |             shutdown( listenfd, SD_BOTH ); | ||||||
|         UpnpCloseSocket( listenfd ); |         UpnpCloseSocket( listenfd ); | ||||||
|         return UPNP_E_OUTOF_SOCKET; |         return UPNP_E_OUTOF_SOCKET; | ||||||
| @@ -679,9 +711,10 @@ get_miniserver_sockets( MiniServerSockArray * out, | |||||||
|     if( bind( miniServerStopSock, ( struct sockaddr * )&serverAddr, |     if( bind( miniServerStopSock, ( struct sockaddr * )&serverAddr, | ||||||
|               sizeof( serverAddr ) ) == UPNP_SOCKETERROR ) { |               sizeof( serverAddr ) ) == UPNP_SOCKETERROR ) { | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         DBGONLY( UpnpPrintf( UPNP_CRITICAL, | ||||||
|                              MSERV, __FILE__, __LINE__, |                              MSERV, __FILE__, __LINE__, | ||||||
|                              "Error in binding localhost!!!\n" ); |                              "Error in binding localhost!!!\n" ); | ||||||
|  |              ) | ||||||
|             shutdown( listenfd, SD_BOTH ); |             shutdown( listenfd, SD_BOTH ); | ||||||
|         UpnpCloseSocket( listenfd ); |         UpnpCloseSocket( listenfd ); | ||||||
|         shutdown( miniServerStopSock, SD_BOTH ); |         shutdown( miniServerStopSock, SD_BOTH ); | ||||||
| @@ -772,7 +805,7 @@ StartMiniServer( unsigned short listen_port ) | |||||||
|  |  | ||||||
|     TPJobSetFreeFunction( &job, ( free_routine ) free ); |     TPJobSetFreeFunction( &job, ( free_routine ) free ); | ||||||
|  |  | ||||||
|     success = ThreadPoolAddPersistent( &gMiniServerThreadPool, &job, NULL ); |     success = ThreadPoolAddPersistent( &gRecvThreadPool, &job, NULL ); | ||||||
|  |  | ||||||
|     if( success < 0 ) { |     if( success < 0 ) { | ||||||
|         shutdown( miniSocket->miniServerSock, SD_BOTH ); |         shutdown( miniSocket->miniServerSock, SD_BOTH ); | ||||||
| @@ -844,8 +877,10 @@ StopMiniServer( void ) | |||||||
|  |  | ||||||
|     sock = socket( AF_INET, SOCK_DGRAM, 0 ); |     sock = socket( AF_INET, SOCK_DGRAM, 0 ); | ||||||
|     if( sock == UPNP_INVALID_SOCKET ) { |     if( sock == UPNP_INVALID_SOCKET ) { | ||||||
|         UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf | ||||||
|  |                  ( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                    "SSDP_SERVER:StopSSDPServer: Error in socket operation !!!\n" ); |                    "SSDP_SERVER:StopSSDPServer: Error in socket operation !!!\n" ); | ||||||
|  |              ) | ||||||
|             return 0; |             return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -34,7 +34,6 @@ | |||||||
| * messages. | * messages. | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
|  |  | ||||||
| #define _GNU_SOURCE	// For strcasestr() in string.h |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| @@ -101,7 +100,7 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = { | |||||||
|  |  | ||||||
| /***********************************************************************/ | /***********************************************************************/ | ||||||
|  |  | ||||||
| /*************                 scanner                     *************/ | /*************				 scanner					  **************/ | ||||||
|  |  | ||||||
| /***********************************************************************/ | /***********************************************************************/ | ||||||
|  |  | ||||||
| @@ -121,7 +120,7 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = { | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| scanner_init( OUT scanner_t * scanner, | scanner_init( OUT scanner_t * scanner, | ||||||
|               IN membuffer * bufptr ) |               IN membuffer * bufptr ) | ||||||
| { | { | ||||||
| @@ -142,7 +141,7 @@ scanner_init( OUT scanner_t * scanner, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE xboolean | static XINLINE xboolean | ||||||
| is_separator_char( IN char c ) | is_separator_char( IN char c ) | ||||||
| { | { | ||||||
|     return strchr( " \t()<>@,;:\\\"/[]?={}", c ) != NULL; |     return strchr( " \t()<>@,;:\\\"/[]?={}", c ) != NULL; | ||||||
| @@ -160,7 +159,7 @@ is_separator_char( IN char c ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE xboolean | static XINLINE xboolean | ||||||
| is_identifier_char( IN char c ) | is_identifier_char( IN char c ) | ||||||
| { | { | ||||||
|     return ( c >= 32 && c <= 126 ) && !is_separator_char( c ); |     return ( c >= 32 && c <= 126 ) && !is_separator_char( c ); | ||||||
| @@ -178,7 +177,7 @@ is_identifier_char( IN char c ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE xboolean | static XINLINE xboolean | ||||||
| is_control_char( IN char c ) | is_control_char( IN char c ) | ||||||
| { | { | ||||||
|     return ( ( c >= 0 && c <= 31 ) || ( c == 127 ) ); |     return ( ( c >= 0 && c <= 31 ) || ( c == 127 ) ); | ||||||
| @@ -196,7 +195,7 @@ is_control_char( IN char c ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE xboolean | static XINLINE xboolean | ||||||
| is_qdtext_char( IN char cc ) | is_qdtext_char( IN char cc ) | ||||||
| { | { | ||||||
|     unsigned char c = ( unsigned char )cc; |     unsigned char c = ( unsigned char )cc; | ||||||
| @@ -375,7 +374,7 @@ scanner_get_token( INOUT scanner_t * scanner, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE char * | static XINLINE char * | ||||||
| scanner_get_str( IN scanner_t * scanner ) | scanner_get_str( IN scanner_t * scanner ) | ||||||
| { | { | ||||||
|     return scanner->msg->buf + scanner->cursor; |     return scanner->msg->buf + scanner->cursor; | ||||||
| @@ -395,9 +394,7 @@ scanner_get_str( IN scanner_t * scanner ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #warning The only use of the function 'scanner_pushback()' in the code is commented out. | static XINLINE void | ||||||
| #warning 'scanner_pushback()' is a candidate for removal. |  | ||||||
| static UPNP_INLINE void |  | ||||||
| scanner_pushback( INOUT scanner_t * scanner, | scanner_pushback( INOUT scanner_t * scanner, | ||||||
|                   IN size_t pushback_bytes ) |                   IN size_t pushback_bytes ) | ||||||
| { | { | ||||||
| @@ -564,7 +561,7 @@ httpmsg_find_hdr_str( IN http_message_t * msg, | |||||||
| * | * | ||||||
| *	Description :	Finds header from a list, with the given 'name_id'. | *	Description :	Finds header from a list, with the given 'name_id'. | ||||||
| * | * | ||||||
| * Return : http_header_t*  - Pointer to a header on success; | *	Return : http_header_t*  - Pointer to a header on success;										* | ||||||
| *			 NULL on failure														 | *			 NULL on failure														 | ||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| @@ -616,7 +613,7 @@ httpmsg_find_hdr( IN http_message_t * msg, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| skip_blank_lines( INOUT scanner_t * scanner ) | skip_blank_lines( INOUT scanner_t * scanner ) | ||||||
| { | { | ||||||
|     memptr token; |     memptr token; | ||||||
| @@ -653,7 +650,7 @@ skip_blank_lines( INOUT scanner_t * scanner ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| skip_lws( INOUT scanner_t * scanner ) | skip_lws( INOUT scanner_t * scanner ) | ||||||
| { | { | ||||||
|     memptr token; |     memptr token; | ||||||
| @@ -700,7 +697,7 @@ skip_lws( INOUT scanner_t * scanner ) | |||||||
| * | * | ||||||
| *	Description :	Match a string without whitespace or CRLF (%S) | *	Description :	Match a string without whitespace or CRLF (%S) | ||||||
| * | * | ||||||
| * Return : UPNP_INLINE parse_status_t ; | *	Return : XINLINE parse_status_t ; | ||||||
| *		PARSE_OK															 | *		PARSE_OK															 | ||||||
| *		PARSE_NO_MATCH														 | *		PARSE_NO_MATCH														 | ||||||
| *		PARSE_FAILURE														 | *		PARSE_FAILURE														 | ||||||
| @@ -708,7 +705,7 @@ skip_lws( INOUT scanner_t * scanner ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| match_non_ws_string( INOUT scanner_t * scanner, | match_non_ws_string( INOUT scanner_t * scanner, | ||||||
|                      OUT memptr * str ) |                      OUT memptr * str ) | ||||||
| { | { | ||||||
| @@ -774,7 +771,7 @@ match_non_ws_string( INOUT scanner_t * scanner, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| match_raw_value( INOUT scanner_t * scanner, | match_raw_value( INOUT scanner_t * scanner, | ||||||
|                  OUT memptr * raw_value ) |                  OUT memptr * raw_value ) | ||||||
| { | { | ||||||
| @@ -865,7 +862,7 @@ match_raw_value( INOUT scanner_t * scanner, | |||||||
| *   PARSE_FAILURE		-- bad input									 | *   PARSE_FAILURE		-- bad input									 | ||||||
| *   PARSE_INCOMPLETE													 | *   PARSE_INCOMPLETE													 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| match_int( INOUT scanner_t * scanner, | match_int( INOUT scanner_t * scanner, | ||||||
|            IN int base, |            IN int base, | ||||||
|            OUT int *value ) |            OUT int *value ) | ||||||
| @@ -924,7 +921,7 @@ match_int( INOUT scanner_t * scanner, | |||||||
| *   PARSE_FAILURE														 | *   PARSE_FAILURE														 | ||||||
| *   PARSE_INCOMPLETE													 | *   PARSE_INCOMPLETE													 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| read_until_crlf( INOUT scanner_t * scanner, | read_until_crlf( INOUT scanner_t * scanner, | ||||||
|                  OUT memptr * str ) |                  OUT memptr * str ) | ||||||
| { | { | ||||||
| @@ -965,9 +962,7 @@ read_until_crlf( INOUT scanner_t * scanner, | |||||||
| *   PARSE_FAILURE														 | *   PARSE_FAILURE														 | ||||||
| *   PARSE_INCOMPLETE													 | *   PARSE_INCOMPLETE													 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #warning There are currently no uses of the function 'skip_to_end_of_header()' in the code. | static XINLINE int | ||||||
| #warning 'skip_to_end_of_header()' is a candidate for removal. |  | ||||||
| static UPNP_INLINE int |  | ||||||
| skip_to_end_of_header( INOUT scanner_t * scanner ) | skip_to_end_of_header( INOUT scanner_t * scanner ) | ||||||
| { | { | ||||||
|     memptr dummy_raw_value; |     memptr dummy_raw_value; | ||||||
| @@ -983,8 +978,8 @@ skip_to_end_of_header( INOUT scanner_t * scanner ) | |||||||
| * Parameters: | * Parameters: | ||||||
| *	INOUT scanner_t* scanner ;  Scanner Object | *	INOUT scanner_t* scanner ;  Scanner Object | ||||||
| *	IN char c ;					Character to be compared with | *	IN char c ;					Character to be compared with | ||||||
| *	IN xboolean case_sensitive;	Flag indicating whether | *	IN xboolean case_sensitive; Flag indicating whether comparison should | ||||||
| *					comparison should be case sensitive | *								be case sensitive | ||||||
| * | * | ||||||
| * Description: Compares a character to the next char in the scanner; | * Description: Compares a character to the next char in the scanner; | ||||||
| *	on error, scanner chars are not restored | *	on error, scanner chars are not restored | ||||||
| @@ -994,7 +989,7 @@ skip_to_end_of_header( INOUT scanner_t * scanner ) | |||||||
| *   PARSE_NO_MATCH | *   PARSE_NO_MATCH | ||||||
| *   PARSE_INCOMPLETE | *   PARSE_INCOMPLETE | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| match_char( INOUT scanner_t * scanner, | match_char( INOUT scanner_t * scanner, | ||||||
|             IN char c, |             IN char c, | ||||||
|             IN xboolean case_sensitive ) |             IN xboolean case_sensitive ) | ||||||
| @@ -1341,7 +1336,7 @@ matchstr( IN char *str, | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	void																 | *	void																 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| parser_init( OUT http_parser_t * parser ) | parser_init( OUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     memset( parser, 0, sizeof( http_parser_t ) ); |     memset( parser, 0, sizeof( http_parser_t ) ); | ||||||
| @@ -1876,7 +1871,7 @@ parser_parse_headers_old( INOUT http_parser_t * parser ) | |||||||
| *	 PARSE_FAILURE -- entity length > content-length value				 | *	 PARSE_FAILURE -- entity length > content-length value				 | ||||||
| *	 PARSE_SUCCESS														 | *	 PARSE_SUCCESS														 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| parser_parse_entity_using_clen( INOUT http_parser_t * parser ) | parser_parse_entity_using_clen( INOUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     //int entity_length; |     //int entity_length; | ||||||
| @@ -1923,7 +1918,7 @@ parser_parse_entity_using_clen( INOUT http_parser_t * parser ) | |||||||
| *	 PARSE_FAILURE -- entity length > content-length value				 | *	 PARSE_FAILURE -- entity length > content-length value				 | ||||||
| *	 PARSE_SUCCESS														 | *	 PARSE_SUCCESS														 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| parser_parse_chunky_body( INOUT http_parser_t * parser ) | parser_parse_chunky_body( INOUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     parse_status_t status; |     parse_status_t status; | ||||||
| @@ -1968,7 +1963,7 @@ parser_parse_chunky_body( INOUT http_parser_t * parser ) | |||||||
| *	 PARSE_FAILURE -- entity length > content-length value				 | *	 PARSE_FAILURE -- entity length > content-length value				 | ||||||
| *	 PARSE_SUCCESS														 | *	 PARSE_SUCCESS														 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| parser_parse_chunky_headers( INOUT http_parser_t * parser ) | parser_parse_chunky_headers( INOUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     parse_status_t status; |     parse_status_t status; | ||||||
| @@ -2008,7 +2003,7 @@ parser_parse_chunky_headers( INOUT http_parser_t * parser ) | |||||||
| *	 PARSE_SUCCESS														 | *	 PARSE_SUCCESS														 | ||||||
| *	 PARSE_CONTINUE_1													 | *	 PARSE_CONTINUE_1													 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| parser_parse_chunky_entity( INOUT http_parser_t * parser ) | parser_parse_chunky_entity( INOUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     scanner_t *scanner = &parser->scanner; |     scanner_t *scanner = &parser->scanner; | ||||||
| @@ -2024,8 +2019,9 @@ parser_parse_chunky_entity( INOUT http_parser_t * parser ) | |||||||
|     status = match( scanner, "%x%L%c", &parser->chunk_size, &dummy ); |     status = match( scanner, "%x%L%c", &parser->chunk_size, &dummy ); | ||||||
|     if( status != PARSE_OK ) { |     if( status != PARSE_OK ) { | ||||||
|         scanner->cursor = save_pos; |         scanner->cursor = save_pos; | ||||||
|         UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf | ||||||
|             "CHUNK COULD NOT BE PARSED\n" ); |                  ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|  |                    "CHUNK COULD NOT BE PARSED\n" ); ) | ||||||
|             return status; |             return status; | ||||||
|     } |     } | ||||||
|     // remove chunk info just matched; just retain data |     // remove chunk info just matched; just retain data | ||||||
| @@ -2059,7 +2055,7 @@ parser_parse_chunky_entity( INOUT http_parser_t * parser ) | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 PARSE_INCOMPLETE_ENTITY											 | *	 PARSE_INCOMPLETE_ENTITY											 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE parse_status_t | static XINLINE parse_status_t | ||||||
| parser_parse_entity_until_close( INOUT http_parser_t * parser ) | parser_parse_entity_until_close( INOUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     size_t cursor; |     size_t cursor; | ||||||
| @@ -2094,7 +2090,7 @@ parser_parse_entity_until_close( INOUT http_parser_t * parser ) | |||||||
| * 	 PARSE_FAILURE														 | * 	 PARSE_FAILURE														 | ||||||
| *	 PARSE_COMPLETE	-- no more reading to do							 | *	 PARSE_COMPLETE	-- no more reading to do							 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| UPNP_INLINE parse_status_t | XINLINE parse_status_t | ||||||
| parser_get_entity_read_method( INOUT http_parser_t * parser ) | parser_get_entity_read_method( INOUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     http_message_t *hmsg = &parser->msg; |     http_message_t *hmsg = &parser->msg; | ||||||
| @@ -2152,8 +2148,9 @@ parser_get_entity_read_method( INOUT http_parser_t * parser ) | |||||||
|         if( raw_find_str( &hdr_value, "chunked" ) >= 0 ) { |         if( raw_find_str( &hdr_value, "chunked" ) >= 0 ) { | ||||||
|             // read method to use chunked transfer encoding |             // read method to use chunked transfer encoding | ||||||
|             parser->ent_position = ENTREAD_USING_CHUNKED; |             parser->ent_position = ENTREAD_USING_CHUNKED; | ||||||
|             UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf | ||||||
|                 "Found Chunked Encoding ....\n" ); |                      ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|  |                        "Found Chunked Encoding ....\n" ); ) | ||||||
|  |  | ||||||
|                 return PARSE_CONTINUE_1; |                 return PARSE_CONTINUE_1; | ||||||
|         } |         } | ||||||
| @@ -2199,7 +2196,7 @@ parser_get_entity_read_method( INOUT http_parser_t * parser ) | |||||||
| * 	 PARSE_FAILURE														 | * 	 PARSE_FAILURE														 | ||||||
| *	 PARSE_COMPLETE	-- no more reading to do							 | *	 PARSE_COMPLETE	-- no more reading to do							 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| UPNP_INLINE parse_status_t | XINLINE parse_status_t | ||||||
| parser_parse_entity( INOUT http_parser_t * parser ) | parser_parse_entity( INOUT http_parser_t * parser ) | ||||||
| { | { | ||||||
|     parse_status_t status = PARSE_OK; |     parse_status_t status = PARSE_OK; | ||||||
| @@ -2424,8 +2421,6 @@ raw_to_int( IN memptr * raw_value, | |||||||
| *																		 | *																		 | ||||||
| * Description: Find a substring from raw character string buffer					 | * Description: Find a substring from raw character string buffer					 | ||||||
| *																		 | *																		 | ||||||
| * Side effects: raw_value is transformed to lowercase. |  | ||||||
| * |  | ||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 int - index at which the substring is found.						 | *	 int - index at which the substring is found.						 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| @@ -2435,31 +2430,19 @@ raw_find_str( IN memptr *raw_value, | |||||||
| { | { | ||||||
|     char c; |     char c; | ||||||
|     char *ptr; |     char *ptr; | ||||||
|     int i = 0; |  | ||||||
|  |  | ||||||
|     // save |     c = raw_value->buf[raw_value->length];  // save | ||||||
|     c = raw_value->buf[raw_value->length]; |     raw_value->buf[raw_value->length] = 0;  // null-terminate | ||||||
|  |  | ||||||
|     // Make it lowercase |  | ||||||
|     for (i = 0; raw_value->buf[i]; ++i) { |  | ||||||
|         raw_value->buf[i] = tolower(raw_value->buf[i]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // null-terminate |  | ||||||
|     raw_value->buf[raw_value->length] = 0; |  | ||||||
|  |  | ||||||
|     // Find the substring position |  | ||||||
|     ptr = strstr( raw_value->buf, str ); |     ptr = strstr( raw_value->buf, str ); | ||||||
|  |  | ||||||
|     // restore the "length" byte |     raw_value->buf[raw_value->length] = c;  // restore | ||||||
|     raw_value->buf[raw_value->length] = c; |  | ||||||
|  |  | ||||||
|     if( ptr == 0 ) { |     if( ptr == 0 ) { | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // return index |     return ptr - raw_value->buf;    // return index | ||||||
|     return ptr - raw_value->buf; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -2472,7 +2455,7 @@ raw_find_str( IN memptr *raw_value, | |||||||
| *	nameConverts a http_method id stored in the HTTP Method				 | *	nameConverts a http_method id stored in the HTTP Method				 | ||||||
| *																		 | *																		 | ||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 const char* ptr - Ptr to the HTTP Method | *	 const char* ptr - Ptr to the HTTP Method																							* | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| const char * | const char * | ||||||
| method_to_str( IN http_method_t method ) | method_to_str( IN http_method_t method ) | ||||||
| @@ -2497,38 +2480,40 @@ method_to_str( IN http_method_t method ) | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 void																 | *	 void																 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG |  | ||||||
| void | void | ||||||
| print_http_headers( http_message_t * hmsg ) | print_http_headers( http_message_t * hmsg ) | ||||||
| { | { | ||||||
|  |  | ||||||
|     ListNode *node; |     ListNode *node; | ||||||
|  |  | ||||||
|     //NNS:  dlist_node *node; |     //NNS:  dlist_node *node; | ||||||
|     http_header_t *header; |     http_header_t *header; | ||||||
|  |  | ||||||
|     // print start line |     // print start line | ||||||
|     if( hmsg->is_request ) { |     if( hmsg->is_request ) { | ||||||
|         printf( "method = %d, version = %d.%d, url = %.*s\n",  |         //printf( "method = %d, version = %d.%d, url = %.*s\n",  | ||||||
|             hmsg->method, hmsg->major_version, hmsg->minor_version, |         //  hmsg->method, hmsg->major_version, hmsg->minor_version, | ||||||
|             (int)hmsg->uri.pathquery.size, hmsg->uri.pathquery.buff); |         //  hmsg->uri.pathquery.size, hmsg->uri.pathquery.buff); | ||||||
|     } else { |     } else { | ||||||
|         printf( "resp status = %d, version = %d.%d, status msg = %.*s\n", |         //  printf( "resp status = %d, version = %d.%d, status msg = %.*s\n", | ||||||
|             hmsg->status_code, hmsg->major_version, hmsg->minor_version, |         //  hmsg->status_code, hmsg->major_version, hmsg->minor_version, | ||||||
|             (int)hmsg->status_msg.length, hmsg->status_msg.buf); |         //  (int)hmsg->status_msg.length, hmsg->status_msg.buf); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // print headers |     // print headers | ||||||
|  |  | ||||||
|     node = ListHead( &hmsg->headers ); |     node = ListHead( &hmsg->headers ); | ||||||
|     //NNS: node = dlist_first_node( &hmsg->headers ); |     //NNS: node = dlist_first_node( &hmsg->headers ); | ||||||
|     while( node != NULL ) { |     while( node != NULL ) { | ||||||
|  |  | ||||||
|         header = ( http_header_t * ) node->item; |         header = ( http_header_t * ) node->item; | ||||||
|         //NNS: header = (http_header_t *)node->data; |         //NNS: header = (http_header_t *)node->data; | ||||||
|         printf( "hdr name: %.*s, value: %.*s\n",  |         //printf( "hdr name: %.*s, value: %.*s\n",  | ||||||
|             (int)header->name.length, header->name.buf, |         //  (int)header->name.length, header->name.buf, | ||||||
|             (int)header->value.length, header->value.buf ); |         //  (int)header->value.length, header->value.buf ); | ||||||
|  |  | ||||||
|         node = ListNext( &hmsg->headers, node ); |         node = ListNext( &hmsg->headers, node ); | ||||||
|  |  | ||||||
|         //NNS: node = dlist_next( &hmsg->headers, node ); |         //NNS: node = dlist_next( &hmsg->headers, node ); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,14 +41,12 @@ | |||||||
| #include <stdarg.h> | #include <stdarg.h> | ||||||
| #ifndef UPNP_USE_BCBPP | #ifndef UPNP_USE_BCBPP | ||||||
| #ifndef UPNP_USE_MSVCPP | #ifndef UPNP_USE_MSVCPP | ||||||
| 		#include <inttypes.h> |  | ||||||
|  #include <stdint.h> |  #include <stdint.h> | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  #include <arpa/inet.h> |  #include <arpa/inet.h> | ||||||
| 	#include <fcntl.h> |  | ||||||
|  #include <netinet/in.h> |  #include <netinet/in.h> | ||||||
|  #include <sys/types.h> |  #include <sys/types.h> | ||||||
|  #include <sys/socket.h> |  #include <sys/socket.h> | ||||||
| @@ -56,6 +54,7 @@ | |||||||
|  #include <sys/wait.h> |  #include <sys/wait.h> | ||||||
|  #include <unistd.h> |  #include <unistd.h> | ||||||
|  #include <sys/utsname.h> |  #include <sys/utsname.h> | ||||||
|  |  #include <fcntl.h> | ||||||
| #else | #else | ||||||
|  #include <winsock2.h> |  #include <winsock2.h> | ||||||
|  #include <malloc.h> |  #include <malloc.h> | ||||||
| @@ -169,8 +168,10 @@ http_Connect( IN uri_type * destination_url, | |||||||
|     if( connect( connfd, ( struct sockaddr * )&url->hostport.IPv4address, |     if( connect( connfd, ( struct sockaddr * )&url->hostport.IPv4address, | ||||||
|                  sizeof( struct sockaddr_in ) ) == -1 ) { |                  sizeof( struct sockaddr_in ) ) == -1 ) { | ||||||
| #ifdef WIN32 | #ifdef WIN32 | ||||||
|  | 		DBGONLY( | ||||||
| 			UpnpPrintf(UPNP_CRITICAL, HTTP, __FILE__, __LINE__, | 			UpnpPrintf(UPNP_CRITICAL, HTTP, __FILE__, __LINE__, | ||||||
| 			"connect error: %d\n", WSAGetLastError()); | 			"connect error: %d\n", WSAGetLastError()); | ||||||
|  | 		) | ||||||
| #endif | #endif | ||||||
|         shutdown( connfd, SD_BOTH ); |         shutdown( connfd, SD_BOTH ); | ||||||
|         UpnpCloseSocket( connfd ); |         UpnpCloseSocket( connfd ); | ||||||
| @@ -224,10 +225,12 @@ http_RecvMessage( IN SOCKINFO * info, | |||||||
|             status = parser_append( parser, buf, num_read ); |             status = parser_append( parser, buf, num_read ); | ||||||
|  |  | ||||||
|             if( status == PARSE_SUCCESS ) { |             if( status == PARSE_SUCCESS ) { | ||||||
|                 UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |                 DBGONLY( UpnpPrintf | ||||||
|  |                          ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                            "<<< (RECVD) <<<\n%s\n-----------------\n", |                            "<<< (RECVD) <<<\n%s\n-----------------\n", | ||||||
|                            parser->msg.msg.buf ); |                            parser->msg.msg.buf ); | ||||||
|                     print_http_headers( &parser->msg ); |                          //print_http_headers( &parser->msg ); | ||||||
|  |                      ) | ||||||
|  |  | ||||||
|                     if( parser->content_length > |                     if( parser->content_length > | ||||||
|                         ( unsigned int )g_maxContentLength ) { |                         ( unsigned int )g_maxContentLength ) { | ||||||
| @@ -248,10 +251,12 @@ http_RecvMessage( IN SOCKINFO * info, | |||||||
|             } |             } | ||||||
|         } else if( num_read == 0 ) { |         } else if( num_read == 0 ) { | ||||||
|             if( ok_on_close ) { |             if( ok_on_close ) { | ||||||
|                 UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |                 DBGONLY( UpnpPrintf | ||||||
|  |                          ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                            "<<< (RECVD) <<<\n%s\n-----------------\n", |                            "<<< (RECVD) <<<\n%s\n-----------------\n", | ||||||
|                            parser->msg.msg.buf ); |                            parser->msg.msg.buf ); | ||||||
|                     print_http_headers( &parser->msg ); |                          //print_http_headers( &parser->msg ); | ||||||
|  |                      ) | ||||||
|  |  | ||||||
|                     return 0; |                     return 0; | ||||||
|             } else { |             } else { | ||||||
| @@ -349,7 +354,7 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|             filename = ( char * )va_arg( argp, char * ); |             filename = ( char * )va_arg( argp, char * ); | ||||||
|  |  | ||||||
|             if( Instr && Instr->IsVirtualFile ) |             if( Instr && Instr->IsVirtualFile ) | ||||||
|                 Fp = (virtualDirCallback.open)( filename, UPNP_READ ); |                 Fp = virtualDirCallback.open( filename, UPNP_READ ); | ||||||
|             else |             else | ||||||
|                 Fp = fopen( filename, "rb" ); |                 Fp = fopen( filename, "rb" ); | ||||||
|  |  | ||||||
| @@ -449,9 +454,11 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|                     num_written = sock_write( info, file_buf, num_read, |                     num_written = sock_write( info, file_buf, num_read, | ||||||
|                                               TimeOut ); |                                               TimeOut ); | ||||||
|  |  | ||||||
|                     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |                     DBGONLY( UpnpPrintf | ||||||
|  |                              ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                                ">>> (SENT) >>>\n%.*s\n------------\n", |                                ">>> (SENT) >>>\n%.*s\n------------\n", | ||||||
|                                ( int )num_written, file_buf ); |                                ( int )num_written, file_buf ); | ||||||
|  |                          ) | ||||||
|  |  | ||||||
|                         //Send error nothing we can do |                         //Send error nothing we can do | ||||||
|                         if( num_written != num_read ) { |                         if( num_written != num_read ) { | ||||||
| @@ -475,13 +482,12 @@ http_SendMessage( IN SOCKINFO * info, | |||||||
|             buf_length = ( size_t ) va_arg( argp, size_t ); |             buf_length = ( size_t ) va_arg( argp, size_t ); | ||||||
|             if( buf_length > 0 ) { |             if( buf_length > 0 ) { | ||||||
|                 num_written = sock_write( info, buf, buf_length, TimeOut ); |                 num_written = sock_write( info, buf, buf_length, TimeOut ); | ||||||
|                 UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |  | ||||||
|                     ">>> (SENT) >>>\n" |  | ||||||
| 		    "%.*s\nbuf_length=%d, num_written=%d\n" |  | ||||||
| 		    "------------\n", |  | ||||||
|                     (int)buf_length, buf, (int)buf_length, num_written ); |  | ||||||
|                 if( ( size_t ) num_written != buf_length ) |                 if( ( size_t ) num_written != buf_length ) | ||||||
|                     goto end; |                     goto end; | ||||||
|  |                 DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|  |                                      ">>> (SENT) >>>\n%.*s\n------------\n", | ||||||
|  |                                      ( int )buf_length, buf ); | ||||||
|  |                      ) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -582,6 +588,7 @@ http_RequestAndResponse( IN uri_type * destination, | |||||||
| *		UPNP_E_SUCCESS; | *		UPNP_E_SUCCESS; | ||||||
| *		UPNP_E_INVALID_URL; | *		UPNP_E_INVALID_URL; | ||||||
| *			 | *			 | ||||||
|  | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int | int | ||||||
| @@ -593,21 +600,23 @@ http_Download( IN const char *url_str, | |||||||
| { | { | ||||||
|     int ret_code; |     int ret_code; | ||||||
|     uri_type url; |     uri_type url; | ||||||
|     char *msg_start; |     char *msg_start, | ||||||
|     char *entity_start; |      *entity_start, | ||||||
|     char *hoststr; |      *hoststr, | ||||||
|     char *temp; |      *temp; | ||||||
|     http_parser_t response; |     http_parser_t response; | ||||||
|     size_t msg_length; |     size_t msg_length, | ||||||
|     size_t hostlen; |       hostlen; | ||||||
|     memptr ctype; |     memptr ctype; | ||||||
|     size_t copy_len; |     size_t copy_len; | ||||||
|     membuffer request; |     membuffer request; | ||||||
|     char *urlPath = alloca( strlen( url_str ) + 1 ); |     char *urlPath = alloca( strlen( url_str ) + 1 ); | ||||||
|  |  | ||||||
|     //ret_code = parse_uri( (char*)url_str, strlen(url_str), &url ); |     //ret_code = parse_uri( (char*)url_str, strlen(url_str), &url ); | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n", |     DBGONLY( UpnpPrintf | ||||||
|  |              ( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n", | ||||||
|                url_str ); |                url_str ); | ||||||
|  |          ) | ||||||
|         ret_code = |         ret_code = | ||||||
|         http_FixStrUrl( ( char * )url_str, strlen( url_str ), &url ); |         http_FixStrUrl( ( char * )url_str, strlen( url_str ), &url ); | ||||||
|     if( ret_code != UPNP_E_SUCCESS ) { |     if( ret_code != UPNP_E_SUCCESS ) { | ||||||
| @@ -631,24 +640,29 @@ http_Download( IN const char *url_str, | |||||||
|     *temp = '\0'; |     *temp = '\0'; | ||||||
|     hostlen = strlen( hoststr ); |     hostlen = strlen( hoststr ); | ||||||
|     *temp = '/'; |     *temp = '/'; | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|         "HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen ); |              ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|  |                "HOSTNAME : %s Length : %zu\n", hoststr, hostlen ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         ret_code = http_MakeMessage( |         ret_code = http_MakeMessage( | ||||||
|             &request, 1, 1, |             &request, 1, 1, | ||||||
|         "Q" "s" "bcDCUc", |             "QsbcDCUc", | ||||||
|             HTTPMETHOD_GET, url.pathquery.buff, url.pathquery.size, |             HTTPMETHOD_GET, url.pathquery.buff, url.pathquery.size, | ||||||
|         "HOST: ", |             "HOST: ", hoststr, hostlen ); | ||||||
|         hoststr, hostlen ); |  | ||||||
|     if( ret_code != 0 ) { |     if( ret_code != 0 ) { | ||||||
|         UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf | ||||||
|  |                  ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                    "HTTP Makemessage failed\n" ); |                    "HTTP Makemessage failed\n" ); | ||||||
|  |              ) | ||||||
|             membuffer_destroy( &request ); |             membuffer_destroy( &request ); | ||||||
|         return ret_code; |         return ret_code; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|  |              ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                "HTTP Buffer:\n %s\n----------END--------\n", request.buf ); |                "HTTP Buffer:\n %s\n----------END--------\n", request.buf ); | ||||||
|  |          ) | ||||||
|         // get doc msg |         // get doc msg | ||||||
|         ret_code = |         ret_code = | ||||||
|         http_RequestAndResponse( &url, request.buf, request.length, |         http_RequestAndResponse( &url, request.buf, request.length, | ||||||
| @@ -660,8 +674,11 @@ http_Download( IN const char *url_str, | |||||||
|         return ret_code; |         return ret_code; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" ); |     DBGONLY( UpnpPrintf | ||||||
|     print_http_headers( &response.msg ); |              ( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" ); | ||||||
|  |          ) | ||||||
|  |         DBGONLY( print_http_headers( &response.msg ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         // optional content-type |         // optional content-type | ||||||
|         if( content_type ) { |         if( content_type ) { | ||||||
| @@ -748,14 +765,17 @@ MakePostMessage( const char *url_str, | |||||||
| { | { | ||||||
|     int ret_code = 0; |     int ret_code = 0; | ||||||
|     char *urlPath = alloca( strlen( url_str ) + 1 ); |     char *urlPath = alloca( strlen( url_str ) + 1 ); | ||||||
|     size_t hostlen = 0; |     int hostlen = 0; | ||||||
|     char *hoststr, |     char *hoststr, | ||||||
|      *temp; |      *temp; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                          "DOWNLOAD URL : %s\n", url_str ); |                          "DOWNLOAD URL : %s\n", url_str ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         ret_code = |         ret_code = | ||||||
|         http_FixStrUrl( ( char * )url_str, strlen( url_str ), url ); |         http_FixStrUrl( ( char * )url_str, strlen( url_str ), url ); | ||||||
|  |  | ||||||
|     if( ret_code != UPNP_E_SUCCESS ) { |     if( ret_code != UPNP_E_SUCCESS ) { | ||||||
|         return ret_code; |         return ret_code; | ||||||
|     } |     } | ||||||
| @@ -777,49 +797,48 @@ MakePostMessage( const char *url_str, | |||||||
|     *temp = '\0'; |     *temp = '\0'; | ||||||
|     hostlen = strlen( hoststr ); |     hostlen = strlen( hoststr ); | ||||||
|     *temp = '/'; |     *temp = '/'; | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|         "HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen ); |                          "HOSTNAME : %s Length : %d\n", hoststr, hostlen ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         if( contentLength >= 0 ) { |         if( contentLength >= 0 ) { | ||||||
|         ret_code = http_MakeMessage( |         ret_code = http_MakeMessage( | ||||||
|             request, 1, 1, |             request, 1, 1, | ||||||
|             "Q" "s" "bcDCU" "T" "Nc", |             "QsbcDCUTNc", | ||||||
|             HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, |             HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, | ||||||
|             "HOST: ", |             "HOST: ", hoststr, hostlen, | ||||||
| 	    hoststr, hostlen, |  | ||||||
|             contentType, |             contentType, | ||||||
|             (off_t)contentLength ); |             (off_t)contentLength ); | ||||||
|     } else if( contentLength == UPNP_USING_CHUNKED ) { |     } else if( contentLength == UPNP_USING_CHUNKED ) { | ||||||
|         ret_code = http_MakeMessage( |         ret_code = http_MakeMessage( | ||||||
|             request, 1, 1, |             request, 1, 1, | ||||||
|             "Q" "s" "bcDCU" "TKc", |             "QsbcDCUTKc", | ||||||
|             HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, |             HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, | ||||||
|             "HOST: ", |             "HOST: ", hoststr, hostlen, | ||||||
| 	    hoststr, hostlen, |  | ||||||
|             contentType ); |             contentType ); | ||||||
|     } else if( contentLength == UPNP_UNTIL_CLOSE ) { |     } else if( contentLength == UPNP_UNTIL_CLOSE ) { | ||||||
|         ret_code = http_MakeMessage( |         ret_code = http_MakeMessage( | ||||||
|             request, 1, 1, |             request, 1, 1, | ||||||
|             "Q" "s" "bcDCU" "Tc", |             "QsbcDCUTc", | ||||||
|             HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, |             HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size, | ||||||
|             "HOST: ", |             "HOST: ", hoststr, hostlen, | ||||||
| 	    hoststr, hostlen, |  | ||||||
|             contentType ); |             contentType ); | ||||||
|     } else { |     } else { | ||||||
|         ret_code = UPNP_E_INVALID_PARAM; |         ret_code = UPNP_E_INVALID_PARAM; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if( ret_code != 0 ) { |     if( ret_code != 0 ) { | ||||||
|         UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                              "HTTP Makemessage failed\n" ); |                              "HTTP Makemessage failed\n" ); | ||||||
|  |              ) | ||||||
|             membuffer_destroy( request ); |             membuffer_destroy( request ); | ||||||
|  |  | ||||||
|         return ret_code; |         return ret_code; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                          "HTTP Buffer:\n %s\n" "----------END--------\n", |                          "HTTP Buffer:\n %s\n" "----------END--------\n", | ||||||
|                          request->buf ); |                          request->buf ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         return UPNP_E_SUCCESS; |         return UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
| @@ -1078,14 +1097,15 @@ MakeGetMessage( const char *url_str, | |||||||
| { | { | ||||||
|     int ret_code; |     int ret_code; | ||||||
|     char *urlPath = alloca( strlen( url_str ) + 1 ); |     char *urlPath = alloca( strlen( url_str ) + 1 ); | ||||||
|     size_t querylen = 0; |     int querylen = 0; | ||||||
|     const char *querystr; |     const char *querystr; | ||||||
|     size_t hostlen = 0; |     int hostlen = 0; | ||||||
|     char *hoststr, |     char *hoststr, | ||||||
|      *temp; |      *temp; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                          "DOWNLOAD URL : %s\n", url_str ); |                          "DOWNLOAD URL : %s\n", url_str ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         ret_code = |         ret_code = | ||||||
|         http_FixStrUrl( ( char * )url_str, strlen( url_str ), url ); |         http_FixStrUrl( ( char * )url_str, strlen( url_str ), url ); | ||||||
| @@ -1111,8 +1131,9 @@ MakeGetMessage( const char *url_str, | |||||||
|     *temp = '\0'; |     *temp = '\0'; | ||||||
|     hostlen = strlen( hoststr ); |     hostlen = strlen( hoststr ); | ||||||
|     *temp = '/'; |     *temp = '/'; | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|         "HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen ); |                          "HOSTNAME : %s Length : %d\n", hoststr, hostlen ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|     if( proxy_str ) { |     if( proxy_str ) { | ||||||
|         querystr = url_str; |         querystr = url_str; | ||||||
| @@ -1124,22 +1145,22 @@ MakeGetMessage( const char *url_str, | |||||||
|  |  | ||||||
|     ret_code = http_MakeMessage( |     ret_code = http_MakeMessage( | ||||||
|         request, 1, 1, |         request, 1, 1, | ||||||
|         "Q" "s" "bcDCUc", |         "QsbcDCUc", | ||||||
|         HTTPMETHOD_GET, querystr, querylen, |         HTTPMETHOD_GET, querystr, querylen, | ||||||
|         "HOST: ", |         "HOST: ", hoststr, hostlen ); | ||||||
|         hoststr, hostlen ); |  | ||||||
|  |  | ||||||
|     if( ret_code != 0 ) { |     if( ret_code != 0 ) { | ||||||
|         UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                              "HTTP Makemessage failed\n" ); |                              "HTTP Makemessage failed\n" ); | ||||||
|  |              ) | ||||||
|             membuffer_destroy( request ); |             membuffer_destroy( request ); | ||||||
|  |  | ||||||
|         return ret_code; |         return ret_code; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                          "HTTP Buffer:\n %s\n" "----------END--------\n", |                          "HTTP Buffer:\n %s\n" "----------END--------\n", | ||||||
|                          request->buf ); |                          request->buf ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         return UPNP_E_SUCCESS; |         return UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
| @@ -1359,9 +1380,11 @@ http_ReadHttpGet( IN void *Handle, | |||||||
|             } |             } | ||||||
|         } else if( num_read == 0 ) { |         } else if( num_read == 0 ) { | ||||||
|             if( ok_on_close ) { |             if( ok_on_close ) { | ||||||
|                 UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |                 DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                                      "<<< (RECVD) <<<\n%s\n-----------------\n", |                                      "<<< (RECVD) <<<\n%s\n-----------------\n", | ||||||
|                                      handle->response.msg.msg.buf ); |                                      handle->response.msg.msg.buf ); | ||||||
|  |                          //print_http_headers( &parser->msg ); | ||||||
|  |                      ) | ||||||
|                     handle->response.position = POS_COMPLETE; |                     handle->response.position = POS_COMPLETE; | ||||||
|             } else { |             } else { | ||||||
|                 // partial msg |                 // partial msg | ||||||
| @@ -1753,8 +1776,8 @@ http_SendStatusResponse( IN SOCKINFO * info, | |||||||
| *		fmt types: | *		fmt types: | ||||||
| *		'B':	arg = int status_code  | *		'B':	arg = int status_code  | ||||||
| *				appends content-length, content-type and HTML body for given code | *				appends content-length, content-type and HTML body for given code | ||||||
| *		'b':	arg1 = const char* buf; | *		'b':	arg1 = const char* buf; arg2 = size_t buf_length  | ||||||
| *			arg2 = size_t buf_length memory ptr | *				memory ptr | ||||||
| *		'C':	(no args) appends a HTTP CONNECTION: close header  | *		'C':	(no args) appends a HTTP CONNECTION: close header  | ||||||
| *				depending on major,minor version | *				depending on major,minor version | ||||||
| *		'c':	(no args) appends CRLF "\r\n" | *		'c':	(no args) appends CRLF "\r\n" | ||||||
| @@ -1763,17 +1786,15 @@ http_SendStatusResponse( IN SOCKINFO * info, | |||||||
| *		'G':	arg = range information         // add range header | *		'G':	arg = range information         // add range header | ||||||
| *		'h':	arg = off_t number		// appends off_t number | *		'h':	arg = off_t number		// appends off_t number | ||||||
| *		'K':	(no args)                       // add chunky header | *		'K':	(no args)                       // add chunky header | ||||||
| *		'N':	arg1 = off_t content_length       // content-length header | *		'N':	arg1 = int content_length	// content-length header | ||||||
| *		'q':    arg1 = http_method_t            // request start line and HOST header | *               'q':    arg1 = http_method_t, arg2 = (uri_type *) // request start line and HOST header | ||||||
| *			arg2 = (uri_type *) | *		'Q':	arg1 = http_method_t; arg2 = char* url;  | ||||||
| *		'Q':	arg1 = http_method_t;           // start line of request | *				arg3 = int url_length // start line of request | ||||||
| *			arg2 = char* url;  |  | ||||||
| *			arg3 = size_t url_length  |  | ||||||
| *		'R':	arg = int status_code // adds a response start line | *		'R':	arg = int status_code // adds a response start line | ||||||
| *		'S':	(no args) appends HTTP SERVER: header | *		'S':	(no args) appends HTTP SERVER: header | ||||||
| *		's':	arg = const char* C_string | *		's':	arg = const char* C_string | ||||||
| *		'T':	arg = char * content_type; format | *		'T':	arg = char * content_type; format e.g: "text/html";	 | ||||||
| *			e.g: "text/html"; content-type header | *				 content-type header | ||||||
| *		't':	arg = time_t * gmt_time	// appends time in RFC 1123 fmt | *		't':	arg = time_t * gmt_time	// appends time in RFC 1123 fmt | ||||||
| *		'U':	(no args) appends HTTP USER-AGENT: header | *		'U':	(no args) appends HTTP USER-AGENT: header | ||||||
| *               'X':    arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent | *               'X':    arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent | ||||||
| @@ -1794,7 +1815,7 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
| { | { | ||||||
|     char c; |     char c; | ||||||
|     char *s = NULL; |     char *s = NULL; | ||||||
|     size_t num; |     int num; | ||||||
|     off_t bignum; |     off_t bignum; | ||||||
|     size_t length; |     size_t length; | ||||||
|     time_t *loc_time; |     time_t *loc_time; | ||||||
| @@ -1821,26 +1842,31 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|     va_start( argp, fmt ); |     va_start( argp, fmt ); | ||||||
|  |  | ||||||
|     while( ( c = *fmt++ ) != 0 ) { |     while( ( c = *fmt++ ) != 0 ) { | ||||||
|         if( c == 's' ) { |  | ||||||
|             // C string |         if( c == 's' )          // C string | ||||||
|  |         { | ||||||
|             s = ( char * )va_arg( argp, char * ); |             s = ( char * )va_arg( argp, char * ); | ||||||
|  |  | ||||||
|             assert( s ); |             assert( s ); | ||||||
|             UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s);  |  | ||||||
|  |             //DBGONLY(UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s);)  | ||||||
|             if( membuffer_append( buf, s, strlen( s ) ) != 0 ) { |             if( membuffer_append( buf, s, strlen( s ) ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'K' ) { |         } else if( c == 'K' )   // Add Chunky header | ||||||
|             // Add Chunky header |         { | ||||||
|             if( membuffer_append |             if( membuffer_append | ||||||
|                 ( buf, "TRANSFER-ENCODING: chunked\r\n", |                 ( buf, "TRANSFER-ENCODING: chunked\r\n", | ||||||
|                   strlen( "Transfer-Encoding: chunked\r\n" ) ) != 0 ) { |                   strlen( "Transfer-Encoding: chunked\r\n" ) ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'G' ) { |         } else if( c == 'G' )   // Add Range header | ||||||
|             // Add Range header |         { | ||||||
|             struct SendInstruction *RespInstr; |             struct SendInstruction *RespInstr; | ||||||
|             RespInstr = (struct SendInstruction *) |             RespInstr = | ||||||
|                 va_arg( argp, struct SendInstruction *); |                 ( struct SendInstruction * )va_arg( argp, | ||||||
|  |                                                     struct SendInstruction | ||||||
|  |                                                     * ); | ||||||
|             assert( RespInstr ); |             assert( RespInstr ); | ||||||
|             // connection header |             // connection header | ||||||
|             if( membuffer_append |             if( membuffer_append | ||||||
| @@ -1848,43 +1874,48 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|                   strlen( RespInstr->RangeHeader ) ) != 0 ) { |                   strlen( RespInstr->RangeHeader ) ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'b' ) { |  | ||||||
|             // mem buffer |         } else if( c == 'b' )   // mem buffer | ||||||
|  |         { | ||||||
|             s = ( char * )va_arg( argp, char * ); |             s = ( char * )va_arg( argp, char * ); | ||||||
|  |  | ||||||
|             UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__, |             //DBGONLY(UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a char Buffer starting with: %c\n", s[0]);) | ||||||
|                 "Adding a char Buffer starting with: %c\n", s[0]); |  | ||||||
|             assert( s ); |             assert( s ); | ||||||
|             length = ( size_t ) va_arg( argp, size_t ); |             length = ( size_t ) va_arg( argp, size_t ); | ||||||
|             if( membuffer_append( buf, s, length ) != 0 ) { |             if( membuffer_append( buf, s, length ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         else if( c == 'c' ) { |  | ||||||
|             // crlf |         else if( c == 'c' )     // crlf | ||||||
|  |         { | ||||||
|             if( membuffer_append( buf, "\r\n", 2 ) != 0 ) { |             if( membuffer_append( buf, "\r\n", 2 ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         else if( c == 'd' ) { |  | ||||||
|             // integer |         else if( c == 'd' )     // integer | ||||||
|  |         { | ||||||
|             num = ( int )va_arg( argp, int ); |             num = ( int )va_arg( argp, int ); | ||||||
|             sprintf( tempbuf, "%"PRIzu, num ); |  | ||||||
|  |             sprintf( tempbuf, "%d", num ); | ||||||
|             if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { |             if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         else if( c == 'h' ) { |  | ||||||
|             // off_t |         else if( c == 'h' )     // off_t | ||||||
|  |         { | ||||||
|             bignum = ( off_t )va_arg( argp, off_t ); |             bignum = ( off_t )va_arg( argp, off_t ); | ||||||
|  |  | ||||||
|             sprintf( tempbuf, "%"PRId64, (int64_t)bignum ); |             sprintf( tempbuf, "%lld", (int64_t)bignum ); | ||||||
|             if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { |             if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         else if( c == 't' || c == 'D' ) { |  | ||||||
|             // date |         else if( c == 't' || c == 'D' ) // date | ||||||
|  |         { | ||||||
|             if( c == 'D' ) { |             if( c == 'D' ) { | ||||||
|                 // header |                 // header | ||||||
|                 start_str = "DATE: "; |                 start_str = "DATE: "; | ||||||
| @@ -1908,7 +1939,9 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|             if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { |             if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'C' ) { |         } | ||||||
|  |  | ||||||
|  |         else if( c == 'C' ) { | ||||||
|             if( ( http_major_version > 1 ) || |             if( ( http_major_version > 1 ) || | ||||||
|                 ( http_major_version == 1 && http_minor_version == 1 ) |                 ( http_major_version == 1 && http_minor_version == 1 ) | ||||||
|                  ) { |                  ) { | ||||||
| @@ -1918,7 +1951,9 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|                     goto error_handler; |                     goto error_handler; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } else if( c == 'N' ) { |         } | ||||||
|  |  | ||||||
|  |         else if( c == 'N' ) { | ||||||
|             // content-length header |             // content-length header | ||||||
|             bignum = ( off_t )va_arg( argp, off_t ); |             bignum = ( off_t )va_arg( argp, off_t ); | ||||||
|  |  | ||||||
| @@ -1929,8 +1964,11 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|                 "CONTENT-LENGTH: ", bignum ) != 0 ) { |                 "CONTENT-LENGTH: ", bignum ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'S' || c == 'U' ) { |         } | ||||||
|  |  | ||||||
|  |         else if( c == 'S' || c == 'U' ) { | ||||||
|             // SERVER or USER-AGENT header |             // SERVER or USER-AGENT header | ||||||
|  |  | ||||||
|             temp_str = ( c == 'S' ) ? "SERVER: " : "USER-AGENT: "; |             temp_str = ( c == 'S' ) ? "SERVER: " : "USER-AGENT: "; | ||||||
|             get_sdk_info( tempbuf ); |             get_sdk_info( tempbuf ); | ||||||
|             if (http_MakeMessage( |             if (http_MakeMessage( | ||||||
| @@ -1939,25 +1977,34 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|                 temp_str, tempbuf ) != 0 ) { |                 temp_str, tempbuf ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'X' ) { |         } | ||||||
|             // C string |  | ||||||
|  | 	else if( c == 'X' )          // C string | ||||||
|  |         { | ||||||
|             s = ( char * )va_arg( argp, char * ); |             s = ( char * )va_arg( argp, char * ); | ||||||
|  |  | ||||||
|             assert( s ); |             assert( s ); | ||||||
|  |  | ||||||
|             if( membuffer_append_str( buf, "X-User-Agent: ") != 0 ) { |             if( membuffer_append_str( buf, "X-User-Agent: ") != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|             if( membuffer_append( buf, s, strlen( s ) ) != 0 ) { |             if( membuffer_append( buf, s, strlen( s ) ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'R' ) { |         } | ||||||
|  |          | ||||||
|  |         else if( c == 'R' ) { | ||||||
|             // response start line |             // response start line | ||||||
|             //   e.g.: 'HTTP/1.1 200 OK' |             //   e.g.: 'HTTP/1.1 200 OK' | ||||||
|             // |             // | ||||||
|  |  | ||||||
|             // code |             // code | ||||||
|             status_code = ( int )va_arg( argp, int ); |             status_code = ( int )va_arg( argp, int ); | ||||||
|  |  | ||||||
|             assert( status_code > 0 ); |             assert( status_code > 0 ); | ||||||
|             sprintf( tempbuf, "HTTP/%d.%d %d ", |             sprintf( tempbuf, "HTTP/%d.%d %d ", | ||||||
|                      http_major_version, http_minor_version, status_code ); |                      http_major_version, http_minor_version, status_code ); | ||||||
|  |  | ||||||
|             // str |             // str | ||||||
|             status_msg = http_get_code_text( status_code ); |             status_msg = http_get_code_text( status_code ); | ||||||
|             if (http_MakeMessage( |             if (http_MakeMessage( | ||||||
| @@ -1967,31 +2014,40 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|                 status_msg ) != 0 ) { |                 status_msg ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'B' ) { |         } | ||||||
|  |  | ||||||
|  |         else if( c == 'B' ) { | ||||||
|             // body of a simple reply |             // body of a simple reply | ||||||
|             //  |             //  | ||||||
|  |  | ||||||
|             status_code = ( int )va_arg( argp, int ); |             status_code = ( int )va_arg( argp, int ); | ||||||
|  |  | ||||||
|             sprintf( tempbuf, "%s%d %s%s", |             sprintf( tempbuf, "%s%d %s%s", | ||||||
|                      "<html><body><h1>", |                      "<html><body><h1>", | ||||||
|                      status_code, http_get_code_text( status_code ), |                      status_code, http_get_code_text( status_code ), | ||||||
|                      "</h1></body></html>" ); |                      "</h1></body></html>" ); | ||||||
|             bignum = strlen( tempbuf ); |             bignum = strlen( tempbuf ); | ||||||
|  |  | ||||||
|             if (http_MakeMessage( |             if (http_MakeMessage( | ||||||
|                     buf, http_major_version, http_minor_version, |                     buf, http_major_version, http_minor_version, | ||||||
|                     "NTcs", |                     "NTcs", | ||||||
|                     bignum, // content-length |                     bignum, // content-length | ||||||
|                     "text/html",  // content-type |                     "text/html",  // content-type | ||||||
|                     tempbuf ) != 0 // body |                     tempbuf ) != 0 )  // body | ||||||
|             ) { |             { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'Q' ) { |         } | ||||||
|  |  | ||||||
|  |         else if( c == 'Q' ) { | ||||||
|             // request start line |             // request start line | ||||||
|             // GET /foo/bar.html HTTP/1.1\r\n |             // GET /foo/bar.html HTTP/1.1\r\n | ||||||
|  |  | ||||||
|             method = ( http_method_t ) va_arg( argp, http_method_t ); |             method = ( http_method_t ) va_arg( argp, http_method_t ); | ||||||
|             method_str = method_to_str( method ); |             method_str = method_to_str( method ); | ||||||
|             url_str = ( const char * )va_arg( argp, const char * ); |             url_str = ( const char * )va_arg( argp, const char * ); | ||||||
|             num = ( size_t )va_arg( argp, size_t );   // length of url_str |             num = ( int )va_arg( argp, int );   // length of url_str | ||||||
|  |  | ||||||
|             if (http_MakeMessage( |             if (http_MakeMessage( | ||||||
|                 buf, http_major_version, http_minor_version, |                 buf, http_major_version, http_minor_version, | ||||||
|                 "ssbsdsdc", |                 "ssbsdsdc", | ||||||
| @@ -2000,15 +2056,20 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|                 " HTTP/", http_major_version, ".", http_minor_version ) != 0 ) { |                 " HTTP/", http_major_version, ".", http_minor_version ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'q' ) { |         } | ||||||
|  |  | ||||||
|  |         else if( c == 'q' ) { | ||||||
|             // request start line and HOST header |             // request start line and HOST header | ||||||
|  |  | ||||||
|             method = ( http_method_t ) va_arg( argp, http_method_t ); |             method = ( http_method_t ) va_arg( argp, http_method_t ); | ||||||
|  |  | ||||||
|             uri_ptr = ( uri_type * ) va_arg( argp, uri_type * ); |             uri_ptr = ( uri_type * ) va_arg( argp, uri_type * ); | ||||||
|             assert( uri_ptr ); |             assert( uri_ptr ); | ||||||
|             if( http_FixUrl( uri_ptr, &url ) != 0 ) { |             if( http_FixUrl( uri_ptr, &url ) != 0 ) { | ||||||
|                 error_code = UPNP_E_INVALID_URL; |                 error_code = UPNP_E_INVALID_URL; | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (http_MakeMessage( |             if (http_MakeMessage( | ||||||
|                 buf, http_major_version, http_minor_version, |                 buf, http_major_version, http_minor_version, | ||||||
|                 "Q" "sbc", |                 "Q" "sbc", | ||||||
| @@ -2016,16 +2077,21 @@ http_MakeMessage( INOUT membuffer * buf, | |||||||
|                 "HOST: ", url.hostport.text.buff, url.hostport.text.size ) != 0 ) { |                 "HOST: ", url.hostport.text.buff, url.hostport.text.size ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else if( c == 'T' ) { |         } | ||||||
|  |  | ||||||
|  |         else if( c == 'T' ) { | ||||||
|             // content type header |             // content type header | ||||||
|             temp_str = ( const char * )va_arg( argp, const char * );    // type/subtype format |             temp_str = ( const char * )va_arg( argp, const char * );    // type/subtype format | ||||||
|  |  | ||||||
|             if (http_MakeMessage( |             if (http_MakeMessage( | ||||||
|                 buf, http_major_version, http_minor_version, |                 buf, http_major_version, http_minor_version, | ||||||
| 		"ssc", | 		"ssc", | ||||||
|                 "CONTENT-TYPE: ", temp_str ) != 0 ) { |                 "CONTENT-TYPE: ", temp_str ) != 0 ) { | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|             } |             } | ||||||
|         } else { |         } | ||||||
|  |  | ||||||
|  |         else { | ||||||
|             assert( 0 ); |             assert( 0 ); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -2095,20 +2161,23 @@ MakeGetMessageEx( const char *url_str, | |||||||
| { | { | ||||||
|     int errCode = UPNP_E_SUCCESS; |     int errCode = UPNP_E_SUCCESS; | ||||||
|     char *urlPath = NULL; |     char *urlPath = NULL; | ||||||
|     size_t hostlen = 0; |     int hostlen = 0; | ||||||
|     char *hoststr, |     char *hoststr, | ||||||
|      *temp; |      *temp; | ||||||
|  |  | ||||||
|     do { |     do { | ||||||
|         UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                              "DOWNLOAD URL : %s\n", url_str ); |                              "DOWNLOAD URL : %s\n", url_str ); | ||||||
|  |              ) | ||||||
|  |  | ||||||
|             if( ( errCode = http_FixStrUrl( ( char * )url_str, |             if( ( errCode = http_FixStrUrl( ( char * )url_str, | ||||||
|             strlen( url_str ), url ) ) != UPNP_E_SUCCESS ) { |                                             strlen( url_str ), | ||||||
|  |                                             url ) ) != UPNP_E_SUCCESS ) { | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
|         // make msg |         // make msg | ||||||
|         membuffer_init( request ); |         membuffer_init( request ); | ||||||
|  |  | ||||||
|         urlPath = alloca( strlen( url_str ) + 1 ); |         urlPath = alloca( strlen( url_str ) + 1 ); | ||||||
|         if( !urlPath ) { |         if( !urlPath ) { | ||||||
|             errCode = UPNP_E_OUTOF_MEMORY; |             errCode = UPNP_E_OUTOF_MEMORY; | ||||||
| @@ -2116,7 +2185,9 @@ MakeGetMessageEx( const char *url_str, | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         memset( urlPath, 0, strlen( url_str ) + 1 ); |         memset( urlPath, 0, strlen( url_str ) + 1 ); | ||||||
|  |  | ||||||
|         strcpy( urlPath, url_str ); |         strcpy( urlPath, url_str ); | ||||||
|  |  | ||||||
|         hoststr = strstr( urlPath, "//" ); |         hoststr = strstr( urlPath, "//" ); | ||||||
|         if( hoststr == NULL ) { |         if( hoststr == NULL ) { | ||||||
|             errCode = UPNP_E_INVALID_URL; |             errCode = UPNP_E_INVALID_URL; | ||||||
| @@ -2133,30 +2204,33 @@ MakeGetMessageEx( const char *url_str, | |||||||
|         *temp = '\0'; |         *temp = '\0'; | ||||||
|         hostlen = strlen( hoststr ); |         hostlen = strlen( hoststr ); | ||||||
|         *temp = '/'; |         *temp = '/'; | ||||||
|         UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |  | ||||||
|             "HOSTNAME : %s Length : %"PRIzu"\n", |         DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|             hoststr, hostlen ); |                              "HOSTNAME : %s Length : %d\n", hoststr, | ||||||
|  |                              hostlen ); | ||||||
|  |              ) | ||||||
|  |  | ||||||
|             errCode = http_MakeMessage( |             errCode = http_MakeMessage( | ||||||
|                 request, 1, 1, |                 request, 1, 1, | ||||||
|                 "Q" "s" "bc" "GDCUc", |                 "QsbcGDCUc", | ||||||
|                 HTTPMETHOD_GET, url->pathquery.buff, url->pathquery.size, |                 HTTPMETHOD_GET, | ||||||
|                 "HOST: ", |                 url->pathquery.buff, url->pathquery.size, | ||||||
| 		hoststr, hostlen, |                 "HOST: ", hoststr, hostlen, | ||||||
|                 pRangeSpecifier ); |                 pRangeSpecifier ); | ||||||
|  |  | ||||||
|         if( errCode != 0 ) { |         if( errCode != 0 ) { | ||||||
|             UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                                  "HTTP Makemessage failed\n" ); |                                  "HTTP Makemessage failed\n" ); | ||||||
|  |                  ) | ||||||
|                 membuffer_destroy( request ); |                 membuffer_destroy( request ); | ||||||
|  |  | ||||||
|             return errCode; |             return errCode; | ||||||
|         } |         } | ||||||
|     } while( 0 ); |     } while( 0 ); | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                          "HTTP Buffer:\n %s\n" "----------END--------\n", |                          "HTTP Buffer:\n %s\n" "----------END--------\n", | ||||||
|                          request->buf ); |                          request->buf ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         return errCode; |         return errCode; | ||||||
| } | } | ||||||
| @@ -2345,7 +2419,7 @@ http_OpenHttpGetEx( IN const char *url_str, | |||||||
| *	Description :	Returns the server information for the operating  | *	Description :	Returns the server information for the operating  | ||||||
| *		system | *		system | ||||||
| * | * | ||||||
| *	Return :	UPNP_INLINE void | *	Return :	XINLINE void | ||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
|   | |||||||
| @@ -118,7 +118,7 @@ static xboolean gInitialized = FALSE; | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 void																 | *	 void																 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| init_table( IN const char *encoded_str, | init_table( IN const char *encoded_str, | ||||||
|             OUT const char *table[], |             OUT const char *table[], | ||||||
|             IN int tbl_size ) |             IN int tbl_size ) | ||||||
| @@ -144,7 +144,7 @@ init_table( IN const char *encoded_str, | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 void																 | *	 void																 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| init_tables( void ) | init_tables( void ) | ||||||
| { | { | ||||||
|     init_table( Http1xxStr, Http1xxCodes, NUM_1XX_CODES ); |     init_table( Http1xxStr, Http1xxCodes, NUM_1XX_CODES ); | ||||||
|   | |||||||
| @@ -39,7 +39,6 @@ | |||||||
| #include <fcntl.h> | #include <fcntl.h> | ||||||
| #ifndef UPNP_USE_BCBPP | #ifndef UPNP_USE_BCBPP | ||||||
| #ifndef UPNP_USE_MSVCPP | #ifndef UPNP_USE_MSVCPP | ||||||
|     #include <inttypes.h> |  | ||||||
|  #include <stdint.h> |  #include <stdint.h> | ||||||
| #endif | #endif | ||||||
| #endif | #endif | ||||||
| @@ -205,7 +204,7 @@ extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES]; | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 void																 | *	 void																 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| media_list_init( void ) | media_list_init( void ) | ||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
| @@ -243,7 +242,7 @@ media_list_init( void ) | |||||||
| *	 0 on success;														 | *	 0 on success;														 | ||||||
| *	-1 on error															 | *	-1 on error															 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| search_extension( IN const char *extension, | search_extension( IN const char *extension, | ||||||
|                   OUT const char **con_type, |                   OUT const char **con_type, | ||||||
|                   OUT const char **con_subtype ) |                   OUT const char **con_subtype ) | ||||||
| @@ -290,7 +289,7 @@ search_extension( IN const char *extension, | |||||||
| *	 0 - On Sucess														 | *	 0 - On Sucess														 | ||||||
| *	 UPNP_E_OUTOF_MEMORY - on memory allocation failures				 | *	 UPNP_E_OUTOF_MEMORY - on memory allocation failures				 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| UPNP_INLINE int | XINLINE int | ||||||
| get_content_type( IN const char *filename, | get_content_type( IN const char *filename, | ||||||
|                   OUT DOMString * content_type ) |                   OUT DOMString * content_type ) | ||||||
| { | { | ||||||
| @@ -348,7 +347,7 @@ get_content_type( IN const char *filename, | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 void																 | *	 void																 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| glob_alias_init( void ) | glob_alias_init( void ) | ||||||
| { | { | ||||||
|     struct xml_alias_t *alias = &gAliasDoc; |     struct xml_alias_t *alias = &gAliasDoc; | ||||||
| @@ -370,7 +369,7 @@ glob_alias_init( void ) | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 BOOLEAN															 | *	 BOOLEAN															 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE xboolean | static XINLINE xboolean | ||||||
| is_valid_alias( IN const struct xml_alias_t *alias ) | is_valid_alias( IN const struct xml_alias_t *alias ) | ||||||
| { | { | ||||||
|     return alias->doc.buf != NULL; |     return alias->doc.buf != NULL; | ||||||
| @@ -637,11 +636,11 @@ get_file_info( IN const char *filename, | |||||||
|  |  | ||||||
|     rc = get_content_type( filename, &info->content_type ); |     rc = get_content_type( filename, &info->content_type ); | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                          "file info: %s, length: %lld, last_mod=%s readable=%d\n", |                          "file info: %s, length: %lld, last_mod=%s readable=%d\n", | ||||||
|                          filename, (long long)info->file_length, |                          filename, (long long)info->file_length, | ||||||
|                          asctime( gmtime( &info->last_modified ) ), |                          asctime( gmtime( &info->last_modified ) ), | ||||||
|         info->is_readable ); |                          info->is_readable ); ) | ||||||
|  |  | ||||||
|         return rc; |         return rc; | ||||||
| } | } | ||||||
| @@ -700,7 +699,7 @@ web_server_set_root_dir( IN const char *root_dir ) | |||||||
| *	TRUE - On Success													 | *	TRUE - On Success													 | ||||||
| *	FALSE if request is not an alias									 | *	FALSE if request is not an alias									 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE xboolean | static XINLINE xboolean | ||||||
| get_alias( IN const char *request_file, | get_alias( IN const char *request_file, | ||||||
|            OUT struct xml_alias_t *alias, |            OUT struct xml_alias_t *alias, | ||||||
|            OUT struct File_Info *info ) |            OUT struct File_Info *info ) | ||||||
| @@ -880,24 +879,22 @@ GetNextRange( char **SrcRangeStr, | |||||||
|               off_t *FirstByte, |               off_t *FirstByte, | ||||||
|               off_t *LastByte ) |               off_t *LastByte ) | ||||||
| { | { | ||||||
|     char *Ptr; |     char *Ptr, | ||||||
|     char *Tok; |      *Tok; | ||||||
|     int i; |     int i, | ||||||
|     int64_t F = -1; |       F = -1, | ||||||
|     int64_t L = -1; |       L = -1; | ||||||
|     int Is_Suffix_byte_Range = 1; |     int Is_Suffix_byte_Range = 1; | ||||||
|  |  | ||||||
|     if( *SrcRangeStr == NULL ) { |     if( *SrcRangeStr == NULL ) | ||||||
|         return -1; |         return -1; | ||||||
|     } |  | ||||||
|  |  | ||||||
|     Tok = StrTok( SrcRangeStr, "," ); |     Tok = StrTok( SrcRangeStr, "," ); | ||||||
|  |  | ||||||
|     if( ( Ptr = strstr( Tok, "-" ) ) == NULL ) { |     if( ( Ptr = strstr( Tok, "-" ) ) == NULL ) | ||||||
|         return -1; |         return -1; | ||||||
|     } |  | ||||||
|     *Ptr = ' '; |     *Ptr = ' '; | ||||||
|     sscanf( Tok, "%"SCNd64"%"SCNd64, &F, &L ); |     sscanf( Tok, "%d%d", &F, &L ); | ||||||
|  |  | ||||||
|     if( F == -1 || L == -1 ) { |     if( F == -1 || L == -1 ) { | ||||||
|         *Ptr = '-'; |         *Ptr = '-'; | ||||||
| @@ -912,15 +909,16 @@ GetNextRange( char **SrcRangeStr, | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if( Is_Suffix_byte_Range ) { |         if( Is_Suffix_byte_Range ) { | ||||||
|             *FirstByte = (off_t)L; |             *FirstByte = L; | ||||||
|             *LastByte = (off_t)F; |             *LastByte = F; | ||||||
|             return 1; |             return 1; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     *FirstByte = (off_t)F; |  | ||||||
|     *LastByte = (off_t)L; |  | ||||||
|  |  | ||||||
|  |     *FirstByte = F; | ||||||
|  |     *LastByte = L; | ||||||
|     return 1; |     return 1; | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -992,7 +990,7 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, | |||||||
|             Instr->RangeOffset = FirstByte; |             Instr->RangeOffset = FirstByte; | ||||||
|             Instr->ReadSendSize = LastByte - FirstByte + 1; |             Instr->ReadSendSize = LastByte - FirstByte + 1; | ||||||
|             sprintf( Instr->RangeHeader, |             sprintf( Instr->RangeHeader, | ||||||
|                 "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", |                 "CONTENT-RANGE: bytes %lld-%lld/%lld\r\n", | ||||||
|                 (int64_t)FirstByte, |                 (int64_t)FirstByte, | ||||||
|                 (int64_t)LastByte, |                 (int64_t)LastByte, | ||||||
|                 (int64_t)FileLength );   //Data between two range. |                 (int64_t)FileLength );   //Data between two range. | ||||||
| @@ -1001,7 +999,7 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, | |||||||
|             Instr->RangeOffset = FirstByte; |             Instr->RangeOffset = FirstByte; | ||||||
|             Instr->ReadSendSize = FileLength - FirstByte; |             Instr->ReadSendSize = FileLength - FirstByte; | ||||||
|             sprintf( Instr->RangeHeader, |             sprintf( Instr->RangeHeader, | ||||||
|                      "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", |                      "CONTENT-RANGE: bytes %lld-%lld/%lld\r\n", | ||||||
|                      (int64_t)FirstByte, |                      (int64_t)FirstByte, | ||||||
|                      (int64_t)(FileLength - 1), |                      (int64_t)(FileLength - 1), | ||||||
|                      (int64_t)FileLength ); |                      (int64_t)FileLength ); | ||||||
| @@ -1010,14 +1008,14 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, | |||||||
|                 Instr->RangeOffset = 0; |                 Instr->RangeOffset = 0; | ||||||
|                 Instr->ReadSendSize = FileLength; |                 Instr->ReadSendSize = FileLength; | ||||||
|                 sprintf( Instr->RangeHeader, |                 sprintf( Instr->RangeHeader, | ||||||
|                          "CONTENT-RANGE: bytes 0-%"PRId64"/%"PRId64"\r\n", |                          "CONTENT-RANGE: bytes 0-%lld/%lld\r\n", | ||||||
|                          (int64_t)(FileLength - 1), |                          (int64_t)(FileLength - 1), | ||||||
|                          (int64_t)FileLength ); |                          (int64_t)FileLength ); | ||||||
|             } else { |             } else { | ||||||
|                 Instr->RangeOffset = FileLength - LastByte; |                 Instr->RangeOffset = FileLength - LastByte; | ||||||
|                 Instr->ReadSendSize = LastByte; |                 Instr->ReadSendSize = LastByte; | ||||||
|                 sprintf( Instr->RangeHeader, |                 sprintf( Instr->RangeHeader, | ||||||
|                          "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n", |                          "CONTENT-RANGE: bytes %lld-%lld/%lld\r\n", | ||||||
|                          (int64_t)(FileLength - LastByte + 1), |                          (int64_t)(FileLength - LastByte + 1), | ||||||
|                          (int64_t)FileLength, |                          (int64_t)FileLength, | ||||||
|                          (int64_t)FileLength ); |                          (int64_t)FileLength ); | ||||||
| @@ -1208,7 +1206,7 @@ process_request( IN http_message_t * req, | |||||||
|     int resp_major, |     int resp_major, | ||||||
|       resp_minor; |       resp_minor; | ||||||
|     xboolean alias_grabbed; |     xboolean alias_grabbed; | ||||||
|     size_t dummy; |     int dummy; | ||||||
|     struct UpnpVirtualDirCallbacks *pVirtualDirCallback; |     struct UpnpVirtualDirCallbacks *pVirtualDirCallback; | ||||||
|  |  | ||||||
|     print_http_headers( req ); |     print_http_headers( req ); | ||||||
| @@ -1532,7 +1530,7 @@ http_RecvPostMessage( http_parser_t * parser, | |||||||
|  |  | ||||||
|     if( Instr && Instr->IsVirtualFile ) { |     if( Instr && Instr->IsVirtualFile ) { | ||||||
|  |  | ||||||
|         Fp = (virtualDirCallback.open)( filename, UPNP_WRITE ); |         Fp = virtualDirCallback.open( filename, UPNP_WRITE ); | ||||||
|         if( Fp == NULL ) { |         if( Fp == NULL ) { | ||||||
|             return HTTP_INTERNAL_SERVER_ERROR; |             return HTTP_INTERNAL_SERVER_ERROR; | ||||||
|         } |         } | ||||||
| @@ -1587,10 +1585,13 @@ http_RecvPostMessage( http_parser_t * parser, | |||||||
|                 } |                 } | ||||||
|             } else if( num_read == 0 ) { |             } else if( num_read == 0 ) { | ||||||
|                 if( ok_on_close ) { |                 if( ok_on_close ) { | ||||||
|                     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |                     DBGONLY( UpnpPrintf | ||||||
|  |                              ( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                                "<<< (RECVD) <<<\n%s\n-----------------\n", |                                "<<< (RECVD) <<<\n%s\n-----------------\n", | ||||||
|                                parser->msg.msg.buf ); |                                parser->msg.msg.buf ); | ||||||
|                     print_http_headers( &parser->msg ); |                              //print_http_headers( &parser->msg ); | ||||||
|  |                          ) | ||||||
|  |  | ||||||
|                         parser->position = POS_COMPLETE; |                         parser->position = POS_COMPLETE; | ||||||
|                 } else { |                 } else { | ||||||
|                     // partial msg |                     // partial msg | ||||||
| @@ -1758,8 +1759,9 @@ web_server_callback( IN http_parser_t * parser, | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, | ||||||
|                          "webserver: request processed...\n" ); |                          "webserver: request processed...\n" ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         membuffer_destroy( &headers ); |         membuffer_destroy( &headers ); | ||||||
|     membuffer_destroy( &filename ); |     membuffer_destroy( &filename ); | ||||||
|   | |||||||
| @@ -231,15 +231,6 @@ sock_read_write( IN SOCKINFO * info, | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef SO_NOSIGPIPE |  | ||||||
|     { |  | ||||||
| 	int old; |  | ||||||
| 	int set = 1; |  | ||||||
| 	socklen_t olen = sizeof(old); |  | ||||||
| 	getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen); |  | ||||||
| 	setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set)); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|     if( bRead ) { |     if( bRead ) { | ||||||
|         // read data |         // read data | ||||||
|         numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL); |         numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL); | ||||||
| @@ -252,9 +243,6 @@ sock_read_write( IN SOCKINFO * info, | |||||||
|                 send( sockfd, buffer + bytes_sent, byte_left, |                 send( sockfd, buffer + bytes_sent, byte_left, | ||||||
|                       MSG_DONTROUTE|MSG_NOSIGNAL); |                       MSG_DONTROUTE|MSG_NOSIGNAL); | ||||||
|             if( num_written == -1 ) { |             if( num_written == -1 ) { | ||||||
| #ifdef SO_NOSIGPIPE |  | ||||||
| 	        setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen); |  | ||||||
| #endif |  | ||||||
|                 return num_written; |                 return num_written; | ||||||
|             } |             } | ||||||
|  |  | ||||||
| @@ -265,11 +253,6 @@ sock_read_write( IN SOCKINFO * info, | |||||||
|         numBytes = bytes_sent; |         numBytes = bytes_sent; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef SO_NOSIGPIPE |  | ||||||
| 	setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|     if( numBytes < 0 ) { |     if( numBytes < 0 ) { | ||||||
|         return UPNP_E_SOCKET_ERROR; |         return UPNP_E_SOCKET_ERROR; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -34,11 +34,8 @@ | |||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
|  |  | ||||||
| #ifdef __FreeBSD__ | #ifdef __FreeBSD__ | ||||||
| #include <osreldate.h> |  | ||||||
| #if __FreeBSD_version < 601103 |  | ||||||
| #include <lwres/netdb.h> | #include <lwres/netdb.h> | ||||||
| #endif | #endif | ||||||
| #endif |  | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include "uri.h" | #include "uri.h" | ||||||
|  |  | ||||||
| @@ -160,7 +157,7 @@ is_escaped( const char *in ) | |||||||
| int | int | ||||||
| replace_escaped( char *in, | replace_escaped( char *in, | ||||||
|                  int index, |                  int index, | ||||||
|                  size_t *max ) |                  int *max ) | ||||||
| { | { | ||||||
|     int tempInt = 0; |     int tempInt = 0; | ||||||
|     char tempChar = 0; |     char tempChar = 0; | ||||||
| @@ -367,20 +364,16 @@ free_URL_list( URL_list * list ) | |||||||
| *		uri_type *in ;	URI object | *		uri_type *in ;	URI object | ||||||
| * | * | ||||||
| *	Description : Function useful in debugging for printing a parsed uri. | *	Description : Function useful in debugging for printing a parsed uri. | ||||||
|  | *		Compiled out with DBGONLY macro.  | ||||||
| * | * | ||||||
| *	Return : void ; | *	Return : void ; | ||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY( void print_uri( uri_type * in ) { | ||||||
| void print_uri( uri_type *in ) |  | ||||||
| { |  | ||||||
|          print_token( &in->scheme ); |          print_token( &in->scheme ); | ||||||
|          print_token( &in->hostport.text ); |          print_token( &in->hostport.text ); | ||||||
|     print_token( &in->pathquery ); |          print_token( &in->pathquery ); print_token( &in->fragment );} ) | ||||||
|     print_token( &in->fragment ); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	print_token | *	Function :	print_token | ||||||
| @@ -389,23 +382,20 @@ void print_uri( uri_type *in ) | |||||||
| *		token * in ;	token | *		token * in ;	token | ||||||
| * | * | ||||||
| *	Description : Function useful in debugging for printing a token. | *	Description : Function useful in debugging for printing a token. | ||||||
|  | *		Compiled out with DBGONLY macro.  | ||||||
| * | * | ||||||
| *	Return : void ; | *	Return : void ; | ||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY( void print_token( token * in ) { | ||||||
| void print_token(token * in) |  | ||||||
| { |  | ||||||
|          int i = 0; |          int i = 0; | ||||||
|     printf( "Token Size : %"PRIzu"\n\'", in->size ); |          printf( "Token Size : %d\n\'", in->size ); | ||||||
|          for( i = 0; i < in->size; i++ ) { |          for( i = 0; i < in->size; i++ ) { | ||||||
|         putchar( in->buff[i] ); |          putchar( in->buff[i] );} | ||||||
|     } |          putchar( '\'' ); putchar( '\n' );} | ||||||
|     putchar( '\'' ); |  | ||||||
|     putchar( '\n' ); |  ) | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	token_string_casecmp | *	Function :	token_string_casecmp | ||||||
| @@ -424,10 +414,8 @@ void print_token(token * in) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int token_string_casecmp( |     int token_string_casecmp( token * in1, | ||||||
|     token * in1, |                               char *in2 ) { | ||||||
|     char *in2 ) |  | ||||||
| { |  | ||||||
|     int in2_length = strlen( in2 ); |     int in2_length = strlen( in2 ); | ||||||
|  |  | ||||||
|     if( in1->size != in2_length ) |     if( in1->size != in2_length ) | ||||||
| @@ -555,7 +543,7 @@ parse_hostport( const char *in, | |||||||
|     int begin_port; |     int begin_port; | ||||||
|     int hostport_size = 0; |     int hostport_size = 0; | ||||||
|     int host_size = 0; |     int host_size = 0; | ||||||
| #if !defined(WIN32) && !defined(__OSX__) | #ifndef WIN32 | ||||||
|     char temp_hostbyname_buff[BUFFER_SIZE]; |     char temp_hostbyname_buff[BUFFER_SIZE]; | ||||||
|     struct hostent h_buf; |     struct hostent h_buf; | ||||||
| #endif | #endif | ||||||
| @@ -623,64 +611,28 @@ parse_hostport( const char *in, | |||||||
|         int errCode = 0; |         int errCode = 0; | ||||||
|  |  | ||||||
|         //call gethostbyname_r (reentrant form of gethostbyname) |         //call gethostbyname_r (reentrant form of gethostbyname) | ||||||
|         // TODO: Use autoconf to discover this rather than the | #if defined(WIN32) | ||||||
|         // platform-specific stuff below |  | ||||||
| #if defined(WIN32) || defined(__CYGWIN__) |  | ||||||
|         h=gethostbyname(temp_host_name); |         h=gethostbyname(temp_host_name); | ||||||
| #elif defined(SPARC_SOLARIS) | #elif defined(SPARC_SOLARIS) | ||||||
|         errCode = gethostbyname_r( |         errCode = gethostbyname_r( temp_host_name, | ||||||
|                 temp_host_name, |  | ||||||
|                                    &h, |                                    &h, | ||||||
|                                    temp_hostbyname_buff, |                                    temp_hostbyname_buff, | ||||||
|                                    BUFFER_SIZE, &errcode ); |                                    BUFFER_SIZE, &errcode ); | ||||||
| #elif defined(__FreeBSD__) && __FreeBSD_version < 601103 | #elif defined(__FreeBSD__) | ||||||
|         h = lwres_gethostbyname_r( |         h = lwres_gethostbyname_r( temp_host_name, | ||||||
|                 temp_host_name, |  | ||||||
|                                    &h_buf, |                                    &h_buf, | ||||||
|                                    temp_hostbyname_buff, |                                    temp_hostbyname_buff, | ||||||
|                                    BUFFER_SIZE, &errcode ); |                                    BUFFER_SIZE, &errcode ); | ||||||
|         if ( h == NULL ) { |         if ( h == NULL ) { | ||||||
|             errCode = 1; |             errCode = 1; | ||||||
|         } |         } | ||||||
| #elif defined(__OSX__) | #else | ||||||
|         h = gethostbyname(temp_host_name); |         errCode = gethostbyname_r( temp_host_name, | ||||||
|         if ( h == NULL ) { |  | ||||||
|                 errCode = 1; |  | ||||||
|         } |  | ||||||
| #elif defined(__linux__) |  | ||||||
|         errCode = gethostbyname_r( |  | ||||||
|                 temp_host_name, |  | ||||||
|                                    &h_buf, |                                    &h_buf, | ||||||
|                                    temp_hostbyname_buff, |                                    temp_hostbyname_buff, | ||||||
|                                    BUFFER_SIZE, &h, &errcode ); |                                    BUFFER_SIZE, &h, &errcode ); | ||||||
| #else |  | ||||||
|         { |  | ||||||
|         struct addrinfo hints, *res, *res0; |  | ||||||
|  |  | ||||||
|         h = NULL; |  | ||||||
|         memset(&hints, 0, sizeof(hints)); |  | ||||||
|         hints.ai_family = PF_INET; |  | ||||||
|         hints.ai_socktype = SOCK_STREAM; |  | ||||||
|         errCode = getaddrinfo(temp_host_name, "http", &hints, &res0); |  | ||||||
|  |  | ||||||
|         if (!errCode) { |  | ||||||
|             for (res = res0; res; res = res->ai_next) { |  | ||||||
|                 if (res->ai_family == PF_INET && |  | ||||||
|                     res->ai_addr->sa_family == AF_INET) |  | ||||||
|                 { |  | ||||||
|                     h = &h_buf; |  | ||||||
|                     h->h_addrtype = res->ai_addr->sa_family; |  | ||||||
|                     h->h_length = 4; |  | ||||||
|                     h->h_addr = (void *) temp_hostbyname_buff; |  | ||||||
|                     *(struct in_addr *)h->h_addr = |  | ||||||
|                         ((struct sockaddr_in *)res->ai_addr)->sin_addr; |  | ||||||
|                         break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             freeaddrinfo(res0); |  | ||||||
|         } |  | ||||||
|         } |  | ||||||
| #endif  | #endif  | ||||||
|  |  | ||||||
|         if( errCode == 0 ) { |         if( errCode == 0 ) { | ||||||
|             if( h ) { |             if( h ) { | ||||||
|                 if( ( h->h_addrtype == AF_INET ) && ( h->h_length == 4 ) ) { |                 if( ( h->h_addrtype == AF_INET ) && ( h->h_length == 4 ) ) { | ||||||
| @@ -779,7 +731,7 @@ parse_scheme( const char *in, | |||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int | int | ||||||
| remove_escaped_chars( INOUT char *in, | remove_escaped_chars( INOUT char *in, | ||||||
|                       INOUT size_t *size ) |                       INOUT int *size ) | ||||||
| { | { | ||||||
|     int i = 0; |     int i = 0; | ||||||
|  |  | ||||||
| @@ -833,8 +785,9 @@ remove_dots( char *in, | |||||||
|         return UPNP_E_OUTOF_MEMORY; |         return UPNP_E_OUTOF_MEMORY; | ||||||
|  |  | ||||||
|     Segments[0] = NULL; |     Segments[0] = NULL; | ||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|         "REMOVE_DOTS: before: %s\n", in ); |              ( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|  |                "REMOVE_DOTS: before: %s\n", in ) ); | ||||||
|     while( ( copyFrom < max ) && ( *copyFrom != '?' ) |     while( ( copyFrom < max ) && ( *copyFrom != '?' ) | ||||||
|            && ( *copyFrom != '#' ) ) { |            && ( *copyFrom != '#' ) ) { | ||||||
|  |  | ||||||
| @@ -879,8 +832,9 @@ remove_dots( char *in, | |||||||
|     } |     } | ||||||
|     ( *copyTo ) = 0; |     ( *copyTo ) = 0; | ||||||
|     free( Segments ); |     free( Segments ); | ||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf | ||||||
|         "REMOVE_DOTS: after: %s\n", in ); |              ( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|  |                "REMOVE_DOTS: after: %s\n", in ) ); | ||||||
|     return UPNP_E_SUCCESS; |     return UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -433,7 +433,7 @@ FindServiceControlURLPath( service_table * table, | |||||||
| * | * | ||||||
| *	Parameters : | *	Parameters : | ||||||
| *		service_info *service ;Service whose information is to be printed | *		service_info *service ;Service whose information is to be printed | ||||||
| *		Upnp_LogLevel level ; Debug level specified to the print function | *		Dbg_Level level ; Debug level specified to the print function | ||||||
| *		Dbg_Module module ;	Debug module specified to the print function | *		Dbg_Module module ;	Debug module specified to the print function | ||||||
| * | * | ||||||
| *	Description :	For debugging purposes prints information from the  | *	Description :	For debugging purposes prints information from the  | ||||||
| @@ -443,54 +443,38 @@ FindServiceControlURLPath( service_table * table, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY( void printService( service_info * service, Dbg_Level level, | ||||||
| void printService( |                             Dbg_Module module ) { | ||||||
|     service_info *service, |  | ||||||
|     Upnp_LogLevel level, |  | ||||||
|     Dbg_Module module ) |  | ||||||
| { |  | ||||||
|          if( service ) { |          if( service ) { | ||||||
|         if( service->serviceType ) { |          if( service->serviceType ) | ||||||
|          UpnpPrintf( level, module, __FILE__, __LINE__, |          UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                      "serviceType: %s\n", service->serviceType ); |                      "serviceType: %s\n", service->serviceType ); | ||||||
|         } |          if( service->serviceId ) | ||||||
|         if( service->serviceId ) { |          UpnpPrintf( level, module, __FILE__, __LINE__, "serviceId: %s\n", | ||||||
|             UpnpPrintf( level, module, __FILE__, __LINE__, |                      service->serviceId ); if( service->SCPDURL ) | ||||||
|                 "serviceId: %s\n", service->serviceId ); |          UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n", | ||||||
|         } |                      service->SCPDURL ); if( service->controlURL ) | ||||||
| 	if( service->SCPDURL ) { |          UpnpPrintf( level, module, __FILE__, __LINE__, "controlURL: %s\n", | ||||||
|             UpnpPrintf( level, module, __FILE__, __LINE__, |                      service->controlURL ); if( service->eventURL ) | ||||||
|                 "SCPDURL: %s\n", service->SCPDURL ); |          UpnpPrintf( level, module, __FILE__, __LINE__, "eventURL: %s\n", | ||||||
|         } |                      service->eventURL ); if( service->UDN ) | ||||||
| 	if( service->controlURL ) { |          UpnpPrintf( level, module, __FILE__, __LINE__, "UDN: %s\n\n", | ||||||
|             UpnpPrintf( level, module, __FILE__, __LINE__, |                      service->UDN ); if( service->active ) | ||||||
|                 "controlURL: %s\n", service->controlURL ); |  | ||||||
|         } |  | ||||||
| 	if( service->eventURL ) { |  | ||||||
|             UpnpPrintf( level, module, __FILE__, __LINE__, |  | ||||||
|                 "eventURL: %s\n", service->eventURL ); |  | ||||||
|         } |  | ||||||
| 	if( service->UDN ) { |  | ||||||
|             UpnpPrintf( level, module, __FILE__, __LINE__, |  | ||||||
|                 "UDN: %s\n\n", service->UDN ); |  | ||||||
|         } |  | ||||||
| 	if( service->active ) { |  | ||||||
|          UpnpPrintf( level, module, __FILE__, __LINE__, |          UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                      "Service is active\n" ); |                      "Service is active\n" ); | ||||||
|         } else { |          else | ||||||
|          UpnpPrintf( level, module, __FILE__, __LINE__, |          UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|             "Service is inactive\n" ); |                      "Service is inactive\n" );} | ||||||
|          } |          } | ||||||
|     } |  | ||||||
| } |  ) | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	printServiceList | *	Function :	printServiceList | ||||||
| * | * | ||||||
| *	Parameters : | *	Parameters : | ||||||
| *		service_info *service ;	Service whose information is to be printed | *		service_info *service ;	Service whose information is to be printed | ||||||
| *		Upnp_LogLevel level ;	Debug level specified to the print function | *		Dbg_Level level ;	Debug level specified to the print function | ||||||
| *		Dbg_Module module ;	Debug module specified to the print function | *		Dbg_Module module ;	Debug module specified to the print function | ||||||
| * | * | ||||||
| *	Description :	For debugging purposes prints information of each  | *	Description :	For debugging purposes prints information of each  | ||||||
| @@ -500,55 +484,43 @@ void printService( | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG |     DBGONLY( void printServiceList( service_info * service, | ||||||
| void printServiceList( |                                     Dbg_Level level, | ||||||
|     service_info * service, |                                     Dbg_Module module ) { | ||||||
|     Upnp_LogLevel level, |  | ||||||
|     Dbg_Module module ) |  | ||||||
| { |  | ||||||
|              while( service ) { |              while( service ) { | ||||||
|         if( service->serviceType ) { |              if( service->serviceType ) | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "serviceType: %s\n", service->serviceType ); |                          "serviceType: %s\n", service->serviceType ); | ||||||
|         } |              if( service->serviceId ) | ||||||
|         if( service->serviceId ) { |  | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "serviceId: %s\n", service->serviceId ); |                          "serviceId: %s\n", service->serviceId ); | ||||||
|         } |              if( service->SCPDURL ) | ||||||
|         if( service->SCPDURL ) { |  | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "SCPDURL: %s\n", service->SCPDURL ); |                          "SCPDURL: %s\n", service->SCPDURL ); | ||||||
|         } |              if( service->controlURL ) | ||||||
|         if( service->controlURL ) { |  | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "controlURL: %s\n", service->controlURL ); |                          "controlURL: %s\n", service->controlURL ); | ||||||
|         } |              if( service->eventURL ) | ||||||
|         if( service->eventURL ) { |  | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "eventURL: %s\n", service->eventURL ); |                          "eventURL: %s\n", service->eventURL ); | ||||||
|         } |              if( service->UDN ) | ||||||
|         if( service->UDN ) { |              UpnpPrintf( level, module, __FILE__, __LINE__, "UDN: %s\n\n", | ||||||
|             UpnpPrintf( level, module, __FILE__, __LINE__, |                          service->UDN ); if( service->active ) | ||||||
|                 "UDN: %s\n\n", service->UDN ); |  | ||||||
|         } |  | ||||||
|         if( service->active ) { |  | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "Service is active\n" ); |                          "Service is active\n" ); | ||||||
|         } else { |              else | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "Service is inactive\n" ); |                          "Service is inactive\n" ); | ||||||
|  |              service = service->next;} | ||||||
|              } |              } | ||||||
|         service = service->next; |  ) | ||||||
|     } |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	printServiceTable | *	Function :	printServiceTable | ||||||
| * | * | ||||||
| *	Parameters : | *	Parameters : | ||||||
| *		service_table * table ;	Service table to be printed | *		service_table * table ;	Service table to be printed | ||||||
| *		Upnp_LogLevel level ;	Debug level specified to the print function | *		Dbg_Level level ;	Debug level specified to the print function | ||||||
| *		Dbg_Module module ;	Debug module specified to the print function | *		Dbg_Module module ;	Debug module specified to the print function | ||||||
| * | * | ||||||
| *	Description :	For debugging purposes prints the URL base of the table | *	Description :	For debugging purposes prints the URL base of the table | ||||||
| @@ -559,18 +531,15 @@ void printServiceList( | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG |     DBGONLY( void printServiceTable( service_table * table, | ||||||
| void printServiceTable( |                                      Dbg_Level level, | ||||||
|     service_table * table, |                                      Dbg_Module module ) { | ||||||
|     Upnp_LogLevel level, |  | ||||||
|     Dbg_Module module ) |  | ||||||
| { |  | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "URL_BASE: %s\n", table->URLBase ); |                          "URL_BASE: %s\n", table->URLBase ); | ||||||
|              UpnpPrintf( level, module, __FILE__, __LINE__, |              UpnpPrintf( level, module, __FILE__, __LINE__, | ||||||
|                          "Services: \n" ); |                          "Services: \n" ); | ||||||
|              printServiceList( table->serviceList, level, module );} |              printServiceList( table->serviceList, level, module );} | ||||||
| #endif |  ) | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	freeService | *	Function :	freeService | ||||||
| @@ -880,10 +849,12 @@ getServiceList( IXML_Node * node, | |||||||
|                     ( ! |                     ( ! | ||||||
|                       ( current->controlURL = |                       ( current->controlURL = | ||||||
|                         resolve_rel_url( URLBase, tempDOMString ) ) ) ) { |                         resolve_rel_url( URLBase, tempDOMString ) ) ) ) { | ||||||
|                     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |                     DBGONLY( UpnpPrintf | ||||||
|                         "BAD OR MISSING CONTROL URL" ); |                              ( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |                                "BAD OR MISSING CONTROL URL" ) ); | ||||||
|                         "CONTROL URL SET TO NULL IN SERVICE INFO" ); |                     DBGONLY( UpnpPrintf | ||||||
|  |                              ( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|  |                                "CONTROL URL SET TO NULL IN SERVICE INFO" ) ); | ||||||
|                     current->controlURL = NULL; |                     current->controlURL = NULL; | ||||||
|                     fail = 0; |                     fail = 0; | ||||||
|                 } |                 } | ||||||
| @@ -899,10 +870,12 @@ getServiceList( IXML_Node * node, | |||||||
|                     ( ! |                     ( ! | ||||||
|                       ( current->eventURL = |                       ( current->eventURL = | ||||||
|                         resolve_rel_url( URLBase, tempDOMString ) ) ) ) { |                         resolve_rel_url( URLBase, tempDOMString ) ) ) ) { | ||||||
|                     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |                     DBGONLY( UpnpPrintf | ||||||
|                         "BAD OR MISSING EVENT URL" ); |                              ( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|                     UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, |                                "BAD OR MISSING EVENT URL" ) ); | ||||||
|                         "EVENT URL SET TO NULL IN SERVICE INFO" ); |                     DBGONLY( UpnpPrintf | ||||||
|  |                              ( UPNP_INFO, GENA, __FILE__, __LINE__, | ||||||
|  |                                "EVENT URL SET TO NULL IN SERVICE INFO" ) ); | ||||||
|                     current->eventURL = NULL; |                     current->eventURL = NULL; | ||||||
|                     fail = 0; |                     fail = 0; | ||||||
|                 } |                 } | ||||||
| @@ -1153,8 +1126,9 @@ getServiceTable( IXML_Node * node, | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if( ( out->serviceList = getAllServiceList( |         if( ( out->serviceList = getAllServiceList( root, out->URLBase, | ||||||
|             root, out->URLBase, &out->endServiceList ) ) ) { |                                                     &out-> | ||||||
|  |                                                     endServiceList ) ) ) { | ||||||
|             return 1; |             return 1; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -171,7 +171,7 @@ memptr_cmp_nocase( IN memptr * m, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| membuffer_initialize( INOUT membuffer * m ) | membuffer_initialize( INOUT membuffer * m ) | ||||||
| { | { | ||||||
|     m->buf = NULL; |     m->buf = NULL; | ||||||
|   | |||||||
| @@ -261,7 +261,7 @@ | |||||||
|  |  | ||||||
| /** @name Other debugging features | /** @name Other debugging features | ||||||
|           The UPnP SDK contains other features to aid in debugging: |           The UPnP SDK contains other features to aid in debugging: | ||||||
| 	  see <upnp/inc/upnpdebug.h> | 	  see <upnp/upnpdebug.h> | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #define DEBUG_ALL		1    | #define DEBUG_ALL		1    | ||||||
| @@ -304,6 +304,27 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** @name DBGONLY | ||||||
|  |           The {\bf DBGONLY} macro allows code to be marked so that it  | ||||||
|  |           is only included in the DEBUG build and not the release.  To | ||||||
|  |           use this macro, put the code inside of the parentheses: | ||||||
|  |  | ||||||
|  |           {\tt DBGONLY(int i;)} | ||||||
|  |  | ||||||
|  |           This will cause a declaration of the integer {\tt i} only | ||||||
|  |           in the debug build. | ||||||
|  |   */ | ||||||
|  |  | ||||||
|  | //@{ | ||||||
|  | #ifdef DEBUG | ||||||
|  | #	define DBGONLY(x) x | ||||||
|  | #else | ||||||
|  | #	define DBGONLY(x)   | ||||||
|  | #endif | ||||||
|  | //@} | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #undef  EXCLUDE_WEB_SERVER  | #undef  EXCLUDE_WEB_SERVER  | ||||||
| #undef  EXCLUDE_MINISERVER  | #undef  EXCLUDE_MINISERVER  | ||||||
| #ifdef  INTERNAL_WEB_SERVER | #ifdef  INTERNAL_WEB_SERVER | ||||||
| @@ -338,6 +359,13 @@ | |||||||
| #	define CLIENTONLY(x) | #	define CLIENTONLY(x) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef INCLUDE_DEVICE_APIS | ||||||
|  | #	define DEVICEONLY(x) x | ||||||
|  | #else  | ||||||
|  | #	define DEVICEONLY(x)  | ||||||
|  | #endif | ||||||
|  |  | ||||||
| //@} | //@} | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -89,23 +89,22 @@ | |||||||
| #define DEFAULT_TIMEOUT 1801 | #define DEFAULT_TIMEOUT 1801 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| extern ithread_mutex_t GlobalClientSubscribeMutex; | extern ithread_mutex_t GlobalClientSubscribeMutex; | ||||||
|  |  | ||||||
| //Lock the subscription | //Lock the subscription | ||||||
| #define SubscribeLock() \ | #define SubscribeLock() \ | ||||||
| 	UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ | 	DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \ | ||||||
| 		"Trying Subscribe Lock");  \ | 	"Trying Subscribe Lock"));  \ | ||||||
| 	ithread_mutex_lock(&GlobalClientSubscribeMutex); \ | 	ithread_mutex_lock(&GlobalClientSubscribeMutex); \ | ||||||
| 	UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ | 	DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe Lock");) | ||||||
| 		"Subscribe Lock"); |  | ||||||
|  |  | ||||||
| //Unlock the subscription | //Unlock the subscription | ||||||
| #define SubscribeUnlock() \ | #define SubscribeUnlock() \ | ||||||
| 	UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ | 	DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \ | ||||||
| 		"Trying Subscribe UnLock"); \ | 		"Trying Subscribe UnLock")); \ | ||||||
| 	ithread_mutex_unlock(&GlobalClientSubscribeMutex); \ | 	ithread_mutex_unlock(&GlobalClientSubscribeMutex); \ | ||||||
| 	UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \ | 	DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe UnLock");) | ||||||
| 		"Subscribe UnLock"); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| //Structure to send NOTIFY message to all subscribed control points | //Structure to send NOTIFY message to all subscribed control points | ||||||
| @@ -162,13 +161,11 @@ EXTERN_C void genaCallback (IN http_parser_t *parser, | |||||||
| *	return UPNP_E_SUCCESS if service response is OK else  | *	return UPNP_E_SUCCESS if service response is OK else  | ||||||
| *	returns appropriate error | *	returns appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_CLIENT_APIS | CLIENTONLY( | ||||||
| EXTERN_C int genaSubscribe( | 	EXTERN_C int genaSubscribe(UpnpClient_Handle client_handle, | ||||||
| 	UpnpClient_Handle client_handle, |  | ||||||
| 				char * PublisherURL, | 				char * PublisherURL, | ||||||
| 				int * TimeOut,  | 				int * TimeOut,  | ||||||
| 	Upnp_SID  out_sid ); | 				Upnp_SID  out_sid );) | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -187,11 +184,8 @@ EXTERN_C int genaSubscribe( | |||||||
| *	return UPNP_E_SUCCESS if service response is OK else  | *	return UPNP_E_SUCCESS if service response is OK else  | ||||||
| *	returns appropriate error | *	returns appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_CLIENT_APIS | CLIENTONLY(EXTERN_C int genaUnSubscribe(UpnpClient_Handle client_handle, | ||||||
| EXTERN_C int genaUnSubscribe( | 		   const Upnp_SID in_sid);) | ||||||
| 	UpnpClient_Handle client_handle, |  | ||||||
| 	const Upnp_SID in_sid); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| * Function : genaUnregisterClient									 | * Function : genaUnregisterClient									 | ||||||
| @@ -208,9 +202,8 @@ EXTERN_C int genaUnSubscribe( | |||||||
| * Returns: int | * Returns: int | ||||||
| *	return UPNP_E_SUCCESS if successful else returns appropriate error | *	return UPNP_E_SUCCESS if successful else returns appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_CLIENT_APIS | CLIENTONLY(EXTERN_C int genaUnregisterClient( | ||||||
| EXTERN_C int genaUnregisterClient(UpnpClient_Handle client_handle); | 			UpnpClient_Handle client_handle);) | ||||||
| #endif |  | ||||||
|  |  | ||||||
| //server | //server | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -225,9 +218,8 @@ EXTERN_C int genaUnregisterClient(UpnpClient_Handle client_handle); | |||||||
| * Returns: int | * Returns: int | ||||||
| *	returns UPNP_E_SUCCESS if successful else returns GENA_E_BAD_HANDLE | *	returns UPNP_E_SUCCESS if successful else returns GENA_E_BAD_HANDLE | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS | DEVICEONLY(EXTERN_C int genaUnregisterDevice( | ||||||
| EXTERN_C int genaUnregisterDevice(UpnpDevice_Handle device_handle); | 				UpnpDevice_Handle device_handle);) | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -250,12 +242,10 @@ EXTERN_C int genaUnregisterDevice(UpnpDevice_Handle device_handle); | |||||||
| *	return UPNP_E_SUCCESS if service response is OK else  | *	return UPNP_E_SUCCESS if service response is OK else  | ||||||
| *	returns appropriate error | *	returns appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_CLIENT_APIS | CLIENTONLY(EXTERN_C int genaRenewSubscription( | ||||||
| EXTERN_C int genaRenewSubscription( |  | ||||||
| 							IN UpnpClient_Handle client_handle, | 							IN UpnpClient_Handle client_handle, | ||||||
| 							IN const Upnp_SID in_sid, | 							IN const Upnp_SID in_sid, | ||||||
| 	OUT int * TimeOut); | 							OUT int * TimeOut);) | ||||||
| #endif |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| *	Function :	genaNotifyAll | *	Function :	genaNotifyAll | ||||||
| * | * | ||||||
| @@ -275,15 +265,13 @@ EXTERN_C int genaRenewSubscription( | |||||||
| *	Note : This function is similar to the genaNotifyAllExt. The only difference | *	Note : This function is similar to the genaNotifyAllExt. The only difference | ||||||
| *			is it takes event variable array instead of xml document. | *			is it takes event variable array instead of xml document. | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS | DEVICEONLY(EXTERN_C int genaNotifyAll(UpnpDevice_Handle device_handle, | ||||||
| EXTERN_C int genaNotifyAll( |  | ||||||
| 	UpnpDevice_Handle device_handle, |  | ||||||
| 			   char *UDN, | 			   char *UDN, | ||||||
| 			   char *servId, | 			   char *servId, | ||||||
| 			   char **VarNames, | 			   char **VarNames, | ||||||
| 			   char **VarValues, | 			   char **VarValues, | ||||||
| 	int var_count); | 		    int var_count | ||||||
| #endif | 				      );) | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| *	Function :	genaNotifyAllExt | *	Function :	genaNotifyAllExt | ||||||
| @@ -302,13 +290,8 @@ EXTERN_C int genaNotifyAll( | |||||||
| *	Note : This function is similar to the genaNotifyAll. the only difference | *	Note : This function is similar to the genaNotifyAll. the only difference | ||||||
| *			is it takes the document instead of event variable array | *			is it takes the document instead of event variable array | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS | DEVICEONLY(EXTERN_C int genaNotifyAllExt(UpnpDevice_Handle device_handle,  | ||||||
| EXTERN_C int genaNotifyAllExt( | 		   char *UDN, char *servId,IN IXML_Document *PropSet);) | ||||||
| 	UpnpDevice_Handle device_handle,  |  | ||||||
| 	char *UDN, |  | ||||||
| 	char *servId, |  | ||||||
| 	IN IXML_Document *PropSet); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| *	Function :	genaInitNotify | *	Function :	genaInitNotify | ||||||
| @@ -331,15 +314,13 @@ EXTERN_C int genaNotifyAllExt( | |||||||
| *	Note : No other event will be sent to this control point before the  | *	Note : No other event will be sent to this control point before the  | ||||||
| *			intial state table dump. | *			intial state table dump. | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS | DEVICEONLY(EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle, | ||||||
| EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle, |  | ||||||
| 			    IN char *UDN, | 			    IN char *UDN, | ||||||
| 			    IN char *servId, | 			    IN char *servId, | ||||||
| 			    IN char **VarNames, | 			    IN char **VarNames, | ||||||
| 			    IN char **VarValues, | 			    IN char **VarValues, | ||||||
| 				IN int var_count, | 				IN int var_count, | ||||||
| 	IN Upnp_SID sid); | 				IN Upnp_SID sid);) | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /**************************************************************************** | /**************************************************************************** | ||||||
| *	Function :	genaInitNotifyExt | *	Function :	genaInitNotifyExt | ||||||
| @@ -361,14 +342,12 @@ EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle, | |||||||
| *	Note : No other event will be sent to this control point before the  | *	Note : No other event will be sent to this control point before the  | ||||||
| *			intial state table dump. | *			intial state table dump. | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS | DEVICEONLY(EXTERN_C  int genaInitNotifyExt( | ||||||
| EXTERN_C  int genaInitNotifyExt( |  | ||||||
| 		   IN UpnpDevice_Handle device_handle,  | 		   IN UpnpDevice_Handle device_handle,  | ||||||
| 		   IN char *UDN,  | 		   IN char *UDN,  | ||||||
| 		   IN char *servId, | 		   IN char *servId, | ||||||
| 		   IN IXML_Document *PropSet,  | 		   IN IXML_Document *PropSet,  | ||||||
| 	IN Upnp_SID sid); | 		   IN Upnp_SID sid);) | ||||||
| #endif |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
|   | |||||||
| @@ -96,7 +96,7 @@ typedef struct SOCKET_BUFFER{ | |||||||
| //holds a pointer into a larger array | //holds a pointer into a larger array | ||||||
| typedef struct TOKEN { | typedef struct TOKEN { | ||||||
|    char * buff; |    char * buff; | ||||||
|   size_t size; |   int size; | ||||||
| } token; | } token; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -214,101 +214,37 @@ EXTERN_C ssize_t readLine(int fd, char *out, int max, int *timeout); | |||||||
| EXTERN_C int remove_dots(char * in, int size); | EXTERN_C int remove_dots(char * in, int size); | ||||||
|  |  | ||||||
|  |  | ||||||
| #ifdef DEBUG | DBGONLY(EXTERN_C void print_http_request(http_message | ||||||
| EXTERN_C void print_http_request( | 					 *message,Dbg_Level DLevel, | ||||||
| 	http_message *message, | 					 Dbg_Module Module,char *DbgFileName, | ||||||
| 	Upnp_LogLevel DLevel, | 					 int DbgLineNo);); | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo); |  | ||||||
| #else |  | ||||||
| static inline void print_http_request( |  | ||||||
| 	http_message *message, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef DEBUG | DBGONLY(EXTERN_C void print_http_response(http_message *message, | ||||||
| EXTERN_C void print_http_response( | 					  Dbg_Level DLevel, | ||||||
| 	http_message *message, | 					  Dbg_Module Module,char *DbgFileName, | ||||||
| 	Upnp_LogLevel DLevel, | 					  int DbgLineNo);); | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo); |  | ||||||
| #else |  | ||||||
| static inline void print_http_response( |  | ||||||
| 	http_message *message, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef DEBUG | DBGONLY(EXTERN_C void print_token(  token * in, | ||||||
| EXTERN_C void print_token( | 				    Dbg_Level DLevel, | ||||||
| 	token *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 				    Dbg_Module Module, | 				    Dbg_Module Module, | ||||||
| 				    char *DbgFileName, | 				    char *DbgFileName, | ||||||
| 	int DbgLineNo); | 				    int DbgLineNo);); | ||||||
| #else |  | ||||||
| static inline void print_token( |  | ||||||
| 	token *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef DEBUG | DBGONLY(EXTERN_C void print_status_line(http_status *in, | ||||||
| EXTERN_C void print_status_line( | 					Dbg_Level DLevel, | ||||||
| 	http_status *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 					Dbg_Module Module, | 					Dbg_Module Module, | ||||||
| 					char *DbgFileName, | 					char *DbgFileName, | ||||||
| 	int DbgLineNo); | 					int DbgLineNo);); | ||||||
| #else |  | ||||||
| static inline void print_status_line( |  | ||||||
| 	http_status *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef DEBUG | DBGONLY(EXTERN_C void print_request_line(http_request *in, | ||||||
| EXTERN_C void print_request_line( | 					 Dbg_Level DLevel, | ||||||
| 	http_request *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 					 Dbg_Module Module, | 					 Dbg_Module Module, | ||||||
| 	char *DbgFileName, | 					 char *DbgFileName,int DbgLineNo)); | ||||||
| 	int DbgLineNo); |  | ||||||
| #else |  | ||||||
| static inline void print_request_line( |  | ||||||
| 	http_request *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef DEBUG | DBGONLY(EXTERN_C void print_uri( uri_type *in, | ||||||
| EXTERN_C void print_uri( | 				 Dbg_Level DLevel, | ||||||
| 	uri_type *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 				 Dbg_Module Module, | 				 Dbg_Module Module, | ||||||
| 				 char *DbgFileName, | 				 char *DbgFileName, | ||||||
| 	int DbgLineNo); | 				 int DbgLineNo);); | ||||||
| #else |  | ||||||
| static inline void print_uri( |  | ||||||
| 	uri_type *in, |  | ||||||
| 	Upnp_LogLevel DLevel, |  | ||||||
| 	Dbg_Module Module, |  | ||||||
| 	char *DbgFileName, |  | ||||||
| 	int DbgLineNo) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -456,8 +456,6 @@ int raw_to_int( IN memptr* raw_value, int base ); | |||||||
| *																		 | *																		 | ||||||
| * Description: Find a substring from raw character string buffer					 | * Description: Find a substring from raw character string buffer					 | ||||||
| *																		 | *																		 | ||||||
| * Side effects: raw_value is transformed to lowercase. |  | ||||||
| * |  | ||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 int - index at which the substring is found.						 | *	 int - index at which the substring is found.						 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| @@ -488,11 +486,7 @@ const char* method_to_str( IN http_method_t method ); | |||||||
| * Returns:																 | * Returns:																 | ||||||
| *	 void																 | *	 void																 | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG |  | ||||||
| void print_http_headers( IN http_message_t* hmsg ); | void print_http_headers( IN http_message_t* hmsg ); | ||||||
| #else |  | ||||||
| static UPNP_INLINE void print_http_headers( IN http_message_t *hmsg ) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| }		// extern "C" | }		// extern "C" | ||||||
| @@ -500,4 +494,3 @@ static UPNP_INLINE void print_http_headers( IN http_message_t *hmsg ) {} | |||||||
|  |  | ||||||
|  |  | ||||||
| #endif // GENLIB_NET_HTTP_HTTPPARSER_H | #endif // GENLIB_NET_HTTP_HTTPPARSER_H | ||||||
|  |  | ||||||
|   | |||||||
| @@ -51,7 +51,8 @@ typedef struct // memptr | |||||||
| // note: Total length/capacity should not exceed MAX_INT | // note: Total length/capacity should not exceed MAX_INT | ||||||
| typedef struct // membuffer | typedef struct // membuffer | ||||||
| { | { | ||||||
| 	char	*buf;			// mem buffer; must not write beyond buf[length-1] (read/write) | 	char	*buf;			// mem buffer; must not write  | ||||||
|  | 							//   beyond buf[length-1] (read/write) | ||||||
| 	size_t	length;			// length of buffer (read-only) | 	size_t	length;			// length of buffer (read-only) | ||||||
| 	size_t	capacity;		// total allocated memory (read-only) | 	size_t	capacity;		// total allocated memory (read-only) | ||||||
| 	size_t	size_inc;		// used to increase size; MUST be > 0; (read/write) | 	size_t	size_inc;		// used to increase size; MUST be > 0; (read/write) | ||||||
| @@ -147,7 +148,8 @@ int memptr_cmp_nocase( IN memptr* m, IN const char* s ); | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int membuffer_set_size( INOUT membuffer* m, IN size_t new_length ); | int membuffer_set_size( INOUT membuffer* m,  | ||||||
|  | 			IN size_t new_length ); | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	membuffer_init | *	Function :	membuffer_init | ||||||
| @@ -198,7 +200,8 @@ void membuffer_destroy( INOUT membuffer* m ); | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int membuffer_assign( INOUT membuffer* m, IN const void* buf, IN size_t buf_len ); | int membuffer_assign( INOUT membuffer* m, IN const void* buf,  | ||||||
|  | 					 IN size_t buf_len ); | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	membuffer_assign_str | *	Function :	membuffer_assign_str | ||||||
| @@ -234,7 +237,8 @@ int membuffer_assign_str( INOUT membuffer* m, IN const char* c_str ); | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int membuffer_append( INOUT membuffer* m, IN const void* buf, IN size_t buf_len ); | int membuffer_append( INOUT membuffer* m, IN const void* buf, | ||||||
|  | 					 IN size_t buf_len ); | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	membuffer_append_str | *	Function :	membuffer_append_str | ||||||
| @@ -272,7 +276,8 @@ int membuffer_append_str( INOUT membuffer* m, IN const char* c_str ); | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, int index ); | int membuffer_insert( INOUT membuffer* m, IN const void* buf,  | ||||||
|  | 					 IN size_t buf_len, int index ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -293,7 +298,8 @@ int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| void membuffer_delete( INOUT membuffer* m, IN int index, IN size_t num_bytes ); | void membuffer_delete( INOUT membuffer* m, IN int index,  | ||||||
|  | 					 IN size_t num_bytes ); | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -330,7 +336,8 @@ char* membuffer_detach( INOUT membuffer* m ); | |||||||
| *	Note : 'new_buf' must be allocted using malloc or realloc so | *	Note : 'new_buf' must be allocted using malloc or realloc so | ||||||
| *		that it can be freed using free() | *		that it can be freed using free() | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len ); | void membuffer_attach( INOUT membuffer* m, IN char* new_buf, | ||||||
|  | 					   IN size_t buf_len ); | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| }		// extern "C" | }		// extern "C" | ||||||
| #endif	// __cplusplus | #endif	// __cplusplus | ||||||
|   | |||||||
| @@ -88,11 +88,7 @@ void SetHTTPGetCallback( MiniServerCallback callback ); | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS |  | ||||||
| void SetSoapCallback( MiniServerCallback callback ); | void SetSoapCallback( MiniServerCallback callback ); | ||||||
| #else  |  | ||||||
| static inline void SetSoapCallback( MiniServerCallback callback ) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	SetGenaCallback | *	Function :	SetGenaCallback | ||||||
|   | |||||||
| @@ -47,7 +47,7 @@ extern "C" { | |||||||
|  |  | ||||||
| #define SID_SIZE  41 | #define SID_SIZE  41 | ||||||
|  |  | ||||||
| #ifdef INCLUDE_DEVICE_APIS | DEVICEONLY( | ||||||
|  |  | ||||||
| typedef struct SUBSCRIPTION { | typedef struct SUBSCRIPTION { | ||||||
|   Upnp_SID sid; |   Upnp_SID sid; | ||||||
| @@ -73,7 +73,6 @@ typedef struct SERVICE_INFO { | |||||||
|   struct SERVICE_INFO	 *next; |   struct SERVICE_INFO	 *next; | ||||||
| } service_info; | } service_info; | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef struct SERVICE_TABLE { | typedef struct SERVICE_TABLE { | ||||||
|   DOMString URLBase; |   DOMString URLBase; | ||||||
|   service_info *serviceList; |   service_info *serviceList; | ||||||
| @@ -254,7 +253,7 @@ service_info * FindServiceControlURLPath( service_table *table, | |||||||
| * | * | ||||||
| *	Parameters : | *	Parameters : | ||||||
| *		service_info *service ;Service whose information is to be printed | *		service_info *service ;Service whose information is to be printed | ||||||
| *		Upnp_LogLevel level ; Debug level specified to the print function | *		Dbg_Level level ; Debug level specified to the print function | ||||||
| *		Dbg_Module module ;	Debug module specified to the print function | *		Dbg_Module module ;	Debug module specified to the print function | ||||||
| * | * | ||||||
| *	Description :	For debugging purposes prints information from the  | *	Description :	For debugging purposes prints information from the  | ||||||
| @@ -264,24 +263,16 @@ service_info * FindServiceControlURLPath( service_table *table, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY(void printService(service_info *service,Dbg_Level | ||||||
| void printService( | 				   level, | ||||||
| 	service_info *service, | 				   Dbg_Module module)); | ||||||
| 	Upnp_LogLevel level, |  | ||||||
| 	Dbg_Module module); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE void printService( |  | ||||||
| 	service_info *service, |  | ||||||
| 	Upnp_LogLevel level, |  | ||||||
| 	Dbg_Module module) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	printServiceList | *	Function :	printServiceList | ||||||
| * | * | ||||||
| *	Parameters : | *	Parameters : | ||||||
| *		service_info *service ;	Service whose information is to be printed | *		service_info *service ;	Service whose information is to be printed | ||||||
| *		Upnp_LogLevel level ;	Debug level specified to the print function | *		Dbg_Level level ;	Debug level specified to the print function | ||||||
| *		Dbg_Module module ;	Debug module specified to the print function | *		Dbg_Module module ;	Debug module specified to the print function | ||||||
| * | * | ||||||
| *	Description :	For debugging purposes prints information of each  | *	Description :	For debugging purposes prints information of each  | ||||||
| @@ -291,24 +282,15 @@ static UPNP_INLINE void printService( | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY(void printServiceList(service_info *service, | ||||||
| void printServiceList( | 				       Dbg_Level level, Dbg_Module module)); | ||||||
| 	service_info *service, |  | ||||||
| 	Upnp_LogLevel level, |  | ||||||
| 	Dbg_Module module); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE void printServiceList( |  | ||||||
| 	service_info *service, |  | ||||||
| 	Upnp_LogLevel level, |  | ||||||
| 	Dbg_Module module) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	printServiceTable | *	Function :	printServiceTable | ||||||
| * | * | ||||||
| *	Parameters : | *	Parameters : | ||||||
| *		service_table * table ;	Service table to be printed | *		service_table * table ;	Service table to be printed | ||||||
| *		Upnp_LogLevel level ;	Debug level specified to the print function | *		Dbg_Level level ;	Debug level specified to the print function | ||||||
| *		Dbg_Module module ;	Debug module specified to the print function | *		Dbg_Module module ;	Debug module specified to the print function | ||||||
| * | * | ||||||
| *	Description :	For debugging purposes prints the URL base of the table | *	Description :	For debugging purposes prints the URL base of the table | ||||||
| @@ -319,17 +301,9 @@ static UPNP_INLINE void printServiceList( | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY(void printServiceTable(service_table * | ||||||
| void printServiceTable( | 					table,Dbg_Level | ||||||
| 	service_table *table, | 					level,Dbg_Module module)); | ||||||
| 	Upnp_LogLevel level, |  | ||||||
| 	Dbg_Module module); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE void printServiceTable( |  | ||||||
| 	service_table *table, |  | ||||||
| 	Upnp_LogLevel level, |  | ||||||
| 	Dbg_Module module) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	freeService | *	Function :	freeService | ||||||
| @@ -477,11 +451,10 @@ int getSubElement(const char *element_name, IXML_Node *node, | |||||||
| 		  IXML_Node **out); | 		  IXML_Node **out); | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif /* INCLUDE_DEVICE_APIS */ | )	/* DEVICEONLY */ | ||||||
|  |  | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif /* _SERVICE_TABLE */ | #endif /* _SERVICE_TABLE */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -211,15 +211,8 @@ int Make_Socket_NoBlocking (int sock); | |||||||
| * Returns: void * | * Returns: void * | ||||||
| *	1 if successful else appropriate error | *	1 if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS | void ssdp_handle_device_request( IN http_message_t* hmsg,  | ||||||
| void ssdp_handle_device_request( |  | ||||||
| 	IN http_message_t* hmsg,  |  | ||||||
| 							 IN struct sockaddr_in* dest_addr ); | 							 IN struct sockaddr_in* dest_addr ); | ||||||
| #else |  | ||||||
| static inline void ssdp_handle_device_request( |  | ||||||
| 	IN http_message_t* hmsg,  |  | ||||||
| 	IN struct sockaddr_in* dest_addr ) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| * Function : ssdp_handle_ctrlpt_msg											 | * Function : ssdp_handle_ctrlpt_msg											 | ||||||
| @@ -241,8 +234,7 @@ static inline void ssdp_handle_device_request( | |||||||
| * Returns: void | * Returns: void | ||||||
| * | * | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| void ssdp_handle_ctrlpt_msg( | void ssdp_handle_ctrlpt_msg( IN http_message_t* hmsg,  | ||||||
| 	IN http_message_t* hmsg,  |  | ||||||
| 							 IN struct sockaddr_in* dest_addr, | 							 IN struct sockaddr_in* dest_addr, | ||||||
| 							 IN xboolean timeout, | 							 IN xboolean timeout, | ||||||
| 							 IN void* cookie ); | 							 IN void* cookie ); | ||||||
| @@ -334,10 +326,12 @@ int ssdp_request_type(IN char * cmd, OUT SsdpEvent * Evt); | |||||||
| * Function : SearchByTarget											 | * Function : SearchByTarget											 | ||||||
| *																	 | *																	 | ||||||
| * Parameters:														 | * Parameters:														 | ||||||
| *	IN int Mx:Number of seconds to wait, to collect all the	responses. | *		IN int Mx:Number of seconds to wait, to collect all the  | ||||||
|  | *					responses. | ||||||
| *		char *St: Search target. | *		char *St: Search target. | ||||||
| *		void *Cookie: cookie provided by control point application. This | *		void *Cookie: cookie provided by control point application. This | ||||||
| *		cokie will be returned to application in the callback. | *						cokie will be returned to application in the  | ||||||
|  | *						callback. | ||||||
| * | * | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates and send the search request for a specific URL. | *	This function creates and send the search request for a specific URL. | ||||||
| @@ -353,9 +347,10 @@ int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie); | |||||||
| * Parameters:														 | * Parameters:														 | ||||||
| *	IN char * DevType : type of the device | *	IN char * DevType : type of the device | ||||||
| *	IN int RootDev: flag to indicate if the device is root device | *	IN int RootDev: flag to indicate if the device is root device | ||||||
| *	IN char *Udn     : | *	IN char * nt : value of NT | ||||||
| *	IN char *Location: Location URL. | *	IN char * usn : | ||||||
| *	IN int Duration  : Service duration in sec. | *	IN char * location :Location URL. | ||||||
|  | *	IN int  duration :Service duration in sec. | ||||||
| * | * | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates the device advertisement request based on  | *	This function creates the device advertisement request based on  | ||||||
| @@ -364,12 +359,8 @@ int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie); | |||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int DeviceAdvertisement( | int DeviceAdvertisement(IN char * DevType, int RootDev,char * Udn,  | ||||||
| 	IN char *DevType, | 						IN char * Location, IN int  Duration); | ||||||
| 	IN int RootDev, |  | ||||||
| 	IN char *Udn,  |  | ||||||
| 	IN char *Location, |  | ||||||
| 	IN int Duration); |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| @@ -390,8 +381,7 @@ int DeviceAdvertisement( | |||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int DeviceShutdown( | int DeviceShutdown( IN char * DevType,  | ||||||
| 	IN char *DevType,  |  | ||||||
| 				    IN int RootDev, | 				    IN int RootDev, | ||||||
| 					IN char * Udn,  | 					IN char * Udn,  | ||||||
| 					IN char * _Server,  | 					IN char * _Server,  | ||||||
| @@ -408,7 +398,7 @@ int DeviceShutdown( | |||||||
| *	IN char * Udn: Device UDN | *	IN char * Udn: Device UDN | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
| * |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates the reply packet based on the input parameter,  | *	This function creates the reply packet based on the input parameter,  | ||||||
| *	and send it to the client address given in its input parameter DestAddr. | *	and send it to the client address given in its input parameter DestAddr. | ||||||
| @@ -416,8 +406,7 @@ int DeviceShutdown( | |||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int DeviceReply( | int DeviceReply(IN struct sockaddr_in * DestAddr,  | ||||||
| 	IN struct sockaddr_in * DestAddr,  |  | ||||||
| 				IN char *DevType,  | 				IN char *DevType,  | ||||||
| 				IN int RootDev,  | 				IN int RootDev,  | ||||||
| 				IN char * Udn,  | 				IN char * Udn,  | ||||||
| @@ -443,8 +432,7 @@ int DeviceReply( | |||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int SendReply( | int SendReply(IN struct sockaddr_in * DestAddr,  | ||||||
| 	IN struct sockaddr_in * DestAddr,  |  | ||||||
| 			  IN char *DevType,  | 			  IN char *DevType,  | ||||||
| 			  IN int RootDev,  | 			  IN int RootDev,  | ||||||
| 			  IN char * Udn,  | 			  IN char * Udn,  | ||||||
| @@ -460,16 +448,16 @@ int SendReply( | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
| * |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates the advertisement packet based  | *	This function creates the advertisement packet based  | ||||||
| *	on the input parameter, and send it to the multicast channel. | *	on the input parameter, and send it to the multicast channel. | ||||||
|  |  | ||||||
| * | * | ||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int ServiceAdvertisement( | int ServiceAdvertisement( IN char * Udn,  | ||||||
| 	IN char *Udn,  |  | ||||||
| 						 IN char * ServType, | 						 IN char * ServType, | ||||||
| 						 IN char * Location, | 						 IN char * Location, | ||||||
| 						 IN int  Duration); | 						 IN int  Duration); | ||||||
| @@ -484,16 +472,16 @@ int ServiceAdvertisement( | |||||||
| *	IN char *Server: Not used | *	IN char *Server: Not used | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
| * |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates the advertisement packet based  | *	This function creates the advertisement packet based  | ||||||
| *	on the input parameter, and send it to the multicast channel. | *	on the input parameter, and send it to the multicast channel. | ||||||
|  |  | ||||||
| * | * | ||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int ServiceReply( | int ServiceReply(IN struct sockaddr_in *DestAddr,   | ||||||
| 	IN struct sockaddr_in *DestAddr,   |  | ||||||
| 				 IN char * ServType,  | 				 IN char * ServType,  | ||||||
| 				 IN char * Udn,  | 				 IN char * Udn,  | ||||||
| 				 IN char * Location, | 				 IN char * Location, | ||||||
| @@ -507,7 +495,7 @@ int ServiceReply( | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Service duration in sec. | *	IN int  Duration :Service duration in sec. | ||||||
| * |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates a HTTP service shutdown request packet  | *	This function creates a HTTP service shutdown request packet  | ||||||
| *	and sent it to the multicast channel through RequestHandler. | *	and sent it to the multicast channel through RequestHandler. | ||||||
| @@ -515,9 +503,7 @@ int ServiceReply( | |||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int ServiceShutdown( | int ServiceShutdown( IN char * Udn, IN char * ServType, | ||||||
| 	IN char *Udn, |  | ||||||
| 	IN char *ServType, |  | ||||||
| 					IN char * Location, | 					IN char * Location, | ||||||
| 					IN int  Duration); | 					IN int  Duration); | ||||||
|  |  | ||||||
| @@ -541,8 +527,7 @@ void *advertiseAndReplyThread(IN void * data); | |||||||
| * Function : AdvertiseAndReply									 | * Function : AdvertiseAndReply									 | ||||||
| *																	 | *																	 | ||||||
| * Parameters:														 | * Parameters:														 | ||||||
| *	IN int AdFlag: -1 = Send shutdown, | *	IN int AdFlag: -1 = Send shutdown, 0 = send reply,  | ||||||
| *			0 = send reply,  |  | ||||||
| *					1 = Send Advertisement | *					1 = Send Advertisement | ||||||
| *	IN UpnpDevice_Handle Hnd: Device handle | *	IN UpnpDevice_Handle Hnd: Device handle | ||||||
| *	IN enum SsdpSearchType SearchType:Search type for sending replies | *	IN enum SsdpSearchType SearchType:Search type for sending replies | ||||||
| @@ -558,8 +543,7 @@ void *advertiseAndReplyThread(IN void * data); | |||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| int AdvertiseAndReply( | int AdvertiseAndReply(IN int AdFlag,  | ||||||
| 	IN int AdFlag,  |  | ||||||
| 					IN UpnpDevice_Handle Hnd,  | 					IN UpnpDevice_Handle Hnd,  | ||||||
| 					IN enum SsdpSearchType SearchType,  | 					IN enum SsdpSearchType SearchType,  | ||||||
| 					IN struct sockaddr_in *DestAddr, | 					IN struct sockaddr_in *DestAddr, | ||||||
|   | |||||||
| @@ -38,9 +38,10 @@ | |||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  #include <sys/socket.h> |  #include <sys/socket.h> | ||||||
| #else | #else | ||||||
|  |  #define XINLINE | ||||||
|  |  | ||||||
|  typedef int socklen_t; |  typedef int socklen_t; | ||||||
|  #define EAFNOSUPPORT 97 |  #define EAFNOSUPPORT 97 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif // GENLIB_NET_UNIXUTIL_H | #endif // GENLIB_NET_UNIXUTIL_H | ||||||
|  |  | ||||||
|   | |||||||
| @@ -71,53 +71,33 @@ struct Handle_Info | |||||||
|     Upnp_FunPtr  Callback; // Callback function pointer. |     Upnp_FunPtr  Callback; // Callback function pointer. | ||||||
|     char * Cookie; |     char * Cookie; | ||||||
|  |  | ||||||
|     // Device Only |     DEVICEONLY(char  DescURL[LINE_SIZE];)   // URL for the use of SSDP | ||||||
| #ifdef INCLUDE_DEVICE_APIS |     DEVICEONLY(char  DescXML[LINE_SIZE];)   // XML file path for device  | ||||||
|     char  DescURL[LINE_SIZE];   // URL for the use of SSDP |  | ||||||
|     char  DescXML[LINE_SIZE];   // XML file path for device  |  | ||||||
|                                             //description |                                             //description | ||||||
|  |  | ||||||
|     int MaxAge;                 // Advertisement timeout |     DEVICEONLY(int MaxAge;)                 // Advertisement timeout | ||||||
|     IXML_Document *DescDocument;// Description parsed in  |     DEVICEONLY(IXML_Document *DescDocument;)     // Description parsed in  | ||||||
|                                             //terms of DOM document  |                                             //terms of DOM document  | ||||||
|     IXML_NodeList *DeviceList;  // List of devices in the  |     DEVICEONLY(IXML_NodeList *DeviceList;)       // List of devices in the  | ||||||
|                                             //description document |                                             //description document | ||||||
|     IXML_NodeList *ServiceList; // List of services in the  |     DEVICEONLY(IXML_NodeList *ServiceList;)      // List of services in the  | ||||||
|                                             // description document |                                             // description document | ||||||
|     service_table ServiceTable; //table holding subscriptions and  |     DEVICEONLY(service_table ServiceTable;) //table holding subscriptions and  | ||||||
|                                 //URL information |                                 //URL information | ||||||
|     int MaxSubscriptions; |     DEVICEONLY(int MaxSubscriptions;) | ||||||
|     int MaxSubscriptionTimeOut; |     DEVICEONLY(int MaxSubscriptionTimeOut;) | ||||||
| #endif |  | ||||||
|       |       | ||||||
|        //Client only |        //Client only | ||||||
| #ifdef INCLUDE_CLIENT_APIS |     CLIENTONLY(client_subscription * ClientSubList;) //client subscription list | ||||||
|     client_subscription *ClientSubList; //client subscription list |     CLIENTONLY(LinkedList SsdpSearchList;) // active ssdp searches    | ||||||
|     LinkedList SsdpSearchList; // active ssdp searches    |  | ||||||
| #endif |  | ||||||
|     int   aliasInstalled;       // 0 = not installed; otherwise installed |     int   aliasInstalled;       // 0 = not installed; otherwise installed | ||||||
| } ; | } ; | ||||||
|  |  | ||||||
| extern ithread_rwlock_t GlobalHndRWLock; | extern ithread_mutex_t GlobalHndMutex; | ||||||
| Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);  | Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);  | ||||||
|  |  | ||||||
| #define HandleLock() HandleWriteLock() | #define HandleLock()  DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Trying Lock")); ithread_mutex_lock(&GlobalHndMutex); DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"LOCK")); | ||||||
|  | #define HandleUnlock() DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Trying Unlock")); ithread_mutex_unlock(&GlobalHndMutex); DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Unlock")); | ||||||
| #define HandleWriteLock()  \ |  | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a write lock"); \ |  | ||||||
| 	ithread_rwlock_wrlock(&GlobalHndRWLock); \ |  | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Write lock acquired"); |  | ||||||
|  |  | ||||||
| #define HandleReadLock()  \ |  | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying a read lock"); \ |  | ||||||
| 	ithread_rwlock_rdlock(&GlobalHndRWLock); \ |  | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Read lock acquired"); |  | ||||||
|  |  | ||||||
| #define HandleUnlock() \ |  | ||||||
| 	UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \ |  | ||||||
| 	ithread_rwlock_unlock(&GlobalHndRWLock); \ |  | ||||||
| 	UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlocked rwlock"); |  | ||||||
|  |  | ||||||
| Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,  | Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,  | ||||||
|                                      struct Handle_Info **HndInfo); |                                      struct Handle_Info **HndInfo); | ||||||
| Upnp_Handle_Type GetDeviceHandleInfo(int *device_handle_out,  | Upnp_Handle_Type GetDeviceHandleInfo(int *device_handle_out,  | ||||||
| @@ -131,7 +111,7 @@ extern unsigned short LOCAL_PORT; | |||||||
| extern TimerThread gTimerThread; | extern TimerThread gTimerThread; | ||||||
| extern ThreadPool gRecvThreadPool; | extern ThreadPool gRecvThreadPool; | ||||||
| extern ThreadPool gSendThreadPool; | extern ThreadPool gSendThreadPool; | ||||||
| extern ThreadPool gMiniServerThreadPool; |  | ||||||
|  |  | ||||||
| typedef enum { | typedef enum { | ||||||
|     SUBSCRIBE, |     SUBSCRIBE, | ||||||
| @@ -183,6 +163,7 @@ void UpnpThreadDistribution(struct UpnpNonblockParam * Param); | |||||||
| void AutoAdvertise(void *input);  | void AutoAdvertise(void *input);  | ||||||
| int getlocalhostname(char *out); | int getlocalhostname(char *out); | ||||||
|  |  | ||||||
|  | virtualDirList *pVirtualDirList; | ||||||
| extern WebServerState bWebServerState; | extern WebServerState bWebServerState; | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -87,7 +87,7 @@ enum uriType  { absolute, relative }; | |||||||
| *	holds a pointer into a larger array									*/ | *	holds a pointer into a larger array									*/ | ||||||
| typedef struct TOKEN { | typedef struct TOKEN { | ||||||
|   const char *buff; |   const char *buff; | ||||||
|   size_t size; |   int size; | ||||||
| } token; | } token; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -124,7 +124,7 @@ typedef struct URL_LIST { | |||||||
| *	Parameters : | *	Parameters : | ||||||
| *		char * in ;	string of characters | *		char * in ;	string of characters | ||||||
| *		int index ;	index at which to start checking the characters | *		int index ;	index at which to start checking the characters | ||||||
| *		size_t *max ;	 | *		int *max ;	 | ||||||
| * | * | ||||||
| *	Description : Replaces an escaped sequence with its unescaped version  | *	Description : Replaces an escaped sequence with its unescaped version  | ||||||
| *		as in http://www.ietf.org/rfc/rfc2396.txt  (RFC explaining URIs) | *		as in http://www.ietf.org/rfc/rfc2396.txt  (RFC explaining URIs) | ||||||
| @@ -137,7 +137,7 @@ typedef struct URL_LIST { | |||||||
| *		string are shifted over, and NULL characters are placed at the  | *		string are shifted over, and NULL characters are placed at the  | ||||||
| *		end of the string. | *		end of the string. | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int replace_escaped(char * in, int index, size_t *max); | int replace_escaped(char * in, int index, int *max); | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	copy_URL_list | *	Function :	copy_URL_list | ||||||
| @@ -182,16 +182,13 @@ void free_URL_list(URL_list * list); | |||||||
| *		uri_type *in ;	URI object | *		uri_type *in ;	URI object | ||||||
| * | * | ||||||
| *	Description : Function useful in debugging for printing a parsed uri. | *	Description : Function useful in debugging for printing a parsed uri. | ||||||
|  | *		Compiled out with DBGONLY macro.  | ||||||
| * | * | ||||||
| *	Return : void ; | *	Return : void ; | ||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG | DBGONLY(void print_uri( uri_type *in);) | ||||||
| void print_uri(uri_type *in); |  | ||||||
| #else |  | ||||||
| static UPNP_INLINE void print_uri(uri_type *in) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	print_token | *	Function :	print_token | ||||||
| @@ -200,16 +197,13 @@ static UPNP_INLINE void print_uri(uri_type *in) {} | |||||||
| *		token * in ;	 | *		token * in ;	 | ||||||
| * | * | ||||||
| *	Description : Function useful in debugging for printing a token. | *	Description : Function useful in debugging for printing a token. | ||||||
|  | *		Compiled out with DBGONLY macro.  | ||||||
| * | * | ||||||
| *	Return : void ; | *	Return : void ; | ||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| #ifdef DEBUG |  | ||||||
| void print_token(  token * in); | void print_token(  token * in); | ||||||
| #else |  | ||||||
| static UPNP_INLINE void print_token(token * in) {} |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	token_string_casecmp | *	Function :	token_string_casecmp | ||||||
| @@ -309,7 +303,7 @@ int parse_hostport(const char *in, int max, hostport_type *out ); | |||||||
| * | * | ||||||
| *	Parameters : | *	Parameters : | ||||||
| *		INOUT char *in ;	string of characters to be modified | *		INOUT char *in ;	string of characters to be modified | ||||||
| *		INOUT size_t *size ;	size limit for the number of characters | *		INOUT int *size ;	size limit for the number of characters | ||||||
| * | * | ||||||
| *	Description : removes http escaped characters such as: "%20" and  | *	Description : removes http escaped characters such as: "%20" and  | ||||||
| *		replaces them with their character representation. i.e.  | *		replaces them with their character representation. i.e.  | ||||||
| @@ -321,7 +315,7 @@ int parse_hostport(const char *in, int max, hostport_type *out ); | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| int remove_escaped_chars(char *in, size_t *size); | int remove_escaped_chars(char *in,int *size); | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| *	Function :	remove_dots | *	Function :	remove_dots | ||||||
|   | |||||||
| @@ -47,6 +47,12 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef NO_DEBUG | ||||||
|  | #define DBG(x) | ||||||
|  | #else | ||||||
|  | #define DBG(x) x | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #define GEMD_OUT_OF_MEMORY -1 | #define GEMD_OUT_OF_MEMORY -1 | ||||||
| #define EVENT_TIMEDOUT -2 | #define EVENT_TIMEDOUT -2 | ||||||
| #define EVENT_TERMINATE	-3 | #define EVENT_TERMINATE	-3 | ||||||
| @@ -136,10 +142,14 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| ////////////////////////////////// | ////////////////////////////////// | ||||||
|  |  | ||||||
| // C specific | // C specific | ||||||
| #ifndef __cplusplus | #ifndef __cplusplus | ||||||
|  |  | ||||||
| #ifdef WIN32 | #ifndef WIN32 | ||||||
|  |  #define		XINLINE inline | ||||||
|  | #else | ||||||
|  |  | ||||||
|  #ifndef S_ISREG |  #ifndef S_ISREG | ||||||
|  #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) |  #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | ||||||
|  #endif |  #endif | ||||||
| @@ -153,11 +163,10 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen | |||||||
|  #define strcasecmp stricmp |  #define strcasecmp stricmp | ||||||
|  #define strncasecmp strnicmp |  #define strncasecmp strnicmp | ||||||
|  |  | ||||||
| 	#define sleep(a) Sleep((a)*1000) |  #define sleep Sleep | ||||||
|  #define usleep(a) Sleep((a)/1000) |  #define usleep(a) Sleep((a)/1000) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif // __cplusplus | #endif // __cplusplus | ||||||
|  |  | ||||||
| #endif /* GENLIB_UTIL_UTIL_H */ | #endif /* GENLIB_UTIL_UTIL_H */ | ||||||
|  |  | ||||||
|   | |||||||
| @@ -244,7 +244,7 @@ get_node_value( IN IXML_Node * node ) | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| get_host_and_path( IN char *ctrl_url, | get_host_and_path( IN char *ctrl_url, | ||||||
|                    OUT const memptr *host, |                    OUT const memptr *host, | ||||||
|                    OUT const memptr *path, |                    OUT const memptr *path, | ||||||
| @@ -277,7 +277,7 @@ get_host_and_path( IN char *ctrl_url, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| get_action_name( IN char *action, | get_action_name( IN char *action, | ||||||
|                  OUT memptr * name ) |                  OUT memptr * name ) | ||||||
| { | { | ||||||
| @@ -303,7 +303,7 @@ get_action_name( IN char *action, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| add_man_header( INOUT membuffer * headers ) | add_man_header( INOUT membuffer * headers ) | ||||||
| { | { | ||||||
|     char *soap_action_hdr; |     char *soap_action_hdr; | ||||||
| @@ -611,16 +611,17 @@ SoapSendAction( IN char *action_url, | |||||||
|     char *xml_end = |     char *xml_end = | ||||||
|         "</s:Body>\r\n" |         "</s:Body>\r\n" | ||||||
|         "</s:Envelope>\r\n\r\n"; |         "</s:Envelope>\r\n\r\n"; | ||||||
|     size_t xml_start_len; |     int xml_start_len; | ||||||
|     size_t xml_end_len; |     int xml_end_len; | ||||||
|     size_t action_str_len; |     int action_str_len; | ||||||
|  |  | ||||||
|     *response_node = NULL;      // init |     *response_node = NULL;      // init | ||||||
|  |  | ||||||
|     err_code = UPNP_E_OUTOF_MEMORY; // default error |     err_code = UPNP_E_OUTOF_MEMORY; // default error | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "Inside SoapSendAction():" ); |                          "Inside SoapSendAction():" ); | ||||||
|  |          ) | ||||||
|         // init |         // init | ||||||
|         membuffer_init( &request ); |         membuffer_init( &request ); | ||||||
|     membuffer_init( &responsename ); |     membuffer_init( &responsename ); | ||||||
| @@ -641,12 +642,11 @@ SoapSendAction( IN char *action_url, | |||||||
|         goto error_handler; |         goto error_handler; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "path=%.*s, hostport=%.*s\n", |                          "path=%.*s, hostport=%.*s\n", | ||||||
|         (int)url.pathquery.size, |                          url.pathquery.size, url.pathquery.buff, | ||||||
|         url.pathquery.buff, |                          url.hostport.text.size, | ||||||
|         (int)url.hostport.text.size, |                          url.hostport.text.buff ); ) | ||||||
|         url.hostport.text.buff ); |  | ||||||
|  |  | ||||||
|     xml_start_len = strlen( xml_start ); |     xml_start_len = strlen( xml_start ); | ||||||
|     xml_end_len = strlen( xml_end ); |     xml_end_len = strlen( xml_end ); | ||||||
| @@ -757,21 +757,22 @@ SoapSendActionEx( IN char *action_url, | |||||||
|     char *xml_end = |     char *xml_end = | ||||||
|         "</s:Body>\r\n" |         "</s:Body>\r\n" | ||||||
|         "</s:Envelope>\r\n"; |         "</s:Envelope>\r\n"; | ||||||
|     size_t xml_start_len; |     int xml_start_len; | ||||||
|     size_t xml_header_start_len; |     int xml_header_start_len; | ||||||
|     size_t xml_header_str_len; |     int xml_header_str_len; | ||||||
|     size_t xml_header_end_len; |     int xml_header_end_len; | ||||||
|     size_t xml_body_start_len; |     int xml_body_start_len; | ||||||
|     size_t action_str_len; |     int action_str_len; | ||||||
|     size_t xml_end_len; |     int xml_end_len; | ||||||
|     off_t content_length; |     off_t content_length; | ||||||
|  |  | ||||||
|     *response_node = NULL;      // init |     *response_node = NULL;      // init | ||||||
|  |  | ||||||
|     err_code = UPNP_E_OUTOF_MEMORY; // default error |     err_code = UPNP_E_OUTOF_MEMORY; // default error | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "Inside SoapSendActionEx():" ); |                          "Inside SoapSendActionEx():" ); | ||||||
|  |          ) | ||||||
|         // init |         // init | ||||||
|         membuffer_init( &request ); |         membuffer_init( &request ); | ||||||
|     membuffer_init( &responsename ); |     membuffer_init( &responsename ); | ||||||
| @@ -797,12 +798,11 @@ SoapSendActionEx( IN char *action_url, | |||||||
|         goto error_handler; |         goto error_handler; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "path=%.*s, hostport=%.*s\n", |                          "path=%.*s, hostport=%.*s\n", | ||||||
|         (int)url.pathquery.size, |                          url.pathquery.size, url.pathquery.buff, | ||||||
|         url.pathquery.buff, |                          url.hostport.text.size, | ||||||
|         (int)url.hostport.text.size, |                          url.hostport.text.buff ); ) | ||||||
|         url.hostport.text.buff ); |  | ||||||
|  |  | ||||||
|     xml_start_len = strlen( xml_start ); |     xml_start_len = strlen( xml_start ); | ||||||
|     xml_body_start_len = strlen( xml_body_start ); |     xml_body_start_len = strlen( xml_body_start ); | ||||||
| @@ -821,7 +821,7 @@ SoapSendActionEx( IN char *action_url, | |||||||
|         xml_body_start_len + action_str_len + xml_end_len; |         xml_body_start_len + action_str_len + xml_end_len; | ||||||
|     if (http_MakeMessage( |     if (http_MakeMessage( | ||||||
|         &request, 1, 1, |         &request, 1, 1, | ||||||
|         "q" "N" "s" "sssbsc" "Uc" "b" "b" "b" "b" "b" "b" "b", |         "q" "N" "s" "sssbsc" "Uc" "bbbbbbb", | ||||||
|         SOAPMETHOD_POST, &url, |         SOAPMETHOD_POST, &url, | ||||||
|         content_length, |         content_length, | ||||||
|         ContentTypeHeader, |         ContentTypeHeader, | ||||||
|   | |||||||
| @@ -85,7 +85,7 @@ const char *ContentTypeHeader = | |||||||
| *		0 if successful else returns appropriate error. | *		0 if successful else returns appropriate error. | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| get_request_type( IN http_message_t * request, | get_request_type( IN http_message_t * request, | ||||||
|                   OUT memptr * action_name ) |                   OUT memptr * action_name ) | ||||||
| { | { | ||||||
| @@ -262,7 +262,7 @@ send_error_response( IN SOCKINFO * info, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| send_var_query_response( IN SOCKINFO * info, | send_var_query_response( IN SOCKINFO * info, | ||||||
|                          IN const char *var_value, |                          IN const char *var_value, | ||||||
|                          IN http_message_t * hmsg ) |                          IN http_message_t * hmsg ) | ||||||
| @@ -326,12 +326,12 @@ send_var_query_response( IN SOCKINFO * info, | |||||||
| *	Description :	This function separates the action node from  | *	Description :	This function separates the action node from  | ||||||
| *	the root DOM node. | *	the root DOM node. | ||||||
| * | * | ||||||
| *	Return :	static UPNP_INLINE int | *	Return :	static XINLINE int | ||||||
| *		0 if successful, or -1 if fails. | *		0 if successful, or -1 if fails. | ||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| get_action_node( IN IXML_Document * TempDoc, | get_action_node( IN IXML_Document * TempDoc, | ||||||
|                  IN char *NodeName, |                  IN char *NodeName, | ||||||
|                  OUT IXML_Document ** RespNode ) |                  OUT IXML_Document ** RespNode ) | ||||||
| @@ -344,8 +344,9 @@ get_action_node( IN IXML_Document * TempDoc, | |||||||
|     int ret_code = -1;          // error, by default |     int ret_code = -1;          // error, by default | ||||||
|     IXML_NodeList *nl = NULL; |     IXML_NodeList *nl = NULL; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "get_action_node(): node name =%s\n ", NodeName ); |                          "get_action_node(): node name =%s\n ", NodeName ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         * RespNode = NULL; |         * RespNode = NULL; | ||||||
|  |  | ||||||
| @@ -681,7 +682,7 @@ get_device_info( IN http_message_t * request, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| send_action_response( IN SOCKINFO * info, | send_action_response( IN SOCKINFO * info, | ||||||
|                       IN IXML_Document * action_resp, |                       IN IXML_Document * action_resp, | ||||||
|                       IN http_message_t * request ) |                       IN http_message_t * request ) | ||||||
| @@ -737,11 +738,11 @@ send_action_response( IN SOCKINFO * info, | |||||||
|                                  xml_response, strlen( xml_response ), |                                  xml_response, strlen( xml_response ), | ||||||
|                                  end_body, strlen( end_body ) ); |                                  end_body, strlen( end_body ) ); | ||||||
|  |  | ||||||
|     if( ret_code != 0 ) { |     DBGONLY( if( ret_code != 0 ) { | ||||||
|              UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |              UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "Failed to send response: err code = %d\n", |                          "Failed to send response: err code = %d\n", | ||||||
|             ret_code ); |                          ret_code );} | ||||||
|     } |      ) | ||||||
|  |  | ||||||
|         err_code = 0; |         err_code = 0; | ||||||
|  |  | ||||||
| @@ -769,7 +770,7 @@ error_handler: | |||||||
| *		returns 0 if successful else returns -1. | *		returns 0 if successful else returns -1. | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| get_var_name( IN IXML_Document * TempDoc, | get_var_name( IN IXML_Document * TempDoc, | ||||||
|               OUT char *VarName ) |               OUT char *VarName ) | ||||||
| { | { | ||||||
| @@ -813,9 +814,10 @@ get_var_name( IN IXML_Document * TempDoc, | |||||||
|     Temp = ixmlNode_getNodeValue( VarNode ); |     Temp = ixmlNode_getNodeValue( VarNode ); | ||||||
|     linecopy( VarName, Temp ); |     linecopy( VarName, Temp ); | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "Received query for variable  name %s\n", |                          "Received query for variable  name %s\n", | ||||||
|                          VarName ); |                          VarName ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         ret_val = 0;            // success |         ret_val = 0;            // success | ||||||
|  |  | ||||||
| @@ -840,7 +842,7 @@ error_handler: | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ****************************************************************************/ | ****************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| handle_query_variable( IN SOCKINFO * info, | handle_query_variable( IN SOCKINFO * info, | ||||||
|                        IN http_message_t * request, |                        IN http_message_t * request, | ||||||
|                        IN IXML_Document * xml_doc ) |                        IN IXML_Document * xml_doc ) | ||||||
| @@ -876,8 +878,8 @@ handle_query_variable( IN SOCKINFO * info, | |||||||
|     // send event |     // send event | ||||||
|     soap_event_callback( UPNP_CONTROL_GET_VAR_REQUEST, &variable, cookie ); |     soap_event_callback( UPNP_CONTROL_GET_VAR_REQUEST, &variable, cookie ); | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|         "Return from callback for var request\n" ); |                          "Return from callback for var request\n" ) ); | ||||||
|  |  | ||||||
|     // validate, and handle result |     // validate, and handle result | ||||||
|     if( variable.CurrentVal == NULL ) { |     if( variable.CurrentVal == NULL ) { | ||||||
| @@ -966,8 +968,8 @@ handle_invoke_action( IN SOCKINFO * info, | |||||||
|     action.ErrCode = UPNP_E_SUCCESS; |     action.ErrCode = UPNP_E_SUCCESS; | ||||||
|     action.CtrlPtIPAddr = info->foreign_ip_addr; |     action.CtrlPtIPAddr = info->foreign_ip_addr; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, | ||||||
|                          "Calling Callback\n" ); |                          "Calling Callback\n" ) ); | ||||||
|  |  | ||||||
|     soap_event_callback( UPNP_CONTROL_ACTION_REQUEST, &action, cookie ); |     soap_event_callback( UPNP_CONTROL_ACTION_REQUEST, &action, cookie ); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -125,7 +125,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg, | |||||||
|  |  | ||||||
|     // 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 | ||||||
|  |  | ||||||
|     HandleReadLock(); |     HandleLock(  ); | ||||||
|  |  | ||||||
|     if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { |     if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { | ||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
| @@ -159,7 +159,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     // dest addr |     // dest addr | ||||||
|     memcpy(¶m.DestAddr, dest_addr, sizeof(struct sockaddr_in) ); |     param.DestAddr = dest_addr; | ||||||
|  |  | ||||||
|     // EXT |     // EXT | ||||||
|     param.Ext[0] = '\0'; |     param.Ext[0] = '\0'; | ||||||
| @@ -365,9 +365,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg, | |||||||
| * Returns: void | * Returns: void | ||||||
| * | * | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #warning There are currently no uses of the function 'process_reply()' in the code. | static XINLINE void | ||||||
| #warning 'process_reply()' is a candidate for removal. |  | ||||||
| static UPNP_INLINE void |  | ||||||
| process_reply( IN char *request_buf, | process_reply( IN char *request_buf, | ||||||
|                IN int buf_len, |                IN int buf_len, | ||||||
|                IN struct sockaddr_in *dest_addr, |                IN struct sockaddr_in *dest_addr, | ||||||
| @@ -538,7 +536,9 @@ SearchByTarget( IN int Mx, | |||||||
|     if( ReqBuf == NULL ) |     if( ReqBuf == NULL ) | ||||||
|         return UPNP_E_OUTOF_MEMORY; |         return UPNP_E_OUTOF_MEMORY; | ||||||
|  |  | ||||||
|     UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, ">>> SSDP SEND >>>\n"); |     DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|  |                          ">>> SSDP SEND >>>\n%s\n", ReqBuf ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         timeTillRead = Mx; |         timeTillRead = Mx; | ||||||
|  |  | ||||||
| @@ -589,22 +589,25 @@ SearchByTarget( IN int Mx, | |||||||
|  |  | ||||||
|     if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL ) |     if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL ) | ||||||
|         == UPNP_SOCKETERROR ) { |         == UPNP_SOCKETERROR ) { | ||||||
|         if( errno == EBADF ) { |         DBGONLY( if( errno == EBADF ) { | ||||||
|                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                              "SSDP_LIB :RequestHandler:An invalid file descriptor" |                              "SSDP_LIB :RequestHandler:An invalid file descriptor" | ||||||
|                 " was givenin one of the sets. \n" ); |                              " was givenin one of the sets. \n" );} | ||||||
|         } else if( errno == EINTR ) { |                  else | ||||||
|  |                  if( errno == EINTR ) { | ||||||
|                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                              "SSDP_LIB :RequestHandler:  A non blocked " |                              "SSDP_LIB :RequestHandler:  A non blocked " | ||||||
|                 "signal was caught.    \n" ); |                              "signal was caught.    \n" );} | ||||||
|         } else if( errno == EINVAL ) { |                  else | ||||||
|  |                  if( errno == EINVAL ) { | ||||||
|                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                 "SSDP_LIB :RequestHandler: n is negative.  \n" ); |                              "SSDP_LIB :RequestHandler: n is negative.  \n" );} | ||||||
|         } else if( errno == ENOMEM ) { |                  else | ||||||
|  |                  if( errno == ENOMEM ) { | ||||||
|                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                              "SSDP_LIB : RequestHandler:select was unable to " |                              "SSDP_LIB : RequestHandler:select was unable to " | ||||||
|                 "allocate memory for internal tables.\n" ); |                              "allocate memory for internal tables.\n" );} | ||||||
|         } |  ) | ||||||
| shutdown( gSsdpReqSocket, SD_BOTH ); | shutdown( gSsdpReqSocket, SD_BOTH ); | ||||||
|         UpnpCloseSocket( gSsdpReqSocket ); |         UpnpCloseSocket( gSsdpReqSocket ); | ||||||
|         free( ReqBuf ); |         free( ReqBuf ); | ||||||
|   | |||||||
| @@ -95,7 +95,6 @@ advertiseAndReplyThread( IN void *data ) | |||||||
| * Returns: void * | * Returns: void * | ||||||
| *	1 if successful else appropriate error | *	1 if successful else appropriate error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| #ifdef INCLUDE_DEVICE_APIS |  | ||||||
| void | void | ||||||
| ssdp_handle_device_request( IN http_message_t * hmsg, | ssdp_handle_device_request( IN http_message_t * hmsg, | ||||||
|                             IN struct sockaddr_in *dest_addr ) |                             IN struct sockaddr_in *dest_addr ) | ||||||
| @@ -145,7 +144,7 @@ ssdp_handle_device_request( IN http_message_t * hmsg, | |||||||
|     maxAge = dev_info->MaxAge; |     maxAge = dev_info->MaxAge; | ||||||
|     HandleUnlock(  ); |     HandleUnlock(  ); | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, | ||||||
|                          "ssdp_handle_device_request with Cmd %d SEARCH\n", |                          "ssdp_handle_device_request with Cmd %d SEARCH\n", | ||||||
|                          event.Cmd ); |                          event.Cmd ); | ||||||
|              UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, |              UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, | ||||||
| @@ -157,7 +156,7 @@ ssdp_handle_device_request( IN http_message_t * hmsg, | |||||||
|              UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, |              UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, | ||||||
|                          "DeviceUuid   =  %s\n", event.UDN ); |                          "DeviceUuid   =  %s\n", event.UDN ); | ||||||
|              UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, |              UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, | ||||||
|         "ServiceType =  %s\n", event.ServiceType ); |                          "ServiceType =  %s\n", event.ServiceType ); ) | ||||||
|  |  | ||||||
|         threadArg = |         threadArg = | ||||||
|         ( SsdpSearchReply * ) malloc( sizeof( SsdpSearchReply ) ); |         ( SsdpSearchReply * ) malloc( sizeof( SsdpSearchReply ) ); | ||||||
| @@ -191,7 +190,6 @@ ssdp_handle_device_request( IN http_message_t * hmsg, | |||||||
|     TimerThreadSchedule( &gTimerThread, replyTime, REL_SEC, &job, |     TimerThreadSchedule( &gTimerThread, replyTime, REL_SEC, &job, | ||||||
|                          SHORT_TERM, NULL ); |                          SHORT_TERM, NULL ); | ||||||
| } | } | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /************************************************************************ | /************************************************************************ | ||||||
| * Function : NewRequestHandler									 | * Function : NewRequestHandler									 | ||||||
| @@ -222,9 +220,9 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr, | |||||||
|  |  | ||||||
|     ReplySock = socket( AF_INET, SOCK_DGRAM, 0 ); |     ReplySock = socket( AF_INET, SOCK_DGRAM, 0 ); | ||||||
|     if( ReplySock == UPNP_INVALID_SOCKET ) { |     if( ReplySock == UPNP_INVALID_SOCKET ) { | ||||||
|         UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                              "SSDP_LIB: New Request Handler:" |                              "SSDP_LIB: New Request Handler:" | ||||||
|             "Error in socket operation !!!\n" ); |                              "Error in socket operation !!!\n" ) ); | ||||||
|  |  | ||||||
|         return UPNP_E_OUTOF_SOCKET; |         return UPNP_E_OUTOF_SOCKET; | ||||||
|     } |     } | ||||||
| @@ -242,16 +240,17 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr, | |||||||
|         // "If a multicast resource would send a response(s) to any copy of the  |         // "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  |         //  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  |         //  it receives. It MUST NOT repeat its response(s) per copy of the  | ||||||
|         //  request." |         //  reuqest." | ||||||
|         //   |         //   | ||||||
|         // http://www.upnp.org/download/draft-goland-http-udp-04.txt |         // http://www.upnp.org/download/draft-goland-http-udp-04.txt | ||||||
|         // |         // | ||||||
|         // So, NUM_COPY has been changed from 2 to 1. |         // So, NUM_COPY has been changed from 2 to 1. | ||||||
|         NumCopy = 0; |         NumCopy = 0; | ||||||
|         while( NumCopy < NUM_COPY ) { |         while( NumCopy < NUM_COPY ) { | ||||||
|             UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                                  ">>> SSDP SEND >>>\n%s\n", |                                  ">>> SSDP SEND >>>\n%s\n", | ||||||
|                                  *( RqPacket + Index ) ); |                                  *( RqPacket + Index ) ); | ||||||
|  |                  ) | ||||||
|                 rc = sendto( ReplySock, *( RqPacket + Index ), |                 rc = sendto( ReplySock, *( RqPacket + Index ), | ||||||
|                              strlen( *( RqPacket + Index ) ), |                              strlen( *( RqPacket + Index ) ), | ||||||
|                              0, ( struct sockaddr * )DestAddr, socklen ); |                              0, ( struct sockaddr * )DestAddr, socklen ); | ||||||
| @@ -389,8 +388,9 @@ DeviceAdvertisement( IN char *DevType, | |||||||
|     char *msgs[3]; |     char *msgs[3]; | ||||||
|     int ret_code; |     int ret_code; | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                          "In function SendDeviceAdvertisemenrt\n" ); |                          "In function SendDeviceAdvertisemenrt\n" ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         DestAddr.sin_family = AF_INET; |         DestAddr.sin_family = AF_INET; | ||||||
|     DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP ); |     DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP ); | ||||||
| @@ -530,6 +530,7 @@ SendReply( IN struct sockaddr_in *DestAddr, | |||||||
| *	IN char * Udn: Device UDN | *	IN char * Udn: Device UDN | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
|  |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates the reply packet based on the input parameter,  | *	This function creates the reply packet based on the input parameter,  | ||||||
| *	and send it to the client address given in its input parameter DestAddr. | *	and send it to the client address given in its input parameter DestAddr. | ||||||
| @@ -606,9 +607,11 @@ DeviceReply( IN struct sockaddr_in *DestAddr, | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
|  |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates the advertisement packet based  | *	This function creates the advertisement packet based  | ||||||
| *	on the input parameter, and send it to the multicast channel. | *	on the input parameter, and send it to the multicast channel. | ||||||
|  |  | ||||||
| * | * | ||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| @@ -653,9 +656,11 @@ ServiceAdvertisement( IN char *Udn, | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Life time of this device. | *	IN int  Duration :Life time of this device. | ||||||
|  |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates the advertisement packet based  | *	This function creates the advertisement packet based  | ||||||
| *	on the input parameter, and send it to the multicast channel. | *	on the input parameter, and send it to the multicast channel. | ||||||
|  |  | ||||||
| * | * | ||||||
| * Returns: int | * Returns: int | ||||||
| *	UPNP_E_SUCCESS if successful else appropriate error | *	UPNP_E_SUCCESS if successful else appropriate error | ||||||
| @@ -695,6 +700,7 @@ ServiceReply( IN struct sockaddr_in *DestAddr, | |||||||
| *	IN char *ServType: Service Type. | *	IN char *ServType: Service Type. | ||||||
| *	IN char * Location: Location of Device description document. | *	IN char * Location: Location of Device description document. | ||||||
| *	IN int  Duration :Service duration in sec. | *	IN int  Duration :Service duration in sec. | ||||||
|  |  | ||||||
| * Description:														 | * Description:														 | ||||||
| *	This function creates a HTTP service shutdown request packet  | *	This function creates a HTTP service shutdown request packet  | ||||||
| *	and sent it to the multicast channel through RequestHandler. | *	and sent it to the multicast channel through RequestHandler. | ||||||
| @@ -777,8 +783,8 @@ DeviceShutdown( IN char *DevType, | |||||||
|                              Mil_Usn, Location, Duration, &msgs[0] ); |                              Mil_Usn, Location, Duration, &msgs[0] ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|         "In function DeviceShutdown\n" ); |                          "In function DeviceShutdown\n" ); ) | ||||||
|         // both root and sub-devices need to send these two messages |         // both root and sub-devices need to send these two messages | ||||||
|         CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn, |         CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn, | ||||||
|                              Location, Duration, &msgs[1] ); |                              Location, Duration, &msgs[1] ); | ||||||
| @@ -815,4 +821,3 @@ DeviceShutdown( IN char *DevType, | |||||||
|  |  | ||||||
| #endif // EXCLUDE_SSDP | #endif // EXCLUDE_SSDP | ||||||
| #endif // INCLUDE_DEVICE_APIS | #endif // INCLUDE_DEVICE_APIS | ||||||
|  |  | ||||||
|   | |||||||
| @@ -75,9 +75,7 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0; | |||||||
| * Function : AdvertiseAndReply									 | * Function : AdvertiseAndReply									 | ||||||
| *																	 | *																	 | ||||||
| * Parameters:														 | * Parameters:														 | ||||||
| *	IN int AdFlag: | *	IN int AdFlag: -1 = Send shutdown, 0 = send reply,  | ||||||
| *		-1 = Send shutdown, |  | ||||||
| *		 0 = send reply,  |  | ||||||
| *					1 = Send Advertisement | *					1 = Send Advertisement | ||||||
| *	IN UpnpDevice_Handle Hnd: Device handle | *	IN UpnpDevice_Handle Hnd: Device handle | ||||||
| *	IN enum SsdpSearchType SearchType:Search type for sending replies | *	IN enum SsdpSearchType SearchType:Search type for sending replies | ||||||
| @@ -117,18 +115,21 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|     const DOMString tmpStr; |     const DOMString tmpStr; | ||||||
|     char SERVER[200]; |     char SERVER[200]; | ||||||
|  |  | ||||||
|     const DOMString dbgStr; |     DBGONLY( const DOMString dbgStr; | ||||||
|              UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |              UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                          "Inside AdvertiseAndReply with AdFlag = %d\n", |                          "Inside AdvertiseAndReply with AdFlag = %d\n", | ||||||
|         AdFlag ); |                          AdFlag ); ) | ||||||
|  |  | ||||||
|     // Use a read lock |         HandleLock(  ); | ||||||
|     HandleReadLock(); |  | ||||||
|     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { |     if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) { | ||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
|         return UPNP_E_INVALID_HANDLE; |         return UPNP_E_INVALID_HANDLE; | ||||||
|     } |     } | ||||||
|     defaultExp = SInfo->MaxAge; |     defaultExp = SInfo->MaxAge; | ||||||
|  |  | ||||||
|  |     //Modifed to prevent more than one thread from accessing the  | ||||||
|  |     //UpnpDocument stored with the handle at the same time | ||||||
|  |     // HandleUnlock(); | ||||||
|     nodeList = NULL; |     nodeList = NULL; | ||||||
|  |  | ||||||
|     //get server info |     //get server info | ||||||
| @@ -138,33 +139,41 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|     // parse the device list and send advertisements/replies  |     // parse the device list and send advertisements/replies  | ||||||
|     for( i = 0;; i++ ) { |     for( i = 0;; i++ ) { | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |         DBGONLY( 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 ); | ||||||
|  |              ) | ||||||
|  |  | ||||||
|             tmpNode = ixmlNodeList_item( SInfo->DeviceList, i ); |             tmpNode = ixmlNodeList_item( SInfo->DeviceList, i ); | ||||||
|         if( tmpNode == NULL ) { |         if( tmpNode == NULL ) { | ||||||
|             UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                 "Exiting new device list with i = %d\n\n", i ); |                                  "Exiting new device list with i = %d\n\n", | ||||||
|  |                                  i ); | ||||||
|  |                  ) | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         dbgStr = ixmlNode_getNodeName( tmpNode ); |         DBGONLY( dbgStr = ixmlNode_getNodeName( tmpNode ); | ||||||
|                  UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|             "Extracting device type once for %s\n", dbgStr ); |                              "Extracting device type once for %s\n", | ||||||
|  |                              dbgStr ); ) | ||||||
|             // extract device type  |             // extract device type  | ||||||
|             ixmlNodeList_free( nodeList ); |             ixmlNodeList_free( nodeList ); | ||||||
|         nodeList = NULL; |         nodeList = NULL; | ||||||
|         nodeList = ixmlElement_getElementsByTagName( |         nodeList = | ||||||
|             ( IXML_Element * ) tmpNode, "deviceType" ); |             ixmlElement_getElementsByTagName( ( IXML_Element * ) tmpNode, | ||||||
|  |                                               "deviceType" ); | ||||||
|         if( nodeList == NULL ) { |         if( nodeList == NULL ) { | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         dbgStr = ixmlNode_getNodeName( tmpNode ); |         DBGONLY( dbgStr = ixmlNode_getNodeName( tmpNode ); | ||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |  | ||||||
|             "Extracting UDN for %s\n", dbgStr ); |  | ||||||
|                  UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|  |                              "Extracting UDN for %s\n", dbgStr ); ) | ||||||
|  |  | ||||||
|  |             DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                                  "Extracting device type\n" ); |                                  "Extracting device type\n" ); | ||||||
|  |              ) | ||||||
|  |  | ||||||
|             tmpNode2 = ixmlNodeList_item( nodeList, 0 ); |             tmpNode2 = ixmlNodeList_item( nodeList, 0 ); | ||||||
|         if( tmpNode2 == NULL ) { |         if( tmpNode2 == NULL ) { | ||||||
| @@ -175,8 +184,9 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                              "Extracting device type \n" ); |                              "Extracting device type \n" ); | ||||||
|  |              ) | ||||||
|  |  | ||||||
|             tmpStr = ixmlNode_getNodeValue( textNode ); |             tmpStr = ixmlNode_getNodeValue( textNode ); | ||||||
|         if( tmpStr == NULL ) { |         if( tmpStr == NULL ) { | ||||||
| @@ -188,41 +198,47 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                              "Extracting device type = %s\n", devType ); |                              "Extracting device type = %s\n", devType ); | ||||||
|                  if( tmpNode == NULL ) { |                  if( tmpNode == NULL ) { | ||||||
|                  UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                 "TempNode is NULL\n" ); |                              "TempNode is NULL\n" );} | ||||||
| 	} |  | ||||||
|                  dbgStr = ixmlNode_getNodeName( tmpNode ); |                  dbgStr = ixmlNode_getNodeName( tmpNode ); | ||||||
|                  UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |                  UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|             "Extracting UDN for %s\n", dbgStr ); |                              "Extracting UDN for %s\n", dbgStr ); ) | ||||||
|             // extract UDN  |             // extract UDN  | ||||||
|             ixmlNodeList_free( nodeList ); |             ixmlNodeList_free( nodeList ); | ||||||
|         nodeList = NULL; |         nodeList = NULL; | ||||||
|         nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * ) |         nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * ) | ||||||
|                                                      tmpNode, "UDN" ); |                                                      tmpNode, "UDN" ); | ||||||
|         if( nodeList == NULL ) { |         if( nodeList == NULL ) { | ||||||
|             UpnpPrintf( UPNP_CRITICAL, API, __FILE__, |  | ||||||
|  |             DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, | ||||||
|                                  __LINE__, "UDN not found!!!\n" ); |                                  __LINE__, "UDN not found!!!\n" ); | ||||||
|  |                  ) | ||||||
|                 continue; |                 continue; | ||||||
|         } |         } | ||||||
|         tmpNode2 = ixmlNodeList_item( nodeList, 0 ); |         tmpNode2 = ixmlNodeList_item( nodeList, 0 ); | ||||||
|         if( tmpNode2 == NULL ) { |         if( tmpNode2 == NULL ) { | ||||||
|             UpnpPrintf( UPNP_CRITICAL, API, __FILE__, |  | ||||||
|  |             DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, | ||||||
|                                  __LINE__, "UDN not found!!!\n" ); |                                  __LINE__, "UDN not found!!!\n" ); | ||||||
|  |                  ) | ||||||
|                 continue; |                 continue; | ||||||
|         } |         } | ||||||
|         textNode = ixmlNode_getFirstChild( tmpNode2 ); |         textNode = ixmlNode_getFirstChild( tmpNode2 ); | ||||||
|         if( textNode == NULL ) { |         if( textNode == NULL ) { | ||||||
|             UpnpPrintf( UPNP_CRITICAL, API, __FILE__, |  | ||||||
|  |             DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, | ||||||
|                                  __LINE__, "UDN not found!!!\n" ); |                                  __LINE__, "UDN not found!!!\n" ); | ||||||
|  |                  ) | ||||||
|                 continue; |                 continue; | ||||||
|         } |         } | ||||||
|         tmpStr = ixmlNode_getNodeValue( textNode ); |         tmpStr = ixmlNode_getNodeValue( textNode ); | ||||||
|         if( tmpStr == NULL ) { |         if( tmpStr == NULL ) { | ||||||
|             UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, | ||||||
|                                  "UDN not found!!!!\n" ); |                                  "UDN not found!!!!\n" ); | ||||||
|  |                  ) | ||||||
|                 continue; |                 continue; | ||||||
|         } |         } | ||||||
|         strcpy( UDNstr, tmpStr ); |         strcpy( UDNstr, tmpStr ); | ||||||
| @@ -230,14 +246,16 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                              "Sending UDNStr = %s \n", UDNstr ); |                              "Sending UDNStr = %s \n", UDNstr ); | ||||||
|  |              ) | ||||||
|             if( AdFlag ) { |             if( AdFlag ) { | ||||||
|             // send the device advertisement  |             // send the device advertisement  | ||||||
|             if( AdFlag == 1 ) { |             if( AdFlag == 1 ) { | ||||||
|                 DeviceAdvertisement( devType, i == 0, |                 DeviceAdvertisement( devType, i == 0, | ||||||
|                                      UDNstr, SInfo->DescURL, Exp ); |                                      UDNstr, SInfo->DescURL, Exp ); | ||||||
|             } else {             // AdFlag == -1 |             } else              // AdFlag == -1 | ||||||
|  |             { | ||||||
|                 DeviceShutdown( devType, i == 0, UDNstr, |                 DeviceShutdown( devType, i == 0, UDNstr, | ||||||
|                                 SERVER, SInfo->DescURL, Exp ); |                                 SERVER, SInfo->DescURL, Exp ); | ||||||
|             } |             } | ||||||
| @@ -260,16 +278,22 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|                     { |                     { | ||||||
|                         if( DeviceUDN != NULL && strlen( DeviceUDN ) != 0 ) { |                         if( DeviceUDN != NULL && strlen( DeviceUDN ) != 0 ) { | ||||||
|                             if( strcasecmp( DeviceUDN, UDNstr ) ) { |                             if( strcasecmp( DeviceUDN, UDNstr ) ) { | ||||||
|                                 UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |                                 DBGONLY( UpnpPrintf | ||||||
|  |                                          ( UPNP_INFO, API, __FILE__, | ||||||
|  |                                            __LINE__, | ||||||
|                                            "DeviceUDN=%s and search " |                                            "DeviceUDN=%s and search " | ||||||
|                                            "UDN=%s did not match\n", |                                            "UDN=%s did not match\n", | ||||||
|                                            UDNstr, DeviceUDN ); |                                            UDNstr, DeviceUDN ); | ||||||
|  |                                      ) | ||||||
|                                     break; |                                     break; | ||||||
|                             } else { |                             } else { | ||||||
|                                 UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |                                 DBGONLY( UpnpPrintf | ||||||
|  |                                          ( UPNP_INFO, API, __FILE__, | ||||||
|  |                                            __LINE__, | ||||||
|                                            "DeviceUDN=%s and search " |                                            "DeviceUDN=%s and search " | ||||||
|                                            "UDN=%s MATCH\n", UDNstr, |                                            "UDN=%s MATCH\n", UDNstr, | ||||||
|                                            DeviceUDN ); |                                            DeviceUDN ); | ||||||
|  |                                      ) | ||||||
|                                     SendReply( DestAddr, devType, 0, |                                     SendReply( DestAddr, devType, 0, | ||||||
|                                                UDNstr, SInfo->DescURL, |                                                UDNstr, SInfo->DescURL, | ||||||
|                                                defaultExp, 0 ); |                                                defaultExp, 0 ); | ||||||
| @@ -282,17 +306,24 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|                         if( !strncasecmp |                         if( !strncasecmp | ||||||
|                             ( DeviceType, devType, |                             ( DeviceType, devType, | ||||||
|                               strlen( DeviceType ) ) ) { |                               strlen( DeviceType ) ) ) { | ||||||
|                             UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |                             DBGONLY( UpnpPrintf | ||||||
|  |                                      ( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                                        "DeviceType=%s and search devType=%s MATCH\n", |                                        "DeviceType=%s and search devType=%s MATCH\n", | ||||||
|                                        devType, DeviceType ); |                                        devType, DeviceType ); | ||||||
|  |                                  ) | ||||||
|                                 SendReply( DestAddr, devType, 0, UDNstr, |                                 SendReply( DestAddr, devType, 0, UDNstr, | ||||||
|                                            SInfo->DescURL, defaultExp, 1 ); |                                            SInfo->DescURL, defaultExp, 1 ); | ||||||
|                         } else { |                         } | ||||||
|                             UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |  | ||||||
|  |                         DBGONLY( | ||||||
|  |                                     else | ||||||
|  |                                     UpnpPrintf( UPNP_INFO, API, __FILE__, | ||||||
|  |                                                 __LINE__, | ||||||
|                                                 "DeviceType=%s and search devType=%s" |                                                 "DeviceType=%s and search devType=%s" | ||||||
|                                                 " DID NOT MATCH\n", |                                                 " DID NOT MATCH\n", | ||||||
|                                                 devType, DeviceType ); |                                                 devType, DeviceType ); | ||||||
| 			} |                              ) | ||||||
|  |  | ||||||
|                             break; |                             break; | ||||||
|                     } |                     } | ||||||
|                 default: |                 default: | ||||||
| @@ -301,8 +332,9 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|         } |         } | ||||||
|         // send service advertisements for services corresponding  |         // send service advertisements for services corresponding  | ||||||
|         // to the same device  |         // to the same device  | ||||||
|         UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                              "Sending service Advertisement\n" ); |                              "Sending service Advertisement\n" ); | ||||||
|  |              ) | ||||||
|  |  | ||||||
|             tmpNode = ixmlNodeList_item( SInfo->ServiceList, i ); |             tmpNode = ixmlNodeList_item( SInfo->ServiceList, i ); | ||||||
|         if( tmpNode == NULL ) { |         if( tmpNode == NULL ) { | ||||||
| @@ -313,23 +345,27 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|         nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * ) |         nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * ) | ||||||
|                                                      tmpNode, "service" ); |                                                      tmpNode, "service" ); | ||||||
|         if( nodeList == NULL ) { |         if( nodeList == NULL ) { | ||||||
|             UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                                  "Service not found 3\n" ); |                                  "Service not found 3\n" ); | ||||||
|  |                  ) | ||||||
|                 continue; |                 continue; | ||||||
|         } |         } | ||||||
|         for( j = 0;; j++ ) { |         for( j = 0;; j++ ) { | ||||||
|             tmpNode = ixmlNodeList_item( nodeList, j ); |             tmpNode = ixmlNodeList_item( nodeList, j ); | ||||||
|             if( tmpNode == NULL ) { |             if( tmpNode == NULL ) | ||||||
|                 break; |                 break; | ||||||
|             } |  | ||||||
|  |  | ||||||
|             ixmlNodeList_free( tmpNodeList ); |             ixmlNodeList_free( tmpNodeList ); | ||||||
|             tmpNodeList = NULL; |             tmpNodeList = NULL; | ||||||
|             tmpNodeList = ixmlElement_getElementsByTagName( |             tmpNodeList = ixmlElement_getElementsByTagName( ( IXML_Element | ||||||
|                 ( IXML_Element *)tmpNode, "serviceType" ); |                                                               * ) tmpNode, | ||||||
|  |                                                             "serviceType" ); | ||||||
|  |  | ||||||
|             if( tmpNodeList == NULL ) { |             if( tmpNodeList == NULL ) { | ||||||
|                 UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, |                 DBGONLY( UpnpPrintf | ||||||
|  |                          ( UPNP_CRITICAL, API, __FILE__, __LINE__, | ||||||
|                            "ServiceType not found \n" ); |                            "ServiceType not found \n" ); | ||||||
|  |                      ) | ||||||
|                     continue; |                     continue; | ||||||
|             } |             } | ||||||
|             tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 ); |             tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 ); | ||||||
| @@ -350,34 +386,42 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                                  "ServiceType = %s\n", servType ); |                                  "ServiceType = %s\n", servType ); | ||||||
|  |                  ) | ||||||
|                 if( AdFlag ) { |                 if( AdFlag ) { | ||||||
|                 if( AdFlag == 1 ) { |                 if( AdFlag == 1 ) { | ||||||
|                     ServiceAdvertisement( UDNstr, servType, |                     ServiceAdvertisement( UDNstr, servType, | ||||||
|                                           SInfo->DescURL, Exp ); |                                           SInfo->DescURL, Exp ); | ||||||
|                 } else {         // AdFlag == -1 |                 } else          // AdFlag == -1 | ||||||
|  |                 { | ||||||
|                     ServiceShutdown( UDNstr, servType, |                     ServiceShutdown( UDNstr, servType, | ||||||
|                                      SInfo->DescURL, Exp ); |                                      SInfo->DescURL, Exp ); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|             } else { |             } else { | ||||||
|                 switch ( SearchType ) { |                 switch ( SearchType ) { | ||||||
|                     case SSDP_ALL: |                     case SSDP_ALL: | ||||||
|  |                         { | ||||||
|                             ServiceReply( DestAddr, servType, |                             ServiceReply( DestAddr, servType, | ||||||
|                                           UDNstr, SInfo->DescURL, |                                           UDNstr, SInfo->DescURL, | ||||||
|                                           defaultExp ); |                                           defaultExp ); | ||||||
|                             break; |                             break; | ||||||
|  |                         } | ||||||
|                     case SSDP_SERVICE: |                     case SSDP_SERVICE: | ||||||
|  |                         { | ||||||
|                             if( ServiceType != NULL ) { |                             if( ServiceType != NULL ) { | ||||||
|                                 if( !strncasecmp( ServiceType, |                                 if( !strncasecmp( ServiceType, | ||||||
|                                                   servType, |                                                   servType, | ||||||
|                                               strlen( ServiceType ) ) ) { |                                                   strlen( ServiceType ) ) ) | ||||||
|  |                                 { | ||||||
|                                     ServiceReply( DestAddr, servType, |                                     ServiceReply( DestAddr, servType, | ||||||
|                                                   UDNstr, SInfo->DescURL, |                                                   UDNstr, SInfo->DescURL, | ||||||
|                                                   defaultExp ); |                                                   defaultExp ); | ||||||
|                                 } |                                 } | ||||||
|                             } |                             } | ||||||
|                             break; |                             break; | ||||||
|  |                         } | ||||||
|                     default: |                     default: | ||||||
|                         break; |                         break; | ||||||
|                 }               // switch(SearchType)                |                 }               // switch(SearchType)                | ||||||
| @@ -389,8 +433,9 @@ int AdvertiseAndReply( IN int AdFlag, | |||||||
|         ixmlNodeList_free( nodeList ); |         ixmlNodeList_free( nodeList ); | ||||||
|         nodeList = NULL; |         nodeList = NULL; | ||||||
|     } |     } | ||||||
|     UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, | ||||||
|                          "Exiting AdvertiseAndReply : \n" ); |                          "Exiting AdvertiseAndReply : \n" ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         HandleUnlock(  ); |         HandleUnlock(  ); | ||||||
|  |  | ||||||
| @@ -632,7 +677,7 @@ free_ssdp_event_handler_data( void *the_data ) | |||||||
| * Returns: xboolean | * Returns: xboolean | ||||||
| *	returns TRUE if msg is valid else FALSE | *	returns TRUE if msg is valid else FALSE | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| static UPNP_INLINE xboolean | static XINLINE xboolean | ||||||
| valid_ssdp_msg( IN http_message_t * hmsg ) | valid_ssdp_msg( IN http_message_t * hmsg ) | ||||||
| { | { | ||||||
|     memptr hdr_value; |     memptr hdr_value; | ||||||
| @@ -674,7 +719,7 @@ valid_ssdp_msg( IN http_message_t * hmsg ) | |||||||
| * Returns: int | * Returns: int | ||||||
| *	0 if successful -1 if error | *	0 if successful -1 if error | ||||||
| ***************************************************************************/ | ***************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| start_event_handler( void *Data ) | start_event_handler( void *Data ) | ||||||
| { | { | ||||||
|  |  | ||||||
| @@ -688,16 +733,18 @@ start_event_handler( void *Data ) | |||||||
|     if( status == PARSE_FAILURE ) { |     if( status == PARSE_FAILURE ) { | ||||||
|         if( parser->msg.method != HTTPMETHOD_NOTIFY || |         if( parser->msg.method != HTTPMETHOD_NOTIFY || | ||||||
|             !parser->valid_ssdp_notify_hack ) { |             !parser->valid_ssdp_notify_hack ) { | ||||||
|             UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |             DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                                  "SSDP recvd bad msg code = %d\n", |                                  "SSDP recvd bad msg code = %d\n", | ||||||
|                                  status ); |                                  status ); | ||||||
|  |                  ) | ||||||
|                 // ignore bad msg, or not enuf mem |                 // ignore bad msg, or not enuf mem | ||||||
|                 goto error_handler; |                 goto error_handler; | ||||||
|         } |         } | ||||||
|         // valid notify msg |         // valid notify msg | ||||||
|     } else if( status != PARSE_SUCCESS ) { |     } else if( status != PARSE_SUCCESS ) { | ||||||
|         UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|                              "SSDP recvd bad msg code = %d\n", status ); |                              "SSDP recvd bad msg code = %d\n", status ); | ||||||
|  |              ) | ||||||
|  |  | ||||||
|             goto error_handler; |             goto error_handler; | ||||||
|     } |     } | ||||||
| @@ -737,10 +784,14 @@ ssdp_event_handler_thread( void *the_data ) | |||||||
|     // send msg to device or ctrlpt |     // send msg to device or ctrlpt | ||||||
|     if( ( hmsg->method == HTTPMETHOD_NOTIFY ) || |     if( ( hmsg->method == HTTPMETHOD_NOTIFY ) || | ||||||
|         ( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) { |         ( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) { | ||||||
|  |  | ||||||
|         CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, |         CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, | ||||||
|                                             FALSE, NULL );); |                                             FALSE, NULL ); | ||||||
|  |              ); | ||||||
|     } else { |     } else { | ||||||
|         ssdp_handle_device_request( hmsg, &data->dest_addr ); |  | ||||||
|  |         DEVICEONLY( ssdp_handle_device_request( hmsg, &data->dest_addr ); | ||||||
|  |              ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // free data |     // free data | ||||||
| @@ -810,20 +861,21 @@ readFromSSDPSocket( SOCKET socket ) | |||||||
|                              ( struct sockaddr * )&clientAddr, &socklen ); |                              ( struct sockaddr * )&clientAddr, &socklen ); | ||||||
|  |  | ||||||
|     if( byteReceived > 0 ) { |     if( byteReceived > 0 ) { | ||||||
|  |  | ||||||
|         requestBuf[byteReceived] = '\0'; |         requestBuf[byteReceived] = '\0'; | ||||||
|         UpnpPrintf( UPNP_INFO, SSDP, |         DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, | ||||||
|                              __FILE__, __LINE__, |                              __FILE__, __LINE__, | ||||||
|             "Start of received response ----------------------------------------------------\n" |                              "Received response !!!  " | ||||||
|             "%s\n" |                              "%s From host %s \n", | ||||||
|             "End of received response ------------------------------------------------------\n" |  | ||||||
|             "From host %s\n", |  | ||||||
|                              requestBuf, |                              requestBuf, | ||||||
|                              inet_ntoa( clientAddr.sin_addr ) ); |                              inet_ntoa( clientAddr.sin_addr ) ); | ||||||
|         UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__, |              ) | ||||||
|             "Start of received multicast packet --------------------------------------------\n" |  | ||||||
|             "%s\n" |             DBGONLY( UpnpPrintf( UPNP_PACKET, SSDP, | ||||||
|             "End of received multicast packet ----------------------------------------------\n", |                                  __FILE__, __LINE__, | ||||||
|             requestBuf ); |                                  "Received multicast packet:" | ||||||
|  |                                  "\n %s\n", requestBuf ); | ||||||
|  |              ) | ||||||
|             //add thread pool job to handle request |             //add thread pool job to handle request | ||||||
|             if( data != NULL ) { |             if( data != NULL ) { | ||||||
|             data->parser.msg.msg.length += byteReceived; |             data->parser.msg.msg.length += byteReceived; | ||||||
| @@ -839,6 +891,7 @@ readFromSSDPSocket( SOCKET socket ) | |||||||
|                 free_ssdp_event_handler_data( data ); |                 free_ssdp_event_handler_data( data ); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|     } else { |     } else { | ||||||
|         free_ssdp_event_handler_data( data ); |         free_ssdp_event_handler_data( data ); | ||||||
|     } |     } | ||||||
| @@ -862,7 +915,8 @@ get_ssdp_sockets( MiniServerSockArray * out ) | |||||||
| { | { | ||||||
|     SOCKET ssdpSock; |     SOCKET ssdpSock; | ||||||
|  |  | ||||||
|     CLIENTONLY( SOCKET ssdpReqSock; ) |     CLIENTONLY( SOCKET ssdpReqSock; | ||||||
|  |          ) | ||||||
|     int onOff = 1; |     int onOff = 1; | ||||||
|     u_char ttl = 4; |     u_char ttl = 4; | ||||||
|     struct ip_mreq ssdpMcastAddr; |     struct ip_mreq ssdpMcastAddr; | ||||||
| @@ -870,23 +924,24 @@ get_ssdp_sockets( MiniServerSockArray * out ) | |||||||
|     int option = 1; |     int option = 1; | ||||||
|     struct in_addr addr; |     struct in_addr addr; | ||||||
|  |  | ||||||
| CLIENTONLY( |     CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) | ||||||
|     if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { |                     == UPNP_INVALID_SOCKET ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |                 DBGONLY( UpnpPrintf( UPNP_CRITICAL, | ||||||
|                                      SSDP, __FILE__, __LINE__, |                                      SSDP, __FILE__, __LINE__, | ||||||
|             "Error in socket operation !!!\n" ); |                                      "Error in socket operation !!!\n" ); ) | ||||||
|             return UPNP_E_OUTOF_SOCKET; |                 return UPNP_E_OUTOF_SOCKET;} | ||||||
|     } |                 setsockopt( ssdpReqSock, | ||||||
|     setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); |                             IPPROTO_IP, | ||||||
|  |                             IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); | ||||||
|                 // just do it, regardless if fails or not. |                 // just do it, regardless if fails or not. | ||||||
|     Make_Socket_NoBlocking( ssdpReqSock ); |                 Make_Socket_NoBlocking( ssdpReqSock ); gSsdpReqSocket = ssdpReqSock; )  //CLIENTONLY | ||||||
|     gSsdpReqSocket = ssdpReqSock; ) |  | ||||||
| // END CLIENTONLY |  | ||||||
|  |  | ||||||
|     if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) { |         if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |             == UPNP_INVALID_SOCKET ) { | ||||||
|  |             DBGONLY( UpnpPrintf( UPNP_CRITICAL, | ||||||
|                                  SSDP, __FILE__, __LINE__, |                                  SSDP, __FILE__, __LINE__, | ||||||
|                                  "Error in socket operation !!!\n" ); |                                  "Error in socket operation !!!\n" ); | ||||||
|  |                  ) | ||||||
|                 CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |                 CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); | ||||||
|             CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |             CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); | ||||||
|             return UPNP_E_OUTOF_SOCKET; |             return UPNP_E_OUTOF_SOCKET; | ||||||
| @@ -895,9 +950,11 @@ CLIENTONLY( | |||||||
|     onOff = 1; |     onOff = 1; | ||||||
|     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, |     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR, | ||||||
|                     ( char * )&onOff, sizeof( onOff ) ) != 0 ) { |                     ( char * )&onOff, sizeof( onOff ) ) != 0 ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |  | ||||||
|  |         DBGONLY( UpnpPrintf( UPNP_CRITICAL, | ||||||
|                              SSDP, __FILE__, __LINE__, |                              SSDP, __FILE__, __LINE__, | ||||||
|                              "Error in set reuse addr !!!\n" ); |                              "Error in set reuse addr !!!\n" ); | ||||||
|  |              ) | ||||||
|             CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |             CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); | ||||||
|         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); | ||||||
|         shutdown( ssdpSock, SD_BOTH ); |         shutdown( ssdpSock, SD_BOTH ); | ||||||
| @@ -908,9 +965,11 @@ CLIENTONLY( | |||||||
|     #ifdef __FreeBSD__ |     #ifdef __FreeBSD__ | ||||||
|     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, |     if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT, | ||||||
|                     ( char * )&onOff, sizeof( onOff ) ) != 0 ) { |                     ( char * )&onOff, sizeof( onOff ) ) != 0 ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |  | ||||||
|  |         DBGONLY( UpnpPrintf( UPNP_CRITICAL, | ||||||
|                              SSDP, __FILE__, __LINE__, |                              SSDP, __FILE__, __LINE__, | ||||||
|                              "Error in set reuse port !!!\n" ); |                              "Error in set reuse port !!!\n" ); | ||||||
|  |              ) | ||||||
|             CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |             CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); | ||||||
|         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); |         CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); | ||||||
|         shutdown( ssdpSock, SD_BOTH ); |         shutdown( ssdpSock, SD_BOTH ); | ||||||
| @@ -924,11 +983,13 @@ CLIENTONLY( | |||||||
|     //  ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST); |     //  ssdpAddr.sin_addr.s_addr = inet_addr(LOCAL_HOST); | ||||||
|     ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY ); |     ssdpAddr.sin_addr.s_addr = htonl( INADDR_ANY ); | ||||||
|     ssdpAddr.sin_port = htons( SSDP_PORT ); |     ssdpAddr.sin_port = htons( SSDP_PORT ); | ||||||
|     if( bind( ssdpSock, ( struct sockaddr * )&ssdpAddr, |     if( bind | ||||||
|  |         ( ssdpSock, ( struct sockaddr * )&ssdpAddr, | ||||||
|           sizeof( ssdpAddr ) ) != 0 ) { |           sizeof( ssdpAddr ) ) != 0 ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         DBGONLY( UpnpPrintf | ||||||
|             SSDP, __FILE__, __LINE__, |                  ( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, | ||||||
|                    "Error in binding !!!\n" ); |                    "Error in binding !!!\n" ); | ||||||
|  |              ) | ||||||
|             shutdown( ssdpSock, SD_BOTH ); |             shutdown( ssdpSock, SD_BOTH ); | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); | ||||||
| @@ -940,10 +1001,12 @@ CLIENTONLY( | |||||||
|     ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST ); |     ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST ); | ||||||
|     ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP ); |     ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP ); | ||||||
|     if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, |     if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, | ||||||
|             ( char * )&ssdpMcastAddr, sizeof( struct ip_mreq ) ) != 0 ) { |                     ( char * )&ssdpMcastAddr, | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |                     sizeof( struct ip_mreq ) ) != 0 ) { | ||||||
|             SSDP, __FILE__, __LINE__, |         DBGONLY( UpnpPrintf | ||||||
|  |                  ( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, | ||||||
|                    "Error in joining" " multicast group !!!\n" ); |                    "Error in joining" " multicast group !!!\n" ); | ||||||
|  |              ) | ||||||
|             shutdown( ssdpSock, SD_BOTH ); |             shutdown( ssdpSock, SD_BOTH ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
| @@ -956,8 +1019,8 @@ CLIENTONLY( | |||||||
|     addr.s_addr = inet_addr(LOCAL_HOST); |     addr.s_addr = inet_addr(LOCAL_HOST); | ||||||
|     if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF, |     if (setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF, | ||||||
|                    (char *)&addr, sizeof addr) != 0) { |                    (char *)&addr, sizeof addr) != 0) { | ||||||
|         UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, |         DBGONLY(UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, | ||||||
|             "Couldn't set multicast interface.\n" ); |                             "Couldn't set multicast interface.\n" )); | ||||||
|         /* This is probably not a critical error, so let's continue. */ |         /* This is probably not a critical error, so let's continue. */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -966,9 +1029,10 @@ CLIENTONLY( | |||||||
|                 IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); |                 IP_MULTICAST_TTL, &ttl, sizeof( ttl ) ); | ||||||
|     if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, |     if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST, | ||||||
|                     ( char * )&option, sizeof( option ) ) != 0 ) { |                     ( char * )&option, sizeof( option ) ) != 0 ) { | ||||||
|         UpnpPrintf( UPNP_CRITICAL, |         DBGONLY( UpnpPrintf( UPNP_CRITICAL, | ||||||
|                              SSDP, __FILE__, __LINE__, |                              SSDP, __FILE__, __LINE__, | ||||||
|                              "Error in setting broadcast !!!\n" ); |                              "Error in setting broadcast !!!\n" ); | ||||||
|  |              ) | ||||||
|             shutdown( ssdpSock, SD_BOTH ); |             shutdown( ssdpSock, SD_BOTH ); | ||||||
|         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); |         CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) ); | ||||||
|         UpnpCloseSocket( ssdpSock ); |         UpnpCloseSocket( ssdpSock ); | ||||||
| @@ -976,10 +1040,10 @@ CLIENTONLY( | |||||||
|         return UPNP_E_NETWORK_ERROR; |         return UPNP_E_NETWORK_ERROR; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     CLIENTONLY( out->ssdpReqSock = ssdpReqSock; ); |     CLIENTONLY( out->ssdpReqSock = ssdpReqSock; | ||||||
|  |          ); | ||||||
|     out->ssdpSock = ssdpSock; |     out->ssdpSock = ssdpSock; | ||||||
|     return UPNP_E_SUCCESS; |     return UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif // EXCLUDE_SSDP | #endif // EXCLUDE_SSDP | ||||||
|  |  | ||||||
|   | |||||||
| @@ -32,7 +32,6 @@ | |||||||
| #include "config.h" | #include "config.h" | ||||||
| #include <assert.h> | #include <assert.h> | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  #include <sys/types.h> |  | ||||||
|  #include <sys/socket.h> |  #include <sys/socket.h> | ||||||
|  #include <netinet/in.h> |  #include <netinet/in.h> | ||||||
|  #include <arpa/inet.h> |  #include <arpa/inet.h> | ||||||
| @@ -63,7 +62,7 @@ | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE void | static XINLINE void | ||||||
| addrToString( IN const struct sockaddr_in *addr, | addrToString( IN const struct sockaddr_in *addr, | ||||||
|               OUT char ipaddr_port[] ) |               OUT char ipaddr_port[] ) | ||||||
| { | { | ||||||
| @@ -88,7 +87,7 @@ addrToString( IN const struct sockaddr_in *addr, | |||||||
| * | * | ||||||
| *	Note : 'newAlias' should be freed using free() | *	Note : 'newAlias' should be freed using free() | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| calc_alias( IN const char *alias, | calc_alias( IN const char *alias, | ||||||
|             IN const char *rootPath, |             IN const char *rootPath, | ||||||
|             OUT char **newAlias ) |             OUT char **newAlias ) | ||||||
| @@ -149,7 +148,7 @@ calc_alias( IN const char *alias, | |||||||
| * | * | ||||||
| *	Note : | *	Note : | ||||||
| ************************************************************************/ | ************************************************************************/ | ||||||
| static UPNP_INLINE int | static XINLINE int | ||||||
| calc_descURL( IN const char *ipPortStr, | calc_descURL( IN const char *ipPortStr, | ||||||
|               IN const char *alias, |               IN const char *alias, | ||||||
|               OUT char descURL[LINE_SIZE] ) |               OUT char descURL[LINE_SIZE] ) | ||||||
| @@ -169,8 +168,9 @@ calc_descURL( IN const char *ipPortStr, | |||||||
|     strcat( descURL, ipPortStr ); |     strcat( descURL, ipPortStr ); | ||||||
|     strcat( descURL, alias ); |     strcat( descURL, alias ); | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                          "desc url: %s\n", descURL ); |                          "desc url: %s\n", descURL ); | ||||||
|  |          ) | ||||||
|  |  | ||||||
|         return UPNP_E_SUCCESS; |         return UPNP_E_SUCCESS; | ||||||
| } | } | ||||||
| @@ -408,10 +408,12 @@ configure_urlbase( INOUT IXML_Document * doc, | |||||||
|         goto error_handler; |         goto error_handler; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |     DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                          "desc url: %s\n", docURL ); |                          "desc url: %s\n", docURL ); | ||||||
|     UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, |          ) | ||||||
|  |         DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, | ||||||
|                              "doc = %s\n", xml_str ); |                              "doc = %s\n", xml_str ); | ||||||
|  |          ) | ||||||
|         // store in web server |         // store in web server | ||||||
|         err_code = |         err_code = | ||||||
|         web_server_set_alias( new_alias, xml_str, strlen( xml_str ), |         web_server_set_alias( new_alias, xml_str, strlen( xml_str ), | ||||||
|   | |||||||
| @@ -50,11 +50,22 @@ | |||||||
| #define S43 15 | #define S43 15 | ||||||
| #define S44 21 | #define S44 21 | ||||||
|  |  | ||||||
| static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64])); | static void MD5Transform PROTO_LIST( ( UINT4[4], | ||||||
| static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int)); |                                        unsigned char[64] ) ); | ||||||
| static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int)); | static void Encode PROTO_LIST( ( unsigned char *, | ||||||
| static void MD5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int)); |                                  UINT4 *, | ||||||
| static void MD5_memset PROTO_LIST((POINTER, int, unsigned int)); |                                  unsigned int ) ); | ||||||
|  |  | ||||||
|  | static void Decode PROTO_LIST( ( UINT4 *, | ||||||
|  |                                  unsigned char *, | ||||||
|  |                                  unsigned int ) ); | ||||||
|  |  | ||||||
|  | static void MD5_memcpy PROTO_LIST( ( POINTER, | ||||||
|  |                                      POINTER, | ||||||
|  |                                      unsigned int ) ); | ||||||
|  | static void MD5_memset PROTO_LIST( ( POINTER, | ||||||
|  |                                      int, | ||||||
|  |                                      unsigned int ) ); | ||||||
|  |  | ||||||
| static unsigned char PADDING[64] = { | static unsigned char PADDING[64] = { | ||||||
|     0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |     0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||||||
| @@ -107,10 +118,14 @@ static unsigned char PADDING[64] = { | |||||||
|    MD5 initialization. Begins an MD5 operation, writing a new context.  |    MD5 initialization. Begins an MD5 operation, writing a new context.  | ||||||
|  */ |  */ | ||||||
| void | void | ||||||
| MD5Init(MD5_CTX * context) | MD5Init( context ) | ||||||
|  |      MD5_CTX *context;          /* context */ | ||||||
| { | { | ||||||
|     context->count[0] = context->count[1] = 0; |     context->count[0] = context->count[1] = 0; | ||||||
|     /* Load magic initialization constants. */ |  | ||||||
|  |     /* | ||||||
|  |        Load magic initialization constants. | ||||||
|  |      */ | ||||||
|     context->state[0] = 0x67452301; |     context->state[0] = 0x67452301; | ||||||
|     context->state[1] = 0xefcdab89; |     context->state[1] = 0xefcdab89; | ||||||
|     context->state[2] = 0x98badcfe; |     context->state[2] = 0x98badcfe; | ||||||
| @@ -124,72 +139,114 @@ MD5Init(MD5_CTX * context) | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| void | void | ||||||
| MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen) | MD5Update( context, | ||||||
|  |            input, | ||||||
|  |            inputLen ) | ||||||
|  |      MD5_CTX *context;          /* context */ | ||||||
|  |      unsigned char *input;      /* input block */ | ||||||
|  |      unsigned int inputLen;     /* length of input block */ | ||||||
| { | { | ||||||
| 	unsigned int i; |     unsigned int i, | ||||||
| 	unsigned int index; |       index, | ||||||
| 	unsigned int partLen; |       partLen; | ||||||
|  |  | ||||||
| 	/* Compute number of bytes mod 64 */ |     /* | ||||||
|  |        Compute number of bytes mod 64  | ||||||
|  |      */ | ||||||
|     index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3F ); |     index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3F ); | ||||||
|  |  | ||||||
| 	/* Update number of bits */ |     /* | ||||||
| 	if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) { |        Update number of bits  | ||||||
|  |      */ | ||||||
|  |     if( ( context->count[0] += | ||||||
|  |           ( ( UINT4 ) inputLen << 3 ) ) < ( ( UINT4 ) inputLen << 3 ) ) | ||||||
|         context->count[1]++; |         context->count[1]++; | ||||||
| 	} |  | ||||||
|     context->count[1] += ( ( UINT4 ) inputLen >> 29 ); |     context->count[1] += ( ( UINT4 ) inputLen >> 29 ); | ||||||
|  |  | ||||||
|     partLen = 64 - index; |     partLen = 64 - index; | ||||||
|  |  | ||||||
| 	/* Transform as many times as possible. */ |     /* | ||||||
|  |        Transform as many times as possible. | ||||||
|  |      */ | ||||||
|     if( inputLen >= partLen ) { |     if( inputLen >= partLen ) { | ||||||
| 		MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen); |  | ||||||
| 		MD5Transform(context->state, context->buffer); |  | ||||||
| 		for (i = partLen; i + 63 < inputLen; i += 64) { |  | ||||||
| 			MD5Transform(context->state, &input[i]); |  | ||||||
| 		} |  | ||||||
| 		index = 0; |  | ||||||
| 	} else { |  | ||||||
| 		i = 0; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Buffer remaining input */ |         MD5_memcpy | ||||||
| 	MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen - i); |             ( ( POINTER ) & context->buffer[index], ( POINTER ) input, | ||||||
|  |               partLen ); | ||||||
|  |         MD5Transform( context->state, context->buffer ); | ||||||
|  |  | ||||||
|  |         for( i = partLen; i + 63 < inputLen; i += 64 ) | ||||||
|  |             MD5Transform( context->state, &input[i] ); | ||||||
|  |  | ||||||
|  |         index = 0; | ||||||
|  |     } else | ||||||
|  |         i = 0; | ||||||
|  |  | ||||||
|  |     /* | ||||||
|  |        Buffer remaining input  | ||||||
|  |      */ | ||||||
|  |     MD5_memcpy | ||||||
|  |         ( ( POINTER ) & context->buffer[index], ( POINTER ) & input[i], | ||||||
|  |           inputLen - i ); | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    MD5 finalization. Ends an MD5 message-digest operation, writing the |    MD5 finalization. Ends an MD5 message-digest operation, writing the | ||||||
|    the message digest and zeroizing the context. |    the message digest and zeroizing the context. | ||||||
|  */ |  */ | ||||||
| void |  | ||||||
| MD5Final(unsigned char digest[16], MD5_CTX *context) |  | ||||||
| { |  | ||||||
|     unsigned char bits[8]; |  | ||||||
|     unsigned int index; |  | ||||||
|     unsigned int padLen; |  | ||||||
|  |  | ||||||
|     /* Save number of bits */ | void | ||||||
|  | MD5Final( digest, | ||||||
|  |           context ) | ||||||
|  |      unsigned char digest[16];  /* message digest */ | ||||||
|  |      MD5_CTX *context;          /* context */ | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     unsigned char bits[8]; | ||||||
|  |     unsigned int index, | ||||||
|  |       padLen; | ||||||
|  |  | ||||||
|  |     /* | ||||||
|  |        Save number of bits  | ||||||
|  |      */ | ||||||
|     Encode( bits, context->count, 8 ); |     Encode( bits, context->count, 8 ); | ||||||
|  |  | ||||||
|     /* Pad out to 56 mod 64. */ |     /* | ||||||
|  |        Pad out to 56 mod 64. | ||||||
|  |      */ | ||||||
|     index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3f ); |     index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3f ); | ||||||
|  |  | ||||||
|     padLen = ( index < 56 ) ? ( 56 - index ) : ( 120 - index ); |     padLen = ( index < 56 ) ? ( 56 - index ) : ( 120 - index ); | ||||||
|  |  | ||||||
|     MD5Update( context, PADDING, padLen ); |     MD5Update( context, PADDING, padLen ); | ||||||
|  |  | ||||||
|     /* Append length (before padding) */ |     /* | ||||||
|  |        Append length (before padding)  | ||||||
|  |      */ | ||||||
|     MD5Update( context, bits, 8 ); |     MD5Update( context, bits, 8 ); | ||||||
|  |  | ||||||
|     /* Store state in digest */ |     /* | ||||||
|  |        Store state in digest  | ||||||
|  |      */ | ||||||
|     Encode( digest, context->state, 16 ); |     Encode( digest, context->state, 16 ); | ||||||
|  |  | ||||||
|     /* Zeroize sensitive information. */ |     /* | ||||||
|  |        Zeroize sensitive information. | ||||||
|  |      */ | ||||||
|     MD5_memset( ( POINTER ) context, 0, sizeof( *context ) ); |     MD5_memset( ( POINTER ) context, 0, sizeof( *context ) ); | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    MD5 basic transformation. Transforms state based on block.  |    MD5 basic transformation. Transforms state based on block.  | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| MD5Transform(UINT4 state[4], unsigned char block[64]) | MD5Transform( state, | ||||||
|  |               block ) | ||||||
|  |      UINT4 state[4]; | ||||||
|  |      unsigned char block[64]; | ||||||
| { | { | ||||||
|     UINT4 a = state[0], |     UINT4 a = state[0], | ||||||
|       b = state[1], |       b = state[1], | ||||||
| @@ -296,16 +353,23 @@ MD5Transform(UINT4 state[4], unsigned char block[64]) | |||||||
|    a multiple of 4. |    a multiple of 4. | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| Encode(unsigned char *output, UINT4 *input, unsigned int len) | Encode( output, | ||||||
|  |         input, | ||||||
|  |         len ) | ||||||
|  |      unsigned char *output; | ||||||
|  |      UINT4 *input; | ||||||
|  |      unsigned int len; | ||||||
| { | { | ||||||
| 	unsigned int i; |     unsigned int i, | ||||||
| 	unsigned int j; |       j; | ||||||
| 	for (i = 0, j = 0; j < len; ++i, j += 4) { |  | ||||||
| 		output[j+0] = (unsigned char)((input[i] >>  0) & 0xff); |     for( i = 0, j = 0; j < len; i++, j += 4 ) { | ||||||
|  |         output[j] = ( unsigned char )( input[i] & 0xff ); | ||||||
|         output[j + 1] = ( unsigned char )( ( input[i] >> 8 ) & 0xff ); |         output[j + 1] = ( unsigned char )( ( input[i] >> 8 ) & 0xff ); | ||||||
|         output[j + 2] = ( unsigned char )( ( input[i] >> 16 ) & 0xff ); |         output[j + 2] = ( unsigned char )( ( input[i] >> 16 ) & 0xff ); | ||||||
|         output[j + 3] = ( unsigned char )( ( input[i] >> 24 ) & 0xff ); |         output[j + 3] = ( unsigned char )( ( input[i] >> 24 ) & 0xff ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -314,40 +378,55 @@ Encode(unsigned char *output, UINT4 *input, unsigned int len) | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| static void | static void | ||||||
| Decode(UINT4 *output, unsigned char *input, unsigned int len) | Decode( output, | ||||||
|  |         input, | ||||||
|  |         len ) | ||||||
|  |      UINT4 *output; | ||||||
|  |      unsigned char *input; | ||||||
|  |      unsigned int len; | ||||||
| { | { | ||||||
| 	unsigned int i; |     unsigned int i, | ||||||
| 	unsigned int j; |       j; | ||||||
| 	for (i = 0, j = 0; j < len; ++i, j += 4) { |  | ||||||
|  |     for( i = 0, j = 0; j < len; i++, j += 4 ) | ||||||
|         output[i] = |         output[i] = | ||||||
| 			(((UINT4)input[j+0]) <<  0) | |             ( ( UINT4 ) input[j] ) | ( ( ( UINT4 ) input[j + 1] ) << 8 ) | | ||||||
| 			(((UINT4)input[j+1]) <<  8) | |  | ||||||
|             ( ( ( UINT4 ) input[j + 2] ) << 16 ) | |             ( ( ( UINT4 ) input[j + 2] ) << 16 ) | | ||||||
|             ( ( ( UINT4 ) input[j + 3] ) << 24 ); |             ( ( ( UINT4 ) input[j + 3] ) << 24 ); | ||||||
| } | } | ||||||
| } |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    Note: Replace for loop with standard memcpy if possible. |    Note: Replace "for loop" with standard memcpy if possible. | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| MD5_memcpy(POINTER  output, POINTER  input, unsigned int len) | MD5_memcpy( output, | ||||||
|  |             input, | ||||||
|  |             len ) | ||||||
|  |      POINTER output; | ||||||
|  |      POINTER input; | ||||||
|  |      unsigned int len; | ||||||
| { | { | ||||||
|     unsigned int i; |     unsigned int i; | ||||||
| 	for (i = 0; i < len; ++i) { |  | ||||||
|  |     for( i = 0; i < len; i++ ) | ||||||
|         output[i] = input[i]; |         output[i] = input[i]; | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|    Note: Replace for loop with standard memset if possible. |    Note: Replace "for loop" with standard memset if possible. | ||||||
|  */ |  */ | ||||||
| static void | static void | ||||||
| MD5_memset(POINTER output, int value, unsigned int len) | MD5_memset( output, | ||||||
|  |             value, | ||||||
|  |             len ) | ||||||
|  |      POINTER output; | ||||||
|  |      int value; | ||||||
|  |      unsigned int len; | ||||||
| { | { | ||||||
|     unsigned int i; |     unsigned int i; | ||||||
| 	for (i = 0; i < len; ++i) { |  | ||||||
| 		((char *)output)[i] = (char)value; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |     for( i = 0; i < len; i++ ) | ||||||
|  |         ( ( char * )output )[i] = ( char )value; | ||||||
|  |  | ||||||
|  | } | ||||||
|   | |||||||
| @@ -43,6 +43,7 @@ get_ieee_node_identifier(uuid_node_t *node) | |||||||
|         get_random_info( seed ); |         get_random_info( seed ); | ||||||
|         seed[0] |= 0x80; |         seed[0] |= 0x80; | ||||||
|         memcpy( &saved_node, seed, sizeof( uuid_node_t ) ); |         memcpy( &saved_node, seed, sizeof( uuid_node_t ) ); | ||||||
|  |  | ||||||
|         inited = 1; |         inited = 1; | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -96,30 +97,34 @@ get_random_info(char seed[16]) | |||||||
|     } randomness; |     } randomness; | ||||||
|     randomness r; |     randomness r; | ||||||
|  |  | ||||||
| 	/* Initialize memory area so that valgrind does not complain */ |     MD5Init( &c ); | ||||||
| 	memset(&r, 0, sizeof r); |     /* | ||||||
|  |        memory usage stats  | ||||||
| 	/* memory usage stats */ |      */ | ||||||
|     GlobalMemoryStatus( &r.m ); |     GlobalMemoryStatus( &r.m ); | ||||||
| 	/* random system stats */ |     /* | ||||||
|  |        random system stats  | ||||||
|  |      */ | ||||||
|     GetSystemInfo( &r.s ); |     GetSystemInfo( &r.s ); | ||||||
| 	/* 100ns resolution (nominally) time of day */ |     /* | ||||||
|  |        100ns resolution (nominally) time of day  | ||||||
|  |      */ | ||||||
|     GetSystemTimeAsFileTime( &r.t ); |     GetSystemTimeAsFileTime( &r.t ); | ||||||
| 	/* high resolution performance counter */ |     /* | ||||||
|  |        high resolution performance counter  | ||||||
|  |      */ | ||||||
|     QueryPerformanceCounter( &r.pc ); |     QueryPerformanceCounter( &r.pc ); | ||||||
| 	/* milliseconds since last boot */ |     /* | ||||||
|  |        milliseconds since last boot  | ||||||
|  |      */ | ||||||
|     r.tc = GetTickCount(  ); |     r.tc = GetTickCount(  ); | ||||||
|     r.l = MAX_COMPUTERNAME_LENGTH + 1; |     r.l = MAX_COMPUTERNAME_LENGTH + 1; | ||||||
|  |  | ||||||
|     GetComputerName( r.hostname, &r.l ); |     GetComputerName( r.hostname, &r.l ); | ||||||
|  |     MD5Update( &c, &r, sizeof( randomness ) ); | ||||||
| 	/* MD5 it */ |  | ||||||
| 	MD5Init(&c); |  | ||||||
| 	MD5Update(&c, &r, sizeof r); |  | ||||||
|     MD5Final( seed, &c ); |     MD5Final( seed, &c ); | ||||||
| }; | }; | ||||||
|  | #else | ||||||
| #else /* _WINDOWS_ */ |  | ||||||
|  |  | ||||||
| /*-----------------------------------------------------------------------------*/ | /*-----------------------------------------------------------------------------*/ | ||||||
| void | void | ||||||
| @@ -150,18 +155,12 @@ get_random_info(char seed[16]) | |||||||
|     } randomness; |     } randomness; | ||||||
|     randomness r; |     randomness r; | ||||||
|  |  | ||||||
| 	/* Initialize memory area so that valgrind does not complain */ |     MD5Init( &c ); | ||||||
| 	memset(&r, 0, sizeof r); |  | ||||||
|  |  | ||||||
| 	/* Get some random stuff */ |  | ||||||
|     gettimeofday( &r.t, ( struct timezone * )0 ); |     gettimeofday( &r.t, ( struct timezone * )0 ); | ||||||
|     gethostname( r.hostname, 256 ); |     gethostname( r.hostname, 256 ); | ||||||
|  |     MD5Update( &c, &r, sizeof( randomness ) ); | ||||||
| 	/* MD5 it */ |  | ||||||
| 	MD5Init(&c); |  | ||||||
| 	MD5Update(&c, &r, sizeof r); |  | ||||||
|     MD5Final( seed, &c ); |     MD5Final( seed, &c ); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif /* _WINDOWS_ */ | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -55,8 +55,8 @@ static unsigned16 true_random( void ); | |||||||
| int | int | ||||||
| uuid_create( uuid_upnp * uid ) | uuid_create( uuid_upnp * uid ) | ||||||
| { | { | ||||||
|     uuid_time_t timestamp; |     uuid_time_t timestamp, | ||||||
|     uuid_time_t last_time; |       last_time; | ||||||
|     unsigned16 clockseq; |     unsigned16 clockseq; | ||||||
|     uuid_node_t node; |     uuid_node_t node; | ||||||
|     uuid_node_t last_node; |     uuid_node_t last_node; | ||||||
| @@ -86,11 +86,10 @@ uuid_create(uuid_upnp *uid) | |||||||
|        if no NV state, or if clock went backwards, or node ID changed |        if no NV state, or if clock went backwards, or node ID changed | ||||||
|        (e.g., net card swap) change clockseq  |        (e.g., net card swap) change clockseq  | ||||||
|      */ |      */ | ||||||
|     if (!f || memcmp(&node, &last_node, sizeof(uuid_node_t))) { |     if( !f || memcmp( &node, &last_node, sizeof( uuid_node_t ) ) ) | ||||||
|         clockseq = true_random(  ); |         clockseq = true_random(  ); | ||||||
|     } else if (timestamp < last_time) { |     else if( timestamp < last_time ) | ||||||
|         clockseq++; |         clockseq++; | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* |     /* | ||||||
|        stuff fields into the UUID  |        stuff fields into the UUID  | ||||||
| @@ -103,26 +102,24 @@ uuid_create(uuid_upnp *uid) | |||||||
|     write_state( clockseq, timestamp, node ); |     write_state( clockseq, timestamp, node ); | ||||||
|  |  | ||||||
|     UUIDUnlock(  ); |     UUIDUnlock(  ); | ||||||
|     return 1; |     return ( 1 ); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /*-----------------------------------------------------------------------------*/ | /*-----------------------------------------------------------------------------*/ | ||||||
| void | void | ||||||
| uuid_unpack(uuid_upnp *u, char *out) | uuid_unpack( uuid_upnp * u, | ||||||
|  |              char *out ) | ||||||
| { | { | ||||||
|  |  | ||||||
|     sprintf( out, |     sprintf( out, | ||||||
|              "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x", |              "%8.8x-%4.4x-%4.4x-%2.2x%2.2x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x", | ||||||
| 		(unsigned int)u->time_low, |              ( unsigned int )u->time_low, u->time_mid, | ||||||
| 		u->time_mid, |              u->time_hi_and_version, u->clock_seq_hi_and_reserved, | ||||||
| 		u->time_hi_and_version, |              u->clock_seq_low, u->node[0], u->node[1], u->node[2], | ||||||
| 		u->clock_seq_hi_and_reserved, |              u->node[3], u->node[4], u->node[5] ); | ||||||
| 		u->clock_seq_low, |  | ||||||
| 		u->node[0], |     *( out + 36 ) = '\0'; | ||||||
| 		u->node[1], |  | ||||||
| 		u->node[2], |  | ||||||
| 		u->node[3], |  | ||||||
| 		u->node[4], |  | ||||||
| 		u->node[5]); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /*-----------------------------------------------------------------------------*/ | /*-----------------------------------------------------------------------------*/ | ||||||
| @@ -142,7 +139,8 @@ format_uuid_v1( uuid_upnp * uid, | |||||||
|      */ |      */ | ||||||
|     uid->time_low = ( unsigned long )( timestamp & 0xFFFFFFFF ); |     uid->time_low = ( unsigned long )( timestamp & 0xFFFFFFFF ); | ||||||
|     uid->time_mid = ( unsigned short )( ( timestamp >> 32 ) & 0xFFFF ); |     uid->time_mid = ( unsigned short )( ( timestamp >> 32 ) & 0xFFFF ); | ||||||
|     uid->time_hi_and_version = (unsigned short)((timestamp >> 48) & 0x0FFF); |     uid->time_hi_and_version = ( unsigned short )( ( timestamp >> 48 ) & | ||||||
|  |                                                    0x0FFF ); | ||||||
|     uid->time_hi_and_version |= ( 1 << 12 ); |     uid->time_hi_and_version |= ( 1 << 12 ); | ||||||
|     uid->clock_seq_low = clock_seq & 0xFF; |     uid->clock_seq_low = clock_seq & 0xFF; | ||||||
|     uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8; |     uid->clock_seq_hi_and_reserved = ( clock_seq & 0x3F00 ) >> 8; | ||||||
| @@ -229,6 +227,7 @@ get_current_time( uuid_time_t * timestamp ) | |||||||
|     static int inited = 0; |     static int inited = 0; | ||||||
|  |  | ||||||
|     if( !inited ) { |     if( !inited ) { | ||||||
|  |         get_system_time( &time_now ); | ||||||
|         uuids_this_tick = UUIDS_PER_TICK; |         uuids_this_tick = UUIDS_PER_TICK; | ||||||
|         inited = 1; |         inited = 1; | ||||||
|     }; |     }; | ||||||
|   | |||||||
| @@ -105,7 +105,7 @@ main (int argc, char* argv[]) | |||||||
| 	 * Test library initialisation | 	 * Test library initialisation | ||||||
| 	 */ | 	 */ | ||||||
| 	printf ("\n"); | 	printf ("\n"); | ||||||
| 	printf ("Initializing UPnP ... \n"); | 	printf ("Intializing UPnP ... \n"); | ||||||
| 	rc = UpnpInit (NULL, 0); | 	rc = UpnpInit (NULL, 0); | ||||||
| 	if ( UPNP_E_SUCCESS == rc ) { | 	if ( UPNP_E_SUCCESS == rc ) { | ||||||
| 		const char* ip_address = UpnpGetServerIpAddress(); | 		const char* ip_address = UpnpGetServerIpAddress(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user