Compare commits

..

7 Commits

Author SHA1 Message Date
Oxy
d0014a1ae5 workaround for Linux-applications that do not catch SIGPIPE backported
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.1@76 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-08-07 05:49:19 +00:00
Oxy
dee7744256 Windows-port: some special code and switches for statical libraries added
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.1@73 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-31 05:32:33 +00:00
Oxy
adcc34aeac fixes from main branch backported
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.1@72 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-27 05:31:17 +00:00
Marcelo Roberto Jimenez
3a11a7b113 Merge of r65.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.1@66 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 11:53:02 +00:00
Marcelo Roberto Jimenez
af5db93bb1 Merge of r59.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.1@60 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-20 02:49:37 +00:00
Oxy
579a6fdee4 email addresses modified to hide them from spambots (in SVNWeb)
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.1@57 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-18 06:39:45 +00:00
Marcelo Roberto Jimenez
5a505c72ec Created release 1.4.1 from branch-1.4.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/tags/release-1.4.1@56 119443c7-1b9e-41f8-b6fc-b9c35fce742c
2006-07-14 14:43:13 +00:00
89 changed files with 4691 additions and 11863 deletions

378
ChangeLog
View File

@@ -1,308 +1,3 @@
*******************************************************************************
Version 1.4.7
*******************************************************************************
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>
* full support for Windows added, static library and DLL are fully
@@ -332,9 +27,9 @@ Version 1.4.1
* Patch to fix memory leaks and reasons for crashes added (thanks
to loigu)
*******************************************************************************
Version 1.4.0
*******************************************************************************
*************************************************************************
Release of version 1.4.0
*************************************************************************
2006-05-26 Oxy <virtual_worlds(at)gmx.de>
@@ -351,27 +46,24 @@ Version 1.4.0
2006-05-18 Oxy <virtual_worlds(at)gmx.de>
* DSM-320 patch added (fetched from project MediaTomb)
* httpGet additons atch added, Added proxy support by introducing
UpnpOpenHttpGetProxy. UpnpOpenHttpGet now just calls
UpnpOpenHttpGetProxy with the proxy url set to NULL.
* Bugfix for typo ("\0" / "0") in ixmlparser.c
* Bugfix for M-Search packet
*******************************************************************************
*************************************************************************
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>
* THANKS: new file with list of contributors
* upnp/src/gena/gena_device.c (respond_ok): add 'Content-Length: 0'
in subscription response. Patch by Chaos (Bug # 1455367).
2006-04-08 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-04-08 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/doc/UPnP_Programming_Guide.pdf: replace this document with
the one in libupnp-doc-1.2.1 because current CVS version
@@ -382,20 +74,20 @@ FORK FROM DEAD libupnp
* changes applied to several files to work under Sparc Solaris, temporarily
requiring a define SPARC_SOLARIS
2006-04-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-04-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/Makefile.am: install upnp samples in $(docdir)/examples
2006-03-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add --with-docdir option to choose where documentation
is installed (or -without-docdir to not install the documentation)
2006-03-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/test: add simple test suite for xml parser
2006-03-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/ixmlparser.c (Parser_processCDSect): fix bug which prevents
CDATA sections which contain a 0 (zero) to be parsed (instead the
@@ -406,18 +98,18 @@ FORK FROM DEAD libupnp
option, and move samples compilation from check_PROGRAMS to
noinst_PROGRAMS
2006-03-25 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-25 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/genlib/miniserver/miniserver.c (get_miniserver_sockets):
fix bug if new socket created has fd 0 (can only occur when stdin
has been closed). Patch by Oskar Liljeblad 2004-07-02 :
http://sourceforge.net/mailarchive/message.php?msg_id=8870528
2006-03-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/test/test_init.c: add some version checks and exit if failure
2006-03-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* libupnp version 1.3.1
@@ -432,11 +124,11 @@ FORK FROM DEAD libupnp
dependencies between upnp and ixml / threadutil, so that programs
linking against upnp only still work.
2006-03-04 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-04 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* libupnp version 1.3.0
2006-03-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-03-03 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/genlib/net/http/httpreadwrite.c (get_sdk_info): use
package version string from configure to set sdk info
@@ -444,7 +136,7 @@ FORK FROM DEAD libupnp
* upnp/Makefile.am: add sample/tvdevice/web/ files in EXTRA_DIST
+ do not distribute generated upnpconfig.h file.
2006-02-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-02-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/inc/config.h, configure.ac: use only new defines
UPNP_HAVE_xx instead of INCLUDE_yyy_APIS and INTERNAL_WEB_SERVER
@@ -453,7 +145,7 @@ FORK FROM DEAD libupnp
the librarie LDFLAGS in order to export only the symbols defined
in the API
2006-02-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-02-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add libtool versions for the 3 libraries
@@ -461,7 +153,7 @@ FORK FROM DEAD libupnp
* threadutil/src/ThreadPool.c (SetSeed): add missing 'static'
2006-02-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-02-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/inc/iasnprintf.h: add gcc __printf__ format attribute
to "iasnprintf"
@@ -482,11 +174,11 @@ FORK FROM DEAD libupnp
the configuration of the installed libraries (generates installed
file <upnp/upnpconfig.h>)
2006-02-22 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-02-22 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/ : add missing include of config.h in some .c files
2006-02-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-02-21 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/upnp.h: move some definitions which should not be
exported into "upnp/src/inc/util.h"
@@ -494,12 +186,12 @@ FORK FROM DEAD libupnp
* import all modifications below from libupnp in djmount 0.51
into official libupnp
2006-01-17 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-01-17 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/Makefile.am (libthreadutil_la_SOURCES): remove extraneous
file
2006-01-15 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-01-15 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* configure.ac: add checks for large-file support
@@ -519,53 +211,53 @@ FORK FROM DEAD libupnp
* ixml/src/node.c (ixmlNode_getNodeType): fix compilation warning
on const return type
2006-01-12 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-01-12 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/inc/readwrite.h : suppress unused C++ header file
2006-01-11 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2006-01-11 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/config.h, upnp/src/inc/upnpapi.h,
upnp/src/inc/httpreadwrite.h: remove internal configuration variable
MINIMUM_DELAY (no clear purpose)
2005-12-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-12-05 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/upnp.h: re-declare obsolete method UpnpSetContentLength,
for binary compatibility with previous libupnp version.
* upnp/src/api/upnpapi.c: correct type of g_maxContentLength to size_t
2005-11-01 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-11-01 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* autoconfiscate library : replace all makefiles by Makefile.am
for automake support, + preliminary autoconf support
(generated config.h not yet used in source files)
2005-10-18 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-10-18 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/makefile: fix location of DEBUG STATIC libupnp library
* upnp/sample/tvctrlpt/linux/Makefile,
upnp/sample/tvdevice/linux/Makefile: fix STATIC library support
2005-10-16 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-10-16 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* threadutil/src/Makefile (clean): remove built library
2005-08-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-08-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/ixml.h, ixml/src/ixml.c (ixmlRelaxParser) : new function
* ixml/src/ixmlparser.h, ixml/src/ixmlparser.c (Parser_setErrorChar) :
new function
2005-08-02 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-08-02 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/Makefile: correct bug for static library being incorrectly
stripped when building non-debug
2005-06-09 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-06-09 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* ixml/src/element.c (ixmlElement_removeAttributeNode):
remove some compilation warning
@@ -576,7 +268,7 @@ FORK FROM DEAD libupnp
* upnp/inc/upnptools.h, upnp/src/api/upnptools.c :
add missing const's in public API
2005-05-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-05-28 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/inc/config.h: suppress HTTP_READ_BYTES (unused)
and replace by DEFAULT_SOAP_CONTENT_LENGTH (previously in upnpapi.h)
@@ -597,7 +289,7 @@ FORK FROM DEAD libupnp
* upnp/src/genlib/net/http/httpreadwrite.c : corrected an incorrect
sprintf format
2005-05-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-05-27 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/makefile, upnp/src/makefile,
ixml/Makefile, ixml/src/Makefile,
@@ -605,7 +297,7 @@ FORK FROM DEAD libupnp
implement STATIC library support (from patch at
http://sourceforge.net/tracker/?group_id=7189&atid=307189 )
2005-05-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
2005-05-26 R<>mi Turboult <r3mi(at)users.sourceforge.net>
* upnp/src/api/upnpapi.c, upnp/src/soap/soap_device.c,
upnp/src/soap/makefile :

1257
Doxyfile

File diff suppressed because it is too large Load Diff

View File

@@ -1,34 +1,25 @@
# $Id: Makefile.am,v 1.5 2006/04/29 20:12:50 r3mi Exp $
#
# 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
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 = libupnp.pc.in LICENSE THANKS libupnp.spec \
build/libupnp.bpf \
build/libupnp.bpr \
build/libupnp.dsp \
build/libupnp.dsw \
build/inc/autoconfig.h \
build/inc/config.h \
build/inc/upnpconfig.h \
build/msvc/inttypes.h
build/inc/upnpconfig.h
# This variable must have 'exec' in its name, in order to be installed
@@ -36,14 +27,18 @@ EXTRA_DIST = \
pkgconfigexecdir = $(libdir)/pkgconfig
pkgconfigexec_DATA = libupnp.pc
$(pkgconfigexec_DATA): config.status
if WITH_DOCUMENTATION
if WITH_DOCDIR
docdir = @DOCDIR@
doc_DATA = LICENSE README NEWS TODO THANKS
endif
CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt

2
README
View File

@@ -1,7 +1,7 @@
Portable SDK for UPnP* Devices (libupnp)
Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved.
Copyright (c) 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
Copyright (c) 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
Copyright (c) 2006 Michel Pfeiffer and others <virtual_worlds@gmx.de>
See LICENSE for details.

27
THANKS
View File

@@ -6,29 +6,18 @@ suggesting various improvements or submitting actual code.
Here is a list of these people. Help us keep it complete and
exempt of errors.
- Arno Willig
- Chaos
- Craig Nelson
- David Maass
- Emil Ljungdahl
- Erik Johansson
- Eric Tanguy
- Erwan Velu
- Fredrik Svensson
- Glen Masgai
- Jiri Zouhar
- Paul Vixie
- Arno Willig
- Eric Tanguy
- Oskar Liljeblad
- Chaos
- John Dennis
- Jonathan (no_dice)
- Leuk_He
- Jiri Zouhar
- Loigu
- Luke Kim
- Marcelo Roberto Jimenez
- Marcelo Jimenez
- Markus Strobl
- Nektarios K. Papadopoulos
- Oskar Liljeblad
- Michael (Oxy)
- Paul Vixie
- Oxy
- Siva Chandran
- Timothy Redaelli
- Titus Winters

View File

@@ -13,3 +13,7 @@ autoreconf --force --install -Wall -Wno-obsolete $* || exit 1
echo "Now run ./configure and then make."
exit 0

View File

@@ -1,4 +1,4 @@
/* autoconfig.h. Generated from autoconfig.h.in by configure. */
/* autoconfig.h. Generated by configure. */
/* autoconfig.h.in. Generated from configure.ac by autoheader. */
/* Define to 1 to compile debug code */
@@ -19,18 +19,15 @@
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
#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 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 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 HAVE_MEMORY_H 1
@@ -95,19 +92,19 @@
#define PACKAGE "libupnp"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "mroberto@users.sourceforge.net"
#define PACKAGE_BUGREPORT "virtual_worlds@gmx.de"
/* Define to the full name of this package. */
#define PACKAGE_NAME "libupnp"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "libupnp 1.4.7"
#define PACKAGE_STRING "libupnp 1.4.0"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "libupnp"
/* Define to the version of this package. */
#define PACKAGE_VERSION "1.4.7"
#define PACKAGE_VERSION "1.4.0"
/* Define to necessary symbol if this constant uses a non-standard name on
your system. */
@@ -138,30 +135,27 @@
#define UPNP_VERSION_MINOR 4
/* see upnpconfig.h */
#define UPNP_VERSION_PATCH 7
#define UPNP_VERSION_PATCH 0
/* see upnpconfig.h */
#define UPNP_VERSION_STRING "1.4.7"
#define UPNP_VERSION_STRING "1.4.0"
/* Version number of package */
#define VERSION "1.4.7"
#define VERSION "1.4.0"
/* File Offset size */
/* Number of bits in a file offset, on hosts where this is settable. */
#define _FILE_OFFSET_BITS 64
/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
/* #undef _LARGEFILE_SOURCE */
/* Large files support */
#define _LARGE_FILE_SOURCE
/* Define for large files, on AIX-style hosts. */
/* #undef _LARGE_FILES */
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* 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. */
/* Define to `unsigned' if <sys/types.h> does not define. */
/* #undef size_t */
/* Substitute for socklen_t */

View File

@@ -95,17 +95,6 @@
#define MAX_THREADS 12
//@}
/** @name MAX_JOBS_TOTAL
* The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs
* that can be queued. If this limit is reached further jobs will be thrown
* to avoid memory exhaustion. The default value 100.
* (Added by Axis.)
*/
//@{
#define MAX_JOBS_TOTAL 100
//@}
/** @name DEFAULT_SOAP_CONTENT_LENGTH
* SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.
* This prevents devices that have a misbehaving web server to send
@@ -304,6 +293,27 @@
/** @name DBGONLY
The {\bf DBGONLY} macro allows code to be marked so that it
is only included in the DEBUG build and not the release. To
use this macro, put the code inside of the parentheses:
{\tt DBGONLY(int i;)}
This will cause a declaration of the integer {\tt i} only
in the debug build.
*/
//@{
#ifdef DEBUG
#define DBGONLY(x) x
#else
#define DBGONLY(x)
#endif
//@}
#undef EXCLUDE_WEB_SERVER
#undef EXCLUDE_MINISERVER
#ifdef INTERNAL_WEB_SERVER
@@ -338,6 +348,13 @@
#define CLIENTONLY(x)
#endif
#ifdef INCLUDE_DEVICE_APIS
#define DEVICEONLY(x) x
#else
#define DEVICEONLY(x)
#endif
//@}
#endif

View File

@@ -1,8 +1,8 @@
/* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in by configure. */
/* upnp/inc/upnpconfig.h. Generated by configure. */
// -*- C -*-
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
@@ -40,7 +40,7 @@
***************************************************************************/
/** The library version (string) e.g. "1.3.0" */
#define UPNP_VERSION_STRING "1.4.7"
#define UPNP_VERSION_STRING "1.4.0"
/** Major version of the library */
#define UPNP_VERSION_MAJOR 1
@@ -49,7 +49,7 @@
#define UPNP_VERSION_MINOR 4
/** Patch version of the library */
#define UPNP_VERSION_PATCH 7
#define UPNP_VERSION_PATCH 0
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
#define UPNP_VERSION \
@@ -69,7 +69,7 @@
/** Defined to 1 if the library has been compiled with DEBUG enabled
* (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

View File

@@ -34,7 +34,7 @@
<RESFILES value=""/>
<DEFFILE value=""/>
<RESDEPEN value="$(RESFILES)"/>
<LIBFILES value="D:\pthreads-w32-1-10-0-release\pthreadBC1.lib"/>
<LIBFILES value="..\..\..\pthreads-w32-1-10-0-release\pthreadBC1.lib"/>
<LIBRARIES value=""/>
<SPARELIBS value=""/>
<PACKAGES value=""/>
@@ -45,11 +45,11 @@
<DEBUGLIBPATH value="$(BCB)\lib\debug"/>
<RELEASELIBPATH value="$(BCB)\lib\release"/>
<LINKER value="tlink32"/>
<USERDEFINES value="WIN32;LIBUPNP_EXPORTS;UPNP_USE_BCBPP"/>
<USERDEFINES value="WIN32;LIBUPNP_EXPORTS"/>
<SYSDEFINES value="NO_STRICT;_NO_VCL"/>
<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;..\..\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;..\..\pthreads-w32-1-10-0-release"/>
<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"/>
<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"/>
<WARNINGS value="-w-par"/>
</MACROS>
<OPTIONS>
@@ -94,27 +94,22 @@ ProductVersion=1.0.0.0
Comments=
[HistoryLists\hlIncludePath]
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;..\..\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
Count=1
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
[HistoryLists\hlLibraryPath]
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;..\..\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
Count=1
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
[HistoryLists\hlDebugSourcePath]
Count=1
Item0=$(BCB)\source\vcl
[HistoryLists\hlConditionals]
Count=4
Item0=WIN32;LIBUPNP_EXPORTS;UPNP_USE_BCBPP
Item1=WIN32;LIBUPNP_EXPORTS
Item2=WIN32;EXPORT_SPEC
Item3=WIN32
Count=3
Item0=WIN32;LIBUPNP_EXPORTS
Item1=WIN32;EXPORT_SPEC
Item2=WIN32
[Debugging]
DebugSourceDirs=$(BCB)\source\vcl

View File

@@ -5,17 +5,17 @@
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=libupnp - Win32 Debug
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
!MESSAGE Dies ist kein g<>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<>hren Sie den Befehl
!MESSAGE
!MESSAGE NMAKE /f "libupnp.mak".
!MESSAGE
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
!MESSAGE Sie k<>nnen beim Ausf<73>hren von NMAKE eine Konfiguration angeben
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
!MESSAGE
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
!MESSAGE
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
!MESSAGE F<>r die Konfiguration stehen zur Auswahl:
!MESSAGE
!MESSAGE "libupnp - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library")
!MESSAGE "libupnp - Win32 Debug" (basierend auf "Win32 (x86) Dynamic-Link Library")
@@ -43,7 +43,7 @@ RSC=rc.exe
# PROP Ignore_Export_Lib 0
# 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 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 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 BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
@@ -53,8 +53,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
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 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
# 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
!ELSEIF "$(CFG)" == "libupnp - Win32 Debug"
@@ -70,7 +69,7 @@ LINK32=link.exe
# PROP Ignore_Export_Lib 0
# 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 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 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 BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
@@ -80,7 +79,7 @@ BSC32=bscmake.exe
# ADD BSC32 /nologo
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 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
@@ -275,146 +274,6 @@ SOURCE=..\upnp\src\win_dll.c
# Begin Group "Header-Dateien"
# 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
# Begin Group "Ressourcendateien"

View File

@@ -1,301 +0,0 @@
// ISO C9x compliant inttypes.h for Microsoft Visual Studio
// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124
//
// Copyright (c) 2006 Alexander Chemeris
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. The name of the author may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _MSC_VER // [
#error "Use this header only with Microsoft Visual C++ compilers!"
#endif // _MSC_VER ]
#ifndef _MSC_INTTYPES_H_ // [
#define _MSC_INTTYPES_H_
#if _MSC_VER > 1000
#pragma once
#endif
#include <stdint.h>
// 7.8 Format conversion of integer types
typedef struct {
intmax_t quot;
intmax_t rem;
} imaxdiv_t;
// 7.8.1 Macros for format specifiers
// The fprintf macros for signed integers are:
#define PRId8 "d"
#define PRIi8 "i"
#define PRIdLEAST8 "d"
#define PRIiLEAST8 "i"
#define PRIdFAST8 "d"
#define PRIiFAST8 "i"
#define PRId16 "hd"
#define PRIi16 "hi"
#define PRIdLEAST16 "hd"
#define PRIiLEAST16 "hi"
#define PRIdFAST16 "hd"
#define PRIiFAST16 "hi"
#define PRId32 "I32d"
#define PRIi32 "I32i"
#define PRIdLEAST32 "I32d"
#define PRIiLEAST32 "I32i"
#define PRIdFAST32 "I32d"
#define PRIiFAST32 "I32i"
#define PRId64 "I64d"
#define PRIi64 "I64i"
#define PRIdLEAST64 "I64d"
#define PRIiLEAST64 "I64i"
#define PRIdFAST64 "I64d"
#define PRIiFAST64 "I64i"
#define PRIdMAX "I64d"
#define PRIiMAX "I64i"
#define PRIdPTR "Id"
#define PRIiPTR "Ii"
// The fprintf macros for unsigned integers are:
#define PRIo8 "o"
#define PRIu8 "u"
#define PRIx8 "x"
#define PRIX8 "X"
#define PRIoLEAST8 "o"
#define PRIuLEAST8 "u"
#define PRIxLEAST8 "x"
#define PRIXLEAST8 "X"
#define PRIoFAST8 "o"
#define PRIuFAST8 "u"
#define PRIxFAST8 "x"
#define PRIXFAST8 "X"
#define PRIo16 "ho"
#define PRIu16 "hu"
#define PRIx16 "hx"
#define PRIX16 "hX"
#define PRIoLEAST16 "ho"
#define PRIuLEAST16 "hu"
#define PRIxLEAST16 "hx"
#define PRIXLEAST16 "hX"
#define PRIoFAST16 "ho"
#define PRIuFAST16 "hu"
#define PRIxFAST16 "hx"
#define PRIXFAST16 "hX"
#define PRIo32 "I32o"
#define PRIu32 "I32u"
#define PRIx32 "I32x"
#define PRIX32 "I32X"
#define PRIoLEAST32 "I32o"
#define PRIuLEAST32 "I32u"
#define PRIxLEAST32 "I32x"
#define PRIXLEAST32 "I32X"
#define PRIoFAST32 "I32o"
#define PRIuFAST32 "I32u"
#define PRIxFAST32 "I32x"
#define PRIXFAST32 "I32X"
#define PRIo64 "I64o"
#define PRIu64 "I64u"
#define PRIx64 "I64x"
#define PRIX64 "I64X"
#define PRIoLEAST64 "I64o"
#define PRIuLEAST64 "I64u"
#define PRIxLEAST64 "I64x"
#define PRIXLEAST64 "I64X"
#define PRIoFAST64 "I64o"
#define PRIuFAST64 "I64u"
#define PRIxFAST64 "I64x"
#define PRIXFAST64 "I64X"
#define PRIoMAX "I64o"
#define PRIuMAX "I64u"
#define PRIxMAX "I64x"
#define PRIXMAX "I64X"
#define PRIoPTR "Io"
#define PRIuPTR "Iu"
#define PRIxPTR "Ix"
#define PRIXPTR "IX"
// The fscanf macros for signed integers are:
#define SCNd8 "d"
#define SCNi8 "i"
#define SCNdLEAST8 "d"
#define SCNiLEAST8 "i"
#define SCNdFAST8 "d"
#define SCNiFAST8 "i"
#define SCNd16 "hd"
#define SCNi16 "hi"
#define SCNdLEAST16 "hd"
#define SCNiLEAST16 "hi"
#define SCNdFAST16 "hd"
#define SCNiFAST16 "hi"
#define SCNd32 "ld"
#define SCNi32 "li"
#define SCNdLEAST32 "ld"
#define SCNiLEAST32 "li"
#define SCNdFAST32 "ld"
#define SCNiFAST32 "li"
#define SCNd64 "I64d"
#define SCNi64 "I64i"
#define SCNdLEAST64 "I64d"
#define SCNiLEAST64 "I64i"
#define SCNdFAST64 "I64d"
#define SCNiFAST64 "I64i"
#define SCNdMAX "I64d"
#define SCNiMAX "I64i"
#ifdef _WIN64 // [
# define SCNdPTR "I64d"
# define SCNiPTR "I64i"
#else // _WIN64 ][
# define SCNdPTR "ld"
# define SCNiPTR "li"
#endif // _WIN64 ]
// The fscanf macros for unsigned integers are:
#define SCNo8 "o"
#define SCNu8 "u"
#define SCNx8 "x"
#define SCNX8 "X"
#define SCNoLEAST8 "o"
#define SCNuLEAST8 "u"
#define SCNxLEAST8 "x"
#define SCNXLEAST8 "X"
#define SCNoFAST8 "o"
#define SCNuFAST8 "u"
#define SCNxFAST8 "x"
#define SCNXFAST8 "X"
#define SCNo16 "ho"
#define SCNu16 "hu"
#define SCNx16 "hx"
#define SCNX16 "hX"
#define SCNoLEAST16 "ho"
#define SCNuLEAST16 "hu"
#define SCNxLEAST16 "hx"
#define SCNXLEAST16 "hX"
#define SCNoFAST16 "ho"
#define SCNuFAST16 "hu"
#define SCNxFAST16 "hx"
#define SCNXFAST16 "hX"
#define SCNo32 "lo"
#define SCNu32 "lu"
#define SCNx32 "lx"
#define SCNX32 "lX"
#define SCNoLEAST32 "lo"
#define SCNuLEAST32 "lu"
#define SCNxLEAST32 "lx"
#define SCNXLEAST32 "lX"
#define SCNoFAST32 "lo"
#define SCNuFAST32 "lu"
#define SCNxFAST32 "lx"
#define SCNXFAST32 "lX"
#define SCNo64 "I64o"
#define SCNu64 "I64u"
#define SCNx64 "I64x"
#define SCNX64 "I64X"
#define SCNoLEAST64 "I64o"
#define SCNuLEAST64 "I64u"
#define SCNxLEAST64 "I64x"
#define SCNXLEAST64 "I64X"
#define SCNoFAST64 "I64o"
#define SCNuFAST64 "I64u"
#define SCNxFAST64 "I64x"
#define SCNXFAST64 "I64X"
#define SCNoMAX "I64o"
#define SCNuMAX "I64u"
#define SCNxMAX "I64x"
#define SCNXMAX "I64X"
#ifdef _WIN64 // [
# define SCNoPTR "I64o"
# define SCNuPTR "I64u"
# define SCNxPTR "I64x"
# define SCNXPTR "I64X"
#else // _WIN64 ][
# define SCNoPTR "lo"
# define SCNuPTR "lu"
# define SCNxPTR "lx"
# define SCNXPTR "lX"
#endif // _WIN64 ]
// 7.8.2 Functions for greatest-width integer types
// 7.8.2.1 The imaxabs function
#define imaxabs _abs64
// 7.8.2.2 The imaxdiv function
// This is modified version of div() function from Microsoft's div.c found
// in %MSVC.NET%\crt\src\div.c
#ifdef STATIC_IMAXDIV // [
static
#else // STATIC_IMAXDIV ][
_inline
#endif // STATIC_IMAXDIV ]
imaxdiv_t __cdecl imaxdiv(intmax_t numer, intmax_t denom)
{
imaxdiv_t result;
result.quot = numer / denom;
result.rem = numer % denom;
if (numer < 0 && result.rem > 0) {
// did division wrong; must fix up
++result.quot;
result.rem -= denom;
}
return result;
}
// 7.8.2.3 The strtoimax and strtoumax functions
#define strtoimax _strtoi64
#define strtoumax _strtoui64
// 7.8.2.4 The wcstoimax and wcstoumax functions
#define wcstoimax _wcstoi64
#define wcstoumax _wcstoui64
#endif // _MSC_INTTYPES_H_ ]

View File

@@ -1,15 +1,16 @@
# -*- Autoconf -*-
# $Id: configure.ac,v 1.11 2006/04/09 13:59:44 r3mi Exp $
#
# Top-level configure.ac file for libupnp
#
# Process this file with autoconf to produce a configure script.
#
# (C) Copyright 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
# (C) Copyright 2005-2006 R<>mi Turboult <r3mi@users.sourceforge.net>
#
AC_PREREQ(2.60)
AC_PREREQ(2.59)
AC_INIT([libupnp], [1.4.7], [mroberto@users.sourceforge.net])
AC_INIT([libupnp], [1.4.1], [virtual_worlds@gmx.de])
# *Independently* of the above libupnp package version, the libtool version
# 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:
@@ -18,39 +19,16 @@ AC_INIT([libupnp], [1.4.7], [mroberto@users.sourceforge.net])
# - interfaces added: age++
# - interfaces removed: age=0
# *please update only once, before a formal release, not for each change*
#
# For release 1.4.1, we had:
#AC_SUBST([LT_VERSION_IXML], [2:2:0])
#AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
#AC_SUBST([LT_VERSION_UPNP], [2:2:0])
#
# "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)
# 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])
AC_SUBST([LT_VERSION_IXML], [2:2:0])
AC_SUBST([LT_VERSION_THREADUTIL], [2:2:0])
AC_SUBST([LT_VERSION_UPNP], [2:2:0])
AC_CONFIG_AUX_DIR(config.aux)
AC_CONFIG_MACRO_DIR(m4)
AC_CONFIG_SRCDIR(upnp/inc/upnp.h)
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects dist-bzip2])
#
# Get canonical host names in host and host_os
#
AC_CANONICAL_HOST
AM_INIT_AUTOMAKE([1.8 -Wall foreign subdir-objects])
#
# There are 3 configuration files :
@@ -64,7 +42,6 @@ AC_CANONICAL_HOST
# installed libraries.
#
AC_CONFIG_HEADERS([autoconfig.h upnp/inc/upnpconfig.h])
#AC_SYS_LARGEFILE_SENSITIVE
AC_REVISION([$Revision: 1.11 $])
@@ -129,31 +106,19 @@ RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code])
# doc installation
# autoconf >= 2.60 already defines ${docdir}, but we will not use its
# default value, which is ${datarootdir}/doc/${PACKAGE_TARNAME}.
# That would give us ${datarootdir}/doc/libupnp, and we want the package
# version on that.
docdir="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}"
AC_MSG_CHECKING([for documentation directory])
AC_ARG_WITH(
[documentation],
AS_HELP_STRING(
[--with-documentation=directory_name],
AC_MSG_CHECKING([documentation installation])
AC_ARG_WITH([docdir],
AC_HELP_STRING([--with-docdir=DIR],
[where documentation is installed
@<:@[DATADIR/doc/]AC_PACKAGE_NAME[-]AC_PACKAGE_VERSION@:>@])
AS_HELP_STRING(
[--without-documentation],
AC_HELP_STRING([--without-docdir],
[do not install the documentation]),
[],
[with_documentation=no])
[DOCDIR="$with_docdir"],
[DOCDIR="${datadir}/doc/${PACKAGE_NAME}-${PACKAGE_VERSION}"])
# If something has been entered after an equal sign, assume it is the directory
if test x"$with_documentation" != xyes -a x"$with_documentation" != xno; then
docdir="$with_documentation"
fi
AM_CONDITIONAL(WITH_DOCUMENTATION, test x"$with_documentation" != xno)
AC_SUBST(docdir)
AC_MSG_RESULT($docdir)
AM_CONDITIONAL(WITH_DOCDIR, test x"$with_docdir" != xno)
AC_SUBST(DOCDIR)
AC_MSG_RESULT($DOCDIR)
#
@@ -166,19 +131,10 @@ AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_EGREP
#
# Default compilation flags
#
echo "--------------------- Default compilation flags -------------------------------"
echo host is $host
echo host_os is $host_os
case $host_os in
freebsd*)
echo "Using FreeBSD specific compiler settings"
# Put FreeBSD specific compiler flags here
;;
*)
echo "Using non-specific system compiler settings"
if test x"$enable_debug" = xyes; then
# AC_PROG_CC already sets CFLAGS to "-g -O2" by default
:
@@ -186,20 +142,11 @@ freebsd*)
# add optimise for size
AX_CFLAGS_GCC_OPTION([-Os])
fi
;;
esac
AX_CFLAGS_WARN_ALL
echo "-------------------------------------------------------------------------------"
#
# 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])
# Arrange for large-file support (can be disabled with --disable-largefile).
# Define _FILE_OFFSET_BITS and _LARGE_FILES if necessary
AC_SYS_LARGEFILE
#
@@ -208,25 +155,7 @@ AC_DEFINE([_FILE_OFFSET_BITS], [64], [File Offset size])
AC_HEADER_STDC
# libupnp code doesn't use autoconf variables yet,
# so just abort if a header file is not found.
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])])
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])])
#
@@ -242,29 +171,25 @@ TYPE_SOCKLEN_T
#
AC_FUNC_VPRINTF
AC_FUNC_FSEEKO
AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)])
#
# 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
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_OUTPUT

13
docs/dist/Makefile.am vendored
View File

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

View File

@@ -1,47 +1,46 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef _IXML_H_
#define _IXML_H_
#include <stdio.h>
#include <string.h>
//#include <malloc.h>
#include <assert.h>
#ifdef WIN32
#ifndef UPNP_STATIC_LIB
#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)
#else
#define EXPORT_SPEC __declspec(dllimport)
@@ -55,7 +54,6 @@
typedef int BOOL;
#define DOMString char *
@@ -90,7 +88,7 @@ typedef int BOOL;
* etc., refer to section 1.1 of the DOM2-Core recommendation.
*/
/*! @{ */
//@{
/*================================================================
*
@@ -123,7 +121,7 @@ typedef enum
*
*=================================================================*/
typedef enum
{ /* see DOM spec */
{ // see DOM spec
IXML_INDEX_SIZE_ERR = 1,
IXML_DOMSTRING_SIZE_ERR = 2,
IXML_HIERARCHY_REQUEST_ERR = 3,
@@ -242,7 +240,7 @@ extern "C" {
* its functionality. For more information, refer to DOM2-Core page 34.
*/
/*! @{ */
//@{
/** 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
@@ -262,7 +260,7 @@ ixmlNode_getNodeName(IXML_Node *nodeptr
* @return [DOMString] A {\bf DOMString} of the {\bf Node} value.
*/
EXPORT_SPEC const DOMString
EXPORT_SPEC DOMString
ixmlNode_getNodeValue(IXML_Node *nodeptr
/** Pointer to the {\bf Node} to retrieve the value. */
);
@@ -284,7 +282,7 @@ ixmlNode_getNodeValue(IXML_Node *nodeptr
EXPORT_SPEC int
ixmlNode_setNodeValue(IXML_Node *nodeptr,
/** The {\bf Node} to which to assign a new value. */
const char *newNodeValue
char *newNodeValue
/** The new value of the {\bf Node}. */
);
@@ -441,7 +439,7 @@ ixmlNode_getNamespaceURI(IXML_Node *nodeptr
* or {\tt NULL}.
*/
EXPORT_SPEC const DOMString
EXPORT_SPEC DOMString
ixmlNode_getPrefix(IXML_Node *nodeptr
/** The {\bf Node} from which to retrieve the prefix. */
);
@@ -622,7 +620,7 @@ ixmlNode_cloneNode(IXML_Node *nodeptr,
*/
EXPORT_SPEC BOOL
ixmlNode_hasAttributes(IXML_Node *nodeptr
ixmlNode_hasAttributes(IXML_Node *node
/** The {\bf Node} to query for attributes. */
);
@@ -632,11 +630,11 @@ ixmlNode_hasAttributes(IXML_Node *nodeptr
*/
EXPORT_SPEC void
ixmlNode_free(IXML_Node *nodeptr
ixmlNode_free(IXML_Node *IXML_Node
/** The {\bf Node} to free. */
);
/*! @} */
//@}
/*================================================================
*
@@ -651,7 +649,7 @@ ixmlNode_free(IXML_Node *nodeptr
* allowable attributes and values for a particular element. For more
* information, refer to the {\it Interface Attr} section in the DOM2-Core.
*/
/*! @{ */
//@{
/** Frees an {\bf Attr} node.
@@ -664,7 +662,7 @@ ixmlAttr_free(IXML_Attr *attrNode
/** The {\bf Attr} node to free. */
);
/*! @} */
//@}
/*================================================================
@@ -682,7 +680,7 @@ ixmlAttr_free(IXML_Attr *attrNode
* information, refer to the {\it Interface CDATASection} section in the
* DOM2-Core.
*/
/*! @{ */
//@{
/** Initializes a {\bf CDATASection} node.
@@ -706,7 +704,7 @@ ixmlCDATASection_free(IXML_CDATASection *nodeptr
/** The {\bf CDATASection} node to free. */
);
/*! @} */
//@}
/*================================================================
*
@@ -721,7 +719,7 @@ ixmlCDATASection_free(IXML_CDATASection *nodeptr
* primary interface to the elements of the document. For more information,
* refer to the {\it Interface Document} section in the DOM2Core.
*/
/*! @{ */
//@{
/** Initializes a {\bf Document} node.
*
@@ -869,7 +867,7 @@ EXPORT_SPEC int
ixmlDocument_createCDATASectionEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
const DOMString data,
DOMString data,
/** The data to associate with the new
{\bf CDATASection} node. */
IXML_CDATASection** cdNode
@@ -888,7 +886,7 @@ EXPORT_SPEC IXML_CDATASection*
ixmlDocument_createCDATASection(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
const DOMString data
DOMString data
/** The data to associate with the new {\bf
CDATASection} node. */
);
@@ -901,7 +899,7 @@ ixmlDocument_createCDATASection(IXML_Document *doc,
EXPORT_SPEC IXML_Attr*
ixmlDocument_createAttribute(IXML_Document *doc,
/** The owner {\bf Document} of the new node. */
const char *name
char *name
/** The name of the new attribute. */
);
@@ -926,7 +924,7 @@ EXPORT_SPEC int
ixmlDocument_createAttributeEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
const char *name,
char *name,
/** The name of the new attribute. */
IXML_Attr** attrNode
/** A pointer to a {\bf Attr} where the new
@@ -945,11 +943,11 @@ ixmlDocument_createAttributeEx(IXML_Document *doc,
EXPORT_SPEC IXML_NodeList*
ixmlDocument_getElementsByTagName(IXML_Document *doc,
/** The {\bf Document} to search. */
const DOMString tagName
DOMString tagName
/** 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
* namespace URI.
@@ -972,10 +970,10 @@ EXPORT_SPEC int
ixmlDocument_createElementNSEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
node. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI for the new {\bf
Element}. */
const DOMString qualifiedName,
DOMString qualifiedName,
/** The qualified name of the new {\bf
Element}. */
IXML_Element** rtElement
@@ -994,10 +992,10 @@ ixmlDocument_createElementNSEx(IXML_Document *doc,
EXPORT_SPEC IXML_Element*
ixmlDocument_createElementNS(IXML_Document *doc,
/** The owner {\bf Document} of the new node. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI for the new {\bf
Element}. */
const DOMString qualifiedName
DOMString qualifiedName
/** The qualified name of the new {\bf
Element}. */
);
@@ -1023,9 +1021,9 @@ EXPORT_SPEC int
ixmlDocument_createAttributeNSEx(IXML_Document *doc,
/** The owner {\bf Document} of the new
{\bf Attr}. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI for the attribute. */
const DOMString qualifiedName,
DOMString qualifiedName,
/** The qualified name of the attribute. */
IXML_Attr** attrNode
/** A pointer to an {\bf Attr} where the
@@ -1042,9 +1040,9 @@ EXPORT_SPEC IXML_Attr*
ixmlDocument_createAttributeNS(IXML_Document *doc,
/** The owner {\bf Document} of the new
{\bf Attr}. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI for the attribute. */
const DOMString qualifiedName
DOMString qualifiedName
/** The qualified name of the attribute. */
);
@@ -1061,11 +1059,11 @@ ixmlDocument_createAttributeNS(IXML_Document *doc,
EXPORT_SPEC IXML_NodeList*
ixmlDocument_getElementsByTagNameNS(IXML_Document* doc,
/** The {\bf Document} to search. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace of the elements to
find or {\tt "*"} to match any
namespace. */
const DOMString localName
DOMString localName
/** The local name of the elements to
find or {\tt "*"} to match any local
name. */
@@ -1081,7 +1079,7 @@ EXPORT_SPEC IXML_Element*
ixmlDocument_getElementById(IXML_Document* doc,
/** The owner {\bf Document} of the {\bf
Element}. */
const DOMString tagName
DOMString tagName
/** The name of the {\bf Element}.*/
);
@@ -1130,7 +1128,7 @@ ixmlDocument_importNode(IXML_Document* doc,
/** A pointer to a new {\bf Node} owned by {\bf
doc}. */
);
/*! @} */
//@}
/*================================================================
*
@@ -1146,7 +1144,7 @@ ixmlDocument_importNode(IXML_Document* doc,
* extends the {\bf Node} interface and adds more operations to manipulate
* attributes.
*/
/*! @{ */
//@{
/** Initializes a {\bf IXML_Element} node.
*
@@ -1176,11 +1174,11 @@ ixmlElement_getTagName(IXML_Element* element
* attribute.
*/
EXPORT_SPEC const DOMString
EXPORT_SPEC DOMString
ixmlElement_getAttribute(IXML_Element* element,
/** The {\bf Element} from which to retrieve the
attribute. */
const DOMString name
DOMString name
/** The name of the attribute to retrieve. */
);
@@ -1204,9 +1202,9 @@ EXPORT_SPEC int
ixmlElement_setAttribute(IXML_Element* element,
/** The {\bf Element} on which to set the
attribute. */
const DOMString name,
DOMString name,
/** The name of the attribute. */
const DOMString value
DOMString value
/** The value of the attribute. Note that this is
a non-parsed string and any markup must be
escaped. */
@@ -1226,7 +1224,7 @@ EXPORT_SPEC int
ixmlElement_removeAttribute(IXML_Element* element,
/** The {\bf Element} from which to remove the
attribute. */
const DOMString name
DOMString name
/** The name of the attribute to remove. */
);
@@ -1242,7 +1240,7 @@ EXPORT_SPEC IXML_Attr*
ixmlElement_getAttributeNode(IXML_Element* element,
/** The {\bf Element} from which to get the
attribute node. */
const DOMString name
DOMString name
/** The name of the attribute node to find. */
);
@@ -1311,12 +1309,12 @@ EXPORT_SPEC IXML_NodeList*
ixmlElement_getElementsByTagName(IXML_Element* element,
/** The {\bf Element} from which to start
the search. */
const DOMString tagName
DOMString tagName
/** The name of the tag for which to
search. */
);
/* introduced in DOM 2 */
// introduced in DOM 2
/** Retrieves an attribute value using the local name and namespace URI.
*
@@ -1324,13 +1322,13 @@ ixmlElement_getElementsByTagName(IXML_Element* element,
* matching attribute.
*/
EXPORT_SPEC const DOMString
EXPORT_SPEC DOMString
ixmlElement_getAttributeNS(IXML_Element* element,
/** The {\bf Element} from which to get the
attribute value. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI of the attribute. */
const DOMString localname
DOMString localname
/** The local name of the attribute. */
);
@@ -1360,11 +1358,11 @@ EXPORT_SPEC int
ixmlElement_setAttributeNS(IXML_Element* element,
/** The {\bf Element} on which to set the
attribute. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI of the new attribute. */
const DOMString qualifiedName,
DOMString qualifiedName,
/** The qualified name of the attribute. */
const DOMString value
DOMString value
/** The new value for the attribute. */
);
@@ -1382,9 +1380,9 @@ EXPORT_SPEC int
ixmlElement_removeAttributeNS(IXML_Element* element,
/** The {\bf Element} from which to remove the
the attribute. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI of the attribute. */
const DOMString localName
DOMString localName
/** The local name of the attribute.*/
);
@@ -1397,9 +1395,9 @@ EXPORT_SPEC IXML_Attr*
ixmlElement_getAttributeNodeNS(IXML_Element* element,
/** The {\bf Element} from which to get the
attribute. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI of the attribute. */
const DOMString localName
DOMString localName
/** The local name of the attribute. */
);
@@ -1443,10 +1441,10 @@ EXPORT_SPEC IXML_NodeList*
ixmlElement_getElementsByTagNameNS(IXML_Element* element,
/** The {\bf Element} from which to start
the search. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI of the {\bf
Element}s to find. */
const DOMString localName
DOMString localName
/** The local name of the {\bf Element}s
to find. */
);
@@ -1463,7 +1461,7 @@ EXPORT_SPEC BOOL
ixmlElement_hasAttribute(IXML_Element* element,
/** The {\bf Element} on which to check for an
attribute. */
const DOMString name
DOMString name
/** The name of the attribute for which to check. */
);
@@ -1479,9 +1477,9 @@ EXPORT_SPEC BOOL
ixmlElement_hasAttributeNS(IXML_Element* element,
/** The {\bf Element} on which to check for the
attribute. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI of the attribute. */
const DOMString localName
DOMString localName
/** The local name of the attribute. */
);
@@ -1495,7 +1493,7 @@ ixmlElement_free(IXML_Element* element
/** The {\bf Element} to free. */
);
/*! @} */
//@}
/*================================================================
*
@@ -1510,7 +1508,7 @@ ixmlElement_free(IXML_Element* element
* no particular order. The {\bf Node} interface uses a {\bf NamedNodeMap}
* to maintain the attributes of a node.
*/
/*! @{ */
//@{
/** Returns the number of items contained in this {\bf NamedNodeMap}.
*
@@ -1531,7 +1529,7 @@ ixmlNamedNodeMap_getLength(IXML_NamedNodeMap *nnMap
EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_getNamedItem(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} to search. */
const DOMString name
DOMString name
/** The name of the {\bf Node} to find. */
);
@@ -1562,7 +1560,7 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_removeNamedItem(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to
remove the item. */
const DOMString name
DOMString name
/** The name of the item to remove. */
);
@@ -1581,7 +1579,7 @@ ixmlNamedNodeMap_item(IXML_NamedNodeMap *nnMap,
/** 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
* namespace URI and local name.
@@ -1594,10 +1592,10 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_getNamedItemNS(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to
remove the {\bf Node}. */
const DOMString *namespaceURI,
DOMString *namespaceURI,
/** The namespace URI of the {\bf Node} to
remove. */
const DOMString localName
DOMString localName
/** The local name of the {\bf Node} to
remove. */
);
@@ -1629,10 +1627,10 @@ EXPORT_SPEC IXML_Node*
ixmlNamedNodeMap_removeNamedItemNS(IXML_NamedNodeMap *nnMap,
/** The {\bf NamedNodeMap} from which to
remove the {\bf Node}. */
const DOMString namespaceURI,
DOMString namespaceURI,
/** The namespace URI of the {\bf Node}
to remove. */
const DOMString localName
DOMString localName
/** The local name of the {\bf Node} to
remove. */
);
@@ -1648,7 +1646,7 @@ ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap
/** The {\bf NamedNodeMap to free}. */
);
/*! @} */
//@}
/*================================================================
*
@@ -1663,7 +1661,7 @@ ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap
* the nodes contained in a {\bf NodeList}. The DOM2-Core refers to
* this as being {\it live}.
*/
/*! @{ */
//@{
/** Retrieves a {\bf Node} from a {\bf NodeList} specified by a
* numerical index.
@@ -1703,8 +1701,8 @@ ixmlNodeList_free(IXML_NodeList *nList
/** The {\bf NodeList} to free. */
);
/*! @} */ /* Interface NodeList */
/*! @} */ /* DOM Interfaces */
//@} Interface NodeList
//@} DOM Interfaces
/**@name IXML API
* The IXML API contains utility functions that are not part of the standard
@@ -1712,7 +1710,7 @@ ixmlNodeList_free(IXML_NodeList *nList
* file or buffer, create an XML file from a DOM structure, and manipulate
* DOMString objects.
*/
/*! @{ */
//@{
/*================================================================
*
@@ -1740,7 +1738,7 @@ ixmlNodeList_free(IXML_NodeList *nList
* of the DOM tree or {\tt NULL} on an error.
*/
EXPORT_SPEC DOMString
DOMString
ixmlPrintDocument(IXML_Document *doc);
/** Renders a {\bf Node} and all sub-elements into an XML text
@@ -1758,7 +1756,7 @@ ixmlPrintDocument(IXML_Document *doc);
* of the DOM tree or {\tt NULL} on an error.
*/
EXPORT_SPEC DOMString
DOMString
ixmlPrintNode(IXML_Node *doc
/** The root of the {\bf Node} tree to render to XML text. */
);
@@ -1779,7 +1777,7 @@ ixmlPrintNode(IXML_Node *doc
* of the DOM tree or {\tt NULL} on an error.
*/
EXPORT_SPEC DOMString
DOMString
ixmlDocumenttoString(IXML_Document *doc);
/** Renders a {\bf Node} and all sub-elements into an XML text
@@ -1811,7 +1809,7 @@ ixmlNodetoString(IXML_Node *doc
* characters are replaced by the {\bf errorChar}, and invalid "&" entities
* are left untranslated. The parsing is then allowed to continue.
*/
EXPORT_SPEC void
void
ixmlRelaxParser(char errorChar);
@@ -1821,7 +1819,7 @@ ixmlRelaxParser(char errorChar);
* {\tt NULL} on an error.
*/
EXPORT_SPEC IXML_Document*
ixmlParseBuffer(const char *buffer
ixmlParseBuffer(char *buffer
/** The buffer that contains the XML text to convert to a
{\bf Document}. */
);
@@ -1844,7 +1842,7 @@ ixmlParseBuffer(const char *buffer
*/
EXPORT_SPEC int
ixmlParseBufferEx(const char *buffer,
ixmlParseBufferEx(char *buffer,
/** The buffer that contains the XML text to convert to a
{\bf Document}. */
IXML_Document** doc
@@ -1859,7 +1857,7 @@ ixmlParseBufferEx(const char *buffer,
*/
EXPORT_SPEC IXML_Document*
ixmlLoadDocument(const char* xmlFile
ixmlLoadDocument(char* xmlFile
/** The filename of the XML text to convert to a {\bf
Document}. */
);
@@ -1881,7 +1879,7 @@ ixmlLoadDocument(const char* xmlFile
*/
EXPORT_SPEC int
ixmlLoadDocumentEx(const char* xmlFile,
ixmlLoadDocumentEx(char* xmlFile,
/** The filename of the XML text to convert to a {\bf
Document}. */
IXML_Document** doc
@@ -1915,7 +1913,6 @@ ixmlFreeDOMString(DOMString buf
}
#endif
/*! @} */ /* IXML API */
#endif /* _IXML_H_ */
//@} IXML API
#endif // _IXML_H_

View File

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

View File

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

View File

@@ -39,7 +39,7 @@
#define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) )
#ifndef WIN32
#define UPNP_INLINE inline
#define XINLINE inline
#endif
#define MEMBUF_DEF_SIZE_INC 20

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,6 +7,6 @@ Name: libupnp
Description: Linux SDK for UPnP Devices
Version: @VERSION@
Libs: @PTHREAD_LIBS@ -L${libdir} -lupnp -lthreadutil -lixml
Cflags: @PTHREAD_CFLAGS@ -I${includedir}/upnp
Cflags: @PTHREAD_CFLAGS@ -I${includedir}

View File

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

View File

@@ -1,14 +0,0 @@
.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
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef FREE_LIST_H
#define FREE_LIST_H
@@ -36,6 +36,9 @@
extern "C" {
#endif
//#include <malloc.h>
#include "ithread.h"
#include <errno.h>
@@ -49,7 +52,7 @@ extern "C" {
*****************************************************************************/
typedef struct FREELISTNODE
{
struct FREELISTNODE *next;
struct FREELISTNODE*next; //pointer to next free node
} FreeListNode;
@@ -62,10 +65,12 @@ typedef struct FREELISTNODE
*****************************************************************************/
typedef struct FREELIST
{
FreeListNode *head;
size_t element_size;
int maxFreeListLength;
int freeListLength;
FreeListNode *head; //head of free list
size_t element_size; //size of elements in free
//list
int maxFreeListLength; //max size of free structures
//to keep
int freeListLength; //current size of free list
}FreeList;
@@ -136,5 +141,4 @@ int FreeListDestroy (FreeList *free_list);
}
#endif
#endif /* FREE_LIST_H */
#endif // FREE_LIST_H

View File

@@ -1,33 +1,33 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef LINKED_LIST_H
#define LINKED_LIST_H
@@ -70,9 +70,9 @@ typedef int (*cmp_routine)(void *itemA,void *itemB);
*****************************************************************************/
typedef struct LISTNODE
{
struct LISTNODE *prev;
struct LISTNODE *next;
void *item;
struct LISTNODE *prev; //previous node
struct LISTNODE *next; //next node
void *item; //item
} ListNode;
/****************************************************************************
@@ -96,12 +96,12 @@ typedef struct LISTNODE
*****************************************************************************/
typedef struct LINKEDLIST
{
ListNode head; /* head, first item is stored at: head->next */
ListNode tail; /* tail, last item is stored at: tail->prev */
long size; /* size of list */
FreeList freeNodeList; /* free list to use */
free_function free_func; /* free function to use */
cmp_routine cmp_func; /* compare function to use */
ListNode head; //head, first item is stored at: head->next
ListNode tail; //tail, last item is stored at: tail->prev
long size; //size of list
FreeList freeNodeList; //free list to use
free_function free_func; //free function to use
cmp_routine cmp_func; //compare function to use
} LinkedList;
/****************************************************************************
@@ -327,5 +327,4 @@ int ListSize(LinkedList* list);
}
#endif
#endif /* LINKED_LIST_H */
#endif //LINKED_LIST_H

View File

@@ -1,33 +1,33 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef THREADPOOL_H
#define THREADPOOL_H
@@ -36,17 +36,17 @@
extern "C" {
#endif
/* Size of job free list */
//Size of job free list
#define JOBFREELISTSIZE 100
#define INFINITE_THREADS -1
#define EMAXTHREADS (-8 & 1<<29)
/* Invalid Policy */
//Invalid Policy
#define INVALID_POLICY (-9 & 1<<29)
/* Invalid JOB Id */
//Invalid JOB Id
#define INVALID_JOB_ID (-2 & 1<<29)
typedef enum duration {SHORT_TERM,PERSISTENT} Duration;
@@ -55,20 +55,19 @@ typedef enum priority {LOW_PRIORITY,
MED_PRIORITY,
HIGH_PRIORITY} ThreadPriority;
#define DEFAULT_PRIORITY MED_PRIORITY /* default priority used by TPJobInit */
#define DEFAULT_MIN_THREADS 1 /* default minimum used by TPAttrInit */
#define DEFAULT_MAX_THREADS 10 /* default max used by TPAttrInit */
#define DEFAULT_JOBS_PER_THREAD 10 /* default jobs per thread used by TPAttrInit */
#define DEFAULT_STARVATION_TIME 500 /* default starvation time used by TPAttrInit */
#define DEFAULT_IDLE_TIME 10 * 1000 /* default idle time used by TPAttrInit */
#define DEFAULT_FREE_ROUTINE NULL /* default free routine used TPJobInit */
#define DEFAULT_MAX_JOBS_TOTAL 100 /* default max jobs used TPAttrInit */
#define DEFAULT_PRIORITY MED_PRIORITY //default priority used by TPJobInit
#define DEFAULT_MIN_THREADS 1 //default minimum used by TPAttrInit
#define DEFAULT_MAX_THREADS 10 //default max used by TPAttrInit
#define DEFAULT_JOBS_PER_THREAD 10 //default jobs per thread used by TPAttrInit
#define DEFAULT_STARVATION_TIME 500 //default starvation time used by TPAttrInit
#define DEFAULT_IDLE_TIME 10 * 1000 //default idle time used by TPAttrInit
#define DEFAULT_FREE_ROUTINE NULL //default free routine used TPJobInit
#define STATS 1 /* always include stats because code change is minimal */
#define STATS 1 //always include stats because code change is minimal
/* Statistics */
#ifdef WIN32 /* TODO: check why STATSONLY fails during compilation */
//Statistics
#ifdef WIN32 // todo: check why STATSONLY fails during compilation
#undef STATS
#endif
@@ -82,6 +81,15 @@ typedef enum priority {LOW_PRIORITY,
#define DEBUG 1
#endif
//DEBUGGING
#ifndef WIN32
#ifdef DEBUG
#define DBGONLY(x) x
#else
#define DBGONLY(x)
#endif
#endif
#include "LinkedList.h"
#include <sys/timeb.h>
#include "FreeList.h"
@@ -92,7 +100,7 @@ typedef enum priority {LOW_PRIORITY,
#define EXPORT
typedef int PolicyType;
#define DEFAULT_POLICY SCHED_OTHER
#define DEFAULT_SCHED_PARAM 0 /* default priority */
#define DEFAULT_SCHED_PARAM 0 //default priority
/****************************************************************************
* Name: free_routine
@@ -111,25 +119,23 @@ typedef void (*free_routine)(void *arg);
*****************************************************************************/
typedef struct THREADPOOLATTR
{
int minThreads; /* minThreads, ThreadPool will always maintain at least
this many threads */
int minThreads; //minThreads, ThreadPool will always maintain at least
//this many threads
int maxThreads; /* maxThreads, ThreadPool will never have more than this
number of threads */
int maxThreads; //maxThreads, ThreadPool will never have more than this
//number of threads
int maxIdleTime; /* maxIdleTime (in milliseconds)
this is the maximum time a thread will remain idle
before dying */
int maxIdleTime; //maxIdleTime (in milliseconds)
// this is the maximum time a thread will remain idle
// before dying
int jobsPerThread; /* jobs per thread to maintain */
int jobsPerThread; //jobs per thread to maintain
int maxJobsTotal; /* maximum number of jobs that can be queued totally. */
int starvationTime; //the time a low priority or med priority
//job waits before getting bumped
//up a priority (in milliseconds)
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 */
PolicyType schedPolicy; //scheduling policy to use
} ThreadPoolAttr;
@@ -141,12 +147,12 @@ typedef struct THREADPOOLATTR
*****************************************************************************/
typedef struct THREADPOOLJOB
{
start_routine func;
void *arg;
free_routine free_func;
struct timeb requestTime;
int priority;
int jobId;
start_routine func; //function
void *arg; //arg
free_routine free_func; //free function
struct timeb requestTime; //time of request
int priority; //priority of request
int jobId; //id
} ThreadPoolJob;
/****************************************************************************
@@ -156,32 +162,32 @@ typedef struct THREADPOOLJOB
* Structure to hold statistics
*****************************************************************************/
#ifdef STATS
STATSONLY(
typedef struct TPOOLSTATS
{
double totalTimeHQ;
int totalJobsHQ;
double avgWaitHQ;
double totalTimeMQ;
int totalJobsMQ;
double avgWaitMQ;
double totalTimeLQ;
int totalJobsLQ;
double avgWaitLQ;
double totalWorkTime;
double totalIdleTime;
int workerThreads;
int idleThreads;
int persistentThreads;
int totalThreads;
int maxThreads;
int currentJobsHQ;
int currentJobsLQ;
int currentJobsMQ;
double totalTimeHQ; //total time spent by all jobs in high priority Q
int totalJobsHQ; //total jobs in HQ run so far
double avgWaitHQ; //average wait in HQ
double totalTimeMQ; //total time spent by all jobs in med priority Q
int totalJobsMQ; //total jobs in MQ run so far
double avgWaitMQ; //average wait in MQ
double totalTimeLQ; //total time spent by all jobs in low priority Q
int totalJobsLQ; //total jobs in LQ run so far
double avgWaitLQ; //average wait in LQ
double totalWorkTime; //total time spent working for all threads
double totalIdleTime; //total time spent idle for all threads
int workerThreads; //number of current workerThreads
int idleThreads; //number of current idle threads
int persistentThreads; //number of persistent threads
int totalThreads; //total number of current threads
int maxThreads; //max threads so far
int currentJobsHQ; // current jobs in Q
int currentJobsLQ; //current jobs in Q
int currentJobsMQ; //current jobs in Q
}ThreadPoolStats;
#endif
)
/****************************************************************************
@@ -206,26 +212,24 @@ typedef struct TPOOLSTATS
typedef struct THREADPOOL
{
ithread_mutex_t mutex; /* mutex to protect job qs */
ithread_cond_t condition; /* condition variable to signal Q */
ithread_cond_t start_and_shutdown; /* condition variable for start
and stop */
int lastJobId; /* ids for jobs */
int shutdown; /* whether or not we are shutting down */
int totalThreads; /* total number of threads */
int persistentThreads; /* number of persistent threads */
FreeList jobFreeList; /* free list of jobs */
LinkedList lowJobQ; /* low priority job Q */
LinkedList medJobQ; /* med priority job Q */
LinkedList highJobQ; /* high priority job Q */
ThreadPoolJob *persistentJob; /* persistent job */
ithread_mutex_t mutex; //mutex to protect job qs
ithread_cond_t condition; //condition variable to signal Q
ithread_cond_t start_and_shutdown; //condition variable for start
//and stop
int lastJobId; //ids for jobs
int shutdown; //whether or not we are shutting down
int totalThreads; //total number of threads
int persistentThreads; //number of persistent threads
FreeList jobFreeList; //free list of jobs
LinkedList lowJobQ; //low priority job Q
LinkedList medJobQ; //med priority job Q
LinkedList highJobQ; //high priority job Q
ThreadPoolJob *persistentJob; //persistent job
ThreadPoolAttr attr; /* thread pool attributes */
ThreadPoolAttr attr; //thread pool attributes
#ifdef STATS
/* statistics */
ThreadPoolStats stats;
#endif
//statistics
STATSONLY(ThreadPoolStats stats;)
} ThreadPool;
@@ -517,19 +521,6 @@ int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime);
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
*
@@ -543,15 +534,12 @@ int TPAttrSetMaxJobsTotal(ThreadPoolAttr *attr, int maxJobsTotal);
* Returns:
* Always returns 0.
*****************************************************************************/
#ifdef STATS
EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);
STATSONLY( EXPORT int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats););
EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats);
#endif
STATSONLY(EXPORT void ThreadPoolPrintStats(ThreadPoolStats *stats););
#ifdef __cplusplus
}
#endif
#endif /* ThreadPool */
#endif //ThreadPool

View File

@@ -1,33 +1,33 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef TIMERTHREAD_H
#define TIMERTHREAD_H
@@ -43,9 +43,9 @@ extern "C" {
#define INVALID_EVENT_ID (-10 & 1<<29)
/* Timeout Types */
/* absolute means in seconds from Jan 1, 1970 */
/* relative means in seconds from current time */
//Timeout Types
//absolute means in seconds from Jan 1, 1970
//relative means in seconds from current time
typedef enum timeoutType {ABS_SEC,REL_SEC} TimeoutType;
@@ -63,13 +63,13 @@ typedef enum timeoutType {ABS_SEC,REL_SEC} TimeoutType;
*****************************************************************************/
typedef struct TIMERTHREAD
{
ithread_mutex_t mutex;
ithread_cond_t condition;
int lastEventId;
LinkedList eventQ;
int shutdown;
FreeList freeEvents;
ThreadPool *tp;
ithread_mutex_t mutex; //mutex to protect eventQ
ithread_cond_t condition; //condition variable
int lastEventId; //last event id
LinkedList eventQ; //event q
int shutdown; //whether or not we are shutdown
FreeList freeEvents; //FreeList for events
ThreadPool *tp; //ThreadPool to use
} TimerThread;
@@ -85,9 +85,9 @@ typedef struct TIMERTHREAD
typedef struct TIMEREVENT
{
ThreadPoolJob job;
time_t eventTime; /* absolute time for event in seconds since Jan 1, 1970 */
Duration persistent; /* long term or short term job */
int id;
time_t eventTime; //absolute time for event in seconds since Jan 1, 1970
Duration persistent; //long term or short term job
int id; //id of job
} TimerEvent;
@@ -188,5 +188,4 @@ int TimerThreadShutdown(TimerThread *timer);
}
#endif
#endif /* TIMER_THREAD_H */
#endif //TIMER_THREAD_H

View File

@@ -1,33 +1,33 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#include <stdarg.h>

View File

@@ -1,33 +1,33 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef ITHREADH
#define ITHREADH
@@ -36,28 +36,20 @@ extern "C" {
#endif
#ifdef DEBUG
#define DEBUG_ONLY(x) x
#else
#define DEBUG_ONLY(x)
#endif
#include <pthread.h>
#ifndef WIN32
#include <unistd.h>
#endif
#ifdef __FreeBSD__
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#endif
#ifdef PTHREAD_MUTEX_RECURSIVE
/* This system has SuS2-compliant mutex attributes.
* E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
*/
#define ITHREAD_MUTEX_FAST_NP PTHREAD_MUTEX_NORMAL
#define ITHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
#define ITHREAD_MUTEX_ERRORCHECK_NP PTHREAD_MUTEX_ERRORCHECK
#else
#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
#define ITHREAD_CANCELED PTHREAD_CANCELED
@@ -189,11 +181,8 @@ extern "C" {
* Returns EINVAL if the kind is not supported.
* See man page for pthread_mutexattr_setkind_np
*****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
#else
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
#endif
/****************************************************************************
* Function: ithread_mutexattr_getkind_np
@@ -214,11 +203,7 @@ extern "C" {
* Always returns 0.
* See man page for pthread_mutexattr_getkind_np
*****************************************************************************/
#ifdef PTHREAD_MUTEX_RECURSIVE
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
#else
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
#endif
/****************************************************************************
@@ -544,7 +529,7 @@ extern "C" {
#ifdef WIN32
#ifndef UPNP_STATIC_LIB
#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)
#else
#define EXPORT_SPEC __declspec(dllimport)
@@ -557,14 +542,11 @@ extern "C" {
#endif
#ifndef PTHREAD_MUTEX_RECURSIVE
/* NK: Added for satisfying the gcc compiler */
//NK: Added for satisfying the gcc compiler
EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
#endif
#ifdef __cplusplus
}
#endif
#endif /* ITHREADH */
#endif //ITHREADH

View File

@@ -34,7 +34,9 @@
#include <assert.h>
#include <stdlib.h>
#ifdef STATS
#include <stdio.h>
#endif
/****************************************************************************
* Function: CmpThreadPoolJob
@@ -90,10 +92,6 @@ FreeThreadPoolJob( ThreadPool * tp,
static int
SetPolicyType( PolicyType in )
{
#ifdef __CYGWIN__
/* TODO not currently working... */
return 0;
#else
#ifdef WIN32
return sched_setscheduler( 0, in);
#else
@@ -103,7 +101,6 @@ SetPolicyType( PolicyType in )
current.sched_priority = DEFAULT_SCHED_PARAM;
return sched_setscheduler( 0, in, &current );
#endif
#endif
}
/****************************************************************************
@@ -220,8 +217,10 @@ BumpPriority( ThreadPool * tp )
//starvation time
//bump priority (add to higher priority Q)
STATSONLY( tp->stats.totalJobsMQ++; )
STATSONLY( tp->stats.totalTimeMQ += diffTime; )
STATSONLY( tp->stats.totalJobsMQ++;
);
STATSONLY( tp->stats.totalTimeMQ += diffTime;
);
ListDelNode( &tp->medJobQ, tp->medJobQ.head.next, 0 );
ListAddTail( &tp->highJobQ, tempJob );
@@ -239,8 +238,10 @@ BumpPriority( ThreadPool * tp )
//starvation time
//bump priority (add to higher priority Q)
STATSONLY( tp->stats.totalJobsLQ++; )
STATSONLY( tp->stats.totalTimeLQ += diffTime; )
STATSONLY( tp->stats.totalJobsLQ++;
);
STATSONLY( tp->stats.totalTimeLQ += diffTime;
);
ListDelNode( &tp->lowJobQ, tp->lowJobQ.head.next, 0 );
ListAddTail( &tp->medJobQ, tempJob );
@@ -289,26 +290,14 @@ SetRelTimeout( struct timespec *time,
* ThreadPoolStats *stats must be valid non null stats structure
*****************************************************************************/
#ifdef 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;
stats->avgWaitMQ = 0;
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
stats->avgWaitLQ = 0;
stats->workerThreads = 0;
stats->idleThreads = 0;
stats->persistentThreads = 0;
stats->maxThreads = 0; stats->totalThreads = 0;
}
stats->maxThreads = 0; stats->totalThreads = 0;}
#endif
/****************************************************************************
@@ -383,7 +372,8 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
*****************************************************************************/
static void *WorkerThread( void *arg ) {
STATSONLY( time_t start = 0; )
STATSONLY( time_t start = 0;
)
ThreadPoolJob *job = NULL;
ListNode *head = NULL;
@@ -409,7 +399,8 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
SetSeed( );
STATSONLY( time( &start ); )
STATSONLY( time( &start );
);
while( 1 ) {
@@ -424,9 +415,12 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
retCode = 0;
STATSONLY( tp->stats.idleThreads++; )
STATSONLY( tp->stats.totalWorkTime += ( time( NULL ) - start ); ) //work time
STATSONLY( time( &start ); ) // idle time
STATSONLY( tp->stats.idleThreads++;
);
STATSONLY( tp->stats.totalWorkTime += ( time( NULL ) - start );
); //work time
STATSONLY( time( &start );
); //idle time
if( persistent == 1 ) {
//Persistent thread
@@ -434,7 +428,8 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
tp->persistentThreads--;
}
STATSONLY( if( persistent == 0 ) tp->stats.workerThreads--; )
STATSONLY( if( persistent == 0 )
tp->stats.workerThreads--; );
//Check for a job or shutdown
while( ( tp->lowJobQ.size == 0 )
@@ -455,7 +450,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
&& ( ( tp->totalThreads ) >
tp->attr.maxThreads ) ) ) {
STATSONLY( tp->stats.idleThreads--; )
STATSONLY( tp->stats.idleThreads-- );
tp->totalThreads--;
ithread_cond_broadcast( &tp->start_and_shutdown );
@@ -477,9 +472,12 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
}
STATSONLY( tp->stats.idleThreads--; )
STATSONLY( tp->stats.totalIdleTime += ( time( NULL ) - start ); ) // idle time
STATSONLY( time( &start ); ) // work time
STATSONLY( tp->stats.idleThreads--;
);
STATSONLY( tp->stats.totalIdleTime += ( time( NULL ) - start );
); //idle time
STATSONLY( time( &start );
); //work time
//bump priority of starved jobs
BumpPriority( tp );
@@ -511,33 +509,34 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
ithread_cond_broadcast( &tp->start_and_shutdown );
} else {
STATSONLY( tp->stats.workerThreads++; )
STATSONLY( tp->stats.workerThreads++ );
persistent = 0;
//Pick the highest priority job
if( tp->highJobQ.size > 0 ) {
head = ListHead( &tp->highJobQ );
job = ( ThreadPoolJob * ) head->item;
STATSONLY( CalcWaitTime( tp, HIGH_PRIORITY, job ); )
STATSONLY( CalcWaitTime
( tp, HIGH_PRIORITY, job ) );
ListDelNode( &tp->highJobQ, head, 0 );
} else if( tp->medJobQ.size > 0 ) {
head = ListHead( &tp->medJobQ );
job = ( ThreadPoolJob * ) head->item;
STATSONLY( CalcWaitTime( tp, MED_PRIORITY, job ); )
STATSONLY( CalcWaitTime( tp, MED_PRIORITY, job ) );
ListDelNode( &tp->medJobQ, head, 0 );
} else if( tp->lowJobQ.size > 0 ) {
head = ListHead( &tp->lowJobQ );
job = ( ThreadPoolJob * ) head->item;
STATSONLY( CalcWaitTime( tp, LOW_PRIORITY, job ); )
STATSONLY( CalcWaitTime( tp, LOW_PRIORITY, job ) );
ListDelNode( &tp->lowJobQ, head, 0 );
} else {
// Should never get here
assert( 0 );
STATSONLY( tp->stats.workerThreads--; )
STATSONLY( tp->stats.workerThreads-- );
tp->totalThreads--;
ithread_cond_broadcast( &tp->start_and_shutdown );
ithread_mutex_unlock( &tp->mutex );
@@ -642,11 +641,9 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
}
#ifdef STATS
if( tp->stats.maxThreads < tp->totalThreads ) {
tp->stats.maxThreads = tp->totalThreads;
}
#endif
STATSONLY( if( tp->stats.maxThreads < tp->totalThreads ) {
tp->stats.maxThreads = tp->totalThreads;}
)
return rc;
}
@@ -674,7 +671,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
threads = tp->totalThreads - tp->persistentThreads;
while( ( threads == 0 )
|| ( ( jobs / threads ) >= tp->attr.jobsPerThread ) ) {
|| ( ( jobs / threads ) > tp->attr.jobsPerThread ) ) {
if( CreateWorker( tp ) != 0 )
return;
@@ -766,7 +763,7 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
JOBFREELISTSIZE );
assert( retCode == 0 );
STATSONLY( StatsInit( &tp->stats ); )
STATSONLY( StatsInit( &tp->stats ) );
retCode += ListInit( &tp->highJobQ, CmpThreadPoolJob, NULL );
assert( retCode == 0 );
@@ -909,7 +906,6 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
int rc = EOUTOFMEM;
int tempId = -1;
int totalJobs;
ThreadPoolJob *temp = NULL;
@@ -926,13 +922,6 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
|| ( job->priority == MED_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 )
jobId = &tempId;
@@ -1278,7 +1267,6 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
attr->minThreads = DEFAULT_MIN_THREADS;
attr->schedPolicy = DEFAULT_POLICY;
attr->starvationTime = DEFAULT_STARVATION_TIME;
attr->maxJobsTotal = DEFAULT_MAX_JOBS_TOTAL;
return 0;
}
@@ -1530,29 +1518,6 @@ tp->stats.totalJobsLQ++; tp->stats.totalTimeLQ += diff; break; default:
stats->totalIdleTime );}
#endif
/****************************************************************************
* 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 ) {
assert( attr != NULL );
if( attr == NULL ) {
return EINVAL;
}
attr->maxJobsTotal = maxJobsTotal;
return 0;
}
/****************************************************************************
* Function: ThreadPoolGetStats
*

View File

@@ -1,14 +1,13 @@
# $Id: Makefile.am,v 1.10 2006/04/08 15:22:22 r3mi Exp $
#
# "Makefile.am" for "libupnp/upnp"
#
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
# Copyright (C) 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
#
SUBDIRS = doc . sample
SUBDIRS = doc
AM_CPPFLAGS = \
-I$(srcdir)/inc \
AM_CPPFLAGS = -I$(srcdir)/inc \
-I$(top_srcdir)/threadutil/inc \
-I$(top_srcdir)/ixml/inc
@@ -16,8 +15,7 @@ AM_CFLAGS = $(PTHREAD_CFLAGS)
AM_LDFLAGS = $(PTHREAD_LIBS)
LDADD = \
libupnp.la \
LDADD = libupnp.la \
$(top_builddir)/threadutil/libthreadutil.la \
$(top_builddir)/ixml/libixml.la
@@ -32,63 +30,40 @@ if ENABLE_DEBUG
upnpinclude_HEADERS += inc/upnpdebug.h
endif
lib_LTLIBRARIES = libupnp.la
libupnp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/src/inc
libupnp_la_LDFLAGS = \
-version-info $(LT_VERSION_UPNP) \
libupnp_la_LDFLAGS = -version-info $(LT_VERSION_UPNP) \
-export-symbols-regex '^Upnp.*' \
$(top_builddir)/threadutil/libthreadutil.la \
$(top_builddir)/ixml/libixml.la
libupnp_la_SOURCES = \
src/inc/config.h \
src/inc/client_table.h \
src/inc/gena.h \
src/inc/gena_ctrlpt.h \
src/inc/gena_device.h \
src/inc/global.h \
src/inc/gmtdate.h \
src/inc/http_client.h \
src/inc/httpparser.h \
src/inc/httpreadwrite.h \
src/inc/md5.h \
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/client_table.h src/inc/global.h \
src/inc/md5.h src/inc/ssdplib.h \
src/inc/unixutil.h src/inc/urlconfig.h \
src/inc/gmtdate.h src/inc/membuffer.h \
src/inc/server.h src/inc/statcodes.h \
src/inc/upnpapi.h src/inc/utilall.h \
src/inc/gena_ctrlpt.h src/inc/http_client.h \
src/inc/miniserver.h src/inc/service_table.h \
src/inc/statuscodes.h src/inc/upnpclosesocket.h \
src/inc/util.h src/inc/gena_device.h \
src/inc/httpparser.h src/inc/netall.h \
src/inc/soaplib.h src/inc/strintmap.h \
src/inc/upnp_timeout.h src/inc/uuid.h \
src/inc/gena.h src/inc/httpreadwrite.h \
src/inc/parsetools.h src/inc/sock.h \
src/inc/sysdep.h src/inc/uri.h \
src/inc/webserver.h
# ssdp
libupnp_la_SOURCES += \
src/ssdp/ssdp_device.c \
src/ssdp/ssdp_ctrlpt.c \
libupnp_la_SOURCES += src/ssdp/ssdp_device.c src/ssdp/ssdp_ctrlpt.c \
src/ssdp/ssdp_server.c
# soap
libupnp_la_SOURCES += \
src/soap/soap_device.c \
src/soap/soap_ctrlpt.c \
libupnp_la_SOURCES += src/soap/soap_device.c src/soap/soap_ctrlpt.c \
src/soap/soap_common.c
# genlib
@@ -109,9 +84,7 @@ libupnp_la_SOURCES += \
src/genlib/net/uri/uri.c
# gena
libupnp_la_SOURCES += \
src/gena/gena_device.c \
src/gena/gena_ctrlpt.c \
libupnp_la_SOURCES += src/gena/gena_device.c src/gena/gena_ctrlpt.c \
src/gena/gena_callback2.c
# api
@@ -123,32 +96,69 @@ if ENABLE_DEBUG
libupnp_la_SOURCES += src/api/upnpdebug.c
endif
# 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
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_PROGRAMS = test_init
TESTS = test_init
test_init_SOURCES = test/test_init.c
EXTRA_DIST = \
LICENSE \
EXTRA_DIST = LICENSE \
sample/tvdevice/web/tvcontrolSCPD.xml \
sample/tvdevice/web/tvdevicedesc.xml \
sample/tvdevice/web/tvdevicepres.html \
sample/tvdevice/web/tvpictureSCPD.xml \
src/inc/inet_pton.h \
src/inet_pton.c \
src/win_dll.c
CLEANFILES = \
IUpnpErrFile.txt \
IUpnpInfoFile.txt
CLEANFILES = IUpnpErrFile.txt IUpnpInfoFile.txt

View File

@@ -2,7 +2,7 @@
#
# "Makefile.am" for "libunp/upnp/doc"
#
# (C) Copyright 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
# (C) Copyright 2005 R<>mi Turboult <r3mi@users.sourceforge.net>
#
##########################################################################
#

Binary file not shown.

View File

@@ -1,50 +1,40 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef UPNP_H
#define UPNP_H
/** @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>
#ifdef __FreeBSD__
@@ -52,12 +42,14 @@
#endif
#include "ixml.h"
#include "upnpconfig.h"
#if UPNP_HAVE_DEBUG
# include "upnpdebug.h"
#endif
#ifdef WIN32
#ifndef UPNP_STATIC_LIB
#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)
#else
#define EXPORT_SPEC __declspec(dllimport)
@@ -65,41 +57,14 @@
#else
#define EXPORT_SPEC
#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
#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
/*
* Defining this macro here gives some interesting information about unused
* functions in the code. Of course, this should never go uncommented on a
* release.
*/
/*#define inline*/
#ifndef WIN32
#define UpnpCloseSocket close
#else
#define UpnpCloseSocket closesocket
#define fseeko fseek
#endif
#define UPNP_SOCKETERROR -1
#define UPNP_INVALID_SOCKET -1
@@ -107,7 +72,6 @@
#define SOCKET int
#endif
#ifndef WIN32
#include <netinet/in.h>
#else
@@ -115,10 +79,6 @@
#include <time.h>
#endif
#include <sys/types.h>
#define NUM_HANDLE 200
#define LINE_SIZE 180
#define NAME_SIZE 256
@@ -127,6 +87,7 @@
#define SERL_NUMR_SIZE 64
#define MODL_DESC_SIZE 64
#define UPNP_INFINITE -1
#define UPNP_USING_CHUNKED -3
#define UPNP_UNTIL_CLOSE -4
@@ -138,7 +99,7 @@
* code means. Refer to the documentation for each function for a
* description of what an error code means in that context.
*/
/*! @{ */
//@{
/** @name UPNP_E_SUCCESS [0]
* {\tt UPNP_E_SUCCESS} signifies that the operation completed successfully.
@@ -146,35 +107,35 @@
* the operation was successfully transmitted on the network. The result of
* the entire operation comes as part of the callback for that operation.
*/
/*! @{ */
//@{
#define UPNP_E_SUCCESS 0
/*! @} */
//@}
/** @name UPNP_E_INVALID_HANDLE [-100]
* {\tt UPNP_E_INVALID_HANDLE} signifies that the handle passed to a
* function is not a recognized as a valid handle.
*/
/*! @{ */
//@{
#define UPNP_E_INVALID_HANDLE -100
/*! @} */
//@}
/** @name UPNP_E_INVALID_PARAM [-101]
* {\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
* function for more information on the valid ranges of the parameters.
*/
/*! @{ */
//@{
#define UPNP_E_INVALID_PARAM -101
/*! @} */
//@}
/** @name UPNP_E_OUTOF_HANDLE [-102]
* {\tt UPNP_E_OUTOF_HANDLE} signifies that the SDK does not have any
* more space for additional handles. The SDK allocates space for only
* a few handles in order to conserve memory.
*/
/*! @{ */
//@{
#define UPNP_E_OUTOF_HANDLE -102
/*! @} */
//@}
#define UPNP_E_OUTOF_CONTEXT -103
@@ -183,9 +144,9 @@
* currently available to complete the operation. Most operations require
* some free memory in order to complete their work.
*/
/*! @{ */
//@{
#define UPNP_E_OUTOF_MEMORY -104
/*! @} */
//@}
/** @name UPNP_E_INIT [-105]
* {\tt UPNP_E_INIT} signifies that the SDK has already been
@@ -193,9 +154,9 @@
* Any additional initialization attempts simply return this error with
* no other ill effects.
*/
/*! @{ */
//@{
#define UPNP_E_INIT -105
/*! @} */
//@}
#define UPNP_E_BUFFER_TOO_SMALL -106
@@ -204,9 +165,9 @@
* to {\bf UpnpRegisterRootDevice} or {\bf UpnpRegisterRootDevice2} is an
* invalid description document.
*/
/*! @{ */
//@{
#define UPNP_E_INVALID_DESC -107
/*! @} */
//@}
/** @name UPNP_E_INVALID_URL [-108]
* {\tt UPNP_E_INVALID_URL} signifies that a URL passed into the function
@@ -214,9 +175,9 @@
* URL itself might be malformed (e.g. have invalid characters in it) or
* the host might be unreachable.
*/
/*! @{ */
//@{
#define UPNP_E_INVALID_URL -108
/*! @} */
//@}
#define UPNP_E_INVALID_SID -109
#define UPNP_E_INVALID_DEVICE -110
@@ -227,18 +188,18 @@
* {\bf UpnpAcceptSubscriptionExt} to signify that the device ID/service
* ID pair does not refer to a valid service.
*/
/*! @{ */
//@{
#define UPNP_E_INVALID_SERVICE -111
/*! @} */
//@}
/** @name UPNP_E_BAD_RESPONSE [-113]
* {\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
* to the GENA, SOAP, and HTTP protocols.
*/
/*! @{ */
//@{
#define UPNP_E_BAD_RESPONSE -113
/*! @} */
//@}
#define UPNP_E_BAD_REQUEST -114
@@ -247,26 +208,26 @@
* 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.
*/
/*! @{ */
//@{
#define UPNP_E_INVALID_ACTION -115
/*! @} */
//@}
/** @name UPNP_E_FINISH [-116]
* {\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
* operate until {\bf UpnpInit} successfully completes.
*/
/*! @{ */
//@{
#define UPNP_E_FINISH -116
/*! @} */
//@}
/** @name UPNP_E_INIT_FAILED [-117]
* {\tt UPNP_E_INIT_FAILED} signifies that {\bf UpnpInit} cannot complete.
* The typical reason is failure to allocate sufficient resources.
*/
/*! @{ */
//@{
#define UPNP_E_INIT_FAILED -117
/*! @} */
//@}
/** @name UPNP_E_URL_TOO_BIG [-118]
* {\tt UPNP_E_URL_TOO_BIG} signifies that the URL passed into a function
@@ -282,18 +243,18 @@
* message (e.g. {\bf UpnpSubscribe}), GENA event notifications (e.g. {\bf
* UpnpNotify}), and HTTP transfers (e.g. {\bf UpnpDownloadXmlDoc}).
*/
/*! @{ */
//@{
#define UPNP_E_BAD_HTTPMSG -119
/*! @} */
//@}
/** @name UPNP_E_ALREADY_REGISTERED [-120]
* {\tt UPNP_E_ALREADY_REGISTERED} signifies that a client or a device is
* already registered. The SDK currently has a limit of one registered
* client and one registered device per process.
*/
/*! @{ */
//@{
#define UPNP_E_ALREADY_REGISTERED -120
/*! @} */
//@}
/** @name UPNP_E_NETWORK_ERROR [-200]
* {\tt UPNP_E_NETWORK_ERROR} signifies that a network error occurred. It
@@ -302,9 +263,9 @@
* failed to read the local IP address or had problems configuring one of
* the sockets.
*/
/*! @{ */
//@{
#define UPNP_E_NETWORK_ERROR -200
/*! @} */
//@}
/** @name UPNP_E_SOCKET_WRITE [-201]
* {\tt UPNP_E_SOCKET_WRITE} signifies an error writing to a socket. This
@@ -313,9 +274,9 @@
* control (e.g. {\bf UpnpSendAction}), eventing (e.g. {\bf UpnpNotify}),
* and HTTP functions (e.g. {\bf UpnpDownloadXmlDoc}).
*/
/*! @{ */
//@{
#define UPNP_E_SOCKET_WRITE -201
/*! @} */
//@}
/** @name UPNP_E_SOCKET_READ [-202]
* {\tt UPNP_E_SOCKET_READ} signifies an error reading from a socket. This
@@ -324,9 +285,9 @@
* control (e.g. {\bf UpnpSendAction}), eventing (e.g. {\bf UpnpNotify}),
* and HTTP functions (e.g. {\bf UpnpDownloadXmlDoc}).
*/
/*! @{ */
//@{
#define UPNP_E_SOCKET_READ -202
/*! @} */
//@}
/** @name UPNP_E_SOCKET_BIND [-203]
* {\tt UPNP_E_SOCKET_BIND} signifies that the SDK had a problem binding
@@ -336,9 +297,9 @@
* (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.
* {\bf UpnpDownloadXmlDoc}).
*/
/*! @{ */
//@{
#define UPNP_E_SOCKET_BIND -203
/*! @} */
//@}
/** @name UPNP_E_SOCKET_CONNECT [-204]
* {\tt UPNP_E_SOCKET_CONNECT} signifies that the SDK had a problem
@@ -348,9 +309,9 @@
* (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.
* {\bf UpnpDownloadXmlDoc}).
*/
/*! @{ */
//@{
#define UPNP_E_SOCKET_CONNECT -204
/*! @} */
//@}
/** @name UPNP_E_OUTOF_SOCKET [-205]
* {\tt UPNP_E_OUTOF_SOCKET} signifies that the SDK cannot create any
@@ -360,36 +321,36 @@
* (e.g. {\bf UpnpNotify}), and HTTP functions (e.g.
* {\bf UpnpDownloadXmlDoc}).
*/
/*! @{ */
//@{
#define UPNP_E_OUTOF_SOCKET -205
/*! @} */
//@}
/** @name UPNP_E_LISTEN [-206]
* {\tt UPNP_E_LISTEN} signifies that the SDK had a problem setting the
* socket to listen for incoming connections. This error only happens during
* initialization (i.e. {\bf UpnpInit}).
*/
/*! @{ */
//@{
#define UPNP_E_LISTEN -206
/*! @} */
//@}
/** @name UPNP_E_TIMEDOUT [-207]
* {\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
* can be returned by any function that performs network operations.
*/
/*! @{ */
//@{
#define UPNP_E_TIMEDOUT -207
/*! @} */
//@}
/** @name UPNP_E_SOCKET_ERROR [-208]
* {\tt UPNP_E_SOCKET_ERROR} is the generic socket error code for
* conditions not covered by other error codes. This error can be returned
* by any function that performs network operations.
*/
/*! @{ */
//@{
#define UPNP_E_SOCKET_ERROR -208
/*! @} */
//@}
#define UPNP_E_FILE_WRITE_ERROR -209
@@ -398,9 +359,9 @@
* error can be returned by any function that allows for external
* cancelation.
*/
/*! @{ */
//@{
#define UPNP_E_CANCELED -210
/*! @} */
//@}
#define UPNP_E_EVENT_PROTOCOL -300
@@ -408,58 +369,58 @@
* {\tt UPNP_E_SUBSCRIBE_UNACCEPTED} signifies that a subscription
* request was rejected from the remote side.
*/
/*! @{ */
//@{
#define UPNP_E_SUBSCRIBE_UNACCEPTED -301
/*! @} */
//@}
/** @name UPNP_E_UNSUBSCRIBE_UNACCAPTED [-302]
* {\tt UPNP_E_UNSUBSCRIBE_UNACCEPTED} signifies that an unsubscribe
* request was rejected from the remote side.
*/
/*! @{ */
//@{
#define UPNP_E_UNSUBSCRIBE_UNACCEPTED -302
/*! @} */
//@}
/** @name UPNP_E_NOTIFY_UNACCEPTED [-303]
* {\tt UPNP_E_NOTIFY_UNACCEPTED} signifies that the remote host did not
* accept the notify sent from the local device.
*/
/*! @{ */
//@{
#define UPNP_E_NOTIFY_UNACCEPTED -303
/*! @} */
//@}
/** @name UPNP_E_INVALID_ARGUMENT [-501]
* {\tt UPNP_E_INVALID_ARGUMENT} signifies that one or more of the parameters
* passed to a function is invalid. Refer to the individual function
* descriptions for the acceptable ranges for parameters.
*/
/*! @{ */
//@{
#define UPNP_E_INVALID_ARGUMENT -501
/*! @} */
//@}
/** @name UPNP_E_FILE_NOT_FOUND [-502]
* {\tt UPNP_E_FILE_NOT_FOUND} signifies that the filename passed
* to one of the device registration functions was not found or was not
* accessible.
*/
/*! @{ */
//@{
#define UPNP_E_FILE_NOT_FOUND -502
/*! @} */
//@}
/** @name UPNP_E_FILE_READ_ERROR [-503]
* {\tt UPNP_E_FILE_READ_ERROR} signifies an error when reading a file.
*/
/*! @{ */
//@{
#define UPNP_E_FILE_READ_ERROR -503
/*! @} */
//@}
/** @name UPNP_E_EXT_NOT_XML [-504]
* {\tt UPNP_E_EXT_NOT_XML} signifies that the file name of the description
* document passed to {\bf UpnpRegisterRootDevice2} does not end in ".xml".
*/
/*! @{ */
//@{
#define UPNP_E_EXT_NOT_XML -504
/*! @} */
//@}
#define UPNP_E_NO_WEB_SERVER -505
#define UPNP_E_OUTOF_BOUNDS -506
@@ -468,26 +429,26 @@
* {\tt UPNP_E_NOT_FOUND} signifies that the response to a SOAP request
* did not contain the required XML constructs.
*/
/*! @{ */
//@{
#define UPNP_E_NOT_FOUND -507
/*! @} */
//@}
/** @name UPNP_E_INTERNAL_ERROR [-911]
* {\tt UPNP_E_INTERNAL_ERROR} is the generic error code for internal
* conditions not covered by other error codes.
*/
/*! @{ */
//@{
#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_ARGS 402
#define UPNP_SOAP_E_OUT_OF_SYNC 403
#define UPNP_SOAP_E_INVALID_VAR 404
#define UPNP_SOAP_E_ACTION_FAILED 501
/*! @} */
//@}
#ifndef OUT
#define OUT
@@ -501,12 +462,10 @@
#define INOUT
#endif
#include "upnpdebug.h"
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
* UpnpRegisterClient}. Client handles can only be used with
@@ -529,9 +488,9 @@ typedef int UpnpDevice_Handle;
enum Upnp_EventType_e {
/*
* Control callbacks
*/
//
// Control callbacks
//
/** Received by a device when a control point issues a control
* request. The {\bf Event} parameter contains a pointer to a {\bf
@@ -559,9 +518,9 @@ enum Upnp_EventType_e {
UPNP_CONTROL_GET_VAR_COMPLETE,
/*
* Discovery callbacks
*/
//
// Discovery callbacks
//
/** Received by a control point when a new device or service is available.
* The {\bf Event} parameter contains a pointer to a {\bf
@@ -590,9 +549,9 @@ enum Upnp_EventType_e {
UPNP_DISCOVERY_SEARCH_TIMEOUT,
/*
* Eventing callbacks
*/
//
// Eventing callbacks
//
/** Received by a device when a subscription arrives.
* The {\bf Event} parameter contains a pointer to a {\bf
@@ -823,10 +782,10 @@ struct Upnp_Event
};
/*
* This typedef is required by Doc++ to parse the last entry of the
* Upnp_Discovery structure correctly.
*/
//
// This typedef is required by Doc++ to parse the last entry of the
// Upnp_Discovery structure correctly.
//
typedef struct sockaddr_in SOCKADDRIN;
@@ -916,7 +875,7 @@ struct File_Info
/** 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
* a read call. */
off_t file_length;
int file_length;
/** The time at which the contents of the file was modified;
* The time system is always local (not GMT). */
@@ -1010,7 +969,7 @@ struct UpnpVirtualDirCallbacks
int (*seek) (
IN UpnpWebFileHandle fileHnd, /** The handle of the file to move the
file pointer. */
IN off_t offset, /** The number of bytes to move in the
IN long offset, /** The number of bytes to move in the
file. Positive values move foward and
negative values move backward. Note
that this must be positive if the
@@ -1071,14 +1030,14 @@ typedef int (*Upnp_FunPtr) (
IN void *Cookie
);
/*! @} */ /* Constants, Structures, and Types */
//@} // Constants, Structures, and Types
#ifdef __cplusplus
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
* 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}
@@ -1389,18 +1348,18 @@ EXPORT_SPEC int UpnpSetMaxContentLength(
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
* search target. The function returns immediately and the SDK
@@ -1459,18 +1418,18 @@ EXPORT_SPEC int UpnpSendAdvertisement(
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
* variable of a service on another device. This is a synchronous call.
@@ -1693,18 +1652,18 @@ EXPORT_SPEC int UpnpSendActionExAsync(
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
* out the current state of the eventable variables for a service.
@@ -2207,19 +2166,19 @@ EXPORT_SPEC int UpnpUnSubscribeAsync(
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.
* The SDK allocates the memory for {\bf outBuf} and the
@@ -2612,18 +2571,18 @@ EXPORT_SPEC int UpnpDownloadXmlDoc(
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
* the internal web server. This directory is considered the
@@ -2739,13 +2698,13 @@ EXPORT_SPEC void UpnpFree(
IN void *item /* The item to free. */
);
/*! @} */ /* Web Server API */
//@} // Web Server API
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif // __cplusplus
/*! @} */ /* The API */
//@} The API
#endif

View File

@@ -1,34 +1,34 @@
/* -*- C -*- */
/*******************************************************************************
*
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
// -*- C -*-
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef UPNP_CONFIG_H
#define UPNP_CONFIG_H
@@ -91,5 +91,6 @@
#undef UPNP_HAVE_TOOLS
#endif /* UPNP_CONFIG_H */
#endif // UPNP_CONFIG_H

View File

@@ -1,41 +1,43 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// Copyright (c) 2006 R<>mi Turboult <r3mi@users.sourceforge.net>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef UPNP_DEBUG_H
#define UPNP_DEBUG_H
#include "upnp.h"
#include "upnpconfig.h"
// Function declarations only if debug compiled into the library
#if UPNP_HAVE_DEBUG
#include <stdio.h>
#ifdef __cplusplus
@@ -47,7 +49,7 @@ extern "C" {
The UPnP SDK contains other features to aid in debugging.
*/
/*! @{ */
//@{
/** @name Upnp_LogLevel
* The user has the option to select 4 different types of debugging levels,
@@ -68,25 +70,18 @@ extern "C" {
* \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 {
UPNP_CRITICAL,
UPNP_PACKET,
UPNP_INFO,
UPNP_ALL
} Upnp_LogLevel;
/*! @} */
//@}
// for backward compatibility
#define Dbg_Level Upnp_LogLevel
/**
@@ -103,32 +98,26 @@ typedef enum Upnp_LogLevel_e {
*
* Description:
* This functions initializes the log files
*
* Returns: int
* -1 : If fails
* UPNP_E_SUCCESS : if success
***************************************************************************/
#ifdef DEBUG
int UpnpInitLog();
#else
static UPNP_INLINE int UpnpInitLog() { return UPNP_E_SUCCESS; }
#endif
// for backward compatibility
#define InitLog UpnpInitLog
/***************************************************************************
* Function : UpnpSetLogLevel
*
* Parameters: Upnp_LogLevel log_level
* Parameters: void
*
* Description:
* This functions set the log level (see {\tt Upnp_LogLevel}
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpSetLogLevel(Upnp_LogLevel log_level);
#else
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
#endif
void UpnpSetLogLevel (Upnp_LogLevel);
/***************************************************************************
@@ -140,11 +129,10 @@ static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
* This functions closes the log files
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpCloseLog();
#else
static UPNP_INLINE void UpnpCloseLog() {}
#endif
// for backward compatibility
#define CloseLog UpnpCloseLog
/***************************************************************************
@@ -161,22 +149,17 @@ static UPNP_INLINE void UpnpCloseLog() {}
* per the requested banner
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpSetLogFileNames(
const char *ErrFileName,
const char *InfoFileName);
#else
static UPNP_INLINE void UpnpSetLogFileNames(
const char *ErrFileName,
const char *InfoFileName) {}
#endif
void UpnpSetLogFileNames (const char* ErrFileName, const char* InfoFileName);
// for backward compatibility
#define SetLogFileNames UpnpSetLogFileNames
/***************************************************************************
* Function : UpnpGetDebugFile
*
* Parameters:
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
* IN Dbg_Level DLevel: The level of the debug logging. It will decide
* whether debug statement will go to standard output,
* or any of the log files.
* IN Dbg_Module Module: debug will go in the name of this module
@@ -188,47 +171,17 @@ static UPNP_INLINE void UpnpSetLogFileNames(
* NULL : if the module is turn off for debug
* else returns the right file descriptor
***************************************************************************/
#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
/***************************************************************************
* 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
// for backward compatibility
#define GetDebugFile UpnpGetDebugFile
/***************************************************************************
* Function : UpnpPrintf
*
* Parameters:
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
* IN Dbg_Level DLevel: The level of the debug logging. It will decide
* whether debug statement will go to standard output,
* or any of the log files.
* IN Dbg_Module Module: debug will go in the name of this module
@@ -245,7 +198,6 @@ static UPNP_INLINE int DebugAtThisLevel(
* debug statement is coming
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
const char* DbgFileName, int DbgLineNo,
const char* FmtStr,
@@ -254,15 +206,6 @@ void UpnpPrintf (Upnp_LogLevel DLevel, Dbg_Module Module,
__attribute__((format (__printf__, 5, 6)))
#endif
;
#else
static UPNP_INLINE void UpnpPrintf(
Upnp_LogLevel DLevel,
Dbg_Module Module,
const char* DbgFileName,
int DbgLineNo,
const char* FmtStr,
...) {}
#endif
/***************************************************************************
@@ -279,19 +222,8 @@ static UPNP_INLINE void UpnpPrintf(
* per the requested banner
* Returns: void
***************************************************************************/
#ifdef DEBUG
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
void UpnpDisplayBanner (FILE *fd,
const char** lines, size_t size, int starlength);
/***************************************************************************
@@ -308,23 +240,19 @@ static UPNP_INLINE void UpnpDisplayBanner(
* debug statement is coming to the log file
* Returns: void
***************************************************************************/
#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
void UpnpDisplayFileAndLine (FILE *fd, const char *DbgFileName, int DbgLineNo);
//@}
/*! @} */
#ifdef __cplusplus
}
#endif
#endif /* UPNP_DEBUG_H */
#endif // UPNP_HAVE_DEBUG
#endif // UPNP_DEBUG_H

View File

@@ -1,33 +1,33 @@
/*******************************************************************************
*
* Copyright (c) 2000-2003 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither name of Intel Corporation nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
/** @name Optional Tool APIs
* The Linux SDK for UPnP Devices contains some additional, optional
@@ -36,14 +36,14 @@
* size in the SDK. Refer to the README for details.
*/
/*! @{ */
//@{
#ifndef UPNP_TOOLS_H
#define UPNP_TOOLS_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
#ifdef __cplusplus
@@ -217,13 +217,14 @@ EXPORT_SPEC const char * UpnpGetErrorMessage(
int errorcode /** The SDK error code to convert. */
);
/*! @} */
//@}
#ifdef __cplusplus
}
#endif
#endif /* UPNP_HAVE_TOOLS */
#endif // UPNP_HAVE_TOOLS
#endif // UPNP_TOOLS_H
#endif /* UPNP_TOOLS_H */

View File

@@ -1,86 +0,0 @@
#
# "Makefile.am" for "libupnp/upnp/sample"
#
# Copyright (C) 2007 Marcelo Roberto Jimenez <mroberto@users.sourceforge.net>
#
AM_CPPFLAGS = \
-I$(top_srcdir)/upnp/inc \
-I$(top_srcdir)/threadutil/inc \
-I$(top_srcdir)/ixml/inc
AM_CFLAGS = $(PTHREAD_CFLAGS)
AM_LDFLAGS = $(PTHREAD_LIBS)
LDADD = \
$(top_builddir)/upnp/libupnp.la \
$(top_builddir)/threadutil/libthreadutil.la \
$(top_builddir)/ixml/libixml.la
# samples
noinst_PROGRAMS =
if ENABLE_SAMPLES
if ENABLE_CLIENT
noinst_PROGRAMS += upnp_tv_ctrlpt
upnp_tv_ctrlpt_CPPFLAGS = \
$(AM_CPPFLAGS) \
-I$(srcdir)/common/ \
-I$(srcdir)/tvctrlpt
if ENABLE_DEVICE
noinst_PROGRAMS += upnp_tv_combo
upnp_tv_combo_CPPFLAGS = $(AM_CPPFLAGS) \
-I$(srcdir)/common/ \
-I$(srcdir)/tvcombo
endif
endif
if ENABLE_DEVICE
noinst_PROGRAMS += upnp_tv_device
upnp_tv_device_CPPFLAGS = \
$(AM_CPPFLAGS) \
-I$(srcdir)/common/ \
-I$(srcdir)/tvdevice
endif
endif
upnp_tv_device_SOURCES = \
common/sample_util.c \
common/sample_util.h \
tvdevice/upnp_tv_device.c \
tvdevice/upnp_tv_device.h \
tvdevice/linux/upnp_tv_device_main.c
upnp_tv_ctrlpt_SOURCES = \
common/sample_util.c \
common/sample_util.h \
tvctrlpt/upnp_tv_ctrlpt.c \
tvctrlpt/upnp_tv_ctrlpt.h \
tvctrlpt/linux/upnp_tv_ctrlpt_main.c
upnp_tv_combo_SOURCES = \
common/sample_util.c \
common/sample_util.h \
tvcombo/upnp_tv_ctrlpt.c \
tvcombo/upnp_tv_ctrlpt.h \
tvcombo/upnp_tv_device.c \
tvcombo/upnp_tv_device.h \
tvcombo/linux/upnp_tv_combo_main.c
if WITH_DOCUMENTATION
examplesdir = $(docdir)/examples
examples_DATA = \
$(upnp_tv_ctrlpt_SOURCES) \
$(upnp_tv_device_SOURCES)
endif
EXTRA_DIST = \
tvdevice/web/tvcontrolSCPD.xml \
tvdevice/web/tvdevicedesc.xml \
tvdevice/web/tvdevicepres.html \
tvdevice/web/tvpictureSCPD.xml

View File

@@ -1,489 +0,0 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#include "sample_util.h"
#include "upnp_tv_ctrlpt.h"
#include "upnp_tv_device.h"
#include <stdio.h>
#include <string.h>
/*
Tags for valid commands issued at the command prompt
*/
enum cmdloop_tvcmds {
PRTHELP = 0, PRTFULLHELP, POWON, POWOFF,
SETCHAN, SETVOL, SETCOL, SETTINT, SETCONT, SETBRT,
CTRLACTION, PICTACTION, CTRLGETVAR, PICTGETVAR,
PRTDEV, LSTDEV, REFRESH, EXITCMD
};
/*
Data structure for parsing commands from the command line
*/
struct cmdloop_commands {
char *str; // the string
int cmdnum; // the command
int numargs; // the number of arguments
char *args; // the args
} cmdloop_commands;
/*
Mappings between command text names, command tag,
and required command arguments for command line
commands
*/
static struct cmdloop_commands cmdloop_cmdlist[] = {
{"Help", PRTHELP, 1, ""},
{"HelpFull", PRTFULLHELP, 1, ""},
{"ListDev", LSTDEV, 1, ""},
{"Refresh", REFRESH, 1, ""},
{"PrintDev", PRTDEV, 2, "<devnum>"},
{"PowerOn", POWON, 2, "<devnum>"},
{"PowerOff", POWOFF, 2, "<devnum>"},
{"SetChannel", SETCHAN, 3, "<devnum> <channel (int)>"},
{"SetVolume", SETVOL, 3, "<devnum> <volume (int)>"},
{"SetColor", SETCOL, 3, "<devnum> <color (int)>"},
{"SetTint", SETTINT, 3, "<devnum> <tint (int)>"},
{"SetContrast", SETCONT, 3, "<devnum> <contrast (int)>"},
{"SetBrightness", SETBRT, 3, "<devnum> <brightness (int)>"},
{"CtrlAction", CTRLACTION, 2, "<devnum> <action (string)>"},
{"PictAction", PICTACTION, 2, "<devnum> <action (string)>"},
{"CtrlGetVar", CTRLGETVAR, 2, "<devnum> <varname (string)>"},
{"PictGetVar", PICTGETVAR, 2, "<devnum> <varname (string)>"},
{"Exit", EXITCMD, 1, ""}
};
void
linux_print( const char *string )
{
puts( string );
}
/********************************************************************************
* TvCtrlPointPrintHelp
*
* Description:
* Print help info for this application.
********************************************************************************/
void
TvCtrlPointPrintShortHelp( void )
{
SampleUtil_Print( "Commands:" );
SampleUtil_Print( " Help" );
SampleUtil_Print( " HelpFull" );
SampleUtil_Print( " ListDev" );
SampleUtil_Print( " Refresh" );
SampleUtil_Print( " PrintDev <devnum>" );
SampleUtil_Print( " PowerOn <devnum>" );
SampleUtil_Print( " PowerOff <devnum>" );
SampleUtil_Print( " SetChannel <devnum> <channel>" );
SampleUtil_Print( " SetVolume <devnum> <volume>" );
SampleUtil_Print( " SetColor <devnum> <color>" );
SampleUtil_Print( " SetTint <devnum> <tint>" );
SampleUtil_Print( " SetContrast <devnum> <contrast>" );
SampleUtil_Print( " SetBrightness <devnum> <brightness>" );
SampleUtil_Print( " CtrlAction <devnum> <action>" );
SampleUtil_Print( " PictAction <devnum> <action>" );
SampleUtil_Print( " CtrlGetVar <devnum> <varname>" );
SampleUtil_Print( " PictGetVar <devnum> <action>" );
SampleUtil_Print( " Exit" );
}
void
TvCtrlPointPrintLongHelp( void )
{
SampleUtil_Print( "" );
SampleUtil_Print( "******************************" );
SampleUtil_Print( "* TV Control Point Help Info *" );
SampleUtil_Print( "******************************" );
SampleUtil_Print( "" );
SampleUtil_Print( "This sample control point application automatically searches" );
SampleUtil_Print( "for and subscribes to the services of television device emulator" );
SampleUtil_Print( "devices. While registers a tv device itself." );
SampleUtil_Print( "" );
SampleUtil_Print( "Commands:" );
SampleUtil_Print( " Help" );
SampleUtil_Print( " Print this help info." );
SampleUtil_Print( " ListDev" );
SampleUtil_Print( " Print the current list of TV Device Emulators that this" );
SampleUtil_Print( " control point is aware of. Each device is preceded by a" );
SampleUtil_Print( " device number which corresponds to the devnum argument of" );
SampleUtil_Print( " commands listed below." );
SampleUtil_Print( " Refresh" );
SampleUtil_Print( " Delete all of the devices from the device list and issue new" );
SampleUtil_Print( " search request to rebuild the list from scratch." );
SampleUtil_Print( " PrintDev <devnum>" );
SampleUtil_Print( " Print the state table for the device <devnum>." );
SampleUtil_Print( " e.g., 'PrintDev 1' prints the state table for the first" );
SampleUtil_Print( " device in the device list." );
SampleUtil_Print( " PowerOn <devnum>" );
SampleUtil_Print( " Sends the PowerOn action to the Control Service of" );
SampleUtil_Print( " device <devnum>." );
SampleUtil_Print( " PowerOff <devnum>" );
SampleUtil_Print( " Sends the PowerOff action to the Control Service of" );
SampleUtil_Print( " device <devnum>." );
SampleUtil_Print( " SetChannel <devnum> <channel>" );
SampleUtil_Print( " Sends the SetChannel action to the Control Service of" );
SampleUtil_Print( " device <devnum>, requesting the channel to be changed" );
SampleUtil_Print( " to <channel>." );
SampleUtil_Print( " SetVolume <devnum> <volume>" );
SampleUtil_Print( " Sends the SetVolume action to the Control Service of" );
SampleUtil_Print( " device <devnum>, requesting the volume to be changed" );
SampleUtil_Print( " to <volume>." );
SampleUtil_Print( " SetColor <devnum> <color>" );
SampleUtil_Print( " Sends the SetColor action to the Control Service of" );
SampleUtil_Print( " device <devnum>, requesting the color to be changed" );
SampleUtil_Print( " to <color>." );
SampleUtil_Print( " SetTint <devnum> <tint>" );
SampleUtil_Print( " Sends the SetTint action to the Control Service of" );
SampleUtil_Print( " device <devnum>, requesting the tint to be changed" );
SampleUtil_Print( " to <tint>." );
SampleUtil_Print( " SetContrast <devnum> <contrast>" );
SampleUtil_Print( " Sends the SetContrast action to the Control Service of" );
SampleUtil_Print( " device <devnum>, requesting the contrast to be changed" );
SampleUtil_Print( " to <contrast>." );
SampleUtil_Print( " SetBrightness <devnum> <brightness>" );
SampleUtil_Print( " Sends the SetBrightness action to the Control Service of" );
SampleUtil_Print( " device <devnum>, requesting the brightness to be changed" );
SampleUtil_Print( " to <brightness>." );
SampleUtil_Print( " CtrlAction <devnum> <action>" );
SampleUtil_Print( " Sends an action request specified by the string <action>" );
SampleUtil_Print( " to the Control Service of device <devnum>. This command" );
SampleUtil_Print( " only works for actions that have no arguments." );
SampleUtil_Print( " (e.g., \"CtrlAction 1 IncreaseChannel\")" );
SampleUtil_Print( " PictAction <devnum> <action>" );
SampleUtil_Print( " Sends an action request specified by the string <action>" );
SampleUtil_Print( " to the Picture Service of device <devnum>. This command" );
SampleUtil_Print( " only works for actions that have no arguments." );
SampleUtil_Print( " (e.g., \"PictAction 1 DecreaseContrast\")" );
SampleUtil_Print( " CtrlGetVar <devnum> <varname>" );
SampleUtil_Print( " Requests the value of a variable specified by the string <varname>" );
SampleUtil_Print( " from the Control Service of device <devnum>." );
SampleUtil_Print( " (e.g., \"CtrlGetVar 1 Volume\")" );
SampleUtil_Print( " PictGetVar <devnum> <action>" );
SampleUtil_Print( " Requests the value of a variable specified by the string <varname>" );
SampleUtil_Print( " from the Picture Service of device <devnum>." );
SampleUtil_Print( " (e.g., \"PictGetVar 1 Tint\")" );
SampleUtil_Print( " Exit" );
SampleUtil_Print( " Exits the control point application." );
}
/********************************************************************************
* TvCtrlPointPrintCommands
*
* Description:
* Print the list of valid command line commands to the user
*
* Parameters:
* None
*
********************************************************************************/
void
TvCtrlPointPrintCommands()
{
int i;
int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands );
SampleUtil_Print( "Valid Commands:" );
for( i = 0; i < numofcmds; i++ ) {
SampleUtil_Print( " %-14s %s", cmdloop_cmdlist[i].str,
cmdloop_cmdlist[i].args );
}
SampleUtil_Print( "" );
}
/********************************************************************************
* TvCtrlPointCommandLoop
*
* Description:
* Function that receives commands from the user at the command prompt
* during the lifetime of the control point, and calls the appropriate
* functions for those commands.
*
* Parameters:
* None
*
********************************************************************************/
void *
TvCtrlPointCommandLoop( void *args )
{
char cmdline[100];
while( 1 ) {
SampleUtil_Print( "\n>> " );
fgets( cmdline, 100, stdin );
TvCtrlPointProcessCommand( cmdline );
}
return NULL;
}
int
TvCtrlPointProcessCommand( char *cmdline )
{
char cmd[100];
char strarg[100];
int arg_val_err = -99999;
int arg1 = arg_val_err;
int arg2 = arg_val_err;
int cmdnum = -1;
int numofcmds = sizeof( cmdloop_cmdlist ) / sizeof( cmdloop_commands );
int cmdfound = 0;
int i,
rc;
int invalidargs = 0;
int validargs;
validargs = sscanf( cmdline, "%s %d %d", cmd, &arg1, &arg2 );
for( i = 0; i < numofcmds; i++ ) {
if( strcasecmp( cmd, cmdloop_cmdlist[i].str ) == 0 ) {
cmdnum = cmdloop_cmdlist[i].cmdnum;
cmdfound++;
if( validargs != cmdloop_cmdlist[i].numargs )
invalidargs++;
break;
}
}
if( !cmdfound ) {
SampleUtil_Print( "Command not found; try 'Help'" );
return TV_SUCCESS;
}
if( invalidargs ) {
SampleUtil_Print( "Invalid arguments; try 'Help'" );
return TV_SUCCESS;
}
switch ( cmdnum ) {
case PRTHELP:
TvCtrlPointPrintShortHelp();
break;
case PRTFULLHELP:
TvCtrlPointPrintLongHelp();
break;
case POWON:
TvCtrlPointSendPowerOn( arg1 );
break;
case POWOFF:
TvCtrlPointSendPowerOff( arg1 );
break;
case SETCHAN:
TvCtrlPointSendSetChannel( arg1, arg2 );
break;
case SETVOL:
TvCtrlPointSendSetVolume( arg1, arg2 );
break;
case SETCOL:
TvCtrlPointSendSetColor( arg1, arg2 );
break;
case SETTINT:
TvCtrlPointSendSetTint( arg1, arg2 );
break;
case SETCONT:
TvCtrlPointSendSetContrast( arg1, arg2 );
break;
case SETBRT:
TvCtrlPointSendSetBrightness( arg1, arg2 );
break;
case CTRLACTION:
/*
re-parse commandline since second arg is string
*/
validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg );
if( 3 == validargs )
TvCtrlPointSendAction( TV_SERVICE_CONTROL, arg1, strarg,
NULL, NULL, 0 );
else
invalidargs++;
break;
case PICTACTION:
/*
re-parse commandline since second arg is string
*/
validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg );
if( 3 == validargs )
TvCtrlPointSendAction( TV_SERVICE_PICTURE, arg1, strarg,
NULL, NULL, 0 );
else
invalidargs++;
break;
case CTRLGETVAR:
/*
re-parse commandline since second arg is string
*/
validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg );
if( 3 == validargs )
TvCtrlPointGetVar( TV_SERVICE_CONTROL, arg1, strarg );
else
invalidargs++;
break;
case PICTGETVAR:
/*
re-parse commandline since second arg is string
*/
validargs = sscanf( cmdline, "%s %d %s", cmd, &arg1, strarg );
if( 3 == validargs )
TvCtrlPointGetVar( TV_SERVICE_PICTURE, arg1, strarg );
else
invalidargs++;
break;
case PRTDEV:
TvCtrlPointPrintDevice( arg1 );
break;
case LSTDEV:
TvCtrlPointPrintList();
break;
case REFRESH:
TvCtrlPointRefresh();
break;
case EXITCMD:
rc = TvCtrlPointStop();
exit( rc );
break;
default:
SampleUtil_Print( "Command not implemented; see 'Help'" );
break;
}
if( invalidargs )
SampleUtil_Print( "Invalid args in command; see 'Help'" );
return TV_SUCCESS;
}
int
device_main( int argc, char **argv )
{
unsigned int portTemp = 0;
char *ip_address = NULL,
*desc_doc_name = NULL,
*web_dir_path = NULL;
unsigned int port = 0;
int i = 0;
SampleUtil_Initialize( linux_print );
// Parse options
for( i = 1; i < argc; i++ ) {
if( strcmp( argv[i], "-ip" ) == 0 ) {
ip_address = argv[++i];
} else if( strcmp( argv[i], "-port" ) == 0 ) {
sscanf( argv[++i], "%u", &portTemp );
} else if( strcmp( argv[i], "-desc" ) == 0 ) {
desc_doc_name = argv[++i];
} else if( strcmp( argv[i], "-webdir" ) == 0 ) {
web_dir_path = argv[++i];
} else if( strcmp( argv[i], "-help" ) == 0 ) {
SampleUtil_Print( "Usage: %s -ip ipaddress -port port"
" -desc desc_doc_name -webdir web_dir_path"
" -help (this message)\n", argv[0] );
SampleUtil_Print( "\tipaddress: IP address of the device"
" (must match desc. doc)\n" );
SampleUtil_Print( "\t\te.g.: 192.168.0.4\n" );
SampleUtil_Print( "\tport: Port number to use for "
"receiving UPnP messages (must match desc. doc)\n" );
SampleUtil_Print( "\t\te.g.: 5431\n" );
SampleUtil_Print
( "\tdesc_doc_name: name of device description document\n" );
SampleUtil_Print( "\t\te.g.: tvcombodesc.xml\n" );
SampleUtil_Print
( "\tweb_dir_path: Filesystem path where web files "
"related to the device are stored\n" );
SampleUtil_Print( "\t\te.g.: /upnp/sample/web\n" );
return 1;
}
}
port = ( unsigned short )portTemp;
return TvDeviceStart(
ip_address, port, desc_doc_name, web_dir_path, linux_print );
}
int
main( int argc, char **argv )
{
int rc;
ithread_t cmdloop_thread;
int sig;
sigset_t sigs_to_catch;
int code;
device_main(argc, argv);
rc = TvCtrlPointStart( linux_print, NULL );
if( rc != TV_SUCCESS ) {
SampleUtil_Print( "Error starting UPnP TV Control Point" );
return rc;
}
// start a command loop thread
code =
ithread_create( &cmdloop_thread, NULL, TvCtrlPointCommandLoop,
NULL );
/*
Catch Ctrl-C and properly shutdown
*/
sigemptyset( &sigs_to_catch );
sigaddset( &sigs_to_catch, SIGINT );
sigwait( &sigs_to_catch, &sig );
SampleUtil_Print( "Shutting down on signal %d...", sig );
TvDeviceStop();
rc = TvCtrlPointStop();
return rc;
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,158 +0,0 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef UPNP_TV_CTRLPT_H
#define UPNP_TV_CTRLPT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include "ithread.h"
#include <unistd.h>
#include <stdarg.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include "upnp.h"
#include "upnptools.h"
#include "sample_util.h"
#define TV_SERVICE_SERVCOUNT 2
#define TV_SERVICE_CONTROL 0
#define TV_SERVICE_PICTURE 1
#define TV_CONTROL_VARCOUNT 3
#define TV_CONTROL_POWER 0
#define TV_CONTROL_CHANNEL 1
#define TV_CONTROL_VOLUME 2
#define TV_PICTURE_VARCOUNT 4
#define TV_PICTURE_COLOR 0
#define TV_PICTURE_TINT 1
#define TV_PICTURE_CONTRAST 2
#define TV_PICTURE_BRIGHTNESS 3
#define TV_MAX_VAL_LEN 5
#define TV_SUCCESS 0
#define TV_ERROR (-1)
#define TV_WARNING 1
/* This should be the maximum VARCOUNT from above */
#define TV_MAXVARS TV_PICTURE_VARCOUNT
extern char TvDeviceType[];
extern char *TvServiceType[];
extern char *TvServiceName[];
extern char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS];
extern char TvVarCount[];
struct tv_service {
char ServiceId[NAME_SIZE];
char ServiceType[NAME_SIZE];
char *VariableStrVal[TV_MAXVARS];
char EventURL[NAME_SIZE];
char ControlURL[NAME_SIZE];
char SID[NAME_SIZE];
};
extern struct TvDeviceNode *GlobalDeviceList;
struct TvDevice {
char UDN[250];
char DescDocURL[250];
char FriendlyName[250];
char PresURL[250];
int AdvrTimeOut;
struct tv_service TvService[TV_SERVICE_SERVCOUNT];
};
struct TvDeviceNode {
struct TvDevice device;
struct TvDeviceNode *next;
};
extern ithread_mutex_t DeviceListMutex;
extern UpnpClient_Handle ctrlpt_handle;
void TvCtrlPointPrintHelp( void );
int TvCtrlPointDeleteNode(struct TvDeviceNode*);
int TvCtrlPointRemoveDevice(char*);
int TvCtrlPointRemoveAll( void );
int TvCtrlPointRefresh( void );
int TvCtrlPointSendAction(int, int, char *, char **, char **, int);
int TvCtrlPointSendActionNumericArg(int devnum, int service, char *actionName, char *paramName, int paramValue);
int TvCtrlPointSendPowerOn(int devnum);
int TvCtrlPointSendPowerOff(int devnum);
int TvCtrlPointSendSetChannel(int, int);
int TvCtrlPointSendSetVolume(int, int);
int TvCtrlPointSendSetColor(int, int);
int TvCtrlPointSendSetTint(int, int);
int TvCtrlPointSendSetContrast(int, int);
int TvCtrlPointSendSetBrightness(int, int);
int TvCtrlPointGetVar(int, int, char*);
int TvCtrlPointGetPower(int devnum);
int TvCtrlPointGetChannel(int);
int TvCtrlPointGetVolume(int);
int TvCtrlPointGetColor(int);
int TvCtrlPointGetTint(int);
int TvCtrlPointGetContrast(int);
int TvCtrlPointGetBrightness(int);
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
int TvCtrlPointPrintList( void );
int TvCtrlPointPrintDevice(int);
void TvCtrlPointAddDevice (IXML_Document *, char *, int);
void TvCtrlPointHandleGetVar(char *,char *,DOMString);
void TvStateUpdate(char*,int, IXML_Document * , char **);
void TvCtrlPointHandleEvent(Upnp_SID, int, IXML_Document *);
void TvCtrlPointHandleSubscribeUpdate(char *, Upnp_SID, int);
int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *);
void TvCtrlPointVerifyTimeouts(int);
void TvCtrlPointPrintCommands( void );
void* TvCtrlPointCommandLoop( void* );
int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr );
int TvCtrlPointStop( void );
int TvCtrlPointProcessCommand( char *cmdline );
#ifdef __cplusplus
};
#endif
#endif //UPNP_TV_CTRLPT_H

File diff suppressed because it is too large Load Diff

View File

@@ -1,638 +0,0 @@
///////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2003 Intel Corporation
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
// * Neither name of Intel Corporation nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
///////////////////////////////////////////////////////////////////////////
#ifndef UPNP_TV_DEVICE_H
#define UPNP_TV_DEVICE_H
#include <stdio.h>
#include <signal.h>
#ifdef __cplusplus
extern "C" {
#endif
#include "ithread.h"
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "upnp.h"
#include "sample_util.h"
//Color constants
#define MAX_COLOR 10
#define MIN_COLOR 1
//Brightness constants
#define MAX_BRIGHTNESS 10
#define MIN_BRIGHTNESS 1
//Power constants
#define POWER_ON 1
#define POWER_OFF 0
//Tint constants
#define MAX_TINT 10
#define MIN_TINT 1
//Volume constants
#define MAX_VOLUME 10
#define MIN_VOLUME 1
//Contrast constants
#define MAX_CONTRAST 10
#define MIN_CONTRAST 1
//Channel constants
#define MAX_CHANNEL 100
#define MIN_CHANNEL 1
//Number of services.
#define TV_SERVICE_SERVCOUNT 2
//Index of control service
#define TV_SERVICE_CONTROL 0
//Index of picture service
#define TV_SERVICE_PICTURE 1
//Number of control variables
#define TV_CONTROL_VARCOUNT 3
//Index of power variable
#define TV_CONTROL_POWER 0
//Index of channel variable
#define TV_CONTROL_CHANNEL 1
//Index of volume variable
#define TV_CONTROL_VOLUME 2
//Number of picture variables
#define TV_PICTURE_VARCOUNT 4
//Index of color variable
#define TV_PICTURE_COLOR 0
//Index of tint variable
#define TV_PICTURE_TINT 1
//Index of contrast variable
#define TV_PICTURE_CONTRAST 2
//Index of brightness variable
#define TV_PICTURE_BRIGHTNESS 3
//Max value length
#define TV_MAX_VAL_LEN 5
//Max actions
#define TV_MAXACTIONS 12
/* This should be the maximum VARCOUNT from above */
#define TV_MAXVARS TV_PICTURE_VARCOUNT
extern char TvDeviceType[];
extern char *TvServiceType[];
/******************************************************************************
* upnp_action
*
* Description:
* Prototype for all actions. For each action that a service
* implements, there is a corresponding function with this prototype.
* Pointers to these functions, along with action names, are stored
* in the service table. When an action request comes in the action
* name is matched, and the appropriate function is called.
* Each function returns UPNP_E_SUCCESS, on success, and a nonzero
* error code on failure.
*
* Parameters:
*
* IXML_Document * request - document of action request
* IXML_Document **out - action result
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
typedef int (*upnp_action) (IXML_Document *request, IXML_Document **out,
char **errorString);
/* Structure for storing Tv Service
identifiers and state table */
struct TvService {
char UDN[NAME_SIZE]; /* Universally Unique Device Name */
char ServiceId[NAME_SIZE];
char ServiceType[NAME_SIZE];
char *VariableName[TV_MAXVARS];
char *VariableStrVal[TV_MAXVARS];
char *ActionNames[TV_MAXACTIONS];
upnp_action actions[TV_MAXACTIONS];
unsigned int VariableCount;
};
//Array of service structures
extern struct TvService tv_service_table[];
//Device handle returned from sdk
extern UpnpDevice_Handle device_handle;
/* Mutex for protecting the global state table data
in a multi-threaded, asynchronous environment.
All functions should lock this mutex before reading
or writing the state table data. */
extern ithread_mutex_t TVDevMutex;
/******************************************************************************
* SetActionTable
*
* Description:
* Initializes the action table for the specified service.
* Note that
* knowledge of the service description is
* assumed. Action names are hardcoded.
* Parameters:
* int serviceType - one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE
* struct TvService *out - service containing action table to set.
*
*****************************************************************************/
int SetActionTable(int serviceType, struct TvService * out);
/******************************************************************************
* TvDeviceStateTableInit
*
* Description:
* Initialize the device state table for
* this TvDevice, pulling identifier info
* from the description Document. Note that
* knowledge of the service description is
* assumed. State table variables and default
* values are currently hardcoded in this file
* rather than being read from service description
* documents.
*
* Parameters:
* DescDocURL -- The description document URL
*
*****************************************************************************/
int TvDeviceStateTableInit(char*);
/******************************************************************************
* TvDeviceHandleSubscriptionRequest
*
* Description:
* Called during a subscription request callback. If the
* subscription request is for this device and either its
* control service or picture service, then accept it.
*
* Parameters:
* sr_event -- The subscription request event structure
*
*****************************************************************************/
int TvDeviceHandleSubscriptionRequest(struct Upnp_Subscription_Request *);
/******************************************************************************
* TvDeviceHandleGetVarRequest
*
* Description:
* Called during a get variable request callback. If the
* request is for this device and either its control service
* or picture service, then respond with the variable value.
*
* Parameters:
* cgv_event -- The control get variable request event structure
*
*****************************************************************************/
int TvDeviceHandleGetVarRequest(struct Upnp_State_Var_Request *);
/******************************************************************************
* TvDeviceHandleActionRequest
*
* Description:
* Called during an action request callback. If the
* request is for this device and either its control service
* or picture service, then perform the action and respond.
*
* Parameters:
* ca_event -- The control action request event structure
*
*****************************************************************************/
int TvDeviceHandleActionRequest(struct Upnp_Action_Request *);
/******************************************************************************
* TvDeviceCallbackEventHandler
*
* Description:
* The callback handler registered with the SDK while registering
* root device. Dispatches the request to the appropriate procedure
* based on the value of EventType. The four requests handled by the
* device are:
* 1) Event Subscription requests.
* 2) Get Variable requests.
* 3) Action requests.
*
* Parameters:
*
* EventType -- The type of callback event
* Event -- Data structure containing event data
* Cookie -- Optional data specified during callback registration
*
*****************************************************************************/
int TvDeviceCallbackEventHandler(Upnp_EventType, void*, void*);
/******************************************************************************
* TvDeviceSetServiceTableVar
*
* Description:
* Update the TvDevice service state table, and notify all subscribed
* control points of the updated state. Note that since this function
* blocks on the mutex TVDevMutex, to avoid a hang this function should
* not be called within any other function that currently has this mutex
* locked.
*
* Parameters:
* service -- The service number (TV_SERVICE_CONTROL or TV_SERVICE_PICTURE)
* variable -- The variable number (TV_CONTROL_POWER, TV_CONTROL_CHANNEL,
* TV_CONTROL_VOLUME, TV_PICTURE_COLOR, TV_PICTURE_TINT,
* TV_PICTURE_CONTRAST, or TV_PICTURE_BRIGHTNESS)
* value -- The string representation of the new value
*
*****************************************************************************/
int TvDeviceSetServiceTableVar(unsigned int, unsigned int, char*);
//Control Service Actions
/******************************************************************************
* TvDevicePowerOn
*
* Description:
* Turn the power on.
*
* Parameters:
*
* IXML_Document * in - document of action request
* IXML_Document **out - action result
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDevicePowerOn(IN IXML_Document * in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDevicePowerOff
*
* Description:
* Turn the power off.
*
* Parameters:
*
* IXML_Document * in - document of action request
* IXML_Document **out - action result
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDevicePowerOff(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceSetChannel
*
* Description:
* Change the channel, update the TvDevice control service
* state table, and notify all subscribed control points of the
* updated state.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceSetChannel(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceIncreaseChannel
*
* Description:
* Increase the channel.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceIncreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceDecreaseChannel
*
* Description:
* Decrease the channel.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceDecreaseChannel(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceSetVolume
*
* Description:
* Change the volume, update the TvDevice control service
* state table, and notify all subscribed control points of the
* updated state.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceSetVolume(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceIncreaseVolume
*
* Description:
* Increase the volume.
*
* Parameters:
*
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*****************************************************************************/
int TvDeviceIncreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
OUT char **errorString);
/******************************************************************************
* TvDeviceDecreaseVolume
*
* Description:
* Decrease the volume.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceDecreaseVolume(IN IXML_Document *in, OUT IXML_Document**out,
OUT char **errorString);
//Picture Service Actions
/******************************************************************************
* TvDeviceSetColor
*
* Description:
* Change the color, update the TvDevice picture service
* state table, and notify all subscribed control points of the
* updated state.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceSetColor(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceIncreaseColor
*
* Description:
* Increase the color.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*****************************************************************************/
int TvDeviceIncreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceDecreaseColor
*
* Description:
* Decrease the color.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*****************************************************************************/
int TvDeviceDecreaseColor(IN IXML_Document * in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceSetTint
*
* Description:
* Change the tint, update the TvDevice picture service
* state table, and notify all subscribed control points of the
* updated state.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceSetTint(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceIncreaseTint
*
* Description:
* Increase tint.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceIncreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceDecreaseTint
*
* Description:
* Decrease tint.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceDecreaseTint(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/*****************************************************************************
* TvDeviceSetContrast
*
* Description:
* Change the contrast, update the TvDevice picture service
* state table, and notify all subscribed control points of the
* updated state.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
****************************************************************************/
int TvDeviceSetContrast(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceIncreaseContrast
*
* Description:
*
* Increase the contrast.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceIncreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceDecreaseContrast
*
* Description:
* Decrease the contrast.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceDecreaseContrast(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceSetBrightness
*
* Description:
* Change the brightness, update the TvDevice picture service
* state table, and notify all subscribed control points of the
* updated state.
*
* Parameters:
* brightness -- The brightness value to change to.
*
*****************************************************************************/
int TvDeviceSetBrightness(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceIncreaseBrightness
*
* Description:
* Increase brightness.
*
* Parameters:
*
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceIncreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
/******************************************************************************
* TvDeviceDecreaseBrightness
*
* Description:
* Decrease brightnesss.
*
* Parameters:
* IXML_Document * in - action request document
* IXML_Document **out - action result document
* char **errorString - errorString (in case action was unsuccessful)
*
*****************************************************************************/
int TvDeviceDecreaseBrightness(IN IXML_Document *in, OUT IXML_Document **out,
OUT char **errorString);
int TvDeviceStart(char * ip_address, unsigned short port,char * desc_doc_name,
char *web_dir_path, print_string pfun);
int TvDeviceStop();
#ifdef __cplusplus
}
#endif
#endif

View File

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

View File

@@ -7,6 +7,7 @@
</specVersion>
<actionList>
<action>
@@ -37,12 +38,6 @@
<name>SetChannel</name>
<argumentList>
<argument>
<name>Channel</name>
<relatedStateVariable>Channel</relatedStateVariable>
<direction>in</direction>
</argument>
<argument>
<name>NewChannel</name>
<retval />
@@ -50,6 +45,11 @@
<direction>out</direction>
</argument>
<argument>
<name>Channel</name>
<relatedStateVariable>Channel</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action>
@@ -80,11 +80,6 @@
<action>
<name>SetVolume</name>
<argumentList>
<argument>
<name>Volume</name>
<relatedStateVariable>Volume</relatedStateVariable>
<direction>in</direction>
</argument>
<argument>
<name>NewVolume</name>
@@ -92,6 +87,11 @@
<relatedStateVariable>Volume</relatedStateVariable>
<direction>out</direction>
</argument>
<argument>
<name>Volume</name>
<relatedStateVariable>Volume</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action>
@@ -124,6 +124,9 @@
</actionList>
<serviceStateTable>
<stateVariable sendEvents="yes">

View File

@@ -12,12 +12,6 @@
<action>
<name>SetColor</name>
<argumentList>
<argument>
<name>Color</name>
<relatedStateVariable>Color</relatedStateVariable>
<direction>in</direction>
</argument>
<argument>
<name>NewColor</name>
<retval />
@@ -25,6 +19,11 @@
<direction>out</direction>
</argument>
<argument>
<name>Color</name>
<relatedStateVariable>Color</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action>
@@ -55,11 +54,6 @@
<action>
<name>SetTint</name>
<argumentList>
<argument>
<name>Tint</name>
<relatedStateVariable>Tint</relatedStateVariable>
<direction>in</direction>
</argument>
<argument>
<name>NewTint</name>
<retval />
@@ -67,6 +61,11 @@
<direction>out</direction>
</argument>
<argument>
<name>Tint</name>
<relatedStateVariable>Tint</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action>
@@ -97,17 +96,17 @@
<action>
<name>SetContrast</name>
<argumentList>
<argument>
<name>Contrast</name>
<relatedStateVariable>Contrast</relatedStateVariable>
<direction>in</direction>
</argument>
<argument>
<name>NewContrast</name>
<retval />
<relatedStateVariable>Contrast</relatedStateVariable>
<direction>out</direction>
</argument>
<argument>
<name>Contrast</name>
<relatedStateVariable>Contrast</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action>
@@ -138,17 +137,19 @@
<action>
<name>SetBrightness</name>
<argumentList>
<argument>
<name>Brightness</name>
<relatedStateVariable>Brightness</relatedStateVariable>
<direction>in</direction>
</argument>
<argument>
<name>NewBrightness</name>
<retval />
<relatedStateVariable>Brightness</relatedStateVariable>
<direction>out</direction>
</argument>
<argument>
<name>Brightness</name>
<relatedStateVariable>Brightness</relatedStateVariable>
<direction>in</direction>
</argument>
</argumentList>
</action>
@@ -181,6 +182,7 @@
</actionList>
<serviceStateTable>
<stateVariable sendEvents="yes">

View File

@@ -1,37 +0,0 @@
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:tvdevice:1</deviceType>
<friendlyName>UPnP Television Emulator</friendlyName>
<manufacturer>TV Manufacturer Name</manufacturer>
<manufacturerURL>http://www.manufacturer.com</manufacturerURL>
<modelDescription>UPnP Television Device Emulator 1.0</modelDescription>
<modelName>TVEmulator</modelName>
<modelNumber>1.0</modelNumber>
<modelURL>http://www.manufacturer.com/TVEmulator/</modelURL>
<serialNumber>123456789001</serialNumber>
<UDN>uuid:Upnp-TVEmulator-1_0-1234567890002</UDN>
<UPC>123456789</UPC>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:tvcontrol:1</serviceType>
<serviceId>urn:upnp-org:serviceId:tvcontrol1</serviceId>
<controlURL>/upnp/control/tvcontrol1</controlURL>
<eventSubURL>/upnp/event/tvcontrol1</eventSubURL>
<SCPDURL>/tvcontrolSCPD.xml</SCPDURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:tvpicture:1</serviceType>
<serviceId>urn:upnp-org:serviceId:tvpicture1</serviceId>
<controlURL>/upnp/control/tvpicture1</controlURL>
<eventSubURL>/upnp/event/tvpicture1</eventSubURL>
<SCPDURL>/tvpictureSCPD.xml</SCPDURL>
</service>
</serviceList>
<presentationURL>/tvdevicepres.html</presentationURL>
</device>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -94,7 +94,6 @@ UpnpSetLogFileNames ( IN const char *ErrFileName,
*
* Description:
* This functions initializes the log files
*
* Returns: int
* -1 : If fails
* UPNP_E_SUCCESS : if success
@@ -117,7 +116,7 @@ UpnpInitLog()
/***************************************************************************
* Function : UpnpSetLogLevel
*
* Parameters: Upnp_LogLevel log_level
* Parameters: void
*
* Description:
* This functions set the log level (see {\tt Upnp_LogLevel}
@@ -153,47 +152,11 @@ UpnpCloseLog()
}
/***************************************************************************
* Function : DebugAtThisLevel
*
* Parameters:
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
* whether debug statement will go to standard output,
* or any of the log files.
* IN Dbg_Module Module: debug will go in the name of this module
*
* Description:
* This functions returns true if debug output should be done in this
* module.
*
* Returns: int
***************************************************************************/
#ifdef DEBUG
int DebugAtThisLevel(
IN Upnp_LogLevel DLevel,
IN Dbg_Module Module)
{
int ret = g_log_level >= DLevel;
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
*
* Parameters:
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
* IN Dbg_Level DLevel: The level of the debug logging. It will decide
* whether debug statement will go to standard output,
* or any of the log files.
* IN Dbg_Module Module: debug will go in the name of this module
@@ -210,53 +173,71 @@ int DebugAtThisLevel(
* statement is coming
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpPrintf(
IN Upnp_LogLevel DLevel,
DBGONLY( void UpnpPrintf( IN Upnp_LogLevel DLevel,
IN Dbg_Module Module,
IN const char *DbgFileName,
IN int DbgLineNo,
IN const char *FmtStr,
... )
{
... ) {
va_list ArgList;
if (!DebugAtThisLevel(DLevel, Module)) {
return;
}
ithread_mutex_lock(&GlobalDebugMutex);
va_start( ArgList, FmtStr );
if (!DEBUG_TARGET) {
if( g_log_level < DLevel ) return; if( DEBUG_ALL == 0 ) {
switch ( Module ) {
case SSDP:
if( DEBUG_SSDP == 1 ) break;
else
return; case SOAP:
if( DEBUG_SOAP == 1 ) break;
else
return; case GENA:
if( DEBUG_GENA == 1 ) break;
else
return; case TPOOL:
if( DEBUG_TPOOL == 1 ) break;
else
return; case MSERV:
if( DEBUG_MSERV == 1 ) break;
else
return; case DOM:
if( DEBUG_DOM == 1 ) break;
else
return; case HTTP:
if( DEBUG_HTTP == 1 ) break;
else
return; case API:
if( DEBUG_API == 1 ) break;
else
return; default:
return;}
}
ithread_mutex_lock( &GlobalDebugMutex ); if( DEBUG_TARGET == 0 ) {
if( DbgFileName ) {
UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);
}
vfprintf(stdout, FmtStr, ArgList);
fflush(stdout);
} else if (DLevel == 0) {
UpnpDisplayFileAndLine( stdout, DbgFileName, DbgLineNo );}
vfprintf( stdout, FmtStr, ArgList ); fflush( stdout );}
else
{
if( DLevel == 0 ) {
if( DbgFileName ) {
UpnpDisplayFileAndLine(ErrFileHnd, DbgFileName, DbgLineNo);
}
vfprintf(ErrFileHnd, FmtStr, ArgList);
fflush(ErrFileHnd);
} else {
UpnpDisplayFileAndLine( ErrFileHnd, DbgFileName, DbgLineNo );}
vfprintf( ErrFileHnd, FmtStr, ArgList ); fflush( ErrFileHnd );}
else
{
if( DbgFileName ) {
UpnpDisplayFileAndLine(InfoFileHnd, DbgFileName, DbgLineNo);
UpnpDisplayFileAndLine( InfoFileHnd, DbgFileName, DbgLineNo );}
vfprintf( InfoFileHnd, FmtStr, ArgList ); fflush( InfoFileHnd );}
}
vfprintf(InfoFileHnd, FmtStr, ArgList);
fflush(InfoFileHnd);
}
va_end(ArgList);
ithread_mutex_unlock(&GlobalDebugMutex);
}
#endif
va_end( ArgList ); ithread_mutex_unlock( &GlobalDebugMutex );}
)
/***************************************************************************
* Function : UpnpGetDebugFile
*
* Parameters:
* IN Upnp_LogLevel DLevel: The level of the debug logging. It will decide
* IN Dbg_Level DLevel: The level of the debug logging. It will decide
* whether debug statement will go to standard output,
* or any of the log files.
* IN Dbg_Module Module: debug will go in the name of this module
@@ -268,26 +249,46 @@ void UpnpPrintf(
* NULL : if the module is turn off for debug
* else returns the right file descriptor
***************************************************************************/
#ifdef DEBUG
FILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module )
DBGONLY( FILE * GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module ) {
if( g_log_level < DLevel ) return NULL; if( DEBUG_ALL == 0 ) {
switch ( Module ) {
case SSDP:
if( DEBUG_SSDP == 1 ) break;
else
return NULL; case SOAP:
if( DEBUG_SOAP == 1 ) break;
else
return NULL; case GENA:
if( DEBUG_GENA == 1 ) break;
else
return NULL; case TPOOL:
if( DEBUG_TPOOL == 1 ) break;
else
return NULL; case MSERV:
if( DEBUG_MSERV == 1 ) break;
else
return NULL; case DOM:
if( DEBUG_DOM == 1 ) break;
else
return NULL; case API:
if( DEBUG_API == 1 ) break;
else
return NULL; default:
return NULL;}
}
if( DEBUG_TARGET == 0 ) {
return stdout;}
else
{
FILE *ret;
if (!DebugAtThisLevel(DLevel, Module)) {
ret = NULL;
if( DLevel == 0 ) {
return ErrFileHnd;}
else
{
return InfoFileHnd;}
}
if (!DEBUG_TARGET) {
ret = stdout;
} else if (DLevel == 0) {
ret = ErrFileHnd;
} else {
ret = InfoFileHnd;
}
return ret;
}
#endif
)
/***************************************************************************
@@ -304,26 +305,17 @@ FILE *GetDebugFile( Upnp_LogLevel DLevel, Dbg_Module Module )
* debug statement is coming to the log file
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpDisplayFileAndLine(
IN FILE * fd,
DBGONLY( void UpnpDisplayFileAndLine( IN FILE * fd,
IN const char *DbgFileName,
IN int DbgLineNo)
{
IN int DbgLineNo ) {
int starlength = 66;
const char *lines[2];
char FileAndLine[500];
lines[0] = "DEBUG";
if (DbgFileName) {
sprintf(FileAndLine,
"FILE: %s, LINE: %d",
DbgFileName, DbgLineNo);
lines[1] = FileAndLine;
}
UpnpDisplayBanner(fd, lines, 2, starlength);
fflush(fd);
}
#endif
char FileAndLine[500]; lines[0] = "DEBUG"; if( DbgFileName ) {
sprintf( FileAndLine, "FILE: %s, LINE: %d", DbgFileName,
DbgLineNo ); lines[1] = FileAndLine;}
UpnpDisplayBanner( fd, lines, 2, starlength ); fflush( fd );}
)
/***************************************************************************
@@ -340,58 +332,47 @@ void UpnpDisplayFileAndLine(
* per the requested banner
* Returns: void
***************************************************************************/
#ifdef DEBUG
void UpnpDisplayBanner(
IN FILE * fd,
DBGONLY( void UpnpDisplayBanner( IN FILE * fd,
IN const char **lines,
IN size_t size,
IN int starLength)
{
IN int starLength ) {
char *stars = ( char * )malloc( starLength + 1 );
const char *line = NULL;
int leftMarginLength = starLength / 2 + 1;
int rightMarginLength = starLength / 2 + 1;
int i = 0;
int LineSize = 0;
int starLengthMinus2 = starLength - 2;
char *leftMargin = ( char * )malloc( leftMarginLength );
char *rightMargin = ( char * )malloc( rightMarginLength );
char *stars = ( char * )malloc( starLength + 1 );
int i = 0;
int LineSize = 0;
char *currentLine = ( char * )malloc( starLength + 1 );
const char *line = NULL;
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++ ) {
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;
line = lines[i]; while( LineSize > ( starLength - 2 ) ) {
memcpy( currentLine, line, ( starLength - 2 ) );
currentLine[( starLength - 2 )] = 0;
fprintf( fd, "*%s*\n", currentLine );
LineSize -= starLengthMinus2;
line += starLengthMinus2;
}
leftMarginLength = (starLengthMinus2 - LineSize)/2;
LineSize -= ( starLength - 2 ); line += ( starLength - 2 );}
if( LineSize % 2 == 0 ) {
rightMarginLength = leftMarginLength;
} else {
rightMarginLength = leftMarginLength + 1;
}
leftMarginLength = rightMarginLength =
( ( starLength - 2 ) - LineSize ) / 2;}
else
{
leftMarginLength = ( ( starLength - 2 ) - LineSize ) / 2;
rightMarginLength =
( ( starLength - 2 ) - LineSize ) / 2 + 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%s%s*\n", leftMargin, line, rightMargin );}
fprintf( fd, "%s\n\n", stars );
free( currentLine );
free( stars );
free( rightMargin );
free( leftMargin );
}
#endif
free( rightMargin ); free( stars ); free( currentLine );}
)

View File

@@ -196,11 +196,10 @@ addToAction( IN int response,
if( response ) {
sprintf( ActBuff,
"<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
"<u:%sResponse xmlns:u=\"%s\"></u:%sResponse>",
ActionName, ServType, ActionName );
} else {
sprintf( ActBuff,
"<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
sprintf( ActBuff, "<u:%s xmlns:u=\"%s\"></u:%s>",
ActionName, ServType, ActionName );
}
@@ -256,8 +255,8 @@ makeAction( IN int response,
IN const char *Arg,
IN va_list ArgList )
{
const char *ArgName;
const char *ArgValue;
const char *ArgName,
*ArgValue;
char *ActBuff;
int Idx = 0;
IXML_Document *ActionDoc;
@@ -275,12 +274,10 @@ makeAction( IN int response,
}
if( response ) {
sprintf( ActBuff,
"<u:%sResponse xmlns:u=\"%s\">\r\n</u:%sResponse>",
sprintf( ActBuff, "<u:%sResponse xmlns:u=\"%s\"></u:%sResponse>",
ActionName, ServType, ActionName );
} else {
sprintf( ActBuff,
"<u:%s xmlns:u=\"%s\">\r\n</u:%s>",
sprintf( ActBuff, "<u:%s xmlns:u=\"%s\"></u:%s>",
ActionName, ServType, ActionName );
}
@@ -298,7 +295,7 @@ makeAction( IN int response,
if( NumArg > 0 ) {
//va_start(ArgList, Arg);
ArgName = Arg;
for ( ; ; ) {
while( Idx++ != NumArg ) {
ArgValue = va_arg( ArgList, const char * );
if( ArgName != NULL ) {
@@ -313,11 +310,7 @@ makeAction( IN int response,
ixmlNode_appendChild( node, ( IXML_Node * ) Ele );
}
if (++Idx < NumArg) {
ArgName = va_arg( ArgList, const char * );
} else {
break;
}
}
//va_end(ArgList);
}

View File

@@ -93,29 +93,32 @@ genaCallback( IN http_parser_t * parser,
xboolean found_function = FALSE;
if( request->method == HTTPMETHOD_SUBSCRIBE ) {
#ifdef INCLUDE_DEVICE_APIS
found_function = TRUE;
if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) {
DEVICEONLY( found_function = TRUE;
if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL )
{
// renew subscription
gena_process_subscription_renewal_request
( info, request );
} else {
( info, request );}
else
{
// subscribe
gena_process_subscription_request( info, request );
gena_process_subscription_request( info, request );}
DBGONLY( UpnpPrintf
( UPNP_ALL, GENA, __FILE__, __LINE__,
"got subscription request\n" ); )
)
}
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
"got subscription request\n" );
} else if( request->method == HTTPMETHOD_UNSUBSCRIBE ) {
found_function = TRUE;
else
if( request->method == HTTPMETHOD_UNSUBSCRIBE ) {
DEVICEONLY( found_function = TRUE;
// unsubscribe
gena_process_unsubscribe_request( info, request );
#endif
gena_process_unsubscribe_request( info,
request ); )
} else if( request->method == HTTPMETHOD_NOTIFY ) {
#ifdef INCLUDE_CLIENT_APIS
found_function = TRUE;
CLIENTONLY( found_function = TRUE;
// notify
gena_process_notification_event( info, request );
#endif
gena_process_notification_event( info, request ); )
}
if( !found_function ) {
@@ -124,4 +127,3 @@ genaCallback( IN http_parser_t * parser,
}
}
#endif // EXCLUDE_GENA

View File

@@ -72,14 +72,14 @@ GenaAutoRenewSubscription( IN void *input )
int eventType = 0;
if( AUTO_RENEW_TIME == 0 ) {
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUB EXPIRED" );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUB EXPIRED" ) );
sub_struct->ErrCode = UPNP_E_SUCCESS;
send_callback = 1;
eventType = UPNP_EVENT_SUBSCRIPTION_EXPIRED;
} else {
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA AUTO RENEW" );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA AUTO RENEW" ) );
if( ( ( sub_struct->ErrCode = genaRenewSubscription( event->handle,
sub_struct->
Sid,
@@ -99,8 +99,8 @@ GenaAutoRenewSubscription( IN void *input )
free_upnp_timeout( event );
return;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"HANDLE IS VALID" );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"HANDLE IS VALID" ) );
callback_fun = handle_info->Callback;
cookie = handle_info->Cookie;
HandleUnlock( );
@@ -219,9 +219,8 @@ gena_unsubscribe( IN char *url,
// make request msg
membuffer_init( &request );
request.size_inc = 30;
return_code = http_MakeMessage(
&request, 1, 1,
"q" "ssc" "Uc",
return_code = http_MakeMessage( &request, 1, 1,
"q" "ssc" "U" "c",
HTTPMETHOD_UNSUBSCRIBE, &dest_url,
"SID: ", sid );
@@ -306,20 +305,19 @@ gena_subscribe( IN char *url,
request.size_inc = 30;
if( renewal_sid ) {
// renew subscription
return_code = http_MakeMessage(
&request, 1, 1,
"q" "ssc" "sscc",
return_code = http_MakeMessage( &request, 1, 1,
"q" "ssc" "ssc" "c",
HTTPMETHOD_SUBSCRIBE, &dest_url,
"SID: ", renewal_sid,
"TIMEOUT: Second-", timeout_str );
} else {
// subscribe
return_code = http_MakeMessage(
&request, 1, 1,
"q" "sssdsc" "sc" "sscc",
return_code = http_MakeMessage( &request, 1, 1,
"q" "sssdsscc",
HTTPMETHOD_SUBSCRIBE, &dest_url,
"CALLBACK: <http://", LOCAL_HOST, ":", LOCAL_PORT, "/>",
"NT: upnp:event",
"CALLBACK: <http://", LOCAL_HOST,
":", LOCAL_PORT,
"/>\r\n" "NT: upnp:event\r\n"
"TIMEOUT: Second-", timeout_str );
}
if( return_code != 0 ) {
@@ -449,7 +447,6 @@ genaUnregisterClient( IN UpnpClient_Handle client_handle )
* return UPNP_E_SUCCESS if service response is OK else
* returns appropriate error
***************************************************************************/
#ifdef INCLUDE_CLIENT_APIS
int
genaUnSubscribe( IN UpnpClient_Handle client_handle,
IN const Upnp_SID in_sid )
@@ -502,7 +499,6 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
return return_code;
}
#endif
/************************************************************************
* Function : genaSubscribe
@@ -526,7 +522,6 @@ genaUnSubscribe( IN UpnpClient_Handle client_handle,
* return UPNP_E_SUCCESS if service response is OK else
* returns appropriate error
***************************************************************************/
#ifdef INCLUDE_CLIENT_APIS
int
genaSubscribe( IN UpnpClient_Handle client_handle,
IN char *PublisherURL,
@@ -541,8 +536,8 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
struct Handle_Info *handle_info;
char *EventURL = NULL;
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUBSCRIBE BEGIN" );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA SUBSCRIBE BEGIN" ) );
HandleLock( );
memset( out_sid, 0, sizeof( Upnp_SID ) );
@@ -560,9 +555,9 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
gena_subscribe( PublisherURL, TimeOut, NULL, &ActualSID );
HandleLock( );
if( return_code != UPNP_E_SUCCESS ) {
UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
"SUBSCRIBE FAILED in transfer error code: %d returned\n",
return_code );
return_code ) );
goto error_handler;
}
@@ -612,7 +607,6 @@ genaSubscribe( IN UpnpClient_Handle client_handle,
SubscribeUnlock( );
return return_code;
}
#endif
/************************************************************************
* Function : genaRenewSubscription
@@ -667,8 +661,8 @@ genaRenewSubscription( IN UpnpClient_Handle client_handle,
free_upnp_timeout( ( upnp_timeout * ) tempJob.arg );
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"REMOVED AUTO RENEW EVENT" );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"REMOVED AUTO RENEW EVENT" ) );
sub->RenewEventId = -1;
return_code = copy_client_subscription( sub, &sub_copy );

View File

@@ -65,9 +65,9 @@ genaUnregisterDevice( IN UpnpDevice_Handle device_handle )
HandleLock( );
if( GetHandleInfo( device_handle, &handle_info ) != HND_DEVICE ) {
UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_CRITICAL, GENA, __FILE__, __LINE__,
"genaUnregisterDevice : BAD Handle : %d\n",
device_handle );
device_handle ) );
HandleUnlock( );
return GENA_E_BAD_HANDLE;
@@ -188,7 +188,7 @@ free_notify_struct( IN notify_thread_struct * input )
*
* Note : called by genaNotify
****************************************************************************/
static UPNP_INLINE int
static XINLINE int
notify_send_and_recv( IN uri_type * destination_url,
IN membuffer * mid_msg,
IN char *propertySet,
@@ -203,10 +203,10 @@ notify_send_and_recv( IN uri_type * destination_url,
SOCKINFO info;
// connect
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
"gena notify to: %.*s\n",
(int)destination_url->hostport.text.size,
destination_url->hostport.text.buff );
destination_url->hostport.text.size,
destination_url->hostport.text.buff ); )
conn_fd = http_Connect( destination_url, &url );
if( conn_fd < 0 ) {
@@ -219,11 +219,9 @@ notify_send_and_recv( IN uri_type * destination_url,
}
// make start line and HOST header
membuffer_init( &start_msg );
if (http_MakeMessage(
&start_msg, 1, 1,
if( http_MakeMessage( &start_msg, 1, 1,
"q" "s",
HTTPMETHOD_NOTIFY, &url,
mid_msg->buf ) != 0 ) {
HTTPMETHOD_NOTIFY, &url, mid_msg->buf ) != 0 ) {
membuffer_destroy( &start_msg );
sock_destroy( &info, SD_BOTH );
return UPNP_E_OUTOF_MEMORY;
@@ -298,8 +296,7 @@ genaNotify( IN char *headers,
// make 'end' msg (the part that won't vary with the destination)
endmsg.size_inc = 30;
if( http_MakeMessage(
&mid_msg, 1, 1,
if( http_MakeMessage( &mid_msg, 1, 1,
"s" "ssc" "sdcc",
headers,
"SID: ", sub->sid,
@@ -477,8 +474,8 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
notify_thread_struct *thread_struct = NULL;
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY " );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY " ) );
reference_count = ( int * )malloc( sizeof( int ) );
@@ -523,9 +520,9 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
return GENA_E_BAD_SERVICE;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SERVICE IN INIT NOTFY: UDN %s, ServID: %s ",
UDN, servId );
UDN, servId ) );
if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ||
( sub->active ) ) {
@@ -536,8 +533,9 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
return GENA_E_BAD_SID;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ", sid );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY: SID %s ",
sid ) );
sub->active = 1;
@@ -552,9 +550,9 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
return return_code;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENERATED PROPERY SET IN INIT NOTIFY: \n'%s'\n",
propertySet );
propertySet ) );
headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) +
strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH +
@@ -573,7 +571,7 @@ genaInitNotify( IN UpnpDevice_Handle device_handle,
}
sprintf( headers, "CONTENT-TYPE: text/xml\r\nCONTENT-LENGTH: "
"%"PRIzu"\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
"%d\r\nNT: upnp:event\r\nNTS: upnp:propchange\r\n",
strlen( propertySet ) + 1 );
//schedule thread for initial notification
@@ -667,8 +665,8 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
notify_thread_struct *thread_struct = NULL;
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY EXT" );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENA BEGIN INITIAL NOTIFY EXT" ) );
reference_count = ( int * )malloc( sizeof( int ) );
if( reference_count == NULL ) {
@@ -711,9 +709,9 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
HandleUnlock( );
return GENA_E_BAD_SERVICE;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SERVICE IN INIT NOTFY EXT: UDN %s, ServID: %s\n",
UDN, servId );
UDN, servId ) );
if( ( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ||
( sub->active ) ) {
@@ -723,8 +721,9 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
HandleUnlock( );
return GENA_E_BAD_SID;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s", sid );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"FOUND SUBSCRIPTION IN INIT NOTIFY EXT: SID %s",
sid ) );
sub->active = 1;
@@ -737,9 +736,9 @@ genaInitNotifyExt( IN UpnpDevice_Handle device_handle,
return UPNP_E_INVALID_PARAM;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"GENERATED PROPERY SET IN INIT EXT NOTIFY: %s",
propertySet );
propertySet ) );
headers_size = strlen( "CONTENT-TYPE text/xml\r\n" ) +
strlen( "CONTENT-LENGTH: \r\n" ) + MAX_CONTENT_LENGTH +
@@ -1166,14 +1165,10 @@ respond_ok( IN SOCKINFO * info,
membuffer_init( &response );
response.size_inc = 30;
if( http_MakeMessage(
&response, major, minor,
"R" "D" "S" "N" "Xc" "ssc" "scc",
HTTP_OK,
(off_t)0,
X_USER_AGENT,
"SID: ", sub->sid,
timeout_str ) != 0 ) {
if( http_MakeMessage( &response, major, minor,
"R" "D" "S" "N" "Xc" "ssc" "sc" "c",
HTTP_OK, 0, X_USER_AGENT,
"SID: ", sub->sid, timeout_str ) != 0 ) {
membuffer_destroy( &response );
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
return UPNP_E_OUTOF_MEMORY;
@@ -1315,8 +1310,8 @@ gena_process_subscription_request( IN SOCKINFO * info,
memptr callback_hdr;
memptr timeout_hdr;
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Subscription Request Received:\n" );
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Subscription Request Received:\n" ) );
if( httpmsg_find_hdr( request, HDR_NT, &nt_hdr ) == NULL ) {
error_respond( info, HTTP_BAD_REQUEST, request );
@@ -1345,9 +1340,10 @@ gena_process_subscription_request( IN SOCKINFO * info,
return;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"SubscriptionRequest for event URL path: %s\n",
event_url_path );
)
HandleLock( );
@@ -1368,11 +1364,11 @@ gena_process_subscription_request( IN SOCKINFO * info,
return;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Subscription Request: Number of Subscriptions already %d\n "
"Max Subscriptions allowed: %d\n",
service->TotalSubscriptions,
handle_info->MaxSubscriptions );
handle_info->MaxSubscriptions ) );
// too many subscriptions
if( handle_info->MaxSubscriptions != -1 &&
@@ -1545,11 +1541,12 @@ gena_process_subscription_renewal_request( IN SOCKINFO * info,
return;
}
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"Renew request: Number of subscriptions already: %d\n "
"Max Subscriptions allowed:%d\n",
service->TotalSubscriptions,
handle_info->MaxSubscriptions );
)
// too many subscriptions
if( handle_info->MaxSubscriptions != -1 &&
service->TotalSubscriptions > handle_info->MaxSubscriptions ) {

View File

@@ -45,7 +45,7 @@
#else
#include <winsock2.h>
typedef int socklen_t;
#define socklen_t int
#define EAFNOSUPPORT 97
#endif
#include "unixutil.h"
@@ -174,8 +174,10 @@ dispatch_request( IN SOCKINFO * info,
case HTTPMETHOD_NOTIFY:
case HTTPMETHOD_SUBSCRIBE:
case HTTPMETHOD_UNSUBSCRIBE:
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: got GENA msg\n", info->socket );
)
callback = gGenaCallback;
break;
@@ -215,7 +217,7 @@ dispatch_request( IN SOCKINFO * info,
*
* Note :
************************************************************************/
static UPNP_INLINE void
static XINLINE void
handle_error( IN SOCKINFO * info,
int http_error_code,
int major,
@@ -273,8 +275,10 @@ handle_request( void *args )
struct mserv_request_t *request = ( struct mserv_request_t * )args;
int connfd = request->connfd;
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: READING\n", connfd );
)
//parser_request_init( &parser ); ////LEAK_FIX_MK
hmsg = &parser.msg;
@@ -291,8 +295,10 @@ handle_request( void *args )
goto error_handler;
}
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: PROCESSING...\n", connfd );
)
// dispatch
http_error_code = dispatch_request( &info, &parser );
if( http_error_code != 0 ) {
@@ -310,8 +316,10 @@ handle_request( void *args )
handle_error( &info, http_error_code, major, minor );
}
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver %d: COMPLETE\n", connfd );
)
sock_destroy( &info, SD_BOTH ); //should shutdown completely
httpmsg_destroy( hmsg );
@@ -333,7 +341,7 @@ handle_request( void *args )
*
* Note :
************************************************************************/
static UPNP_INLINE void
static XINLINE void
schedule_request_job( IN int connfd,
IN struct sockaddr_in *clientAddr )
{
@@ -344,8 +352,10 @@ schedule_request_job( IN int connfd,
( struct mserv_request_t * )
malloc( sizeof( struct mserv_request_t ) );
if( request == NULL ) {
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv %d: out of memory\n", connfd );
)
shutdown( request->connfd, SD_BOTH );
UpnpCloseSocket( connfd );
return;
@@ -359,9 +369,11 @@ schedule_request_job( IN int connfd,
TPJobSetFreeFunction( &job, free_handle_request_arg );
TPJobSetPriority( &job, MED_PRIORITY );
if( ThreadPoolAdd( &gMiniServerThreadPool, &job, NULL ) != 0 ) {
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
if( ThreadPoolAdd( &gRecvThreadPool, &job, NULL ) != 0 ) {
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv %d: cannot schedule request\n", connfd );
)
free( request );
shutdown( connfd, SD_BOTH );
UpnpCloseSocket( connfd );
@@ -434,8 +446,10 @@ RunMiniServer( MiniServerSockArray * miniSock )
if( select( maxMiniSock, &rdSet, NULL, &expSet, NULL ) ==
UPNP_SOCKETERROR ) {
UpnpPrintf( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in select call !!!\n" );
)
continue;
} else {
@@ -445,9 +459,11 @@ RunMiniServer( MiniServerSockArray * miniSock )
( struct sockaddr * )&clientAddr,
&clientLen );
if( connectHnd == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"miniserver: Error"
" in accepting connection\n" );
)
continue;
}
schedule_request_job( connectHnd, &clientAddr );
@@ -473,19 +489,24 @@ RunMiniServer( MiniServerSockArray * miniSock )
&clientLen );
if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0';
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"Received response !!! %s From host %s \n",
requestBuf, inet_ntoa( clientAddr.sin_addr ) );
UpnpPrintf( UPNP_PACKET, MSERV, __FILE__, __LINE__,
requestBuf,
inet_ntoa( clientAddr.sin_addr ) );
)
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;
}
}
}
}
}
shutdown( miniServSock, SD_BOTH );
@@ -534,8 +555,10 @@ get_port( int sockfd )
}
port = ntohs( sockinfo.sin_port );
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, MSERV, __FILE__, __LINE__,
"sockfd = %d, .... port = %d\n", sockfd, port );
)
return port;
}
@@ -600,10 +623,16 @@ get_miniserver_sockets( MiniServerSockArray * out,
//THIS MAY CAUSE TCP TO BECOME LESS RELIABLE
//HOWEVER IT HAS BEEN SUGESTED FOR TCP SERVERS
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: resuseaddr set\n" );
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 ) {
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
@@ -622,11 +651,6 @@ get_miniserver_sockets( MiniServerSockArray * out,
sizeof( struct sockaddr_in )
);
if( sockError == UPNP_SOCKETERROR ) {
#ifdef WIN32
errCode = WSAGetLastError();
#else
errCode = errno;
#endif
if( errno == EADDRINUSE )
errCode = 1;
} else
@@ -636,14 +660,16 @@ get_miniserver_sockets( MiniServerSockArray * out,
}
if( sockError == UPNP_SOCKETERROR ) {
perror( "mserv start: bind failed" );
DBGONLY( perror( "mserv start: bind failed" );
)
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
return UPNP_E_SOCKET_BIND; // bind failed
}
UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, MSERV, __FILE__, __LINE__,
"mserv start: bind success\n" );
)
success = listen( listenfd, SOMAXCONN );
if( success == UPNP_SOCKETERROR ) {
@@ -663,9 +689,10 @@ get_miniserver_sockets( MiniServerSockArray * out,
if( ( miniServerStopSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) ==
UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
)
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
return UPNP_E_OUTOF_SOCKET;
@@ -679,9 +706,10 @@ get_miniserver_sockets( MiniServerSockArray * out,
if( bind( miniServerStopSock, ( struct sockaddr * )&serverAddr,
sizeof( serverAddr ) ) == UPNP_SOCKETERROR ) {
UpnpPrintf( UPNP_CRITICAL,
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
MSERV, __FILE__, __LINE__,
"Error in binding localhost!!!\n" );
)
shutdown( listenfd, SD_BOTH );
UpnpCloseSocket( listenfd );
shutdown( miniServerStopSock, SD_BOTH );
@@ -772,7 +800,7 @@ StartMiniServer( unsigned short listen_port )
TPJobSetFreeFunction( &job, ( free_routine ) free );
success = ThreadPoolAddPersistent( &gMiniServerThreadPool, &job, NULL );
success = ThreadPoolAddPersistent( &gRecvThreadPool, &job, NULL );
if( success < 0 ) {
shutdown( miniSocket->miniServerSock, SD_BOTH );
@@ -844,8 +872,10 @@ StopMiniServer( void )
sock = socket( AF_INET, SOCK_DGRAM, 0 );
if( sock == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_SERVER:StopSSDPServer: Error in socket operation !!!\n" );
)
return 0;
}

View File

@@ -34,7 +34,6 @@
* messages.
************************************************************************/
#define _GNU_SOURCE // For strcasestr() in string.h
#include "config.h"
#include <assert.h>
#include <string.h>
@@ -101,7 +100,7 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = {
/***********************************************************************/
/************* scanner *************/
/************* scanner **************/
/***********************************************************************/
@@ -121,7 +120,7 @@ str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES] = {
*
* Note :
************************************************************************/
static UPNP_INLINE void
static XINLINE void
scanner_init( OUT scanner_t * scanner,
IN membuffer * bufptr )
{
@@ -142,7 +141,7 @@ scanner_init( OUT scanner_t * scanner,
*
* Note :
************************************************************************/
static UPNP_INLINE xboolean
static XINLINE xboolean
is_separator_char( IN char c )
{
return strchr( " \t()<>@,;:\\\"/[]?={}", c ) != NULL;
@@ -160,7 +159,7 @@ is_separator_char( IN char c )
*
* Note :
************************************************************************/
static UPNP_INLINE xboolean
static XINLINE xboolean
is_identifier_char( IN char c )
{
return ( c >= 32 && c <= 126 ) && !is_separator_char( c );
@@ -178,7 +177,7 @@ is_identifier_char( IN char c )
*
* Note :
************************************************************************/
static UPNP_INLINE xboolean
static XINLINE xboolean
is_control_char( IN char c )
{
return ( ( c >= 0 && c <= 31 ) || ( c == 127 ) );
@@ -196,7 +195,7 @@ is_control_char( IN char c )
*
* Note :
************************************************************************/
static UPNP_INLINE xboolean
static XINLINE xboolean
is_qdtext_char( IN char cc )
{
unsigned char c = ( unsigned char )cc;
@@ -375,7 +374,7 @@ scanner_get_token( INOUT scanner_t * scanner,
*
* Note :
************************************************************************/
static UPNP_INLINE char *
static XINLINE char *
scanner_get_str( IN scanner_t * scanner )
{
return scanner->msg->buf + scanner->cursor;
@@ -395,9 +394,7 @@ scanner_get_str( IN scanner_t * scanner )
*
* Note :
************************************************************************/
#warning The only use of the function 'scanner_pushback()' in the code is commented out.
#warning 'scanner_pushback()' is a good candidate for removal.
static UPNP_INLINE void
static XINLINE void
scanner_pushback( INOUT scanner_t * scanner,
IN size_t pushback_bytes )
{
@@ -564,7 +561,7 @@ httpmsg_find_hdr_str( IN http_message_t * msg,
*
* Description : Finds header from a list, with the given 'name_id'.
*
* Return : http_header_t* - Pointer to a header on success;
* Return : http_header_t* - Pointer to a header on success; *
* NULL on failure
*
* Note :
@@ -616,7 +613,7 @@ httpmsg_find_hdr( IN http_message_t * msg,
*
* Note :
************************************************************************/
static UPNP_INLINE int
static XINLINE int
skip_blank_lines( INOUT scanner_t * scanner )
{
memptr token;
@@ -653,7 +650,7 @@ skip_blank_lines( INOUT scanner_t * scanner )
*
* Note :
************************************************************************/
static UPNP_INLINE int
static XINLINE int
skip_lws( INOUT scanner_t * scanner )
{
memptr token;
@@ -700,7 +697,7 @@ skip_lws( INOUT scanner_t * scanner )
*
* Description : Match a string without whitespace or CRLF (%S)
*
* Return : UPNP_INLINE parse_status_t ;
* Return : XINLINE parse_status_t ;
* PARSE_OK
* PARSE_NO_MATCH
* PARSE_FAILURE
@@ -708,7 +705,7 @@ skip_lws( INOUT scanner_t * scanner )
*
* Note :
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
match_non_ws_string( INOUT scanner_t * scanner,
OUT memptr * str )
{
@@ -774,7 +771,7 @@ match_non_ws_string( INOUT scanner_t * scanner,
*
* Note :
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
match_raw_value( INOUT scanner_t * scanner,
OUT memptr * raw_value )
{
@@ -865,7 +862,7 @@ match_raw_value( INOUT scanner_t * scanner,
* PARSE_FAILURE -- bad input
* PARSE_INCOMPLETE
************************************************************************/
static UPNP_INLINE int
static XINLINE int
match_int( INOUT scanner_t * scanner,
IN int base,
OUT int *value )
@@ -924,7 +921,7 @@ match_int( INOUT scanner_t * scanner,
* PARSE_FAILURE
* PARSE_INCOMPLETE
************************************************************************/
static UPNP_INLINE int
static XINLINE int
read_until_crlf( INOUT scanner_t * scanner,
OUT memptr * str )
{
@@ -965,9 +962,7 @@ read_until_crlf( INOUT scanner_t * scanner,
* PARSE_FAILURE
* PARSE_INCOMPLETE
************************************************************************/
#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 good candidate for removal.
static UPNP_INLINE int
static XINLINE int
skip_to_end_of_header( INOUT scanner_t * scanner )
{
memptr dummy_raw_value;
@@ -983,8 +978,8 @@ skip_to_end_of_header( INOUT scanner_t * scanner )
* Parameters:
* INOUT scanner_t* scanner ; Scanner Object
* IN char c ; Character to be compared with
* IN xboolean case_sensitive; Flag indicating whether
* comparison should be case sensitive
* IN xboolean case_sensitive; Flag indicating whether comparison should
* be case sensitive
*
* Description: Compares a character to the next char in the scanner;
* on error, scanner chars are not restored
@@ -994,7 +989,7 @@ skip_to_end_of_header( INOUT scanner_t * scanner )
* PARSE_NO_MATCH
* PARSE_INCOMPLETE
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
match_char( INOUT scanner_t * scanner,
IN char c,
IN xboolean case_sensitive )
@@ -1341,7 +1336,7 @@ matchstr( IN char *str,
* Returns:
* void
************************************************************************/
static UPNP_INLINE void
static XINLINE void
parser_init( OUT http_parser_t * parser )
{
memset( parser, 0, sizeof( http_parser_t ) );
@@ -1876,7 +1871,7 @@ parser_parse_headers_old( INOUT http_parser_t * parser )
* PARSE_FAILURE -- entity length > content-length value
* PARSE_SUCCESS
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
parser_parse_entity_using_clen( INOUT http_parser_t * parser )
{
//int entity_length;
@@ -1923,7 +1918,7 @@ parser_parse_entity_using_clen( INOUT http_parser_t * parser )
* PARSE_FAILURE -- entity length > content-length value
* PARSE_SUCCESS
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
parser_parse_chunky_body( INOUT http_parser_t * parser )
{
parse_status_t status;
@@ -1968,7 +1963,7 @@ parser_parse_chunky_body( INOUT http_parser_t * parser )
* PARSE_FAILURE -- entity length > content-length value
* PARSE_SUCCESS
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
parser_parse_chunky_headers( INOUT http_parser_t * parser )
{
parse_status_t status;
@@ -2008,7 +2003,7 @@ parser_parse_chunky_headers( INOUT http_parser_t * parser )
* PARSE_SUCCESS
* PARSE_CONTINUE_1
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
parser_parse_chunky_entity( INOUT http_parser_t * parser )
{
scanner_t *scanner = &parser->scanner;
@@ -2024,8 +2019,9 @@ parser_parse_chunky_entity( INOUT http_parser_t * parser )
status = match( scanner, "%x%L%c", &parser->chunk_size, &dummy );
if( status != PARSE_OK ) {
scanner->cursor = save_pos;
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"CHUNK COULD NOT BE PARSED\n" );
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"CHUNK COULD NOT BE PARSED\n" ); )
return status;
}
// remove chunk info just matched; just retain data
@@ -2059,7 +2055,7 @@ parser_parse_chunky_entity( INOUT http_parser_t * parser )
* Returns:
* PARSE_INCOMPLETE_ENTITY
************************************************************************/
static UPNP_INLINE parse_status_t
static XINLINE parse_status_t
parser_parse_entity_until_close( INOUT http_parser_t * parser )
{
size_t cursor;
@@ -2094,7 +2090,7 @@ parser_parse_entity_until_close( INOUT http_parser_t * parser )
* PARSE_FAILURE
* PARSE_COMPLETE -- no more reading to do
************************************************************************/
UPNP_INLINE parse_status_t
XINLINE parse_status_t
parser_get_entity_read_method( INOUT http_parser_t * parser )
{
http_message_t *hmsg = &parser->msg;
@@ -2152,8 +2148,9 @@ parser_get_entity_read_method( INOUT http_parser_t * parser )
if( raw_find_str( &hdr_value, "chunked" ) >= 0 ) {
// read method to use chunked transfer encoding
parser->ent_position = ENTREAD_USING_CHUNKED;
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"Found Chunked Encoding ....\n" );
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"Found Chunked Encoding ....\n" ); )
return PARSE_CONTINUE_1;
}
@@ -2199,7 +2196,7 @@ parser_get_entity_read_method( INOUT http_parser_t * parser )
* PARSE_FAILURE
* PARSE_COMPLETE -- no more reading to do
************************************************************************/
UPNP_INLINE parse_status_t
XINLINE parse_status_t
parser_parse_entity( INOUT http_parser_t * parser )
{
parse_status_t status = PARSE_OK;
@@ -2424,8 +2421,6 @@ raw_to_int( IN memptr * raw_value,
*
* Description: Find a substring from raw character string buffer
*
* Side effects: raw_value is transformed to lowercase.
*
* Returns:
* int - index at which the substring is found.
************************************************************************/
@@ -2435,31 +2430,19 @@ raw_find_str( IN memptr *raw_value,
{
char c;
char *ptr;
int i = 0;
// save
c = raw_value->buf[raw_value->length];
c = raw_value->buf[raw_value->length]; // save
raw_value->buf[raw_value->length] = 0; // null-terminate
// Make it lowercase
for (i = 0; raw_value->buf[i]; ++i) {
raw_value->buf[i] = tolower(raw_value->buf[i]);
}
// null-terminate
raw_value->buf[raw_value->length] = 0;
// Find the substring position
ptr = strstr( raw_value->buf, str );
// restore the "length" byte
raw_value->buf[raw_value->length] = c;
raw_value->buf[raw_value->length] = c; // restore
if( ptr == 0 ) {
return -1;
}
// return index
return ptr - raw_value->buf;
return ptr - raw_value->buf; // return index
}
/************************************************************************
@@ -2472,7 +2455,7 @@ raw_find_str( IN memptr *raw_value,
* nameConverts a http_method id stored in the HTTP Method
*
* Returns:
* const char* ptr - Ptr to the HTTP Method
* const char* ptr - Ptr to the HTTP Method *
************************************************************************/
const char *
method_to_str( IN http_method_t method )
@@ -2497,38 +2480,40 @@ method_to_str( IN http_method_t method )
* Returns:
* void
************************************************************************/
#ifdef DEBUG
void
print_http_headers( http_message_t * hmsg )
{
ListNode *node;
//NNS: dlist_node *node;
http_header_t *header;
// print start line
if( hmsg->is_request ) {
printf( "method = %d, version = %d.%d, url = %.*s\n",
hmsg->method, hmsg->major_version, hmsg->minor_version,
(int)hmsg->uri.pathquery.size, hmsg->uri.pathquery.buff);
//printf( "method = %d, version = %d.%d, url = %.*s\n",
// hmsg->method, hmsg->major_version, hmsg->minor_version,
// hmsg->uri.pathquery.size, hmsg->uri.pathquery.buff);
} else {
printf( "resp status = %d, version = %d.%d, status msg = %.*s\n",
hmsg->status_code, hmsg->major_version, hmsg->minor_version,
(int)hmsg->status_msg.length, hmsg->status_msg.buf);
// printf( "resp status = %d, version = %d.%d, status msg = %.*s\n",
// hmsg->status_code, hmsg->major_version, hmsg->minor_version,
// (int)hmsg->status_msg.length, hmsg->status_msg.buf);
}
// print headers
node = ListHead( &hmsg->headers );
//NNS: node = dlist_first_node( &hmsg->headers );
while( node != NULL ) {
header = ( http_header_t * ) node->item;
//NNS: header = (http_header_t *)node->data;
printf( "hdr name: %.*s, value: %.*s\n",
(int)header->name.length, header->name.buf,
(int)header->value.length, header->value.buf );
//printf( "hdr name: %.*s, value: %.*s\n",
// (int)header->name.length, header->name.buf,
// (int)header->value.length, header->value.buf );
node = ListNext( &hmsg->headers, node );
//NNS: node = dlist_next( &hmsg->headers, node );
}
}
#endif

View File

@@ -39,16 +39,9 @@
#include <assert.h>
#include <stdarg.h>
#ifndef UPNP_USE_BCBPP
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h>
#include <stdint.h>
#endif
#endif
#ifndef WIN32
#include <arpa/inet.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
@@ -56,6 +49,7 @@
#include <sys/wait.h>
#include <unistd.h>
#include <sys/utsname.h>
#include <fcntl.h>
#else
#include <winsock2.h>
#include <malloc.h>
@@ -169,8 +163,10 @@ http_Connect( IN uri_type * destination_url,
if( connect( connfd, ( struct sockaddr * )&url->hostport.IPv4address,
sizeof( struct sockaddr_in ) ) == -1 ) {
#ifdef WIN32
DBGONLY(
UpnpPrintf(UPNP_CRITICAL, HTTP, __FILE__, __LINE__,
"connect error: %d\n", WSAGetLastError());
)
#endif
shutdown( connfd, SD_BOTH );
UpnpCloseSocket( connfd );
@@ -224,10 +220,12 @@ http_RecvMessage( IN SOCKINFO * info,
status = parser_append( parser, buf, num_read );
if( status == PARSE_SUCCESS ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
print_http_headers( &parser->msg );
//print_http_headers( &parser->msg );
)
if( parser->content_length >
( unsigned int )g_maxContentLength ) {
@@ -248,10 +246,12 @@ http_RecvMessage( IN SOCKINFO * info,
}
} else if( num_read == 0 ) {
if( ok_on_close ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
print_http_headers( &parser->msg );
//print_http_headers( &parser->msg );
)
return 0;
} else {
@@ -306,8 +306,8 @@ http_SendMessage( IN SOCKINFO * info,
char *filename = NULL;
FILE *Fp;
int num_read,
num_written;
off_t amount_to_be_read = 0;
num_written,
amount_to_be_read = 0;
va_list argp;
char *file_buf = NULL,
*ChunkBuf = NULL;
@@ -367,7 +367,7 @@ http_SendMessage( IN SOCKINFO * info,
return UPNP_E_FILE_READ_ERROR;
}
} else if( Instr && Instr->IsRangeActive ) {
if( fseeko( Fp, Instr->RangeOffset, SEEK_CUR ) != 0 ) {
if( fseek( Fp, Instr->RangeOffset, SEEK_CUR ) != 0 ) {
free( ChunkBuf );
return UPNP_E_FILE_READ_ERROR;
}
@@ -449,9 +449,11 @@ http_SendMessage( IN SOCKINFO * info,
num_written = sock_write( info, file_buf, num_read,
TimeOut );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n%.*s\n------------\n",
( int )num_written, file_buf );
)
//Send error nothing we can do
if( num_written != num_read ) {
@@ -477,9 +479,10 @@ http_SendMessage( IN SOCKINFO * info,
num_written = sock_write( info, buf, buf_length, TimeOut );
if( ( size_t ) num_written != buf_length )
goto end;
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
">>> (SENT) >>>\n%.*s\n------------\n",
( int )buf_length, buf );
)
}
}
}
@@ -580,6 +583,7 @@ http_RequestAndResponse( IN uri_type * destination,
* UPNP_E_SUCCESS;
* UPNP_E_INVALID_URL;
*
*
* Note :
************************************************************************/
int
@@ -591,21 +595,23 @@ http_Download( IN const char *url_str,
{
int ret_code;
uri_type url;
char *msg_start;
char *entity_start;
char *hoststr;
char *temp;
char *msg_start,
*entity_start,
*hoststr,
*temp;
http_parser_t response;
size_t msg_length;
size_t hostlen;
size_t msg_length,
hostlen;
memptr ctype;
size_t copy_len;
membuffer request;
char *urlPath = alloca( strlen( url_str ) + 1 );
//ret_code = parse_uri( (char*)url_str, strlen(url_str), &url );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n",
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__, "DOWNLOAD URL : %s\n",
url_str );
)
ret_code =
http_FixStrUrl( ( char * )url_str, strlen( url_str ), &url );
if( ret_code != UPNP_E_SUCCESS ) {
@@ -629,24 +635,28 @@ http_Download( IN const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr, hostlen );
)
ret_code = http_MakeMessage(
&request, 1, 1,
"Q" "s" "bcDCUc",
HTTPMETHOD_GET, url.pathquery.buff, url.pathquery.size,
"HOST: ",
hoststr, hostlen );
ret_code = http_MakeMessage( &request, 1, 1, "QsbcDCUc",
HTTPMETHOD_GET, url.pathquery.buff,
url.pathquery.size, "HOST: ", hoststr,
hostlen );
if( ret_code != 0 ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
membuffer_destroy( &request );
return ret_code;
}
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n----------END--------\n", request.buf );
)
// get doc msg
ret_code =
http_RequestAndResponse( &url, request.buf, request.length,
@@ -658,8 +668,11 @@ http_Download( IN const char *url_str,
return ret_code;
}
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" );
print_http_headers( &response.msg );
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__, "Response\n" );
)
DBGONLY( print_http_headers( &response.msg );
)
// optional content-type
if( content_type ) {
@@ -746,14 +759,17 @@ MakePostMessage( const char *url_str,
{
int ret_code = 0;
char *urlPath = alloca( strlen( url_str ) + 1 );
size_t hostlen = 0;
int hostlen = 0;
char *hoststr,
*temp;
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
)
ret_code =
http_FixStrUrl( ( char * )url_str, strlen( url_str ), url );
if( ret_code != UPNP_E_SUCCESS ) {
return ret_code;
}
@@ -775,49 +791,42 @@ MakePostMessage( const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr, hostlen );
)
if( contentLength >= 0 ) {
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCU" "T" "Nc",
HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size,
"HOST: ",
hoststr, hostlen,
contentType,
(off_t)contentLength );
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUTNc",
HTTPMETHOD_POST, url->pathquery.buff,
url->pathquery.size, "HOST: ",
hoststr, hostlen, contentType,
contentLength );
} else if( contentLength == UPNP_USING_CHUNKED ) {
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCU" "TKc",
HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size,
"HOST: ",
hoststr, hostlen,
contentType );
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUTKc",
HTTPMETHOD_POST, url->pathquery.buff,
url->pathquery.size, "HOST: ",
hoststr, hostlen, contentType );
} else if( contentLength == UPNP_UNTIL_CLOSE ) {
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCU" "Tc",
HTTPMETHOD_POST, url->pathquery.buff, url->pathquery.size,
"HOST: ",
hoststr, hostlen,
contentType );
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUTc",
HTTPMETHOD_POST, url->pathquery.buff,
url->pathquery.size, "HOST: ",
hoststr, hostlen, contentType );
} else {
ret_code = UPNP_E_INVALID_PARAM;
}
if( ret_code != 0 ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
membuffer_destroy( request );
return ret_code;
}
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
)
return UPNP_E_SUCCESS;
}
@@ -1076,14 +1085,15 @@ MakeGetMessage( const char *url_str,
{
int ret_code;
char *urlPath = alloca( strlen( url_str ) + 1 );
size_t querylen = 0;
int querylen = 0;
const char *querystr;
size_t hostlen = 0;
int hostlen = 0;
char *hoststr,
*temp;
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
)
ret_code =
http_FixStrUrl( ( char * )url_str, strlen( url_str ), url );
@@ -1109,8 +1119,9 @@ MakeGetMessage( const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n", hoststr, hostlen );
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr, hostlen );
)
if( proxy_str ) {
querystr = url_str;
@@ -1120,24 +1131,22 @@ MakeGetMessage( const char *url_str,
querylen = url->pathquery.size;
}
ret_code = http_MakeMessage(
request, 1, 1,
"Q" "s" "bcDCUc",
ret_code = http_MakeMessage( request, 1, 1, "QsbcDCUc",
HTTPMETHOD_GET, querystr, querylen,
"HOST: ",
hoststr, hostlen );
"HOST: ", hoststr, hostlen );
if( ret_code != 0 ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
membuffer_destroy( request );
return ret_code;
}
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
)
return UPNP_E_SUCCESS;
}
@@ -1357,9 +1366,11 @@ http_ReadHttpGet( IN void *Handle,
}
} else if( num_read == 0 ) {
if( ok_on_close ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
handle->response.msg.msg.buf );
//print_http_headers( &parser->msg );
)
handle->response.position = POS_COMPLETE;
} else {
// partial msg
@@ -1718,10 +1729,7 @@ http_SendStatusResponse( IN SOCKINFO * info,
membuffer_init( &membuf );
membuf.size_inc = 70;
ret = http_MakeMessage(
&membuf, response_major, response_minor,
"RSCB",
http_status_code, // response start line
ret = http_MakeMessage( &membuf, response_major, response_minor, "RSCB", http_status_code, // response start line
http_status_code ); // body
if( ret == 0 ) {
timeout = HTTP_DEFAULT_TIMEOUT;
@@ -1749,32 +1757,28 @@ http_SendStatusResponse( IN SOCKINFO * info,
* specified in the input parameters.
*
* fmt types:
* 'B': arg = int status_code
* appends content-length, content-type and HTML body for given code
* 'b': arg1 = const char* buf;
* arg2 = size_t buf_length memory ptr
* 's': arg = const char* C_string
* 'b': arg1 = const char* buf; arg2 = size_t buf_length
* memory ptr
* 'c': (no args) appends CRLF "\r\n"
* 'd': arg = int number // appends decimal number
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'D': (no args) appends HTTP DATE: header
* 'S': (no args) appends HTTP SERVER: header
* 'U': (no args) appends HTTP USER-AGENT: header
* 'C': (no args) appends a HTTP CONNECTION: close header
* depending on major,minor version
* 'c': (no args) appends CRLF "\r\n"
* 'D': (no args) appends HTTP DATE: header
* 'd': arg = int number // appends decimal number
* 'G': arg = range information // add range header
* 'h': arg = off_t number // appends off_t number
* 'K': (no args) // add chunky header
* 'N': arg1 = off_t content_length // content-length header
* 'q': arg1 = http_method_t // request start line and HOST header
* arg2 = (uri_type *)
* 'Q': arg1 = http_method_t; // start line of request
* arg2 = char* url;
* arg3 = size_t url_length
* 'N': arg1 = int content_length // content-length header
* 'Q': arg1 = http_method_t; arg2 = char* url;
* arg3 = int url_length // start line of request
* 'R': arg = int status_code // adds a response start line
* 'S': (no args) appends HTTP SERVER: header
* 's': arg = const char* C_string
* 'T': arg = char * content_type; format
* e.g: "text/html"; content-type header
* 't': arg = time_t * gmt_time // appends time in RFC 1123 fmt
* 'U': (no args) appends HTTP USER-AGENT: header
* 'B': arg = int status_code
* appends content-length, content-type and HTML body for given code
* 'T': arg = char * content_type; format e.g: "text/html";
* content-type header
* --- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld@users.sourceforge.net>
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
* --- PATCH END ---
*
* Return : int;
* 0 - On Success
@@ -1792,8 +1796,7 @@ http_MakeMessage( INOUT membuffer * buf,
{
char c;
char *s = NULL;
size_t num;
off_t bignum;
int num;
size_t length;
time_t *loc_time;
time_t curr_time;
@@ -1819,26 +1822,31 @@ http_MakeMessage( INOUT membuffer * buf,
va_start( argp, fmt );
while( ( c = *fmt++ ) != 0 ) {
if( c == 's' ) {
// C string
if( c == 's' ) // C string
{
s = ( char * )va_arg( argp, char * );
assert( s );
UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s);
//DBGONLY(UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a string : %s\n", s);)
if( membuffer_append( buf, s, strlen( s ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'K' ) {
// Add Chunky header
} else if( c == 'K' ) // Add Chunky header
{
if( membuffer_append
( buf, "TRANSFER-ENCODING: chunked\r\n",
strlen( "Transfer-Encoding: chunked\r\n" ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'G' ) {
// Add Range header
} else if( c == 'G' ) // Add Range header
{
struct SendInstruction *RespInstr;
RespInstr = (struct SendInstruction *)
va_arg( argp, struct SendInstruction *);
RespInstr =
( struct SendInstruction * )va_arg( argp,
struct SendInstruction
* );
assert( RespInstr );
// connection header
if( membuffer_append
@@ -1846,43 +1854,38 @@ http_MakeMessage( INOUT membuffer * buf,
strlen( RespInstr->RangeHeader ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'b' ) {
// mem buffer
} else if( c == 'b' ) // mem buffer
{
s = ( char * )va_arg( argp, char * );
UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,
"Adding a char Buffer starting with: %c\n", s[0]);
//DBGONLY(UpnpPrintf(UPNP_ALL,HTTP,__FILE__,__LINE__,"Adding a char Buffer starting with: %c\n", s[0]);)
assert( s );
length = ( size_t ) va_arg( argp, size_t );
if( membuffer_append( buf, s, length ) != 0 ) {
goto error_handler;
}
}
else if( c == 'c' ) {
// crlf
else if( c == 'c' ) // crlf
{
if( membuffer_append( buf, "\r\n", 2 ) != 0 ) {
goto error_handler;
}
}
else if( c == 'd' ) {
// integer
num = ( int )va_arg( argp, int );
sprintf( tempbuf, "%"PRIzu, num );
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
goto error_handler;
}
}
else if( c == 'h' ) {
// off_t
bignum = ( off_t )va_arg( argp, off_t );
sprintf( tempbuf, "%"PRId64, (int64_t)bignum );
else if( c == 'd' ) // integer
{
num = ( int )va_arg( argp, int );
sprintf( tempbuf, "%d", num );
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
goto error_handler;
}
}
else if( c == 't' || c == 'D' ) {
// date
else if( c == 't' || c == 'D' ) // date
{
if( c == 'D' ) {
// header
start_str = "DATE: ";
@@ -1906,7 +1909,9 @@ http_MakeMessage( INOUT membuffer * buf,
if( membuffer_append( buf, tempbuf, strlen( tempbuf ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'C' ) {
}
else if( c == 'C' ) {
if( ( http_major_version > 1 ) ||
( http_major_version == 1 && http_minor_version == 1 )
) {
@@ -1916,114 +1921,141 @@ http_MakeMessage( INOUT membuffer * buf,
goto error_handler;
}
}
} else if( c == 'N' ) {
// content-length header
bignum = ( off_t )va_arg( argp, off_t );
}
assert( bignum >= 0 );
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"shc",
"CONTENT-LENGTH: ", bignum ) != 0 ) {
else if( c == 'N' ) {
// content-length header
num = ( int )va_arg( argp, int );
assert( num >= 0 );
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "sdc",
"CONTENT-LENGTH: ", num ) != 0 ) {
goto error_handler;
}
} else if( c == 'S' || c == 'U' ) {
}
else if( c == 'S' || c == 'U' ) {
// SERVER or USER-AGENT header
temp_str = ( c == 'S' ) ? "SERVER: " : "USER-AGENT: ";
get_sdk_info( tempbuf );
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ss",
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "ss",
temp_str, tempbuf ) != 0 ) {
goto error_handler;
}
} else if( c == 'X' ) {
// C string
}
/* --- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld@users.sourceforge.net> */
else if( c == 'X' ) // C string
{
s = ( char * )va_arg( argp, char * );
assert( s );
if( membuffer_append_str( buf, "X-User-Agent: ") != 0 ) {
goto error_handler;
}
if( membuffer_append( buf, s, strlen( s ) ) != 0 ) {
goto error_handler;
}
} else if( c == 'R' ) {
}
/* --- PATCH END --- */
else if( c == 'R' ) {
// response start line
// e.g.: 'HTTP/1.1 200 OK'
//
// code
status_code = ( int )va_arg( argp, int );
assert( status_code > 0 );
sprintf( tempbuf, "HTTP/%d.%d %d ",
http_major_version, http_minor_version, status_code );
// str
status_msg = http_get_code_text( status_code );
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssc",
tempbuf,
status_msg ) != 0 ) {
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "ssc",
tempbuf, status_msg ) != 0 ) {
goto error_handler;
}
} else if( c == 'B' ) {
}
else if( c == 'B' ) {
// body of a simple reply
//
status_code = ( int )va_arg( argp, int );
sprintf( tempbuf, "%s%d %s%s",
"<html><body><h1>",
status_code, http_get_code_text( status_code ),
"</h1></body></html>" );
bignum = strlen( tempbuf );
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"NTcs",
bignum, // content-length
num = strlen( tempbuf );
if( http_MakeMessage( buf, http_major_version, http_minor_version, "NTcs", num, // content-length
"text/html", // content-type
tempbuf ) != 0 // body
) {
tempbuf ) != 0 ) // body
{
goto error_handler;
}
} else if( c == 'Q' ) {
}
else if( c == 'Q' ) {
// request start line
// GET /foo/bar.html HTTP/1.1\r\n
//
method = ( http_method_t ) va_arg( argp, http_method_t );
method_str = method_to_str( method );
url_str = ( const char * )va_arg( argp, const char * );
num = ( size_t )va_arg( argp, size_t ); // length of url_str
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssbsdsdc",
method_str, // method
num = ( int )va_arg( argp, int ); // length of url_str
if( http_MakeMessage( buf, http_major_version, http_minor_version, "ssbsdsdc", method_str, // method
" ", url_str, num, // url
" HTTP/", http_major_version, ".", http_minor_version ) != 0 ) {
" HTTP/", http_major_version, ".",
http_minor_version ) != 0 ) {
goto error_handler;
}
} else if( c == 'q' ) {
}
else if( c == 'q' ) {
// request start line and HOST header
method = ( http_method_t ) va_arg( argp, http_method_t );
uri_ptr = ( uri_type * ) va_arg( argp, uri_type * );
assert( uri_ptr );
if( http_FixUrl( uri_ptr, &url ) != 0 ) {
error_code = UPNP_E_INVALID_URL;
goto error_handler;
}
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"Q" "sbc",
method, url.pathquery.buff, url.pathquery.size,
"HOST: ", url.hostport.text.buff, url.hostport.text.size ) != 0 ) {
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "Q" "sbc",
method, url.pathquery.buff, url.pathquery.size, "HOST: ",
url.hostport.text.buff, url.hostport.text.size ) != 0 ) {
goto error_handler;
}
} else if( c == 'T' ) {
}
else if( c == 'T' ) {
// content type header
temp_str = ( const char * )va_arg( argp, const char * ); // type/subtype format
if (http_MakeMessage(
buf, http_major_version, http_minor_version,
"ssc",
if( http_MakeMessage
( buf, http_major_version, http_minor_version, "ssc",
"CONTENT-TYPE: ", temp_str ) != 0 ) {
goto error_handler;
}
} else {
}
else {
assert( 0 );
}
}
@@ -2093,20 +2125,23 @@ MakeGetMessageEx( const char *url_str,
{
int errCode = UPNP_E_SUCCESS;
char *urlPath = NULL;
size_t hostlen = 0;
int hostlen = 0;
char *hoststr,
*temp;
do {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"DOWNLOAD URL : %s\n", url_str );
)
if( ( errCode = http_FixStrUrl( ( char * )url_str,
strlen( url_str ), url ) ) != UPNP_E_SUCCESS ) {
strlen( url_str ),
url ) ) != UPNP_E_SUCCESS ) {
break;
}
// make msg
membuffer_init( request );
urlPath = alloca( strlen( url_str ) + 1 );
if( !urlPath ) {
errCode = UPNP_E_OUTOF_MEMORY;
@@ -2114,7 +2149,9 @@ MakeGetMessageEx( const char *url_str,
}
memset( urlPath, 0, strlen( url_str ) + 1 );
strcpy( urlPath, url_str );
hoststr = strstr( urlPath, "//" );
if( hoststr == NULL ) {
errCode = UPNP_E_INVALID_URL;
@@ -2131,30 +2168,36 @@ MakeGetMessageEx( const char *url_str,
*temp = '\0';
hostlen = strlen( hoststr );
*temp = '/';
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %"PRIzu"\n",
hoststr, hostlen );
errCode = http_MakeMessage(
request, 1, 1,
"Q" "s" "bc" "GDCUc",
HTTPMETHOD_GET, url->pathquery.buff, url->pathquery.size,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HOSTNAME : %s Length : %d\n", hoststr,
hostlen );
)
errCode = http_MakeMessage( request,
1,
1,
"QsbcGDCUc",
HTTPMETHOD_GET,
url->pathquery.buff,
url->pathquery.size,
"HOST: ",
hoststr, hostlen,
pRangeSpecifier );
hoststr,
hostlen, pRangeSpecifier );
if( errCode != 0 ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Makemessage failed\n" );
)
membuffer_destroy( request );
return errCode;
}
} while( 0 );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"HTTP Buffer:\n %s\n" "----------END--------\n",
request->buf );
)
return errCode;
}
@@ -2343,7 +2386,7 @@ http_OpenHttpGetEx( IN const char *url_str,
* Description : Returns the server information for the operating
* system
*
* Return : UPNP_INLINE void
* Return : XINLINE void
*
* Note :
************************************************************************/

View File

@@ -118,7 +118,7 @@ static xboolean gInitialized = FALSE;
* Returns:
* void
************************************************************************/
static UPNP_INLINE void
static XINLINE void
init_table( IN const char *encoded_str,
OUT const char *table[],
IN int tbl_size )
@@ -144,7 +144,7 @@ init_table( IN const char *encoded_str,
* Returns:
* void
************************************************************************/
static UPNP_INLINE void
static XINLINE void
init_tables( void )
{
init_table( Http1xxStr, Http1xxCodes, NUM_1XX_CODES );

View File

@@ -37,12 +37,6 @@
#include "config.h"
#include <assert.h>
#include <fcntl.h>
#ifndef UPNP_USE_BCBPP
#ifndef UPNP_USE_MSVCPP
#include <inttypes.h>
#include <stdint.h>
#endif
#endif
#include "util.h"
#include "strintmap.h"
#include "membuffer.h"
@@ -205,7 +199,7 @@ extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES];
* Returns:
* void
************************************************************************/
static UPNP_INLINE void
static XINLINE void
media_list_init( void )
{
int i;
@@ -243,7 +237,7 @@ media_list_init( void )
* 0 on success;
* -1 on error
************************************************************************/
static UPNP_INLINE int
static XINLINE int
search_extension( IN const char *extension,
OUT const char **con_type,
OUT const char **con_subtype )
@@ -290,7 +284,7 @@ search_extension( IN const char *extension,
* 0 - On Sucess
* UPNP_E_OUTOF_MEMORY - on memory allocation failures
************************************************************************/
UPNP_INLINE int
XINLINE int
get_content_type( IN const char *filename,
OUT DOMString * content_type )
{
@@ -348,7 +342,7 @@ get_content_type( IN const char *filename,
* Returns:
* void
************************************************************************/
static UPNP_INLINE void
static XINLINE void
glob_alias_init( void )
{
struct xml_alias_t *alias = &gAliasDoc;
@@ -370,7 +364,7 @@ glob_alias_init( void )
* Returns:
* BOOLEAN
************************************************************************/
static UPNP_INLINE xboolean
static XINLINE xboolean
is_valid_alias( IN const struct xml_alias_t *alias )
{
return alias->doc.buf != NULL;
@@ -637,11 +631,11 @@ get_file_info( IN const char *filename,
rc = get_content_type( filename, &info->content_type );
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"file info: %s, length: %lld, last_mod=%s readable=%d\n",
filename, (long long)info->file_length,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"file info: %s, length: %d, last_mod=%s readable=%d\n",
filename, info->file_length,
asctime( gmtime( &info->last_modified ) ),
info->is_readable );
info->is_readable ); )
return rc;
}
@@ -700,7 +694,7 @@ web_server_set_root_dir( IN const char *root_dir )
* TRUE - On Success
* FALSE if request is not an alias
************************************************************************/
static UPNP_INLINE xboolean
static XINLINE xboolean
get_alias( IN const char *request_file,
OUT struct xml_alias_t *alias,
OUT struct File_Info *info )
@@ -877,8 +871,8 @@ StrTok( char **Src,
************************************************************************/
int
GetNextRange( char **SrcRangeStr,
off_t *FirstByte,
off_t *LastByte )
int *FirstByte,
int *LastByte )
{
char *Ptr,
*Tok;
@@ -942,11 +936,11 @@ GetNextRange( char **SrcRangeStr,
************************************************************************/
int
CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
off_t FileLength,
long FileLength,
OUT struct SendInstruction *Instr )
{
off_t FirstByte,
int FirstByte,
LastByte;
char *RangeInput,
*Ptr;
@@ -990,36 +984,28 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
Instr->RangeOffset = FirstByte;
Instr->ReadSendSize = LastByte - FirstByte + 1;
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
(int64_t)FirstByte,
(int64_t)LastByte,
(int64_t)FileLength ); //Data between two range.
sprintf( Instr->RangeHeader, "CONTENT-RANGE: bytes %d-%d/%ld\r\n", FirstByte, LastByte, FileLength ); //Data between two range.
} else if( FirstByte >= 0 && LastByte == -1
&& FirstByte < FileLength ) {
Instr->RangeOffset = FirstByte;
Instr->ReadSendSize = FileLength - FirstByte;
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
(int64_t)FirstByte,
(int64_t)(FileLength - 1),
(int64_t)FileLength );
"CONTENT-RANGE: bytes %d-%ld/%ld\r\n", FirstByte,
FileLength - 1, FileLength );
} else if( FirstByte == -1 && LastByte > 0 ) {
if( LastByte >= FileLength ) {
Instr->RangeOffset = 0;
Instr->ReadSendSize = FileLength;
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes 0-%"PRId64"/%"PRId64"\r\n",
(int64_t)(FileLength - 1),
(int64_t)FileLength );
"CONTENT-RANGE: bytes 0-%ld/%ld\r\n",
FileLength - 1, FileLength );
} else {
Instr->RangeOffset = FileLength - LastByte;
Instr->ReadSendSize = LastByte;
sprintf( Instr->RangeHeader,
"CONTENT-RANGE: bytes %"PRId64"-%"PRId64"/%"PRId64"\r\n",
(int64_t)(FileLength - LastByte + 1),
(int64_t)FileLength,
(int64_t)FileLength );
"CONTENT-RANGE: bytes %ld-%ld/%ld\r\n",
FileLength - LastByte + 1, FileLength,
FileLength );
}
} else {
free( RangeInput );
@@ -1056,7 +1042,7 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
int
CheckOtherHTTPHeaders( IN http_message_t * Req,
OUT struct SendInstruction *RespInstr,
off_t FileSize )
int FileSize )
{
http_header_t *header;
ListNode *node;
@@ -1198,6 +1184,7 @@ process_request( IN http_message_t * req,
int code;
int err_code;
//membuffer content_type;
char *request_doc;
struct File_Info finfo;
xboolean using_alias;
@@ -1207,7 +1194,7 @@ process_request( IN http_message_t * req,
int resp_major,
resp_minor;
xboolean alias_grabbed;
size_t dummy;
int dummy;
struct UpnpVirtualDirCallbacks *pVirtualDirCallback;
print_http_headers( req );
@@ -1221,6 +1208,7 @@ process_request( IN http_message_t * req,
// init
request_doc = NULL;
finfo.content_type = NULL;
//membuffer_init( &content_type );
alias_grabbed = FALSE;
err_code = HTTP_INTERNAL_SERVER_ERROR; // default error
using_virtual_dir = FALSE;
@@ -1388,14 +1376,19 @@ process_request( IN http_message_t * req,
}
if( RespInstr->IsRangeActive && RespInstr->IsChunkActive ) {
/* - PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net>
* added X-User-Agent header
*/
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "T" "GKD" "s" "tcS" "XcCc",
HTTP_PARTIAL_CONTENT, // status code
finfo.content_type, // content type
RespInstr, // range info
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RTGKDstcSXcCc", HTTP_PARTIAL_CONTENT, // status code
// RespInstr->ReadSendSize,// content length
finfo.content_type,
// content_type.buf, // content type
RespInstr, // Range
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
@@ -1405,13 +1398,12 @@ process_request( IN http_message_t * req,
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "N" "T" "GD" "s" "tcS" "XcCc",
HTTP_PARTIAL_CONTENT, // status code
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RNTGDstcSXcCc", HTTP_PARTIAL_CONTENT, // status code
RespInstr->ReadSendSize, // content length
finfo.content_type, // content type
RespInstr, // range info
finfo.content_type,
//content_type.buf, // content type
RespInstr, //Range Info
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
@@ -1419,29 +1411,29 @@ process_request( IN http_message_t * req,
}
} else if( !RespInstr->IsRangeActive && RespInstr->IsChunkActive ) {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"RK" "TD" "s" "tcS" "XcCc",
HTTP_OK, // status code
finfo.content_type, // content type
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RKTDstcSXcCc", HTTP_OK, // status code
//RespInstr->ReadSendSize,// content length
finfo.content_type,
// content_type.buf, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
goto error_handler;
}
} else { // !RespInstr->IsRangeActive && !RespInstr->IsChunkActive
} else {
if( RespInstr->ReadSendSize >= 0 ) {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "N" "TD" "s" "tcS" "XcCc",
HTTP_OK, // status code
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RNTDstcSXcCc", HTTP_OK, // status code
RespInstr->ReadSendSize, // content length
finfo.content_type, // content type
finfo.content_type,
//content_type.buf, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
@@ -1450,11 +1442,11 @@ process_request( IN http_message_t * req,
} else {
//Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
//Transfer-Encoding: chunked
if (http_MakeMessage(
headers, resp_major, resp_minor,
"R" "TD" "s" "tcS" "XcCc",
HTTP_OK, // status code
finfo.content_type, // content type
// K means add chunky header ang G means range header.
if( http_MakeMessage( headers, resp_major, resp_minor, "RTDstcSXcCc", HTTP_OK, // status code
//RespInstr->ReadSendSize,// content length
finfo.content_type,
//content_type.buf, // content type
"LAST-MODIFIED: ",
&finfo.last_modified,
X_USER_AGENT) != 0 ) {
@@ -1462,6 +1454,7 @@ process_request( IN http_message_t * req,
}
}
}
/* -- PATCH END -- */
if( req->method == HTTPMETHOD_HEAD ) {
*rtype = RESP_HEADERS;
@@ -1486,6 +1479,7 @@ process_request( IN http_message_t * req,
error_handler:
free( request_doc );
ixmlFreeDOMString( finfo.content_type );
// membuffer_destroy( &content_type );
if( err_code != UPNP_E_SUCCESS && alias_grabbed ) {
alias_release( alias );
}
@@ -1586,10 +1580,13 @@ http_RecvPostMessage( http_parser_t * parser,
}
} else if( num_read == 0 ) {
if( ok_on_close ) {
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, HTTP, __FILE__, __LINE__,
"<<< (RECVD) <<<\n%s\n-----------------\n",
parser->msg.msg.buf );
print_http_headers( &parser->msg );
//print_http_headers( &parser->msg );
)
parser->position = POS_COMPLETE;
} else {
// partial msg
@@ -1741,12 +1738,12 @@ web_server_callback( IN http_parser_t * parser,
&RespInstr );
//Send response.
http_MakeMessage(
&headers, 1, 1,
"RTDSXcCc",
ret,
"text/html",
X_USER_AGENT );
/* - PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net>
* added X-User-Agent header
*/
http_MakeMessage( &headers, 1, 1, "RTDSXcCc", ret,
"text/html", X_USER_AGENT );
/* - PATCH END --- */
http_SendMessage( info, &timeout, "b", headers.buf,
headers.length );
@@ -1757,8 +1754,9 @@ web_server_callback( IN http_parser_t * parser,
}
}
UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, HTTP, __FILE__, __LINE__,
"webserver: request processed...\n" );
)
membuffer_destroy( &headers );
membuffer_destroy( &filename );

View File

@@ -34,11 +34,8 @@
************************************************************************/
#ifdef __FreeBSD__
#include <osreldate.h>
#if __FreeBSD_version < 601103
#include <lwres/netdb.h>
#endif
#endif
#include "config.h"
#include "uri.h"
@@ -128,7 +125,7 @@ is_unreserved( char in )
* Note :
************************************************************************/
int
is_escaped( const char *in )
is_escaped( char *in )
{
if( ( in[0] == '%' ) && ( isxdigit( in[1] ) ) && isxdigit( in[2] ) ) {
@@ -160,7 +157,7 @@ is_escaped( const char *in )
int
replace_escaped( char *in,
int index,
size_t *max )
int *max )
{
int tempInt = 0;
char tempChar = 0;
@@ -207,7 +204,7 @@ replace_escaped( char *in,
* Note :
************************************************************************/
int
parse_uric( const char *in,
parse_uric( char *in,
int max,
token * out )
{
@@ -367,20 +364,16 @@ free_URL_list( URL_list * list )
* uri_type *in ; URI object
*
* Description : Function useful in debugging for printing a parsed uri.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
#ifdef DEBUG
void print_uri( uri_type *in )
{
DBGONLY( void print_uri( uri_type * in ) {
print_token( &in->scheme );
print_token( &in->hostport.text );
print_token( &in->pathquery );
print_token( &in->fragment );
}
#endif
print_token( &in->pathquery ); print_token( &in->fragment );} )
/************************************************************************
* Function : print_token
@@ -389,23 +382,20 @@ void print_uri( uri_type *in )
* token * in ; token
*
* Description : Function useful in debugging for printing a token.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
#ifdef DEBUG
void print_token(token * in)
{
DBGONLY( void print_token( token * in ) {
int i = 0;
printf( "Token Size : %"PRIzu"\n\'", in->size );
printf( "Token Size : %d\n\'", in->size );
for( i = 0; i < in->size; i++ ) {
putchar( in->buff[i] );
}
putchar( '\'' );
putchar( '\n' );
}
#endif
putchar( in->buff[i] );}
putchar( '\'' ); putchar( '\n' );}
)
/************************************************************************
* Function : token_string_casecmp
@@ -424,10 +414,8 @@ void print_token(token * in)
*
* Note :
************************************************************************/
int token_string_casecmp(
token * in1,
char *in2 )
{
int token_string_casecmp( token * in1,
char *in2 ) {
int in2_length = strlen( in2 );
if( in1->size != in2_length )
@@ -508,12 +496,12 @@ token_cmp( token * in1,
************************************************************************/
int
parse_port( int max,
const char *port,
char *port,
unsigned short *out )
{
const char *finger = port;
const char *max_ptr = finger + max;
char *finger = port;
char *max_ptr = finger + max;
unsigned short temp = 0;
while( ( finger < max_ptr ) && ( isdigit( *finger ) ) ) {
@@ -545,7 +533,7 @@ parse_port( int max,
* Note :
************************************************************************/
int
parse_hostport( const char *in,
parse_hostport( char *in,
int max,
hostport_type * out )
{
@@ -623,16 +611,14 @@ parse_hostport( const char *in,
int errCode = 0;
//call gethostbyname_r (reentrant form of gethostbyname)
// TODO: Use autoconf to discover this rather than the
// platform-specific stuff below
#if defined(WIN32) || defined(__CYGWIN__)
#if defined(WIN32)
h=gethostbyname(temp_host_name);
#elif defined(SPARC_SOLARIS)
errCode = gethostbyname_r( temp_host_name,
&h,
temp_hostbyname_buff,
BUFFER_SIZE, &errcode );
#elif defined(__FreeBSD__) && __FreeBSD_version < 601103
#elif defined(__FreeBSD__)
h = lwres_gethostbyname_r( temp_host_name,
&h_buf,
temp_hostbyname_buff,
@@ -695,7 +681,7 @@ parse_hostport( const char *in,
* Note :
************************************************************************/
int
parse_scheme( const char *in,
parse_scheme( char *in,
int max,
token * out )
{
@@ -745,7 +731,7 @@ parse_scheme( const char *in,
************************************************************************/
int
remove_escaped_chars( INOUT char *in,
INOUT size_t *size )
INOUT int *size )
{
int i = 0;
@@ -799,8 +785,9 @@ remove_dots( char *in,
return UPNP_E_OUTOF_MEMORY;
Segments[0] = NULL;
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: before: %s\n", in );
DBGONLY( UpnpPrintf
( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: before: %s\n", in ) );
while( ( copyFrom < max ) && ( *copyFrom != '?' )
&& ( *copyFrom != '#' ) ) {
@@ -845,8 +832,9 @@ remove_dots( char *in,
}
( *copyTo ) = 0;
free( Segments );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: after: %s\n", in );
DBGONLY( UpnpPrintf
( UPNP_ALL, API, __FILE__, __LINE__,
"REMOVE_DOTS: after: %s\n", in ) );
return UPNP_E_SUCCESS;
}
@@ -1006,7 +994,7 @@ resolve_rel_url( char *base_url,
* Note :
************************************************************************/
int
parse_uri( const char *in,
parse_uri( char *in,
int max,
uri_type * out )
{
@@ -1086,8 +1074,8 @@ parse_uri_and_unescape( char *in,
if( ( ret = parse_uri( in, max, out ) ) != HTTP_SUCCESS )
return ret;
if( out->pathquery.size > 0 )
remove_escaped_chars( (char *)out->pathquery.buff, &out->pathquery.size );
remove_escaped_chars( out->pathquery.buff, &out->pathquery.size );
if( out->fragment.size > 0 )
remove_escaped_chars( (char *)out->fragment.buff, &out->fragment.size );
remove_escaped_chars( out->fragment.buff, &out->fragment.size );
return HTTP_SUCCESS;
}

View File

@@ -398,7 +398,7 @@ FindServiceEventURLPath( service_table * table,
************************************************************************/
service_info *
FindServiceControlURLPath( service_table * table,
const char *controlURLPath )
char *controlURLPath )
{
service_info *finger = NULL;
uri_type parsed_url;
@@ -433,7 +433,7 @@ FindServiceControlURLPath( service_table * table,
*
* Parameters :
* service_info *service ;Service whose information is to be printed
* Upnp_LogLevel level ; Debug level specified to the print function
* Dbg_Level level ; Debug level specified to the print function
* Dbg_Module module ; Debug module specified to the print function
*
* Description : For debugging purposes prints information from the
@@ -443,54 +443,38 @@ FindServiceControlURLPath( service_table * table,
*
* Note :
************************************************************************/
#ifdef DEBUG
void printService(
service_info *service,
Upnp_LogLevel level,
Dbg_Module module )
{
DBGONLY( void printService( service_info * service, Dbg_Level level,
Dbg_Module module ) {
if( service ) {
if( service->serviceType ) {
if( service->serviceType )
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceType: %s\n", service->serviceType );
}
if( service->serviceId ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceId: %s\n", service->serviceId );
}
if( service->SCPDURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"SCPDURL: %s\n", service->SCPDURL );
}
if( service->controlURL ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"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 ) {
if( service->serviceId )
UpnpPrintf( level, module, __FILE__, __LINE__, "serviceId: %s\n",
service->serviceId ); if( service->SCPDURL )
UpnpPrintf( level, module, __FILE__, __LINE__, "SCPDURL: %s\n",
service->SCPDURL ); if( service->controlURL )
UpnpPrintf( level, module, __FILE__, __LINE__, "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 {
else
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );
"Service is inactive\n" );}
}
}
}
#endif
)
/************************************************************************
* Function : printServiceList
*
* Parameters :
* service_info *service ; Service whose information is to be printed
* Upnp_LogLevel level ; Debug level specified to the print function
* Dbg_Level level ; Debug level specified to the print function
* Dbg_Module module ; Debug module specified to the print function
*
* Description : For debugging purposes prints information of each
@@ -500,55 +484,43 @@ void printService(
*
* Note :
************************************************************************/
#ifdef DEBUG
void printServiceList(
service_info * service,
Upnp_LogLevel level,
Dbg_Module module )
{
DBGONLY( void printServiceList( service_info * service,
Dbg_Level level,
Dbg_Module module ) {
while( service ) {
if( service->serviceType ) {
if( service->serviceType )
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceType: %s\n", service->serviceType );
}
if( service->serviceId ) {
if( service->serviceId )
UpnpPrintf( level, module, __FILE__, __LINE__,
"serviceId: %s\n", service->serviceId );
}
if( service->SCPDURL ) {
if( service->SCPDURL )
UpnpPrintf( level, module, __FILE__, __LINE__,
"SCPDURL: %s\n", service->SCPDURL );
}
if( service->controlURL ) {
if( service->controlURL )
UpnpPrintf( level, module, __FILE__, __LINE__,
"controlURL: %s\n", service->controlURL );
}
if( service->eventURL ) {
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 ) {
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 {
else
UpnpPrintf( level, module, __FILE__, __LINE__,
"Service is inactive\n" );
service = service->next;}
}
service = service->next;
}
}
#endif
)
/************************************************************************
* Function : printServiceTable
*
* Parameters :
* service_table * table ; Service table to be printed
* Upnp_LogLevel level ; Debug level specified to the print function
* Dbg_Level level ; Debug level specified to the print function
* Dbg_Module module ; Debug module specified to the print function
*
* Description : For debugging purposes prints the URL base of the table
@@ -559,18 +531,15 @@ void printServiceList(
*
* Note :
************************************************************************/
#ifdef DEBUG
void printServiceTable(
service_table * table,
Upnp_LogLevel level,
Dbg_Module module )
{
DBGONLY( void printServiceTable( service_table * table,
Dbg_Level level,
Dbg_Module module ) {
UpnpPrintf( level, module, __FILE__, __LINE__,
"URL_BASE: %s\n", table->URLBase );
UpnpPrintf( level, module, __FILE__, __LINE__,
"Services: \n" );
printServiceList( table->serviceList, level, module );}
#endif
)
/************************************************************************
* Function : freeService
@@ -695,7 +664,7 @@ DOMString
getElementValue( IXML_Node * node )
{
IXML_Node *child = ( IXML_Node * ) ixmlNode_getFirstChild( node );
const DOMString temp = NULL;
DOMString temp = NULL;
if( ( child != 0 ) && ( ixmlNode_getNodeType( child ) == eTEXT_NODE ) ) {
temp = ixmlNode_getNodeValue( child );
@@ -880,10 +849,12 @@ getServiceList( IXML_Node * node,
( !
( current->controlURL =
resolve_rel_url( URLBase, tempDOMString ) ) ) ) {
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING CONTROL URL" );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"CONTROL URL SET TO NULL IN SERVICE INFO" );
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING CONTROL URL" ) );
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"CONTROL URL SET TO NULL IN SERVICE INFO" ) );
current->controlURL = NULL;
fail = 0;
}
@@ -899,10 +870,12 @@ getServiceList( IXML_Node * node,
( !
( current->eventURL =
resolve_rel_url( URLBase, tempDOMString ) ) ) ) {
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING EVENT URL" );
UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__,
"EVENT URL SET TO NULL IN SERVICE INFO" );
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"BAD OR MISSING EVENT URL" ) );
DBGONLY( UpnpPrintf
( UPNP_INFO, GENA, __FILE__, __LINE__,
"EVENT URL SET TO NULL IN SERVICE INFO" ) );
current->eventURL = NULL;
fail = 0;
}
@@ -1153,8 +1126,9 @@ getServiceTable( IXML_Node * node,
}
}
if( ( out->serviceList = getAllServiceList(
root, out->URLBase, &out->endServiceList ) ) ) {
if( ( out->serviceList = getAllServiceList( root, out->URLBase,
&out->
endServiceList ) ) ) {
return 1;
}

View File

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

View File

@@ -95,17 +95,6 @@
#define MAX_THREADS 12
//@}
/** @name MAX_JOBS_TOTAL
* The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs
* that can be queued. If this limit is reached further jobs will be thrown
* to avoid memory exhaustion. The default value 100.
* (Added by Axis.)
*/
//@{
#define MAX_JOBS_TOTAL 100
//@}
/** @name DEFAULT_SOAP_CONTENT_LENGTH
* SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.
* This prevents devices that have a misbehaving web server to send
@@ -304,6 +293,27 @@
/** @name DBGONLY
The {\bf DBGONLY} macro allows code to be marked so that it
is only included in the DEBUG build and not the release. To
use this macro, put the code inside of the parentheses:
{\tt DBGONLY(int i;)}
This will cause a declaration of the integer {\tt i} only
in the debug build.
*/
//@{
#ifdef DEBUG
# define DBGONLY(x) x
#else
# define DBGONLY(x)
#endif
//@}
#undef EXCLUDE_WEB_SERVER
#undef EXCLUDE_MINISERVER
#ifdef INTERNAL_WEB_SERVER
@@ -338,6 +348,13 @@
# define CLIENTONLY(x)
#endif
#ifdef INCLUDE_DEVICE_APIS
# define DEVICEONLY(x) x
#else
# define DEVICEONLY(x)
#endif
//@}
#endif

View File

@@ -89,23 +89,22 @@
#define DEFAULT_TIMEOUT 1801
extern ithread_mutex_t GlobalClientSubscribeMutex;
//Lock the subscription
#define SubscribeLock() \
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Trying Subscribe Lock"); \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \
"Trying Subscribe Lock")); \
ithread_mutex_lock(&GlobalClientSubscribeMutex); \
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Subscribe Lock");
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe Lock");)
//Unlock the subscription
#define SubscribeUnlock() \
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Trying Subscribe UnLock"); \
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__, \
"Trying Subscribe UnLock")); \
ithread_mutex_unlock(&GlobalClientSubscribeMutex); \
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, \
"Subscribe UnLock");
DBGONLY(UpnpPrintf(UPNP_INFO,GENA,__FILE__,__LINE__,"Subscribe UnLock");)
//Structure to send NOTIFY message to all subscribed control points
@@ -162,13 +161,11 @@ EXTERN_C void genaCallback (IN http_parser_t *parser,
* return UPNP_E_SUCCESS if service response is OK else
* returns appropriate error
***************************************************************************/
#ifdef INCLUDE_CLIENT_APIS
EXTERN_C int genaSubscribe(
UpnpClient_Handle client_handle,
CLIENTONLY(
EXTERN_C int genaSubscribe(UpnpClient_Handle client_handle,
char * PublisherURL,
int * TimeOut,
Upnp_SID out_sid );
#endif
Upnp_SID out_sid );)
/************************************************************************
@@ -187,11 +184,8 @@ EXTERN_C int genaSubscribe(
* return UPNP_E_SUCCESS if service response is OK else
* returns appropriate error
***************************************************************************/
#ifdef INCLUDE_CLIENT_APIS
EXTERN_C int genaUnSubscribe(
UpnpClient_Handle client_handle,
const Upnp_SID in_sid);
#endif
CLIENTONLY(EXTERN_C int genaUnSubscribe(UpnpClient_Handle client_handle,
const Upnp_SID in_sid);)
/************************************************************************
* Function : genaUnregisterClient
@@ -208,9 +202,8 @@ EXTERN_C int genaUnSubscribe(
* Returns: int
* return UPNP_E_SUCCESS if successful else returns appropriate error
***************************************************************************/
#ifdef INCLUDE_CLIENT_APIS
EXTERN_C int genaUnregisterClient(UpnpClient_Handle client_handle);
#endif
CLIENTONLY(EXTERN_C int genaUnregisterClient(
UpnpClient_Handle client_handle);)
//server
/************************************************************************
@@ -225,9 +218,8 @@ EXTERN_C int genaUnregisterClient(UpnpClient_Handle client_handle);
* Returns: int
* returns UPNP_E_SUCCESS if successful else returns GENA_E_BAD_HANDLE
****************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
EXTERN_C int genaUnregisterDevice(UpnpDevice_Handle device_handle);
#endif
DEVICEONLY(EXTERN_C int genaUnregisterDevice(
UpnpDevice_Handle device_handle);)
/************************************************************************
@@ -250,12 +242,10 @@ EXTERN_C int genaUnregisterDevice(UpnpDevice_Handle device_handle);
* return UPNP_E_SUCCESS if service response is OK else
* returns appropriate error
***************************************************************************/
#ifdef INCLUDE_CLIENT_APIS
EXTERN_C int genaRenewSubscription(
CLIENTONLY(EXTERN_C int genaRenewSubscription(
IN UpnpClient_Handle client_handle,
IN const Upnp_SID in_sid,
OUT int * TimeOut);
#endif
OUT int * TimeOut);)
/****************************************************************************
* Function : genaNotifyAll
*
@@ -275,15 +265,13 @@ EXTERN_C int genaRenewSubscription(
* Note : This function is similar to the genaNotifyAllExt. The only difference
* is it takes event variable array instead of xml document.
****************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
EXTERN_C int genaNotifyAll(
UpnpDevice_Handle device_handle,
DEVICEONLY(EXTERN_C int genaNotifyAll(UpnpDevice_Handle device_handle,
char *UDN,
char *servId,
char **VarNames,
char **VarValues,
int var_count);
#endif
int var_count
);)
/****************************************************************************
* Function : genaNotifyAllExt
@@ -302,13 +290,8 @@ EXTERN_C int genaNotifyAll(
* Note : This function is similar to the genaNotifyAll. the only difference
* is it takes the document instead of event variable array
****************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
EXTERN_C int genaNotifyAllExt(
UpnpDevice_Handle device_handle,
char *UDN,
char *servId,
IN IXML_Document *PropSet);
#endif
DEVICEONLY(EXTERN_C int genaNotifyAllExt(UpnpDevice_Handle device_handle,
char *UDN, char *servId,IN IXML_Document *PropSet);)
/****************************************************************************
* Function : genaInitNotify
@@ -331,15 +314,13 @@ EXTERN_C int genaNotifyAllExt(
* Note : No other event will be sent to this control point before the
* intial state table dump.
****************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle,
DEVICEONLY(EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle,
IN char *UDN,
IN char *servId,
IN char **VarNames,
IN char **VarValues,
IN int var_count,
IN Upnp_SID sid);
#endif
IN Upnp_SID sid);)
/****************************************************************************
* Function : genaInitNotifyExt
@@ -361,14 +342,12 @@ EXTERN_C int genaInitNotify(IN UpnpDevice_Handle device_handle,
* Note : No other event will be sent to this control point before the
* intial state table dump.
****************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
EXTERN_C int genaInitNotifyExt(
DEVICEONLY(EXTERN_C int genaInitNotifyExt(
IN UpnpDevice_Handle device_handle,
IN char *UDN,
IN char *servId,
IN IXML_Document *PropSet,
IN Upnp_SID sid);
#endif
IN Upnp_SID sid);)
/************************************************************************

View File

@@ -96,7 +96,7 @@ typedef struct SOCKET_BUFFER{
//holds a pointer into a larger array
typedef struct TOKEN {
char * buff;
size_t size;
int size;
} token;
@@ -214,101 +214,37 @@ EXTERN_C ssize_t readLine(int fd, char *out, int max, int *timeout);
EXTERN_C int remove_dots(char * in, int size);
#ifdef DEBUG
EXTERN_C void print_http_request(
http_message *message,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_http_request(
http_message *message,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_http_request(http_message
*message,Dbg_Level DLevel,
Dbg_Module Module,char *DbgFileName,
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_http_response(
http_message *message,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_http_response(
http_message *message,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
DBGONLY(EXTERN_C void print_http_response(http_message *message,
Dbg_Level DLevel,
Dbg_Module Module,char *DbgFileName,
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_token(
token *in,
Upnp_LogLevel DLevel,
DBGONLY(EXTERN_C void print_token( token * in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_token(
token *in,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_status_line(
http_status *in,
Upnp_LogLevel DLevel,
DBGONLY(EXTERN_C void print_status_line(http_status *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_status_line(
http_status *in,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
int DbgLineNo););
#ifdef DEBUG
EXTERN_C void print_request_line(
http_request *in,
Upnp_LogLevel DLevel,
DBGONLY(EXTERN_C void print_request_line(http_request *in,
Dbg_Level 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
char *DbgFileName,int DbgLineNo));
#ifdef DEBUG
EXTERN_C void print_uri(
uri_type *in,
Upnp_LogLevel DLevel,
DBGONLY(EXTERN_C void print_uri( uri_type *in,
Dbg_Level DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo);
#else
static inline void print_uri(
uri_type *in,
Upnp_LogLevel DLevel,
Dbg_Module Module,
char *DbgFileName,
int DbgLineNo) {}
#endif
int DbgLineNo););
#endif

View File

@@ -456,8 +456,6 @@ int raw_to_int( IN memptr* raw_value, int base );
*
* Description: Find a substring from raw character string buffer
*
* Side effects: raw_value is transformed to lowercase.
*
* Returns:
* int - index at which the substring is found.
************************************************************************/
@@ -488,11 +486,7 @@ const char* method_to_str( IN http_method_t method );
* Returns:
* void
************************************************************************/
#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
} // extern "C"
@@ -500,4 +494,3 @@ static UPNP_INLINE void print_http_headers( IN http_message_t *hmsg ) {}
#endif // GENLIB_NET_HTTP_HTTPPARSER_H

View File

@@ -475,7 +475,6 @@ int http_SendStatusResponse( IN SOCKINFO *info, IN int http_status_code,
* memory ptr
* 'c': (no args) appends CRLF "\r\n"
* '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
* 'D': (no args) appends HTTP DATE: header
* 'S': (no args) appends HTTP SERVER: header

View File

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

View File

@@ -51,7 +51,8 @@ typedef struct // memptr
// note: Total length/capacity should not exceed MAX_INT
typedef struct // membuffer
{
char *buf; // mem buffer; must not write beyond buf[length-1] (read/write)
char *buf; // mem buffer; must not write
// beyond buf[length-1] (read/write)
size_t length; // length of buffer (read-only)
size_t capacity; // total allocated memory (read-only)
size_t size_inc; // used to increase size; MUST be > 0; (read/write)
@@ -147,7 +148,8 @@ int memptr_cmp_nocase( IN memptr* m, IN const char* s );
*
* Note :
************************************************************************/
int membuffer_set_size( INOUT membuffer* m, IN size_t new_length );
int membuffer_set_size( INOUT membuffer* m,
IN size_t new_length );
/************************************************************************
* Function : membuffer_init
@@ -198,7 +200,8 @@ void membuffer_destroy( INOUT membuffer* m );
*
* Note :
************************************************************************/
int membuffer_assign( INOUT membuffer* m, IN const void* buf, IN size_t buf_len );
int membuffer_assign( INOUT membuffer* m, IN const void* buf,
IN size_t buf_len );
/************************************************************************
* Function : membuffer_assign_str
@@ -234,7 +237,8 @@ int membuffer_assign_str( INOUT membuffer* m, IN const char* c_str );
*
* Note :
************************************************************************/
int membuffer_append( INOUT membuffer* m, IN const void* buf, IN size_t buf_len );
int membuffer_append( INOUT membuffer* m, IN const void* buf,
IN size_t buf_len );
/************************************************************************
* Function : membuffer_append_str
@@ -272,7 +276,8 @@ int membuffer_append_str( INOUT membuffer* m, IN const char* c_str );
*
* Note :
************************************************************************/
int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, int index );
int membuffer_insert( INOUT membuffer* m, IN const void* buf,
IN size_t buf_len, int index );
/************************************************************************
@@ -293,7 +298,8 @@ int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len,
*
* Note :
************************************************************************/
void membuffer_delete( INOUT membuffer* m, IN int index, IN size_t num_bytes );
void membuffer_delete( INOUT membuffer* m, IN int index,
IN size_t num_bytes );
/************************************************************************
@@ -330,7 +336,8 @@ char* membuffer_detach( INOUT membuffer* m );
* Note : 'new_buf' must be allocted using malloc or realloc so
* that it can be freed using free()
************************************************************************/
void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len );
void membuffer_attach( INOUT membuffer* m, IN char* new_buf,
IN size_t buf_len );
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus

View File

@@ -88,11 +88,7 @@ void SetHTTPGetCallback( MiniServerCallback callback );
*
* Note :
************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
void SetSoapCallback( MiniServerCallback callback );
#else
static inline void SetSoapCallback( MiniServerCallback callback ) {}
#endif
/************************************************************************
* Function : SetGenaCallback

View File

@@ -47,7 +47,7 @@ extern "C" {
#define SID_SIZE 41
#ifdef INCLUDE_DEVICE_APIS
DEVICEONLY(
typedef struct SUBSCRIPTION {
Upnp_SID sid;
@@ -73,7 +73,6 @@ typedef struct SERVICE_INFO {
struct SERVICE_INFO *next;
} service_info;
typedef struct SERVICE_TABLE {
DOMString URLBase;
service_info *serviceList;
@@ -247,14 +246,14 @@ service_info * FindServiceEventURLPath( service_table *table,
* Note :
************************************************************************/
service_info * FindServiceControlURLPath( service_table *table,
const char * controlURLPath);
char * controlURLPath);
/************************************************************************
* Function : printService
*
* Parameters :
* service_info *service ;Service whose information is to be printed
* Upnp_LogLevel level ; Debug level specified to the print function
* Dbg_Level level ; Debug level specified to the print function
* Dbg_Module module ; Debug module specified to the print function
*
* Description : For debugging purposes prints information from the
@@ -264,24 +263,16 @@ service_info * FindServiceControlURLPath( service_table *table,
*
* Note :
************************************************************************/
#ifdef DEBUG
void printService(
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
DBGONLY(void printService(service_info *service,Dbg_Level
level,
Dbg_Module module));
/************************************************************************
* Function : printServiceList
*
* Parameters :
* service_info *service ; Service whose information is to be printed
* Upnp_LogLevel level ; Debug level specified to the print function
* Dbg_Level level ; Debug level specified to the print function
* Dbg_Module module ; Debug module specified to the print function
*
* Description : For debugging purposes prints information of each
@@ -291,24 +282,15 @@ static UPNP_INLINE void printService(
*
* Note :
************************************************************************/
#ifdef DEBUG
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
DBGONLY(void printServiceList(service_info *service,
Dbg_Level level, Dbg_Module module));
/************************************************************************
* Function : printServiceTable
*
* Parameters :
* service_table * table ; Service table to be printed
* Upnp_LogLevel level ; Debug level specified to the print function
* Dbg_Level level ; Debug level specified to the print function
* Dbg_Module module ; Debug module specified to the print function
*
* Description : For debugging purposes prints the URL base of the table
@@ -319,17 +301,9 @@ static UPNP_INLINE void printServiceList(
*
* Note :
************************************************************************/
#ifdef DEBUG
void printServiceTable(
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
DBGONLY(void printServiceTable(service_table *
table,Dbg_Level
level,Dbg_Module module));
/************************************************************************
* Function : freeService
@@ -477,11 +451,10 @@ int getSubElement(const char *element_name, IXML_Node *node,
IXML_Node **out);
#endif /* INCLUDE_DEVICE_APIS */
) /* DEVICEONLY */
#ifdef __cplusplus
}
#endif
#endif /* _SERVICE_TABLE */

View File

@@ -80,7 +80,7 @@ typedef enum SsdpCmdType{SSDP_ERROR=-1,
#define SSDP_IP "239.255.255.250"
#define SSDP_PORT 1900
#define NUM_TRY 3
#define NUM_COPY 1
#define NUM_COPY 2
#define THREAD_LIMIT 50
#define COMMAND_LEN 300
@@ -211,15 +211,8 @@ int Make_Socket_NoBlocking (int sock);
* Returns: void *
* 1 if successful else appropriate error
***************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
void ssdp_handle_device_request(
IN http_message_t* hmsg,
void ssdp_handle_device_request( IN http_message_t* hmsg,
IN struct sockaddr_in* dest_addr );
#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
@@ -241,8 +234,7 @@ static inline void ssdp_handle_device_request(
* Returns: void
*
***************************************************************************/
void ssdp_handle_ctrlpt_msg(
IN http_message_t* hmsg,
void ssdp_handle_ctrlpt_msg( IN http_message_t* hmsg,
IN struct sockaddr_in* dest_addr,
IN xboolean timeout,
IN void* cookie );
@@ -334,10 +326,12 @@ int ssdp_request_type(IN char * cmd, OUT SsdpEvent * Evt);
* Function : SearchByTarget
*
* Parameters:
* IN int Mx:Number of seconds to wait, to collect all the responses.
* IN int Mx:Number of seconds to wait, to collect all the
* responses.
* char *St: Search target.
* 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:
* This function creates and send the search request for a specific URL.
@@ -353,9 +347,10 @@ int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie);
* Parameters:
* IN char * DevType : type of the device
* IN int RootDev: flag to indicate if the device is root device
* IN char *Udn :
* IN char *Location: Location URL.
* IN int Duration : Service duration in sec.
* IN char * nt : value of NT
* IN char * usn :
* IN char * location :Location URL.
* IN int duration :Service duration in sec.
*
* Description:
* This function creates the device advertisement request based on
@@ -364,12 +359,8 @@ int SearchByTarget(IN int Mx, IN char *St, IN void *Cookie);
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int DeviceAdvertisement(
IN char *DevType,
IN int RootDev,
IN char *Udn,
IN char *Location,
IN int Duration);
int DeviceAdvertisement(IN char * DevType, int RootDev,char * Udn,
IN char * Location, IN int Duration);
/************************************************************************
@@ -390,8 +381,7 @@ int DeviceAdvertisement(
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int DeviceShutdown(
IN char *DevType,
int DeviceShutdown( IN char * DevType,
IN int RootDev,
IN char * Udn,
IN char * _Server,
@@ -408,7 +398,7 @@ int DeviceShutdown(
* IN char * Udn: Device UDN
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
*
* Description:
* This function creates the reply packet based on the input parameter,
* and send it to the client address given in its input parameter DestAddr.
@@ -416,8 +406,7 @@ int DeviceShutdown(
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int DeviceReply(
IN struct sockaddr_in * DestAddr,
int DeviceReply(IN struct sockaddr_in * DestAddr,
IN char *DevType,
IN int RootDev,
IN char * Udn,
@@ -443,8 +432,7 @@ int DeviceReply(
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int SendReply(
IN struct sockaddr_in * DestAddr,
int SendReply(IN struct sockaddr_in * DestAddr,
IN char *DevType,
IN int RootDev,
IN char * Udn,
@@ -460,16 +448,16 @@ int SendReply(
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
*
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int ServiceAdvertisement(
IN char *Udn,
int ServiceAdvertisement( IN char * Udn,
IN char * ServType,
IN char * Location,
IN int Duration);
@@ -484,16 +472,16 @@ int ServiceAdvertisement(
* IN char *Server: Not used
* IN char * Location: Location of Device description document.
* IN int Duration :Life time of this device.
*
* Description:
* This function creates the advertisement packet based
* on the input parameter, and send it to the multicast channel.
*
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int ServiceReply(
IN struct sockaddr_in *DestAddr,
int ServiceReply(IN struct sockaddr_in *DestAddr,
IN char * ServType,
IN char * Udn,
IN char * Location,
@@ -507,7 +495,7 @@ int ServiceReply(
* IN char *ServType: Service Type.
* IN char * Location: Location of Device description document.
* IN int Duration :Service duration in sec.
*
* Description:
* This function creates a HTTP service shutdown request packet
* and sent it to the multicast channel through RequestHandler.
@@ -515,9 +503,7 @@ int ServiceReply(
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int ServiceShutdown(
IN char *Udn,
IN char *ServType,
int ServiceShutdown( IN char * Udn, IN char * ServType,
IN char * Location,
IN int Duration);
@@ -541,8 +527,7 @@ void *advertiseAndReplyThread(IN void * data);
* Function : AdvertiseAndReply
*
* Parameters:
* IN int AdFlag: -1 = Send shutdown,
* 0 = send reply,
* IN int AdFlag: -1 = Send shutdown, 0 = send reply,
* 1 = Send Advertisement
* IN UpnpDevice_Handle Hnd: Device handle
* IN enum SsdpSearchType SearchType:Search type for sending replies
@@ -558,8 +543,7 @@ void *advertiseAndReplyThread(IN void * data);
* Returns: int
* UPNP_E_SUCCESS if successful else appropriate error
***************************************************************************/
int AdvertiseAndReply(
IN int AdFlag,
int AdvertiseAndReply(IN int AdFlag,
IN UpnpDevice_Handle Hnd,
IN enum SsdpSearchType SearchType,
IN struct sockaddr_in *DestAddr,

View File

@@ -38,9 +38,10 @@
#ifndef WIN32
#include <sys/socket.h>
#else
typedef int socklen_t;
#define XINLINE
#define socklen_t int
#define EAFNOSUPPORT 97
#endif
#endif // GENLIB_NET_UNIXUTIL_H

View File

@@ -71,46 +71,33 @@ struct Handle_Info
Upnp_FunPtr Callback; // Callback function pointer.
char * Cookie;
// Device Only
#ifdef INCLUDE_DEVICE_APIS
char DescURL[LINE_SIZE]; // URL for the use of SSDP
char DescXML[LINE_SIZE]; // XML file path for device
DEVICEONLY(char DescURL[LINE_SIZE];) // URL for the use of SSDP
DEVICEONLY(char DescXML[LINE_SIZE];) // XML file path for device
//description
int MaxAge; // Advertisement timeout
IXML_Document *DescDocument;// Description parsed in
DEVICEONLY(int MaxAge;) // Advertisement timeout
DEVICEONLY(IXML_Document *DescDocument;) // Description parsed in
//terms of DOM document
IXML_NodeList *DeviceList; // List of devices in the
DEVICEONLY(IXML_NodeList *DeviceList;) // List of devices in the
//description document
IXML_NodeList *ServiceList; // List of services in the
DEVICEONLY(IXML_NodeList *ServiceList;) // List of services in the
// description document
service_table ServiceTable; //table holding subscriptions and
DEVICEONLY(service_table ServiceTable;) //table holding subscriptions and
//URL information
int MaxSubscriptions;
int MaxSubscriptionTimeOut;
#endif
DEVICEONLY(int MaxSubscriptions;)
DEVICEONLY(int MaxSubscriptionTimeOut;)
//Client only
#ifdef INCLUDE_CLIENT_APIS
client_subscription *ClientSubList; //client subscription list
LinkedList SsdpSearchList; // active ssdp searches
#endif
CLIENTONLY(client_subscription * ClientSubList;) //client subscription list
CLIENTONLY(LinkedList SsdpSearchList;) // active ssdp searches
int aliasInstalled; // 0 = not installed; otherwise installed
} ;
extern ithread_mutex_t GlobalHndMutex;
Upnp_Handle_Type GetHandleInfo(int Hnd, struct Handle_Info **HndInfo);
#define HandleLock() \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Trying Lock"); \
ithread_mutex_lock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "LOCK");
#define HandleUnlock() \
UpnpPrintf(UPNP_INFO, API,__FILE__, __LINE__, "Trying Unlock"); \
ithread_mutex_unlock(&GlobalHndMutex); \
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__, "Unlock");
#define HandleLock() DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Trying Lock")); ithread_mutex_lock(&GlobalHndMutex); DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"LOCK"));
#define HandleUnlock() DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Trying Unlock")); ithread_mutex_unlock(&GlobalHndMutex); DBGONLY(UpnpPrintf(UPNP_INFO,API,__FILE__,__LINE__,"Unlock"));
Upnp_Handle_Type GetClientHandleInfo(int *client_handle_out,
struct Handle_Info **HndInfo);
Upnp_Handle_Type GetDeviceHandleInfo(int *device_handle_out,
@@ -124,7 +111,7 @@ extern unsigned short LOCAL_PORT;
extern TimerThread gTimerThread;
extern ThreadPool gRecvThreadPool;
extern ThreadPool gSendThreadPool;
extern ThreadPool gMiniServerThreadPool;
typedef enum {
SUBSCRIBE,

View File

@@ -86,8 +86,8 @@ enum uriType { absolute, relative };
/* Buffer used in parsinghttp messages, urls, etc. generally this simply
* holds a pointer into a larger array */
typedef struct TOKEN {
const char *buff;
size_t size;
char * buff;
int size;
} token;
@@ -124,7 +124,7 @@ typedef struct URL_LIST {
* Parameters :
* char * in ; string of characters
* int index ; index at which to start checking the characters
* size_t *max ;
* int *max ;
*
* Description : Replaces an escaped sequence with its unescaped version
* 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
* end of the string.
************************************************************************/
int replace_escaped(char * in, int index, size_t *max);
int replace_escaped(char * in, int index, int *max);
/************************************************************************
* Function : copy_URL_list
@@ -182,16 +182,13 @@ void free_URL_list(URL_list * list);
* uri_type *in ; URI object
*
* Description : Function useful in debugging for printing a parsed uri.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
#ifdef DEBUG
void print_uri(uri_type *in);
#else
static UPNP_INLINE void print_uri(uri_type *in) {}
#endif
DBGONLY(void print_uri( uri_type *in);)
/************************************************************************
* Function : print_token
@@ -200,16 +197,13 @@ static UPNP_INLINE void print_uri(uri_type *in) {}
* token * in ;
*
* Description : Function useful in debugging for printing a token.
* Compiled out with DBGONLY macro.
*
* Return : void ;
*
* Note :
************************************************************************/
#ifdef DEBUG
void print_token( token * in);
#else
static UPNP_INLINE void print_token(token * in) {}
#endif
/************************************************************************
* Function : token_string_casecmp
@@ -282,7 +276,7 @@ int token_cmp( token *in1, token *in2);
*
* Note :
************************************************************************/
int parse_port(int max, const char *port, unsigned short int *out);
int parse_port(int max, char * port, unsigned short int * out);
/************************************************************************
* Function : parse_hostport
@@ -302,14 +296,14 @@ int parse_port(int max, const char *port, unsigned short int *out);
*
* Note :
************************************************************************/
int parse_hostport(const char *in, int max, hostport_type *out );
int parse_hostport( char* in, int max, hostport_type *out );
/************************************************************************
* Function : remove_escaped_chars
*
* Parameters :
* INOUT char *in ; string of characters to be modified
* INOUT size_t *size ; size limit for the number of characters
* INOUT int *size ; size limit for the number of characters
*
* Description : removes http escaped characters such as: "%20" and
* replaces them with their character representation. i.e.
@@ -321,7 +315,7 @@ int parse_hostport(const char *in, int max, hostport_type *out );
*
* Note :
************************************************************************/
int remove_escaped_chars(char *in, size_t *size);
int remove_escaped_chars(char *in,int *size);
/************************************************************************
* Function : remove_dots
@@ -397,7 +391,7 @@ char * resolve_rel_url( char * base_url, char * rel_url);
*
* Note :
************************************************************************/
int parse_uri(const char * in, int max, uri_type * out);
int parse_uri( char * in, int max, uri_type * out);
/************************************************************************
* Function : parse_uri_and_unescape

View File

@@ -47,6 +47,12 @@
#endif
#ifdef NO_DEBUG
#define DBG(x)
#else
#define DBG(x) x
#endif
#define GEMD_OUT_OF_MEMORY -1
#define EVENT_TIMEDOUT -2
#define EVENT_TERMINATE -3
@@ -136,10 +142,14 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen
#endif
//////////////////////////////////
// C specific
#ifndef __cplusplus
#ifdef WIN32
#ifndef WIN32
#define XINLINE inline
#else
#ifndef S_ISREG
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif
@@ -153,11 +163,10 @@ void linecopylen( OUT char dest[LINE_SIZE], IN const char* src, IN size_t srclen
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define sleep(a) Sleep((a)*1000)
#define sleep Sleep
#define usleep(a) Sleep((a)/1000)
#endif
#endif // __cplusplus
#endif /* GENLIB_UTIL_UTIL_H */

View File

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

View File

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

View File

@@ -85,7 +85,7 @@ const char *ContentTypeHeader =
* 0 if successful else returns appropriate error.
* Note :
****************************************************************************/
static UPNP_INLINE int
static XINLINE int
get_request_type( IN http_message_t * request,
OUT memptr * action_name )
{
@@ -189,7 +189,7 @@ send_error_response( IN SOCKINFO * info,
IN const char *err_msg,
IN http_message_t * hmsg )
{
off_t content_length;
int content_length;
int timeout_secs = SOAP_TIMEOUT;
int major,
minor;
@@ -228,9 +228,9 @@ send_error_response( IN SOCKINFO * info,
// make headers
membuffer_init( &headers );
if (http_MakeMessage(
&headers, major, minor,
"RNsDsSXcc" "sssss",
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
if( http_MakeMessage( &headers, major, minor,
"RNsDsSXc" "sssss",
500,
content_length,
ContentTypeHeader,
@@ -241,6 +241,7 @@ send_error_response( IN SOCKINFO * info,
membuffer_destroy( &headers );
return; // out of mem
}
/*-- PATCH END - */
// send err msg
http_SendMessage( info, &timeout_secs, "b",
headers.buf, headers.length );
@@ -262,16 +263,17 @@ send_error_response( IN SOCKINFO * info,
*
* Note :
****************************************************************************/
static UPNP_INLINE void
static XINLINE void
send_var_query_response( IN SOCKINFO * info,
IN const char *var_value,
IN http_message_t * hmsg )
{
off_t content_length;
int content_length;
int timeout_secs = SOAP_TIMEOUT;
int major;
int minor;
int major,
minor;
const char *start_body =
// "<?xml version=\"1.0\"?>\n" required??
"<s:Envelope "
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n"
@@ -295,8 +297,8 @@ send_var_query_response( IN SOCKINFO * info,
// make headers
membuffer_init( &response );
if (http_MakeMessage(
&response, major, minor,
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
if( http_MakeMessage( &response, major, minor,
"RNsDsSXcc" "sss",
HTTP_OK,
content_length,
@@ -307,6 +309,7 @@ send_var_query_response( IN SOCKINFO * info,
membuffer_destroy( &response );
return; // out of mem
}
/* -- PATCH END - */
// send msg
http_SendMessage( info, &timeout_secs, "b",
@@ -326,12 +329,12 @@ send_var_query_response( IN SOCKINFO * info,
* Description : This function separates the action node from
* the root DOM node.
*
* Return : static UPNP_INLINE int
* Return : static XINLINE int
* 0 if successful, or -1 if fails.
*
* Note :
****************************************************************************/
static UPNP_INLINE int
static XINLINE int
get_action_node( IN IXML_Document * TempDoc,
IN char *NodeName,
OUT IXML_Document ** RespNode )
@@ -344,8 +347,9 @@ get_action_node( IN IXML_Document * TempDoc,
int ret_code = -1; // error, by default
IXML_NodeList *nl = NULL;
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"get_action_node(): node name =%s\n ", NodeName );
)
* RespNode = NULL;
@@ -599,13 +603,13 @@ get_device_info( IN http_message_t * request,
service_info *serv_info;
char save_char;
int ret_code = -1; // error by default
const char *control_url;
char *control_url;
char *actionName = NULL;
// null-terminate pathquery of url
control_url = request->uri.pathquery.buff;
save_char = control_url[request->uri.pathquery.size];
((char *)control_url)[request->uri.pathquery.size] = '\0';
control_url[request->uri.pathquery.size] = '\0';
HandleLock( );
@@ -662,7 +666,7 @@ get_device_info( IN http_message_t * request,
ret_code = 0;
error_handler:
((char *)control_url)[request->uri.pathquery.size] = save_char; // restore
control_url[request->uri.pathquery.size] = save_char; // restore
HandleUnlock( );
return ret_code;
}
@@ -681,7 +685,7 @@ get_device_info( IN http_message_t * request,
*
* Note :
****************************************************************************/
static UPNP_INLINE void
static XINLINE void
send_action_response( IN SOCKINFO * info,
IN IXML_Document * action_resp,
IN http_message_t * request )
@@ -691,7 +695,7 @@ send_action_response( IN SOCKINFO * info,
int major,
minor;
int err_code;
off_t content_length;
int content_length;
int ret_code;
int timeout_secs = SOAP_TIMEOUT;
static char *start_body =
@@ -713,22 +717,17 @@ send_action_response( IN SOCKINFO * info,
goto error_handler;
}
content_length =
strlen( start_body ) +
strlen( xml_response ) +
content_length = strlen( start_body ) + strlen( xml_response ) +
strlen( end_body );
// make headers
if (http_MakeMessage(
&headers, major, minor,
"RNsDsSXcc",
HTTP_OK, // status code
content_length,
ContentTypeHeader,
"EXT:\r\n",
X_USER_AGENT) != 0 ) {
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
if( http_MakeMessage( &headers, major, minor, "RNsDsSXcc", HTTP_OK, // status code
content_length, ContentTypeHeader, "EXT:\r\n", X_USER_AGENT // EXT header
) != 0 ) {
goto error_handler;
}
/* -- PATCH END - */
// send whole msg
ret_code = http_SendMessage( info, &timeout_secs, "bbbb",
@@ -737,11 +736,11 @@ send_action_response( IN SOCKINFO * info,
xml_response, strlen( xml_response ),
end_body, strlen( end_body ) );
if( ret_code != 0 ) {
DBGONLY( if( ret_code != 0 ) {
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Failed to send response: err code = %d\n",
ret_code );
}
ret_code );}
)
err_code = 0;
@@ -769,7 +768,7 @@ error_handler:
* returns 0 if successful else returns -1.
* Note :
****************************************************************************/
static UPNP_INLINE int
static XINLINE int
get_var_name( IN IXML_Document * TempDoc,
OUT char *VarName )
{
@@ -779,7 +778,7 @@ get_var_name( IN IXML_Document * TempDoc,
IXML_Node *VarNameNode = NULL;
IXML_Node *VarNode = NULL;
const DOMString StNodeName = NULL;
const DOMString Temp = NULL;
DOMString Temp = NULL;
int ret_val = -1;
// Got the Envelop node here
@@ -813,9 +812,10 @@ get_var_name( IN IXML_Document * TempDoc,
Temp = ixmlNode_getNodeValue( VarNode );
linecopy( VarName, Temp );
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Received query for variable name %s\n",
VarName );
)
ret_val = 0; // success
@@ -840,7 +840,7 @@ error_handler:
*
* Note :
****************************************************************************/
static UPNP_INLINE void
static XINLINE void
handle_query_variable( IN SOCKINFO * info,
IN http_message_t * request,
IN IXML_Document * xml_doc )
@@ -876,8 +876,8 @@ handle_query_variable( IN SOCKINFO * info,
// send event
soap_event_callback( UPNP_CONTROL_GET_VAR_REQUEST, &variable, cookie );
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Return from callback for var request\n" );
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Return from callback for var request\n" ) );
// validate, and handle result
if( variable.CurrentVal == NULL ) {
@@ -966,8 +966,8 @@ handle_invoke_action( IN SOCKINFO * info,
action.ErrCode = UPNP_E_SUCCESS;
action.CtrlPtIPAddr = info->foreign_ip_addr;
UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Calling Callback\n" );
DBGONLY( UpnpPrintf( UPNP_INFO, SOAP, __FILE__, __LINE__,
"Calling Callback\n" ) );
soap_event_callback( UPNP_CONTROL_ACTION_REQUEST, &action, cookie );

View File

@@ -365,9 +365,7 @@ ssdp_handle_ctrlpt_msg( IN http_message_t * hmsg,
* Returns: void
*
***************************************************************************/
#warning There are currently no uses of the function 'process_reply()' in the code.
#warning 'process_reply()' is a good candidate for removal.
static UPNP_INLINE void
static XINLINE void
process_reply( IN char *request_buf,
IN int buf_len,
IN struct sockaddr_in *dest_addr,
@@ -538,8 +536,9 @@ SearchByTarget( IN int Mx,
if( ReqBuf == NULL )
return UPNP_E_OUTOF_MEMORY;
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
">>> SSDP SEND >>>\n%s\n", ReqBuf );
)
timeTillRead = Mx;
@@ -590,22 +589,25 @@ SearchByTarget( IN int Mx,
if( select( gSsdpReqSocket + 1, NULL, &wrSet, NULL, NULL )
== UPNP_SOCKETERROR ) {
if( errno == EBADF ) {
DBGONLY( if( errno == EBADF ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler:An invalid file descriptor"
" was givenin one of the sets. \n" );
} else if( errno == EINTR ) {
" was givenin one of the sets. \n" );}
else
if( errno == EINTR ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: A non blocked "
"signal was caught. \n" );
} else if( errno == EINVAL ) {
"signal was caught. \n" );}
else
if( errno == EINVAL ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB :RequestHandler: n is negative. \n" );
} else if( errno == ENOMEM ) {
"SSDP_LIB :RequestHandler: n is negative. \n" );}
else
if( errno == ENOMEM ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB : RequestHandler:select was unable to "
"allocate memory for internal tables.\n" );
}
"allocate memory for internal tables.\n" );}
)
shutdown( gSsdpReqSocket, SD_BOTH );
UpnpCloseSocket( gSsdpReqSocket );
free( ReqBuf );

View File

@@ -95,7 +95,6 @@ advertiseAndReplyThread( IN void *data )
* Returns: void *
* 1 if successful else appropriate error
***************************************************************************/
#ifdef INCLUDE_DEVICE_APIS
void
ssdp_handle_device_request( IN http_message_t * hmsg,
IN struct sockaddr_in *dest_addr )
@@ -145,7 +144,7 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
maxAge = dev_info->MaxAge;
HandleUnlock( );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"ssdp_handle_device_request with Cmd %d SEARCH\n",
event.Cmd );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
@@ -157,7 +156,7 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"DeviceUuid = %s\n", event.UDN );
UpnpPrintf( UPNP_PACKET, API, __FILE__, __LINE__,
"ServiceType = %s\n", event.ServiceType );
"ServiceType = %s\n", event.ServiceType ); )
threadArg =
( SsdpSearchReply * ) malloc( sizeof( SsdpSearchReply ) );
@@ -191,7 +190,6 @@ ssdp_handle_device_request( IN http_message_t * hmsg,
TimerThreadSchedule( &gTimerThread, replyTime, REL_SEC, &job,
SHORT_TERM, NULL );
}
#endif
/************************************************************************
* Function : NewRequestHandler
@@ -222,9 +220,9 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
ReplySock = socket( AF_INET, SOCK_DGRAM, 0 );
if( ReplySock == UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP_LIB: New Request Handler:"
"Error in socket operation !!!\n" );
"Error in socket operation !!!\n" ) );
return UPNP_E_OUTOF_SOCKET;
}
@@ -236,22 +234,13 @@ NewRequestHandler( IN struct sockaddr_in *DestAddr,
for( Index = 0; Index < NumPacket; Index++ ) {
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
// reuqest."
//
// http://www.upnp.org/download/draft-goland-http-udp-04.txt
//
// So, NUM_COPY has been changed from 2 to 1.
NumCopy = 0;
while( NumCopy < NUM_COPY ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
">>> SSDP SEND >>>\n%s\n",
*( RqPacket + Index ) );
)
rc = sendto( ReplySock, *( RqPacket + Index ),
strlen( *( RqPacket + Index ) ),
0, ( struct sockaddr * )DestAddr, socklen );
@@ -306,16 +295,16 @@ CreateServicePacket( IN int msg_type,
*packet = NULL;
if( msg_type == MSGTYPE_REPLY ) {
ret_code = http_MakeMessage(
&buf, 1, 1,
"R" "sdc" "D" "sc" "ssc" "S" "Xc" "ssc" "sscc",
HTTP_OK,
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
ret_code = http_MakeMessage( &buf, 1, 1,
"R" "sdc" "D" "s" "ssc" "S" "Xc" "ssc"
"ssc" "c", HTTP_OK,
"CACHE-CONTROL: max-age=", duration,
"EXT:",
"LOCATION: ", location,
"EXT:\r\n", "LOCATION: ", location,
X_USER_AGENT,
"ST: ", nt,
"USN: ", usn);
"ST: ", nt, "USN: ", usn );
/* -- PATCH END - */
if( ret_code != 0 ) {
return;
}
@@ -331,17 +320,15 @@ CreateServicePacket( IN int msg_type,
// NOTE: The CACHE-CONTROL and LOCATION headers are not present in
// a shutdown msg, but are present here for MS WinMe interop.
ret_code = http_MakeMessage(
&buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc" "S" "Xc" "sscc",
HTTPMETHOD_NOTIFY, "*",
/* -- PATCH START - Sergey 'Jin' Bostandzhyan <jin_eld at users.sourceforge.net> */
ret_code = http_MakeMessage( &buf, 1, 1,
"Q" "sssdc" "sdc" "ssc" "ssc" "ssc"
"S" "Xc" "ssc" "c", HTTPMETHOD_NOTIFY, "*",
1, "HOST: ", SSDP_IP, ":", SSDP_PORT,
"CACHE-CONTROL: max-age=", duration,
"LOCATION: ", location,
"NT: ", nt,
"NTS: ", nts,
X_USER_AGENT,
"USN: ", usn );
"LOCATION: ", location, "NT: ", nt,
"NTS: ", nts, X_USER_AGENT, "USN: ", usn );
/* -- PATCH END - */
if( ret_code != 0 ) {
return;
}
@@ -389,8 +376,9 @@ DeviceAdvertisement( IN char *DevType,
char *msgs[3];
int ret_code;
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function SendDeviceAdvertisemenrt\n" );
)
DestAddr.sin_family = AF_INET;
DestAddr.sin_addr.s_addr = inet_addr( SSDP_IP );
@@ -783,8 +771,8 @@ DeviceShutdown( IN char *DevType,
Mil_Usn, Location, Duration, &msgs[0] );
}
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function DeviceShutdown\n" );
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"In function DeviceShutdown\n" ); )
// both root and sub-devices need to send these two messages
CreateServicePacket( MSGTYPE_SHUTDOWN, Udn, Udn,
Location, Duration, &msgs[1] );

View File

@@ -112,13 +112,13 @@ int AdvertiseAndReply( IN int AdFlag,
IXML_Node *tmpNode = NULL;
IXML_Node *tmpNode2 = NULL;
IXML_Node *textNode = NULL;
const DOMString tmpStr;
DOMString tmpStr;
char SERVER[200];
const DOMString dbgStr;
DBGONLY( const DOMString dbgStr;
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Inside AdvertiseAndReply with AdFlag = %d\n",
AdFlag );
AdFlag ); )
HandleLock( );
if( GetHandleInfo( Hnd, &SInfo ) != HND_DEVICE ) {
@@ -139,20 +139,24 @@ int AdvertiseAndReply( IN int AdFlag,
// parse the device list and send advertisements/replies
for( i = 0;; i++ ) {
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Entering new device list with i = %d\n\n", i );
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Entering new device list with i = %d\n\n",
i );
)
tmpNode = ixmlNodeList_item( SInfo->DeviceList, i );
if( tmpNode == NULL ) {
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting new device list with i = %d\n\n", i );
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting new device list with i = %d\n\n",
i );
)
break;
}
dbgStr = ixmlNode_getNodeName( tmpNode );
DBGONLY( dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Extracting device type once for %s\n",
dbgStr );
dbgStr ); )
// extract device type
ixmlNodeList_free( nodeList );
nodeList = NULL;
@@ -163,12 +167,13 @@ int AdvertiseAndReply( IN int AdFlag,
continue;
}
dbgStr = ixmlNode_getNodeName( tmpNode );
DBGONLY( dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting UDN for %s\n", dbgStr );
"Extracting UDN for %s\n", dbgStr ); )
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type\n" );
)
tmpNode2 = ixmlNodeList_item( nodeList, 0 );
if( tmpNode2 == NULL ) {
@@ -179,8 +184,9 @@ int AdvertiseAndReply( IN int AdFlag,
continue;
}
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type \n" );
)
tmpStr = ixmlNode_getNodeValue( textNode );
if( tmpStr == NULL ) {
@@ -192,41 +198,47 @@ int AdvertiseAndReply( IN int AdFlag,
continue;
}
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting device type = %s\n", devType );
if( tmpNode == NULL ) {
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"TempNode is NULL\n" );
}
"TempNode is NULL\n" );}
dbgStr = ixmlNode_getNodeName( tmpNode );
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Extracting UDN for %s\n", dbgStr );
"Extracting UDN for %s\n", dbgStr ); )
// extract UDN
ixmlNodeList_free( nodeList );
nodeList = NULL;
nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * )
tmpNode, "UDN" );
if( nodeList == NULL ) {
UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
)
continue;
}
tmpNode2 = ixmlNodeList_item( nodeList, 0 );
if( tmpNode2 == NULL ) {
UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
)
continue;
}
textNode = ixmlNode_getFirstChild( tmpNode2 );
if( textNode == NULL ) {
UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__,
__LINE__, "UDN not found!!!\n" );
)
continue;
}
tmpStr = ixmlNode_getNodeValue( textNode );
if( tmpStr == NULL ) {
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
"UDN not found!!!!\n" );
)
continue;
}
strcpy( UDNstr, tmpStr );
@@ -234,8 +246,9 @@ int AdvertiseAndReply( IN int AdFlag,
continue;
}
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Sending UDNStr = %s \n", UDNstr );
)
if( AdFlag ) {
// send the device advertisement
if( AdFlag == 1 ) {
@@ -265,16 +278,22 @@ int AdvertiseAndReply( IN int AdFlag,
{
if( DeviceUDN != NULL && strlen( DeviceUDN ) != 0 ) {
if( strcasecmp( DeviceUDN, UDNstr ) ) {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, API, __FILE__,
__LINE__,
"DeviceUDN=%s and search "
"UDN=%s did not match\n",
UDNstr, DeviceUDN );
)
break;
} else {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, API, __FILE__,
__LINE__,
"DeviceUDN=%s and search "
"UDN=%s MATCH\n", UDNstr,
DeviceUDN );
)
SendReply( DestAddr, devType, 0,
UDNstr, SInfo->DescURL,
defaultExp, 0 );
@@ -287,17 +306,24 @@ int AdvertiseAndReply( IN int AdFlag,
if( !strncasecmp
( DeviceType, devType,
strlen( DeviceType ) ) ) {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_INFO, API, __FILE__, __LINE__,
"DeviceType=%s and search devType=%s MATCH\n",
devType, DeviceType );
)
SendReply( DestAddr, devType, 0, UDNstr,
SInfo->DescURL, defaultExp, 1 );
} else {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
}
DBGONLY(
else
UpnpPrintf( UPNP_INFO, API, __FILE__,
__LINE__,
"DeviceType=%s and search devType=%s"
" DID NOT MATCH\n",
devType, DeviceType );
}
)
break;
}
default:
@@ -306,8 +332,9 @@ int AdvertiseAndReply( IN int AdFlag,
}
// send service advertisements for services corresponding
// to the same device
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Sending service Advertisement\n" );
)
tmpNode = ixmlNodeList_item( SInfo->ServiceList, i );
if( tmpNode == NULL ) {
@@ -318,8 +345,9 @@ int AdvertiseAndReply( IN int AdFlag,
nodeList = ixmlElement_getElementsByTagName( ( IXML_Element * )
tmpNode, "service" );
if( nodeList == NULL ) {
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"Service not found 3\n" );
)
continue;
}
for( j = 0;; j++ ) {
@@ -329,11 +357,15 @@ int AdvertiseAndReply( IN int AdFlag,
ixmlNodeList_free( tmpNodeList );
tmpNodeList = NULL;
tmpNodeList = ixmlElement_getElementsByTagName(
( IXML_Element *)tmpNode, "serviceType" );
tmpNodeList = ixmlElement_getElementsByTagName( ( IXML_Element
* ) tmpNode,
"serviceType" );
if( tmpNodeList == NULL ) {
UpnpPrintf( UPNP_CRITICAL, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, API, __FILE__, __LINE__,
"ServiceType not found \n" );
)
continue;
}
tmpNode2 = ixmlNodeList_item( tmpNodeList, 0 );
@@ -354,16 +386,19 @@ int AdvertiseAndReply( IN int AdFlag,
continue;
}
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"ServiceType = %s\n", servType );
)
if( AdFlag ) {
if( AdFlag == 1 ) {
ServiceAdvertisement( UDNstr, servType,
SInfo->DescURL, Exp );
} else { // AdFlag == -1
} else // AdFlag == -1
{
ServiceShutdown( UDNstr, servType,
SInfo->DescURL, Exp );
}
} else {
switch ( SearchType ) {
case SSDP_ALL:
@@ -398,8 +433,9 @@ int AdvertiseAndReply( IN int AdFlag,
ixmlNodeList_free( nodeList );
nodeList = NULL;
}
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
"Exiting AdvertiseAndReply : \n" );
)
HandleUnlock( );
@@ -641,7 +677,7 @@ free_ssdp_event_handler_data( void *the_data )
* Returns: xboolean
* returns TRUE if msg is valid else FALSE
***************************************************************************/
static UPNP_INLINE xboolean
static XINLINE xboolean
valid_ssdp_msg( IN http_message_t * hmsg )
{
memptr hdr_value;
@@ -683,7 +719,7 @@ valid_ssdp_msg( IN http_message_t * hmsg )
* Returns: int
* 0 if successful -1 if error
***************************************************************************/
static UPNP_INLINE int
static XINLINE int
start_event_handler( void *Data )
{
@@ -697,16 +733,18 @@ start_event_handler( void *Data )
if( status == PARSE_FAILURE ) {
if( parser->msg.method != HTTPMETHOD_NOTIFY ||
!parser->valid_ssdp_notify_hack ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP recvd bad msg code = %d\n",
status );
)
// ignore bad msg, or not enuf mem
goto error_handler;
}
// valid notify msg
} else if( status != PARSE_SUCCESS ) {
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
"SSDP recvd bad msg code = %d\n", status );
)
goto error_handler;
}
@@ -746,10 +784,14 @@ ssdp_event_handler_thread( void *the_data )
// send msg to device or ctrlpt
if( ( hmsg->method == HTTPMETHOD_NOTIFY ) ||
( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) {
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr,
FALSE, NULL ););
FALSE, NULL );
);
} else {
ssdp_handle_device_request( hmsg, &data->dest_addr );
DEVICEONLY( ssdp_handle_device_request( hmsg, &data->dest_addr );
);
}
// free data
@@ -821,16 +863,19 @@ readFromSSDPSocket( SOCKET socket )
if( byteReceived > 0 ) {
requestBuf[byteReceived] = '\0';
UpnpPrintf( UPNP_INFO, SSDP,
DBGONLY( UpnpPrintf( UPNP_INFO, SSDP,
__FILE__, __LINE__,
"Received response !!! "
"%s From host %s \n",
requestBuf,
inet_ntoa( clientAddr.sin_addr ) );
)
UpnpPrintf( UPNP_PACKET, SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_PACKET, SSDP,
__FILE__, __LINE__,
"Received multicast packet:"
"\n %s\n", requestBuf );
)
//add thread pool job to handle request
if( data != NULL ) {
data->parser.msg.msg.length += byteReceived;
@@ -846,6 +891,7 @@ readFromSSDPSocket( SOCKET socket )
free_ssdp_event_handler_data( data );
}
}
} else {
free_ssdp_event_handler_data( data );
}
@@ -876,13 +922,12 @@ get_ssdp_sockets( MiniServerSockArray * out )
struct ip_mreq ssdpMcastAddr;
struct sockaddr_in ssdpAddr;
int option = 1;
struct in_addr addr;
CLIENTONLY( if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in socket operation !!!\n" );
"Error in socket operation !!!\n" ); )
return UPNP_E_OUTOF_SOCKET;}
setsockopt( ssdpReqSock,
IPPROTO_IP,
@@ -892,9 +937,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) )
== UPNP_INVALID_SOCKET ) {
UpnpPrintf( UPNP_CRITICAL,
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;
@@ -904,9 +950,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEADDR,
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse addr !!!\n" );
)
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
shutdown( ssdpSock, SD_BOTH );
@@ -918,9 +965,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in set reuse port !!!\n" );
)
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
shutdown( ssdpSock, SD_BOTH );
@@ -937,9 +985,10 @@ get_ssdp_sockets( MiniServerSockArray * out )
if( bind
( ssdpSock, ( struct sockaddr * )&ssdpAddr,
sizeof( ssdpAddr ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in binding !!!\n" );
)
shutdown( ssdpSock, SD_BOTH );
UpnpCloseSocket( ssdpSock );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
@@ -948,39 +997,30 @@ get_ssdp_sockets( MiniServerSockArray * out )
}
memset( ( void * )&ssdpMcastAddr, 0, sizeof( struct ip_mreq ) );
ssdpMcastAddr.imr_interface.s_addr = inet_addr( LOCAL_HOST );
ssdpMcastAddr.imr_interface.s_addr = htonl( INADDR_ANY );
ssdpMcastAddr.imr_multiaddr.s_addr = inet_addr( SSDP_IP );
if( setsockopt( ssdpSock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
( char * )&ssdpMcastAddr,
sizeof( struct ip_mreq ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
DBGONLY( UpnpPrintf
( UPNP_CRITICAL, SSDP, __FILE__, __LINE__,
"Error in joining" " multicast group !!!\n" );
)
shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( ssdpSock );
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
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.
setsockopt( ssdpSock, IPPROTO_IP,
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
( char * )&option, sizeof( option ) ) != 0 ) {
UpnpPrintf( UPNP_CRITICAL,
DBGONLY( UpnpPrintf( UPNP_CRITICAL,
SSDP, __FILE__, __LINE__,
"Error in setting broadcast !!!\n" );
)
shutdown( ssdpSock, SD_BOTH );
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
UpnpCloseSocket( ssdpSock );

View File

@@ -62,7 +62,7 @@
*
* Note :
************************************************************************/
static UPNP_INLINE void
static XINLINE void
addrToString( IN const struct sockaddr_in *addr,
OUT char ipaddr_port[] )
{
@@ -87,7 +87,7 @@ addrToString( IN const struct sockaddr_in *addr,
*
* Note : 'newAlias' should be freed using free()
************************************************************************/
static UPNP_INLINE int
static XINLINE int
calc_alias( IN const char *alias,
IN const char *rootPath,
OUT char **newAlias )
@@ -148,7 +148,7 @@ calc_alias( IN const char *alias,
*
* Note :
************************************************************************/
static UPNP_INLINE int
static XINLINE int
calc_descURL( IN const char *ipPortStr,
IN const char *alias,
OUT char descURL[LINE_SIZE] )
@@ -168,8 +168,9 @@ calc_descURL( IN const char *ipPortStr,
strcat( descURL, ipPortStr );
strcat( descURL, alias );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"desc url: %s\n", descURL );
)
return UPNP_E_SUCCESS;
}
@@ -212,7 +213,7 @@ config_description_doc( INOUT IXML_Document * doc,
IXML_Node *rootNode = NULL;
IXML_Node *urlbase_node = NULL;
char *urlBaseStr = "URLBase";
const DOMString domStr = NULL;
DOMString domStr = NULL;
uri_type uri;
int err_code;
int len;
@@ -407,10 +408,12 @@ configure_urlbase( INOUT IXML_Document * doc,
goto error_handler;
}
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"desc url: %s\n", docURL );
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
)
DBGONLY( UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
"doc = %s\n", xml_str );
)
// store in web server
err_code =
web_server_set_alias( new_alias, xml_str, strlen( xml_str ),