Compare commits

..

172 Commits

Author SHA1 Message Date
Marcelo Roberto Jimenez
46cc47b167 Created tag for the new release.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.6.1@238 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-08 02:22:05 +00:00
Marcelo Roberto Jimenez
13a1fff7a1 SF Bug Tracker [ 1825278 ] AdvertiseAndReply sleeps with handle lock out
Applied patch from Alex (afaucher) to change some write locks to read
locks.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@237 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-08 01:54:50 +00:00
Marcelo Roberto Jimenez
c9463545a8 Small fix for changelog.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@235 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-06 02:43:44 +00:00
Marcelo Roberto Jimenez
de1d7e81a3 Adjusting libtool library numbers to reflect the last changes.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@234 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-06 02:41:34 +00:00
Marcelo Roberto Jimenez
f87dbf8115 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.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@233 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-06 02:29:03 +00:00
Marcelo Roberto Jimenez
83ee32afb7 Added support for rwlocks.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@232 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-06 02:04:38 +00:00
Marcelo Roberto Jimenez
4f960c4e34 Small printf changes. Also reworked PrintThreadPoolStats() so that we can
remove a few #ifdef DEBUG from the main code.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@231 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-05 13:39:58 +00:00
Marcelo Roberto Jimenez
c85537df11 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@230 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-05 13:12:35 +00:00
Marcelo Roberto Jimenez
20905cb7a7 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@229 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-05 13:09:33 +00:00
Marcelo Roberto Jimenez
5b744169d5 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 );



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@228 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-05 13:07:54 +00:00
Marcelo Roberto Jimenez
c69e16b347 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@227 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-05 12:25:18 +00:00
Marcelo Roberto Jimenez
cb7e6b7472 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@226 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-11-05 12:06:52 +00:00
Marcelo Roberto Jimenez
fd80e5a8ff Slightly better debug messages and lots of white spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@225 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-10-26 13:21:59 +00:00
Marcelo Roberto Jimenez
b29de32110 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@224 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-09-01 17:05:07 +00:00
Marcelo Roberto Jimenez
6455ac6eea 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.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@223 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-09-01 16:58:58 +00:00
Marcelo Roberto Jimenez
f7bb1f9582 Fixed the path in the documentation for upnpdebug.h.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@222 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-31 13:12:40 +00:00
Marcelo Roberto Jimenez
0728ab3b25 Initialization of the "randomness" struct so that valgrind does not complain.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@221 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-28 14:37:41 +00:00
Marcelo Roberto Jimenez
cb9ee8254c White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@220 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-28 14:08:53 +00:00
Marcelo Roberto Jimenez
f08fdac9b6 ReqBuf was not initialized, so it should not be used.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@219 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-25 02:28:44 +00:00
Marcelo Roberto Jimenez
0db035cc7b Two unnecessary lines.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@218 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-25 01:22:27 +00:00
Marcelo Roberto Jimenez
da11e52924 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@217 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-25 01:20:21 +00:00
Marcelo Roberto Jimenez
bc7b0c9d4d Libtool stuff update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@216 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-06 05:18:25 +00:00
Marcelo Roberto Jimenez
b2757d9d55 Changelog fix.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@215 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-06 05:12:17 +00:00
Marcelo Roberto Jimenez
7967a0cd45 Merge of patch submitted By Keith Brindley - brindlk
SF Bug Tracker [ 1762758 ] Seek not working for large files.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@214 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-06 05:11:07 +00:00
Marcelo Roberto Jimenez
67b51187b9 Merge of Mac OS X patch from Stéphane Corthésy (davelopper),
SF Bug Tracker [ 1686420 ] Modifications for MacOSX.
Some of the proposed changes were already done by Rene Hexel's patch.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@213 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-08-06 02:07:41 +00:00
Marcelo Roberto Jimenez
491f5ffef6 Bumping library version.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@212 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-06-23 14:38:32 +00:00
Marcelo Roberto Jimenez
e4bcf18599 Fix for "make dist".
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@209 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-06-10 19:20:33 +00:00
Marcelo Roberto Jimenez
c856356414 Changelog of the last commit.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@208 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-06-10 03:54:47 +00:00
Marcelo Roberto Jimenez
6acffb7ede 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


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@207 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-06-10 03:54:30 +00:00
Marcelo Roberto Jimenez
837f31bacd Setting properties in tvcombo directory.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@206 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-06-09 13:48:06 +00:00
Marcelo Roberto Jimenez
5151d45203 * [pupnp-devel] NetBSD & Mac OS X packages and patches.
Rene Hexel's <rh@netbsd.org> patch to compile in NetBSD and Mac OS X.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@205 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-06-09 13:40:22 +00:00
Marcelo Roberto Jimenez
114389589d * 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.
* 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.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@204 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-26 15:44:52 +00:00
Marcelo Roberto Jimenez
b817ec5152 * 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.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@203 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-26 05:54:23 +00:00
Marcelo Roberto Jimenez
d9de9a486c * Added support for the Basic Device
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by Titus Winters.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@202 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-26 03:56:25 +00:00
Marcelo Roberto Jimenez
13ebb40e08 Fixed the file libupnp.pc.in to generate a correct path for the
include files.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@201 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-26 01:58:13 +00:00
Marcelo Roberto Jimenez
b614c81e94 Fixed some compiler warings about non void functions reaching the end without
return and some white spaces.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@200 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-25 15:20:19 +00:00
Marcelo Roberto Jimenez
53766465a9 White spaces.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@199 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-25 15:11:17 +00:00
Marcelo Roberto Jimenez
9bc187d4c6 * Removing the Dbg_Level, InitLog, SetLogFileNames and CloseLog
defines. These were just aliases, no reason to keep them.
* Changed the comments of the include files that expose the UPnP API
to use only C89 comments and no C99 comments.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@198 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-25 15:02:12 +00:00
Nektarios K. Papadopoulos
80517f26a6 * Add ChangLog entry for the tvcombo sample
* Fix a missing -I flag for tvcombo
* Chnage uuid of tvcombo device description to avoid conflicts with tvdevice
sample.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@197 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-24 11:20:01 +00:00
Nektarios K. Papadopoulos
468cb2a908 Create tvcombo sample dir to demonstrate coexistance of device and control
point in the same application. Copied and merged sources from tvdevice and 
tvctrlpt.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@196 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-24 10:32:40 +00:00
Nektarios K. Papadopoulos
d71db4c57c Add ChangeLog entry for the SF Tracker [ 1570020 ] fix.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@195 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-24 10:19:33 +00:00
Nektarios K. Papadopoulos
947dfd9a85 * 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.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@194 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-24 10:18:30 +00:00
Nektarios K. Papadopoulos
8f7fd0fc6d * 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.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@193 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-24 08:10:28 +00:00
Marcelo Roberto Jimenez
81635d74c1 * More MSVC fixes, using XINLINE instead of inline, MSVC has troubles
with inline. Thanks to David Maass for reporting.
* Changed XINLINE to UPNP_INLINE.
* Lots of white space changes.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@192 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-23 13:20:55 +00:00
Marcelo Roberto Jimenez
d8ba182d85 Adding msvc/inttypes.h to the tarball.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@191 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-23 11:37:11 +00:00
Marcelo Roberto Jimenez
0a41ee988b Moved msvc directory to be under the build directory.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@190 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-23 11:31:13 +00:00
Marcelo Roberto Jimenez
907eb0636a Added the file build/inc/msvc/inttypes.h. This file is for use with
MSVC only, because it does not provide C99 compatibility.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@189 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-21 22:18:28 +00:00
Marcelo Roberto Jimenez
80fc7c3bb0 Some code cleanup.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@188 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-19 02:56:25 +00:00
Marcelo Roberto Jimenez
83fb96fbe2 Removed all uses of the DEVICEONLY(x) macro.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@187 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-19 02:10:02 +00:00
Marcelo Roberto Jimenez
4e1240a0a8 Removing some debug macros missed in the previous commit.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@186 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-18 13:43:09 +00:00
Marcelo Roberto Jimenez
2c1dba2942 - Fixed a bug in UpnpPrintf, function could call va_start() and return
befor calling va_end().

- 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.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@185 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-18 13:31:21 +00:00
Marcelo Roberto Jimenez
4ceb6c67d1 * EXPORT_SPEC missing on some declarations in ixml/inc/ixml.h.
Thanks to David Maass.

* sizeof is unsigned, so %zu is more adequate than %zd.

* Using an invented printf directive PRIzu that on MSVC
expands to "lu", and on normal C99 compilers expands to "zu".

* Rewrote raw_find_str. Now it no longer uses strcasestr(), but it
transforms the first input buffer into lowercase.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@184 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-16 02:02:16 +00:00
Marcelo Roberto Jimenez
3fa207984a 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.

Also changed svnignore in the process.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@183 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-11 05:00:43 +00:00
Marcelo Roberto Jimenez
b82c9c6009 Added inttypes.h as a header requirement in configure.ac.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@182 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-08 23:45:21 +00:00
Marcelo Roberto Jimenez
b1f6e83380 Fix for debug printf format strings. size_t are not expected.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@181 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-08 23:20:48 +00:00
Marcelo Roberto Jimenez
00a33f5788 Created an svnignore file and used it. Notice that it is not the presence of
this file that changes anything like in cvs. To recursively change the
properties of all directories, you must alter the file and explicitly do:

$ svn propset svn:ignore -F svnignore -R .



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@180 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-04 14:32:51 +00:00
Marcelo Roberto Jimenez
dfec187e88 Trying to start to add Doxygen support.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@179 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-05-04 14:29:35 +00:00
Marcelo Roberto Jimenez
dee3e96a63 Bumping library version.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@177 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-30 14:43:26 +00:00
Marcelo Roberto Jimenez
23e8160417 Changelog of last modification.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@172 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-30 12:41:45 +00:00
Marcelo Roberto Jimenez
99e11d4fd5 Fix for FreeBSD host_os.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@171 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-30 01:09:21 +00:00
Marcelo Roberto Jimenez
fb4e7f659d Bumping library version.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@170 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-28 19:41:42 +00:00
Marcelo Roberto Jimenez
28799f26c9 [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.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@166 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-28 18:42:14 +00:00
Marcelo Roberto Jimenez
c1e5e4d6a4 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.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@165 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-28 17:45:34 +00:00
Marcelo Roberto Jimenez
c0d9908afe Undoing the fix for the fix.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@164 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-27 11:42:26 +00:00
Marcelo Roberto Jimenez
e80cc3ac64 - Fix for Nek's last fix :) Do not enter the loop if NumArgs is zero.
It would loop forever.
- Also strcasestr() is a gnu extension, we need the proper define so that
the prototype is accessable.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@163 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-26 11:40:34 +00:00
Marcelo Roberto Jimenez
e04192e1d0 Removing extra semicolon and Changelog.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@162 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-26 11:14:27 +00:00
Nektarios K. Papadopoulos
bbe85ef599 Fix a bug in makeAction
* upnp/src/api/upnptools.c: Avoid extra call to va_arg after consuming all
      arguments.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@161 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-26 10:05:22 +00:00
Marcelo Roberto Jimenez
5c0893928c Bumping library version for next release.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@159 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-19 13:07:18 +00:00
Marcelo Roberto Jimenez
948c959be5 Case insensitive comparison in raw_find_str() (httpparser.c) as
suggested by Craig Nelson in SF Tracker [ 1689382 ] DLINK DIR-625 patch.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@158 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-19 13:05:33 +00:00
Marcelo Roberto Jimenez
f8c4d81ee5 Version update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@155 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-17 04:00:30 +00:00
Marcelo Roberto Jimenez
286a45d4ad * 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.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@154 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-17 03:55:20 +00:00
Marcelo Roberto Jimenez
59e0e015be SF Tracker [ 1695399 ] Typo in util.h
Submitted By: Luke Kim - nereusuj
Unix sleep is in seconds but WIN32 Sleep is in milliseconds.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@153 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-04-06 11:22:49 +00:00
Marcelo Roberto Jimenez
bdda54a66b Fix for 64 bit machines.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@152 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-13 17:46:26 +00:00
Marcelo Roberto Jimenez
41cb45146c 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.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@151 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-13 03:27:10 +00:00
Marcelo Roberto Jimenez
2c2a5f7c18 Version number.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@147 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-06 10:30:31 +00:00
Oxy
047b9534bb git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@143 119443c7-1b9e-41f8-b6fc-b9c35fce742c 2007-03-05 13:19:05 +00:00
Marcelo Roberto Jimenez
88076a3c4b Fixed nasty segmentation fault bug on membuffer.c.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@142 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-03 15:01:59 +00:00
Oxy
c3060e0d0b typedef modifications for use with Borland Builder
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@141 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-03 14:36:58 +00:00
Oxy
2ac3819f8c typedefs corrected, made MS VC++ specific to fix problems of that compiler
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@140 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-02 13:53:08 +00:00
Oxy
0d451c9c8e (long long) cast replaced by a generic data type ulong64 that can be defined separately for every used system/compiler (did not work with VC++)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@139 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-03-01 10:08:04 +00:00
Marcelo Roberto Jimenez
bbd16d75ed Not a comment.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@138 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-17 02:18:43 +00:00
Marcelo Roberto Jimenez
a225d3b54e White spaces, reformating.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@132 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-13 13:33:15 +00:00
Marcelo Roberto Jimenez
08834bf0f0 32/64 bits portability issues on *printf.
Use %zd for size_t, and cast to (long long) for off_t.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@129 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-09 19:54:22 +00:00
Oxy
e31fcce11d modified to compile and work under Windows
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@128 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-05 17:31:38 +00:00
Marcelo Roberto Jimenez
dce8f71256 Eric Tanguy's update of spec file.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@126 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-03 17:54:34 +00:00
Marcelo Roberto Jimenez
7a359f29e3 Changes docdir default value. Autoconf's default values does not include
the package version.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@125 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-03 13:52:42 +00:00
Marcelo Roberto Jimenez
ed9a594e73 Use dist-bzip2 to create a .bz2 distribution file.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@124 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-02 04:21:21 +00:00
Marcelo Roberto Jimenez
039b5fdae6 Fixed ChangeLog version.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@123 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-02 04:05:01 +00:00
Marcelo Roberto Jimenez
f07bcb749f * Bumped the program version to 1.4.2 in config.ac.
* Now requires autoconf 2.60.
* Fixed docdir use.
* Does not install the documentation by default.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@122 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-02-02 03:44:55 +00:00
Marcelo Roberto Jimenez
f64c539395 SF Tracker [ 1634922 ] Support for large files (>= 2 GiB), part 2
Submitted By: Jonathan - no_dice
Summary: This patch hopefully fixes the remaining types and related
code to enable files >= 2 GiB to be streamed. Jonathan claims to have
tested this with a patched version of ushare-0.9.8 and a D-Link DSM-520.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@121 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-23 13:22:52 +00:00
Marcelo Roberto Jimenez
cab8e4f799 SF Tracker [ 1628590 ] XML parsing segfault patch
Submitted By: 
Fredrik Svensson - svefredrik

This patch fixes a segmentation fault problem that occurrs when parsing
XML code than some routers produce.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@120 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-09 12:42:41 +00:00
Marcelo Roberto Jimenez
2331839f69 SF Tracker [ 1628629 ] Multicast interface patch
Submitted By: 
Fredrik Svensson - svefredrik

This patch fixes two problems:
* Specify the IP address for the interface when we do setsockopt IP_ADD_MEMBERSHIP. This makes it possible to run when no default router has been configured.
* Explicitly set the multicast interface through setsockopt IP_MULTICAST_IF. Avoids socket error -207 in some cases.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@119 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-09 12:31:17 +00:00
Marcelo Roberto Jimenez
363ac6e007 SF Tracker [ 1628552 ] XML white space patch
Submitted By: 
Fredrik Svensson - svefredrik

Part 2.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@118 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-09 01:18:28 +00:00
Marcelo Roberto Jimenez
5c4e45fb4d SF Tracker [ 1628636 ] SSDP packet copy patch
Submitted By: 
Fredrik Svensson - svefredrik
Summary:
Changed NUM_COPY to 1 since, according to section 9.2 of the HTTPU/MU spec,
we should never send more than one copy of a reply to an SSDP request.

Ref: section 9.2 of http://www.upnp.org/download/draft-goland-http-udp-04.txt



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@117 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-06 20:46:55 +00:00
Marcelo Roberto Jimenez
436bc8fc6d SF Tracker [ 1628575 ] Linksys WRT54G patch
Submitted By: 
Fredrik Svensson - svefredrik



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@116 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-06 19:35:23 +00:00
Marcelo Roberto Jimenez
c6d3d63223 SF Tracker [ 1628562 ] Maximum total jobs patch
Submitted By: 
Fredrik Svensson - svefredrik

Incremented the libray versions and included some comments in the file
configure.ac so that we do not bump the library version excessively,
only the necessary numbers on the next release.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@115 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-06 19:16:12 +00:00
Marcelo Roberto Jimenez
ae7ca6a2cf SF Tracker [ 1628552 ] XML white space patch
Submitted By: 
Fredrik Svensson - svefredrik

A few modifications to the patch were made:
1) Do not introduce new CRLF's where there were none.
2) Applied the same original idea to two other palces in soap_ctrlpt.c.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@114 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2007-01-06 14:18:18 +00:00
Marcelo Roberto Jimenez
9595ddcf3a Changelog update and webpage update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@111 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 23:32:05 +00:00
Marcelo Roberto Jimenez
fd19d54144 Finished const-ifications as suggested by Erik Johansson in
SF Patch tracker [ 1587272 ].


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@109 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 22:43:32 +00:00
Marcelo Roberto Jimenez
17db87ab96 Changelog update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@107 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:37:08 +00:00
Marcelo Roberto Jimenez
3b12ced1f8 SF Patch tracker [ 1587272 ] const-ified ixml
Submitted By: Erik Johansson



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@105 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:30:32 +00:00
Marcelo Roberto Jimenez
4abbd5a8a4 SF Patch tracker [ 1581161 ] VStudio2005 patch
Submitted By:
David Maass - darkservant


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@103 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 21:05:50 +00:00
Marcelo Roberto Jimenez
836069f43b Changelog update.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@101 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 20:37:46 +00:00
Marcelo Roberto Jimenez
353a876a54 SF Bug Tracker [ 1590466 ] Invalid xml output
Submitted By:
Erik Johansson - erijo


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@99 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 20:04:20 +00:00
Marcelo Roberto Jimenez
2bc6a1f8dd SF Bug tracker [ 1590469 ]
Typo in ixmlparser.c
Submitted By:
Erik Johansson - erijo


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@97 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 19:54:01 +00:00
Marcelo Roberto Jimenez
1d9e8712b7 Thorough revision of every call of http_MakeMessage() due to a bug introduced
in rev.79: largefile patch added.

http_MakeMessage() has a worst than brain damaged "printf" like interface.
In rev.79, the "N" format parameter must be an off_t. Every call of this
function with an "N" format parameter and an int passed on the stack 
would fail terribly.

Not every place I touched had a bug, but to review the format and keep my
sanity, I had to format it properly.



git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@96 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-12-23 18:38:00 +00:00
Nektarios K. Papadopoulos
819ad1f365 [bug-id] 1580440
[submitted-by] Erik Johansson - erijo
[patched-by] Erik Johansson - erijo

The SOAP HTTP message that's generated on upnp errors
is missing a \r\n\ between header and body.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@95 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-10-19 12:42:17 +00:00
Nektarios K. Papadopoulos
e9e8ea5636 Revert commenting out definition of STATS. Otherwise compilation with debug is broken.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@90 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-10-09 13:42:09 +00:00
Nektarios K. Papadopoulos
14f72e1442 Always retrieve the actual port used by the library. Even if specified the value might be
invalid (e.g. < 49152)  or unavailable.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@88 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-10-03 10:26:31 +00:00
Oxy
ae13c481a7 git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@87 119443c7-1b9e-41f8-b6fc-b9c35fce742c 2006-09-28 17:20:22 +00:00
Nektarios K. Papadopoulos
38a91fdaec Applied patch from issue 12, reported by vinvin.
Two calls to http_MakeMessage were broken from large
file support introduced in r79


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@86 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-09-21 07:57:35 +00:00
Oxy
87f336c940 Leuk_he added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@85 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-22 06:07:22 +00:00
Oxy
74d2b0049b Windows-specific code for error threating added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@84 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-21 05:03:28 +00:00
Oxy
635d6ffa93 largefile modification adapted for Windows port
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@83 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-17 05:31:55 +00:00
Oxy
8c56f16607 largefile patch added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@82 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-17 05:19:03 +00:00
Oxy
5d3ef166c1 largefile patch added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@81 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-17 05:18:45 +00:00
Oxy
a4072c19b1 largefile patch added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@80 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-17 05:18:28 +00:00
Oxy
1716c7a10d largefile patch added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@79 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-17 05:17:50 +00:00
Oxy
83782e8ae2 largefile patch added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@78 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-17 05:16:50 +00:00
Oxy
f1cc7db79d largefile patch added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@77 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-17 05:16:23 +00:00
Oxy
e69d5a8609 workaround for Linux-applications that do not catch SIGPIPE backported
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@76 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-07 05:49:19 +00:00
Oxy
16637892e3 workaround added for applications that don't catch SIGEPIPE
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@75 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-04 05:46:06 +00:00
Oxy
d19a57c866 problem with datatype on x86_64 platform fixed
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@74 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-03 19:51:59 +00:00
Oxy
8c21b2c4d9 Windows-port: some special code and switches for statical libraries added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@73 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-31 05:32:33 +00:00
Nektarios K. Papadopoulos
736efca5dd Fix issue reported by Siva Chandran P
strlen returns size_t which is long or int depending on the platform. 
We use %ld in printf and cast the return value to long.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@71 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-26 13:48:36 +00:00
Nektarios K. Papadopoulos
d5449dc948 Fix issues reported by Siva Chandran P
Replace function wide STSONLY macros with ifdef STATS.
Remove %lf format modifiers


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@70 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-26 13:43:23 +00:00
Nektarios K. Papadopoulos
7c49b3b8a4 Fix bug ID 0000006 reported by leuk_he
Remove check for NumArg > 0. Always call va_start, va_end.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@69 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-26 13:37:40 +00:00
Nektarios K. Papadopoulos
5c03ebe6e1 Fixed missing comma, spotted by darkservant.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@68 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-25 10:58:53 +00:00
Nektarios K. Papadopoulos
d17eb5fcfc Fix bug ID 0000004 reported by darkservant.
Missing X_USER_AGENT parameter for "Xc" fmt (i.e. HTTP X-User-Agent header).


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@67 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-25 06:26:15 +00:00
Oxy
8625298899 building instructions for solaris added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@64 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 06:07:53 +00:00
Oxy
864d3db0ad credits added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@63 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 06:02:13 +00:00
Nektarios K. Papadopoulos
1d4d1ff87e Add minimum building instruction for Win32 platform.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@62 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 04:53:29 +00:00
Nektarios K. Papadopoulos
a26769b27b Win32 build:
Changed absolute paths to relative.
pthreads-w32 Pre-built.2 directory contents are expected under pthreads.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@61 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 04:52:39 +00:00
Marcelo Roberto Jimenez
fbbec55457 Fixing Makefile.am to add missing files for windows build.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@58 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 02:43:21 +00:00
Oxy
8245b0d808 email addresses modified to hide them from spambots (in SVNWeb)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@57 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-18 06:39:45 +00:00
Marcelo Roberto Jimenez
815d08420a npapadop's patch for including pdf docs in the devel package instead of the non-devel.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@54 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-11 00:51:53 +00:00
Oxy
1d0ce01f31 check for malloc.h removed - not possible for FreeBSD and not really needed for Linux
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@52 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-09 16:52:20 +00:00
Marcelo Roberto Jimenez
947896bcee - Added a spec file to the tar ball, thanks to Eric Tanguy.
Generating an rpm now is as easy as:
$ rpmbuild -ta libupnp-1.4.1.tar.gz

- Added Eric's name to the THANKS file and sorted it in
ascending first name order.


git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@50 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-08 13:16:18 +00:00
Oxy
7ed934d858 contributor list updated
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@48 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-07 07:16:58 +00:00
Oxy
4a7708331c changes for compilation with MS VC++
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@47 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-07 07:01:43 +00:00
Oxy
ab66940a89 changes for compilation with MS VC++
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@46 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-07 06:58:19 +00:00
Nektarios K. Papadopoulos
ebac5fe596 Include prebuilt documentation (html,pdf), dropping doc++ dependancy.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@45 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-06 12:37:29 +00:00
Oxy
11de68d0e3 git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@44 119443c7-1b9e-41f8-b6fc-b9c35fce742c 2006-07-05 16:31:02 +00:00
Oxy
dfe3071af4 git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@43 119443c7-1b9e-41f8-b6fc-b9c35fce742c 2006-07-05 16:29:17 +00:00
Oxy
cd50cb678f define removed
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@42 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-05 16:18:26 +00:00
Marcelo Roberto Jimenez
f13fd3d522 Preparing configure.ac for next release.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@41 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-05 02:56:34 +00:00
Oxy
927b86545f some minor modificationsto compile with Borland Builder
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@40 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 18:10:52 +00:00
Oxy
a155612cba some minor modificationsto compile with Borland Builder
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@39 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 18:10:02 +00:00
Oxy
df3df9eaed some minor modificationsto compile with Borland Builder
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@38 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 18:09:36 +00:00
Oxy
eefeb86a96 some minor modificationsto compile with Borland Builder
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@37 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 16:44:42 +00:00
Oxy
0452011b99 Bornalnd C++ Builder 5 project files
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@36 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 16:36:20 +00:00
Marcelo Roberto Jimenez
a20707485d Creation of docs directory under trunk.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@35 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 12:30:51 +00:00
Nektarios K. Papadopoulos
ec86a6f92b Fix wrong function name in documentation comment block for UpnpSearchAsync.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@33 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 09:03:21 +00:00
Marcelo Roberto Jimenez
89e7a40fcc Removing unnecessary additional directory level.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@29 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-04 02:44:17 +00:00
Marcelo Roberto Jimenez
90c3db2a96 Patch for FreeBSD, thanks to Markus Strobl.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@28 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-03 14:02:29 +00:00
Marcelo Roberto Jimenez
cf9ae4f6e5 npapadop's patch to fix duplicated lines.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@27 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-30 12:52:33 +00:00
Marcelo Roberto Jimenez
f28f81f820 Fix for missing else in httpreadwrite.c.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@26 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-27 21:40:30 +00:00
Marcelo Roberto Jimenez
bcaba51f57 Changelog.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@25 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-27 10:41:03 +00:00
Marcelo Roberto Jimenez
4c5b61dc55 Fix for va_list compilation in x86_64.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@24 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-26 14:27:53 +00:00
Oxy
9147c3517e modified to compile under Windows with WIN32 switch and to export DLL-symbols
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@23 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-13 12:56:37 +00:00
Oxy
cbefc2ff49 type identifier changed for GCC
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@22 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-13 12:38:29 +00:00
Oxy
863e743c41 modified to compile under Windows with WIN32 switch and to export DLL-symbols
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@21 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-13 12:34:29 +00:00
Oxy
26bde09028 files required for Windows variant only
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@20 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-13 12:34:04 +00:00
Oxy
bc2941c2a7 modified to compile under Windows with WIN32 switch
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@19 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-13 10:07:07 +00:00
Oxy
40186d3e9c files required for Windows variant only
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@18 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-13 10:06:35 +00:00
Oxy
01d26f8f74 files required for Windows variant
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@17 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-13 10:04:24 +00:00
Oxy
b2cb458ee3 empty doc replaced
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@16 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-12 06:48:32 +00:00
Oxy
16da6980d1 several memory leaks and potential reasons for a crash removed (thanks to loigu)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@15 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-08 07:03:30 +00:00
Oxy
211973749c several memory leaks and potential reasons for a crash removed (thanks to loigu)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@14 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-08 07:00:39 +00:00
Oxy
a22ba2f159 several memory leaks and potential reasons for a crash removed (thanks to loigu)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@13 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-08 06:57:46 +00:00
Oxy
142929623d several memory leaks and potential reasons for a crash removed (thanks to loigu)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@12 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-08 06:41:00 +00:00
Marcelo Roberto Jimenez
3170fbd730 Make bootstrap executable.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/trunk@6 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-06-06 16:36:09 +00:00
99 changed files with 13457 additions and 5670 deletions

436
ChangeLog
View File

@@ -1,8 +1,427 @@
*******************************************************************************
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
*******************************************************************************
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>
* Code adapted and typedefs added to compile cleanly under Windows
with Borland C++ Builder and MS Visual C++
2007-03-03 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Fixed nasty segmentation fault bug on membuffer.c.
*******************************************************************************
Version 1.4.2
*******************************************************************************
2007-02-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* 32/64 bits portability issues on *printf.
Use %zd for size_t, and cast to (long long) for off_t.
2007-02-02 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Bumped the program version to 1.4.2 in config.ac.
* Now requires autoconf 2.60.
* Fixed docdir use.
* Does not install the documentation by default.
* Use dist-bzip2 to create a .bz2 distribution file.
2007-01-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1634922 ] Support for large files (>= 2 GiB), part 2
Submitted By: Jonathan - no_dice
Summary: This patch hopefully fixes the remaining types and related
code to enable files >= 2 GiB to be streamed. Jonathan claims to have
tested this with a patched version of ushare-0.9.8 and a D-Link DSM-520.
2007-01-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1628629 ] Multicast interface patch
Submitted By: Fredrik Svensson - svefredrik
This patch fixes two problems:
1) Specify the IP address for the interface when we do
setsockopt IP_ADD_MEMBERSHIP. This makes it possible to run
when no default router has been configured.
2) Explicitly set the multicast interface through setsockopt
IP_MULTICAST_IF. Avoids socket error -207 in some cases.
* SF Tracker [ 1628590 ] XML parsing segfault patch
Submitted By: Fredrik Svensson - svefredrik
This patch fixes a segmentation fault problem that occurrs
when parsing XML code than some routers produce.
2007-01-06 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* SF Tracker [ 1628552 ] XML white space patch
Submitted By: Fredrik Svensson - svefredrik
* SF Tracker [ 1628562 ] Maximum total jobs patch
Submitted By: Fredrik Svensson - svefredrik
Also, I incremented the libray versions and included some
comments in the file configure.ac so that we do not bump
the library version excessively, only the necessary numbers
on the next release.
* SF Tracker [ 1628575 ] Linksys WRT54G patch
Submitted By: Fredrik Svensson - svefredrik
* SF Tracker [ 1628636 ] SSDP packet copy patch
Submitted By: Fredrik Svensson - svefredrik
Changed NUM_COPY to 1 since, according to section 9.2 of the
HTTPU/MU spec, we should never send more than one copy of a
reply to an SSDP request. Ref. section 9.2 of
http://www.upnp.org/download/draft-goland-http-udp-04.txt
2006-12-23 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
* Thorough revision of every call of http_MakeMessage() due to a
bug introduced in rev.79 "largefile patch added".
http_MakeMessage() has a worst than brain damaged "printf" like
interface. In rev.79, the "N" format parameter must be an off_t.
Every call of this function with an "N" format parameter and an
int passed on the stack would fail terribly.
* SF Bug tracker [ 1590469 ]
Typo in ixmlparser.c
Submitted By: Erik Johansson - erijo
* SF Bug Tracker [ 1590466 ] Invalid xml output
Submitted By: Erik Johansson - erijo
* SF Patch tracker [ 1581161 ] VStudio2005 patch
Submitted By: David Maass - darkservant
* SF Patch tracker [ 1587272 ] const-ified ixml
Submitted By: Erik Johansson
* Finished const-ifications as suggested by Erik Johansson in
SF Patch tracker [ 1587272 ].
2006-07-05 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com>
* [bug-id] 1580440
[submitted-by] Erik Johansson - erijo
[patched-by] Erik Johansson - erijo
The SOAP HTTP message that's generated on upnp errors
is missing a \r\n\ between header and body.
2006-07-07 Oxy <virtual_worlds(at)gmx.de>
* support for large files (>2 GBytes) added
*******************************************************************************
Version 1.4.1
*******************************************************************************
2006-07-07 Oxy <virtual_worlds(at)gmx.de> 2006-07-07 Oxy <virtual_worlds(at)gmx.de>
* full support for Windows added, static library and DLL are fully * full support for Windows added, static library and DLL are fully
working, code compiles with Borland Builder C++ and MS Visual working, code compiles with Borland Builder C++ and MS Visual
C/C++ C/C++
2006-07-05 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com> 2006-07-05 Nektarios K. Papadopoulos <npapadop(at)inaccessnetworks.com>
@@ -27,9 +446,9 @@
* 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)
************************************************************************* *******************************************************************************
Release of 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>
@@ -46,15 +465,18 @@ Release of version 1.4.0
2006-05-18 Oxy <virtual_worlds(at)gmx.de> 2006-05-18 Oxy <virtual_worlds(at)gmx.de>
* DSM-320 patch added (fetched from project MediaTomb) * DSM-320 patch added (fetched from project MediaTomb)
* httpGet additons atch added, Added proxy support by introducing * httpGet additons atch added, Added proxy support by introducing
UpnpOpenHttpGetProxy. UpnpOpenHttpGet now just calls UpnpOpenHttpGetProxy. UpnpOpenHttpGet now just calls
UpnpOpenHttpGetProxy with the proxy url set to NULL. UpnpOpenHttpGetProxy with the proxy url set to NULL.
* Bugfix for typo ("\0" / "0") in ixmlparser.c * Bugfix for typo ("\0" / "0") in ixmlparser.c
* 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>

1257
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,44 +1,48 @@
# $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
# #
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net> # Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
# #
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-samples DISTCHECK_CONFIGURE_FLAGS = --enable-debug --enable-samples
SUBDIRS = ixml threadutil upnp docs/dist SUBDIRS = \
ixml \
threadutil \
upnp \
docs/dist
EXTRA_DIST = libupnp.pc.in LICENSE THANKS libupnp.spec \ EXTRA_DIST = \
build/libupnp.bpf \ libupnp.pc.in \
build/libupnp.bpr \ LICENSE \
build/libupnp.dsp \ THANKS \
build/libupnp.dsw \ libupnp.spec \
build/inc/autoconfig.h \ build/libupnp.bpf \
build/inc/config.h \ build/libupnp.bpr \
build/inc/upnpconfig.h build/libupnp.dsp \
build/libupnp.dsw \
build/inc/autoconfig.h \
build/inc/config.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
# by 'install-exec' target (instead of default 'install-data') # by 'install-exec' target (instead of default 'install-data')
pkgconfigexecdir = $(libdir)/pkgconfig pkgconfigexecdir = $(libdir)/pkgconfig
pkgconfigexec_DATA = libupnp.pc pkgconfigexec_DATA = libupnp.pc
$(pkgconfigexec_DATA): config.status $(pkgconfigexec_DATA): config.status
if WITH_DOCDIR if WITH_DOCUMENTATION
docdir = @DOCDIR@ doc_DATA = LICENSE README NEWS TODO THANKS
doc_DATA = LICENSE README NEWS TODO THANKS
endif endif
CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt

30
THANKS
View File

@@ -6,18 +6,34 @@ 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.
- Erwan Velu - Alex (afaucher)
- Paul Vixie
- Arno Willig - Arno Willig
- Eric Tanguy - Bob Ciora
- Oskar Liljeblad
- Chaos - Chaos
- John Dennis - Craig Nelson
- David Maass
- Emil Ljungdahl
- Erik Johansson
- Eric Tanguy
- Erwan Velu
- Fredrik Svensson
- Glen Masgai
- Jiri Zouhar - Jiri Zouhar
- John Dennis
- Jonathan (no_dice)
- Keith Brindley
- Leuk_He
- Loigu - Loigu
- Marcelo Jimenez - Luke Kim
- Marcelo Roberto Jimenez (mroberto)
- Markus Strobl - Markus Strobl
- Nektarios K. Papadopoulos - Nektarios K. Papadopoulos
- Oxy - Oskar Liljeblad
- Michael (Oxy)
- Paul Vixie
- Rene Hexel
- Siva Chandran - Siva Chandran
- Stéphane Corthésy
- Timothy Redaelli
- Titus Winters

View File

@@ -13,7 +13,3 @@ 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

View File

@@ -1,4 +1,4 @@
/* autoconfig.h. Generated by configure. */ /* autoconfig.h. Generated from autoconfig.h.in 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,15 +19,18 @@
/* 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
@@ -92,19 +95,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 "virtual_worlds@gmx.de" #define PACKAGE_BUGREPORT "mroberto@users.sourceforge.net"
/* 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.0" #define PACKAGE_STRING "libupnp 1.4.7"
/* 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.0" #define PACKAGE_VERSION "1.4.7"
/* 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. */
@@ -135,27 +138,30 @@
#define UPNP_VERSION_MINOR 4 #define UPNP_VERSION_MINOR 4
/* see upnpconfig.h */ /* see upnpconfig.h */
#define UPNP_VERSION_PATCH 0 #define UPNP_VERSION_PATCH 7
/* see upnpconfig.h */ /* see upnpconfig.h */
#define UPNP_VERSION_STRING "1.4.0" #define UPNP_VERSION_STRING "1.4.7"
/* Version number of package */ /* Version number of package */
#define VERSION "1.4.0" #define VERSION "1.4.7"
/* Number of bits in a file offset, on hosts where this is settable. */ /* File Offset size */
#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 */
/* Define for large files, on AIX-style hosts. */ /* Large files support */
/* #undef _LARGE_FILES */ #define _LARGE_FILE_SOURCE
/* Define to empty if `const' does not conform to ANSI C. */ /* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */ /* #undef const */
/* Define to `unsigned' if <sys/types.h> does not define. */ /* Define to `long int' 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 */

View File

@@ -95,6 +95,17 @@
#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
@@ -250,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/upnpdebug.h> see <upnp/inc/upnpdebug.h>
*/ */
#define DEBUG_ALL 1 #define DEBUG_ALL 1
@@ -293,68 +304,40 @@
/** @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
#define EXCLUDE_WEB_SERVER 0 # define EXCLUDE_WEB_SERVER 0
#define EXCLUDE_MINISERVER 0 # define EXCLUDE_MINISERVER 0
#else #else
#define EXCLUDE_WEB_SERVER 1 # define EXCLUDE_WEB_SERVER 1
#define EXCLUDE_MINISERVER 1 # define EXCLUDE_MINISERVER 1
#endif #endif
#if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1 #if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1
#undef EXCLUDE_MINISERVER # undef EXCLUDE_MINISERVER
#define EXCLUDE_MINISERVER 1 # define EXCLUDE_MINISERVER 1
#if INTERNAL_WEB_SERVER # if INTERNAL_WEB_SERVER
# error "conflicting settings: use configure --disable-webserver" # error "conflicting settings: use configure --disable-webserver"
#endif # endif
#endif #endif
#if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0 #if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0
#undef EXCLUDE_MINISERVER # undef EXCLUDE_MINISERVER
#define EXCLUDE_MINISERVER 0 # define EXCLUDE_MINISERVER 0
#if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER # if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER
#error "conflicting settings : use configure --enable-webserver" # error "conflicting settings : use configure --enable-webserver"
#endif # endif
#endif #endif
#ifdef INCLUDE_CLIENT_APIS #ifdef INCLUDE_CLIENT_APIS
#define CLIENTONLY(x) x # define CLIENTONLY(x) x
#else #else
#define CLIENTONLY(x) # define CLIENTONLY(x)
#endif
#ifdef INCLUDE_DEVICE_APIS
#define DEVICEONLY(x) x
#else
#define DEVICEONLY(x)
#endif #endif
//@} //@}
#endif #endif

View File

@@ -1,4 +1,4 @@
/* upnp/inc/upnpconfig.h. Generated by configure. */ /* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in 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.0" #define UPNP_VERSION_STRING "1.4.7"
/** 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 0 #define UPNP_VERSION_PATCH 7
/** The library version (numeric) e.g. 10300 means version 1.3.0 */ /** The library version (numeric) e.g. 10300 means version 1.3.0 */
#define UPNP_VERSION \ #define UPNP_VERSION \
@@ -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

View File

@@ -34,7 +34,7 @@
<RESFILES value=""/> <RESFILES value=""/>
<DEFFILE value=""/> <DEFFILE value=""/>
<RESDEPEN value="$(RESFILES)"/> <RESDEPEN value="$(RESFILES)"/>
<LIBFILES value="..\..\..\pthreads-w32-1-10-0-release\pthreadBC1.lib"/> <LIBFILES value="D:\pthreads-w32-1-10-0-release\pthreadBC1.lib"/>
<LIBRARIES value=""/> <LIBRARIES value=""/>
<SPARELIBS value=""/> <SPARELIBS value=""/>
<PACKAGES value=""/> <PACKAGES value=""/>
@@ -45,11 +45,11 @@
<DEBUGLIBPATH value="$(BCB)\lib\debug"/> <DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/> <RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="tlink32"/> <LINKER value="tlink32"/>
<USERDEFINES value="WIN32;LIBUPNP_EXPORTS"/> <USERDEFINES value="WIN32;LIBUPNP_EXPORTS;UPNP_USE_BCBPP"/>
<SYSDEFINES value="NO_STRICT;_NO_VCL"/> <SYSDEFINES value="NO_STRICT;_NO_VCL"/>
<MAINSOURCE value="libupnp.bpf"/> <MAINSOURCE value="libupnp.bpf"/>
<INCLUDEPATH value="..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc"/> <INCLUDEPATH value="..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;..\..\pthreads-w32-1-10-0-release"/>
<LIBPATH value="..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib"/> <LIBPATH value="..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;..\..\pthreads-w32-1-10-0-release"/>
<WARNINGS value="-w-par"/> <WARNINGS value="-w-par"/>
</MACROS> </MACROS>
<OPTIONS> <OPTIONS>
@@ -94,22 +94,27 @@ ProductVersion=1.0.0.0
Comments= Comments=
[HistoryLists\hlIncludePath] [HistoryLists\hlIncludePath]
Count=1 Count=3
Item0=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc Item0=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;..\..\pthreads-w32-1-10-0-release
Item1=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc;D:\DEVELOP\pthreads-w32-1-10-0-release
Item2=..\upnp\src\genlib\util;..\upnp\src;..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\threadutil\src;..\ixml\src;$(BCB)\include;$(BCB)\include\vcl;..\ixml\inc;..\threadutil\inc;..\upnp\inc;inc;..\ixml\src\inc;..\upnp\src\inc
[HistoryLists\hlLibraryPath] [HistoryLists\hlLibraryPath]
Count=1 Count=3
Item0=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib Item0=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;..\..\pthreads-w32-1-10-0-release
Item1=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib;D:\DEVELOP\pthreads-w32-1-10-0-release
Item2=..\upnp\src\uuid;..\upnp\src\urlconfig;..\upnp\src\ssdp;..\upnp\src\soap;..\upnp\src\genlib\util;..\upnp\src\genlib\service_table;..\upnp\src\genlib\net\uri;..\upnp\src\genlib\net\http;..\upnp\src\genlib\net;..\upnp\src\genlib\miniserver;..\upnp\src\genlib\client_table;..\upnp\src\gena;..\upnp\src\api;..\upnp\src;..\threadutil\src;..\ixml\src;$(BCB)\lib\obj;$(BCB)\lib
[HistoryLists\hlDebugSourcePath] [HistoryLists\hlDebugSourcePath]
Count=1 Count=1
Item0=$(BCB)\source\vcl Item0=$(BCB)\source\vcl
[HistoryLists\hlConditionals] [HistoryLists\hlConditionals]
Count=3 Count=4
Item0=WIN32;LIBUPNP_EXPORTS Item0=WIN32;LIBUPNP_EXPORTS;UPNP_USE_BCBPP
Item1=WIN32;EXPORT_SPEC Item1=WIN32;LIBUPNP_EXPORTS
Item2=WIN32 Item2=WIN32;EXPORT_SPEC
Item3=WIN32
[Debugging] [Debugging]
DebugSourceDirs=$(BCB)\source\vcl DebugSourceDirs=$(BCB)\source\vcl

View File

@@ -43,7 +43,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /c # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I ".\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /FR /YX /FD /c # ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I ".\inc" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /D "PTW32_STATIC_LIB" /D "UPNP_STATIC_LIB" /D "UPNP_USE_MSVCPP" /FR /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG" # ADD BASE RSC /l 0x407 /d "NDEBUG"
@@ -53,7 +53,8 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /machine:I386 # ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /machine:I386
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "libupnp - Win32 Debug" !ELSEIF "$(CFG)" == "libupnp - Win32 Debug"
@@ -69,7 +70,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0 # PROP Ignore_Export_Lib 0
# PROP Target_Dir "" # PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /GZ /c # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I "..\build\inc" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /FR /YX /FD /GZ /c # ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\pthreads\include" /I "..\ixml\src\inc" /I "..\ixml\inc" /I "..\threadutil\inc" /I "..\upnp\inc" /I "..\upnp\src\inc" /I "..\build\inc" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBUPNP_EXPORTS" /D "UPNP_USE_MSVCPP" /FR /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG" # ADD BASE RSC /l 0x407 /d "_DEBUG"
@@ -79,7 +80,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo # ADD BSC32 /nologo
LINK32=link.exe LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 kernel32.lib user32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\pthreads\lib\pthreadvc2.lib ws2_32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF !ENDIF
@@ -274,6 +275,146 @@ SOURCE=..\upnp\src\win_dll.c
# Begin Group "Header-Dateien" # Begin Group "Header-Dateien"
# PROP Default_Filter "h;hpp;hxx;hm;inl" # PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=..\upnp\src\inc\client_table.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\config.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gena.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gena_ctrlpt.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gena_device.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\global.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\gmtdate.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\http_client.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\httpparser.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\httpreadwrite.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\inet_pton.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\md5.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\membuffer.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\miniserver.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\netall.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\parsetools.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\server.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\service_table.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\soaplib.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\sock.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\ssdplib.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\statcodes.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\statuscodes.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\strintmap.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\sysdep.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\unixutil.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\upnp_timeout.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\upnpapi.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\upnpclosesocket.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\uri.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\urlconfig.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\util.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\utilall.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\uuid.h
# End Source File
# Begin Source File
SOURCE=..\upnp\src\inc\webserver.h
# End Source File
# End Group # End Group
# Begin Group "Ressourcendateien" # Begin Group "Ressourcendateien"

301
build/msvc/inttypes.h Normal file
View File

@@ -0,0 +1,301 @@
// 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_ ]

View File

@@ -1,34 +1,114 @@
# -*- 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-2006 R<>mi Turboult <r3mi@users.sourceforge.net> # (C) Copyright 2005-2007 R<>mi Turboult <r3mi@users.sourceforge.net>
# #
AC_PREREQ(2.59) AC_PREREQ(2.60)
AC_INIT([libupnp], [1.4.1], [virtual_worlds@gmx.de]) AC_INIT([libupnp], [1.6.1], [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:
# - library code modified: revision++ # - library code modified: revision++
# - interfaces changed/added/removed: current++ and revision=0 # - interfaces changed/added/removed: current++ and revision=0
# - interfaces added: age++ # - interfaces added: age++
# - 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*
AC_SUBST([LT_VERSION_IXML], [2:2:0]) #
AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0]) ###############################################################################
AC_SUBST([LT_VERSION_UPNP], [2:2:0]) # Release 1.4.1:
#AC_SUBST([LT_VERSION_IXML], [2:2:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
#AC_SUBST([LT_VERSION_UPNP], [2:2:0])
#
###############################################################################
# Release 1.4.6:
# "current:revision:age"
#
# - Code has changed in ixml
# revision: 2 -> 3
# - Code has changed in threadutil
# revision: 2 -> 3
# - Interface added in threadutil
# current: 2 -> 3
# revisiion: 3 -> 0
# age: 0 -> 1
# - Code has changed in upnp
# revision: 2 -> 3
#
#AC_SUBST([LT_VERSION_IXML], [2:3:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [3:0:1])
#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])
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 :
@@ -42,6 +122,7 @@ AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects])
# installed libraries. # installed libraries.
# #
AC_CONFIG_HEADERS([autoconfig.h upnp/inc/upnpconfig.h]) AC_CONFIG_HEADERS([autoconfig.h upnp/inc/upnpconfig.h])
#AC_SYS_LARGEFILE_SENSITIVE
AC_REVISION([$Revision: 1.11 $]) AC_REVISION([$Revision: 1.11 $])
@@ -106,19 +187,31 @@ RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code])
# doc installation # doc installation
AC_MSG_CHECKING([documentation installation]) # autoconf >= 2.60 already defines ${docdir}, but we will not use its
AC_ARG_WITH([docdir], # default value, which is ${datarootdir}/doc/${PACKAGE_TARNAME}.
AC_HELP_STRING([--with-docdir=DIR], # That would give us ${datarootdir}/doc/libupnp, and we want the package
[where documentation is installed # version on that.
@<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@]) docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}"
AC_HELP_STRING([--without-docdir], AC_MSG_CHECKING([for documentation directory])
[do not install the documentation]), AC_ARG_WITH(
[DOCDIR="$with_docdir"], [documentation],
[DOCDIR="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}"]) AS_HELP_STRING(
[--with-documentation=directory_name],
[where documentation is installed
@<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@])
AS_HELP_STRING(
[--without-documentation],
[do not install the documentation]),
[],
[with_documentation=no])
AM_CONDITIONAL(WITH_DOCDIR, test x"$with_docdir" != xno) # If something has been entered after an equal sign, assume it is the directory
AC_SUBST(DOCDIR) if test x"$with_documentation" != xyes -a x"$with_documentation" != xno; then
AC_MSG_RESULT($DOCDIR) docdir="$with_documentation"
fi
AM_CONDITIONAL(WITH_DOCUMENTATION, test x"$with_documentation" != xno)
AC_SUBST(docdir)
AC_MSG_RESULT($docdir)
# #
@@ -131,22 +224,40 @@ AC_PROG_INSTALL
AC_PROG_MAKE_SET AC_PROG_MAKE_SET
AC_PROG_EGREP AC_PROG_EGREP
# #
# Default compilation flags # Default compilation flags
# #
if test x"$enable_debug" = xyes; then echo "--------------------- Default compilation flags -------------------------------"
# AC_PROG_CC already sets CFLAGS to "-g -O2" by default echo host is $host
: echo host_os is $host_os
else case $host_os in
# add optimise for size freebsd*)
AX_CFLAGS_GCC_OPTION([-Os]) echo "Using FreeBSD specific compiler settings"
fi # Put FreeBSD specific compiler flags here
AX_CFLAGS_WARN_ALL ;;
*)
echo "Using non-specific system compiler settings"
if test x"$enable_debug" = xyes; then
# AC_PROG_CC already sets CFLAGS to "-g -O2" by default
:
else
# add optimise for size
AX_CFLAGS_GCC_OPTION([-Os])
fi
;;
esac
# Arrange for large-file support (can be disabled with --disable-largefile). AX_CFLAGS_WARN_ALL
# Define _FILE_OFFSET_BITS and _LARGE_FILES if necessary echo "-------------------------------------------------------------------------------"
AC_SYS_LARGEFILE
#
# Lot's of stuff to ensure large file support
#
AC_TYPE_SIZE_T
AC_TYPE_OFF_T
AC_DEFINE([_LARGE_FILE_SOURCE], [], [Large files support])
AC_DEFINE([_FILE_OFFSET_BITS], [64], [File Offset size])
# #
@@ -155,7 +266,25 @@ AC_SYS_LARGEFILE
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([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])]) AC_CHECK_HEADERS(
[ \
arpa/inet.h \
fcntl.h \
inttypes.h \
limits.h \
netdb.h \
netinet/in.h \
stdlib.h \
string.h \
sys/ioctl.h \
sys/socket.h \
sys/time.h \
sys/timeb.h \
syslog.h \
unistd.h \
],
[],
[AC_MSG_ERROR([required header file missing])])
# #
@@ -171,25 +300,29 @@ 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([],[AC_MSG_ERROR([POSIX threads are required to build this program])]) ACX_PTHREAD(
[],
[AC_MSG_ERROR([POSIX threads are required to build this program])])
AC_CONFIG_FILES([
Makefile
ixml/Makefile
ixml/doc/Makefile
threadutil/Makefile
upnp/Makefile
upnp/doc/Makefile
upnp/sample/Makefile
docs/dist/Makefile
libupnp.pc
])
AC_CONFIG_FILES([Makefile
ixml/Makefile
ixml/doc/Makefile
threadutil/Makefile
upnp/Makefile
upnp/doc/Makefile
docs/dist/Makefile
libupnp.pc
])
AC_OUTPUT AC_OUTPUT

13
docs/dist/Makefile.am vendored
View File

@@ -1,4 +1,7 @@
EXTRA_DIST = ./UPnP_Programming_Guide.pdf \
EXTRA_DIST = \
./UPnP_Programming_Guide.pdf \
./IXML_Programming_Guide.pdf \ ./IXML_Programming_Guide.pdf \
./html/upnp/icon1.gif \ ./html/upnp/icon1.gif \
./html/upnp/icon2.gif \ ./html/upnp/icon2.gif \
@@ -251,9 +254,10 @@ EXTRA_DIST = ./UPnP_Programming_Guide.pdf \
./html/ixml/ixmlCloneDOMString.html \ ./html/ixml/ixmlCloneDOMString.html \
./html/ixml/ixmlFreeDOMString.html ./html/ixml/ixmlFreeDOMString.html
if WITH_DOCDIR if WITH_DOCUMENTATION
docsdir = @DOCDIR@ docsdir = @docdir@
nobase_docs_DATA = ./UPnP_Programming_Guide.pdf \ nobase_docs_DATA = \
./UPnP_Programming_Guide.pdf \
./IXML_Programming_Guide.pdf \ ./IXML_Programming_Guide.pdf \
./html/upnp/icon1.gif \ ./html/upnp/icon1.gif \
./html/upnp/icon2.gif \ ./html/upnp/icon2.gif \
@@ -506,3 +510,4 @@ if WITH_DOCDIR
./html/ixml/ixmlCloneDOMString.html \ ./html/ixml/ixmlCloneDOMString.html \
./html/ixml/ixmlFreeDOMString.html ./html/ixml/ixmlFreeDOMString.html
endif endif

View File

@@ -1,59 +1,61 @@
/////////////////////////////////////////////////////////////////////////// /*******************************************************************************
// *
// 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)
#endif #endif
#else #else
#define EXPORT_SPEC #define EXPORT_SPEC
#endif #endif
#else #else
#define EXPORT_SPEC #define EXPORT_SPEC
#endif #endif
typedef int BOOL; typedef int BOOL;
#define DOMString char * #define DOMString char *
@@ -88,7 +90,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.
*/ */
//@{ /*! @{ */
/*================================================================ /*================================================================
* *
@@ -121,7 +123,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,
@@ -240,7 +242,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
@@ -260,7 +262,7 @@ ixmlNode_getNodeName(IXML_Node *nodeptr
* @return [DOMString] A {\bf DOMString} of the {\bf Node} value. * @return [DOMString] A {\bf DOMString} of the {\bf Node} value.
*/ */
EXPORT_SPEC DOMString EXPORT_SPEC const DOMString
ixmlNode_getNodeValue(IXML_Node *nodeptr ixmlNode_getNodeValue(IXML_Node *nodeptr
/** Pointer to the {\bf Node} to retrieve the value. */ /** Pointer to the {\bf Node} to retrieve the value. */
); );
@@ -282,7 +284,7 @@ ixmlNode_getNodeValue(IXML_Node *nodeptr
EXPORT_SPEC int EXPORT_SPEC int
ixmlNode_setNodeValue(IXML_Node *nodeptr, ixmlNode_setNodeValue(IXML_Node *nodeptr,
/** The {\bf Node} to which to assign a new value. */ /** The {\bf Node} to which to assign a new value. */
char *newNodeValue const char *newNodeValue
/** The new value of the {\bf Node}. */ /** The new value of the {\bf Node}. */
); );
@@ -439,7 +441,7 @@ ixmlNode_getNamespaceURI(IXML_Node *nodeptr
* or {\tt NULL}. * or {\tt NULL}.
*/ */
EXPORT_SPEC DOMString EXPORT_SPEC const DOMString
ixmlNode_getPrefix(IXML_Node *nodeptr ixmlNode_getPrefix(IXML_Node *nodeptr
/** The {\bf Node} from which to retrieve the prefix. */ /** The {\bf Node} from which to retrieve the prefix. */
); );
@@ -620,7 +622,7 @@ ixmlNode_cloneNode(IXML_Node *nodeptr,
*/ */
EXPORT_SPEC BOOL EXPORT_SPEC BOOL
ixmlNode_hasAttributes(IXML_Node *node ixmlNode_hasAttributes(IXML_Node *nodeptr
/** The {\bf Node} to query for attributes. */ /** The {\bf Node} to query for attributes. */
); );
@@ -630,11 +632,11 @@ ixmlNode_hasAttributes(IXML_Node *node
*/ */
EXPORT_SPEC void EXPORT_SPEC void
ixmlNode_free(IXML_Node *IXML_Node ixmlNode_free(IXML_Node *nodeptr
/** The {\bf Node} to free. */ /** The {\bf Node} to free. */
); );
//@} /*! @} */
/*================================================================ /*================================================================
* *
@@ -649,7 +651,7 @@ ixmlNode_free(IXML_Node *IXML_Node
* 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.
@@ -662,7 +664,7 @@ ixmlAttr_free(IXML_Attr *attrNode
/** The {\bf Attr} node to free. */ /** The {\bf Attr} node to free. */
); );
//@} /*! @} */
/*================================================================ /*================================================================
@@ -680,7 +682,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.
@@ -704,7 +706,7 @@ ixmlCDATASection_free(IXML_CDATASection *nodeptr
/** The {\bf CDATASection} node to free. */ /** The {\bf CDATASection} node to free. */
); );
//@} /*! @} */
/*================================================================ /*================================================================
* *
@@ -719,7 +721,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.
* *
@@ -867,7 +869,7 @@ EXPORT_SPEC int
ixmlDocument_createCDATASectionEx(IXML_Document *doc, ixmlDocument_createCDATASectionEx(IXML_Document *doc,
/** The owner {\bf Document} of the new /** The owner {\bf Document} of the new
node. */ node. */
DOMString data, const DOMString data,
/** The data to associate with the new /** The data to associate with the new
{\bf CDATASection} node. */ {\bf CDATASection} node. */
IXML_CDATASection** cdNode IXML_CDATASection** cdNode
@@ -886,7 +888,7 @@ EXPORT_SPEC IXML_CDATASection*
ixmlDocument_createCDATASection(IXML_Document *doc, ixmlDocument_createCDATASection(IXML_Document *doc,
/** The owner {\bf Document} of the new /** The owner {\bf Document} of the new
node. */ node. */
DOMString data const DOMString data
/** The data to associate with the new {\bf /** The data to associate with the new {\bf
CDATASection} node. */ CDATASection} node. */
); );
@@ -899,7 +901,7 @@ ixmlDocument_createCDATASection(IXML_Document *doc,
EXPORT_SPEC IXML_Attr* EXPORT_SPEC IXML_Attr*
ixmlDocument_createAttribute(IXML_Document *doc, ixmlDocument_createAttribute(IXML_Document *doc,
/** The owner {\bf Document} of the new node. */ /** The owner {\bf Document} of the new node. */
char *name const char *name
/** The name of the new attribute. */ /** The name of the new attribute. */
); );
@@ -924,7 +926,7 @@ EXPORT_SPEC int
ixmlDocument_createAttributeEx(IXML_Document *doc, ixmlDocument_createAttributeEx(IXML_Document *doc,
/** The owner {\bf Document} of the new /** The owner {\bf Document} of the new
node. */ node. */
char *name, const char *name,
/** The name of the new attribute. */ /** The name of the new attribute. */
IXML_Attr** attrNode IXML_Attr** attrNode
/** A pointer to a {\bf Attr} where the new /** A pointer to a {\bf Attr} where the new
@@ -943,11 +945,11 @@ ixmlDocument_createAttributeEx(IXML_Document *doc,
EXPORT_SPEC IXML_NodeList* EXPORT_SPEC IXML_NodeList*
ixmlDocument_getElementsByTagName(IXML_Document *doc, ixmlDocument_getElementsByTagName(IXML_Document *doc,
/** The {\bf Document} to search. */ /** The {\bf Document} to search. */
DOMString tagName const DOMString tagName
/** 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.
@@ -970,10 +972,10 @@ EXPORT_SPEC int
ixmlDocument_createElementNSEx(IXML_Document *doc, ixmlDocument_createElementNSEx(IXML_Document *doc,
/** The owner {\bf Document} of the new /** The owner {\bf Document} of the new
node. */ node. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI for the new {\bf /** The namespace URI for the new {\bf
Element}. */ Element}. */
DOMString qualifiedName, const DOMString qualifiedName,
/** The qualified name of the new {\bf /** The qualified name of the new {\bf
Element}. */ Element}. */
IXML_Element** rtElement IXML_Element** rtElement
@@ -992,10 +994,10 @@ ixmlDocument_createElementNSEx(IXML_Document *doc,
EXPORT_SPEC IXML_Element* EXPORT_SPEC IXML_Element*
ixmlDocument_createElementNS(IXML_Document *doc, ixmlDocument_createElementNS(IXML_Document *doc,
/** The owner {\bf Document} of the new node. */ /** The owner {\bf Document} of the new node. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI for the new {\bf /** The namespace URI for the new {\bf
Element}. */ Element}. */
DOMString qualifiedName const DOMString qualifiedName
/** The qualified name of the new {\bf /** The qualified name of the new {\bf
Element}. */ Element}. */
); );
@@ -1021,9 +1023,9 @@ EXPORT_SPEC int
ixmlDocument_createAttributeNSEx(IXML_Document *doc, ixmlDocument_createAttributeNSEx(IXML_Document *doc,
/** The owner {\bf Document} of the new /** The owner {\bf Document} of the new
{\bf Attr}. */ {\bf Attr}. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI for the attribute. */ /** The namespace URI for the attribute. */
DOMString qualifiedName, const DOMString qualifiedName,
/** The qualified name of the attribute. */ /** The qualified name of the attribute. */
IXML_Attr** attrNode IXML_Attr** attrNode
/** A pointer to an {\bf Attr} where the /** A pointer to an {\bf Attr} where the
@@ -1040,9 +1042,9 @@ EXPORT_SPEC IXML_Attr*
ixmlDocument_createAttributeNS(IXML_Document *doc, ixmlDocument_createAttributeNS(IXML_Document *doc,
/** The owner {\bf Document} of the new /** The owner {\bf Document} of the new
{\bf Attr}. */ {\bf Attr}. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI for the attribute. */ /** The namespace URI for the attribute. */
DOMString qualifiedName const DOMString qualifiedName
/** The qualified name of the attribute. */ /** The qualified name of the attribute. */
); );
@@ -1059,11 +1061,11 @@ ixmlDocument_createAttributeNS(IXML_Document *doc,
EXPORT_SPEC IXML_NodeList* EXPORT_SPEC IXML_NodeList*
ixmlDocument_getElementsByTagNameNS(IXML_Document* doc, ixmlDocument_getElementsByTagNameNS(IXML_Document* doc,
/** The {\bf Document} to search. */ /** The {\bf Document} to search. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace of the elements to /** The namespace of the elements to
find or {\tt "*"} to match any find or {\tt "*"} to match any
namespace. */ namespace. */
DOMString localName const DOMString localName
/** The local name of the elements to /** The local name of the elements to
find or {\tt "*"} to match any local find or {\tt "*"} to match any local
name. */ name. */
@@ -1079,7 +1081,7 @@ EXPORT_SPEC IXML_Element*
ixmlDocument_getElementById(IXML_Document* doc, ixmlDocument_getElementById(IXML_Document* doc,
/** The owner {\bf Document} of the {\bf /** The owner {\bf Document} of the {\bf
Element}. */ Element}. */
DOMString tagName const DOMString tagName
/** The name of the {\bf Element}.*/ /** The name of the {\bf Element}.*/
); );
@@ -1128,7 +1130,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}. */
); );
//@} /*! @} */
/*================================================================ /*================================================================
* *
@@ -1144,7 +1146,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.
* *
@@ -1174,11 +1176,11 @@ ixmlElement_getTagName(IXML_Element* element
* attribute. * attribute.
*/ */
EXPORT_SPEC DOMString EXPORT_SPEC const DOMString
ixmlElement_getAttribute(IXML_Element* element, ixmlElement_getAttribute(IXML_Element* element,
/** The {\bf Element} from which to retrieve the /** The {\bf Element} from which to retrieve the
attribute. */ attribute. */
DOMString name const DOMString name
/** The name of the attribute to retrieve. */ /** The name of the attribute to retrieve. */
); );
@@ -1202,9 +1204,9 @@ EXPORT_SPEC int
ixmlElement_setAttribute(IXML_Element* element, ixmlElement_setAttribute(IXML_Element* element,
/** The {\bf Element} on which to set the /** The {\bf Element} on which to set the
attribute. */ attribute. */
DOMString name, const DOMString name,
/** The name of the attribute. */ /** The name of the attribute. */
DOMString value const DOMString value
/** The value of the attribute. Note that this is /** The value of the attribute. Note that this is
a non-parsed string and any markup must be a non-parsed string and any markup must be
escaped. */ escaped. */
@@ -1224,7 +1226,7 @@ EXPORT_SPEC int
ixmlElement_removeAttribute(IXML_Element* element, ixmlElement_removeAttribute(IXML_Element* element,
/** The {\bf Element} from which to remove the /** The {\bf Element} from which to remove the
attribute. */ attribute. */
DOMString name const DOMString name
/** The name of the attribute to remove. */ /** The name of the attribute to remove. */
); );
@@ -1240,7 +1242,7 @@ EXPORT_SPEC IXML_Attr*
ixmlElement_getAttributeNode(IXML_Element* element, ixmlElement_getAttributeNode(IXML_Element* element,
/** The {\bf Element} from which to get the /** The {\bf Element} from which to get the
attribute node. */ attribute node. */
DOMString name const DOMString name
/** The name of the attribute node to find. */ /** The name of the attribute node to find. */
); );
@@ -1309,12 +1311,12 @@ EXPORT_SPEC IXML_NodeList*
ixmlElement_getElementsByTagName(IXML_Element* element, ixmlElement_getElementsByTagName(IXML_Element* element,
/** The {\bf Element} from which to start /** The {\bf Element} from which to start
the search. */ the search. */
DOMString tagName const DOMString tagName
/** The name of the tag for which to /** The name of the tag for which to
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.
* *
@@ -1322,13 +1324,13 @@ ixmlElement_getElementsByTagName(IXML_Element* element,
* matching attribute. * matching attribute.
*/ */
EXPORT_SPEC DOMString EXPORT_SPEC const DOMString
ixmlElement_getAttributeNS(IXML_Element* element, ixmlElement_getAttributeNS(IXML_Element* element,
/** The {\bf Element} from which to get the /** The {\bf Element} from which to get the
attribute value. */ attribute value. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI of the attribute. */ /** The namespace URI of the attribute. */
DOMString localname const DOMString localname
/** The local name of the attribute. */ /** The local name of the attribute. */
); );
@@ -1358,11 +1360,11 @@ EXPORT_SPEC int
ixmlElement_setAttributeNS(IXML_Element* element, ixmlElement_setAttributeNS(IXML_Element* element,
/** The {\bf Element} on which to set the /** The {\bf Element} on which to set the
attribute. */ attribute. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI of the new attribute. */ /** The namespace URI of the new attribute. */
DOMString qualifiedName, const DOMString qualifiedName,
/** The qualified name of the attribute. */ /** The qualified name of the attribute. */
DOMString value const DOMString value
/** The new value for the attribute. */ /** The new value for the attribute. */
); );
@@ -1380,9 +1382,9 @@ EXPORT_SPEC int
ixmlElement_removeAttributeNS(IXML_Element* element, ixmlElement_removeAttributeNS(IXML_Element* element,
/** The {\bf Element} from which to remove the /** The {\bf Element} from which to remove the
the attribute. */ the attribute. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI of the attribute. */ /** The namespace URI of the attribute. */
DOMString localName const DOMString localName
/** The local name of the attribute.*/ /** The local name of the attribute.*/
); );
@@ -1395,9 +1397,9 @@ EXPORT_SPEC IXML_Attr*
ixmlElement_getAttributeNodeNS(IXML_Element* element, ixmlElement_getAttributeNodeNS(IXML_Element* element,
/** The {\bf Element} from which to get the /** The {\bf Element} from which to get the
attribute. */ attribute. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI of the attribute. */ /** The namespace URI of the attribute. */
DOMString localName const DOMString localName
/** The local name of the attribute. */ /** The local name of the attribute. */
); );
@@ -1441,10 +1443,10 @@ EXPORT_SPEC IXML_NodeList*
ixmlElement_getElementsByTagNameNS(IXML_Element* element, ixmlElement_getElementsByTagNameNS(IXML_Element* element,
/** The {\bf Element} from which to start /** The {\bf Element} from which to start
the search. */ the search. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI of the {\bf /** The namespace URI of the {\bf
Element}s to find. */ Element}s to find. */
DOMString localName const DOMString localName
/** The local name of the {\bf Element}s /** The local name of the {\bf Element}s
to find. */ to find. */
); );
@@ -1461,7 +1463,7 @@ EXPORT_SPEC BOOL
ixmlElement_hasAttribute(IXML_Element* element, ixmlElement_hasAttribute(IXML_Element* element,
/** The {\bf Element} on which to check for an /** The {\bf Element} on which to check for an
attribute. */ attribute. */
DOMString name const DOMString name
/** The name of the attribute for which to check. */ /** The name of the attribute for which to check. */
); );
@@ -1477,9 +1479,9 @@ EXPORT_SPEC BOOL
ixmlElement_hasAttributeNS(IXML_Element* element, ixmlElement_hasAttributeNS(IXML_Element* element,
/** The {\bf Element} on which to check for the /** The {\bf Element} on which to check for the
attribute. */ attribute. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI of the attribute. */ /** The namespace URI of the attribute. */
DOMString localName const DOMString localName
/** The local name of the attribute. */ /** The local name of the attribute. */
); );
@@ -1493,7 +1495,7 @@ ixmlElement_free(IXML_Element* element
/** The {\bf Element} to free. */ /** The {\bf Element} to free. */
); );
//@} /*! @} */
/*================================================================ /*================================================================
* *
@@ -1508,7 +1510,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}.
* *
@@ -1529,7 +1531,7 @@ ixmlNamedNodeMap_getLength(IXML_NamedNodeMap *nnMap
EXPORT_SPEC IXML_Node* EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_getNamedItem(IXML_NamedNodeMap *nnMap, ixmlNamedNodeMap_getNamedItem(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} to search. */ /** The {\bf NamedNodeMap} to search. */
DOMString name const DOMString name
/** The name of the {\bf Node} to find. */ /** The name of the {\bf Node} to find. */
); );
@@ -1560,7 +1562,7 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_removeNamedItem(IXML_NamedNodeMap *nnMap, ixmlNamedNodeMap_removeNamedItem(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to /** The {\bf NamedNodeMap} from which to
remove the item. */ remove the item. */
DOMString name const DOMString name
/** The name of the item to remove. */ /** The name of the item to remove. */
); );
@@ -1579,7 +1581,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.
@@ -1592,10 +1594,10 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_getNamedItemNS(IXML_NamedNodeMap *nnMap, ixmlNamedNodeMap_getNamedItemNS(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to /** The {\bf NamedNodeMap} from which to
remove the {\bf Node}. */ remove the {\bf Node}. */
DOMString *namespaceURI, const DOMString *namespaceURI,
/** The namespace URI of the {\bf Node} to /** The namespace URI of the {\bf Node} to
remove. */ remove. */
DOMString localName const DOMString localName
/** The local name of the {\bf Node} to /** The local name of the {\bf Node} to
remove. */ remove. */
); );
@@ -1627,10 +1629,10 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_removeNamedItemNS(IXML_NamedNodeMap *nnMap, ixmlNamedNodeMap_removeNamedItemNS(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to /** The {\bf NamedNodeMap} from which to
remove the {\bf Node}. */ remove the {\bf Node}. */
DOMString namespaceURI, const DOMString namespaceURI,
/** The namespace URI of the {\bf Node} /** The namespace URI of the {\bf Node}
to remove. */ to remove. */
DOMString localName const DOMString localName
/** The local name of the {\bf Node} to /** The local name of the {\bf Node} to
remove. */ remove. */
); );
@@ -1646,7 +1648,7 @@ ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap
/** The {\bf NamedNodeMap to free}. */ /** The {\bf NamedNodeMap to free}. */
); );
//@} /*! @} */
/*================================================================ /*================================================================
* *
@@ -1661,7 +1663,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.
@@ -1701,8 +1703,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
@@ -1710,7 +1712,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.
*/ */
//@{ /*! @{ */
/*================================================================ /*================================================================
* *
@@ -1738,7 +1740,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.
*/ */
DOMString EXPORT_SPEC 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
@@ -1756,7 +1758,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.
*/ */
DOMString EXPORT_SPEC 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. */
); );
@@ -1777,7 +1779,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.
*/ */
DOMString EXPORT_SPEC 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
@@ -1809,7 +1811,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.
*/ */
void EXPORT_SPEC void
ixmlRelaxParser(char errorChar); ixmlRelaxParser(char errorChar);
@@ -1819,7 +1821,7 @@ ixmlRelaxParser(char errorChar);
* {\tt NULL} on an error. * {\tt NULL} on an error.
*/ */
EXPORT_SPEC IXML_Document* EXPORT_SPEC IXML_Document*
ixmlParseBuffer(char *buffer ixmlParseBuffer(const char *buffer
/** The buffer that contains the XML text to convert to a /** The buffer that contains the XML text to convert to a
{\bf Document}. */ {\bf Document}. */
); );
@@ -1842,7 +1844,7 @@ ixmlParseBuffer(char *buffer
*/ */
EXPORT_SPEC int EXPORT_SPEC int
ixmlParseBufferEx(char *buffer, ixmlParseBufferEx(const char *buffer,
/** The buffer that contains the XML text to convert to a /** The buffer that contains the XML text to convert to a
{\bf Document}. */ {\bf Document}. */
IXML_Document** doc IXML_Document** doc
@@ -1857,7 +1859,7 @@ ixmlParseBufferEx(char *buffer,
*/ */
EXPORT_SPEC IXML_Document* EXPORT_SPEC IXML_Document*
ixmlLoadDocument(char* xmlFile ixmlLoadDocument(const char* xmlFile
/** The filename of the XML text to convert to a {\bf /** The filename of the XML text to convert to a {\bf
Document}. */ Document}. */
); );
@@ -1879,7 +1881,7 @@ ixmlLoadDocument(char* xmlFile
*/ */
EXPORT_SPEC int EXPORT_SPEC int
ixmlLoadDocumentEx(char* xmlFile, ixmlLoadDocumentEx(const char* xmlFile,
/** The filename of the XML text to convert to a {\bf /** The filename of the XML text to convert to a {\bf
Document}. */ Document}. */
IXML_Document** doc IXML_Document** doc
@@ -1913,6 +1915,7 @@ ixmlFreeDOMString(DOMString buf
} }
#endif #endif
//@} IXML API /*! @} */ /* IXML API */
#endif /* _IXML_H_ */
#endif // _IXML_H_

View File

@@ -373,7 +373,7 @@ ixmlDocument_createTextNode( IN IXML_Document * doc,
================================================================*/ ================================================================*/
int int
ixmlDocument_createAttributeEx( IN IXML_Document * doc, ixmlDocument_createAttributeEx( IN IXML_Document * doc,
IN char *name, IN const char *name,
OUT IXML_Attr ** rtAttr ) OUT IXML_Attr ** rtAttr )
{ {
IXML_Attr *attrNode = NULL; IXML_Attr *attrNode = NULL;
@@ -427,7 +427,7 @@ ixmlDocument_createAttributeEx( IN IXML_Document * doc,
================================================================*/ ================================================================*/
IXML_Attr * IXML_Attr *
ixmlDocument_createAttribute( IN IXML_Document * doc, ixmlDocument_createAttribute( IN IXML_Document * doc,
IN char *name ) IN const char *name )
{ {
IXML_Attr *attrNode = NULL; IXML_Attr *attrNode = NULL;
@@ -451,8 +451,8 @@ ixmlDocument_createAttribute( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
int int
ixmlDocument_createAttributeNSEx( IN IXML_Document * doc, ixmlDocument_createAttributeNSEx( IN IXML_Document * doc,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString qualifiedName, IN const DOMString qualifiedName,
OUT IXML_Attr ** rtAttr ) OUT IXML_Attr ** rtAttr )
{ {
IXML_Attr *attrNode = NULL; IXML_Attr *attrNode = NULL;
@@ -507,8 +507,8 @@ ixmlDocument_createAttributeNSEx( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
IXML_Attr * IXML_Attr *
ixmlDocument_createAttributeNS( IN IXML_Document * doc, ixmlDocument_createAttributeNS( IN IXML_Document * doc,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString qualifiedName ) IN const DOMString qualifiedName )
{ {
IXML_Attr *attrNode = NULL; IXML_Attr *attrNode = NULL;
@@ -531,7 +531,7 @@ ixmlDocument_createAttributeNS( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
int int
ixmlDocument_createCDATASectionEx( IN IXML_Document * doc, ixmlDocument_createCDATASectionEx( IN IXML_Document * doc,
IN DOMString data, IN const DOMString data,
OUT IXML_CDATASection ** rtCD ) OUT IXML_CDATASection ** rtCD )
{ {
int errCode = IXML_SUCCESS; int errCode = IXML_SUCCESS;
@@ -588,7 +588,7 @@ ixmlDocument_createCDATASectionEx( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
IXML_CDATASection * IXML_CDATASection *
ixmlDocument_createCDATASection( IN IXML_Document * doc, ixmlDocument_createCDATASection( IN IXML_Document * doc,
IN DOMString data ) IN const DOMString data )
{ {
IXML_CDATASection *cDSectionNode = NULL; IXML_CDATASection *cDSectionNode = NULL;
@@ -613,8 +613,8 @@ ixmlDocument_createCDATASection( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
int int
ixmlDocument_createElementNSEx( IN IXML_Document * doc, ixmlDocument_createElementNSEx( IN IXML_Document * doc,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString qualifiedName, IN const DOMString qualifiedName,
OUT IXML_Element ** rtElement ) OUT IXML_Element ** rtElement )
{ {
@@ -673,8 +673,8 @@ ixmlDocument_createElementNSEx( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
IXML_Element * IXML_Element *
ixmlDocument_createElementNS( IN IXML_Document * doc, ixmlDocument_createElementNS( IN IXML_Document * doc,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString qualifiedName ) IN const DOMString qualifiedName )
{ {
IXML_Element *newElement = NULL; IXML_Element *newElement = NULL;
@@ -698,7 +698,7 @@ ixmlDocument_createElementNS( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
IXML_NodeList * IXML_NodeList *
ixmlDocument_getElementsByTagName( IN IXML_Document * doc, ixmlDocument_getElementsByTagName( IN IXML_Document * doc,
IN char *tagName ) IN const char *tagName )
{ {
IXML_NodeList *returnNodeList = NULL; IXML_NodeList *returnNodeList = NULL;
@@ -728,8 +728,8 @@ ixmlDocument_getElementsByTagName( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
IXML_NodeList * IXML_NodeList *
ixmlDocument_getElementsByTagNameNS( IN IXML_Document * doc, ixmlDocument_getElementsByTagNameNS( IN IXML_Document * doc,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString localName ) IN const DOMString localName )
{ {
IXML_NodeList *returnNodeList = NULL; IXML_NodeList *returnNodeList = NULL;
@@ -756,7 +756,7 @@ ixmlDocument_getElementsByTagNameNS( IN IXML_Document * doc,
*=================================================================*/ *=================================================================*/
IXML_Element * IXML_Element *
ixmlDocument_getElementById( IN IXML_Document * doc, ixmlDocument_getElementById( IN IXML_Document * doc,
IN DOMString tagName ) IN const DOMString tagName )
{ {
IXML_Element *rtElement = NULL; IXML_Element *rtElement = NULL;
IXML_Node *nodeptr = ( IXML_Node * ) doc; IXML_Node *nodeptr = ( IXML_Node * ) doc;

View File

@@ -71,7 +71,7 @@ ixmlElement_getTagName( IN IXML_Element * element )
*=================================================================*/ *=================================================================*/
int int
ixmlElement_setTagName( IN IXML_Element * element, ixmlElement_setTagName( IN IXML_Element * element,
IN char *tagName ) IN const char *tagName )
{ {
int rc = IXML_SUCCESS; int rc = IXML_SUCCESS;
@@ -104,9 +104,9 @@ ixmlElement_setTagName( IN IXML_Element * element,
* does not have a specified value. * does not have a specified value.
* *
*=================================================================*/ *=================================================================*/
DOMString const DOMString
ixmlElement_getAttribute( IN IXML_Element * element, ixmlElement_getAttribute( IN IXML_Element * element,
IN DOMString name ) IN const DOMString name )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
@@ -142,8 +142,8 @@ ixmlElement_getAttribute( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
int int
ixmlElement_setAttribute( IN IXML_Element * element, ixmlElement_setAttribute( IN IXML_Element * element,
IN char *name, IN const char *name,
IN char *value ) IN const char *value )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
IXML_Attr *newAttrNode; IXML_Attr *newAttrNode;
@@ -221,7 +221,7 @@ ixmlElement_setAttribute( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
int int
ixmlElement_removeAttribute( IN IXML_Element * element, ixmlElement_removeAttribute( IN IXML_Element * element,
IN char *name ) IN const char *name )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
@@ -262,7 +262,7 @@ ixmlElement_removeAttribute( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
IXML_Attr * IXML_Attr *
ixmlElement_getAttributeNode( IN IXML_Element * element, ixmlElement_getAttributeNode( IN IXML_Element * element,
IN char *name ) IN const char *name )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
@@ -483,7 +483,7 @@ ixmlElement_removeAttributeNode( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
IXML_NodeList * IXML_NodeList *
ixmlElement_getElementsByTagName( IN IXML_Element * element, ixmlElement_getElementsByTagName( IN IXML_Element * element,
IN char *tagName ) IN const char *tagName )
{ {
IXML_NodeList *returnNodeList = NULL; IXML_NodeList *returnNodeList = NULL;
@@ -508,10 +508,10 @@ ixmlElement_getElementsByTagName( IN IXML_Element * element,
* not have the specified value. * not have the specified value.
* *
*=================================================================*/ *=================================================================*/
DOMString const DOMString
ixmlElement_getAttributeNS( IN IXML_Element * element, ixmlElement_getAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString localName ) IN const DOMString localName )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
@@ -553,9 +553,9 @@ ixmlElement_getAttributeNS( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
int int
ixmlElement_setAttributeNS( IN IXML_Element * element, ixmlElement_setAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString qualifiedName, IN const DOMString qualifiedName,
IN DOMString value ) IN const DOMString value )
{ {
IXML_Node *attrNode = NULL; IXML_Node *attrNode = NULL;
IXML_Node newAttrNode; IXML_Node newAttrNode;
@@ -672,8 +672,8 @@ ixmlElement_setAttributeNS( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
int int
ixmlElement_removeAttributeNS( IN IXML_Element * element, ixmlElement_removeAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString localName ) IN const DOMString localName )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
@@ -719,8 +719,8 @@ ixmlElement_removeAttributeNS( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
IXML_Attr * IXML_Attr *
ixmlElement_getAttributeNodeNS( IN IXML_Element * element, ixmlElement_getAttributeNodeNS( IN IXML_Element * element,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString localName ) IN const DOMString localName )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
@@ -861,8 +861,8 @@ ixmlElement_setAttributeNodeNS( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
IXML_NodeList * IXML_NodeList *
ixmlElement_getElementsByTagNameNS( IN IXML_Element * element, ixmlElement_getElementsByTagNameNS( IN IXML_Element * element,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString localName ) IN const DOMString localName )
{ {
IXML_Node *node = ( IXML_Node * ) element; IXML_Node *node = ( IXML_Node * ) element;
IXML_NodeList *nodeList = NULL; IXML_NodeList *nodeList = NULL;
@@ -892,7 +892,7 @@ ixmlElement_getElementsByTagNameNS( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
BOOL BOOL
ixmlElement_hasAttribute( IN IXML_Element * element, ixmlElement_hasAttribute( IN IXML_Element * element,
IN DOMString name ) IN const DOMString name )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;
@@ -930,8 +930,8 @@ ixmlElement_hasAttribute( IN IXML_Element * element,
*=================================================================*/ *=================================================================*/
BOOL BOOL
ixmlElement_hasAttributeNS( IN IXML_Element * element, ixmlElement_hasAttributeNS( IN IXML_Element * element,
IN DOMString namespaceURI, IN const DOMString namespaceURI,
IN DOMString localName ) IN const DOMString localName )
{ {
IXML_Node *attrNode; IXML_Node *attrNode;

View File

@@ -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 XINLINE inline #define UPNP_INLINE inline
#endif #endif
#define MEMBUF_DEF_SIZE_INC 20 #define MEMBUF_DEF_SIZE_INC 20

View File

@@ -88,8 +88,8 @@ typedef struct _Parser
int Parser_LoadDocument( IXML_Document **retDoc, char * xmlFile, BOOL file); int Parser_LoadDocument( IXML_Document **retDoc, const char * xmlFile, BOOL file);
BOOL Parser_isValidXmlName( DOMString name); BOOL Parser_isValidXmlName( const DOMString name);
int Parser_setNodePrefixAndLocalName(IXML_Node *newIXML_NodeIXML_Attr); int Parser_setNodePrefixAndLocalName(IXML_Node *newIXML_NodeIXML_Attr);
void Parser_freeNodeContent( IXML_Node *IXML_Nodeptr); void Parser_freeNodeContent( IXML_Node *IXML_Nodeptr);
@@ -98,7 +98,7 @@ void Parser_setErrorChar( char c );
void ixmlAttr_free(IXML_Attr *attrNode); void ixmlAttr_free(IXML_Attr *attrNode);
void ixmlAttr_init(IXML_Attr *attrNode); void ixmlAttr_init(IXML_Attr *attrNode);
int ixmlElement_setTagName(IXML_Element *element, char *tagName); int ixmlElement_setTagName(IXML_Element *element, const char *tagName);
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap); void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap);
int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node *add); int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node *add);
@@ -106,12 +106,12 @@ int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node
void ixmlNode_init(IXML_Node *IXML_Nodeptr); void ixmlNode_init(IXML_Node *IXML_Nodeptr);
BOOL ixmlNode_compare(IXML_Node *srcIXML_Node, IXML_Node *destIXML_Node); BOOL ixmlNode_compare(IXML_Node *srcIXML_Node, IXML_Node *destIXML_Node);
void ixmlNode_getElementsByTagName( IXML_Node *n, char *tagname, IXML_NodeList **list); void ixmlNode_getElementsByTagName( IXML_Node *n, const char *tagname, IXML_NodeList **list);
void ixmlNode_getElementsByTagNameNS( IXML_Node *IXML_Node, char *namespaceURI, void ixmlNode_getElementsByTagNameNS( IXML_Node *IXML_Node, const char *namespaceURI,
char *localName, IXML_NodeList **list); const char *localName, IXML_NodeList **list);
int ixmlNode_setNodeProperties(IXML_Node* node, IXML_Node *src); int ixmlNode_setNodeProperties(IXML_Node* node, IXML_Node *src);
int ixmlNode_setNodeName( IXML_Node* node, DOMString qualifiedName); int ixmlNode_setNodeName( IXML_Node* node, const DOMString qualifiedName);
void ixmlNodeList_init(IXML_NodeList *nList); void ixmlNodeList_init(IXML_NodeList *nList);
int ixmlNodeList_addToNodeList(IXML_NodeList **nList, IXML_Node *add); int ixmlNodeList_addToNodeList(IXML_NodeList **nList, IXML_Node *add);

View File

@@ -39,7 +39,7 @@
*=================================================================*/ *=================================================================*/
static void static void
copy_with_escape( INOUT ixml_membuf * buf, copy_with_escape( INOUT ixml_membuf * buf,
IN char *p ) IN const char *p )
{ {
int i; int i;
int plen; int plen;
@@ -87,13 +87,13 @@ void
ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr, ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
IN ixml_membuf * buf ) IN ixml_membuf * buf )
{ {
char *nodeName = NULL; const char *nodeName = NULL;
char *nodeValue = NULL; const char *nodeValue = NULL;
IXML_Node *child = NULL, IXML_Node *child = NULL,
*sibling = NULL; *sibling = NULL;
if( nodeptr != NULL ) { if( nodeptr != NULL ) {
nodeName = ( char * )ixmlNode_getNodeName( nodeptr ); nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
nodeValue = ixmlNode_getNodeValue( nodeptr ); nodeValue = ixmlNode_getNodeValue( nodeptr );
switch ( ixmlNode_getNodeType( nodeptr ) ) { switch ( ixmlNode_getNodeType( nodeptr ) ) {
@@ -103,14 +103,16 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
break; break;
case eCDATA_SECTION_NODE: case eCDATA_SECTION_NODE:
ixml_membuf_append_str( buf, "<![CDATA[" );
ixml_membuf_append_str( buf, nodeValue ); ixml_membuf_append_str( buf, nodeValue );
ixml_membuf_append_str( buf, "]]>" );
break; break;
case ePROCESSING_INSTRUCTION_NODE: case ePROCESSING_INSTRUCTION_NODE:
ixml_membuf_append_str( buf, "<?" ); ixml_membuf_append_str( buf, "<?" );
ixml_membuf_append_str( buf, nodeName ); ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, " " ); ixml_membuf_append_str( buf, " " );
ixml_membuf_append_str( buf, nodeValue ); copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, "?>\n" ); ixml_membuf_append_str( buf, "?>\n" );
break; break;
@@ -122,10 +124,9 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
case eATTRIBUTE_NODE: case eATTRIBUTE_NODE:
ixml_membuf_append_str( buf, nodeName ); ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, "=\"" ); ixml_membuf_append_str( buf, "=\"" );
if( nodeValue != NULL ) { copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, nodeValue );
}
ixml_membuf_append_str( buf, "\"" ); ixml_membuf_append_str( buf, "\"" );
if( nodeptr->nextSibling != NULL ) { if( nodeptr->nextSibling != NULL ) {
ixml_membuf_append_str( buf, " " ); ixml_membuf_append_str( buf, " " );
ixmlPrintDomTreeRecursive( nodeptr->nextSibling, buf ); ixmlPrintDomTreeRecursive( nodeptr->nextSibling, buf );
@@ -145,7 +146,7 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
if( ( child != NULL ) if( ( child != NULL )
&& ( ixmlNode_getNodeType( child ) == && ( ixmlNode_getNodeType( child ) ==
eELEMENT_NODE ) ) { eELEMENT_NODE ) ) {
ixml_membuf_append_str( buf, ">\n" ); ixml_membuf_append_str( buf, ">\r\n" );
} else { } else {
ixml_membuf_append_str( buf, ">" ); ixml_membuf_append_str( buf, ">" );
} }
@@ -163,7 +164,7 @@ ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
&& ixmlNode_getNodeType( sibling ) == eTEXT_NODE ) { && ixmlNode_getNodeType( sibling ) == eTEXT_NODE ) {
ixml_membuf_append_str( buf, ">" ); ixml_membuf_append_str( buf, ">" );
} else { } else {
ixml_membuf_append_str( buf, ">\n" ); ixml_membuf_append_str( buf, ">\r\n" );
} }
ixmlPrintDomTreeRecursive( ixmlNode_getNextSibling ixmlPrintDomTreeRecursive( ixmlNode_getNextSibling
( nodeptr ), buf ); ( nodeptr ), buf );
@@ -187,15 +188,15 @@ void
ixmlPrintDomTree( IN IXML_Node * nodeptr, ixmlPrintDomTree( IN IXML_Node * nodeptr,
IN ixml_membuf * buf ) IN ixml_membuf * buf )
{ {
char *nodeName = NULL; const char *nodeName = NULL;
char *nodeValue = NULL; const char *nodeValue = NULL;
IXML_Node *child = NULL; IXML_Node *child = NULL;
if( ( nodeptr == NULL ) || ( buf == NULL ) ) { if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
return; return;
} }
nodeName = ( char * )ixmlNode_getNodeName( nodeptr ); nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
nodeValue = ixmlNode_getNodeValue( nodeptr ); nodeValue = ixmlNode_getNodeValue( nodeptr );
switch ( ixmlNode_getNodeType( nodeptr ) ) { switch ( ixmlNode_getNodeType( nodeptr ) ) {
@@ -210,7 +211,7 @@ ixmlPrintDomTree( IN IXML_Node * nodeptr,
case eATTRIBUTE_NODE: case eATTRIBUTE_NODE:
ixml_membuf_append_str( buf, nodeName ); ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, "=\"" ); ixml_membuf_append_str( buf, "=\"" );
ixml_membuf_append_str( buf, nodeValue ); copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, "\"" ); ixml_membuf_append_str( buf, "\"" );
break; break;
@@ -226,7 +227,7 @@ ixmlPrintDomTree( IN IXML_Node * nodeptr,
child = ixmlNode_getFirstChild( nodeptr ); child = ixmlNode_getFirstChild( nodeptr );
if( ( child != NULL ) if( ( child != NULL )
&& ( ixmlNode_getNodeType( child ) == eELEMENT_NODE ) ) { && ( ixmlNode_getNodeType( child ) == eELEMENT_NODE ) ) {
ixml_membuf_append_str( buf, ">\n" ); ixml_membuf_append_str( buf, ">\r\n" );
} else { } else {
ixml_membuf_append_str( buf, ">" ); ixml_membuf_append_str( buf, ">" );
} }
@@ -238,7 +239,7 @@ ixmlPrintDomTree( IN IXML_Node * nodeptr,
// Done with children. Output the end tag. // Done with children. Output the end tag.
ixml_membuf_append_str( buf, "</" ); ixml_membuf_append_str( buf, "</" );
ixml_membuf_append_str( buf, nodeName ); ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, ">\n" ); ixml_membuf_append_str( buf, ">\r\n" );
break; break;
default: default:
@@ -258,15 +259,15 @@ void
ixmlDomTreetoString( IN IXML_Node * nodeptr, ixmlDomTreetoString( IN IXML_Node * nodeptr,
IN ixml_membuf * buf ) IN ixml_membuf * buf )
{ {
char *nodeName = NULL; const char *nodeName = NULL;
char *nodeValue = NULL; const char *nodeValue = NULL;
IXML_Node *child = NULL; IXML_Node *child = NULL;
if( ( nodeptr == NULL ) || ( buf == NULL ) ) { if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
return; return;
} }
nodeName = ( char * )ixmlNode_getNodeName( nodeptr ); nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
nodeValue = ixmlNode_getNodeValue( nodeptr ); nodeValue = ixmlNode_getNodeValue( nodeptr );
switch ( ixmlNode_getNodeType( nodeptr ) ) { switch ( ixmlNode_getNodeType( nodeptr ) ) {
@@ -281,7 +282,7 @@ ixmlDomTreetoString( IN IXML_Node * nodeptr,
case eATTRIBUTE_NODE: case eATTRIBUTE_NODE:
ixml_membuf_append_str( buf, nodeName ); ixml_membuf_append_str( buf, nodeName );
ixml_membuf_append_str( buf, "=\"" ); ixml_membuf_append_str( buf, "=\"" );
ixml_membuf_append_str( buf, nodeValue ); copy_with_escape( buf, nodeValue );
ixml_membuf_append_str( buf, "\"" ); ixml_membuf_append_str( buf, "\"" );
break; break;
@@ -324,7 +325,7 @@ ixmlDomTreetoString( IN IXML_Node * nodeptr,
* *
*=================================================================*/ *=================================================================*/
int int
ixmlLoadDocumentEx( IN char *xmlFile, ixmlLoadDocumentEx( IN const char *xmlFile,
IXML_Document ** doc ) IXML_Document ** doc )
{ {
@@ -342,7 +343,7 @@ ixmlLoadDocumentEx( IN char *xmlFile,
* *
*=================================================================*/ *=================================================================*/
IXML_Document * IXML_Document *
ixmlLoadDocument( IN char *xmlFile ) ixmlLoadDocument( IN const char *xmlFile )
{ {
IXML_Document *doc = NULL; IXML_Document *doc = NULL;
@@ -371,7 +372,7 @@ ixmlPrintDocument(IXML_Document *doc)
} }
ixml_membuf_init( buf ); ixml_membuf_init( buf );
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\n" ); ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
ixmlPrintDomTree( rootNode, buf ); ixmlPrintDomTree( rootNode, buf );
return buf->buf; return buf->buf;
@@ -420,7 +421,7 @@ ixmlDocumenttoString(IXML_Document *doc)
} }
ixml_membuf_init( buf ); ixml_membuf_init( buf );
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\n" ); ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
ixmlDomTreetoString( rootNode, buf ); ixmlDomTreetoString( rootNode, buf );
return buf->buf; return buf->buf;
@@ -469,7 +470,7 @@ ixmlRelaxParser(char errorChar)
* *
*=================================================================*/ *=================================================================*/
int int
ixmlParseBufferEx( IN char *buffer, ixmlParseBufferEx( IN const char *buffer,
IXML_Document ** retDoc ) IXML_Document ** retDoc )
{ {
@@ -477,7 +478,7 @@ ixmlParseBufferEx( IN char *buffer,
return IXML_INVALID_PARAMETER; return IXML_INVALID_PARAMETER;
} }
if( strlen( buffer ) == 0 ) { if( buffer[0] == '\0' ) {
return IXML_INVALID_PARAMETER; return IXML_INVALID_PARAMETER;
} }
@@ -491,7 +492,7 @@ ixmlParseBufferEx( IN char *buffer,
* *
*=================================================================*/ *=================================================================*/
IXML_Document * IXML_Document *
ixmlParseBuffer( IN char *buffer ) ixmlParseBuffer( IN const char *buffer )
{ {
IXML_Document *doc = NULL; IXML_Document *doc = NULL;

View File

@@ -232,15 +232,30 @@ static BOOL Parser_ElementPrefixDefined( Parser * myParser,
IXML_Node * newNode, IXML_Node * newNode,
char **nsURI ); char **nsURI );
static int Parser_setElementNamespace( IXML_Element * newElement, static int Parser_setElementNamespace( IXML_Element * newElement,
char *nsURI ); const char *nsURI );
static int Parser_parseDocument( IXML_Document ** retDoc, static int Parser_parseDocument( IXML_Document ** retDoc,
Parser * domParser ); Parser * domParser );
static BOOL Parser_hasDefaultNamespace( Parser * xmlParser, static BOOL Parser_hasDefaultNamespace( Parser * xmlParser,
IXML_Node * newNode, IXML_Node * newNode,
char **nsURI ); char **nsURI );
static int Parser_getChar( IN char *src, static int Parser_getChar( IN const char *src,
INOUT int *cLen ); INOUT int *cLen );
/*==============================================================================*
* safe_strdup
* strdup that handles NULL input.
*
*===============================================================================*/
static char *
safe_strdup(const char *s)
{
assert(s != NULL);
if (s == NULL) {
return strdup("");
}
return strdup(s);
}
/*==============================================================================* /*==============================================================================*
* Parser_isCharInTable * Parser_isCharInTable
* will determine whether character c is in the table of tbl * will determine whether character c is in the table of tbl
@@ -312,9 +327,9 @@ Parser_isNameChar( IN int c,
* *
*===============================================================================*/ *===============================================================================*/
BOOL BOOL
Parser_isValidXmlName( IN DOMString name ) Parser_isValidXmlName( IN const DOMString name )
{ {
char *pstr = NULL; const char *pstr = NULL;
int i = 0, int i = 0,
nameLen = 0; nameLen = 0;
@@ -325,7 +340,7 @@ Parser_isValidXmlName( IN DOMString name )
pstr = name; pstr = name;
if( Parser_isNameChar( *pstr, FALSE ) == TRUE ) { if( Parser_isNameChar( *pstr, FALSE ) == TRUE ) {
for( i = 1; i < nameLen; i++ ) { for( i = 1; i < nameLen; i++ ) {
if( Parser_isNameChar( *( pstr + 1 ), TRUE ) == FALSE ) { //illegal char if( Parser_isNameChar( *( pstr + i ), TRUE ) == FALSE ) { //illegal char
return FALSE; return FALSE;
} }
} }
@@ -419,11 +434,11 @@ Parser_intToUTF8( IN int c,
* *
*===============================================================================*/ *===============================================================================*/
static int static int
Parser_UTF8ToInt( IN char *ss, Parser_UTF8ToInt( IN const char *ss,
OUT int *len ) OUT int *len )
{ {
unsigned char *s = ( unsigned char * )ss; const unsigned char *s = ( const unsigned char * )ss;
int c = *s; int c = *s;
if( c <= 127 ) { // if c<=127, c is just the character. if( c <= 127 ) { // if c<=127, c is just the character.
@@ -525,14 +540,14 @@ Parser_pushElement( IN Parser * xmlParser,
memset( pNewStackElement, 0, sizeof( IXML_ElementStack ) ); memset( pNewStackElement, 0, sizeof( IXML_ElementStack ) );
// the element member includes both prefix and name // the element member includes both prefix and name
pNewStackElement->element = strdup( newElement->nodeName ); pNewStackElement->element = safe_strdup( newElement->nodeName );
if( pNewStackElement->element == NULL ) { if( pNewStackElement->element == NULL ) {
free( pNewStackElement ); free( pNewStackElement );
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
if( newElement->prefix != 0 ) { if( newElement->prefix != 0 ) {
pNewStackElement->prefix = strdup( newElement->prefix ); pNewStackElement->prefix = safe_strdup( newElement->prefix );
if( pNewStackElement->prefix == NULL ) { if( pNewStackElement->prefix == NULL ) {
Parser_freeElementStackItem( pNewStackElement ); Parser_freeElementStackItem( pNewStackElement );
free( pNewStackElement ); free( pNewStackElement );
@@ -542,7 +557,7 @@ Parser_pushElement( IN Parser * xmlParser,
if( newElement->namespaceURI != 0 ) { if( newElement->namespaceURI != 0 ) {
pNewStackElement->namespaceUri = pNewStackElement->namespaceUri =
strdup( newElement->namespaceURI ); safe_strdup( newElement->namespaceURI );
if( pNewStackElement->namespaceUri == NULL ) { if( pNewStackElement->namespaceUri == NULL ) {
Parser_freeElementStackItem( pNewStackElement ); Parser_freeElementStackItem( pNewStackElement );
free( pNewStackElement ); free( pNewStackElement );
@@ -602,7 +617,7 @@ Parser_popElement( IN Parser * xmlParser )
*=================================================================*/ *=================================================================*/
static int static int
Parser_readFileOrBuffer( IN Parser * xmlParser, Parser_readFileOrBuffer( IN Parser * xmlParser,
IN char *xmlFileName, IN const char *xmlFileName,
IN BOOL file ) IN BOOL file )
{ {
int fileSize = 0; int fileSize = 0;
@@ -634,7 +649,7 @@ Parser_readFileOrBuffer( IN Parser * xmlParser,
fclose( xmlFilePtr ); fclose( xmlFilePtr );
} }
} else { } else {
xmlParser->dataBuffer = strdup( xmlFileName ); xmlParser->dataBuffer = safe_strdup( xmlFileName );
if( xmlParser->dataBuffer == NULL ) { if( xmlParser->dataBuffer == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -651,7 +666,7 @@ Parser_readFileOrBuffer( IN Parser * xmlParser,
*=================================================================*/ *=================================================================*/
int int
Parser_LoadDocument( OUT IXML_Document ** retDoc, Parser_LoadDocument( OUT IXML_Document ** retDoc,
IN char *xmlFileName, IN const char *xmlFileName,
IN BOOL file ) IN BOOL file )
{ {
int rc = IXML_SUCCESS; int rc = IXML_SUCCESS;
@@ -1117,10 +1132,10 @@ Parser_skipWhiteSpaces( IN Parser * xmlParser )
* *
*===============================================================================*/ *===============================================================================*/
static int static int
Parser_getChar( IN char *src, Parser_getChar( IN const char *src,
INOUT int *cLen ) INOUT int *cLen )
{ {
char *pnum; const char *pnum;
int sum; int sum;
char c; char c;
int i; int i;
@@ -1213,13 +1228,13 @@ fail_entity:
*===============================================================================*/ *===============================================================================*/
static int static int
Parser_copyToken( IN Parser * xmlParser, Parser_copyToken( IN Parser * xmlParser,
IN char *src, IN const char *src,
IN int len ) IN int len )
{ {
int i, int i,
c, c,
cl; cl;
char *psrc, const char *psrc,
*pend; *pend;
utf8char uch; utf8char uch;
@@ -1563,7 +1578,7 @@ Parser_getNextToken( IN Parser * xmlParser )
*===============================================================================*/ *===============================================================================*/
static char * static char *
Parser_getNameSpace( IN Parser * xmlParser, Parser_getNameSpace( IN Parser * xmlParser,
IN char *prefix ) IN const char *prefix )
{ {
IXML_ElementStack *pCur; IXML_ElementStack *pCur;
IXML_NamespaceURI *pNsUri; IXML_NamespaceURI *pNsUri;
@@ -1597,7 +1612,7 @@ Parser_addNamespace( IN Parser * xmlParser )
{ {
IXML_Node *pNode; IXML_Node *pNode;
IXML_ElementStack *pCur; IXML_ElementStack *pCur;
char *namespaceUri; const char *namespaceUri;
pNode = xmlParser->pNeedPrefixNode; pNode = xmlParser->pNeedPrefixNode;
pCur = xmlParser->pCurElement; pCur = xmlParser->pCurElement;
@@ -1610,7 +1625,7 @@ Parser_addNamespace( IN Parser * xmlParser )
// it would be wrong that pNode->namespace != NULL. // it would be wrong that pNode->namespace != NULL.
assert( pNode->namespaceURI == NULL ); assert( pNode->namespaceURI == NULL );
pNode->namespaceURI = strdup( pCur->namespaceUri ); pNode->namespaceURI = safe_strdup( pCur->namespaceUri );
if( pNode->namespaceURI == NULL ) { if( pNode->namespaceURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -1626,7 +1641,7 @@ Parser_addNamespace( IN Parser * xmlParser )
namespaceUri = Parser_getNameSpace( xmlParser, pCur->prefix ); namespaceUri = Parser_getNameSpace( xmlParser, pCur->prefix );
if( namespaceUri != NULL ) { if( namespaceUri != NULL ) {
pNode->namespaceURI = strdup( namespaceUri ); pNode->namespaceURI = safe_strdup( namespaceUri );
if( pNode->namespaceURI == NULL ) { if( pNode->namespaceURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -1661,7 +1676,7 @@ Parser_setNodePrefixAndLocalName( IN IXML_Node * node )
pStrPrefix = strchr( node->nodeName, ':' ); pStrPrefix = strchr( node->nodeName, ':' );
if( pStrPrefix == NULL ) { if( pStrPrefix == NULL ) {
node->prefix = NULL; node->prefix = NULL;
node->localName = strdup( node->nodeName ); node->localName = safe_strdup( node->nodeName );
if( node->localName == NULL ) { if( node->localName == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -1678,7 +1693,7 @@ Parser_setNodePrefixAndLocalName( IN IXML_Node * node )
memset( node->prefix, 0, nPrefix + 1 ); memset( node->prefix, 0, nPrefix + 1 );
strncpy( node->prefix, node->nodeName, nPrefix ); strncpy( node->prefix, node->nodeName, nPrefix );
node->localName = strdup( pLocalName ); node->localName = safe_strdup( pLocalName );
if( node->localName == NULL ) { if( node->localName == NULL ) {
free( node->prefix ); free( node->prefix );
node->prefix = NULL; //no need to free really, main loop will frees it node->prefix = NULL; //no need to free really, main loop will frees it
@@ -1718,7 +1733,7 @@ Parser_xmlNamespace( IN Parser * xmlParser,
} }
///here it goes to segfault on "" when not copying ///here it goes to segfault on "" when not copying
if(newNode->nodeValue){ if(newNode->nodeValue){
pCur->namespaceUri = strdup( newNode->nodeValue ); pCur->namespaceUri = safe_strdup( newNode->nodeValue );
if( pCur->namespaceUri == NULL ) { if( pCur->namespaceUri == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -1738,7 +1753,7 @@ Parser_xmlNamespace( IN Parser * xmlParser,
if( ( pCur->prefix != NULL ) if( ( pCur->prefix != NULL )
&& ( strcmp( pCur->prefix, newNode->localName ) == 0 ) ) { && ( strcmp( pCur->prefix, newNode->localName ) == 0 ) ) {
pCur->namespaceUri = strdup( newNode->nodeValue ); pCur->namespaceUri = safe_strdup( newNode->nodeValue );
if( pCur->namespaceUri == NULL ) { if( pCur->namespaceUri == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -1765,13 +1780,13 @@ Parser_xmlNamespace( IN Parser * xmlParser,
} }
memset( pNewNs, 0, sizeof( IXML_NamespaceURI ) ); memset( pNewNs, 0, sizeof( IXML_NamespaceURI ) );
pNewNs->prefix = strdup( newNode->localName ); pNewNs->prefix = safe_strdup( newNode->localName );
if( pNewNs->prefix == NULL ) { if( pNewNs->prefix == NULL ) {
free( pNewNs ); free( pNewNs );
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
pNewNs->nsURI = strdup( newNode->nodeValue ); pNewNs->nsURI = safe_strdup( newNode->nodeValue );
if( pNewNs->nsURI == NULL ) { if( pNewNs->nsURI == NULL ) {
Parser_freeNsURI( pNewNs ); Parser_freeNsURI( pNewNs );
free( pNewNs ); free( pNewNs );
@@ -1789,7 +1804,7 @@ Parser_xmlNamespace( IN Parser * xmlParser,
free( pNs->nsURI ); free( pNs->nsURI );
} }
pNs->nsURI = strdup( newNode->nodeValue ); pNs->nsURI = safe_strdup( newNode->nodeValue );
if( pNs->nsURI == NULL ) { if( pNs->nsURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -1826,7 +1841,7 @@ Parser_processSTag( IN Parser * xmlParser,
pCurToken = ( xmlParser->tokenBuf ).buf; pCurToken = ( xmlParser->tokenBuf ).buf;
if( pCurToken != NULL ) { if( pCurToken != NULL ) {
node->nodeName = strdup( pCurToken ); node->nodeName = safe_strdup( pCurToken );
if( node->nodeName == NULL ) { if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -1977,7 +1992,7 @@ Parser_processCDSect( IN char **pSrc,
strncpy( node->nodeValue, pCDataStart, tokenLength ); strncpy( node->nodeValue, pCDataStart, tokenLength );
node->nodeValue[tokenLength] = '\0'; node->nodeValue[tokenLength] = '\0';
node->nodeName = strdup( CDATANODENAME ); node->nodeName = safe_strdup( CDATANODENAME );
if( node->nodeName == NULL ) { if( node->nodeName == NULL ) {
// no need to free node->nodeValue at all, bacause node contents // no need to free node->nodeValue at all, bacause node contents
// will be freed by the main loop. // will be freed by the main loop.
@@ -2002,13 +2017,13 @@ Parser_processCDSect( IN char **pSrc,
*===============================================================================*/ *===============================================================================*/
static int static int
Parser_setElementNamespace( IN IXML_Element * newElement, Parser_setElementNamespace( IN IXML_Element * newElement,
IN char *nsURI ) IN const char *nsURI )
{ {
if( newElement != NULL ) { if( newElement != NULL ) {
if( newElement->n.namespaceURI != NULL ) { if( newElement->n.namespaceURI != NULL ) {
return IXML_SYNTAX_ERR; return IXML_SYNTAX_ERR;
} else { } else {
( newElement->n ).namespaceURI = strdup( nsURI ); ( newElement->n ).namespaceURI = safe_strdup( nsURI );
if( ( newElement->n ).namespaceURI == NULL ) { if( ( newElement->n ).namespaceURI == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -2107,7 +2122,7 @@ Parser_processContent( IN Parser * xmlParser,
pCurToken = ( xmlParser->tokenBuf ).buf; pCurToken = ( xmlParser->tokenBuf ).buf;
if( pCurToken != NULL ) { if( pCurToken != NULL ) {
node->nodeValue = strdup( pCurToken ); node->nodeValue = safe_strdup( pCurToken );
if( node->nodeValue == NULL ) { if( node->nodeValue == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -2115,7 +2130,7 @@ Parser_processContent( IN Parser * xmlParser,
return IXML_SYNTAX_ERR; return IXML_SYNTAX_ERR;
} }
node->nodeName = strdup( TEXTNODENAME ); node->nodeName = safe_strdup( TEXTNODENAME );
if( node->nodeName == NULL ) { if( node->nodeName == NULL ) {
return IXML_SYNTAX_ERR; return IXML_SYNTAX_ERR;
} }
@@ -2152,7 +2167,7 @@ Parser_processETag( IN Parser * xmlParser,
if( pCurToken == NULL ) { if( pCurToken == NULL ) {
return IXML_SYNTAX_ERR; return IXML_SYNTAX_ERR;
} }
node->nodeName = strdup( pCurToken ); node->nodeName = safe_strdup( pCurToken );
if( node->nodeName == NULL ) { if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -2320,7 +2335,7 @@ Parser_processAttribute( IN Parser * xmlParser,
return IXML_SYNTAX_ERR; return IXML_SYNTAX_ERR;
} }
// copy in the attribute name // copy in the attribute name
node->nodeName = strdup( pCurToken ); node->nodeName = safe_strdup( pCurToken );
if( node->nodeName == NULL ) { if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -2373,7 +2388,7 @@ Parser_processAttribute( IN Parser * xmlParser,
pCurToken = ( xmlParser->tokenBuf ).buf; pCurToken = ( xmlParser->tokenBuf ).buf;
if( pCurToken != NULL ) { // attribute has value, like a="c" if( pCurToken != NULL ) { // attribute has value, like a="c"
node->nodeValue = strdup( pCurToken ); node->nodeValue = safe_strdup( pCurToken );
if( node->nodeValue == NULL ) { if( node->nodeValue == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }
@@ -2456,7 +2471,7 @@ Parser_getNextNode( IN Parser * xmlParser,
goto ErrorHandler; goto ErrorHandler;
} }
node->nodeName = strdup( lastElement ); node->nodeName = safe_strdup( lastElement );
if( node->nodeName == NULL ) { if( node->nodeName == NULL ) {
return IXML_INSUFFICIENT_MEMORY; return IXML_INSUFFICIENT_MEMORY;
} }

View File

@@ -41,7 +41,7 @@
*=================================================================*/ *=================================================================*/
unsigned long unsigned long
ixmlNamedNodeMap_getItemNumber( IN IXML_NamedNodeMap * nnMap, ixmlNamedNodeMap_getItemNumber( IN IXML_NamedNodeMap * nnMap,
IN char *name ) IN const char *name )
{ {
IXML_Node *tempNode; IXML_Node *tempNode;
unsigned long returnItemNo = 0; unsigned long returnItemNo = 0;
@@ -92,7 +92,7 @@ ixmlNamedNodeMap_init( IN IXML_NamedNodeMap * nnMap )
*=================================================================*/ *=================================================================*/
IXML_Node * IXML_Node *
ixmlNamedNodeMap_getNamedItem( IN IXML_NamedNodeMap * nnMap, ixmlNamedNodeMap_getNamedItem( IN IXML_NamedNodeMap * nnMap,
IN char *name ) IN const char *name )
{ {
long index; long index;

View File

@@ -175,7 +175,7 @@ ixmlNode_getLocalName( IN IXML_Node * nodeptr )
*=================================================================*/ *=================================================================*/
int int
ixmlNode_setNamespaceURI( IN IXML_Node * nodeptr, ixmlNode_setNamespaceURI( IN IXML_Node * nodeptr,
IN char *namespaceURI ) IN const char *namespaceURI )
{ {
if( nodeptr == NULL ) { if( nodeptr == NULL ) {
@@ -207,7 +207,7 @@ ixmlNode_setNamespaceURI( IN IXML_Node * nodeptr,
*=================================================================*/ *=================================================================*/
int int
ixmlNode_setPrefix( IN IXML_Node * nodeptr, ixmlNode_setPrefix( IN IXML_Node * nodeptr,
IN char *prefix ) IN const char *prefix )
{ {
if( nodeptr == NULL ) { if( nodeptr == NULL ) {
@@ -240,7 +240,7 @@ ixmlNode_setPrefix( IN IXML_Node * nodeptr,
*=================================================================*/ *=================================================================*/
int int
ixmlNode_setLocalName( IN IXML_Node * nodeptr, ixmlNode_setLocalName( IN IXML_Node * nodeptr,
IN char *localName ) IN const char *localName )
{ {
assert( nodeptr != NULL ); assert( nodeptr != NULL );
@@ -288,10 +288,10 @@ ixmlNode_getNamespaceURI( IN IXML_Node * nodeptr )
* the prefix of the node. * the prefix of the node.
* *
*=================================================================*/ *=================================================================*/
DOMString const DOMString
ixmlNode_getPrefix( IN IXML_Node * nodeptr ) ixmlNode_getPrefix( IN IXML_Node * nodeptr )
{ {
DOMString prefix = NULL; const DOMString prefix = NULL;
if( nodeptr != NULL ) { if( nodeptr != NULL ) {
prefix = nodeptr->prefix; prefix = nodeptr->prefix;
@@ -309,7 +309,7 @@ ixmlNode_getPrefix( IN IXML_Node * nodeptr )
* the nodeValue of the node. * the nodeValue of the node.
* *
*=================================================================*/ *=================================================================*/
DOMString const DOMString
ixmlNode_getNodeValue( IN IXML_Node * nodeptr ) ixmlNode_getNodeValue( IN IXML_Node * nodeptr )
{ {
@@ -330,7 +330,7 @@ ixmlNode_getNodeValue( IN IXML_Node * nodeptr )
*=================================================================*/ *=================================================================*/
int int
ixmlNode_setNodeValue( IN IXML_Node * nodeptr, ixmlNode_setNodeValue( IN IXML_Node * nodeptr,
IN char *newNodeValue ) IN const char *newNodeValue )
{ {
int rc = IXML_SUCCESS; int rc = IXML_SUCCESS;
@@ -1425,7 +1425,7 @@ ixmlNode_hasAttributes( IXML_Node * nodeptr )
*=================================================================*/ *=================================================================*/
void void
ixmlNode_getElementsByTagNameRecursive( IN IXML_Node * n, ixmlNode_getElementsByTagNameRecursive( IN IXML_Node * n,
IN char *tagname, IN const char *tagname,
OUT IXML_NodeList ** list ) OUT IXML_NodeList ** list )
{ {
const char *name; const char *name;
@@ -1457,7 +1457,7 @@ ixmlNode_getElementsByTagNameRecursive( IN IXML_Node * n,
*=================================================================*/ *=================================================================*/
void void
ixmlNode_getElementsByTagName( IN IXML_Node * n, ixmlNode_getElementsByTagName( IN IXML_Node * n,
IN char *tagname, IN const char *tagname,
OUT IXML_NodeList ** list ) OUT IXML_NodeList ** list )
{ {
const char *name; const char *name;
@@ -1484,8 +1484,8 @@ ixmlNode_getElementsByTagName( IN IXML_Node * n,
*=================================================================*/ *=================================================================*/
void void
ixmlNode_getElementsByTagNameNSRecursive( IN IXML_Node * n, ixmlNode_getElementsByTagNameNSRecursive( IN IXML_Node * n,
IN char *namespaceURI, IN const char *namespaceURI,
IN char *localName, IN const char *localName,
OUT IXML_NodeList ** list ) OUT IXML_NodeList ** list )
{ {
const DOMString nsURI; const DOMString nsURI;
@@ -1525,8 +1525,8 @@ ixmlNode_getElementsByTagNameNSRecursive( IN IXML_Node * n,
*=================================================================*/ *=================================================================*/
void void
ixmlNode_getElementsByTagNameNS( IN IXML_Node * n, ixmlNode_getElementsByTagNameNS( IN IXML_Node * n,
IN char *namespaceURI, IN const char *namespaceURI,
IN char *localName, IN const char *localName,
OUT IXML_NodeList ** list ) OUT IXML_NodeList ** list )
{ {
const DOMString nsURI; const DOMString nsURI;
@@ -1560,7 +1560,7 @@ ixmlNode_getElementsByTagNameNS( IN IXML_Node * n,
*=================================================================*/ *=================================================================*/
int int
ixmlNode_setNodeName( IN IXML_Node * node, ixmlNode_setNodeName( IN IXML_Node * node,
IN DOMString qualifiedName ) IN const DOMString qualifiedName )
{ {
int rc = IXML_SUCCESS; int rc = IXML_SUCCESS;

View File

@@ -7,6 +7,5 @@ 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} Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp

View File

@@ -1,15 +1,14 @@
Version: 1.4.1 Version: 1.4.2
Summary: Universal Plug and Play (UPnP) SDK Summary: Universal Plug and Play (UPnP) SDK
Name: libupnp Name: libupnp
Release: 1%{?dist} Release: 1%{?dist}
License: BSD License: BSD
Group: System Environment/Libraries Group: System Environment/Libraries
URL: http://www.libupnp.org/ URL: http://www.libupnp.org/
Source: http://puzzle.dl.sourceforge.net/sourceforge/pupnp/%{name}-%{version}.tar.gz Source: http://puzzle.dl.sourceforge.net/sourceforge/pupnp/%{name}-%{version}.tar.bz2
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
%define docdir %{_docdir}/%{name}-%{version}-%{release} %define docdeveldir %{_docdir}/%{name}-devel-%{version}
%define docdeveldir %{_docdir}/%{name}-devel-%{version}-%{release}
%description %description
The Universal Plug and Play (UPnP) SDK for Linux provides The Universal Plug and Play (UPnP) SDK for Linux provides
@@ -29,7 +28,7 @@ the UPnP SDK libraries.
%setup -q %setup -q
%build %build
%configure --with-docdir=%{docdir}/ %configure --with-documentation
make %{?_smp_mflags} make %{?_smp_mflags}
%install %install
@@ -78,6 +77,9 @@ make install DESTDIR=$RPM_BUILD_ROOT
rm -rf %{buildroot} rm -rf %{buildroot}
%changelog %changelog
* Fri Feb 02 2007 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.2-1
- Update to version 1.4.2
* Wed Jul 05 2006 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.1-1 * Wed Jul 05 2006 Eric Tanguy <eric.tanguy@univ-nantes.fr> - 1.4.1-1
- Update to version 1.4.1 - Update to version 1.4.1
@@ -117,3 +119,4 @@ rm -rf %{buildroot}
* Thu Dec 22 2005 Eric Tanguy 1.2.1a-1 * Thu Dec 22 2005 Eric Tanguy 1.2.1a-1
- Modify spec file from - Modify spec file from
http://rpm.pbone.net/index.php3/stat/4/idpl/2378737/com/libupnp-1.2.1a_DSM320-3.i386.rpm.html http://rpm.pbone.net/index.php3/stat/4/idpl/2378737/com/libupnp-1.2.1a_DSM320-3.i386.rpm.html

View File

@@ -1,50 +1,88 @@
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) ##### http://autoconf-archive.cryp.to/acx_pthread.html
dnl #
dnl @summary figure out how to build C programs using POSIX threads # SYNOPSIS
dnl #
dnl This macro figures out how to build C programs using POSIX threads. # ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
dnl It sets the PTHREAD_LIBS output variable to the threads library and #
dnl linker flags, and the PTHREAD_CFLAGS output variable to any special # DESCRIPTION
dnl C compiler flags that are needed. (The user can also force certain #
dnl compiler flags/libs to be tested by setting these environment # This macro figures out how to build C programs using POSIX threads.
dnl variables.) # It sets the PTHREAD_LIBS output variable to the threads library and
dnl # linker flags, and the PTHREAD_CFLAGS output variable to any special
dnl Also sets PTHREAD_CC to any special C compiler that is needed for # C compiler flags that are needed. (The user can also force certain
dnl multi-threaded programs (defaults to the value of CC otherwise). # compiler flags/libs to be tested by setting these environment
dnl (This is necessary on AIX to use the special cc_r compiler alias.) # variables.)
dnl #
dnl NOTE: You are assumed to not only compile your program with these # Also sets PTHREAD_CC to any special C compiler that is needed for
dnl flags, but also link it with them as well. e.g. you should link # multi-threaded programs (defaults to the value of CC otherwise).
dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS # (This is necessary on AIX to use the special cc_r compiler alias.)
dnl $LIBS #
dnl # NOTE: You are assumed to not only compile your program with these
dnl If you are only building threads programs, you may wish to use # flags, but also link it with them as well. e.g. you should link
dnl these variables in your default LIBS, CFLAGS, and CC: # with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
dnl # $LIBS
dnl LIBS="$PTHREAD_LIBS $LIBS" #
dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # If you are only building threads programs, you may wish to use
dnl CC="$PTHREAD_CC" # these variables in your default LIBS, CFLAGS, and CC:
dnl #
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute # LIBS="$PTHREAD_LIBS $LIBS"
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to # CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # CC="$PTHREAD_CC"
dnl #
dnl ACTION-IF-FOUND is a list of shell commands to run if a threads # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to # constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the # that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
dnl default action will define HAVE_PTHREAD. #
dnl # ACTION-IF-FOUND is a list of shell commands to run if a threads
dnl Please let the authors know if this macro fails on any platform, or # library is found, and ACTION-IF-NOT-FOUND is a list of commands to
dnl if you have any other suggestions or comments. This macro was based # run it if it is not found. If ACTION-IF-FOUND is not specified, the
dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with # default action will define HAVE_PTHREAD.
dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros #
dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. # Please let the authors know if this macro fails on any platform, or
dnl We are also grateful for the helpful feedback of numerous users. # if you have any other suggestions or comments. This macro was based
dnl # on work by SGJ on autoconf scripts for FFTW (http://www.fftw.org/)
dnl @category InstalledPackages # (with help from M. Frigo), as well as ac_pthread and hb_pthread
dnl @author Steven G. Johnson <stevenj@alum.mit.edu> # macros posted by Alejandro Forero Cuervo to the autoconf macro
dnl @version 2005-06-15 # repository. We are also grateful for the helpful feedback of
dnl @license GPLWithACException # numerous users.
#
# 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])
@@ -216,8 +254,12 @@ 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 cc_r # More AIX lossage: must compile with xlc_r or cc_r
AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) if test x"$GCC" != xyes; then
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

View File

@@ -1,48 +1,87 @@
dnl @synopsis AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) ##### http://autoconf-archive.cryp.to/ax_cflags_gcc_option.html
dnl #
dnl AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like # SYNOPSIS
dnl "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the #
dnl optionflag to CFLAGS if it is understood. You can override the # AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]])
dnl shellvar-default of CFLAGS of course. The order of arguments stems #
dnl from the explicit macros like AX_CFLAGS_WARN_ALL. # DESCRIPTION
dnl #
dnl The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add # AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like
dnl to CXXFLAGS - and it uses the autoconf setup for C++ instead of C # "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the
dnl (since it is possible to use different compilers for C and C++). # optionflag to CFLAGS if it is understood. You can override the
dnl # shellvar-default of CFLAGS of course. The order of arguments stems
dnl The macro is a lot simpler than any special AX_CFLAGS_* macro (or # from the explicit macros like AX_CFLAGS_WARN_ALL.
dnl ac_cxx_rtti.m4 macro) but allows to check for arbitrary options. #
dnl However, if you use this macro in a few places, it would be great # The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add
dnl if you would make up a new function-macro and submit it to the # to CXXFLAGS - and it uses the autoconf setup for C++ instead of C
dnl ac-archive. # (since it is possible to use different compilers for C and C++).
dnl #
dnl - $1 option-to-check-for : required ("-option" as non-value) # The macro is a lot simpler than any special AX_CFLAGS_* macro (or
dnl - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) # ac_cxx_rtti.m4 macro) but allows to check for arbitrary options.
dnl - $3 action-if-found : add value to shellvariable # However, if you use this macro in a few places, it would be great
dnl - $4 action-if-not-found : nothing # if you would make up a new function-macro and submit it to the
dnl # ac-archive.
dnl note: in earlier versions, $1-$2 were swapped. We try to detect the #
dnl situation and accept a $2=~/-/ as being the old # - $1 option-to-check-for : required ("-option" as non-value)
dnl option-to-check-for. # - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case)
dnl # - $3 action-if-found : add value to shellvariable
dnl also: there are other variants that emerged from the original macro # - $4 action-if-not-found : nothing
dnl variant which did just test an option to be possibly added. #
dnl However, some compilers accept an option silently, or possibly for # note: in earlier versions, $1-$2 were swapped. We try to detect the
dnl just another option that was not intended. Therefore, we have to do # situation and accept a $2=~/-/ as being the old
dnl a generic test for a compiler family. For gcc we check "-pedantic" # option-to-check-for.
dnl being accepted which is also understood by compilers who just want #
dnl to be compatible with gcc even when not being made from gcc # also: there are other variants that emerged from the original macro
dnl sources. # variant which did just test an option to be possibly added.
dnl # However, some compilers accept an option silently, or possibly for
dnl see also: # just another option that was not intended. Therefore, we have to do
dnl # a generic test for a compiler family. For gcc we check "-pedantic"
dnl AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION # being accepted which is also understood by compilers who just want
dnl AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION # to be compatible with gcc even when not being made from gcc
dnl # sources.
dnl @category C #
dnl @author Guido Draheim <guidod@gmx.de> # see also:
dnl @version 2003-11-04 #
dnl @license GPLWithACException # AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION
# AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION
#
# LAST MODIFICATION
#
# 2006-12-12
#
# COPYLEFT
#
# Copyright (c) 2006 Guido U. Draheim <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
@@ -53,7 +92,8 @@ 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 % m4_ifval($2,$2,-option)" dnl GCC in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],
@@ -85,10 +125,11 @@ 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_CXX AC_LANG_CPLUSPLUS
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl for ac_arg dnl
in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC in "-pedantic -Werror % m4_ifval($2,$2,-option)" dnl GCC
"-pedantic % m4_ifval($2,$2,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],
@@ -122,7 +163,8 @@ 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 % m4_ifval($1,$1,-option)" dnl GCC in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],
@@ -154,10 +196,11 @@ 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_CXX AC_LANG_CPLUSPLUS
ac_save_[]FLAGS="$[]FLAGS" ac_save_[]FLAGS="$[]FLAGS"
for ac_arg dnl for ac_arg dnl
in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC in "-pedantic -Werror % m4_ifval($1,$1,-option)" dnl GCC
"-pedantic % m4_ifval($1,$1,-option) %% no, obsolete" dnl new GCC
# #
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
AC_TRY_COMPILE([],[return 0;], AC_TRY_COMPILE([],[return 0;],

View File

@@ -1,27 +1,66 @@
dnl @synopsis AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] ##### http://autoconf-archive.cryp.to/ax_cflags_warn_all.html
dnl #
dnl Try to find a compiler option that enables most reasonable # SYNOPSIS
dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS #
dnl which is split up into two AX_CFLAGS_WARN_ALL and # AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])]
dnl AX_CFLAGS_WARN_ALL_ANSI #
dnl # DESCRIPTION
dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The #
dnl result is added to the shellvar being CFLAGS by default. # Try to find a compiler option that enables most reasonable
dnl # warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
dnl Currently this macro knows about GCC, Solaris C compiler, Digital # which is split up into two AX_CFLAGS_WARN_ALL and
dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C # AX_CFLAGS_WARN_ALL_ANSI
dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos #
dnl 10.0.0.8) C compiler. # For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
dnl # result is added to the shellvar being CFLAGS by default.
dnl - $1 shell-variable-to-add-to : CFLAGS #
dnl - $2 add-value-if-not-found : nothing # Currently this macro knows about GCC, Solaris C compiler, Digital
dnl - $3 action-if-found : add value to shellvariable # Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
dnl - $4 action-if-not-found : nothing # compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
dnl # 10.0.0.8) C compiler.
dnl @category C #
dnl @author Guido Draheim <guidod@gmx.de> # - $1 shell-variable-to-add-to : CFLAGS
dnl @version 2003-01-06 # - $2 add-value-if-not-found : nothing
dnl @license GPLWithACException # - $3 action-if-found : add value to shellvariable
# - $4 action-if-not-found : nothing
#
# LAST MODIFICATION
#
# 2006-12-12
#
# COPYLEFT
#
# Copyright (c) 2006 Guido U. Draheim <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
@@ -72,7 +111,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_CXX AC_LANG_CPLUSPLUS
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
@@ -115,4 +154,5 @@ 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.

View File

@@ -1,27 +1,66 @@
dnl @synopsis AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])] ##### http://autoconf-archive.cryp.to/ax_cflags_warn_all_ansi.html
dnl #
dnl Try to find a compiler option that enables most reasonable # SYNOPSIS
dnl warnings. This macro is directly derived from VL_PROG_CC_WARNINGS #
dnl which is split up into two AX_CFLAGS_WARN_ALL and # AX_CFLAGS_WARN_ALL_ANSI [(shellvar [,default, [A/NA]])]
dnl AX_CFLAGS_WARN_ALL_ANSI #
dnl # DESCRIPTION
dnl For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The #
dnl result is added to the shellvar being CFLAGS by default. # Try to find a compiler option that enables most reasonable
dnl # warnings. This macro is directly derived from VL_PROG_CC_WARNINGS
dnl Currently this macro knows about GCC, Solaris C compiler, Digital # which is split up into two AX_CFLAGS_WARN_ALL and
dnl Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C # AX_CFLAGS_WARN_ALL_ANSI
dnl compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos #
dnl 10.0.0.8) C compiler. # For the GNU CC compiler it will be -Wall (and -ansi -pedantic) The
dnl # result is added to the shellvar being CFLAGS by default.
dnl - $1 shell-variable-to-add-to : CFLAGS #
dnl - $2 add-value-if-not-found : nothing # Currently this macro knows about GCC, Solaris C compiler, Digital
dnl - $3 action-if-found : add value to shellvariable # Unix C compiler, C for AIX Compiler, HP-UX C compiler, IRIX C
dnl - $4 action-if-not-found : nothing # compiler, NEC SX-5 (Super-UX 10) C compiler, and Cray J90 (Unicos
dnl # 10.0.0.8) C compiler.
dnl @category C #
dnl @author Guido Draheim <guidod@gmx.de> # - $1 shell-variable-to-add-to : CFLAGS
dnl @version 2003-01-06 # - $2 add-value-if-not-found : nothing
dnl @license GPLWithACException # - $3 action-if-found : add value to shellvariable
# - $4 action-if-not-found : nothing
#
# LAST MODIFICATION
#
# 2006-12-12
#
# COPYLEFT
#
# Copyright (c) 2006 Guido U. Draheim <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
@@ -77,7 +116,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_CXX AC_LANG_CPLUSPLUS
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,

View File

@@ -1,13 +1,52 @@
dnl @synopsis TYPE_SOCKLEN_T ##### http://autoconf-archive.cryp.to/type_socklen_t.html
dnl #
dnl Check whether sys/socket.h defines type socklen_t. Please note that # SYNOPSIS
dnl some systems require sys/types.h to be included before sys/socket.h #
dnl can be compiled. # TYPE_SOCKLEN_T
dnl #
dnl @category Misc # DESCRIPTION
dnl @author Lars Brinkhoff <lars@nocrew.org> #
dnl @version 2005-01-11 # Check whether sys/socket.h defines type socklen_t. Please note that
dnl @license GPLWithACException # some systems require sys/types.h to be included before sys/socket.h
# 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 Normal file
View File

@@ -0,0 +1,14 @@
.deps
.dirstamp
.libs
.*.swp
*~
Makefile
Makefile.in
aclocal.m4
autoconfig.h*
autom4te.cache
config*
libtool
libupnp.pc
stamp-h*

View File

@@ -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,9 +36,6 @@
extern "C" { extern "C" {
#endif #endif
//#include <malloc.h>
#include "ithread.h" #include "ithread.h"
#include <errno.h> #include <errno.h>
@@ -52,7 +49,7 @@ extern "C" {
*****************************************************************************/ *****************************************************************************/
typedef struct FREELISTNODE typedef struct FREELISTNODE
{ {
struct FREELISTNODE*next; //pointer to next free node struct FREELISTNODE *next;
} FreeListNode; } FreeListNode;
@@ -65,12 +62,10 @@ typedef struct FREELISTNODE
*****************************************************************************/ *****************************************************************************/
typedef struct FREELIST typedef struct FREELIST
{ {
FreeListNode *head; //head of free list FreeListNode *head;
size_t element_size; //size of elements in free size_t element_size;
//list int maxFreeListLength;
int maxFreeListLength; //max size of free structures int freeListLength;
//to keep
int freeListLength; //current size of free list
}FreeList; }FreeList;
@@ -141,4 +136,5 @@ int FreeListDestroy (FreeList *free_list);
} }
#endif #endif
#endif // FREE_LIST_H #endif /* FREE_LIST_H */

View File

@@ -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; //previous node struct LISTNODE *prev;
struct LISTNODE *next; //next node struct LISTNODE *next;
void *item; //item void *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,4 +327,5 @@ int ListSize(LinkedList* list);
} }
#endif #endif
#endif //LINKED_LIST_H #endif /* LINKED_LIST_H */

View File

@@ -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,39 +55,31 @@ 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 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
#ifdef STATS #ifdef STATS
#define STATSONLY(x) x #define STATSONLY(x) x
#else #else
#define STATSONLY(x) #define STATSONLY(x)
#endif #endif
#ifdef _DEBUG #ifdef _DEBUG
#define DEBUG 1 #define DEBUG 1
#endif
//DEBUGGING
#ifndef WIN32
#ifdef DEBUG
#define DBGONLY(x) x
#else
#define DBGONLY(x)
#endif
#endif #endif
#include "LinkedList.h" #include "LinkedList.h"
@@ -100,7 +92,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
@@ -119,23 +111,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 starvationTime; //the time a low priority or med priority int maxJobsTotal; /* maximum number of jobs that can be queued totally. */
//job waits before getting bumped
//up a priority (in milliseconds)
PolicyType schedPolicy; //scheduling policy to use int starvationTime; /* the time a low priority or med priority
job waits before getting bumped
up a priority (in milliseconds) */
PolicyType schedPolicy; /* scheduling policy to use */
} ThreadPoolAttr; } ThreadPoolAttr;
@@ -147,12 +141,12 @@ typedef struct THREADPOOLATTR
*****************************************************************************/ *****************************************************************************/
typedef struct THREADPOOLJOB typedef struct THREADPOOLJOB
{ {
start_routine func; //function start_routine func;
void *arg; //arg void *arg;
free_routine free_func; //free function free_routine free_func;
struct timeb requestTime; //time of request struct timeb requestTime;
int priority; //priority of request int priority;
int jobId; //id int jobId;
} ThreadPoolJob; } ThreadPoolJob;
/**************************************************************************** /****************************************************************************
@@ -162,32 +156,32 @@ typedef struct THREADPOOLJOB
* Structure to hold statistics * Structure to hold statistics
*****************************************************************************/ *****************************************************************************/
STATSONLY( #ifdef STATS
typedef struct TPOOLSTATS typedef struct TPOOLSTATS
{ {
double totalTimeHQ; //total time spent by all jobs in high priority Q double totalTimeHQ;
int totalJobsHQ; //total jobs in HQ run so far int totalJobsHQ;
double avgWaitHQ; //average wait in HQ double avgWaitHQ;
double totalTimeMQ; //total time spent by all jobs in med priority Q double totalTimeMQ;
int totalJobsMQ; //total jobs in MQ run so far int totalJobsMQ;
double avgWaitMQ; //average wait in MQ double avgWaitMQ;
double totalTimeLQ; //total time spent by all jobs in low priority Q double totalTimeLQ;
int totalJobsLQ; //total jobs in LQ run so far int totalJobsLQ;
double avgWaitLQ; //average wait in LQ double avgWaitLQ;
double totalWorkTime; //total time spent working for all threads double totalWorkTime;
double totalIdleTime; //total time spent idle for all threads double totalIdleTime;
int workerThreads; //number of current workerThreads int workerThreads;
int idleThreads; //number of current idle threads int idleThreads;
int persistentThreads; //number of persistent threads int persistentThreads;
int totalThreads; //total number of current threads int totalThreads;
int maxThreads; //max threads so far int maxThreads;
int currentJobsHQ; // current jobs in Q int currentJobsHQ;
int currentJobsLQ; //current jobs in Q int currentJobsLQ;
int currentJobsMQ; //current jobs in Q int currentJobsMQ;
}ThreadPoolStats; }ThreadPoolStats;
) #endif
/**************************************************************************** /****************************************************************************
@@ -212,24 +206,26 @@ 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 */
//statistics #ifdef STATS
STATSONLY(ThreadPoolStats stats;) /* statistics */
ThreadPoolStats stats;
#endif
} ThreadPool; } ThreadPool;
@@ -521,6 +517,19 @@ int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime);
int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy); int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy);
/****************************************************************************
* Function: TPAttrSetMaxJobsTotal
*
* Description:
* Sets the maximum number jobs that can be qeued totally.
* Parameters:
* attr - must be valid thread pool attributes.
* maxJobsTotal - maximum number of jobs
* Returns:
* Always returns 0.
*****************************************************************************/
int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal);
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolGetStats * Function: ThreadPoolGetStats
* *
@@ -534,12 +543,19 @@ int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy);
* Returns: * Returns:
* Always returns 0. * Always returns 0.
*****************************************************************************/ *****************************************************************************/
STATSONLY( EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);); #ifdef STATS
EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);
STATSONLY(EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats);); EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats);
#else
static UPNP_INLINE int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats) {}
static UPNP_INLINE void ThreadPoolPrintStats(ThreadPoolStats *stats) {}
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif //ThreadPool #endif /* ThreadPool */

View File

@@ -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; //mutex to protect eventQ ithread_mutex_t mutex;
ithread_cond_t condition; //condition variable ithread_cond_t condition;
int lastEventId; //last event id int lastEventId;
LinkedList eventQ; //event q LinkedList eventQ;
int shutdown; //whether or not we are shutdown int shutdown;
FreeList freeEvents; //FreeList for events FreeList freeEvents;
ThreadPool *tp; //ThreadPool to use ThreadPool *tp;
} 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; //id of job int id;
} TimerEvent; } TimerEvent;
@@ -188,4 +188,5 @@ int TimerThreadShutdown(TimerThread *timer);
} }
#endif #endif
#endif //TIMER_THREAD_H #endif /* TIMER_THREAD_H */

View File

@@ -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>

View File

@@ -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,129 +36,164 @@ 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
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP #ifdef __FreeBSD__
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP #define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP #endif
#ifdef PTHREAD_MUTEX_RECURSIVE
/* This system has SuS2-compliant mutex attributes.
* E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
*/
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
#else /* PTHREAD_MUTEX_RECURSIVE */
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_FAST_NP
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE_NP
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK_NP
#endif /* PTHREAD_MUTEX_RECURSIVE */
#define ITHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE
#define ITHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED
#define ITHREAD_CANCELED PTHREAD_CANCELED #define ITHREAD_CANCELED PTHREAD_CANCELED
/*************************************************************************** /***************************************************************************
* Name: ithread_t * Name: ithread_t
* *
* Description: * Description:
* Thread handle. * Thread handle.
* typedef to pthread_t. * typedef to pthread_t.
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef pthread_t ithread_t; typedef pthread_t ithread_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_attr_t * Name: ithread_attr_t
* *
* Description: * Description:
* Thread attribute. * Thread attribute.
* typedef to pthread_attr_t * typedef to pthread_attr_t
* Internal Use Only * Internal Use Only
***************************************************************************/ ***************************************************************************/
typedef pthread_attr_t ithread_attr_t; typedef pthread_attr_t ithread_attr_t;
/**************************************************************************** /****************************************************************************
* Name: start_routine * Name: start_routine
* *
* Description: * Description:
* Thread start routine * Thread start routine
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef void * (*start_routine) (void *arg); typedef void * (*start_routine) (void *arg);
/**************************************************************************** /****************************************************************************
* Name: ithread_cond_t * Name: ithread_cond_t
* *
* Description: * Description:
* condition variable. * condition variable.
* typedef to pthread_cond_t * typedef to pthread_cond_t
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef pthread_cond_t ithread_cond_t; typedef pthread_cond_t ithread_cond_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_mutexattr_t * Name: ithread_mutexattr_t
* *
* Description: * Description:
* Mutex attribute. * Mutex attribute.
* typedef to pthread_mutexattr_t * typedef to pthread_mutexattr_t
* Internal Use Only * Internal Use Only
***************************************************************************/ ***************************************************************************/
typedef pthread_mutexattr_t ithread_mutexattr_t; typedef pthread_mutexattr_t ithread_mutexattr_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_mutex_t * Name: ithread_mutex_t
* *
* Description: * Description:
* Mutex. * Mutex.
* typedef to pthread_mutex_t * typedef to pthread_mutex_t
* Internal Use Only. * Internal Use Only.
***************************************************************************/ ***************************************************************************/
typedef pthread_mutex_t ithread_mutex_t; typedef pthread_mutex_t ithread_mutex_t;
/**************************************************************************** /****************************************************************************
* Name: ithread_condattr_t * Name: ithread_condattr_t
* *
* Description: * Description:
* Condition attribute. * Condition attribute.
* typedef to pthread_condattr_t * typedef to pthread_condattr_t
* NOT USED * NOT USED
* Internal Use Only * Internal Use Only
***************************************************************************/ ***************************************************************************/
typedef pthread_condattr_t ithread_condattr_t; typedef pthread_condattr_t ithread_condattr_t;
/****************************************************************************
* Function: ithread_mutexattr_init
*
* Description:
* Initializes a mutex attribute variable.
* Used to set the type of the mutex.
* Parameters:
* ithread_mutexattr_init * attr (must be valid non NULL pointer to
* pthread_mutexattr_t)
* Returns:
* 0 on success, Nonzero on failure.
* Always returns 0.
* See man page for pthread_mutexattr_init
***************************************************************************/
/****************************************************************************
* 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
*
* Description:
* Initializes a mutex attribute variable.
* Used to set the type of the mutex.
* Parameters:
* ithread_mutexattr_init * attr (must be valid non NULL pointer to
* pthread_mutexattr_t)
* Returns:
* 0 on success, Nonzero on failure.
* Always returns 0.
* See man page for pthread_mutexattr_init
***************************************************************************/
#define ithread_mutexattr_init pthread_mutexattr_init #define ithread_mutexattr_init pthread_mutexattr_init
/****************************************************************************
* Function: ithread_mutexattr_destroy /****************************************************************************
* * Function: ithread_mutexattr_destroy
* Description: *
* Releases any resources held by the mutex attribute. * Description:
* Currently there are no resources associated with the attribute * Releases any resources held by the mutex attribute.
* Parameters: * Currently there are no resources associated with the attribute
* ithread_mutexattr_t * attr (must be valid non NULL pointer to * Parameters:
* pthread_mutexattr_t) * ithread_mutexattr_t * attr (must be valid non NULL pointer to
* Returns: * pthread_mutexattr_t)
* 0 on success, Nonzero on failure. * Returns:
* Always returns 0. * 0 on success, Nonzero on failure.
* See man page for pthread_mutexattr_destroy * Always returns 0.
***************************************************************************/ * See man page for pthread_mutexattr_destroy
***************************************************************************/
#define ithread_mutexattr_destroy pthread_mutexattr_destroy #define ithread_mutexattr_destroy pthread_mutexattr_destroy
@@ -172,7 +207,7 @@ extern "C" {
* ITHREAD_MUTEX_ERRORCHECK_NP * ITHREAD_MUTEX_ERRORCHECK_NP
* *
* Parameters: * Parameters:
* ithread_mutexattr_t * mutex (must be valid non NULL pointer to * ithread_mutexattr_t * attr (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)
@@ -181,8 +216,11 @@ extern "C" {
* 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
*****************************************************************************/ *****************************************************************************/
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np #ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
#else
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
#endif
/**************************************************************************** /****************************************************************************
* Function: ithread_mutexattr_getkind_np * Function: ithread_mutexattr_getkind_np
@@ -194,7 +232,7 @@ extern "C" {
* ITHREAD_MUTEX_ERRORCHECK_NP * ITHREAD_MUTEX_ERRORCHECK_NP
* *
* Parameters: * Parameters:
* ithread_mutexattr_t * mutex (must be valid non NULL pointer to * ithread_mutexattr_t * attr (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)
@@ -203,7 +241,11 @@ extern "C" {
* Always returns 0. * Always returns 0.
* See man page for pthread_mutexattr_getkind_np * See man page for pthread_mutexattr_getkind_np
*****************************************************************************/ *****************************************************************************/
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np #ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
#else
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
#endif
/**************************************************************************** /****************************************************************************
@@ -223,6 +265,7 @@ extern "C" {
*****************************************************************************/ *****************************************************************************/
#define ithread_mutex_init pthread_mutex_init #define ithread_mutex_init pthread_mutex_init
/**************************************************************************** /****************************************************************************
* Function: ithread_mutex_lock * Function: ithread_mutex_lock
* *
@@ -277,6 +320,169 @@ extern "C" {
#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
* *
@@ -527,26 +733,29 @@ extern "C" {
#define imillisleep(x) usleep(1000*x) #define imillisleep(x) usleep(1000*x)
#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)
#endif #endif
#else #else
#define EXPORT_SPEC #define EXPORT_SPEC
#endif #endif
#else #else
#define EXPORT_SPEC #define EXPORT_SPEC
#endif #endif
//NK: Added for satisfying the gcc compiler #ifndef PTHREAD_MUTEX_RECURSIVE
/* 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 */

View File

@@ -30,7 +30,8 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#include "LinkedList.h" #include "LinkedList.h"
#ifdef __FreeBSD__ #include <sys/param.h>
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__)
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <malloc.h> #include <malloc.h>

View File

@@ -34,9 +34,7 @@
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef STATS
#include <stdio.h> #include <stdio.h>
#endif
/**************************************************************************** /****************************************************************************
* Function: CmpThreadPoolJob * Function: CmpThreadPoolJob
@@ -92,15 +90,23 @@ FreeThreadPoolJob( ThreadPool * tp,
static int static int
SetPolicyType( PolicyType in ) SetPolicyType( PolicyType in )
{ {
#ifdef WIN32 #ifdef __CYGWIN__
/* 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);
#else #elif defined(_POSIX_PRIORITY_SCHEDULING) && _POSIX_PRIORITY_SCHEDULING > 0
struct sched_param current; struct sched_param current;
sched_getparam( 0, &current ); sched_getparam( 0, &current );
current.sched_priority = DEFAULT_SCHED_PARAM; current.sched_priority = DEFAULT_SCHED_PARAM;
return sched_setscheduler( 0, in, &current ); return sched_setscheduler( 0, in, &current );
#endif #else
return 0;
#endif
} }
/**************************************************************************** /****************************************************************************
@@ -120,7 +126,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;
@@ -128,7 +134,7 @@ SetPriority( ThreadPriority priority )
int midPriority = 0; int midPriority = 0;
struct sched_param newPriority; struct sched_param newPriority;
pthread_getschedparam( ithread_self( ), &currentPolicy, pthread_getschedparam( ithread_self(), &currentPolicy,
&newPriority ); &newPriority );
minPriority = sched_get_priority_min( currentPolicy ); minPriority = sched_get_priority_min( currentPolicy );
maxPriority = sched_get_priority_max( currentPolicy ); maxPriority = sched_get_priority_max( currentPolicy );
@@ -150,9 +156,11 @@ SetPriority( ThreadPriority priority )
newPriority.sched_priority = actPriority; newPriority.sched_priority = actPriority;
return pthread_setschedparam( ithread_self( ), currentPolicy, return pthread_setschedparam( ithread_self(), currentPolicy,
&newPriority ); &newPriority );
#else
return 0;
#endif
} }
/**************************************************************************** /****************************************************************************
@@ -217,10 +225,8 @@ 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 );
@@ -238,10 +244,8 @@ 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 );
@@ -290,14 +294,26 @@ 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 {
stats->avgWaitMQ = 0; //average wait in MQ 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;
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
/**************************************************************************** /****************************************************************************
@@ -343,18 +359,25 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
* Parameters: * Parameters:
* *
*****************************************************************************/ *****************************************************************************/
static void SetSeed( ) { static void SetSeed() {
struct timeb t; struct timeb t;
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__) #elif defined(__FreeBSD__) || defined(__OSX__)
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
} }
/**************************************************************************** /****************************************************************************
* Function: WorkerThread * Function: WorkerThread
@@ -372,8 +395,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
*****************************************************************************/ *****************************************************************************/
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;
@@ -397,10 +419,9 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
ithread_cond_broadcast( &tp->start_and_shutdown ); ithread_cond_broadcast( &tp->start_and_shutdown );
ithread_mutex_unlock( &tp->mutex ); ithread_mutex_unlock( &tp->mutex );
SetSeed( ); SetSeed();
STATSONLY( time( &start ); STATSONLY( time( &start ); )
);
while( 1 ) { while( 1 ) {
@@ -415,12 +436,9 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
retCode = 0; retCode = 0;
STATSONLY( tp->stats.idleThreads++; STATSONLY( tp->stats.idleThreads++; )
); STATSONLY( tp->stats.totalWorkTime += ( time( NULL ) - start ); ) //work time
STATSONLY( tp->stats.totalWorkTime += ( time( NULL ) - start ); STATSONLY( time( &start ); ) // idle time
); //work time
STATSONLY( time( &start );
); //idle time
if( persistent == 1 ) { if( persistent == 1 ) {
//Persistent thread //Persistent thread
@@ -428,8 +446,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
tp->persistentThreads--; tp->persistentThreads--;
} }
STATSONLY( if( persistent == 0 ) STATSONLY( if( persistent == 0 ) tp->stats.workerThreads--; )
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 )
@@ -450,7 +467,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
&& ( ( 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 );
@@ -472,12 +489,9 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
} }
STATSONLY( tp->stats.idleThreads--; STATSONLY( tp->stats.idleThreads--; )
); STATSONLY( tp->stats.totalIdleTime += ( time( NULL ) - start ); ) // idle time
STATSONLY( tp->stats.totalIdleTime += ( time( NULL ) - start ); STATSONLY( time( &start ); ) // work time
); //idle time
STATSONLY( time( &start );
); //work time
//bump priority of starved jobs //bump priority of starved jobs
BumpPriority( tp ); BumpPriority( tp );
@@ -509,34 +523,33 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
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 STATSONLY( CalcWaitTime( tp, HIGH_PRIORITY, job ); )
( 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 );
@@ -641,9 +654,11 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
} }
STATSONLY( if( tp->stats.maxThreads < tp->totalThreads ) { #ifdef STATS
tp->stats.maxThreads = tp->totalThreads;} if( tp->stats.maxThreads < tp->totalThreads ) {
) tp->stats.maxThreads = tp->totalThreads;
}
#endif
return rc; return rc;
} }
@@ -671,7 +686,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
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;
@@ -763,7 +778,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
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 );
@@ -906,6 +921,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
int rc = EOUTOFMEM; int rc = EOUTOFMEM;
int tempId = -1; int tempId = -1;
int totalJobs;
ThreadPoolJob *temp = NULL; ThreadPoolJob *temp = NULL;
@@ -922,6 +938,13 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
|| ( job->priority == MED_PRIORITY ) || ( job->priority == MED_PRIORITY )
|| ( job->priority == HIGH_PRIORITY ) ); || ( job->priority == HIGH_PRIORITY ) );
totalJobs = tp->highJobQ.size + tp->lowJobQ.size + tp->medJobQ.size;
if (totalJobs >= tp->attr.maxJobsTotal) {
fprintf(stderr, "total jobs = %d, too many jobs", totalJobs);
ithread_mutex_unlock( &tp->mutex );
return rc;
}
if( jobId == NULL ) if( jobId == NULL )
jobId = &tempId; jobId = &tempId;
@@ -1267,6 +1290,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
attr->minThreads = DEFAULT_MIN_THREADS; attr->minThreads = DEFAULT_MIN_THREADS;
attr->schedPolicy = DEFAULT_POLICY; attr->schedPolicy = DEFAULT_POLICY;
attr->starvationTime = DEFAULT_STARVATION_TIME; attr->starvationTime = DEFAULT_STARVATION_TIME;
attr->maxJobsTotal = DEFAULT_MAX_JOBS_TOTAL;
return 0; return 0;
} }
@@ -1487,36 +1511,58 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
} }
#ifdef STATS #ifdef STATS
void ThreadPoolPrintStats( ThreadPoolStats * stats ) { void ThreadPoolPrintStats(ThreadPoolStats * stats)
assert( stats != NULL ); if( stats == NULL ) { {
return;} assert( stats != NULL );
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 #else /* __FreeBSD__ */
printf( "ThreadPoolStats at Time: %ld\n", time( NULL ) ); printf("ThreadPoolStats at Time: %ld\n", time(NULL));
#endif #endif /* __FreeBSD__ */
printf printf("High Jobs pending: %d\n", stats->currentJobsHQ);
( "Average Wait in High Priority Q in milliseconds: %f\n", printf("Med Jobs Pending: %d\n", stats->currentJobsMQ);
stats->avgWaitHQ ); printf("Low Jobs Pending: %d\n", stats->currentJobsLQ);
printf printf("Average Wait in High Priority Q in milliseconds: %f\n", stats->avgWaitHQ);
( "Average Wait in Med Priority Q in milliseconds: %f\n", printf("Average Wait in Med Priority Q in milliseconds: %f\n", stats->avgWaitMQ);
stats->avgWaitMQ ); printf("Averate Wait in Low Priority Q in milliseconds: %f\n", stats->avgWaitLQ);
printf printf("Max Threads Active: %d\n", stats->maxThreads);
( "Averate Wait in Low Priority Q in milliseconds: %f\n", printf("Current Worker Threads: %d\n", stats->workerThreads);
stats->avgWaitLQ ); printf("Current Persistent Threads: %d\n", stats->persistentThreads);
printf( "Max Threads Active: %d\n", stats->maxThreads ); printf("Current Idle Threads: %d\n", stats->idleThreads);
printf( "Current Worker Threads: %d\n", printf("Total Threads : %d\n", stats->totalThreads);
stats->workerThreads ); printf("Total Time spent Working in seconds: %f\n", stats->totalWorkTime);
printf( "Current Persistent Threads: %d\n", printf("Total Time spent Idle in seconds : %f\n", stats->totalIdleTime);
stats->persistentThreads ); }
printf( "Current Idle Threads: %d\n", stats->idleThreads ); #endif /* STATS */
printf( "Total Threads : %d\n", stats->totalThreads );
printf( "Total Time spent Working in seconds: %f\n", /****************************************************************************
stats->totalWorkTime ); * Function: TPAttrSetMaxJobsTotal
printf( "Total Time spent Idle in seconds : %f\n", *
stats->totalIdleTime );} * Description:
#endif * Sets the maximum number jobs that can be qeued totally.
* Parameters:
* attr - must be valid thread pool attributes.
* maxJobsTotal - maximum number of jobs
* Returns:
* Always returns 0.
*****************************************************************************/
int TPAttrSetMaxJobsTotal(
ThreadPoolAttr * attr,
int maxJobsTotal )
{
assert( attr != NULL );
if( attr == NULL ) {
return EINVAL;
}
attr->maxJobsTotal = maxJobsTotal;
return 0;
}
/**************************************************************************** /****************************************************************************
* Function: ThreadPoolGetStats * Function: ThreadPoolGetStats
@@ -1533,40 +1579,54 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
*****************************************************************************/ *****************************************************************************/
#ifdef STATS #ifdef STATS
int int
ThreadPoolGetStats( ThreadPool * tp, ThreadPoolGetStats(
ThreadPoolStats * stats ) { ThreadPool *tp,
ThreadPoolStats *stats)
{
assert(tp != NULL);
assert(stats != NULL);
assert( tp != NULL ); if (tp == NULL || stats == NULL) {
assert( stats != NULL ); return EINVAL;
if( ( tp == NULL ) || ( stats == NULL ) ) { }
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; if( stats->totalJobsHQ > 0 ) *stats = tp->stats;
stats->avgWaitHQ = if (stats->totalJobsHQ > 0) {
stats->totalTimeHQ / stats->totalJobsHQ; stats->avgWaitHQ = stats->totalTimeHQ / stats->totalJobsHQ;
else } else {
stats->avgWaitHQ = 0; if( stats->totalJobsMQ > 0 ) stats->avgWaitHQ = 0;
stats->avgWaitMQ = }
stats->totalTimeMQ / stats->totalJobsMQ;
else
stats->avgWaitMQ = 0; if( stats->totalJobsLQ > 0 )
stats->avgWaitLQ =
stats->totalTimeLQ / stats->totalJobsLQ;
else
stats->avgWaitLQ = 0;
stats->totalThreads = tp->totalThreads;
stats->persistentThreads = tp->persistentThreads;
stats->currentJobsHQ = ListSize( &tp->highJobQ );
stats->currentJobsLQ = ListSize( &tp->lowJobQ );
stats->currentJobsMQ = ListSize( &tp->medJobQ );
//if not shutdown then release mutex
if( !tp->shutdown ) {
ithread_mutex_unlock( &tp->mutex );}
return 0;} if( stats->totalJobsMQ > 0 ) {
stats->avgWaitMQ = stats->totalTimeMQ / stats->totalJobsMQ;
} else {
stats->avgWaitMQ = 0;
}
if( stats->totalJobsLQ > 0 ) {
stats->avgWaitLQ = stats->totalTimeLQ / stats->totalJobsLQ;
} else {
stats->avgWaitLQ = 0;
}
stats->totalThreads = tp->totalThreads;
stats->persistentThreads = tp->persistentThreads;
stats->currentJobsHQ = ListSize( &tp->highJobQ );
stats->currentJobsLQ = ListSize( &tp->lowJobQ );
stats->currentJobsMQ = ListSize( &tp->medJobQ );
//if not shutdown then release mutex
if( !tp->shutdown ) {
ithread_mutex_unlock( &tp->mutex );
}
return 0;
}
#endif /* STATS */
#endif

View File

@@ -31,7 +31,8 @@
#include <stdarg.h> #include <stdarg.h>
#include <assert.h> #include <assert.h>
#ifdef __FreeBSD__ #include <sys/param.h>
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__)
#include <stdlib.h> #include <stdlib.h>
#else #else
#include <malloc.h> #include <malloc.h>

View File

@@ -1,164 +1,153 @@
# $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 SUBDIRS = doc . sample
AM_CPPFLAGS = -I$(srcdir)/inc \ AM_CPPFLAGS = \
-I$(top_srcdir)/threadutil/inc \ -I$(srcdir)/inc \
-I$(top_srcdir)/ixml/inc -I$(top_srcdir)/threadutil/inc \
-I$(top_srcdir)/ixml/inc
AM_CFLAGS = $(PTHREAD_CFLAGS) AM_CFLAGS = $(PTHREAD_CFLAGS)
AM_LDFLAGS = $(PTHREAD_LIBS) AM_LDFLAGS = $(PTHREAD_LIBS)
LDADD = libupnp.la \ LDADD = \
$(top_builddir)/threadutil/libthreadutil.la \ libupnp.la \
$(top_builddir)/ixml/libixml.la $(top_builddir)/threadutil/libthreadutil.la \
$(top_builddir)/ixml/libixml.la
upnpincludedir = $(includedir)/upnp upnpincludedir = $(includedir)/upnp
upnpinclude_HEADERS = inc/upnp.h upnpinclude_HEADERS = \
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
if ENABLE_DEBUG
upnpinclude_HEADERS += inc/upnpdebug.h
endif endif
lib_LTLIBRARIES = libupnp.la
libupnp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/src/inc lib_LTLIBRARIES = libupnp.la
libupnp_la_LDFLAGS = -version-info $(LT_VERSION_UPNP) \
-export-symbols-regex '^Upnp.*' \
$(top_builddir)/threadutil/libthreadutil.la \
$(top_builddir)/ixml/libixml.la
libupnp_la_SOURCES = \ libupnp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/src/inc
src/inc/config.h \
src/inc/client_table.h src/inc/global.h \ libupnp_la_LDFLAGS = \
src/inc/md5.h src/inc/ssdplib.h \ -version-info $(LT_VERSION_UPNP) \
src/inc/unixutil.h src/inc/urlconfig.h \ -export-symbols-regex '^Upnp.*' \
src/inc/gmtdate.h src/inc/membuffer.h \ $(top_builddir)/threadutil/libthreadutil.la \
src/inc/server.h src/inc/statcodes.h \ $(top_builddir)/ixml/libixml.la
src/inc/upnpapi.h src/inc/utilall.h \
src/inc/gena_ctrlpt.h src/inc/http_client.h \ libupnp_la_SOURCES = \
src/inc/miniserver.h src/inc/service_table.h \ src/inc/config.h \
src/inc/statuscodes.h src/inc/upnpclosesocket.h \ src/inc/client_table.h \
src/inc/util.h src/inc/gena_device.h \ src/inc/gena.h \
src/inc/httpparser.h src/inc/netall.h \ src/inc/gena_ctrlpt.h \
src/inc/soaplib.h src/inc/strintmap.h \ src/inc/gena_device.h \
src/inc/upnp_timeout.h src/inc/uuid.h \ src/inc/global.h \
src/inc/gena.h src/inc/httpreadwrite.h \ src/inc/gmtdate.h \
src/inc/parsetools.h src/inc/sock.h \ src/inc/http_client.h \
src/inc/sysdep.h src/inc/uri.h \ src/inc/httpparser.h \
src/inc/webserver.h src/inc/httpreadwrite.h \
src/inc/md5.h \
src/inc/membuffer.h \
src/inc/miniserver.h \
src/inc/netall.h \
src/inc/parsetools.h \
src/inc/server.h \
src/inc/service_table.h \
src/inc/soaplib.h \
src/inc/sock.h \
src/inc/statcodes.h \
src/inc/statuscodes.h \
src/inc/strintmap.h \
src/inc/ssdplib.h \
src/inc/sysdep.h \
src/inc/unixutil.h \
src/inc/upnpapi.h \
src/inc/upnpclosesocket.h \
src/inc/upnp_timeout.h \
src/inc/uri.h \
src/inc/urlconfig.h \
src/inc/util.h \
src/inc/utilall.h \
src/inc/uuid.h \
src/inc/webserver.h
# ssdp # ssdp
libupnp_la_SOURCES += src/ssdp/ssdp_device.c src/ssdp/ssdp_ctrlpt.c \ libupnp_la_SOURCES += \
src/ssdp/ssdp_server.c src/ssdp/ssdp_device.c \
src/ssdp/ssdp_ctrlpt.c \
src/ssdp/ssdp_server.c
# soap # soap
libupnp_la_SOURCES += src/soap/soap_device.c src/soap/soap_ctrlpt.c \ libupnp_la_SOURCES += \
src/soap/soap_common.c src/soap/soap_device.c \
src/soap/soap_ctrlpt.c \
src/soap/soap_common.c
# genlib # genlib
libupnp_la_SOURCES += \ libupnp_la_SOURCES += \
src/genlib/miniserver/miniserver.c \ src/genlib/miniserver/miniserver.c \
src/genlib/service_table/service_table.c \ src/genlib/service_table/service_table.c \
src/genlib/util/membuffer.c \ src/genlib/util/membuffer.c \
src/genlib/util/strintmap.c \ src/genlib/util/strintmap.c \
src/genlib/util/upnp_timeout.c \ src/genlib/util/upnp_timeout.c \
src/genlib/util/util.c \ src/genlib/util/util.c \
src/genlib/client_table/client_table.c \ src/genlib/client_table/client_table.c \
src/genlib/net/sock.c \ src/genlib/net/sock.c \
src/genlib/net/http/httpparser.c \ src/genlib/net/http/httpparser.c \
src/genlib/net/http/httpreadwrite.c \ src/genlib/net/http/httpreadwrite.c \
src/genlib/net/http/statcodes.c \ src/genlib/net/http/statcodes.c \
src/genlib/net/http/webserver.c \ src/genlib/net/http/webserver.c \
src/genlib/net/http/parsetools.c \ src/genlib/net/http/parsetools.c \
src/genlib/net/uri/uri.c src/genlib/net/uri/uri.c
# gena # gena
libupnp_la_SOURCES += src/gena/gena_device.c src/gena/gena_ctrlpt.c \ libupnp_la_SOURCES += \
src/gena/gena_callback2.c src/gena/gena_device.c \
src/gena/gena_ctrlpt.c \
src/gena/gena_callback2.c
# api # api
libupnp_la_SOURCES += src/api/upnpapi.c libupnp_la_SOURCES += src/api/upnpapi.c
if ENABLE_TOOLS if ENABLE_TOOLS
libupnp_la_SOURCES += src/api/upnptools.c libupnp_la_SOURCES += src/api/upnptools.c
endif endif
if ENABLE_DEBUG if ENABLE_DEBUG
libupnp_la_SOURCES += src/api/upnpdebug.c libupnp_la_SOURCES += src/api/upnpdebug.c
endif endif
# uuid # uuid
libupnp_la_SOURCES += src/uuid/md5.c src/uuid/sysdep.c src/uuid/uuid.c libupnp_la_SOURCES += \
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_DOCDIR
docdir = @DOCDIR@
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 = LICENSE \ EXTRA_DIST = \
sample/tvdevice/web/tvcontrolSCPD.xml \ LICENSE \
sample/tvdevice/web/tvdevicedesc.xml \ src/inc/inet_pton.h \
sample/tvdevice/web/tvdevicepres.html \ src/inet_pton.c \
sample/tvdevice/web/tvpictureSCPD.xml \ src/win_dll.c
src/inc/inet_pton.h \
src/inet_pton.c \
src/win_dll.c
CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt
CLEANFILES = \
IUpnpErrFile.txt \
IUpnpInfoFile.txt

View File

@@ -1,83 +1,124 @@
/////////////////////////////////////////////////////////////////////////// /*******************************************************************************
// *
// 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 __GNUC__
#warning libupnp requires largefile mode - use AC_SYS_LARGEFILE
#else
#error libupnp requires largefile mode - use AC_SYS_LARGEFILE
#endif
#endif
#include <stdio.h> #include <stdio.h>
#ifdef __FreeBSD__ #include <sys/param.h>
#include <time.h> #if (defined(BSD) && BSD >= 199306)
#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)
#endif #endif
#else #else
#define EXPORT_SPEC #define EXPORT_SPEC
#endif #endif
#ifdef UPNP_USE_MSVCPP
/* define some things the M$ VC++ doesn't know */
#define UPNP_INLINE
typedef __int64 int64_t;
#define PRId64 "I64d"
#define PRIzu "lu"
#endif
#ifdef UPNP_USE_BCBPP
/* define some things Borland Builder doesn't know */
#define UPNP_INLINE inline
typedef __int64 int64_t;
#warning The Borland C compiler is probably broken on PRId64, please someone provide a proper fix here
#define PRId64 "I64d"
#define PRIzu "zu"
#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
#ifndef WIN32 /*
#define UpnpCloseSocket close * Defining this macro here gives some interesting information about unused
#else * functions in the code. Of course, this should never go uncommented on a
#define UpnpCloseSocket closesocket * release.
#endif */
#define UPNP_SOCKETERROR -1 /*#define inline*/
#define UPNP_INVALID_SOCKET -1
#ifndef WIN32
#define SOCKET int
#endif
#ifndef WIN32 #ifndef WIN32
#include <netinet/in.h> #define UpnpCloseSocket close
#else #else
#include <winsock2.h> #define UpnpCloseSocket closesocket
#include <time.h> #define fseeko fseek
#endif #endif
#define UPNP_SOCKETERROR -1
#define UPNP_INVALID_SOCKET -1
#ifndef WIN32
#define SOCKET int
#endif
#ifndef WIN32
#include <netinet/in.h>
#else
#include <winsock2.h>
#include <time.h>
#endif
#include <sys/types.h>
#define NUM_HANDLE 200 #define NUM_HANDLE 200
#define LINE_SIZE 180 #define LINE_SIZE 180
@@ -87,7 +128,6 @@
#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
@@ -99,7 +139,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.
@@ -107,35 +147,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
@@ -144,9 +184,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
@@ -154,9 +194,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
@@ -165,9 +205,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
@@ -175,9 +215,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
@@ -188,18 +228,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
@@ -208,26 +248,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
@@ -243,18 +283,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
@@ -263,9 +303,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
@@ -274,9 +314,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
@@ -285,9 +325,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
@@ -297,9 +337,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
@@ -309,9 +349,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
@@ -321,36 +361,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
@@ -359,9 +399,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
@@ -369,58 +409,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
@@ -429,26 +469,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
@@ -462,10 +502,12 @@
#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
@@ -488,9 +530,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
@@ -518,9 +560,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
@@ -549,9 +591,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
@@ -782,51 +824,47 @@ 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. */
int ErrCode;
/** The result code of the {\bf UpnpSearchAsync} call. */ /** The expiration time of the advertisement. */
int ErrCode; int Expires;
/** The expiration time of the advertisement. */ /** The unique device identifier. */
int Expires; char DeviceId[LINE_SIZE];
/** The unique device identifier. */ /** The device type. */
char DeviceId[LINE_SIZE]; char DeviceType[LINE_SIZE];
/** The device type. */ /** The service type. */
char DeviceType[LINE_SIZE]; char ServiceType[LINE_SIZE];
/** The service type. */ /** The service version. */
char ServiceType[LINE_SIZE]; char ServiceVer[LINE_SIZE];
/** The service version. */ /** The URL to the UPnP description document for the device. */
char ServiceVer[LINE_SIZE]; char Location[LINE_SIZE];
/** The URL to the UPnP description document for the device. */ /** The operating system the device is running. */
char Location[LINE_SIZE]; char Os[LINE_SIZE];
/** The operating system the device is running. */ /** Date when the response was generated. */
char Os[LINE_SIZE]; char Date[LINE_SIZE];
/** Date when the response was generated. */ /** Confirmation that the MAN header was understood by the device. */
char Date[LINE_SIZE]; char Ext[LINE_SIZE];
/** Confirmation that the MAN header was understood by the device. */
char Ext[LINE_SIZE];
/** The host address of the device responding to the search. */
SOCKADDRIN * DestAddr;
/** The host address of the device responding to the search. */
struct sockaddr_in DestAddr;
}; };
/** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf /** Returned along with a {\bf UPNP_EVENT_SUBSCRIBE_COMPLETE} or {\bf
@@ -875,7 +913,7 @@ struct File_Info
/** The length of the file. A length less than 0 indicates the size /** The length of the file. A length less than 0 indicates the size
* is unknown, and data will be sent until 0 bytes are returned from * is unknown, and data will be sent until 0 bytes are returned from
* a read call. */ * a read call. */
int file_length; off_t file_length;
/** The time at which the contents of the file was modified; /** The time at which the contents of the file was modified;
* The time system is always local (not GMT). */ * The time system is always local (not GMT). */
@@ -969,7 +1007,7 @@ struct UpnpVirtualDirCallbacks
int (*seek) ( int (*seek) (
IN UpnpWebFileHandle fileHnd, /** The handle of the file to move the IN UpnpWebFileHandle fileHnd, /** The handle of the file to move the
file pointer. */ file pointer. */
IN long offset, /** The number of bytes to move in the IN off_t offset, /** The number of bytes to move in the
file. Positive values move foward and file. Positive values move foward and
negative values move backward. Note negative values move backward. Note
that this must be positive if the that this must be positive if the
@@ -1030,14 +1068,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}
@@ -1348,18 +1386,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
@@ -1418,18 +1456,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.
@@ -1652,18 +1690,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.
@@ -2166,19 +2204,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
@@ -2571,18 +2609,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
@@ -2698,13 +2736,13 @@ 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

View File

@@ -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,6 +91,5 @@
#undef UPNP_HAVE_TOOLS #undef UPNP_HAVE_TOOLS
#endif // UPNP_CONFIG_H #endif /* UPNP_CONFIG_H */

View File

@@ -1,43 +1,41 @@
/////////////////////////////////////////////////////////////////////////// /*******************************************************************************
// *
// 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
@@ -49,7 +47,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,
@@ -70,18 +68,25 @@ extern "C" {
* \end{itemize} * \end{itemize}
*/ */
typedef enum Upnp_Module {SSDP,SOAP,GENA,TPOOL,MSERV,DOM,API, HTTP} Dbg_Module; typedef enum Upnp_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
/** /**
@@ -98,26 +103,32 @@ 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
// for backward compatibility static UPNP_INLINE int UpnpInitLog() { return UPNP_E_SUCCESS; }
#define InitLog UpnpInitLog #endif
/*************************************************************************** /***************************************************************************
* Function : UpnpSetLogLevel * Function : UpnpSetLogLevel
* *
* Parameters: void * Parameters: Upnp_LogLevel log_level
* *
* 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
***************************************************************************/ ***************************************************************************/
void UpnpSetLogLevel (Upnp_LogLevel); #ifdef DEBUG
void UpnpSetLogLevel(Upnp_LogLevel log_level);
#else
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
#endif
/*************************************************************************** /***************************************************************************
@@ -129,10 +140,11 @@ void UpnpSetLogLevel (Upnp_LogLevel);
* This functions closes the log files * This functions closes the log files
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
#ifdef DEBUG
void UpnpCloseLog(); void UpnpCloseLog();
#else
// for backward compatibility static UPNP_INLINE void UpnpCloseLog() {}
#define CloseLog UpnpCloseLog #endif
/*************************************************************************** /***************************************************************************
@@ -149,17 +161,22 @@ void UpnpCloseLog();
* per the requested banner * per the requested banner
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
void UpnpSetLogFileNames (const char* ErrFileName, const char* InfoFileName); #ifdef DEBUG
void UpnpSetLogFileNames(
// for backward compatibility const char *ErrFileName,
#define SetLogFileNames UpnpSetLogFileNames const char *InfoFileName);
#else
static UPNP_INLINE void UpnpSetLogFileNames(
const char *ErrFileName,
const char *InfoFileName) {}
#endif
/*************************************************************************** /***************************************************************************
* Function : UpnpGetDebugFile * Function : UpnpGetDebugFile
* *
* Parameters: * Parameters:
* IN Dbg_Level DLevel: The level of the debug logging. It will decide * IN Upnp_LogLevel 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
@@ -171,17 +188,47 @@ void UpnpSetLogFileNames (const char* ErrFileName, const char* InfoFileName);
* 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
***************************************************************************/ ***************************************************************************/
FILE* UpnpGetDebugFile (Upnp_LogLevel level, Dbg_Module module); #ifdef DEBUG
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 Dbg_Level DLevel: The level of the debug logging. It will decide * IN Upnp_LogLevel 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
@@ -198,14 +245,28 @@ FILE* UpnpGetDebugFile (Upnp_LogLevel level, Dbg_Module module);
* debug statement is coming * debug statement is coming
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module, #ifdef DEBUG
const char* DbgFileName, int DbgLineNo, void UpnpPrintf(
const char* FmtStr, Upnp_LogLevel DLevel,
...) Dbg_Module Module,
const char* DbgFileName,
int DbgLineNo,
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 */
/*************************************************************************** /***************************************************************************
@@ -222,8 +283,19 @@ void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
* per the requested banner * per the requested banner
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
void UpnpDisplayBanner (FILE *fd, #ifdef DEBUG
const char** lines, size_t size, int starlength); void UpnpDisplayBanner(
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
/*************************************************************************** /***************************************************************************
@@ -240,19 +312,23 @@ void UpnpDisplayBanner (FILE *fd,
* debug statement is coming to the log file * debug statement is coming to the log file
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
void UpnpDisplayFileAndLine (FILE *fd, const char *DbgFileName, int DbgLineNo); #ifdef DEBUG
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_HAVE_DEBUG #endif /* UPNP_DEBUG_H */
#endif // UPNP_DEBUG_H

View File

@@ -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,14 +217,13 @@ 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 */

87
upnp/sample/Makefile.am Normal file
View File

@@ -0,0 +1,87 @@
#
# "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

View File

@@ -0,0 +1,489 @@
///////////////////////////////////////////////////////////////////////////
//
// 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

View File

@@ -0,0 +1,158 @@
///////////////////////////////////////////////////////////////////////////
//
// 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

View File

@@ -0,0 +1,638 @@
///////////////////////////////////////////////////////////////////////////
//
// 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

View File

@@ -1362,7 +1362,7 @@ TvCtrlPointStart( print_string printFunctionPtr,
ithread_mutex_init( &DeviceListMutex, 0 ); ithread_mutex_init( &DeviceListMutex, 0 );
SampleUtil_Print( "Intializing UPnP with ipaddress=%s port=%d", SampleUtil_Print( "Initializing 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 ) {

View File

@@ -1974,9 +1974,7 @@ TvDeviceStart( char *ip_address,
ip_address = UpnpGetServerIpAddress( ); ip_address = UpnpGetServerIpAddress( );
} }
if( port == 0 ) {
port = UpnpGetServerPort( ); port = UpnpGetServerPort( );
}
SampleUtil_Print( "UPnP Initialized\n \t ipaddress= %s port = %d\n", SampleUtil_Print( "UPnP Initialized\n \t ipaddress= %s port = %d\n",
ip_address, port ); ip_address, port );

View File

@@ -0,0 +1,37 @@
<?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>

View File

@@ -7,7 +7,6 @@
</specVersion> </specVersion>
<actionList> <actionList>
<action> <action>
@@ -38,6 +37,12 @@
<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 />
@@ -45,11 +50,6 @@
<direction>out</direction> <direction>out</direction>
</argument> </argument>
<argument>
<name>Channel</name>
<relatedStateVariable>Channel</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList> </argumentList>
</action> </action>
@@ -80,6 +80,11 @@
<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>
@@ -87,11 +92,6 @@
<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,9 +124,6 @@
</actionList> </actionList>
<serviceStateTable> <serviceStateTable>
<stateVariable sendEvents="yes"> <stateVariable sendEvents="yes">

View File

@@ -12,6 +12,12 @@
<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 />
@@ -19,11 +25,6 @@
<direction>out</direction> <direction>out</direction>
</argument> </argument>
<argument>
<name>Color</name>
<relatedStateVariable>Color</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList> </argumentList>
</action> </action>
@@ -54,19 +55,19 @@
<action> <action>
<name>SetTint</name> <name>SetTint</name>
<argumentList> <argumentList>
<argument> <argument>
<name>Tint</name>
<relatedStateVariable>Tint</relatedStateVariable>
<direction>in</direction>
</argument>
<argument>
<name>NewTint</name> <name>NewTint</name>
<retval /> <retval />
<relatedStateVariable>Tint</relatedStateVariable> <relatedStateVariable>Tint</relatedStateVariable>
<direction>out</direction> <direction>out</direction>
</argument> </argument>
<argument> </argumentList>
<name>Tint</name>
<relatedStateVariable>Tint</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action> </action>
<action> <action>
@@ -96,18 +97,18 @@
<action> <action>
<name>SetContrast</name> <name>SetContrast</name>
<argumentList> <argumentList>
<argument> <argument>
<name>Contrast</name>
<relatedStateVariable>Contrast</relatedStateVariable>
<direction>in</direction>
</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> </argumentList>
<name>Contrast</name>
<relatedStateVariable>Contrast</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action> </action>
<action> <action>
@@ -137,19 +138,17 @@
<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>
@@ -182,7 +181,6 @@
</actionList> </actionList>
<serviceStateTable> <serviceStateTable>
<stateVariable sendEvents="yes"> <stateVariable sendEvents="yes">

File diff suppressed because it is too large Load Diff

View File

@@ -94,12 +94,13 @@ 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
***************************************************************************/ ***************************************************************************/
int int
UpnpInitLog( ) UpnpInitLog()
{ {
ithread_mutex_init( &GlobalDebugMutex, NULL ); ithread_mutex_init( &GlobalDebugMutex, NULL );
@@ -116,7 +117,7 @@ UpnpInitLog( )
/*************************************************************************** /***************************************************************************
* Function : UpnpSetLogLevel * Function : UpnpSetLogLevel
* *
* Parameters: void * Parameters: Upnp_LogLevel log_level
* *
* Description: * Description:
* This functions set the log level (see {\tt Upnp_LogLevel} * This functions set the log level (see {\tt Upnp_LogLevel}
@@ -139,7 +140,7 @@ UpnpSetLogLevel (Upnp_LogLevel log_level)
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
void void
UpnpCloseLog( ) UpnpCloseLog()
{ {
if( DEBUG_TARGET == 1 ) { if( DEBUG_TARGET == 1 ) {
fflush( ErrFileHnd ); fflush( ErrFileHnd );
@@ -152,11 +153,47 @@ 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 Dbg_Level DLevel: The level of the debug logging. It will decide * IN Upnp_LogLevel 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
@@ -173,71 +210,53 @@ UpnpCloseLog( )
* statement is coming * statement is coming
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
DBGONLY( void UpnpPrintf( IN Upnp_LogLevel DLevel, #ifdef DEBUG
IN Dbg_Module Module, void UpnpPrintf(
IN const char *DbgFileName, IN Upnp_LogLevel DLevel,
IN int DbgLineNo, IN Dbg_Module Module,
IN const char *FmtStr, IN const char *DbgFileName,
... ) { IN int DbgLineNo,
IN const char *FmtStr,
... )
{
va_list ArgList;
va_list ArgList; if (!DebugAtThisLevel(DLevel, Module)) {
va_start( ArgList, FmtStr ); return;
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 ) { ithread_mutex_lock(&GlobalDebugMutex);
if( DbgFileName ) { va_start(ArgList, FmtStr);
UpnpDisplayFileAndLine( stdout, DbgFileName, DbgLineNo );} if (!DEBUG_TARGET) {
vfprintf( stdout, FmtStr, ArgList ); fflush( stdout );} if( DbgFileName ) {
else UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);
{ }
if( DLevel == 0 ) { vfprintf(stdout, FmtStr, ArgList);
if( DbgFileName ) { fflush(stdout);
UpnpDisplayFileAndLine( ErrFileHnd, DbgFileName, DbgLineNo );} } else if (DLevel == 0) {
vfprintf( ErrFileHnd, FmtStr, ArgList ); fflush( ErrFileHnd );} if (DbgFileName) {
else UpnpDisplayFileAndLine(ErrFileHnd, DbgFileName, DbgLineNo);
{ }
if( DbgFileName ) { vfprintf(ErrFileHnd, FmtStr, ArgList);
UpnpDisplayFileAndLine( InfoFileHnd, DbgFileName, DbgLineNo );} fflush(ErrFileHnd);
vfprintf( InfoFileHnd, FmtStr, ArgList ); fflush( InfoFileHnd );} } else {
} if (DbgFileName) {
va_end( ArgList ); ithread_mutex_unlock( &GlobalDebugMutex );} UpnpDisplayFileAndLine(InfoFileHnd, DbgFileName, DbgLineNo);
}
) vfprintf(InfoFileHnd, FmtStr, ArgList);
fflush(InfoFileHnd);
}
va_end(ArgList);
ithread_mutex_unlock(&GlobalDebugMutex);
}
#endif
/*************************************************************************** /***************************************************************************
* Function : UpnpGetDebugFile * Function : UpnpGetDebugFile
* *
* Parameters: * Parameters:
* IN Dbg_Level DLevel: The level of the debug logging. It will decide * IN Upnp_LogLevel 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
@@ -249,46 +268,26 @@ return; default:
* 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
***************************************************************************/ ***************************************************************************/
DBGONLY( FILE * GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module ) { #ifdef DEBUG
if( g_log_level < DLevel ) return NULL; if( DEBUG_ALL == 0 ) { FILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module )
switch ( Module ) { {
case SSDP: FILE *ret;
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 ) { if (!DebugAtThisLevel(DLevel, Module)) {
return stdout;} ret = NULL;
else }
{
if( DLevel == 0 ) { if (!DEBUG_TARGET) {
return ErrFileHnd;} ret = stdout;
else } else if (DLevel == 0) {
{ ret = ErrFileHnd;
return InfoFileHnd;} } else {
} ret = InfoFileHnd;
} }
)
return ret;
}
#endif
/*************************************************************************** /***************************************************************************
@@ -305,17 +304,26 @@ return NULL; default:
* debug statement is coming to the log file * debug statement is coming to the log file
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
DBGONLY( void UpnpDisplayFileAndLine( IN FILE * fd, #ifdef DEBUG
IN const char *DbgFileName, void UpnpDisplayFileAndLine(
IN int DbgLineNo ) { IN FILE * fd,
int starlength = 66; IN const char *DbgFileName,
const char *lines[2]; IN int DbgLineNo)
char FileAndLine[500]; lines[0] = "DEBUG"; if( DbgFileName ) { {
sprintf( FileAndLine, "FILE: %s, LINE: %d", DbgFileName, int starlength = 66;
DbgLineNo ); lines[1] = FileAndLine;} const char *lines[2];
char FileAndLine[500];
UpnpDisplayBanner( fd, lines, 2, starlength ); fflush( fd );} lines[0] = "DEBUG";
) if (DbgFileName) {
sprintf(FileAndLine,
"FILE: %s, LINE: %d",
DbgFileName, DbgLineNo);
lines[1] = FileAndLine;
}
UpnpDisplayBanner(fd, lines, 2, starlength);
fflush(fd);
}
#endif
/*************************************************************************** /***************************************************************************
@@ -332,47 +340,58 @@ return NULL; default:
* per the requested banner * per the requested banner
* Returns: void * Returns: void
***************************************************************************/ ***************************************************************************/
DBGONLY( void UpnpDisplayBanner( IN FILE * fd, #ifdef DEBUG
IN const char **lines, void UpnpDisplayBanner(
IN size_t size, IN FILE * fd,
IN int starLength ) { IN const char **lines,
char *stars = ( char * )malloc( starLength + 1 ); IN size_t size,
const char *line = NULL; IN int starLength)
int leftMarginLength = starLength / 2 + 1; {
int rightMarginLength = starLength / 2 + 1; int leftMarginLength = starLength / 2 + 1;
char *leftMargin = ( char * )malloc( leftMarginLength ); int rightMarginLength = starLength / 2 + 1;
char *rightMargin = ( char * )malloc( rightMarginLength ); int i = 0;
int i = 0; int LineSize = 0;
int LineSize = 0; int starLengthMinus2 = starLength - 2;
char *currentLine = ( char * )malloc( starLength + 1 );
memset( stars, '*', starLength );
stars[starLength] = 0;
memset( leftMargin, 0, leftMarginLength );
memset( rightMargin, 0, rightMarginLength );
fprintf( fd, "\n%s\n", stars ); for( i = 0; i < size; i++ ) {
LineSize = strlen( lines[i] );
line = lines[i]; while( LineSize > ( starLength - 2 ) ) {
memcpy( currentLine, line, ( starLength - 2 ) );
currentLine[( starLength - 2 )] = 0;
fprintf( fd, "*%s*\n", currentLine );
LineSize -= ( starLength - 2 ); line += ( starLength - 2 );}
if( LineSize % 2 == 0 ) { char *leftMargin = ( char * )malloc( leftMarginLength );
leftMarginLength = rightMarginLength = char *rightMargin = ( char * )malloc( rightMarginLength );
( ( starLength - 2 ) - LineSize ) / 2;} char *stars = ( char * )malloc( starLength + 1 );
else char *currentLine = ( char * )malloc( starLength + 1 );
{ const char *line = NULL;
leftMarginLength = ( ( starLength - 2 ) - LineSize ) / 2;
rightMarginLength =
( ( starLength - 2 ) - LineSize ) / 2 + 1;}
memset( leftMargin, ' ', leftMarginLength ); memset( stars, '*', starLength );
memset( rightMargin, ' ', rightMarginLength ); stars[starLength] = 0;
leftMargin[leftMarginLength] = 0; memset( leftMargin, 0, leftMarginLength );
rightMargin[rightMarginLength] = 0; memset( rightMargin, 0, rightMarginLength );
fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin );} fprintf( fd, "\n%s\n", stars );
for( i = 0; i < size; i++ ) {
LineSize = strlen( lines[i] );
line = lines[i];
while( LineSize > starLengthMinus2 ) {
memcpy( currentLine, line, starLengthMinus2 );
currentLine[starLengthMinus2] = 0;
fprintf( fd, "*%s*\n", currentLine );
LineSize -= starLengthMinus2;
line += starLengthMinus2;
}
leftMarginLength = (starLengthMinus2 - LineSize)/2;
if( LineSize % 2 == 0 ) {
rightMarginLength = leftMarginLength;
} else {
rightMarginLength = leftMarginLength + 1;
}
memset( leftMargin, ' ', leftMarginLength );
memset( rightMargin, ' ', rightMarginLength );
leftMargin[leftMarginLength] = 0;
rightMargin[rightMarginLength] = 0;
fprintf( fd, "*%s%s%s*\n", leftMargin, line, rightMargin );
}
fprintf( fd, "%s\n\n", stars );
free( currentLine );
free( stars );
free( rightMargin );
free( leftMargin );
}
#endif
fprintf( fd, "%s\n\n", stars );
free( leftMargin );
free( rightMargin ); free( stars ); free( currentLine );}
)

View File

@@ -36,7 +36,7 @@
#include "uri.h" #include "uri.h"
#define HEADER_LENGTH 2000 #define HEADER_LENGTH 2000
//Structure to maintain a error code and string associated with the // Structure to maintain a error code and string associated with the
// error code // error code
struct ErrorString { struct ErrorString {
int rc; /* error code */ int rc; /* error code */
@@ -44,7 +44,7 @@ struct ErrorString {
}; };
//Intializing the array of error structures. // Initializing 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"},
@@ -155,7 +155,7 @@ UpnpResolveURL( IN const char *BaseURL,
* *
* Parameters: * Parameters:
* IN int response: flag to tell if the ActionDoc is for response * IN int response: flag to tell if the ActionDoc is for response
* or request * or request
* INOUT IXML_Document **ActionDoc: request or response document * INOUT IXML_Document **ActionDoc: request or response document
* IN char *ActionName: Name of the action request or response * IN char *ActionName: Name of the action request or response
* IN char *ServType: Service type * IN char *ServType: Service type
@@ -196,11 +196,12 @@ addToAction( IN int response,
if( response ) { if( response ) {
sprintf( ActBuff, sprintf( ActBuff,
"<u:%sResponse xmlns:u=\"%s\"></u:%sResponse>", "<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
ActionName, ServType, ActionName ); ActionName, ServType, ActionName );
} else { } else {
sprintf( ActBuff, "<u:%s xmlns:u=\"%s\"></u:%s>", sprintf( ActBuff,
ActionName, ServType, ActionName ); "<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
ActionName, ServType, ActionName );
} }
rc = ixmlParseBufferEx( ActBuff, ActionDoc ); rc = ixmlParseBufferEx( ActBuff, ActionDoc );
@@ -233,7 +234,7 @@ addToAction( IN int response,
* *
* Parameters: * Parameters:
* IN int response: flag to tell if the ActionDoc is for response * IN int response: flag to tell if the ActionDoc is for response
* or request * or request
* IN char * ActionName: Name of the action request or response * IN char * ActionName: Name of the action request or response
* IN char * ServType: Service type * IN char * ServType: Service type
* IN int NumArg :Number of arguments in the action request or response * IN int NumArg :Number of arguments in the action request or response
@@ -255,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;
*ArgValue; const char *ArgValue;
char *ActBuff; char *ActBuff;
int Idx = 0; int Idx = 0;
IXML_Document *ActionDoc; IXML_Document *ActionDoc;
@@ -274,11 +275,13 @@ makeAction( IN int response,
} }
if( response ) { if( response ) {
sprintf( ActBuff, "<u:%sResponse xmlns:u=\"%s\"></u:%sResponse>", sprintf( ActBuff,
ActionName, ServType, ActionName ); "<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
ActionName, ServType, ActionName );
} else { } else {
sprintf( ActBuff, "<u:%s xmlns:u=\"%s\"></u:%s>", sprintf( ActBuff,
ActionName, ServType, ActionName ); "<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
ActionName, ServType, ActionName );
} }
if( ixmlParseBufferEx( ActBuff, &ActionDoc ) != IXML_SUCCESS ) { if( ixmlParseBufferEx( ActBuff, &ActionDoc ) != IXML_SUCCESS ) {
@@ -295,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;
while( Idx++ != NumArg ) { for ( ; ; ) {
ArgValue = va_arg( ArgList, const char * ); ArgValue = va_arg( ArgList, const char * );
if( ArgName != NULL ) { if( ArgName != NULL ) {
@@ -310,7 +313,11 @@ makeAction( IN int response,
ixmlNode_appendChild( node, ( IXML_Node * ) Ele ); ixmlNode_appendChild( node, ( IXML_Node * ) Ele );
} }
ArgName = va_arg( ArgList, const char * ); if (++Idx < NumArg) {
ArgName = va_arg( ArgList, const char * );
} else {
break;
}
} }
//va_end(ArgList); //va_end(ArgList);
} }
@@ -574,4 +581,5 @@ UpnpCreatePropertySet( IN int NumArg,
return PropSet; return PropSet;
} }
#endif #endif // EXCLUDE_DOM == 0

View File

@@ -93,37 +93,35 @@ genaCallback( IN http_parser_t * parser,
xboolean found_function = FALSE; xboolean found_function = FALSE;
if( request->method == HTTPMETHOD_SUBSCRIBE ) { if( request->method == HTTPMETHOD_SUBSCRIBE ) {
DEVICEONLY( found_function = TRUE; #ifdef INCLUDE_DEVICE_APIS
if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) found_function = TRUE;
{ 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 );} }
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
"got subscription request\n" );
} else if( request->method == HTTPMETHOD_UNSUBSCRIBE ) {
found_function = TRUE;
// unsubscribe
gena_process_unsubscribe_request( info, request );
#endif
} else if( request->method == HTTPMETHOD_NOTIFY ) {
#ifdef INCLUDE_CLIENT_APIS
found_function = TRUE;
// notify
gena_process_notification_event( info, request );
#endif
}
DBGONLY( UpnpPrintf if( !found_function ) {
( UPNP_ALL, GENA, __FILE__, __LINE__,
"got subscription request\n" ); )
)
}
else
if( request->method == HTTPMETHOD_UNSUBSCRIBE ) {
DEVICEONLY( found_function = TRUE;
// unsubscribe
gena_process_unsubscribe_request( info,
request ); )
} else if( request->method == HTTPMETHOD_NOTIFY ) {
CLIENTONLY( found_function = TRUE;
// notify
gena_process_notification_event( info, request ); )
}
if( !found_function ) {
// handle missing functions of device or ctrl pt // handle missing functions of device or ctrl pt
error_respond( info, HTTP_NOT_IMPLEMENTED, request ); error_respond( info, HTTP_NOT_IMPLEMENTED, request );
}
} }
}
#endif // EXCLUDE_GENA #endif // EXCLUDE_GENA

View File

@@ -72,14 +72,14 @@ GenaAutoRenewSubscription( IN void *input )
int eventType = 0; int eventType = 0;
if( AUTO_RENEW_TIME == 0 ) { if( AUTO_RENEW_TIME == 0 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 {
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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,17 +93,17 @@ GenaAutoRenewSubscription( IN void *input )
} }
} }
if( send_callback ) { if( send_callback ) {
HandleLock( ); HandleReadLock();
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;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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();
//make callback //make callback
callback_fun( eventType, event->Event, cookie ); callback_fun( eventType, event->Event, cookie );
@@ -219,10 +219,11 @@ gena_unsubscribe( IN char *url,
// make request msg // make request msg
membuffer_init( &request ); membuffer_init( &request );
request.size_inc = 30; request.size_inc = 30;
return_code = http_MakeMessage( &request, 1, 1, return_code = http_MakeMessage(
"q" "ssc" "U" "c", &request, 1, 1,
HTTPMETHOD_UNSUBSCRIBE, &dest_url, "q" "ssc" "Uc",
"SID: ", sid ); HTTPMETHOD_UNSUBSCRIBE, &dest_url,
"SID: ", sid );
//Not able to make the message so destroy the existing buffer //Not able to make the message so destroy the existing buffer
if( return_code != 0 ) { if( return_code != 0 ) {
@@ -305,20 +306,21 @@ gena_subscribe( IN char *url,
request.size_inc = 30; request.size_inc = 30;
if( renewal_sid ) { if( renewal_sid ) {
// renew subscription // renew subscription
return_code = http_MakeMessage( &request, 1, 1, return_code = http_MakeMessage(
"q" "ssc" "ssc" "c", &request, 1, 1,
HTTPMETHOD_SUBSCRIBE, &dest_url, "q" "ssc" "sscc",
"SID: ", renewal_sid, HTTPMETHOD_SUBSCRIBE, &dest_url,
"TIMEOUT: Second-", timeout_str ); "SID: ", renewal_sid,
"TIMEOUT: Second-", timeout_str );
} else { } else {
// subscribe // subscribe
return_code = http_MakeMessage( &request, 1, 1, return_code = http_MakeMessage(
"q" "sssdsscc", &request, 1, 1,
HTTPMETHOD_SUBSCRIBE, &dest_url, "q" "sssdsc" "sc" "sscc",
"CALLBACK: <http://", LOCAL_HOST, HTTPMETHOD_SUBSCRIBE, &dest_url,
":", LOCAL_PORT, "CALLBACK: <http://", LOCAL_HOST, ":", LOCAL_PORT, "/>",
"/>\r\n" "NT: upnp:event\r\n" "NT: upnp:event",
"TIMEOUT: Second-", timeout_str ); "TIMEOUT: Second-", timeout_str );
} }
if( return_code != 0 ) { if( return_code != 0 ) {
return return_code; return return_code;
@@ -395,9 +397,9 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
http_parser_t response; http_parser_t response;
while( TRUE ) { while( TRUE ) {
HandleLock( ); HandleLock();
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_HANDLE; return GENA_E_BAD_HANDLE;
} }
@@ -415,7 +417,7 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
RemoveClientSubClientSID( &handle_info->ClientSubList, RemoveClientSubClientSID( &handle_info->ClientSubList,
sub_copy.sid ); sub_copy.sid );
HandleUnlock( ); HandleUnlock();
return_code = gena_unsubscribe( sub_copy.EventURL, return_code = gena_unsubscribe( sub_copy.EventURL,
sub_copy.ActualSID, &response ); sub_copy.ActualSID, &response );
@@ -427,7 +429,7 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
} }
freeClientSubList( handle_info->ClientSubList ); freeClientSubList( handle_info->ClientSubList );
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
@@ -447,6 +449,7 @@ 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 )
@@ -457,25 +460,25 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
client_subscription sub_copy; client_subscription sub_copy;
http_parser_t response; http_parser_t response;
HandleLock( ); HandleLock();
// validate handle and sid // validate handle and sid
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_HANDLE; return GENA_E_BAD_HANDLE;
} }
if( ( sub = if( ( sub =
GetClientSubClientSID( handle_info->ClientSubList, in_sid ) ) GetClientSubClientSID( handle_info->ClientSubList, in_sid ) )
== NULL ) { == NULL ) {
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_SID; return GENA_E_BAD_SID;
} }
return_code = copy_client_subscription( sub, &sub_copy ); return_code = copy_client_subscription( sub, &sub_copy );
HandleUnlock( ); HandleUnlock();
return_code = gena_unsubscribe( sub_copy.EventURL, sub_copy.ActualSID, return_code = gena_unsubscribe( sub_copy.EventURL, sub_copy.ActualSID,
&response ); &response );
@@ -486,19 +489,20 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
free_client_subscription( &sub_copy ); free_client_subscription( &sub_copy );
HandleLock( ); HandleLock();
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_HANDLE; return GENA_E_BAD_HANDLE;
} }
RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid ); RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid );
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
#endif
/************************************************************************ /************************************************************************
* Function : genaSubscribe * Function : genaSubscribe
@@ -522,6 +526,7 @@ 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,
@@ -536,28 +541,28 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
struct Handle_Info *handle_info; struct Handle_Info *handle_info;
char *EventURL = NULL; char *EventURL = NULL;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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();
return GENA_E_BAD_HANDLE; return GENA_E_BAD_HANDLE;
} }
HandleUnlock( ); HandleUnlock();
// subscribe // subscribe
SubscribeLock( ); SubscribeLock();
return_code = return_code =
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 ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__, 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;
} }
@@ -603,10 +608,11 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
free( EventURL ); free( EventURL );
free( newSubscription ); free( newSubscription );
} }
HandleUnlock( ); HandleUnlock();
SubscribeUnlock( ); SubscribeUnlock();
return return_code; return return_code;
} }
#endif
/************************************************************************ /************************************************************************
* Function : genaRenewSubscription * Function : genaRenewSubscription
@@ -641,17 +647,17 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
char *ActualSID; char *ActualSID;
ThreadPoolJob tempJob; ThreadPoolJob tempJob;
HandleLock( ); HandleLock();
// validate handle and sid // validate handle and sid
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_HANDLE; return GENA_E_BAD_HANDLE;
} }
if( ( sub = GetClientSubClientSID( handle_info->ClientSubList, if( ( sub = GetClientSubClientSID( handle_info->ClientSubList,
in_sid ) ) == NULL ) { in_sid ) ) == NULL ) {
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_SID; return GENA_E_BAD_SID;
} }
// remove old events // remove old events
@@ -661,13 +667,13 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
free_upnp_timeout( ( upnp_timeout * ) tempJob.arg ); free_upnp_timeout( ( upnp_timeout * ) tempJob.arg );
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 );
HandleUnlock( ); HandleUnlock();
if( return_code != HTTP_SUCCESS ) { if( return_code != HTTP_SUCCESS ) {
return return_code; return return_code;
@@ -675,10 +681,10 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
return_code = gena_subscribe( sub_copy.EventURL, TimeOut, return_code = gena_subscribe( sub_copy.EventURL, TimeOut,
sub_copy.ActualSID, &ActualSID ); sub_copy.ActualSID, &ActualSID );
HandleLock( ); HandleLock();
if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) { if( GetHandleInfo( client_handle, &handle_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
if( return_code == UPNP_E_SUCCESS ) { if( return_code == UPNP_E_SUCCESS ) {
free( ActualSID ); free( ActualSID );
} }
@@ -691,7 +697,7 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
// network failure (remove client sub) // network failure (remove client sub)
RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid ); RemoveClientSubClientSID( &handle_info->ClientSubList, in_sid );
free_client_subscription( &sub_copy ); free_client_subscription( &sub_copy );
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
// get subscription // get subscription
@@ -699,7 +705,7 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
in_sid ) ) == NULL ) { in_sid ) ) == NULL ) {
free( ActualSID ); free( ActualSID );
free_client_subscription( &sub_copy ); free_client_subscription( &sub_copy );
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_SID; return GENA_E_BAD_SID;
} }
// store actual sid // store actual sid
@@ -712,7 +718,7 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
RemoveClientSubClientSID( &handle_info->ClientSubList, sub->sid ); RemoveClientSubClientSID( &handle_info->ClientSubList, sub->sid );
} }
free_client_subscription( &sub_copy ); free_client_subscription( &sub_copy );
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
@@ -793,12 +799,12 @@ gena_process_notification_event( IN SOCKINFO * info,
return; return;
} }
HandleLock( ); HandleLock();
// get client info // get client info
if( GetClientHandleInfo( &client_handle, &handle_info ) != HND_CLIENT ) { if( GetClientHandleInfo( &client_handle, &handle_info ) != HND_CLIENT ) {
error_respond( info, HTTP_PRECONDITION_FAILED, event ); error_respond( info, HTTP_PRECONDITION_FAILED, event );
HandleUnlock( ); HandleUnlock();
ixmlDocument_free( ChangedVars ); ixmlDocument_free( ChangedVars );
return; return;
@@ -811,20 +817,20 @@ gena_process_notification_event( IN SOCKINFO * info,
// (if we are in the middle) // (if we are in the middle)
// this is to avoid mistakenly rejecting the first event if we // this is to avoid mistakenly rejecting the first event if we
// receive it before the subscription response // receive it before the subscription response
HandleUnlock( ); HandleUnlock();
// try and get Subscription Lock // try and get Subscription Lock
// (in case we are in the process of subscribing) // (in case we are in the process of subscribing)
SubscribeLock( ); SubscribeLock();
// get HandleLock again // get HandleLock again
HandleLock( ); HandleLock();
if( GetClientHandleInfo( &client_handle, &handle_info ) if( GetClientHandleInfo( &client_handle, &handle_info )
!= HND_CLIENT ) { != HND_CLIENT ) {
error_respond( info, HTTP_PRECONDITION_FAILED, event ); error_respond( info, HTTP_PRECONDITION_FAILED, event );
SubscribeUnlock( ); SubscribeUnlock();
HandleUnlock( ); HandleUnlock();
ixmlDocument_free( ChangedVars ); ixmlDocument_free( ChangedVars );
return; return;
@@ -834,17 +840,17 @@ gena_process_notification_event( IN SOCKINFO * info,
GetClientSubActualSID( handle_info->ClientSubList, GetClientSubActualSID( handle_info->ClientSubList,
&sid ) ) == NULL ) { &sid ) ) == NULL ) {
error_respond( info, HTTP_PRECONDITION_FAILED, event ); error_respond( info, HTTP_PRECONDITION_FAILED, event );
SubscribeUnlock( ); SubscribeUnlock();
HandleUnlock( ); HandleUnlock();
ixmlDocument_free( ChangedVars ); ixmlDocument_free( ChangedVars );
return; return;
} }
SubscribeUnlock( ); SubscribeUnlock();
} else { } else {
error_respond( info, HTTP_PRECONDITION_FAILED, event ); error_respond( info, HTTP_PRECONDITION_FAILED, event );
HandleUnlock( ); HandleUnlock();
ixmlDocument_free( ChangedVars ); ixmlDocument_free( ChangedVars );
return; return;
@@ -862,7 +868,7 @@ gena_process_notification_event( IN SOCKINFO * info,
callback = handle_info->Callback; callback = handle_info->Callback;
cookie = handle_info->Cookie; cookie = handle_info->Cookie;
HandleUnlock( ); HandleUnlock();
// make callback with event struct // make callback with event struct
// In future, should find a way of mainting // In future, should find a way of mainting
@@ -875,3 +881,4 @@ gena_process_notification_event( IN SOCKINFO * info,
#endif // INCLUDE_CLIENT_APIS #endif // INCLUDE_CLIENT_APIS
#endif // EXCLUDE_GENA #endif // EXCLUDE_GENA

View File

@@ -62,19 +62,19 @@ genaUnregisterDevice( IN UpnpDevice_Handle device_handle )
{ {
struct Handle_Info *handle_info; struct Handle_Info *handle_info;
HandleLock( ); HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) { if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__, 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;
} }
freeServiceTable( &handle_info->ServiceTable ); freeServiceTable( &handle_info->ServiceTable );
HandleUnlock( ); HandleUnlock();
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
@@ -188,7 +188,7 @@ free_notify_struct( IN notify_thread_struct * input )
* *
* Note : called by genaNotify * Note : called by genaNotify
****************************************************************************/ ****************************************************************************/
static XINLINE int static UPNP_INLINE 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,12 +203,12 @@ notify_send_and_recv( IN uri_type * destination_url,
SOCKINFO info; SOCKINFO info;
// connect // connect
DBGONLY( UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
"gena notify to: %.*s\n", "gena notify to: %.*s\n",
destination_url->hostport.text.size, (int)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 ) {
return conn_fd; // return UPNP error return conn_fd; // return UPNP error
} }
@@ -219,9 +219,11 @@ notify_send_and_recv( IN uri_type * destination_url,
} }
// make start line and HOST header // make start line and HOST header
membuffer_init( &start_msg ); membuffer_init( &start_msg );
if( http_MakeMessage( &start_msg, 1, 1, if (http_MakeMessage(
"q" "s", &start_msg, 1, 1,
HTTPMETHOD_NOTIFY, &url, mid_msg->buf ) != 0 ) { "q" "s",
HTTPMETHOD_NOTIFY, &url,
mid_msg->buf ) != 0 ) {
membuffer_destroy( &start_msg ); membuffer_destroy( &start_msg );
sock_destroy( &info, SD_BOTH ); sock_destroy( &info, SD_BOTH );
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
@@ -296,11 +298,12 @@ genaNotify( IN char *headers,
// make 'end' msg (the part that won't vary with the destination) // make 'end' msg (the part that won't vary with the destination)
endmsg.size_inc = 30; endmsg.size_inc = 30;
if( http_MakeMessage( &mid_msg, 1, 1, if( http_MakeMessage(
"s" "ssc" "sdcc", &mid_msg, 1, 1,
headers, "s" "ssc" "sdcc",
"SID: ", sub->sid, headers,
"SEQ: ", sub->ToSendEventKey ) != 0 ) { "SID: ", sub->sid,
"SEQ: ", sub->ToSendEventKey ) != 0 ) {
membuffer_destroy( &mid_msg ); membuffer_destroy( &mid_msg );
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
} }
@@ -362,12 +365,12 @@ genaNotifyThread( IN void *input )
struct Handle_Info *handle_info; struct Handle_Info *handle_info;
ThreadPoolJob job; ThreadPoolJob job;
HandleLock( ); HandleReadLock();
//validate context //validate context
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
free_notify_struct( in ); free_notify_struct( in );
HandleUnlock( ); HandleUnlock();
return; return;
} }
@@ -377,7 +380,7 @@ genaNotifyThread( IN void *input )
|| ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL ) || ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL )
|| ( ( copy_subscription( sub, &sub_copy ) != HTTP_SUCCESS ) ) ) { || ( ( copy_subscription( sub, &sub_copy ) != HTTP_SUCCESS ) ) ) {
free_notify_struct( in ); free_notify_struct( in );
HandleUnlock( ); HandleUnlock();
return; return;
} }
//If the event is out of order push it back to the job queue //If the event is out of order push it back to the job queue
@@ -389,22 +392,22 @@ genaNotifyThread( IN void *input )
ThreadPoolAdd( &gSendThreadPool, &job, NULL ); ThreadPoolAdd( &gSendThreadPool, &job, NULL );
freeSubscription( &sub_copy ); freeSubscription( &sub_copy );
HandleUnlock( ); HandleUnlock();
return; return;
} }
HandleUnlock( ); HandleUnlock();
//send the notify //send the notify
return_code = genaNotify( in->headers, in->propertySet, &sub_copy ); return_code = genaNotify( in->headers, in->propertySet, &sub_copy );
freeSubscription( &sub_copy ); freeSubscription( &sub_copy );
HandleLock( ); HandleLock();
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) { if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
free_notify_struct( in ); free_notify_struct( in );
HandleUnlock( ); HandleUnlock();
return; return;
} }
//validate context //validate context
@@ -413,7 +416,7 @@ genaNotifyThread( IN void *input )
|| ( !service->active ) || ( !service->active )
|| ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL ) ) { || ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL ) ) {
free_notify_struct( in ); free_notify_struct( in );
HandleUnlock( ); HandleUnlock();
return; return;
} }
@@ -427,7 +430,7 @@ genaNotifyThread( IN void *input )
} }
free_notify_struct( in ); free_notify_struct( in );
HandleUnlock( ); HandleUnlock();
} }
/**************************************************************************** /****************************************************************************
@@ -474,8 +477,8 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
notify_thread_struct *thread_struct = NULL; notify_thread_struct *thread_struct = NULL;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 ) );
@@ -501,13 +504,13 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
strcpy( UDN_copy, UDN ); strcpy( UDN_copy, UDN );
strcpy( servId_copy, servId ); strcpy( servId_copy, servId );
HandleLock( ); HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) { if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_HANDLE; return GENA_E_BAD_HANDLE;
} }
@@ -516,26 +519,25 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_SERVICE; return GENA_E_BAD_SERVICE;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 ) ) {
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_SID; return GENA_E_BAD_SID;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ", "FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ", sid );
sid ) );
sub->active = 1; sub->active = 1;
@@ -546,13 +548,13 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 +
@@ -566,12 +568,12 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( UDN_copy ); free( UDN_copy );
free( servId_copy ); free( servId_copy );
free( reference_count ); free( reference_count );
HandleUnlock( ); HandleUnlock();
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
} }
sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: " sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: "
"%d\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n", "%"PRIzu"\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
@@ -618,7 +620,7 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
free( headers ); free( headers );
} }
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
@@ -665,8 +667,8 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
notify_thread_struct *thread_struct = NULL; notify_thread_struct *thread_struct = NULL;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 ) {
@@ -691,13 +693,13 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
strcpy( UDN_copy, UDN ); strcpy( UDN_copy, UDN );
strcpy( servId_copy, servId ); strcpy( servId_copy, servId );
HandleLock( ); HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) { if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_HANDLE; return GENA_E_BAD_HANDLE;
} }
@@ -706,24 +708,23 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_SERVICE; return GENA_E_BAD_SERVICE;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 ) ) {
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return GENA_E_BAD_SID; return GENA_E_BAD_SID;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s", "FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s", sid );
sid ) );
sub->active = 1; sub->active = 1;
@@ -732,13 +733,13 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( UDN_copy ); free( UDN_copy );
free( reference_count ); free( reference_count );
free( servId_copy ); free( servId_copy );
HandleUnlock( ); HandleUnlock();
return UPNP_E_INVALID_PARAM; return UPNP_E_INVALID_PARAM;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 +
@@ -751,7 +752,7 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( servId_copy ); free( servId_copy );
free( reference_count ); free( reference_count );
ixmlFreeDOMString( propertySet ); ixmlFreeDOMString( propertySet );
HandleUnlock( ); HandleUnlock();
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
} }
@@ -801,7 +802,7 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
free( thread_struct ); free( thread_struct );
free( headers ); free( headers );
} }
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
@@ -896,7 +897,7 @@ genaNotifyAllExt( IN UpnpDevice_Handle device_handle,
"%ld\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n", "%ld\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
(long) strlen( propertySet ) + 1 ); (long) strlen( propertySet ) + 1 );
HandleLock( ); HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE )
return_code = GENA_E_BAD_HANDLE; return_code = GENA_E_BAD_HANDLE;
@@ -956,7 +957,7 @@ genaNotifyAllExt( IN UpnpDevice_Handle device_handle,
free( servId_copy ); free( servId_copy );
} }
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
@@ -1058,7 +1059,7 @@ genaNotifyAll( IN UpnpDevice_Handle device_handle,
" upnp:event\r\nNTS: upnp:propchange\r\n", " upnp:event\r\nNTS: upnp:propchange\r\n",
(long) strlen( propertySet ) + 1 ); (long) strlen( propertySet ) + 1 );
HandleLock( ); HandleLock();
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) { if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
return_code = GENA_E_BAD_HANDLE; return_code = GENA_E_BAD_HANDLE;
@@ -1120,7 +1121,7 @@ genaNotifyAll( IN UpnpDevice_Handle device_handle,
free( UDN_copy ); free( UDN_copy );
free( servId_copy ); free( servId_copy );
} }
HandleUnlock( ); HandleUnlock();
return return_code; return return_code;
} }
@@ -1165,10 +1166,14 @@ respond_ok( IN SOCKINFO * info,
membuffer_init( &response ); membuffer_init( &response );
response.size_inc = 30; response.size_inc = 30;
if( http_MakeMessage( &response, major, minor, if( http_MakeMessage(
"R" "D" "S" "N" "Xc" "ssc" "sc" "c", &response, major, minor,
HTTP_OK, 0, X_USER_AGENT, "R" "D" "S" "N" "Xc" "ssc" "scc",
"SID: ", sub->sid, timeout_str ) != 0 ) { HTTP_OK,
(off_t)0,
X_USER_AGENT,
"SID: ", sub->sid,
timeout_str ) != 0 ) {
membuffer_destroy( &response ); membuffer_destroy( &response );
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
@@ -1310,8 +1315,8 @@ gena_process_subscription_request( IN SOCKINFO * info,
memptr callback_hdr; memptr callback_hdr;
memptr timeout_hdr; memptr timeout_hdr;
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 );
@@ -1340,18 +1345,17 @@ gena_process_subscription_request( IN SOCKINFO * info,
return; return;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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();
// CURRENTLY, ONLY ONE DEVICE // CURRENTLY, ONLY ONE DEVICE
if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) { if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) {
free( event_url_path ); free( event_url_path );
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
HandleUnlock( ); HandleUnlock();
return; return;
} }
service = FindServiceEventURLPath( &handle_info->ServiceTable, service = FindServiceEventURLPath( &handle_info->ServiceTable,
@@ -1360,28 +1364,28 @@ gena_process_subscription_request( IN SOCKINFO * info,
if( service == NULL || !service->active ) { if( service == NULL || !service->active ) {
error_respond( info, HTTP_NOT_FOUND, request ); error_respond( info, HTTP_NOT_FOUND, request );
HandleUnlock( ); HandleUnlock();
return; return;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 &&
service->TotalSubscriptions >= handle_info->MaxSubscriptions ) { service->TotalSubscriptions >= handle_info->MaxSubscriptions ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
HandleUnlock( ); HandleUnlock();
return; return;
} }
// generate new subscription // generate new subscription
sub = ( subscription * ) malloc( sizeof( subscription ) ); sub = ( subscription * ) malloc( sizeof( subscription ) );
if( sub == NULL ) { if( sub == NULL ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
HandleUnlock( ); HandleUnlock();
return; return;
} }
sub->eventKey = 0; sub->eventKey = 0;
@@ -1398,13 +1402,13 @@ gena_process_subscription_request( IN SOCKINFO * info,
&sub->DeliveryURLs ) ) == 0 ) { &sub->DeliveryURLs ) ) == 0 ) {
error_respond( info, HTTP_PRECONDITION_FAILED, request ); error_respond( info, HTTP_PRECONDITION_FAILED, request );
freeSubscriptionList( sub ); freeSubscriptionList( sub );
HandleUnlock( ); HandleUnlock();
return; return;
} }
if( return_code == UPNP_E_OUTOF_MEMORY ) { if( return_code == UPNP_E_OUTOF_MEMORY ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
freeSubscriptionList( sub ); freeSubscriptionList( sub );
HandleUnlock( ); HandleUnlock();
return; return;
} }
// set the timeout // set the timeout
@@ -1440,7 +1444,7 @@ gena_process_subscription_request( IN SOCKINFO * info,
// respond OK // respond OK
if( respond_ok( info, time_out, sub, request ) != UPNP_E_SUCCESS ) { if( respond_ok( info, time_out, sub, request ) != UPNP_E_SUCCESS ) {
freeSubscriptionList( sub ); freeSubscriptionList( sub );
HandleUnlock( ); HandleUnlock();
return; return;
} }
//add to subscription list //add to subscription list
@@ -1457,7 +1461,7 @@ gena_process_subscription_request( IN SOCKINFO * info,
callback_fun = handle_info->Callback; callback_fun = handle_info->Callback;
cookie = handle_info->Cookie; cookie = handle_info->Cookie;
HandleUnlock( ); HandleUnlock();
//make call back with request struct //make call back with request struct
//in the future should find a way of mainting //in the future should find a way of mainting
@@ -1520,7 +1524,7 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info,
return; return;
} }
HandleLock( ); HandleLock();
// CURRENTLY, ONLY SUPPORT ONE DEVICE // CURRENTLY, ONLY SUPPORT ONE DEVICE
if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) { if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) {
@@ -1537,22 +1541,21 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info,
!service->active || !service->active ||
( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ) { ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ) {
error_respond( info, HTTP_PRECONDITION_FAILED, request ); error_respond( info, HTTP_PRECONDITION_FAILED, request );
HandleUnlock( ); HandleUnlock();
return; return;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, 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 ) {
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request ); error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
RemoveSubscriptionSID( sub->sid, service ); RemoveSubscriptionSID( sub->sid, service );
HandleUnlock( ); HandleUnlock();
return; return;
} }
// set the timeout // set the timeout
@@ -1591,7 +1594,7 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info,
RemoveSubscriptionSID( sub->sid, service ); RemoveSubscriptionSID( sub->sid, service );
} }
HandleUnlock( ); HandleUnlock();
} }
/**************************************************************************** /****************************************************************************
@@ -1644,13 +1647,13 @@ gena_process_unsubscribe_request( IN SOCKINFO * info,
return; return;
} }
HandleLock( ); HandleLock();
// CURRENTLY, ONLY SUPPORT ONE DEVICE // CURRENTLY, ONLY SUPPORT ONE DEVICE
if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) { if( GetDeviceHandleInfo( &device_handle, &handle_info ) != HND_DEVICE ) {
error_respond( info, HTTP_PRECONDITION_FAILED, request ); error_respond( info, HTTP_PRECONDITION_FAILED, request );
membuffer_destroy( &event_url_path ); membuffer_destroy( &event_url_path );
HandleUnlock( ); HandleUnlock();
return; return;
} }
service = FindServiceEventURLPath( &handle_info->ServiceTable, service = FindServiceEventURLPath( &handle_info->ServiceTable,
@@ -1663,14 +1666,14 @@ gena_process_unsubscribe_request( IN SOCKINFO * info,
//CheckSubscriptionSID(sid, service) == NULL ) //CheckSubscriptionSID(sid, service) == NULL )
{ {
error_respond( info, HTTP_PRECONDITION_FAILED, request ); error_respond( info, HTTP_PRECONDITION_FAILED, request );
HandleUnlock( ); HandleUnlock();
return; return;
} }
RemoveSubscriptionSID( sid, service ); RemoveSubscriptionSID( sid, service );
error_respond( info, HTTP_OK, request ); // success error_respond( info, HTTP_OK, request ); // success
HandleUnlock( ); HandleUnlock();
} }
#endif // INCLUDE_DEVICE_APIS #endif // INCLUDE_DEVICE_APIS

View File

@@ -45,7 +45,7 @@
#else #else
#include <winsock2.h> #include <winsock2.h>
#define socklen_t int typedef int socklen_t;
#define EAFNOSUPPORT 97 #define EAFNOSUPPORT 97
#endif #endif
#include "unixutil.h" #include "unixutil.h"
@@ -106,16 +106,16 @@ SetHTTPGetCallback( MiniServerCallback callback )
} }
/************************************************************************ /************************************************************************
* Function : SetSoapCallback * Function : SetSoapCallback
* *
* Parameters : * Parameters :
* MiniServerCallback callback ; - SOAP Callback to be invoked * MiniServerCallback callback ; - SOAP Callback to be invoked
* *
* Description : Set SOAP Callback * Description : Set SOAP Callback
* *
* Return : void * Return : void
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
void void
SetSoapCallback( MiniServerCallback callback ) SetSoapCallback( MiniServerCallback callback )
@@ -174,11 +174,9 @@ dispatch_request( IN SOCKINFO * info,
case HTTPMETHOD_NOTIFY: case HTTPMETHOD_NOTIFY:
case HTTPMETHOD_SUBSCRIBE: case HTTPMETHOD_SUBSCRIBE:
case HTTPMETHOD_UNSUBSCRIBE: case HTTPMETHOD_UNSUBSCRIBE:
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( 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;
//HTTP server call //HTTP server call
@@ -217,7 +215,7 @@ dispatch_request( IN SOCKINFO * info,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE void
handle_error( IN SOCKINFO * info, handle_error( IN SOCKINFO * info,
int http_error_code, int http_error_code,
int major, int major,
@@ -275,12 +273,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;
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver %d: READING\n", connfd );
"miniserver %d: READING\n", connfd ); //parser_request_init( &parser ); ////LEAK_FIX_MK
) hmsg = &parser.msg;
//parser_request_init( &parser ); ////LEAK_FIX_MK
hmsg = &parser.msg;
if( sock_init_with_ip( &info, connfd, request->foreign_ip_addr, if( sock_init_with_ip( &info, connfd, request->foreign_ip_addr,
request->foreign_ip_port ) != UPNP_E_SUCCESS ) { request->foreign_ip_port ) != UPNP_E_SUCCESS ) {
@@ -295,12 +291,10 @@ handle_request( void *args )
goto error_handler; goto error_handler;
} }
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( UPNP_INFO, MSERV, __FILE__, __LINE__, "miniserver %d: PROCESSING...\n", connfd );
"miniserver %d: PROCESSING...\n", connfd ); // dispatch
) http_error_code = dispatch_request( &info, &parser );
// dispatch
http_error_code = dispatch_request( &info, &parser );
if( http_error_code != 0 ) { if( http_error_code != 0 ) {
goto error_handler; goto error_handler;
} }
@@ -316,11 +310,9 @@ handle_request( void *args )
handle_error( &info, http_error_code, major, minor ); handle_error( &info, http_error_code, major, minor );
} }
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( 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 );
free( request ); free( request );
@@ -341,7 +333,7 @@ handle_request( void *args )
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE void
schedule_request_job( IN int connfd, schedule_request_job( IN int connfd,
IN struct sockaddr_in *clientAddr ) IN struct sockaddr_in *clientAddr )
{ {
@@ -352,11 +344,9 @@ 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 ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( 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;
} }
@@ -369,11 +359,9 @@ 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( &gRecvThreadPool, &job, NULL ) != 0 ) { if( ThreadPoolAdd( &gMiniServerThreadPool, &job, NULL ) != 0 ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( 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 );
@@ -446,11 +434,9 @@ RunMiniServer( MiniServerSockArray * miniSock )
if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) == if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) ==
UPNP_SOCKETERROR ) { UPNP_SOCKETERROR ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
( UPNP_CRITICAL, SSDP, __FILE__, __LINE__, "Error in select call !!!\n" );
"Error in select call !!!\n" ); continue;
)
continue;
} else { } else {
if( FD_ISSET( miniServSock, &rdSet ) ) { if( FD_ISSET( miniServSock, &rdSet ) ) {
@@ -459,12 +445,10 @@ RunMiniServer( MiniServerSockArray * miniSock )
( struct sockaddr * )&clientAddr, ( struct sockaddr * )&clientAddr,
&clientLen ); &clientLen );
if( connectHnd == UPNP_INVALID_SOCKET ) { if( connectHnd == UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( 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 );
} }
@@ -489,24 +473,19 @@ RunMiniServer( MiniServerSockArray * miniSock )
&clientLen ); &clientLen );
if( byteReceived > 0 ) { if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0'; requestBuf[byteReceived] = '\0';
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( 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 ) ); "Received multicast packet: \n %s\n",
) requestBuf );
DBGONLY( UpnpPrintf
( UPNP_PACKET, MSERV, __FILE__, __LINE__,
"Received multicast packet: \n %s\n",
requestBuf );
)
if( NULL != strstr( requestBuf, "ShutDown" ) ) if( NULL != strstr( requestBuf, "ShutDown" ) ) {
break; break;
}
} }
} }
} }
} }
shutdown( miniServSock, SD_BOTH ); shutdown( miniServSock, SD_BOTH );
@@ -555,12 +534,10 @@ get_port( int sockfd )
} }
port = ntohs( sockinfo.sin_port ); port = ntohs( sockinfo.sin_port );
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
( UPNP_INFO, MSERV, __FILE__, __LINE__, "sockfd = %d, .... port = %d\n", sockfd, port );
"sockfd = %d, .... port = %d\n", sockfd, port );
)
return port; return port;
} }
/************************************************************************ /************************************************************************
@@ -623,16 +600,10 @@ 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
DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, 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 );
@@ -651,6 +622,11 @@ get_miniserver_sockets( MiniServerSockArray * out,
sizeof( struct sockaddr_in ) sizeof( struct sockaddr_in )
); );
if( sockError == UPNP_SOCKETERROR ) { if( sockError == UPNP_SOCKETERROR ) {
#ifdef WIN32
errCode = WSAGetLastError();
#else
errCode = errno;
#endif
if( errno == EADDRINUSE ) if( errno == EADDRINUSE )
errCode = 1; errCode = 1;
} else } else
@@ -660,18 +636,16 @@ get_miniserver_sockets( MiniServerSockArray * out,
} }
if( sockError == UPNP_SOCKETERROR ) { if( sockError == UPNP_SOCKETERROR ) {
DBGONLY( perror( "mserv start: bind failed" ); 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
} }
DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__, 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 ) {
shutdown( listenfd, SD_BOTH ); shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd ); UpnpCloseSocket( listenfd );
@@ -689,11 +663,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 ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, 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;
} }
@@ -706,11 +679,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 ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, 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 );
UpnpCloseSocket( miniServerStopSock ); UpnpCloseSocket( miniServerStopSock );
@@ -800,7 +772,7 @@ StartMiniServer( unsigned short listen_port )
TPJobSetFreeFunction( &job, ( free_routine ) free ); TPJobSetFreeFunction( &job, ( free_routine ) free );
success = ThreadPoolAddPersistent( &gRecvThreadPool, &job, NULL ); success = ThreadPoolAddPersistent( &gMiniServerThreadPool, &job, NULL );
if( success < 0 ) { if( success < 0 ) {
shutdown( miniSocket->miniServerSock, SD_BOTH ); shutdown( miniSocket->miniServerSock, SD_BOTH );
@@ -872,11 +844,9 @@ 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 ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
( 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;
} }
while( gMServState != MSERV_IDLE ) { while( gMServState != MSERV_IDLE ) {

View File

@@ -34,6 +34,7 @@
* 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>
@@ -100,7 +101,7 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = {
/***********************************************************************/ /***********************************************************************/
/************* scanner **************/ /************* scanner *************/
/***********************************************************************/ /***********************************************************************/
@@ -108,19 +109,19 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = {
#define TOKCHAR_LF 0xA #define TOKCHAR_LF 0xA
/************************************************************************ /************************************************************************
* Function : scanner_init * Function : scanner_init
* *
* Parameters : * Parameters :
* OUT scanner_t* scanner ; Scanner Object to be initialized * OUT scanner_t* scanner ; Scanner Object to be initialized
* IN membuffer* bufptr ; Buffer to be copied * IN membuffer* bufptr ; Buffer to be copied
* *
* Description : Intialize scanner * Description : Intialize scanner
* *
* Return : void ; * Return : void ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE void
scanner_init( OUT scanner_t * scanner, scanner_init( OUT scanner_t * scanner,
IN membuffer * bufptr ) IN membuffer * bufptr )
{ {
@@ -130,72 +131,72 @@ scanner_init( OUT scanner_t * scanner,
} }
/************************************************************************ /************************************************************************
* Function : is_separator_char * Function : is_separator_char
* *
* Parameters : * Parameters :
* IN char c ; character to be tested against used separator values * IN char c ; character to be tested against used separator values
* *
* Description : Finds the separator character. * Description : Finds the separator character.
* *
* Return : xboolean ; * Return : xboolean ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE xboolean static UPNP_INLINE xboolean
is_separator_char( IN char c ) is_separator_char( IN char c )
{ {
return strchr( " \t()<>@,;:\\\"/[]?={}", c ) != NULL; return strchr( " \t()<>@,;:\\\"/[]?={}", c ) != NULL;
} }
/************************************************************************ /************************************************************************
* Function : is_identifier_char * Function : is_identifier_char
* *
* Parameters : * Parameters :
* IN char c ; character to be tested for separator values * IN char c ; character to be tested for separator values
* *
* Description : Calls the function to indentify separator character * Description : Calls the function to indentify separator character
* *
* Return : xboolean ; * Return : xboolean ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE xboolean static UPNP_INLINE 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 );
} }
/************************************************************************ /************************************************************************
* Function : is_control_char * Function : is_control_char
* *
* Parameters : * Parameters :
* IN char c ; character to be tested for a control character * IN char c ; character to be tested for a control character
* *
* Description : Determines if the passed value is a control character * Description : Determines if the passed value is a control character
* *
* Return : xboolean ; * Return : xboolean ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE xboolean static UPNP_INLINE 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 ) );
} }
/************************************************************************ /************************************************************************
* Function : is_qdtext_char * Function : is_qdtext_char
* *
* Parameters : * Parameters :
* IN char cc ; character to be tested for CR/LF * IN char cc ; character to be tested for CR/LF
* *
* Description : Checks to see if the passed in value is CR/LF * Description : Checks to see if the passed in value is CR/LF
* *
* Return : xboolean ; * Return : xboolean ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE xboolean static UPNP_INLINE 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;
@@ -213,22 +214,22 @@ is_qdtext_char( IN char cc )
} }
/************************************************************************ /************************************************************************
* Function : scanner_get_token * Function : scanner_get_token
* *
* Parameters : * Parameters :
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* OUT memptr* token ; Token * OUT memptr* token ; Token
* OUT token_type_t* tok_type ; Type of token * OUT token_type_t* tok_type ; Type of token
* *
* Description : reads next token from the input stream * Description : reads next token from the input stream
* note: 0 and is used as a marker, and will not be valid in a quote * note: 0 and is used as a marker, and will not be valid in a quote
* *
* Return : parse_status_t ; * Return : parse_status_t ;
* PARSE_OK * PARSE_OK
* PARSE_INCOMPLETE -- not enuf chars to get a token * PARSE_INCOMPLETE -- not enuf chars to get a token
* PARSE_FAILURE -- bad msg format * PARSE_FAILURE -- bad msg format
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static parse_status_t static parse_status_t
scanner_get_token( INOUT scanner_t * scanner, scanner_get_token( INOUT scanner_t * scanner,
@@ -363,38 +364,40 @@ scanner_get_token( INOUT scanner_t * scanner,
} }
/************************************************************************ /************************************************************************
* Function : scanner_get_str * Function : scanner_get_str
* *
* Parameters : * Parameters :
* IN scanner_t* scanner ; Scanner Object * IN scanner_t* scanner ; Scanner Object
* *
* Description : returns ptr to next char in string * Description : returns ptr to next char in string
* *
* Return : char* ; * Return : char* ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE char * static UPNP_INLINE 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;
} }
/************************************************************************ /************************************************************************
* Function : scanner_pushback * Function : scanner_pushback
* *
* Parameters : * Parameters :
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* IN size_t pushback_bytes ; Bytes to be moved back * IN size_t pushback_bytes ; Bytes to be moved back
* *
* Description : Move back by a certain number of bytes. * Description : Move back by a certain number of bytes.
* This is used to put back one or more tokens back into the input * This is used to put back one or more tokens back into the input
* *
* Return : void ; * Return : void ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE void #warning The only use of the function 'scanner_pushback()' in the code is commented out.
#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 )
{ {
@@ -403,34 +406,34 @@ scanner_pushback( INOUT scanner_t * scanner,
/***********************************************************************/ /***********************************************************************/
/************* end of scanner **************/ /************* end of scanner **************/
/***********************************************************************/ /***********************************************************************/
/***********************************************************************/ /***********************************************************************/
/************* parser **************/ /************* parser **************/
/***********************************************************************/ /***********************************************************************/
/***********************************************************************/ /***********************************************************************/
/************* http_message_t **************/ /************* http_message_t **************/
/***********************************************************************/ /***********************************************************************/
/************************************************************************ /************************************************************************
* Function : httpmsg_compare * Function : httpmsg_compare
* *
* Parameters : * Parameters :
* void* param1 ; * void* param1 ;
* void* param2 ; * void* param2 ;
* *
* Description : Compares name id in the http headers. * Description : Compares name id in the http headers.
* *
* Return : int ; * Return : int ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static int static int
httpmsg_compare( void *param1, httpmsg_compare( void *param1,
@@ -444,16 +447,16 @@ httpmsg_compare( void *param1,
} }
/************************************************************************ /************************************************************************
* Function : httpheader_free * Function : httpheader_free
* *
* Parameters : * Parameters :
* void *msg ; * void *msg ;
* *
* Description : Free memory allocated for the http header * Description : Free memory allocated for the http header
* *
* Return : void ; * Return : void ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static void static void
httpheader_free( void *msg ) httpheader_free( void *msg )
@@ -466,16 +469,16 @@ httpheader_free( void *msg )
} }
/************************************************************************ /************************************************************************
* Function : httpmsg_init * Function : httpmsg_init
* *
* Parameters : * Parameters :
* INOUT http_message_t* msg ; HTTP Message Object * INOUT http_message_t* msg ; HTTP Message Object
* *
* Description : Initialize and allocate memory for http message * Description : Initialize and allocate memory for http message
* *
* Return : void ; * Return : void ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
void void
httpmsg_init( INOUT http_message_t * msg ) httpmsg_init( INOUT http_message_t * msg )
@@ -489,16 +492,16 @@ httpmsg_init( INOUT http_message_t * msg )
} }
/************************************************************************ /************************************************************************
* Function : httpmsg_destroy * Function : httpmsg_destroy
* *
* Parameters : * Parameters :
* INOUT http_message_t* msg ; HTTP Message Object * INOUT http_message_t* msg ; HTTP Message Object
* *
* Description : Free memory allocated for the http message * Description : Free memory allocated for the http message
* *
* Return : void ; * Return : void ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
void void
httpmsg_destroy( INOUT http_message_t * msg ) httpmsg_destroy( INOUT http_message_t * msg )
@@ -515,19 +518,19 @@ httpmsg_destroy( INOUT http_message_t * msg )
} }
/************************************************************************ /************************************************************************
* Function : httpmsg_find_hdr_str * Function : httpmsg_find_hdr_str
* *
* Parameters : * Parameters :
* IN http_message_t* msg ; HTTP Message Object * IN http_message_t* msg ; HTTP Message Object
* IN const char* header_name ; Header name to be compared with * IN const char* header_name ; Header name to be compared with
* *
* Description : Compares the header name with the header names stored * Description : Compares the header name with the header names stored
* in the linked list of messages * in the linked list of messages
* *
* 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 :
************************************************************************/ ************************************************************************/
http_header_t * http_header_t *
httpmsg_find_hdr_str( IN http_message_t * msg, httpmsg_find_hdr_str( IN http_message_t * msg,
@@ -552,19 +555,19 @@ httpmsg_find_hdr_str( IN http_message_t * msg,
} }
/************************************************************************ /************************************************************************
* Function : httpmsg_find_hdr * Function : httpmsg_find_hdr
* *
* Parameters : * Parameters :
* IN http_message_t* msg ; HTTP Message Object * IN http_message_t* msg ; HTTP Message Object
* IN int header_name_id ; Header Name ID to be compared with * IN int header_name_id ; Header Name ID to be compared with
* OUT memptr* value ; Buffer to get the ouput to. * OUT memptr* value ; Buffer to get the ouput to.
* *
* 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 :
************************************************************************/ ************************************************************************/
http_header_t * http_header_t *
httpmsg_find_hdr( IN http_message_t * msg, httpmsg_find_hdr( IN http_message_t * msg,
@@ -597,23 +600,23 @@ httpmsg_find_hdr( IN http_message_t * msg,
/***********************************************************************/ /***********************************************************************/
/************* http_parser_t **************/ /************* http_parser_t **************/
/***********************************************************************/ /***********************************************************************/
/************************************************************************ /************************************************************************
* Function : skip_blank_lines * Function : skip_blank_lines
* *
* Parameters : * Parameters :
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* *
* Description : skips blank lines at the start of a msg. * Description : skips blank lines at the start of a msg.
* *
* Return : int ; * Return : int ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE int static UPNP_INLINE int
skip_blank_lines( INOUT scanner_t * scanner ) skip_blank_lines( INOUT scanner_t * scanner )
{ {
memptr token; memptr token;
@@ -636,21 +639,21 @@ skip_blank_lines( INOUT scanner_t * scanner )
} }
/************************************************************************ /************************************************************************
* Function : skip_lws * Function : skip_lws
* *
* Parameters : * Parameters :
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* *
* Description : skip linear whitespace. * Description : skip linear whitespace.
* *
* Return : int ; * Return : int ;
* PARSE_OK: (LWS)* removed from input * PARSE_OK: (LWS)* removed from input
* PARSE_FAILURE: bad input * PARSE_FAILURE: bad input
* PARSE_INCOMPLETE: incomplete input * PARSE_INCOMPLETE: incomplete input
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE int static UPNP_INLINE int
skip_lws( INOUT scanner_t * scanner ) skip_lws( INOUT scanner_t * scanner )
{ {
memptr token; memptr token;
@@ -689,23 +692,23 @@ skip_lws( INOUT scanner_t * scanner )
} }
/************************************************************************ /************************************************************************
* Function : match_non_ws_string * Function : match_non_ws_string
* *
* Parameters : * Parameters :
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* OUT memptr* str ; Buffer to get the scanner buffer contents. * OUT memptr* str ; Buffer to get the scanner buffer contents.
* *
* Description : Match a string without whitespace or CRLF (%S) * Description : Match a string without whitespace or CRLF (%S)
* *
* Return : XINLINE parse_status_t ; * Return : UPNP_INLINE parse_status_t ;
* PARSE_OK * PARSE_OK
* PARSE_NO_MATCH * PARSE_NO_MATCH
* PARSE_FAILURE * PARSE_FAILURE
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE parse_status_t static UPNP_INLINE 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 )
{ {
@@ -753,25 +756,25 @@ match_non_ws_string( INOUT scanner_t * scanner,
} }
/************************************************************************ /************************************************************************
* Function : match_raw_value * Function : match_raw_value
* *
* Parameters : * Parameters :
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* OUT memptr* raw_value ; Buffer to get the scanner buffer * OUT memptr* raw_value ; Buffer to get the scanner buffer
* contents * contents
* *
* Description : Matches a raw value in a the input; value's length * Description : Matches a raw value in a the input; value's length
* can be 0 or more. Whitespace after value is trimmed. On success, * can be 0 or more. Whitespace after value is trimmed. On success,
* scanner points the CRLF that ended the value * scanner points the CRLF that ended the value
* *
* Return : parse_status_t ; * Return : parse_status_t ;
* PARSE_OK * PARSE_OK
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
* PARSE_FAILURE * PARSE_FAILURE
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE parse_status_t static UPNP_INLINE 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 )
{ {
@@ -848,9 +851,9 @@ match_raw_value( INOUT scanner_t * scanner,
* *
* Parameters: * Parameters:
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* IN int base : Base of number in the string; * IN int base : Base of number in the string;
* valid values: 10 or 16 * valid values: 10 or 16
* OUT int* value ; Number stored here * OUT int* value ; Number stored here
* *
* Description: Matches an unsigned integer value in the input. The * Description: Matches an unsigned integer value in the input. The
* integer is returned in 'value'. Except for PARSE_OK result, the * integer is returned in 'value'. Except for PARSE_OK result, the
@@ -862,7 +865,7 @@ match_raw_value( INOUT scanner_t * scanner,
* PARSE_FAILURE -- bad input * PARSE_FAILURE -- bad input
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
************************************************************************/ ************************************************************************/
static XINLINE int static UPNP_INLINE 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 )
@@ -909,8 +912,8 @@ match_int( INOUT scanner_t * scanner,
* Function: read_until_crlf * Function: read_until_crlf
* *
* Parameters: * Parameters:
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ;Scanner Object
* OUT memptr* str ; Buffer to copy scanner buffer contents to * OUT memptr* str ; Buffer to copy scanner buffer contents to
* *
* Description: Reads data until end of line; the crlf at the end of * Description: Reads data until end of line; the crlf at the end of
* line is not consumed. On error, scanner is not restored. On * line is not consumed. On error, scanner is not restored. On
@@ -921,7 +924,7 @@ match_int( INOUT scanner_t * scanner,
* PARSE_FAILURE * PARSE_FAILURE
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
************************************************************************/ ************************************************************************/
static XINLINE int static UPNP_INLINE int
read_until_crlf( INOUT scanner_t * scanner, read_until_crlf( INOUT scanner_t * scanner,
OUT memptr * str ) OUT memptr * str )
{ {
@@ -962,7 +965,9 @@ read_until_crlf( INOUT scanner_t * scanner,
* PARSE_FAILURE * PARSE_FAILURE
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
************************************************************************/ ************************************************************************/
static XINLINE int #warning There are currently no uses of the function 'skip_to_end_of_header()' in the code.
#warning 'skip_to_end_of_header()' is a candidate for removal.
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;
@@ -976,10 +981,10 @@ skip_to_end_of_header( INOUT scanner_t * scanner )
* Function: match_char * Function: match_char
* *
* 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 comparison should * IN xboolean case_sensitive; Flag indicating whether
* be case sensitive * comparison should 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
@@ -989,7 +994,7 @@ skip_to_end_of_header( INOUT scanner_t * scanner )
* PARSE_NO_MATCH * PARSE_NO_MATCH
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
************************************************************************/ ************************************************************************/
static XINLINE parse_status_t static UPNP_INLINE 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 )
@@ -1044,24 +1049,24 @@ match_char( INOUT scanner_t * scanner,
// PARSE_NO_MATCH -- input does not match pattern // PARSE_NO_MATCH -- input does not match pattern
/************************************************************************ /************************************************************************
* Function : vfmatch * Function : vfmatch
* *
* Parameters : * Parameters :
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* IN const char* fmt ; Pattern Format * IN const char* fmt ; Pattern Format
* va_list argp ; List of variable arguments * va_list argp ; List of variable arguments
* *
* Description : Extracts variable parameters depending on the passed * Description : Extracts variable parameters depending on the passed
* in format parameter. Parses data also based on the passed in * in format parameter. Parses data also based on the passed in
* format parameter. * format parameter.
* *
* Return : int ; * Return : int ;
* PARSE_OK * PARSE_OK
* PARSE_INCOMPLETE * PARSE_INCOMPLETE
* PARSE_FAILURE - bad input * PARSE_FAILURE - bad input
* PARSE_NO_MATCH - input does not match pattern * PARSE_NO_MATCH - input does not match pattern
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static int static int
vfmatch( INOUT scanner_t * scanner, vfmatch( INOUT scanner_t * scanner,
@@ -1244,8 +1249,8 @@ vfmatch( INOUT scanner_t * scanner,
* Function: match * Function: match
* *
* Parameters: * Parameters:
* INOUT scanner_t* scanner ; Scanner Object * INOUT scanner_t* scanner ; Scanner Object
* IN const char* fmt; Pattern format * IN const char* fmt; Pattern format
* ... * ...
* *
* Description: matches a variable parameter list and takes necessary * Description: matches a variable parameter list and takes necessary
@@ -1275,9 +1280,9 @@ match( INOUT scanner_t * scanner,
* Function: matchstr * Function: matchstr
* *
* Parameters: * Parameters:
* IN char *str ; String to be matched * IN char *str ; String to be matched
* IN size_t slen ; Length of the string * IN size_t slen ; Length of the string
* IN const char* fmt ; Pattern format * IN const char* fmt ; Pattern format
* ... * ...
* *
* Description: Matches a variable parameter list with a string * Description: Matches a variable parameter list with a string
@@ -1336,7 +1341,7 @@ matchstr( IN char *str,
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE 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 ) );
@@ -1871,7 +1876,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 XINLINE parse_status_t static UPNP_INLINE 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;
@@ -1918,7 +1923,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 XINLINE parse_status_t static UPNP_INLINE 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;
@@ -1963,7 +1968,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 XINLINE parse_status_t static UPNP_INLINE 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;
@@ -2003,7 +2008,7 @@ parser_parse_chunky_headers( INOUT http_parser_t * parser )
* PARSE_SUCCESS * PARSE_SUCCESS
* PARSE_CONTINUE_1 * PARSE_CONTINUE_1
************************************************************************/ ************************************************************************/
static XINLINE parse_status_t static UPNP_INLINE 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;
@@ -2019,10 +2024,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;
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
( UPNP_INFO, HTTP, __FILE__, __LINE__, "CHUNK COULD NOT BE PARSED\n" );
"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
membuffer_delete( &parser->msg.msg, save_pos, membuffer_delete( &parser->msg.msg, save_pos,
@@ -2055,7 +2059,7 @@ parser_parse_chunky_entity( INOUT http_parser_t * parser )
* Returns: * Returns:
* PARSE_INCOMPLETE_ENTITY * PARSE_INCOMPLETE_ENTITY
************************************************************************/ ************************************************************************/
static XINLINE parse_status_t static UPNP_INLINE 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;
@@ -2090,7 +2094,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
************************************************************************/ ************************************************************************/
XINLINE parse_status_t UPNP_INLINE 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;
@@ -2148,11 +2152,10 @@ 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;
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
( UPNP_INFO, HTTP, __FILE__, __LINE__, "Found Chunked Encoding ....\n" );
"Found Chunked Encoding ....\n" ); )
return PARSE_CONTINUE_1; return PARSE_CONTINUE_1;
} }
} }
// * use content length // * use content length
@@ -2196,7 +2199,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
************************************************************************/ ************************************************************************/
XINLINE parse_status_t UPNP_INLINE 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;
@@ -2261,7 +2264,7 @@ parser_request_init( OUT http_parser_t * parser )
* Function: parser_response_init * Function: parser_response_init
* *
* Parameters: * Parameters:
* OUT http_parser_t* parser ; HTTP Parser object * OUT http_parser_t* parser ; HTTP Parser object
* IN http_method_t request_method ; Request method * IN http_method_t request_method ; Request method
* *
* Description: Initializes parser object for a response * Description: Initializes parser object for a response
@@ -2340,9 +2343,9 @@ parser_parse( INOUT http_parser_t * parser )
* *
* Parameters: * Parameters:
* INOUT http_parser_t* parser ; HTTP Parser Object * INOUT http_parser_t* parser ; HTTP Parser Object
* IN const char* buf ; buffer to be appended to the parser * IN const char* buf ; buffer to be appended to the parser
* buffer * buffer
* IN size_t buf_length ; Size of the buffer * IN size_t buf_length ; Size of the buffer
* *
* Description: The parser function. Depending on the position of the * Description: The parser function. Depending on the position of the
* parser object the actual parsing function is invoked * parser object the actual parsing function is invoked
@@ -2372,7 +2375,7 @@ parser_append( INOUT http_parser_t * parser,
} }
/************************************************************************ /************************************************************************
********** end of parser *********** ********** end of parser ***********
************************************************************************/ ************************************************************************/
/************************************************************************ /************************************************************************
@@ -2380,7 +2383,7 @@ parser_append( INOUT http_parser_t * parser,
* *
* Parameters: * Parameters:
* IN memptr* raw_value ; Buffer to be converted * IN memptr* raw_value ; Buffer to be converted
* IN int base ; Base to use for conversion * IN int base ; Base to use for conversion
* *
* Description: Converts raw character data to long-integer value * Description: Converts raw character data to long-integer value
* *
@@ -2421,28 +2424,42 @@ 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.
************************************************************************/ ************************************************************************/
int int
raw_find_str( IN memptr * raw_value, raw_find_str( IN memptr *raw_value,
IN const char *str ) IN const char *str )
{ {
char c; char c;
char *ptr; char *ptr;
int i = 0;
c = raw_value->buf[raw_value->length]; // save // save
raw_value->buf[raw_value->length] = 0; // null-terminate c = raw_value->buf[raw_value->length];
// Make it lowercase
for (i = 0; raw_value->buf[i]; ++i) {
raw_value->buf[i] = tolower(raw_value->buf[i]);
}
// null-terminate
raw_value->buf[raw_value->length] = 0;
// Find the substring position
ptr = strstr( raw_value->buf, str ); ptr = strstr( raw_value->buf, str );
raw_value->buf[raw_value->length] = c; // restore // restore the "length" byte
raw_value->buf[raw_value->length] = c;
if( ptr == 0 ) { if( ptr == 0 ) {
return -1; return -1;
} }
return ptr - raw_value->buf; // return index // return index
return ptr - raw_value->buf;
} }
/************************************************************************ /************************************************************************
@@ -2455,7 +2472,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 )
@@ -2480,40 +2497,38 @@ 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,
// hmsg->uri.pathquery.size, hmsg->uri.pathquery.buff); (int)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

File diff suppressed because it is too large Load Diff

View File

@@ -118,7 +118,7 @@ static xboolean gInitialized = FALSE;
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE 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 XINLINE void static UPNP_INLINE void
init_tables( void ) init_tables( void )
{ {
init_table( Http1xxStr, Http1xxCodes, NUM_1XX_CODES ); init_table( Http1xxStr, Http1xxCodes, NUM_1XX_CODES );

View File

@@ -37,6 +37,12 @@
#include "config.h" #include "config.h"
#include <assert.h> #include <assert.h>
#include <fcntl.h> #include <fcntl.h>
#ifndef UPNP_USE_BCBPP
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h>
#include <stdint.h>
#endif
#endif
#include "util.h" #include "util.h"
#include "strintmap.h" #include "strintmap.h"
#include "membuffer.h" #include "membuffer.h"
@@ -49,7 +55,7 @@
#include "ssdplib.h" #include "ssdplib.h"
#ifndef WIN32 #ifndef WIN32
#include <unistd.h> #include <unistd.h>
#endif #endif
#include <sys/stat.h> #include <sys/stat.h>
#include "ithread.h" #include "ithread.h"
@@ -199,7 +205,7 @@ extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES];
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE void
media_list_init( void ) media_list_init( void )
{ {
int i; int i;
@@ -237,7 +243,7 @@ media_list_init( void )
* 0 on success; * 0 on success;
* -1 on error * -1 on error
************************************************************************/ ************************************************************************/
static XINLINE int static UPNP_INLINE 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 )
@@ -284,7 +290,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
************************************************************************/ ************************************************************************/
XINLINE int UPNP_INLINE int
get_content_type( IN const char *filename, get_content_type( IN const char *filename,
OUT DOMString * content_type ) OUT DOMString * content_type )
{ {
@@ -342,7 +348,7 @@ get_content_type( IN const char *filename,
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE void
glob_alias_init( void ) glob_alias_init( void )
{ {
struct xml_alias_t *alias = &gAliasDoc; struct xml_alias_t *alias = &gAliasDoc;
@@ -364,7 +370,7 @@ glob_alias_init( void )
* Returns: * Returns:
* BOOLEAN * BOOLEAN
************************************************************************/ ************************************************************************/
static XINLINE xboolean static UPNP_INLINE 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;
@@ -631,13 +637,13 @@ get_file_info( IN const char *filename,
rc = get_content_type( filename, &info->content_type ); rc = get_content_type( filename, &info->content_type );
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"file info: %s, length: %d, last_mod=%s readable=%d\n", "file info: %s, length: %lld, last_mod=%s readable=%d\n",
filename, 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;
} }
/************************************************************************ /************************************************************************
@@ -694,7 +700,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 XINLINE xboolean static UPNP_INLINE 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 )
@@ -871,25 +877,27 @@ StrTok( char **Src,
************************************************************************/ ************************************************************************/
int int
GetNextRange( char **SrcRangeStr, GetNextRange( char **SrcRangeStr,
int *FirstByte, off_t *FirstByte,
int *LastByte ) off_t *LastByte )
{ {
char *Ptr, char *Ptr;
*Tok; char *Tok;
int i, int i;
F = -1, int64_t F = -1;
L = -1; int64_t 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, "%d%d", &F, &L ); sscanf( Tok, "%"SCNd64"%"SCNd64, &F, &L );
if( F == -1 || L == -1 ) { if( F == -1 || L == -1 ) {
*Ptr = '-'; *Ptr = '-';
@@ -904,16 +912,15 @@ GetNextRange( char **SrcRangeStr,
} }
if( Is_Suffix_byte_Range ) { if( Is_Suffix_byte_Range ) {
*FirstByte = L; *FirstByte = (off_t)L;
*LastByte = F; *LastByte = (off_t)F;
return 1; return 1;
} }
} }
*FirstByte = (off_t)F;
*LastByte = (off_t)L;
*FirstByte = F;
*LastByte = L;
return 1; return 1;
} }
/************************************************************************ /************************************************************************
@@ -936,11 +943,11 @@ GetNextRange( char **SrcRangeStr,
************************************************************************/ ************************************************************************/
int int
CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier, CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
long FileLength, off_t FileLength,
OUT struct SendInstruction *Instr ) OUT struct SendInstruction *Instr )
{ {
int FirstByte, off_t FirstByte,
LastByte; LastByte;
char *RangeInput, char *RangeInput,
*Ptr; *Ptr;
@@ -984,28 +991,36 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
Instr->RangeOffset = FirstByte; Instr->RangeOffset = FirstByte;
Instr->ReadSendSize = LastByte - FirstByte + 1; Instr->ReadSendSize = LastByte - FirstByte + 1;
sprintf( Instr->RangeHeader, "CONTENT-RANGE: bytes %d-%d/%ld\r\n", FirstByte, LastByte, FileLength ); //Data between two range. sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
(int64_t)FirstByte,
(int64_t)LastByte,
(int64_t)FileLength ); //Data between two range.
} else if( FirstByte >= 0 && LastByte == -1 } else if( FirstByte >= 0 && LastByte == -1
&& FirstByte < FileLength ) { && FirstByte < FileLength ) {
Instr->RangeOffset = FirstByte; Instr->RangeOffset = FirstByte;
Instr->ReadSendSize = FileLength - FirstByte; Instr->ReadSendSize = FileLength - FirstByte;
sprintf( Instr->RangeHeader, sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %d-%ld/%ld\r\n", FirstByte, "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
FileLength - 1, FileLength ); (int64_t)FirstByte,
(int64_t)(FileLength - 1),
(int64_t)FileLength );
} else if( FirstByte == -1 && LastByte > 0 ) { } else if( FirstByte == -1 && LastByte > 0 ) {
if( LastByte >= FileLength ) { if( LastByte >= FileLength ) {
Instr->RangeOffset = 0; Instr->RangeOffset = 0;
Instr->ReadSendSize = FileLength; Instr->ReadSendSize = FileLength;
sprintf( Instr->RangeHeader, sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes 0-%ld/%ld\r\n", "CONTENT-RANGE: bytes 0-%"PRId64"/%"PRId64"\r\n",
FileLength - 1, FileLength ); (int64_t)(FileLength - 1),
(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 %ld-%ld/%ld\r\n", "CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
FileLength - LastByte + 1, FileLength, (int64_t)(FileLength - LastByte + 1),
FileLength ); (int64_t)FileLength,
(int64_t)FileLength );
} }
} else { } else {
free( RangeInput ); free( RangeInput );
@@ -1042,7 +1057,7 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
int int
CheckOtherHTTPHeaders( IN http_message_t * Req, CheckOtherHTTPHeaders( IN http_message_t * Req,
OUT struct SendInstruction *RespInstr, OUT struct SendInstruction *RespInstr,
int FileSize ) off_t FileSize )
{ {
http_header_t *header; http_header_t *header;
ListNode *node; ListNode *node;
@@ -1184,7 +1199,6 @@ process_request( IN http_message_t * req,
int code; int code;
int err_code; int err_code;
//membuffer content_type;
char *request_doc; char *request_doc;
struct File_Info finfo; struct File_Info finfo;
xboolean using_alias; xboolean using_alias;
@@ -1194,7 +1208,7 @@ process_request( IN http_message_t * req,
int resp_major, int resp_major,
resp_minor; resp_minor;
xboolean alias_grabbed; xboolean alias_grabbed;
int dummy; size_t dummy;
struct UpnpVirtualDirCallbacks *pVirtualDirCallback; struct UpnpVirtualDirCallbacks *pVirtualDirCallback;
print_http_headers( req ); print_http_headers( req );
@@ -1208,7 +1222,6 @@ process_request( IN http_message_t * req,
// init // init
request_doc = NULL; request_doc = NULL;
finfo.content_type = NULL; finfo.content_type = NULL;
//membuffer_init( &content_type );
alias_grabbed = FALSE; alias_grabbed = FALSE;
err_code = HTTP_INTERNAL_SERVER_ERROR; // default error err_code = HTTP_INTERNAL_SERVER_ERROR; // default error
using_virtual_dir = FALSE; using_virtual_dir = FALSE;
@@ -1362,7 +1375,7 @@ process_request( IN http_message_t * req,
RespInstr->ReadSendSize = finfo.file_length; RespInstr->ReadSendSize = finfo.file_length;
//Check other header field. // Check other header field.
if( ( err_code = if( ( err_code =
CheckOtherHTTPHeaders( req, RespInstr, CheckOtherHTTPHeaders( req, RespInstr,
finfo.file_length ) ) != HTTP_OK ) { finfo.file_length ) ) != HTTP_OK ) {
@@ -1376,85 +1389,80 @@ process_request( IN http_message_t * req,
} }
if( RespInstr->IsRangeActive && RespInstr->IsChunkActive ) { if( RespInstr->IsRangeActive && RespInstr->IsChunkActive ) {
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
/* - PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> // Transfer-Encoding: chunked
* added X-User-Agent header if (http_MakeMessage(
*/ headers, resp_major, resp_minor,
"R" "T" "GKD" "s" "tcS" "XcCc",
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT HTTP_PARTIAL_CONTENT, // status code
//Transfer-Encoding: chunked finfo.content_type, // content type
// K means add chunky header ang G means range header. RespInstr, // range info
if( http_MakeMessage( headers, resp_major, resp_minor, "RTGKDstcSXcCc", HTTP_PARTIAL_CONTENT, // status code "LAST-MODIFIED: ",
// RespInstr->ReadSendSize,// content length &finfo.last_modified,
finfo.content_type, X_USER_AGENT) != 0 ) {
// content_type.buf, // content type
RespInstr, // Range
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler; goto error_handler;
} }
} else if( RespInstr->IsRangeActive && !RespInstr->IsChunkActive ) { } else if( RespInstr->IsRangeActive && !RespInstr->IsChunkActive ) {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked // Transfer-Encoding: chunked
// K means add chunky header ang G means range header. if (http_MakeMessage(
if( http_MakeMessage( headers, resp_major, resp_minor, "RNTGDstcSXcCc", HTTP_PARTIAL_CONTENT, // status code headers, resp_major, resp_minor,
RespInstr->ReadSendSize, // content length "R" "N" "T" "GD" "s" "tcS" "XcCc",
finfo.content_type, HTTP_PARTIAL_CONTENT, // status code
//content_type.buf, // content type RespInstr->ReadSendSize, // content length
RespInstr, //Range Info finfo.content_type, // content type
"LAST-MODIFIED: ", RespInstr, // range info
&finfo.last_modified, "LAST-MODIFIED: ",
X_USER_AGENT) != 0 ) { &finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler; goto error_handler;
} }
} else if( !RespInstr->IsRangeActive && RespInstr->IsChunkActive ) { } else if( !RespInstr->IsRangeActive && RespInstr->IsChunkActive ) {
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Transfer-Encoding: chunked
//Transfer-Encoding: chunked if (http_MakeMessage(
// K means add chunky header ang G means range header. headers, resp_major, resp_minor,
if( http_MakeMessage( headers, resp_major, resp_minor, "RKTDstcSXcCc", HTTP_OK, // status code "RK" "TD" "s" "tcS" "XcCc",
//RespInstr->ReadSendSize,// content length HTTP_OK, // status code
finfo.content_type, finfo.content_type, // content type
// content_type.buf, // content type "LAST-MODIFIED: ",
"LAST-MODIFIED: ", &finfo.last_modified,
&finfo.last_modified, X_USER_AGENT) != 0 ) {
X_USER_AGENT) != 0 ) {
goto error_handler; goto error_handler;
} }
} else { } else { // !RespInstr->IsRangeActive && !RespInstr->IsChunkActive
if( RespInstr->ReadSendSize >= 0 ) { if (RespInstr->ReadSendSize >= 0) {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked // Transfer-Encoding: chunked
// K means add chunky header ang G means range header. if (http_MakeMessage(
if( http_MakeMessage( headers, resp_major, resp_minor, "RNTDstcSXcCc", HTTP_OK, // status code headers, resp_major, resp_minor,
RespInstr->ReadSendSize, // content length "R" "N" "TD" "s" "tcS" "XcCc",
finfo.content_type, HTTP_OK, // status code
//content_type.buf, // content type RespInstr->ReadSendSize, // content length
"LAST-MODIFIED: ", finfo.content_type, // content type
&finfo.last_modified, "LAST-MODIFIED: ",
X_USER_AGENT) != 0 ) { &finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler; goto error_handler;
} }
} else { } else {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT // Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked // Transfer-Encoding: chunked
// K means add chunky header ang G means range header. if (http_MakeMessage(
if( http_MakeMessage( headers, resp_major, resp_minor, "RTDstcSXcCc", HTTP_OK, // status code headers, resp_major, resp_minor,
//RespInstr->ReadSendSize,// content length "R" "TD" "s" "tcS" "XcCc",
finfo.content_type, HTTP_OK, // status code
//content_type.buf, // content type finfo.content_type, // content type
"LAST-MODIFIED: ", "LAST-MODIFIED: ",
&finfo.last_modified, &finfo.last_modified,
X_USER_AGENT) != 0 ) { X_USER_AGENT) != 0 ) {
goto error_handler; goto error_handler;
} }
} }
} }
/* -- PATCH END -- */
if( req->method == HTTPMETHOD_HEAD ) { if( req->method == HTTPMETHOD_HEAD ) {
*rtype = RESP_HEADERS; *rtype = RESP_HEADERS;
@@ -1468,8 +1476,8 @@ process_request( IN http_message_t * req,
*rtype = RESP_FILEDOC; *rtype = RESP_FILEDOC;
} }
//simple get http 0.9 as specified in http 1.0 // simple get http 0.9 as specified in http 1.0
//don't send headers // don't send headers
if( req->method == HTTPMETHOD_SIMPLEGET ) { if( req->method == HTTPMETHOD_SIMPLEGET ) {
membuffer_destroy( headers ); membuffer_destroy( headers );
} }
@@ -1479,7 +1487,6 @@ process_request( IN http_message_t * req,
error_handler: error_handler:
free( request_doc ); free( request_doc );
ixmlFreeDOMString( finfo.content_type ); ixmlFreeDOMString( finfo.content_type );
// membuffer_destroy( &content_type );
if( err_code != UPNP_E_SUCCESS && alias_grabbed ) { if( err_code != UPNP_E_SUCCESS && alias_grabbed ) {
alias_release( alias ); alias_release( alias );
} }
@@ -1525,7 +1532,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;
} }
@@ -1580,14 +1587,11 @@ http_RecvPostMessage( http_parser_t * parser,
} }
} else if( num_read == 0 ) { } else if( num_read == 0 ) {
if( ok_on_close ) { if( ok_on_close ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
( 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
parser->http_error_code = HTTP_BAD_REQUEST; // or response parser->http_error_code = HTTP_BAD_REQUEST; // or response
@@ -1738,12 +1742,12 @@ web_server_callback( IN http_parser_t * parser,
&RespInstr ); &RespInstr );
//Send response. //Send response.
/* - PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> http_MakeMessage(
* added X-User-Agent header &headers, 1, 1,
*/ "RTDSXcCc",
http_MakeMessage( &headers, 1, 1, "RTDSXcCc", ret, ret,
"text/html", X_USER_AGENT ); "text/html",
/* - PATCH END --- */ X_USER_AGENT );
http_SendMessage( info, &timeout, "b", headers.buf, http_SendMessage( info, &timeout, "b", headers.buf,
headers.length ); headers.length );
@@ -1754,10 +1758,9 @@ web_server_callback( IN http_parser_t * parser,
} }
} }
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, 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 );
} }

View File

@@ -231,6 +231,15 @@ 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);
@@ -243,6 +252,9 @@ 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;
} }
@@ -253,6 +265,11 @@ 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;
} }

View File

@@ -34,8 +34,11 @@
************************************************************************/ ************************************************************************/
#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"
@@ -125,7 +128,7 @@ is_unreserved( char in )
* Note : * Note :
************************************************************************/ ************************************************************************/
int int
is_escaped( char *in ) is_escaped( const char *in )
{ {
if( ( in[0] == '%' ) && ( isxdigit( in[1] ) ) && isxdigit( in[2] ) ) { if( ( in[0] == '%' ) && ( isxdigit( in[1] ) ) && isxdigit( in[2] ) ) {
@@ -157,7 +160,7 @@ is_escaped( char *in )
int int
replace_escaped( char *in, replace_escaped( char *in,
int index, int index,
int *max ) size_t *max )
{ {
int tempInt = 0; int tempInt = 0;
char tempChar = 0; char tempChar = 0;
@@ -204,7 +207,7 @@ replace_escaped( char *in,
* Note : * Note :
************************************************************************/ ************************************************************************/
int int
parse_uric( char *in, parse_uric( const char *in,
int max, int max,
token * out ) token * out )
{ {
@@ -364,16 +367,20 @@ 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 :
************************************************************************/ ************************************************************************/
DBGONLY( void print_uri( uri_type * in ) { #ifdef DEBUG
print_token( &in->scheme ); void print_uri( uri_type *in )
print_token( &in->hostport.text ); {
print_token( &in->pathquery ); print_token( &in->fragment );} ) print_token( &in->scheme );
print_token( &in->hostport.text );
print_token( &in->pathquery );
print_token( &in->fragment );
}
#endif
/************************************************************************ /************************************************************************
* Function : print_token * Function : print_token
@@ -382,20 +389,23 @@ DBGONLY( 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 :
************************************************************************/ ************************************************************************/
DBGONLY( void print_token( token * in ) { #ifdef DEBUG
int i = 0; void print_token(token * in)
printf( "Token Size : %d\n\'", in->size ); {
for( i = 0; i < in->size; i++ ) { int i = 0;
putchar( in->buff[i] );} printf( "Token Size : %"PRIzu"\n\'", in->size );
putchar( '\'' ); putchar( '\n' );} for( i = 0; i < in->size; i++ ) {
putchar( in->buff[i] );
) }
putchar( '\'' );
putchar( '\n' );
}
#endif
/************************************************************************ /************************************************************************
* Function : token_string_casecmp * Function : token_string_casecmp
@@ -414,8 +424,10 @@ DBGONLY( void print_token( token * in ) {
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int token_string_casecmp( token * in1, int token_string_casecmp(
char *in2 ) { token * in1,
char *in2 )
{
int in2_length = strlen( in2 ); int in2_length = strlen( in2 );
if( in1->size != in2_length ) if( in1->size != in2_length )
@@ -496,12 +508,12 @@ token_cmp( token * in1,
************************************************************************/ ************************************************************************/
int int
parse_port( int max, parse_port( int max,
char *port, const char *port,
unsigned short *out ) unsigned short *out )
{ {
char *finger = port; const char *finger = port;
char *max_ptr = finger + max; const char *max_ptr = finger + max;
unsigned short temp = 0; unsigned short temp = 0;
while( ( finger < max_ptr ) && ( isdigit( *finger ) ) ) { while( ( finger < max_ptr ) && ( isdigit( *finger ) ) ) {
@@ -533,7 +545,7 @@ parse_port( int max,
* Note : * Note :
************************************************************************/ ************************************************************************/
int int
parse_hostport( char *in, parse_hostport( const char *in,
int max, int max,
hostport_type * out ) hostport_type * out )
{ {
@@ -543,7 +555,7 @@ parse_hostport( char *in,
int begin_port; int begin_port;
int hostport_size = 0; int hostport_size = 0;
int host_size = 0; int host_size = 0;
#ifndef WIN32 #if !defined(WIN32) && !defined(__OSX__)
char temp_hostbyname_buff[BUFFER_SIZE]; char temp_hostbyname_buff[BUFFER_SIZE];
struct hostent h_buf; struct hostent h_buf;
#endif #endif
@@ -611,28 +623,64 @@ parse_hostport( char *in,
int errCode = 0; int errCode = 0;
//call gethostbyname_r (reentrant form of gethostbyname) //call gethostbyname_r (reentrant form of gethostbyname)
#if defined(WIN32) // TODO: Use autoconf to discover this rather than the
h=gethostbyname(temp_host_name); // platform-specific stuff below
#if defined(WIN32) || defined(__CYGWIN__)
h = gethostbyname(temp_host_name);
#elif defined(SPARC_SOLARIS) #elif defined(SPARC_SOLARIS)
errCode = gethostbyname_r( temp_host_name, errCode = gethostbyname_r(
&h, temp_host_name,
temp_hostbyname_buff, &h,
BUFFER_SIZE, &errcode ); temp_hostbyname_buff,
#elif defined(__FreeBSD__) BUFFER_SIZE, &errcode );
h = lwres_gethostbyname_r( temp_host_name, #elif defined(__FreeBSD__) && __FreeBSD_version < 601103
&h_buf, h = lwres_gethostbyname_r(
temp_hostbyname_buff, temp_host_name,
BUFFER_SIZE, &errcode ); &h_buf,
temp_hostbyname_buff,
BUFFER_SIZE, &errcode );
if ( h == NULL ) { if ( h == NULL ) {
errCode = 1; errCode = 1;
} }
#elif defined(__OSX__)
h = gethostbyname(temp_host_name);
if ( h == NULL ) {
errCode = 1;
}
#elif defined(__linux__)
errCode = gethostbyname_r(
temp_host_name,
&h_buf,
temp_hostbyname_buff,
BUFFER_SIZE, &h, &errcode );
#else #else
errCode = gethostbyname_r( temp_host_name, {
&h_buf, struct addrinfo hints, *res, *res0;
temp_hostbyname_buff,
BUFFER_SIZE, &h, &errcode );
#endif
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
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 ) ) {
@@ -681,7 +729,7 @@ parse_hostport( char *in,
* Note : * Note :
************************************************************************/ ************************************************************************/
int int
parse_scheme( char *in, parse_scheme( const char *in,
int max, int max,
token * out ) token * out )
{ {
@@ -731,7 +779,7 @@ parse_scheme( char *in,
************************************************************************/ ************************************************************************/
int int
remove_escaped_chars( INOUT char *in, remove_escaped_chars( INOUT char *in,
INOUT int *size ) INOUT size_t *size )
{ {
int i = 0; int i = 0;
@@ -785,9 +833,8 @@ remove_dots( char *in,
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
Segments[0] = NULL; Segments[0] = NULL;
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
( UPNP_ALL, API, __FILE__, __LINE__, "REMOVE_DOTS: before: %s\n", in );
"REMOVE_DOTS: before: %s\n", in ) );
while( ( copyFrom < max ) && ( *copyFrom != '?' ) while( ( copyFrom < max ) && ( *copyFrom != '?' )
&& ( *copyFrom != '#' ) ) { && ( *copyFrom != '#' ) ) {
@@ -832,9 +879,8 @@ remove_dots( char *in,
} }
( *copyTo ) = 0; ( *copyTo ) = 0;
free( Segments ); free( Segments );
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
( UPNP_ALL, API, __FILE__, __LINE__, "REMOVE_DOTS: after: %s\n", in );
"REMOVE_DOTS: after: %s\n", in ) );
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
@@ -994,7 +1040,7 @@ resolve_rel_url( char *base_url,
* Note : * Note :
************************************************************************/ ************************************************************************/
int int
parse_uri( char *in, parse_uri( const char *in,
int max, int max,
uri_type * out ) uri_type * out )
{ {
@@ -1067,15 +1113,15 @@ parse_uri( char *in,
int int
parse_uri_and_unescape( char *in, parse_uri_and_unescape( char *in,
int max, int max,
uri_type * out ) uri_type *out )
{ {
int ret; int ret;
if( ( ret = parse_uri( in, max, out ) ) != HTTP_SUCCESS ) if( ( ret = parse_uri( in, max, out ) ) != HTTP_SUCCESS )
return ret; return ret;
if( out->pathquery.size > 0 ) if( out->pathquery.size > 0 )
remove_escaped_chars( out->pathquery.buff, &out->pathquery.size ); remove_escaped_chars( (char *)out->pathquery.buff, &out->pathquery.size );
if( out->fragment.size > 0 ) if( out->fragment.size > 0 )
remove_escaped_chars( out->fragment.buff, &out->fragment.size ); remove_escaped_chars( (char *)out->fragment.buff, &out->fragment.size );
return HTTP_SUCCESS; return HTTP_SUCCESS;
} }

View File

@@ -398,7 +398,7 @@ FindServiceEventURLPath( service_table * table,
************************************************************************/ ************************************************************************/
service_info * service_info *
FindServiceControlURLPath( service_table * table, FindServiceControlURLPath( service_table * table,
char *controlURLPath ) const char *controlURLPath )
{ {
service_info *finger = NULL; service_info *finger = NULL;
uri_type parsed_url; uri_type parsed_url;
@@ -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
* Dbg_Level level ; Debug level specified to the print function * Upnp_LogLevel 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,38 +443,54 @@ FindServiceControlURLPath( service_table * table,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
DBGONLY( void printService( service_info * service, Dbg_Level level, #ifdef DEBUG
Dbg_Module module ) { void printService(
if( service ) { service_info *service,
if( service->serviceType ) Upnp_LogLevel level,
UpnpPrintf( level, module, __FILE__, __LINE__, Dbg_Module module )
"serviceType: %s\n", service->serviceType ); {
if( service->serviceId ) if( service ) {
UpnpPrintf( level, module, __FILE__, __LINE__, "serviceId: %s\n", if( service->serviceType ) {
service->serviceId ); if( service->SCPDURL ) UpnpPrintf( level, module, __FILE__, __LINE__,
UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n", "serviceType: %s\n", service->serviceType );
service->SCPDURL ); if( service->controlURL ) }
UpnpPrintf( level, module, __FILE__, __LINE__, "controlURL: %s\n", if( service->serviceId ) {
service->controlURL ); if( service->eventURL ) UpnpPrintf( level, module, __FILE__, __LINE__,
UpnpPrintf( level, module, __FILE__, __LINE__, "eventURL: %s\n", "serviceId: %s\n", service->serviceId );
service->eventURL ); if( service->UDN ) }
UpnpPrintf( level, module, __FILE__, __LINE__, "UDN: %s\n\n", if( service->SCPDURL ) {
service->UDN ); if( service->active ) UpnpPrintf( level, module, __FILE__, __LINE__,
UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n", service->SCPDURL );
"Service is active\n" ); }
else if( service->controlURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__, UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );} "controlURL: %s\n", service->controlURL );
} }
if( service->eventURL ) {
) UpnpPrintf( level, module, __FILE__, __LINE__,
"eventURL: %s\n", service->eventURL );
}
if( service->UDN ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"UDN: %s\n\n", service->UDN );
}
if( service->active ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is active\n" );
} else {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );
}
}
}
#endif
/************************************************************************ /************************************************************************
* Function : printServiceList * Function : printServiceList
* *
* Parameters : * Parameters :
* service_info *service ; Service whose information is to be printed * service_info *service ; Service whose information is to be printed
* Dbg_Level level ; Debug level specified to the print function * Upnp_LogLevel 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
@@ -484,43 +500,55 @@ DBGONLY( void printService( service_info * service, Dbg_Level level,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
DBGONLY( void printServiceList( service_info * service, #ifdef DEBUG
Dbg_Level level, void printServiceList(
Dbg_Module module ) { service_info * service,
while( service ) { Upnp_LogLevel level,
if( service->serviceType ) Dbg_Module module )
UpnpPrintf( level, module, __FILE__, __LINE__, {
"serviceType: %s\n", service->serviceType ); while( service ) {
if( service->serviceId ) if( service->serviceType ) {
UpnpPrintf( level, module, __FILE__, __LINE__, UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceId: %s\n", service->serviceId ); "serviceType: %s\n", service->serviceType );
if( service->SCPDURL ) }
UpnpPrintf( level, module, __FILE__, __LINE__, if( service->serviceId ) {
"SCPDURL: %s\n", service->SCPDURL ); UpnpPrintf( level, module, __FILE__, __LINE__,
if( service->controlURL ) "serviceId: %s\n", service->serviceId );
UpnpPrintf( level, module, __FILE__, __LINE__, }
"controlURL: %s\n", service->controlURL ); if( service->SCPDURL ) {
if( service->eventURL ) UpnpPrintf( level, module, __FILE__, __LINE__,
UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n", service->SCPDURL );
"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 );
UpnpPrintf( level, module, __FILE__, __LINE__, }
"Service is active\n" ); if( service->eventURL ) {
else UpnpPrintf( level, module, __FILE__, __LINE__,
UpnpPrintf( level, module, __FILE__, __LINE__, "eventURL: %s\n", service->eventURL );
"Service is inactive\n" ); }
service = service->next;} if( service->UDN ) {
} UpnpPrintf( level, module, __FILE__, __LINE__,
) "UDN: %s\n\n", service->UDN );
}
if( service->active ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is active\n" );
} else {
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );
}
service = service->next;
}
}
#endif
/************************************************************************ /************************************************************************
* Function : printServiceTable * Function : printServiceTable
* *
* Parameters : * Parameters :
* service_table * table ; Service table to be printed * service_table * table ; Service table to be printed
* Dbg_Level level ; Debug level specified to the print function * Upnp_LogLevel 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
@@ -531,15 +559,18 @@ DBGONLY( void printService( service_info * service, Dbg_Level level,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
DBGONLY( void printServiceTable( service_table * table, #ifdef DEBUG
Dbg_Level level, void printServiceTable(
Dbg_Module module ) { service_table * table,
UpnpPrintf( level, module, __FILE__, __LINE__, Upnp_LogLevel level,
"URL_BASE: %s\n", table->URLBase ); Dbg_Module module )
UpnpPrintf( level, module, __FILE__, __LINE__, {
"Services: \n" ); UpnpPrintf( level, module, __FILE__, __LINE__,
printServiceList( table->serviceList, level, module );} "URL_BASE: %s\n", table->URLBase );
) UpnpPrintf( level, module, __FILE__, __LINE__,
"Services: \n" );
printServiceList( table->serviceList, level, module );}
#endif
/************************************************************************ /************************************************************************
* Function : freeService * Function : freeService
@@ -554,7 +585,7 @@ DBGONLY( void printService( service_info * service, Dbg_Level level,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
void freeService( service_info * in ) void freeService( service_info * in )
{ {
if( in ) { if( in ) {
if( in->serviceType ) if( in->serviceType )
@@ -664,7 +695,7 @@ DOMString
getElementValue( IXML_Node * node ) getElementValue( IXML_Node * node )
{ {
IXML_Node *child = ( IXML_Node * ) ixmlNode_getFirstChild( node ); IXML_Node *child = ( IXML_Node * ) ixmlNode_getFirstChild( node );
DOMString temp = NULL; const DOMString temp = NULL;
if( ( child != 0 ) && ( ixmlNode_getNodeType( child ) == eTEXT_NODE ) ) { if( ( child != 0 ) && ( ixmlNode_getNodeType( child ) == eTEXT_NODE ) ) {
temp = ixmlNode_getNodeValue( child ); temp = ixmlNode_getNodeValue( child );
@@ -849,12 +880,10 @@ getServiceList( IXML_Node * node,
( ! ( !
( current->controlURL = ( current->controlURL =
resolve_rel_url( URLBase, tempDOMString ) ) ) ) { resolve_rel_url( URLBase, tempDOMString ) ) ) ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
( UPNP_INFO, GENA, __FILE__, __LINE__, "BAD OR MISSING CONTROL URL" );
"BAD OR MISSING CONTROL URL" ) ); UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf "CONTROL URL SET TO NULL IN SERVICE INFO" );
( UPNP_INFO, GENA, __FILE__, __LINE__,
"CONTROL URL SET TO NULL IN SERVICE INFO" ) );
current->controlURL = NULL; current->controlURL = NULL;
fail = 0; fail = 0;
} }
@@ -870,12 +899,10 @@ getServiceList( IXML_Node * node,
( ! ( !
( current->eventURL = ( current->eventURL =
resolve_rel_url( URLBase, tempDOMString ) ) ) ) { resolve_rel_url( URLBase, tempDOMString ) ) ) ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
( UPNP_INFO, GENA, __FILE__, __LINE__, "BAD OR MISSING EVENT URL" );
"BAD OR MISSING EVENT URL" ) ); UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf "EVENT URL SET TO NULL IN SERVICE INFO" );
( UPNP_INFO, GENA, __FILE__, __LINE__,
"EVENT URL SET TO NULL IN SERVICE INFO" ) );
current->eventURL = NULL; current->eventURL = NULL;
fail = 0; fail = 0;
} }
@@ -908,20 +935,20 @@ getServiceList( IXML_Node * node,
} }
/************************************************************************ /************************************************************************
* Function : getAllServiceList * Function : getAllServiceList
* *
* Parameters : * Parameters :
* IXML_Node *node ; XML node information * IXML_Node *node ; XML node information
* char * URLBase ; provides Base URL to resolve relative URL * char * URLBase ; provides Base URL to resolve relative URL
* service_info **out_end ; service added is returned to the output * service_info **out_end ; service added is returned to the output
* parameter * parameter
* *
* Description : Returns pointer to service info after getting the * Description : Returns pointer to service info after getting the
* sub-elements of the service info. * sub-elements of the service info.
* *
* Return : service_info * ; * Return : service_info * ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
service_info * service_info *
getAllServiceList( IXML_Node * node, getAllServiceList( IXML_Node * node,
@@ -1092,20 +1119,20 @@ addServiceTable( IXML_Node * node,
} }
/************************************************************************ /************************************************************************
* Function : getServiceTable * Function : getServiceTable
* *
* Parameters : * Parameters :
* IXML_Node *node ; XML node information * IXML_Node *node ; XML node information
* service_table *out ; output parameter which will contain the * service_table *out ; output parameter which will contain the
* service list and URL * service list and URL
* const char *DefaultURLBase ; Default base URL on which the URL * const char *DefaultURLBase ; Default base URL on which the URL
* will be returned. * will be returned.
* *
* Description : Retrieve service from the table * Description : Retrieve service from the table
* *
* Return : int ; * Return : int ;
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int int
getServiceTable( IXML_Node * node, getServiceTable( IXML_Node * node,
@@ -1126,9 +1153,8 @@ getServiceTable( IXML_Node * node,
} }
} }
if( ( out->serviceList = getAllServiceList( root, out->URLBase, if( ( out->serviceList = getAllServiceList(
&out-> root, out->URLBase, &out->endServiceList ) ) ) {
endServiceList ) ) ) {
return 1; return 1;
} }

View File

@@ -171,7 +171,7 @@ memptr_cmp_nocase( IN memptr * m,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE void
membuffer_initialize( INOUT membuffer * m ) membuffer_initialize( INOUT membuffer * m )
{ {
m->buf = NULL; m->buf = NULL;
@@ -331,9 +331,10 @@ membuffer_assign( INOUT membuffer * m,
return return_code; return return_code;
} }
// copy // copy
memcpy( m->buf, buf, buf_len ); if( buf_len ) {
m->buf[buf_len] = 0; // null-terminate memcpy( m->buf, buf, buf_len );
m->buf[buf_len] = 0; // null-terminate
}
m->length = buf_len; m->length = buf_len;
return 0; return 0;

View File

@@ -95,6 +95,17 @@
#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
@@ -250,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/upnpdebug.h> see <upnp/inc/upnpdebug.h>
*/ */
#define DEBUG_ALL 1 #define DEBUG_ALL 1
@@ -293,27 +304,6 @@
/** @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
@@ -348,13 +338,6 @@
# define CLIENTONLY(x) # define CLIENTONLY(x)
#endif #endif
#ifdef INCLUDE_DEVICE_APIS
# define DEVICEONLY(x) x
#else
# define DEVICEONLY(x)
#endif
//@} //@}
#endif #endif

View File

@@ -89,25 +89,26 @@
#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() \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \ UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Trying Subscribe Lock")); \ "Trying Subscribe Lock"); \
ithread_mutex_lock(&GlobalClientSubscribeMutex); \ ithread_mutex_lock(&GlobalClientSubscribeMutex); \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe Lock");) UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Subscribe Lock");
//Unlock the subscription // Unlock the subscription
#define SubscribeUnlock() \ #define SubscribeUnlock() \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \ UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Trying Subscribe UnLock")); \ "Trying Subscribe UnLock"); \
ithread_mutex_unlock(&GlobalClientSubscribeMutex); \ ithread_mutex_unlock(&GlobalClientSubscribeMutex); \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe UnLock");) UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Subscribe UnLock");
//Structure to send NOTIFY message to all subscribed control points // Structure to send NOTIFY message to all subscribed control points
typedef struct NOTIFY_THREAD_STRUCT { typedef struct NOTIFY_THREAD_STRUCT {
char * headers; char * headers;
DOMString propertySet; DOMString propertySet;
@@ -161,11 +162,13 @@ 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
***************************************************************************/ ***************************************************************************/
CLIENTONLY( #ifdef INCLUDE_CLIENT_APIS
EXTERN_C int genaSubscribe(UpnpClient_Handle client_handle, EXTERN_C int genaSubscribe(
char * PublisherURL, UpnpClient_Handle client_handle,
int * TimeOut, char * PublisherURL,
Upnp_SID out_sid );) int * TimeOut,
Upnp_SID out_sid );
#endif
/************************************************************************ /************************************************************************
@@ -184,8 +187,11 @@ CLIENTONLY(
* 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
***************************************************************************/ ***************************************************************************/
CLIENTONLY(EXTERN_C int genaUnSubscribe(UpnpClient_Handle client_handle, #ifdef INCLUDE_CLIENT_APIS
const Upnp_SID in_sid);) EXTERN_C int genaUnSubscribe(
UpnpClient_Handle client_handle,
const Upnp_SID in_sid);
#endif
/************************************************************************ /************************************************************************
* Function : genaUnregisterClient * Function : genaUnregisterClient
@@ -202,8 +208,9 @@ CLIENTONLY(EXTERN_C int genaUnSubscribe(UpnpClient_Handle client_handle,
* Returns: int * Returns: int
* return UPNP_E_SUCCESS if successful else returns appropriate error * return UPNP_E_SUCCESS if successful else returns appropriate error
***************************************************************************/ ***************************************************************************/
CLIENTONLY(EXTERN_C int genaUnregisterClient( #ifdef INCLUDE_CLIENT_APIS
UpnpClient_Handle client_handle);) EXTERN_C int genaUnregisterClient(UpnpClient_Handle client_handle);
#endif
//server //server
/************************************************************************ /************************************************************************
@@ -218,8 +225,9 @@ CLIENTONLY(EXTERN_C int genaUnregisterClient(
* 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
****************************************************************************/ ****************************************************************************/
DEVICEONLY(EXTERN_C int genaUnregisterDevice( #ifdef INCLUDE_DEVICE_APIS
UpnpDevice_Handle device_handle);) EXTERN_C int genaUnregisterDevice(UpnpDevice_Handle device_handle);
#endif
/************************************************************************ /************************************************************************
@@ -242,10 +250,12 @@ DEVICEONLY(EXTERN_C int genaUnregisterDevice(
* 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
***************************************************************************/ ***************************************************************************/
CLIENTONLY(EXTERN_C int genaRenewSubscription( #ifdef INCLUDE_CLIENT_APIS
IN UpnpClient_Handle client_handle, EXTERN_C int genaRenewSubscription(
IN const Upnp_SID in_sid, IN UpnpClient_Handle client_handle,
OUT int * TimeOut);) IN const Upnp_SID in_sid,
OUT int * TimeOut);
#endif
/**************************************************************************** /****************************************************************************
* Function : genaNotifyAll * Function : genaNotifyAll
* *
@@ -265,33 +275,40 @@ CLIENTONLY(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.
****************************************************************************/ ****************************************************************************/
DEVICEONLY(EXTERN_C int genaNotifyAll(UpnpDevice_Handle device_handle, #ifdef INCLUDE_DEVICE_APIS
char *UDN, EXTERN_C int genaNotifyAll(
char *servId, UpnpDevice_Handle device_handle,
char **VarNames, char *UDN,
char **VarValues, char *servId,
int var_count char **VarNames,
);) char **VarValues,
int var_count);
#endif
/**************************************************************************** /****************************************************************************
* Function : genaNotifyAllExt * Function : genaNotifyAllExt
* *
* Parameters : * Parameters :
* IN UpnpDevice_Handle device_handle : Device handle * IN UpnpDevice_Handle device_handle : Device handle
* IN char *UDN : Device udn * IN char *UDN : Device udn
* IN char *servId : Service ID * IN char *servId : Service ID
* IN IXML_Document *PropSet : XML document Event varible property set * IN IXML_Document *PropSet : XML document Event varible property set
* *
* Description : This function sends a notification to all the subscribed * Description : This function sends a notification to all the subscribed
* control points * control points
* *
* Return : int * Return : int
* *
* 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
****************************************************************************/ ****************************************************************************/
DEVICEONLY(EXTERN_C int genaNotifyAllExt(UpnpDevice_Handle device_handle, #ifdef INCLUDE_DEVICE_APIS
char *UDN, char *servId,IN IXML_Document *PropSet);) EXTERN_C int genaNotifyAllExt(
UpnpDevice_Handle device_handle,
char *UDN,
char *servId,
IN IXML_Document *PropSet);
#endif
/**************************************************************************** /****************************************************************************
* Function : genaInitNotify * Function : genaInitNotify
@@ -314,13 +331,15 @@ DEVICEONLY(EXTERN_C int genaNotifyAllExt(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.
****************************************************************************/ ****************************************************************************/
DEVICEONLY(EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle, #ifdef INCLUDE_DEVICE_APIS
IN char *UDN, EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle,
IN char *servId, IN char *UDN,
IN char **VarNames, IN char *servId,
IN char **VarValues, IN char **VarNames,
IN int var_count, IN char **VarValues,
IN Upnp_SID sid);) IN int var_count,
IN Upnp_SID sid);
#endif
/**************************************************************************** /****************************************************************************
* Function : genaInitNotifyExt * Function : genaInitNotifyExt
@@ -342,12 +361,14 @@ DEVICEONLY(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.
****************************************************************************/ ****************************************************************************/
DEVICEONLY(EXTERN_C int genaInitNotifyExt( #ifdef INCLUDE_DEVICE_APIS
IN UpnpDevice_Handle device_handle, EXTERN_C int genaInitNotifyExt(
IN char *UDN, IN UpnpDevice_Handle device_handle,
IN char *servId, IN char *UDN,
IN IXML_Document *PropSet, IN char *servId,
IN Upnp_SID sid);) IN IXML_Document *PropSet,
IN Upnp_SID sid);
#endif
/************************************************************************ /************************************************************************

View File

@@ -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;
int size; size_t size;
} token; } token;
@@ -214,37 +214,101 @@ 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);
DBGONLY(EXTERN_C void print_http_request(http_message #ifdef DEBUG
*message,Dbg_Level DLevel, EXTERN_C void print_http_request(
Dbg_Module Module,char *DbgFileName, http_message *message,
int DbgLineNo);); Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_http_request(
http_message *message,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_http_response(http_message *message, #ifdef DEBUG
Dbg_Level DLevel, EXTERN_C void print_http_response(
Dbg_Module Module,char *DbgFileName, http_message *message,
int DbgLineNo);); Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_http_response(
http_message *message,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_token( token * in, #ifdef DEBUG
Dbg_Level DLevel, EXTERN_C void print_token(
Dbg_Module Module, token *in,
char *DbgFileName, Upnp_LogLevel DLevel,
int DbgLineNo);); Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_token(
token *in,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_status_line(http_status *in, #ifdef DEBUG
Dbg_Level DLevel, EXTERN_C void print_status_line(
Dbg_Module Module, http_status *in,
char *DbgFileName, Upnp_LogLevel DLevel,
int DbgLineNo);); Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_status_line(
http_status *in,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_request_line(http_request *in, #ifdef DEBUG
Dbg_Level DLevel, EXTERN_C void print_request_line(
Dbg_Module Module, http_request *in,
char *DbgFileName,int DbgLineNo)); Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_request_line(
http_request *in,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_uri( uri_type *in, #ifdef DEBUG
Dbg_Level DLevel, EXTERN_C void print_uri(
Dbg_Module Module, uri_type *in,
char *DbgFileName, Upnp_LogLevel DLevel,
int DbgLineNo);); Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_uri(
uri_type *in,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
#endif #endif

View File

@@ -456,6 +456,8 @@ 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.
************************************************************************/ ************************************************************************/
@@ -486,7 +488,11 @@ const char* method_to_str( IN http_method_t method );
* Returns: * Returns:
* void * void
************************************************************************/ ************************************************************************/
void print_http_headers( IN http_message_t* hmsg ); #ifdef DEBUG
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"
@@ -494,3 +500,4 @@ void print_http_headers( IN http_message_t* hmsg );
#endif // GENLIB_NET_HTTP_HTTPPARSER_H #endif // GENLIB_NET_HTTP_HTTPPARSER_H

View File

@@ -475,6 +475,7 @@ int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
* memory ptr * memory ptr
* 'c': (no args) appends CRLF "\r\n" * 'c': (no args) appends CRLF "\r\n"
* 'd': arg = int number // appends decimal number * 'd': arg = int number // appends decimal number
* 'h': arg = off_t number // appends off_t number
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt * 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'D': (no args) appends HTTP DATE: header * 'D': (no args) appends HTTP DATE: header
* 'S': (no args) appends HTTP SERVER: header * 'S': (no args) appends HTTP SERVER: header

View File

@@ -7,7 +7,7 @@
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#define socklen_t int typedef int socklen_t;
#define EAFNOSUPPORT 97 #define EAFNOSUPPORT 97
/* /*

View File

@@ -51,8 +51,7 @@ 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 char *buf; // mem buffer; must not write beyond buf[length-1] (read/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)
@@ -148,8 +147,7 @@ int memptr_cmp_nocase( IN memptr* m, IN const char* s );
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int membuffer_set_size( INOUT membuffer* m, int membuffer_set_size( INOUT membuffer* m, IN size_t new_length );
IN size_t new_length );
/************************************************************************ /************************************************************************
* Function : membuffer_init * Function : membuffer_init
@@ -200,8 +198,7 @@ void membuffer_destroy( INOUT membuffer* m );
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int membuffer_assign( INOUT membuffer* m, IN const void* buf, int membuffer_assign( INOUT membuffer* m, IN const void* buf, IN size_t buf_len );
IN size_t buf_len );
/************************************************************************ /************************************************************************
* Function : membuffer_assign_str * Function : membuffer_assign_str
@@ -237,8 +234,7 @@ int membuffer_assign_str( INOUT membuffer* m, IN const char* c_str );
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int membuffer_append( INOUT membuffer* m, IN const void* buf, int membuffer_append( INOUT membuffer* m, IN const void* buf, IN size_t buf_len );
IN size_t buf_len );
/************************************************************************ /************************************************************************
* Function : membuffer_append_str * Function : membuffer_append_str
@@ -276,8 +272,7 @@ int membuffer_append_str( INOUT membuffer* m, IN const char* c_str );
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int membuffer_insert( INOUT membuffer* m, IN const void* buf, int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, int index );
IN size_t buf_len, int index );
/************************************************************************ /************************************************************************
@@ -298,8 +293,7 @@ int membuffer_insert( INOUT membuffer* m, IN const void* buf,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
void membuffer_delete( INOUT membuffer* m, IN int index, void membuffer_delete( INOUT membuffer* m, IN int index, IN size_t num_bytes );
IN size_t num_bytes );
/************************************************************************ /************************************************************************
@@ -336,8 +330,7 @@ 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, void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len );
IN size_t buf_len );
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif // __cplusplus #endif // __cplusplus

View File

@@ -88,7 +88,11 @@ 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

View File

@@ -47,7 +47,7 @@ extern "C" {
#define SID_SIZE 41 #define SID_SIZE 41
DEVICEONLY( #ifdef INCLUDE_DEVICE_APIS
typedef struct SUBSCRIPTION { typedef struct SUBSCRIPTION {
Upnp_SID sid; Upnp_SID sid;
@@ -61,18 +61,19 @@ typedef struct SUBSCRIPTION {
typedef struct SERVICE_INFO { typedef struct SERVICE_INFO {
DOMString serviceType; DOMString serviceType;
DOMString serviceId; DOMString serviceId;
char *SCPDURL ; char *SCPDURL ;
char *controlURL; char *controlURL;
char *eventURL; char *eventURL;
DOMString UDN; DOMString UDN;
int active; int active;
int TotalSubscriptions; int TotalSubscriptions;
subscription *subscriptionList; subscription *subscriptionList;
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;
@@ -80,7 +81,7 @@ typedef struct SERVICE_TABLE {
} service_table; } service_table;
/* Functions for Subscriptions */ /* Functions for Subscriptions */
/************************************************************************ /************************************************************************
* Function : copy_subscription * Function : copy_subscription
@@ -246,14 +247,14 @@ service_info * FindServiceEventURLPath( service_table *table,
* Note : * Note :
************************************************************************/ ************************************************************************/
service_info * FindServiceControlURLPath( service_table *table, service_info * FindServiceControlURLPath( service_table *table,
char * controlURLPath); const char * controlURLPath);
/************************************************************************ /************************************************************************
* Function : printService * Function : printService
* *
* Parameters : * Parameters :
* service_info *service ;Service whose information is to be printed * service_info *service ;Service whose information is to be printed
* Dbg_Level level ; Debug level specified to the print function * Upnp_LogLevel 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
@@ -263,16 +264,24 @@ service_info * FindServiceControlURLPath( service_table *table,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
DBGONLY(void printService(service_info *service,Dbg_Level #ifdef DEBUG
level, void printService(
Dbg_Module module)); service_info *service,
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
* Dbg_Level level ; Debug level specified to the print function * Upnp_LogLevel 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
@@ -282,15 +291,24 @@ DBGONLY(void printService(service_info *service,Dbg_Level
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
DBGONLY(void printServiceList(service_info *service, #ifdef DEBUG
Dbg_Level level, Dbg_Module module)); void printServiceList(
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
* Dbg_Level level ; Debug level specified to the print function * Upnp_LogLevel 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
@@ -301,9 +319,17 @@ DBGONLY(void printServiceList(service_info *service,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
DBGONLY(void printServiceTable(service_table * #ifdef DEBUG
table,Dbg_Level void printServiceTable(
level,Dbg_Module module)); service_table *table,
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
@@ -451,10 +477,11 @@ int getSubElement(const char *element_name, IXML_Node *node,
IXML_Node **out); IXML_Node **out);
) /* DEVICEONLY */ #endif /* INCLUDE_DEVICE_APIS */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _SERVICE_TABLE */ #endif /* _SERVICE_TABLE */

View File

@@ -33,28 +33,28 @@
#define SOAPLIB_H #define SOAPLIB_H
//SOAP module API to be called in Upnp-Dk API // SOAP module API to be called in Upnp-Dk API
/**************************************************************************** /****************************************************************************
* Function : soap_device_callback * Function : soap_device_callback
* *
* Parameters : * Parameters :
* IN http_parser_t *parser : Parsed request received by the device * IN http_parser_t *parser : Parsed request received by the device
* IN http_message_t* request : HTTP request * IN http_message_t* request : HTTP request
* INOUT SOCKINFO *info : socket info * INOUT SOCKINFO *info : socket info
* *
* Description : This is a callback called by minisever after receiving * Description : This is a callback called by minisever after receiving
* the request from the control point. This function will start * the request from the control point. This function will start
* processing the request. It calls handle_invoke_action to handle the * processing the request. It calls handle_invoke_action to handle the
* SOAP action * SOAP action
* *
* Return : void * Return : void
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
void soap_device_callback( void soap_device_callback(
IN http_parser_t *parser, IN http_parser_t *parser,
IN http_message_t* request, IN http_message_t* request,
INOUT SOCKINFO *info ); INOUT SOCKINFO *info );
/**************************************************************************** /****************************************************************************

View File

@@ -80,7 +80,7 @@ typedef enum SsdpCmdType{SSDP_ERROR=-1,
#define SSDP_IP "239.255.255.250" #define SSDP_IP "239.255.255.250"
#define SSDP_PORT 1900 #define SSDP_PORT 1900
#define NUM_TRY 3 #define NUM_TRY 3
#define NUM_COPY 2 #define NUM_COPY 1
#define THREAD_LIMIT 50 #define THREAD_LIMIT 50
#define COMMAND_LEN 300 #define COMMAND_LEN 300
@@ -211,8 +211,15 @@ int Make_Socket_NoBlocking (int sock);
* Returns: void * * Returns: void *
* 1 if successful else appropriate error * 1 if successful else appropriate error
***************************************************************************/ ***************************************************************************/
void ssdp_handle_device_request( IN http_message_t* hmsg, #ifdef INCLUDE_DEVICE_APIS
IN struct sockaddr_in* dest_addr ); void ssdp_handle_device_request(
IN http_message_t* hmsg,
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
@@ -221,10 +228,10 @@ void ssdp_handle_device_request( IN http_message_t* hmsg,
* IN http_message_t* hmsg: SSDP message from the device * IN http_message_t* hmsg: SSDP message from the device
* IN struct sockaddr_in* dest_addr: Address of the device * IN struct sockaddr_in* dest_addr: Address of the device
* IN xboolean timeout: timeout kept by the control point while sending * IN xboolean timeout: timeout kept by the control point while sending
* search message * search message
* IN void* cookie: Cookie stored by the control point application. * IN void* cookie: Cookie stored by the control point application.
* This cookie will be returned to the control point * This cookie will be returned to the control point
* in the callback * in the callback
* *
* Description: * Description:
* This function handles the ssdp messages from the devices. These * This function handles the ssdp messages from the devices. These
@@ -234,10 +241,11 @@ void ssdp_handle_device_request( IN http_message_t* hmsg,
* Returns: void * Returns: void
* *
***************************************************************************/ ***************************************************************************/
void ssdp_handle_ctrlpt_msg( IN http_message_t* hmsg, void ssdp_handle_ctrlpt_msg(
IN struct sockaddr_in* dest_addr, IN http_message_t* hmsg,
IN xboolean timeout, IN struct sockaddr_in* dest_addr,
IN void* cookie ); IN xboolean timeout,
IN void* cookie );
/************************************************************************ /************************************************************************
* Function : unique_service_name * Function : unique_service_name
@@ -245,7 +253,7 @@ void ssdp_handle_ctrlpt_msg( IN http_message_t* hmsg,
* Parameters: * Parameters:
* IN char *cmd: Service Name string * IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled * OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function. * by all the function.
* *
* Description: * Description:
* This function fills the fields of the event structure like DeviceType, * This function fills the fields of the event structure like DeviceType,
@@ -326,12 +334,10 @@ 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 * IN int Mx:Number of seconds to wait, to collect all the responses.
* 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.
@@ -345,12 +351,11 @@ int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie);
* Function : DeviceAdvertisement * Function : DeviceAdvertisement
* *
* 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 * nt : value of NT * IN char *Udn :
* IN char * usn : * IN char *Location: Location URL.
* IN char * location :Location URL. * IN int Duration : Service duration in sec.
* 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
@@ -359,8 +364,12 @@ 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(IN char * DevType, int RootDev,char * Udn, int DeviceAdvertisement(
IN char * Location, IN int Duration); IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *Location,
IN int Duration);
/************************************************************************ /************************************************************************
@@ -369,10 +378,10 @@ int DeviceAdvertisement(IN char * DevType, int RootDev,char * Udn,
* Parameters: * Parameters:
* IN char *DevType: Device Type. * IN char *DevType: Device Type.
* IN int RootDev:1 means root device. * IN int RootDev:1 means root device.
* IN char * Udn: Device UDN * IN char *Udn: Device UDN
* IN char *_Server: * IN char *_Server:
* IN char * Location: Location URL * IN char *Location: Location URL
* IN int Duration :Device duration in sec. * IN int Duration :Device duration in sec.
* *
* Description: * Description:
* This function creates a HTTP device shutdown request packet * This function creates a HTTP device shutdown request packet
@@ -381,12 +390,13 @@ int DeviceAdvertisement(IN char * DevType, int RootDev,char * Udn,
* Returns: int * Returns: int
* UPNP_E_SUCCESS if successful else appropriate error * UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/ ***************************************************************************/
int DeviceShutdown( IN char * DevType, int DeviceShutdown(
IN int RootDev, IN char *DevType,
IN char * Udn, IN int RootDev,
IN char * _Server, IN char *Udn,
IN char * Location, IN char *_Server,
IN int Duration ); IN char *Location,
IN int Duration);
/************************************************************************ /************************************************************************
* Function : DeviceReply * Function : DeviceReply
@@ -395,10 +405,10 @@ int DeviceShutdown( IN char * DevType,
* IN struct sockaddr_in * DestAddr:destination IP address. * IN struct sockaddr_in * DestAddr:destination IP address.
* IN char *DevType: Device type * IN char *DevType: Device type
* IN int RootDev: 1 means root device 0 means embedded device. * IN int RootDev: 1 means root device 0 means embedded device.
* 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.
@@ -406,11 +416,12 @@ int DeviceShutdown( IN char * DevType,
* Returns: int * Returns: int
* UPNP_E_SUCCESS if successful else appropriate error * UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/ ***************************************************************************/
int DeviceReply(IN struct sockaddr_in * DestAddr, int DeviceReply(
IN char *DevType, IN struct sockaddr_in * DestAddr,
IN int RootDev, IN char *DevType,
IN char * Udn, IN int RootDev,
IN char * Location, IN int Duration); IN char *Udn,
IN char *Location, IN int Duration);
/************************************************************************ /************************************************************************
* Function : SendReply * Function : SendReply
@@ -421,8 +432,8 @@ int DeviceReply(IN struct sockaddr_in * DestAddr,
* IN int RootDev: 1 means root device 0 means embedded device. * IN int RootDev: 1 means root device 0 means embedded device.
* IN char * Udn: Device UDN * IN char * Udn: Device UDN
* IN char *_Server: * IN char *_Server:
* 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.
* IN int ByType: * IN int ByType:
* *
* Description: * Description:
@@ -432,13 +443,14 @@ int DeviceReply(IN struct sockaddr_in * DestAddr,
* Returns: int * Returns: int
* UPNP_E_SUCCESS if successful else appropriate error * UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/ ***************************************************************************/
int SendReply(IN struct sockaddr_in * DestAddr, int SendReply(
IN char *DevType, IN struct sockaddr_in * DestAddr,
IN int RootDev, IN char *DevType,
IN char * Udn, IN int RootDev,
IN char * Location, IN char *Udn,
IN int Duration, IN char *Location,
IN int ByType ); IN int Duration,
IN int ByType );
/************************************************************************ /************************************************************************
* Function : ServiceAdvertisement * Function : ServiceAdvertisement
@@ -447,55 +459,55 @@ int SendReply(IN struct sockaddr_in * DestAddr,
* IN char * Udn: Device UDN * IN char * Udn: Device 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
***************************************************************************/ ***************************************************************************/
int ServiceAdvertisement( IN char * Udn, int ServiceAdvertisement(
IN char * ServType, IN char *Udn,
IN char * Location, IN char *ServType,
IN int Duration); IN char *Location,
IN int Duration);
/************************************************************************ /************************************************************************
* Function : ServiceReply * Function : ServiceReply
* *
* Parameters: * Parameters:
* IN struct sockaddr_in *DestAddr: * IN struct sockaddr_in *DestAddr:
* IN char * Udn: Device UDN * IN char *Udn: Device UDN
* IN char *ServType: Service Type. * IN char *ServType: Service Type.
* 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(IN struct sockaddr_in *DestAddr, int ServiceReply(
IN char * ServType, IN struct sockaddr_in *DestAddr,
IN char * Udn, IN char *ServType,
IN char * Location, IN char *Udn,
IN int Duration); IN char *Location,
IN int Duration);
/************************************************************************ /************************************************************************
* Function : ServiceShutdown * Function : ServiceShutdown
* *
* Parameters: * Parameters:
* IN char * Udn: Device UDN * IN char *Udn: Device 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 :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.
@@ -503,16 +515,18 @@ int ServiceReply(IN struct sockaddr_in *DestAddr,
* Returns: int * Returns: int
* UPNP_E_SUCCESS if successful else appropriate error * UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/ ***************************************************************************/
int ServiceShutdown( IN char * Udn, IN char * ServType, int ServiceShutdown(
IN char * Location, IN char *Udn,
IN int Duration); IN char *ServType,
IN char *Location,
IN int Duration);
/************************************************************************ /************************************************************************
* Function : advertiseAndReplyThread * Function : advertiseAndReplyThread
* *
* Parameters: * Parameters:
* IN void *data: Structure containing the search request * IN void *data: Structure containing the search request
* *
* Description: * Description:
* This function is a wrapper function to reply the search request * This function is a wrapper function to reply the search request
@@ -521,20 +535,21 @@ int ServiceShutdown( IN char * Udn, IN char * ServType,
* Returns: void * * Returns: void *
* always return NULL * always return NULL
***************************************************************************/ ***************************************************************************/
void * advertiseAndReplyThread(IN void * data); void *advertiseAndReplyThread(IN void * data);
/************************************************************************ /************************************************************************
* Function : AdvertiseAndReply * Function : AdvertiseAndReply
* *
* Parameters: * Parameters:
* IN int AdFlag: -1 = Send shutdown, 0 = send reply, * IN int AdFlag: -1 = Send shutdown,
* 1 = Send Advertisement * 0 = send reply,
* 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
* IN struct sockaddr_in *DestAddr:Destination address * IN struct sockaddr_in *DestAddr:Destination address
* IN char *DeviceType:Device type * IN char *DeviceType:Device type
* IN char *DeviceUDN:Device UDN * IN char *DeviceUDN:Device UDN
* IN char *ServiceType:Service type * IN char *ServiceType:Service type
* IN int Exp:Advertisement age * IN int Exp:Advertisement age
* *
* Description: * Description:
@@ -543,13 +558,14 @@ 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(IN int AdFlag, int AdvertiseAndReply(
IN UpnpDevice_Handle Hnd, IN int AdFlag,
IN enum SsdpSearchType SearchType, IN UpnpDevice_Handle Hnd,
IN struct sockaddr_in *DestAddr, IN enum SsdpSearchType SearchType,
IN char *DeviceType, IN struct sockaddr_in *DestAddr,
IN char *DeviceUDN, IN char *DeviceType,
IN char *ServiceType, int Exp); IN char *DeviceUDN,
IN char *ServiceType, int Exp);
#endif #endif

View File

@@ -36,12 +36,11 @@
#include <sys/types.h> #include <sys/types.h>
#ifndef WIN32 #ifndef WIN32
#include <sys/socket.h> #include <sys/socket.h>
#else #else
#define XINLINE typedef int socklen_t;
#define EAFNOSUPPORT 97
#define socklen_t int
#define EAFNOSUPPORT 97
#endif #endif
#endif // GENLIB_NET_UNIXUTIL_H #endif // GENLIB_NET_UNIXUTIL_H

View File

@@ -71,33 +71,53 @@ struct Handle_Info
Upnp_FunPtr Callback; // Callback function pointer. Upnp_FunPtr Callback; // Callback function pointer.
char * Cookie; char * Cookie;
DEVICEONLY(char DescURL[LINE_SIZE];) // URL for the use of SSDP // Device Only
DEVICEONLY(char DescXML[LINE_SIZE];) // XML file path for device #ifdef INCLUDE_DEVICE_APIS
//description char DescURL[LINE_SIZE]; // URL for the use of SSDP
char DescXML[LINE_SIZE]; // XML file path for device
//description
DEVICEONLY(int MaxAge;) // Advertisement timeout int MaxAge; // Advertisement timeout
DEVICEONLY(IXML_Document *DescDocument;) // Description parsed in IXML_Document *DescDocument;// Description parsed in
//terms of DOM document //terms of DOM document
DEVICEONLY(IXML_NodeList *DeviceList;) // List of devices in the IXML_NodeList *DeviceList; // List of devices in the
//description document //description document
DEVICEONLY(IXML_NodeList *ServiceList;) // List of services in the IXML_NodeList *ServiceList; // List of services in the
// description document // description document
DEVICEONLY(service_table ServiceTable;) //table holding subscriptions and service_table ServiceTable; //table holding subscriptions and
//URL information //URL information
DEVICEONLY(int MaxSubscriptions;) int MaxSubscriptions;
DEVICEONLY(int MaxSubscriptionTimeOut;) int MaxSubscriptionTimeOut;
#endif
//Client only // Client only
CLIENTONLY(client_subscription * ClientSubList;) //client subscription list #ifdef INCLUDE_CLIENT_APIS
CLIENTONLY(LinkedList SsdpSearchList;) // active ssdp searches client_subscription *ClientSubList; //client subscription list
LinkedList SsdpSearchList; // active ssdp searches
#endif
int aliasInstalled; // 0 = not installed; otherwise installed int aliasInstalled; // 0 = not installed; otherwise installed
} ; };
extern ithread_mutex_t GlobalHndMutex; extern ithread_rwlock_t GlobalHndRWLock;
Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo); Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);
#define HandleLock() DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Trying Lock")); ithread_mutex_lock(&GlobalHndMutex); DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"LOCK")); #define HandleLock() HandleWriteLock()
#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,
@@ -111,7 +131,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,
@@ -163,7 +183,6 @@ 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

View File

@@ -86,8 +86,8 @@ enum uriType { absolute, relative };
/* Buffer used in parsinghttp messages, urls, etc. generally this simply /* Buffer used in parsinghttp messages, urls, etc. generally this simply
* holds a pointer into a larger array */ * holds a pointer into a larger array */
typedef struct TOKEN { typedef struct TOKEN {
char * buff; const char *buff;
int size; size_t 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
* int *max ; * size_t *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, int *max); int replace_escaped(char * in, int index, size_t *max);
/************************************************************************ /************************************************************************
* Function : copy_URL_list * Function : copy_URL_list
@@ -182,13 +182,16 @@ 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 :
************************************************************************/ ************************************************************************/
DBGONLY(void print_uri( uri_type *in);) #ifdef DEBUG
void print_uri(uri_type *in);
#else
static UPNP_INLINE void print_uri(uri_type *in) {}
#endif
/************************************************************************ /************************************************************************
* Function : print_token * Function : print_token
@@ -197,13 +200,16 @@ DBGONLY(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 :
************************************************************************/ ************************************************************************/
void print_token( token * in); #ifdef DEBUG
void print_token(token *in);
#else
static UPNP_INLINE void print_token(token * in) {}
#endif
/************************************************************************ /************************************************************************
* Function : token_string_casecmp * Function : token_string_casecmp
@@ -276,7 +282,7 @@ int token_cmp( token *in1, token *in2);
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int parse_port(int max, char * port, unsigned short int * out); int parse_port(int max, const char *port, unsigned short int *out);
/************************************************************************ /************************************************************************
* Function : parse_hostport * Function : parse_hostport
@@ -296,14 +302,14 @@ int parse_port(int max, char * port, unsigned short int * out);
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int parse_hostport( char* in, int max, hostport_type *out ); int parse_hostport(const char *in, int max, hostport_type *out );
/************************************************************************ /************************************************************************
* Function : remove_escaped_chars * Function : remove_escaped_chars
* *
* Parameters : * Parameters :
* INOUT char *in ; string of characters to be modified * INOUT char *in ; string of characters to be modified
* INOUT int *size ; size limit for the number of characters * INOUT size_t *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.
@@ -315,7 +321,7 @@ int parse_hostport( char* in, int max, hostport_type *out );
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int remove_escaped_chars(char *in,int *size); int remove_escaped_chars(char *in, size_t *size);
/************************************************************************ /************************************************************************
* Function : remove_dots * Function : remove_dots
@@ -391,7 +397,7 @@ char * resolve_rel_url( char * base_url, char * rel_url);
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
int parse_uri( char * in, int max, uri_type * out); int parse_uri(const char * in, int max, uri_type * out);
/************************************************************************ /************************************************************************
* Function : parse_uri_and_unescape * Function : parse_uri_and_unescape

View File

@@ -47,12 +47,6 @@
#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
@@ -142,31 +136,28 @@ 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
#ifndef WIN32 #ifdef WIN32
#define XINLINE inline #ifndef S_ISREG
#else #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
#ifndef S_ISREG #ifndef S_ISDIR
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif #endif
#ifndef S_ISDIR #define EADDRINUSE WSAEADDRINUSE
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
#define EADDRINUSE WSAEADDRINUSE #define strcasecmp stricmp
#define strncasecmp strnicmp
#define strcasecmp stricmp #define sleep(a) Sleep((a)*1000)
#define strncasecmp strnicmp #define usleep(a) Sleep((a)/1000)
#define sleep Sleep
#define usleep(a) Sleep((a)/1000)
#endif #endif
#endif // __cplusplus #endif // __cplusplus
#endif /* GENLIB_UTIL_UTIL_H */ #endif /* GENLIB_UTIL_UTIL_H */

View File

@@ -48,8 +48,8 @@ struct SendInstruction
int IsRangeActive; int IsRangeActive;
int IsTrailers; int IsTrailers;
char RangeHeader[200]; char RangeHeader[200];
long RangeOffset; off_t RangeOffset;
long ReadSendSize; // Read from local source and send on the network. off_t ReadSendSize; // Read from local source and send on the network.
long RecvWriteSize; // Recv from the network and write into local file. long RecvWriteSize; // Recv from the network and write into local file.
//Later few more member could be added depending on the requirement. //Later few more member could be added depending on the requirement.

View File

@@ -28,7 +28,7 @@
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#define socklen_t int typedef int socklen_t;
#define EAFNOSUPPORT 97 #define EAFNOSUPPORT 97
/* /*
* WARNING: Don't even consider trying to compile this on a system where * WARNING: Don't even consider trying to compile this on a system where

View File

@@ -212,11 +212,11 @@ dom_find_deep_node( IN char *names[],
* *
* Note :The given node must have a text node as its first child * Note :The given node must have a text node as its first child
****************************************************************************/ ****************************************************************************/
static DOMString static const DOMString
get_node_value( IN IXML_Node * node ) get_node_value( IN IXML_Node * node )
{ {
IXML_Node *text_node = NULL; IXML_Node *text_node = NULL;
DOMString text_value = NULL; const DOMString text_value = NULL;
text_node = ixmlNode_getFirstChild( node ); text_node = ixmlNode_getFirstChild( node );
if( text_node == NULL ) { if( text_node == NULL ) {
@@ -244,20 +244,21 @@ get_node_value( IN IXML_Node * node )
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE int static UPNP_INLINE int
get_host_and_path( IN char *ctrl_url, get_host_and_path( IN char *ctrl_url,
OUT memptr * host, OUT const memptr *host,
OUT memptr * path, OUT const memptr *path,
OUT uri_type * url ) OUT uri_type * url )
{ {
if( parse_uri( ctrl_url, strlen( ctrl_url ), url ) != HTTP_SUCCESS ) { if( parse_uri( ctrl_url, strlen( ctrl_url ), url ) != HTTP_SUCCESS ) {
return -1; return -1;
} }
host->buf = url->hostport.text.buff; // This is done to ensure that the buffer is kept const
host->length = url->hostport.text.size; ((memptr *)host)->buf = (char *)url->hostport.text.buff;
((memptr *)host)->length = url->hostport.text.size;
path->buf = url->pathquery.buff; ((memptr *)path)->buf = (char *)url->pathquery.buff;
path->length = url->pathquery.size; ((memptr *)path)->length = url->pathquery.size;
return 0; return 0;
} }
@@ -276,7 +277,7 @@ get_host_and_path( IN char *ctrl_url,
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE int static UPNP_INLINE int
get_action_name( IN char *action, get_action_name( IN char *action,
OUT memptr * name ) OUT memptr * name )
{ {
@@ -302,7 +303,7 @@ get_action_name( IN char *action,
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE int static UPNP_INLINE int
add_man_header( INOUT membuffer * headers ) add_man_header( INOUT membuffer * headers )
{ {
char *soap_action_hdr; char *soap_action_hdr;
@@ -414,12 +415,12 @@ get_response_value( IN http_message_t * hmsg,
IXML_Node *error_node = NULL; IXML_Node *error_node = NULL;
IXML_Document *doc = NULL; IXML_Document *doc = NULL;
char *node_str = NULL; char *node_str = NULL;
char *temp_str = NULL; const char *temp_str = NULL;
DOMString error_node_str = NULL; DOMString error_node_str = NULL;
int err_code; int err_code;
xboolean done = FALSE; xboolean done = FALSE;
char *names[5]; char *names[5];
DOMString nodeValue; const DOMString nodeValue;
err_code = UPNP_E_BAD_RESPONSE; // default error err_code = UPNP_E_BAD_RESPONSE; // default error
@@ -601,25 +602,27 @@ SoapSendAction( IN char *action_url,
char *upnp_error_str; char *upnp_error_str;
xboolean got_response = FALSE; xboolean got_response = FALSE;
off_t content_length;
char *xml_start = char *xml_start =
// "<?xml version=\"1.0\"?>\n" required?? "<s:Envelope "
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
"<s:Body>"; "<s:Body>";
char *xml_end = "</s:Body>\n" "</s:Envelope>\n"; char *xml_end =
int xml_start_len; "</s:Body>\r\n"
int xml_end_len; "</s:Envelope>\r\n\r\n";
int action_str_len; size_t xml_start_len;
size_t xml_end_len;
size_t 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
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Inside SoapSendAction():" ); "Inside SoapSendAction():" );
) // init
// init membuffer_init( &request );
membuffer_init( &request );
membuffer_init( &responsename ); membuffer_init( &responsename );
// print action // print action
@@ -638,24 +641,30 @@ SoapSendAction( IN char *action_url,
goto error_handler; goto error_handler;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"path=%.*s, hostport=%.*s\n", "path=%.*s, hostport=%.*s\n",
url.pathquery.size, url.pathquery.buff, (int)url.pathquery.size,
url.hostport.text.size, url.pathquery.buff,
url.hostport.text.buff ); ) (int)url.hostport.text.size,
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 );
action_str_len = strlen( action_str ); action_str_len = strlen( action_str );
// make request msg // make request msg
request.size_inc = 50; request.size_inc = 50;
if( http_MakeMessage( &request, 1, 1, "q" "N" "s" "sssbs" "U" "c" "bbb", SOAPMETHOD_POST, &url, xml_start_len + action_str_len + xml_end_len, // content-length content_length = xml_start_len + action_str_len + xml_end_len;
ContentTypeHeader, if (http_MakeMessage(
"SOAPACTION: \"", service_type, "#", name.buf, &request, 1, 1,
name.length, "\"\r\n", xml_start, xml_start_len, "q" "N" "s" "sssbsc" "Uc" "b" "b" "b",
action_str, action_str_len, xml_end, SOAPMETHOD_POST, &url,
xml_end_len ) != 0 ) { content_length,
ContentTypeHeader,
"SOAPACTION: \"", service_type, "#", name.buf, name.length, "\"",
xml_start, xml_start_len,
action_str, action_str_len,
xml_end, xml_end_len ) != 0 ) {
goto error_handler; goto error_handler;
} }
@@ -684,7 +693,7 @@ SoapSendAction( IN char *action_url,
err_code = ret_code; err_code = ret_code;
} }
error_handler: error_handler:
ixmlFreeDOMString( action_str ); ixmlFreeDOMString( action_str );
membuffer_destroy( &request ); membuffer_destroy( &request );
membuffer_destroy( &responsename ); membuffer_destroy( &responsename );
@@ -736,30 +745,35 @@ SoapSendActionEx( IN char *action_url,
xboolean got_response = FALSE; xboolean got_response = FALSE;
char *xml_start = char *xml_start =
// "<?xml version=\"1.0\"?>\n" required?? "<s:Envelope "
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n"; "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n";
char *xml_body_start = "<s:Body>"; char *xml_header_start =
char *xml_end = "</s:Body>\n" "</s:Envelope>\n"; "<s:Header>\r\n";
int xml_start_len; char *xml_header_end =
int xml_end_len; "</s:Header>\r\n";
char *xml_header_start = "<s:Header>\n"; char *xml_body_start =
char *xml_header_end = "</s:Header>\n"; "<s:Body>";
int xml_header_start_len; char *xml_end =
int xml_header_end_len; "</s:Body>\r\n"
int xml_header_str_len; "</s:Envelope>\r\n";
int action_str_len; size_t xml_start_len;
int xml_body_start_len; size_t xml_header_start_len;
size_t xml_header_str_len;
size_t xml_header_end_len;
size_t xml_body_start_len;
size_t action_str_len;
size_t xml_end_len;
off_t content_length;
*response_node = NULL; // init *response_node = NULL; // init
err_code = UPNP_E_OUTOF_MEMORY; // default error err_code = UPNP_E_OUTOF_MEMORY; // default error
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Inside SoapSendActionEx():" ); "Inside SoapSendActionEx():" );
) // init
// init membuffer_init( &request );
membuffer_init( &request );
membuffer_init( &responsename ); membuffer_init( &responsename );
// header string // header string
@@ -783,13 +797,14 @@ SoapSendActionEx( IN char *action_url,
goto error_handler; goto error_handler;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"path=%.*s, hostport=%.*s\n", "path=%.*s, hostport=%.*s\n",
url.pathquery.size, url.pathquery.buff, (int)url.pathquery.size,
url.hostport.text.size, url.pathquery.buff,
url.hostport.text.buff ); ) (int)url.hostport.text.size,
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 );
xml_end_len = strlen( xml_end ); xml_end_len = strlen( xml_end );
action_str_len = strlen( action_str ); action_str_len = strlen( action_str );
@@ -800,17 +815,24 @@ SoapSendActionEx( IN char *action_url,
// make request msg // make request msg
request.size_inc = 50; request.size_inc = 50;
if( http_MakeMessage( &request, 1, 1, "q" "N" "s" "sssbs" "U" "c" "bbbbbbb", SOAPMETHOD_POST, &url, xml_start_len + xml_header_start_len + xml_header_str_len + xml_header_end_len + xml_body_start_len + action_str_len + xml_end_len, // content-length content_length =
ContentTypeHeader, xml_start_len +
"SOAPACTION: \"", service_type, "#", name.buf, xml_header_start_len + xml_header_str_len + xml_header_end_len +
name.length, "\"\r\n", xml_body_start_len + action_str_len + xml_end_len;
xml_start, xml_start_len, if (http_MakeMessage(
xml_header_start, xml_header_start_len, &request, 1, 1,
xml_header_str, xml_header_str_len, "q" "N" "s" "sssbsc" "Uc" "b" "b" "b" "b" "b" "b" "b",
xml_header_end, xml_header_end_len, SOAPMETHOD_POST, &url,
xml_body_start, xml_body_start_len, content_length,
action_str, action_str_len, ContentTypeHeader,
xml_end, xml_end_len ) != 0 ) { "SOAPACTION: \"", service_type, "#", name.buf, name.length, "\"",
xml_start, xml_start_len,
xml_header_start, xml_header_start_len,
xml_header_str, xml_header_str_len,
xml_header_end, xml_header_end_len,
xml_body_start, xml_body_start_len,
action_str, action_str_len,
xml_end, xml_end_len ) != 0 ) {
goto error_handler; goto error_handler;
} }
@@ -873,24 +895,28 @@ SoapGetServiceVarStatus( IN char *action_url,
IN char *var_name, IN char *var_name,
OUT char **var_value ) OUT char **var_value )
{ {
memptr host; // value for HOST header const memptr host; // value for HOST header
memptr path; // ctrl path in first line in msg const memptr path; // ctrl path in first line in msg
uri_type url; uri_type url;
membuffer request; membuffer request;
int ret_code; int ret_code;
http_parser_t response; http_parser_t response;
int upnp_error_code; int upnp_error_code;
off_t content_length;
char *xml_start = char *xml_start =
// "<?xml version=\"1.0\"?>\n" required?? "<s:Envelope "
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n"
"<s:Body>\n" "<s:Body>\r\n"
"<u:QueryStateVariable xmlns:u=\"urn:schemas-upnp-org:control-1-0\">\n" "<u:QueryStateVariable xmlns:u=\"urn:schemas-upnp-org:control-1-0\">\r\n"
"<u:varName>"; "<u:varName>";
char *xml_end = "</u:varName>\n" char *xml_end =
"</u:QueryStateVariable>\n" "</s:Body>\n" "</s:Envelope>\n"; "</u:varName>\r\n"
"</u:QueryStateVariable>\r\n"
"</s:Body>\r\n"
"</s:Envelope>\r\n";
*var_value = NULL; // return NULL in case of an error *var_value = NULL; // return NULL in case of an error
@@ -902,11 +928,16 @@ SoapGetServiceVarStatus( IN char *action_url,
} }
// make headers // make headers
request.size_inc = 50; request.size_inc = 50;
if( http_MakeMessage( &request, 1, 1, "Q" "sbc" "N" "s" "s" "U" "c" "sss", SOAPMETHOD_POST, path.buf, path.length, "HOST: ", host.buf, host.length, strlen( xml_start ) + strlen( var_name ) + strlen( xml_end ), // content-length content_length = strlen( xml_start ) + strlen( var_name ) + strlen( xml_end );
ContentTypeHeader, if (http_MakeMessage(
"SOAPACTION: \"urn:schemas" &request, 1, 1,
"-upnp-org:control-1-0#QueryStateVariable\"\r\n", "Q" "sbc" "N" "s" "s" "Ucc" "sss",
xml_start, var_name, xml_end ) != 0 ) { SOAPMETHOD_POST, path.buf, path.length,
"HOST: ", host.buf, host.length,
content_length,
ContentTypeHeader,
"SOAPACTION: \"urn:schemas-upnp-org:control-1-0#QueryStateVariable\"",
xml_start, var_name, xml_end ) != 0 ) {
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
} }
// send msg and get reply // send msg and get reply

View File

@@ -85,7 +85,7 @@ const char *ContentTypeHeader =
* 0 if successful else returns appropriate error. * 0 if successful else returns appropriate error.
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE int static UPNP_INLINE 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 )
{ {
@@ -189,7 +189,7 @@ send_error_response( IN SOCKINFO * info,
IN const char *err_msg, IN const char *err_msg,
IN http_message_t * hmsg ) IN http_message_t * hmsg )
{ {
int content_length; off_t content_length;
int timeout_secs = SOAP_TIMEOUT; int timeout_secs = SOAP_TIMEOUT;
int major, int major,
minor; minor;
@@ -228,20 +228,19 @@ send_error_response( IN SOCKINFO * info,
// make headers // make headers
membuffer_init( &headers ); membuffer_init( &headers );
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */ if (http_MakeMessage(
if( http_MakeMessage( &headers, major, minor, &headers, major, minor,
"RNsDsSXc" "sssss", "RNsDsSXcc" "sssss",
500, 500,
content_length, content_length,
ContentTypeHeader, ContentTypeHeader,
"EXT:\r\n", "EXT:\r\n",
X_USER_AGENT, X_USER_AGENT,
start_body, err_code_str, mid_body, err_msg, start_body, err_code_str, mid_body, err_msg,
end_body ) != 0 ) { end_body ) != 0 ) {
membuffer_destroy( &headers ); membuffer_destroy( &headers );
return; // out of mem return; // out of mem
} }
/*-- PATCH END - */
// send err msg // send err msg
http_SendMessage( info, &timeout_secs, "b", http_SendMessage( info, &timeout_secs, "b",
headers.buf, headers.length ); headers.buf, headers.length );
@@ -263,17 +262,16 @@ send_error_response( IN SOCKINFO * info,
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE void static UPNP_INLINE 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 )
{ {
int content_length; off_t content_length;
int timeout_secs = SOAP_TIMEOUT; int timeout_secs = SOAP_TIMEOUT;
int major, int major;
minor; int minor;
const char *start_body = const char *start_body =
// "<?xml version=\"1.0\"?>\n" required??
"<s:Envelope " "<s:Envelope "
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" " "xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" "s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n"
@@ -297,19 +295,18 @@ send_var_query_response( IN SOCKINFO * info,
// make headers // make headers
membuffer_init( &response ); membuffer_init( &response );
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */ if (http_MakeMessage(
if( http_MakeMessage( &response, major, minor, &response, major, minor,
"RNsDsSXcc" "sss", "RNsDsSXcc" "sss",
HTTP_OK, HTTP_OK,
content_length, content_length,
ContentTypeHeader, ContentTypeHeader,
"EXT:\r\n", "EXT:\r\n",
X_USER_AGENT, X_USER_AGENT,
start_body, var_value, end_body ) != 0 ) { start_body, var_value, end_body ) != 0 ) {
membuffer_destroy( &response ); membuffer_destroy( &response );
return; // out of mem return; // out of mem
} }
/* -- PATCH END - */
// send msg // send msg
http_SendMessage( info, &timeout_secs, "b", http_SendMessage( info, &timeout_secs, "b",
@@ -329,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 XINLINE int * Return : static UPNP_INLINE int
* 0 if successful, or -1 if fails. * 0 if successful, or -1 if fails.
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE int static UPNP_INLINE 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 )
@@ -347,11 +344,10 @@ 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;
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, 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;
// Got the Envelope node here // Got the Envelope node here
EnvpNode = ixmlNode_getFirstChild( ( IXML_Node * ) TempDoc ); EnvpNode = ixmlNode_getFirstChild( ( IXML_Node * ) TempDoc );
@@ -603,13 +599,13 @@ get_device_info( IN http_message_t * request,
service_info *serv_info; service_info *serv_info;
char save_char; char save_char;
int ret_code = -1; // error by default int ret_code = -1; // error by default
char *control_url; const char *control_url;
char *actionName = NULL; char *actionName = NULL;
// null-terminate pathquery of url // null-terminate pathquery of url
control_url = request->uri.pathquery.buff; control_url = request->uri.pathquery.buff;
save_char = control_url[request->uri.pathquery.size]; save_char = control_url[request->uri.pathquery.size];
control_url[request->uri.pathquery.size] = '\0'; ((char *)control_url)[request->uri.pathquery.size] = '\0';
HandleLock( ); HandleLock( );
@@ -666,7 +662,7 @@ get_device_info( IN http_message_t * request,
ret_code = 0; ret_code = 0;
error_handler: error_handler:
control_url[request->uri.pathquery.size] = save_char; // restore ((char *)control_url)[request->uri.pathquery.size] = save_char; // restore
HandleUnlock( ); HandleUnlock( );
return ret_code; return ret_code;
} }
@@ -685,7 +681,7 @@ get_device_info( IN http_message_t * request,
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE void static UPNP_INLINE 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 )
@@ -695,7 +691,7 @@ send_action_response( IN SOCKINFO * info,
int major, int major,
minor; minor;
int err_code; int err_code;
int content_length; off_t content_length;
int ret_code; int ret_code;
int timeout_secs = SOAP_TIMEOUT; int timeout_secs = SOAP_TIMEOUT;
static char *start_body = static char *start_body =
@@ -717,17 +713,22 @@ send_action_response( IN SOCKINFO * info,
goto error_handler; goto error_handler;
} }
content_length = strlen( start_body ) + strlen( xml_response ) + content_length =
strlen( start_body ) +
strlen( xml_response ) +
strlen( end_body ); strlen( end_body );
// make headers // make headers
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */ if (http_MakeMessage(
if( http_MakeMessage( &headers, major, minor, "RNsDsSXcc", HTTP_OK, // status code &headers, major, minor,
content_length, ContentTypeHeader, "EXT:\r\n", X_USER_AGENT // EXT header "RNsDsSXcc",
) != 0 ) { HTTP_OK, // status code
content_length,
ContentTypeHeader,
"EXT:\r\n",
X_USER_AGENT) != 0 ) {
goto error_handler; goto error_handler;
} }
/* -- PATCH END - */
// send whole msg // send whole msg
ret_code = http_SendMessage( info, &timeout_secs, "bbbb", ret_code = http_SendMessage( info, &timeout_secs, "bbbb",
@@ -736,15 +737,15 @@ 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 ) );
DBGONLY( if( ret_code != 0 ) { 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;
error_handler: error_handler:
ixmlFreeDOMString( xml_response ); ixmlFreeDOMString( xml_response );
membuffer_destroy( &headers ); membuffer_destroy( &headers );
if( err_code != 0 ) { if( err_code != 0 ) {
@@ -768,7 +769,7 @@ send_action_response( IN SOCKINFO * info,
* returns 0 if successful else returns -1. * returns 0 if successful else returns -1.
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE int static UPNP_INLINE int
get_var_name( IN IXML_Document * TempDoc, get_var_name( IN IXML_Document * TempDoc,
OUT char *VarName ) OUT char *VarName )
{ {
@@ -778,7 +779,7 @@ get_var_name( IN IXML_Document * TempDoc,
IXML_Node *VarNameNode = NULL; IXML_Node *VarNameNode = NULL;
IXML_Node *VarNode = NULL; IXML_Node *VarNode = NULL;
const DOMString StNodeName = NULL; const DOMString StNodeName = NULL;
DOMString Temp = NULL; const DOMString Temp = NULL;
int ret_val = -1; int ret_val = -1;
// Got the Envelop node here // Got the Envelop node here
@@ -812,14 +813,13 @@ get_var_name( IN IXML_Document * TempDoc,
Temp = ixmlNode_getNodeValue( VarNode ); Temp = ixmlNode_getNodeValue( VarNode );
linecopy( VarName, Temp ); linecopy( VarName, Temp );
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, 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
error_handler: error_handler:
return ret_val; return ret_val;
} }
@@ -840,7 +840,7 @@ get_var_name( IN IXML_Document * TempDoc,
* *
* Note : * Note :
****************************************************************************/ ****************************************************************************/
static XINLINE void static UPNP_INLINE 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 +876,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 );
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, 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 +966,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;
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__, 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 );

View File

@@ -125,16 +125,16 @@ 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
HandleLock( ); HandleReadLock();
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
return; return;
} }
// copy // copy
ctrlpt_callback = ctrlpt_info->Callback; ctrlpt_callback = ctrlpt_info->Callback;
ctrlpt_cookie = ctrlpt_info->Cookie; ctrlpt_cookie = ctrlpt_info->Cookie;
HandleUnlock( ); HandleUnlock();
// search timeout // search timeout
if( timeout ) { if( timeout ) {
@@ -159,7 +159,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
} }
// dest addr // dest addr
param.DestAddr = dest_addr; memcpy(&param.DestAddr, dest_addr, sizeof(struct sockaddr_in) );
// EXT // EXT
param.Ext[0] = '\0'; param.Ext[0] = '\0';
@@ -267,22 +267,22 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
strlen( param.Location ) == 0 || !usn_found || !st_found ) { strlen( param.Location ) == 0 || !usn_found || !st_found ) {
return; // bad reply return; // bad reply
} }
//check each current search // check each current search
HandleLock( ); HandleLock();
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
return; return;
} }
node = ListHead( &ctrlpt_info->SsdpSearchList ); node = ListHead( &ctrlpt_info->SsdpSearchList );
//temporary add null termination // temporary add null termination
//save_char = hdr_value.buf[ hdr_value.length ]; //save_char = hdr_value.buf[ hdr_value.length ];
//hdr_value.buf[ hdr_value.length ] = '\0'; //hdr_value.buf[ hdr_value.length ] = '\0';
while( node != NULL ) { while( node != NULL ) {
searchArg = node->item; searchArg = node->item;
matched = 0; matched = 0;
//check for match of ST header and search target // check for match of ST header and search target
switch ( searchArg->requestType ) { switch ( searchArg->requestType ) {
case SSDP_ALL: case SSDP_ALL:
{ {
@@ -327,7 +327,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
} }
if( matched ) { if( matched ) {
//schedule call back // schedule call back
threadData = threadData =
( ResultData * ) malloc( sizeof( ResultData ) ); ( ResultData * ) malloc( sizeof( ResultData ) );
if( threadData != NULL ) { if( threadData != NULL ) {
@@ -344,7 +344,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
node = ListNext( &ctrlpt_info->SsdpSearchList, node ); node = ListNext( &ctrlpt_info->SsdpSearchList, node );
} }
HandleUnlock( ); HandleUnlock();
//ctrlpt_callback( UPNP_DISCOVERY_SEARCH_RESULT, &param, cookie ); //ctrlpt_callback( UPNP_DISCOVERY_SEARCH_RESULT, &param, cookie );
} }
} }
@@ -353,11 +353,11 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
* Function : process_reply * Function : process_reply
* *
* Parameters: * Parameters:
* IN char* request_buf: the response came from the device * IN char* request_buf: the response came from the device
* IN int buf_len: The length of the response buffer * IN int buf_len: The length of the response buffer
* IN struct sockaddr_in* dest_addr: The address of the device * IN struct sockaddr_in* dest_addr: The address of the device
* IN void *cookie : cookie passed by the control point application * IN void *cookie : cookie passed by the control point application
* at the time of sending search message * at the time of sending search message
* *
* Description: * Description:
* This function processes reply recevied from a search * This function processes reply recevied from a search
@@ -365,7 +365,9 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
* Returns: void * Returns: void
* *
***************************************************************************/ ***************************************************************************/
static XINLINE void #warning There are currently no uses of the function 'process_reply()' in the code.
#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,
@@ -391,14 +393,14 @@ process_reply( IN char *request_buf,
* Function : CreateClientRequestPacket * Function : CreateClientRequestPacket
* *
* Parameters: * Parameters:
* IN char * RqstBuf:Output string in HTTP format. * IN char * RqstBuf:Output string in HTTP format.
* IN char *SearchTarget:Search Target * IN char *SearchTarget:Search Target
* IN int Mx dest_addr: Number of seconds to wait to * IN int Mx dest_addr: Number of seconds to wait to
* collect all the responses * collect all the responses
* *
* Description: * Description:
* This function creates a HTTP search request packet * This function creates a HTTP search request packet
* depending on the input parameter. * depending on the input parameter.
* *
* Returns: void * Returns: void
* *
@@ -456,13 +458,13 @@ searchExpired( void *arg )
void *cookie = NULL; void *cookie = NULL;
int found = 0; int found = 0;
HandleLock( ); HandleLock();
//remove search target from search list //remove search target from search list
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
free( id ); free( id );
HandleUnlock( ); HandleUnlock();
return; return;
} }
@@ -483,7 +485,7 @@ searchExpired( void *arg )
} }
node = ListNext( &ctrlpt_info->SsdpSearchList, node ); node = ListNext( &ctrlpt_info->SsdpSearchList, node );
} }
HandleUnlock( ); HandleUnlock();
if( found ) { if( found ) {
ctrlpt_callback( UPNP_DISCOVERY_SEARCH_TIMEOUT, NULL, cookie ); ctrlpt_callback( UPNP_DISCOVERY_SEARCH_TIMEOUT, NULL, cookie );
@@ -536,11 +538,9 @@ SearchByTarget( IN int Mx,
if( ReqBuf == NULL ) if( ReqBuf == NULL )
return UPNP_E_OUTOF_MEMORY; return UPNP_E_OUTOF_MEMORY;
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, UpnpPrintf(UPNP_INFO, SSDP, __FILE__, __LINE__, ">>> SSDP SEND >>>\n");
">>> SSDP SEND >>>\n%s\n", ReqBuf );
)
timeTillRead = Mx; timeTillRead = Mx;
if( timeTillRead < MIN_SEARCH_TIME ) { if( timeTillRead < MIN_SEARCH_TIME ) {
timeTillRead = MIN_SEARCH_TIME; timeTillRead = MIN_SEARCH_TIME;
@@ -559,9 +559,9 @@ SearchByTarget( IN int Mx,
FD_SET( gSsdpReqSocket, &wrSet ); FD_SET( gSsdpReqSocket, &wrSet );
//add search criteria to list //add search criteria to list
HandleLock( ); HandleLock();
if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) { if( GetClientHandleInfo( &handle, &ctrlpt_info ) != HND_CLIENT ) {
HandleUnlock( ); HandleUnlock();
free( ReqBuf ); free( ReqBuf );
return UPNP_E_INTERNAL_ERROR; return UPNP_E_INTERNAL_ERROR;
} }
@@ -582,33 +582,30 @@ SearchByTarget( IN int Mx,
newArg->timeoutEventId = ( *id ); newArg->timeoutEventId = ( *id );
ListAddTail( &ctrlpt_info->SsdpSearchList, newArg ); ListAddTail( &ctrlpt_info->SsdpSearchList, newArg );
HandleUnlock( ); HandleUnlock();
setsockopt( gSsdpReqSocket, IPPROTO_IP, IP_MULTICAST_IF, setsockopt( gSsdpReqSocket, IPPROTO_IP, IP_MULTICAST_IF,
( char * )&addr, sizeof( addr ) ); ( char * )&addr, sizeof( addr ) );
if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL ) if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL )
== UPNP_SOCKETERROR ) { == UPNP_SOCKETERROR ) {
DBGONLY( if( errno == EBADF ) { 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 } else if( errno == EINTR ) {
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 UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
if( errno == EINVAL ) { "SSDP_LIB :RequestHandler: n is negative. \n" );
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, } else if( errno == ENOMEM ) {
"SSDP_LIB :RequestHandler: n is negative. \n" );} UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
else "SSDP_LIB : RequestHandler:select was unable to "
if( errno == ENOMEM ) { "allocate memory for internal tables.\n" );
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, }
"SSDP_LIB : RequestHandler:select was unable to " shutdown( gSsdpReqSocket, SD_BOTH );
"allocate memory for internal tables.\n" );}
)
shutdown( gSsdpReqSocket, SD_BOTH );
UpnpCloseSocket( gSsdpReqSocket ); UpnpCloseSocket( gSsdpReqSocket );
free( ReqBuf ); free( ReqBuf );
return UPNP_E_INTERNAL_ERROR; return UPNP_E_INTERNAL_ERROR;

View File

@@ -43,19 +43,19 @@
#include "unixutil.h" #include "unixutil.h"
#ifdef WIN32 #ifdef WIN32
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include <winsock2.h> #include <winsock2.h>
#endif #endif
#define MSGTYPE_SHUTDOWN 0 #define MSGTYPE_SHUTDOWN 0
#define MSGTYPE_ADVERTISEMENT 1 #define MSGTYPE_ADVERTISEMENT 1
#define MSGTYPE_REPLY 2 #define MSGTYPE_REPLY 2
/************************************************************************ /************************************************************************
* Function : advertiseAndReplyThread * Function : advertiseAndReplyThread
* *
* Parameters: * Parameters:
* IN void *data: Structure containing the search request * IN void *data: Structure containing the search request
* *
* Description: * Description:
* This function is a wrapper function to reply the search request * This function is a wrapper function to reply the search request
@@ -84,8 +84,8 @@ advertiseAndReplyThread( IN void *data )
* Function : ssdp_handle_device_request * Function : ssdp_handle_device_request
* *
* Parameters: * Parameters:
* IN http_message_t* hmsg: SSDP search request from the control point * IN http_message_t* hmsg: SSDP search request from the control point
* IN struct sockaddr_in* dest_addr: The address info of control point * IN struct sockaddr_in* dest_addr: The address info of control point
* *
* Description: * Description:
* This function handles the search request. It do the sanity checks of * This function handles the search request. It do the sanity checks of
@@ -95,6 +95,7 @@ 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 )
@@ -135,30 +136,30 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
return; // bad ST header return; // bad ST header
} }
HandleLock( ); HandleLock();
// device info // device info
if( GetDeviceHandleInfo( &handle, &dev_info ) != HND_DEVICE ) { if( GetDeviceHandleInfo( &handle, &dev_info ) != HND_DEVICE ) {
HandleUnlock( ); HandleUnlock();
return; // no info found return; // no info found
} }
maxAge = dev_info->MaxAge; maxAge = dev_info->MaxAge;
HandleUnlock( ); HandleUnlock();
DBGONLY( UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, 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__,
"MAX-AGE = %d\n", maxAge ); "MAX-AGE = %d\n", maxAge );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"MX = %d\n", event.Mx ); "MX = %d\n", event.Mx );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__, UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"DeviceType = %s\n", event.DeviceType ); "DeviceType = %s\n", event.DeviceType );
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 ) );
if( threadArg == NULL ) { if( threadArg == NULL ) {
@@ -185,11 +186,12 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
mx = 1; mx = 1;
} }
replyTime = rand( ) % mx; replyTime = rand() % mx;
TimerThreadSchedule( &gTimerThread, replyTime, REL_SEC, &job, TimerThreadSchedule( &gTimerThread, replyTime, REL_SEC, &job,
SHORT_TERM, NULL ); SHORT_TERM, NULL );
} }
#endif
/************************************************************************ /************************************************************************
* Function : NewRequestHandler * Function : NewRequestHandler
@@ -220,9 +222,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 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, 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;
} }
@@ -234,16 +236,25 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
for( Index = 0; Index < NumPacket; Index++ ) { for( Index = 0; Index < NumPacket; Index++ ) {
int rc; int rc;
// The reason to keep this loop is purely historical/documentation,
// according to section 9.2 of HTTPU spec:
//
// "If a multicast resource would send a response(s) to any copy of the
// request, it SHOULD send its response(s) to each copy of the request
// it receives. It MUST NOT repeat its response(s) per copy of the
// request."
//
// http://www.upnp.org/download/draft-goland-http-udp-04.txt
//
// So, NUM_COPY has been changed from 2 to 1.
NumCopy = 0; NumCopy = 0;
while( NumCopy < NUM_COPY ) { while( NumCopy < NUM_COPY ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, 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 );
imillisleep( SSDP_PAUSE ); imillisleep( SSDP_PAUSE );
++NumCopy; ++NumCopy;
} }
@@ -259,7 +270,7 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
* *
* Parameters: * Parameters:
* IN int msg_type : type of the message ( Search Reply, Advertisement * IN int msg_type : type of the message ( Search Reply, Advertisement
* or Shutdown ) * or Shutdown )
* IN char * nt : ssdp type * IN char * nt : ssdp type
* IN char * usn : unique service name ( go in the HTTP Header) * IN char * usn : unique service name ( go in the HTTP Header)
* IN char * location :Location URL. * IN char * location :Location URL.
@@ -269,7 +280,7 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
* Description: * Description:
* This function creates a HTTP request packet. Depending * This function creates a HTTP request packet. Depending
* on the input parameter it either creates a service advertisement * on the input parameter it either creates a service advertisement
* request or service shutdown request etc. * request or service shutdown request etc.
* *
* Returns: void * Returns: void
* *
@@ -295,16 +306,16 @@ CreateServicePacket( IN int msg_type,
*packet = NULL; *packet = NULL;
if( msg_type == MSGTYPE_REPLY ) { if( msg_type == MSGTYPE_REPLY ) {
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */ ret_code = http_MakeMessage(
ret_code = http_MakeMessage( &buf, 1, 1, &buf, 1, 1,
"R" "sdc" "D" "s" "ssc" "S" "Xc" "ssc" "R" "sdc" "D" "sc" "ssc" "S" "Xc" "ssc" "sscc",
"ssc" "c", HTTP_OK, HTTP_OK,
"CACHE-CONTROL: max-age=", duration, "CACHE-CONTROL: max-age=", duration,
"EXT:\r\n", "LOCATION: ", location, "EXT:",
X_USER_AGENT, "LOCATION: ", location,
"ST: ", nt, "USN: ", usn ); X_USER_AGENT,
/* -- PATCH END - */ "ST: ", nt,
"USN: ", usn);
if( ret_code != 0 ) { if( ret_code != 0 ) {
return; return;
} }
@@ -320,15 +331,17 @@ CreateServicePacket( IN int msg_type,
// NOTE: The CACHE-CONTROL and LOCATION headers are not present in // NOTE: The CACHE-CONTROL and LOCATION headers are not present in
// a shutdown msg, but are present here for MS WinMe interop. // a shutdown msg, but are present here for MS WinMe interop.
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */ ret_code = http_MakeMessage(
ret_code = http_MakeMessage( &buf, 1, 1, &buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "S" "Xc" "sscc",
"S" "Xc" "ssc" "c", HTTPMETHOD_NOTIFY, "*", HTTPMETHOD_NOTIFY, "*",
1, "HOST: ", SSDP_IP, ":", SSDP_PORT, 1, "HOST: ", SSDP_IP, ":", SSDP_PORT,
"CACHE-CONTROL: max-age=", duration, "CACHE-CONTROL: max-age=", duration,
"LOCATION: ", location, "NT: ", nt, "LOCATION: ", location,
"NTS: ", nts, X_USER_AGENT, "USN: ", usn ); "NT: ", nt,
/* -- PATCH END - */ "NTS: ", nts,
X_USER_AGENT,
"USN: ", usn );
if( ret_code != 0 ) { if( ret_code != 0 ) {
return; return;
} }
@@ -376,11 +389,10 @@ DeviceAdvertisement( IN char *DevType,
char *msgs[3]; char *msgs[3];
int ret_code; int ret_code;
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, 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 );
DestAddr.sin_port = htons( SSDP_PORT ); DestAddr.sin_port = htons( SSDP_PORT );
@@ -518,7 +530,6 @@ 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.
@@ -595,11 +606,9 @@ 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
@@ -644,11 +653,9 @@ 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
@@ -688,7 +695,6 @@ 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.
@@ -771,11 +777,11 @@ DeviceShutdown( IN char *DevType,
Mil_Usn, Location, Duration, &msgs[0] ); Mil_Usn, Location, Duration, &msgs[0] );
} }
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, 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] );
sprintf( Mil_Usn, "%s::%s", Udn, DevType ); sprintf( Mil_Usn, "%s::%s", Udn, DevType );
CreateServicePacket( MSGTYPE_SHUTDOWN, DevType, Mil_Usn, CreateServicePacket( MSGTYPE_SHUTDOWN, DevType, Mil_Usn,
@@ -809,3 +815,4 @@ DeviceShutdown( IN char *DevType,
#endif // EXCLUDE_SSDP #endif // EXCLUDE_SSDP
#endif // INCLUDE_DEVICE_APIS #endif // INCLUDE_DEVICE_APIS

View File

@@ -75,8 +75,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
* Function : AdvertiseAndReply * Function : AdvertiseAndReply
* *
* Parameters: * Parameters:
* IN int AdFlag: -1 = Send shutdown, 0 = send reply, * IN int AdFlag:
* 1 = Send Advertisement * -1 = Send shutdown,
* 0 = send reply,
* 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
* IN struct sockaddr_in *DestAddr:Destination address * IN struct sockaddr_in *DestAddr:Destination address
@@ -91,14 +93,14 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
* Returns: int * Returns: int
* UPNP_E_SUCCESS if successful else appropriate error * UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/ ***************************************************************************/
int AdvertiseAndReply( IN int AdFlag, int AdvertiseAndReply( 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,
IN char *DeviceType, IN char *DeviceType,
IN char *DeviceUDN, IN char *DeviceUDN,
IN char *ServiceType, IN char *ServiceType,
int Exp ) int Exp )
{ {
int i, int i,
j; j;
@@ -112,24 +114,21 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
IXML_Node *tmpNode = NULL; IXML_Node *tmpNode = NULL;
IXML_Node *tmpNode2 = NULL; IXML_Node *tmpNode2 = NULL;
IXML_Node *textNode = NULL; IXML_Node *textNode = NULL;
DOMString tmpStr; const DOMString tmpStr;
char SERVER[200]; char SERVER[200];
DBGONLY( const DOMString dbgStr; 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 );
HandleLock( ); // Use a read lock
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
@@ -139,43 +138,35 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
// parse the device list and send advertisements/replies // parse the device list and send advertisements/replies
for( i = 0;; i++ ) { for( i = 0;; i++ ) {
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Entering new device list with i = %d\n\n", "Entering new device list with i = %d\n\n", i );
i );
)
tmpNode = ixmlNodeList_item( SInfo->DeviceList, i ); tmpNode = ixmlNodeList_item( SInfo->DeviceList, i );
if( tmpNode == NULL ) { if( tmpNode == NULL ) {
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting new device list with i = %d\n\n", "Exiting new device list with i = %d\n\n", i );
i ); break;
)
break;
} }
DBGONLY( dbgStr = ixmlNode_getNodeName( tmpNode ); dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Extracting device type once for %s\n", "Extracting device type once for %s\n", dbgStr );
dbgStr ); ) // extract device type
// extract device type ixmlNodeList_free( nodeList );
ixmlNodeList_free( nodeList );
nodeList = NULL; nodeList = NULL;
nodeList = nodeList = ixmlElement_getElementsByTagName(
ixmlElement_getElementsByTagName( ( IXML_Element * ) tmpNode, ( IXML_Element * ) tmpNode, "deviceType" );
"deviceType" );
if( nodeList == NULL ) { if( nodeList == NULL ) {
continue; continue;
} }
DBGONLY( 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 );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type\n" );
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, tmpNode2 = ixmlNodeList_item( nodeList, 0 );
"Extracting device type\n" );
)
tmpNode2 = ixmlNodeList_item( nodeList, 0 );
if( tmpNode2 == NULL ) { if( tmpNode2 == NULL ) {
continue; continue;
} }
@@ -184,11 +175,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue; continue;
} }
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, 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 ) {
continue; continue;
} }
@@ -198,47 +188,41 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue; continue;
} }
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, 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 ); }
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, dbgStr = ixmlNode_getNodeName( tmpNode );
"Extracting UDN for %s\n", dbgStr ); ) UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
// extract UDN "Extracting UDN for %s\n", dbgStr );
ixmlNodeList_free( nodeList ); // extract UDN
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 ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
"UDN not found!!!!\n" ); "UDN not found!!!!\n" );
)
continue; continue;
} }
strcpy( UDNstr, tmpStr ); strcpy( UDNstr, tmpStr );
@@ -246,16 +230,14 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue; continue;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, 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 );
} }
@@ -278,22 +260,16 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
{ {
if( DeviceUDN != NULL && strlen( DeviceUDN ) != 0 ) { if( DeviceUDN != NULL && strlen( DeviceUDN ) != 0 ) {
if( strcasecmp( DeviceUDN, UDNstr ) ) { if( strcasecmp( DeviceUDN, UDNstr ) ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
( UPNP_INFO, API, __FILE__, "DeviceUDN=%s and search "
__LINE__, "UDN=%s did not match\n",
"DeviceUDN=%s and search " UDNstr, DeviceUDN );
"UDN=%s did not match\n",
UDNstr, DeviceUDN );
)
break; break;
} else { } else {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
( UPNP_INFO, API, __FILE__, "DeviceUDN=%s and search "
__LINE__, "UDN=%s MATCH\n", UDNstr,
"DeviceUDN=%s and search " DeviceUDN );
"UDN=%s MATCH\n", UDNstr,
DeviceUDN );
)
SendReply( DestAddr, devType, 0, SendReply( DestAddr, devType, 0,
UDNstr, SInfo->DescURL, UDNstr, SInfo->DescURL,
defaultExp, 0 ); defaultExp, 0 );
@@ -306,25 +282,18 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
if( !strncasecmp if( !strncasecmp
( DeviceType, devType, ( DeviceType, devType,
strlen( DeviceType ) ) ) { strlen( DeviceType ) ) ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
( 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,
) SInfo->DescURL, defaultExp, 1 );
SendReply( DestAddr, devType, 0, UDNstr, } else {
SInfo->DescURL, defaultExp, 1 ); UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
} "DeviceType=%s and search devType=%s"
" DID NOT MATCH\n",
DBGONLY( devType, DeviceType );
else }
UpnpPrintf( UPNP_INFO, API, __FILE__, break;
__LINE__,
"DeviceType=%s and search devType=%s"
" DID NOT MATCH\n",
devType, DeviceType );
)
break;
} }
default: default:
break; break;
@@ -332,11 +301,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
} }
// send service advertisements for services corresponding // send service advertisements for services corresponding
// to the same device // to the same device
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, 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 ) {
continue; continue;
} }
@@ -345,28 +313,24 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * ) nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * )
tmpNode, "service" ); tmpNode, "service" );
if( nodeList == NULL ) { if( nodeList == NULL ) {
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, 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( ( IXML_Element tmpNodeList = ixmlElement_getElementsByTagName(
* ) tmpNode, ( IXML_Element *)tmpNode, "serviceType" );
"serviceType" );
if( tmpNodeList == NULL ) { if( tmpNodeList == NULL ) {
DBGONLY( UpnpPrintf UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
( 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 );
if( tmpNode2 == NULL ) { if( tmpNode2 == NULL ) {
@@ -386,42 +350,34 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
continue; continue;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, 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,
{ UDNstr, SInfo->DescURL,
ServiceReply( DestAddr, servType, defaultExp );
UDNstr, SInfo->DescURL,
defaultExp );
}
} }
break;
} }
break;
default: default:
break; break;
} // switch(SearchType) } // switch(SearchType)
@@ -433,11 +389,10 @@ CLIENTONLY( SOCKET gSsdpReqSocket = 0;
ixmlNodeList_free( nodeList ); ixmlNodeList_free( nodeList );
nodeList = NULL; nodeList = NULL;
} }
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__, UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting AdvertiseAndReply : \n" ); "Exiting AdvertiseAndReply : \n" );
)
HandleUnlock( ); HandleUnlock();
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
@@ -481,7 +436,7 @@ Make_Socket_NoBlocking( int sock )
* Parameters: * Parameters:
* IN char *cmd: Service Name string * IN char *cmd: Service Name string
* OUT SsdpEvent *Evt: The SSDP event structure partially filled * OUT SsdpEvent *Evt: The SSDP event structure partially filled
* by all the function. * by all the function.
* *
* Description: * Description:
* This function fills the fields of the event structure like DeviceType, * This function fills the fields of the event structure like DeviceType,
@@ -677,7 +632,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 XINLINE xboolean static UPNP_INLINE xboolean
valid_ssdp_msg( IN http_message_t * hmsg ) valid_ssdp_msg( IN http_message_t * hmsg )
{ {
memptr hdr_value; memptr hdr_value;
@@ -719,7 +674,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 XINLINE int static UPNP_INLINE int
start_event_handler( void *Data ) start_event_handler( void *Data )
{ {
@@ -733,20 +688,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 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, 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 ) {
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__, 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;
} }
// check msg // check msg
if( !valid_ssdp_msg( &parser->msg ) ) { if( !valid_ssdp_msg( &parser->msg ) ) {
@@ -784,14 +737,10 @@ 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
@@ -861,23 +810,22 @@ readFromSSDPSocket( SOCKET socket )
( struct sockaddr * )&clientAddr, &socklen ); ( struct sockaddr * )&clientAddr, &socklen );
if( byteReceived > 0 ) { if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0'; requestBuf[byteReceived] = '\0';
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, UpnpPrintf( UPNP_INFO, SSDP,
__FILE__, __LINE__, __FILE__, __LINE__,
"Received response !!! " "Start of received response ----------------------------------------------------\n"
"%s From host %s \n", "%s\n"
requestBuf, "End of received response ------------------------------------------------------\n"
inet_ntoa( clientAddr.sin_addr ) ); "From host %s\n",
) requestBuf,
inet_ntoa( clientAddr.sin_addr ) );
DBGONLY( UpnpPrintf( UPNP_PACKET, SSDP, UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__,
__FILE__, __LINE__, "Start of received multicast packet --------------------------------------------\n"
"Received multicast packet:" "%s\n"
"\n %s\n", requestBuf ); "End of received multicast packet ----------------------------------------------\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;
// null-terminate // null-terminate
data->parser.msg.msg.buf[byteReceived] = 0; data->parser.msg.msg.buf[byteReceived] = 0;
@@ -891,7 +839,6 @@ 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 );
} }
@@ -915,46 +862,43 @@ 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;
struct sockaddr_in ssdpAddr; struct sockaddr_in ssdpAddr;
int option = 1; int option = 1;
struct in_addr addr;
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) CLIENTONLY(
== UPNP_INVALID_SOCKET ) { if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__, SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" ); ) "Error in socket operation !!!\n" );
return UPNP_E_OUTOF_SOCKET;}
setsockopt( ssdpReqSock,
IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
// just do it, regardless if fails or not.
Make_Socket_NoBlocking( ssdpReqSock ); gSsdpReqSocket = ssdpReqSock; ) //CLIENTONLY
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
)
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_OUTOF_SOCKET; return UPNP_E_OUTOF_SOCKET;
} }
setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
// just do it, regardless if fails or not.
Make_Socket_NoBlocking( ssdpReqSock );
gSsdpReqSocket = ssdpReqSock; )
// END CLIENTONLY
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_OUTOF_SOCKET;
}
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 );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
@@ -963,13 +907,11 @@ get_ssdp_sockets( MiniServerSockArray * out )
#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 );
UpnpCloseSocket( ssdpSock ); UpnpCloseSocket( ssdpSock );
@@ -982,13 +924,11 @@ get_ssdp_sockets( MiniServerSockArray * out )
// 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 if( bind( ssdpSock, ( struct sockaddr * )&ssdpAddr,
( 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 ) );
@@ -997,41 +937,49 @@ get_ssdp_sockets( MiniServerSockArray * out )
} }
memset( ( void * )&ssdpMcastAddr, 0, sizeof( struct ip_mreq ) ); memset( ( void * )&ssdpMcastAddr, 0, sizeof( struct ip_mreq ) );
ssdpMcastAddr.imr_interface.s_addr = htonl( INADDR_ANY ); 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, ( char * )&ssdpMcastAddr, sizeof( struct ip_mreq ) ) != 0 ) {
sizeof( struct ip_mreq ) ) != 0 ) { UpnpPrintf( UPNP_CRITICAL,
DBGONLY( UpnpPrintf SSDP, __FILE__, __LINE__,
( 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 );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
return UPNP_E_SOCKET_ERROR; return UPNP_E_SOCKET_ERROR;
} }
/* Set multicast interface. */
memset( ( void * )&addr, 0, sizeof( struct in_addr ));
addr.s_addr = inet_addr(LOCAL_HOST);
if ( setsockopt(ssdpSock, IPPROTO_IP, IP_MULTICAST_IF,
(char *)&addr, sizeof addr) != 0) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"Couldn't set multicast interface.\n" );
/* This is probably not a critical error, so let's continue. */
}
// result is not checked becuase it will fail in WinMe and Win9x. // result is not checked becuase it will fail in WinMe and Win9x.
setsockopt( ssdpSock, IPPROTO_IP, setsockopt( ssdpSock, IPPROTO_IP,
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) {
DBGONLY( UpnpPrintf( UPNP_CRITICAL, 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 );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) ); CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
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

View File

@@ -32,6 +32,7 @@
#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>
@@ -62,7 +63,7 @@
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE void static UPNP_INLINE void
addrToString( IN const struct sockaddr_in *addr, addrToString( IN const struct sockaddr_in *addr,
OUT char ipaddr_port[] ) OUT char ipaddr_port[] )
{ {
@@ -87,7 +88,7 @@ addrToString( IN const struct sockaddr_in *addr,
* *
* Note : 'newAlias' should be freed using free() * Note : 'newAlias' should be freed using free()
************************************************************************/ ************************************************************************/
static XINLINE int static UPNP_INLINE 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 )
@@ -148,7 +149,7 @@ calc_alias( IN const char *alias,
* *
* Note : * Note :
************************************************************************/ ************************************************************************/
static XINLINE int static UPNP_INLINE 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] )
@@ -168,11 +169,10 @@ calc_descURL( IN const char *ipPortStr,
strcat( descURL, ipPortStr ); strcat( descURL, ipPortStr );
strcat( descURL, alias ); strcat( descURL, alias );
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"desc url: %s\n", descURL ); "desc url: %s\n", descURL );
)
return UPNP_E_SUCCESS; return UPNP_E_SUCCESS;
} }
/************************************************************************ /************************************************************************
@@ -213,7 +213,7 @@ config_description_doc( INOUT IXML_Document * doc,
IXML_Node *rootNode = NULL; IXML_Node *rootNode = NULL;
IXML_Node *urlbase_node = NULL; IXML_Node *urlbase_node = NULL;
char *urlBaseStr = "URLBase"; char *urlBaseStr = "URLBase";
DOMString domStr = NULL; const DOMString domStr = NULL;
uri_type uri; uri_type uri;
int err_code; int err_code;
int len; int len;
@@ -408,18 +408,16 @@ configure_urlbase( INOUT IXML_Document * doc,
goto error_handler; goto error_handler;
} }
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__, 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
) err_code =
// store in web server
err_code =
web_server_set_alias( new_alias, xml_str, strlen( xml_str ), web_server_set_alias( new_alias, xml_str, strlen( xml_str ),
last_modified ); last_modified );
error_handler: error_handler:
free( root_path ); free( root_path );
free( new_alias ); free( new_alias );

View File

@@ -50,22 +50,11 @@
#define S43 15 #define S43 15
#define S44 21 #define S44 21
static void MD5Transform PROTO_LIST( ( UINT4[4], static void MD5Transform PROTO_LIST((UINT4[4], unsigned char[64]));
unsigned char[64] ) ); static void Encode PROTO_LIST((unsigned char *, UINT4 *, unsigned int));
static void Encode PROTO_LIST( ( unsigned char *, static void Decode PROTO_LIST((UINT4 *, unsigned char *, unsigned int));
UINT4 *, static void MD5_memcpy PROTO_LIST((POINTER, POINTER, unsigned int));
unsigned int ) ); static void MD5_memset PROTO_LIST((POINTER, 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,
@@ -118,14 +107,10 @@ 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( context ) MD5Init(MD5_CTX * 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;
@@ -139,114 +124,72 @@ MD5Init( context )
*/ */
void void
MD5Update( context, MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)
input,
inputLen )
MD5_CTX *context; /* context */
unsigned char *input; /* input block */
unsigned int inputLen; /* length of input block */
{ {
unsigned int i, unsigned int i;
index, unsigned int index;
partLen; unsigned int 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 */
Update number of bits if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) {
*/ context->count[1]++;
if( ( context->count[0] += }
( ( UINT4 ) inputLen << 3 ) ) < ( ( UINT4 ) inputLen << 3 ) ) context->count[1] += ((UINT4)inputLen >> 29);
context->count[1]++; partLen = 64 - index;
context->count[1] += ( ( UINT4 ) inputLen >> 29 ); /* Transform as many times as possible. */
if (inputLen >= partLen) {
partLen = 64 - index; MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
MD5Transform(context->state, context->buffer);
/* for (i = partLen; i + 63 < inputLen; i += 64) {
Transform as many times as possible. MD5Transform(context->state, &input[i]);
*/ }
if( inputLen >= partLen ) { index = 0;
} else {
MD5_memcpy i = 0;
( ( 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 );
/* 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 void
MD5Final( digest, MD5Final(unsigned char digest[16], MD5_CTX *context)
context )
unsigned char digest[16]; /* message digest */
MD5_CTX *context; /* context */
{ {
unsigned char bits[8]; unsigned char bits[8];
unsigned int index, unsigned int index;
padLen; unsigned int padLen;
/* /* Save number of bits */
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);
*/ padLen = (index < 56) ? (56 - index) : (120 - index);
index = ( unsigned int )( ( context->count[0] >> 3 ) & 0x3f ); MD5Update(context, PADDING, padLen);
padLen = ( index < 56 ) ? ( 56 - index ) : ( 120 - index ); /* Append length (before padding) */
MD5Update(context, bits, 8);
MD5Update( context, PADDING, padLen ); /* Store state in digest */
Encode(digest, context->state, 16);
/*
Append length (before padding)
*/
MD5Update( context, bits, 8 );
/*
Store state in digest
*/
Encode( digest, context->state, 16 );
/*
Zeroize sensitive information.
*/
MD5_memset( ( POINTER ) context, 0, sizeof( *context ) );
/* Zeroize sensitive information. */
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( state, MD5Transform(UINT4 state[4], unsigned char block[64])
block )
UINT4 state[4];
unsigned char block[64];
{ {
UINT4 a = state[0], UINT4 a = state[0],
b = state[1], b = state[1],
@@ -353,23 +296,16 @@ MD5Transform( state,
a multiple of 4. a multiple of 4.
*/ */
static void static void
Encode( output, Encode(unsigned char *output, UINT4 *input, unsigned int len)
input,
len )
unsigned char *output;
UINT4 *input;
unsigned int len;
{ {
unsigned int i, unsigned int i;
j; unsigned int j;
for (i = 0, j = 0; j < len; ++i, j += 4) {
for( i = 0, j = 0; j < len; i++, j += 4 ) { output[j+0] = (unsigned char)((input[i] >> 0) & 0xff);
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 ); }
}
} }
/* /*
@@ -378,55 +314,40 @@ Encode( output,
*/ */
static void static void
Decode( output, Decode(UINT4 *output, unsigned char *input, unsigned int len)
input,
len )
UINT4 *output;
unsigned char *input;
unsigned int len;
{ {
unsigned int i, unsigned int i;
j; unsigned int 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 &quot;for loop&quot; with standard memcpy if possible. Note: Replace for loop with standard memcpy if possible.
*/ */
static void static void
MD5_memcpy( output, MD5_memcpy(POINTER output, POINTER input, unsigned int len)
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 &quot;for loop&quot; with standard memset if possible. Note: Replace for loop with standard memset if possible.
*/ */
static void static void
MD5_memset( output, MD5_memset(POINTER output, int value, unsigned int len)
value,
len )
POINTER output;
int value;
unsigned int len;
{ {
unsigned int i; unsigned int i;
for (i = 0; i < len; ++i) {
for( i = 0; i < len; i++ ) ((char *)output)[i] = (char)value;
( ( char * )output )[i] = ( char )value; }
} }

View File

@@ -33,17 +33,16 @@
This sample implementation generates a random node ID This sample implementation generates a random node ID
*/ */
void void
get_ieee_node_identifier( uuid_node_t * node ) get_ieee_node_identifier(uuid_node_t *node)
{ {
char seed[16]; char seed[16];
static int inited = 0; static int inited = 0;
static uuid_node_t saved_node; static uuid_node_t saved_node;
if( !inited ) { if (!inited) {
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;
}; };
@@ -83,52 +82,48 @@ get_system_time( uuid_time_t * uuid_time )
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
get_random_info( char seed[16] ) get_random_info(char seed[16])
{ {
MD5_CTX c; MD5_CTX c;
typedef struct { typedef struct {
MEMORYSTATUS m; MEMORYSTATUS m;
SYSTEM_INFO s; SYSTEM_INFO s;
FILETIME t; FILETIME t;
LARGE_INTEGER pc; LARGE_INTEGER pc;
DWORD tc; DWORD tc;
DWORD l; DWORD l;
char hostname[MAX_COMPUTERNAME_LENGTH + 1]; char hostname[MAX_COMPUTERNAME_LENGTH + 1];
} randomness; } randomness;
randomness r; randomness r;
MD5Init( &c ); /* Initialize memory area so that valgrind does not complain */
/* memset(&r, 0, sizeof r);
memory usage stats
*/
GlobalMemoryStatus( &r.m );
/*
random system stats
*/
GetSystemInfo( &r.s );
/*
100ns resolution (nominally) time of day
*/
GetSystemTimeAsFileTime( &r.t );
/*
high resolution performance counter
*/
QueryPerformanceCounter( &r.pc );
/*
milliseconds since last boot
*/
r.tc = GetTickCount( );
r.l = MAX_COMPUTERNAME_LENGTH + 1;
GetComputerName( r.hostname, &r.l ); /* memory usage stats */
MD5Update( &c, &r, sizeof( randomness ) ); GlobalMemoryStatus( &r.m );
MD5Final( seed, &c ); /* random system stats */
GetSystemInfo( &r.s );
/* 100ns resolution (nominally) time of day */
GetSystemTimeAsFileTime( &r.t );
/* high resolution performance counter */
QueryPerformanceCounter( &r.pc );
/* milliseconds since last boot */
r.tc = GetTickCount();
r.l = MAX_COMPUTERNAME_LENGTH + 1;
GetComputerName( r.hostname, &r.l );
/* MD5 it */
MD5Init(&c);
MD5Update(&c, &r, sizeof r);
MD5Final(seed, &c);
}; };
#else
#else /* _WINDOWS_ */
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
get_system_time( uuid_time_t * uuid_time ) get_system_time(uuid_time_t *uuid_time)
{ {
struct timeval tp; struct timeval tp;
@@ -145,22 +140,28 @@ get_system_time( uuid_time_t * uuid_time )
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
get_random_info( char seed[16] ) get_random_info(char seed[16])
{ {
MD5_CTX c; MD5_CTX c;
typedef struct { typedef struct {
// struct sysinfo s; //struct sysinfo s;
struct timeval t; struct timeval t;
char hostname[257]; char hostname[257];
} randomness; } randomness;
randomness r; randomness r;
MD5Init( &c ); /* Initialize memory area so that valgrind does not complain */
memset(&r, 0, sizeof r);
gettimeofday( &r.t, ( struct timezone * )0 ); /* Get some random stuff */
gethostname( r.hostname, 256 ); gettimeofday(&r.t, (struct timezone *)0);
MD5Update( &c, &r, sizeof( randomness ) ); gethostname(r.hostname, 256 );
MD5Final( seed, &c );
/* MD5 it */
MD5Init(&c);
MD5Update(&c, &r, sizeof r);
MD5Final(seed, &c);
}; };
#endif #endif /* _WINDOWS_ */

View File

@@ -53,10 +53,10 @@ static unsigned16 true_random( void );
uuid_create -- generator a UUID uuid_create -- generator a UUID
*/ */
int int
uuid_create( uuid_upnp * uid ) uuid_create(uuid_upnp *uid)
{ {
uuid_time_t timestamp, uuid_time_t timestamp;
last_time; uuid_time_t last_time;
unsigned16 clockseq; unsigned16 clockseq;
uuid_node_t node; uuid_node_t node;
uuid_node_t last_node; uuid_node_t last_node;
@@ -65,61 +65,64 @@ uuid_create( uuid_upnp * uid )
/* /*
acquire system wide lock so we're alone acquire system wide lock so we're alone
*/ */
UUIDLock( ); UUIDLock();
/* /*
get current time get current time
*/ */
get_current_time( &timestamp ); get_current_time(&timestamp);
/* /*
get node ID get node ID
*/ */
get_ieee_node_identifier( &node ); get_ieee_node_identifier(&node);
/* /*
get saved state from NV storage get saved state from NV storage
*/ */
f = read_state( &clockseq, &last_time, &last_node ); f = read_state(&clockseq, &last_time, &last_node);
/* /*
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
*/ */
format_uuid_v1( uid, clockseq, timestamp, node ); format_uuid_v1(uid, clockseq, timestamp, node);
/* /*
save the state for next time save the state for next time
*/ */
write_state( clockseq, timestamp, node ); write_state(clockseq, timestamp, node);
UUIDUnlock( ); UUIDUnlock();
return ( 1 ); return 1;
}; };
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
void void
uuid_unpack( uuid_upnp * u, uuid_unpack(uuid_upnp *u, char *out)
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]);
}; };
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
@@ -137,11 +140,10 @@ format_uuid_v1( uuid_upnp * uid,
Construct a version 1 uuid with the information we've gathered Construct a version 1 uuid with the information we've gathered
* plus a few constants. * plus a few constants.
*/ */
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 ) & uid->time_hi_and_version = (unsigned short)((timestamp >> 48) & 0x0FFF);
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;
uid->clock_seq_hi_and_reserved |= 0x80; uid->clock_seq_hi_and_reserved |= 0x80;
@@ -227,7 +229,6 @@ 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;
}; };

View File

@@ -105,7 +105,7 @@ main (int argc, char* argv[])
* Test library initialisation * Test library initialisation
*/ */
printf ("\n"); printf ("\n");
printf ("Intializing UPnP ... \n"); printf ("Initializing 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();