Compare commits
130 Commits
last_svn_1
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
79aa205657 | ||
|
|
9a28fcc95b | ||
|
|
bfbd07cb40 | ||
|
|
255d5ee874 | ||
|
|
2c3bce13bd | ||
|
|
bda942b22a | ||
|
|
ed0ebe1588 | ||
|
|
a39f3a63c3 | ||
|
|
6e7a2bb2dc | ||
|
|
c21a67f2d1 | ||
|
|
c449fd1521 | ||
|
|
594c611a33 | ||
|
|
09f2b6ca30 | ||
|
|
9b3a0999a9 | ||
|
|
d8a27bca96 | ||
|
|
6bee05a517 | ||
|
|
2e96edcbc5 | ||
|
|
ef0aa38958 | ||
|
|
86159bc2a6 | ||
|
|
bd8d6cfc8b | ||
|
|
8434e1e936 | ||
|
|
2765bc39c5 | ||
|
|
75695fcaf1 | ||
|
|
5abd1a3b3e | ||
|
|
6c31683e29 | ||
|
|
d92e26779a | ||
|
|
5d6bcabd45 | ||
|
|
7c524df1d9 | ||
|
|
58c694f57d | ||
|
|
da7f3bf1c1 | ||
|
|
8651174861 | ||
|
|
2dd19e5894 | ||
|
|
e6c548f57a | ||
|
|
32cffb5bb5 | ||
|
|
2b30575ca5 | ||
|
|
d32212a6fd | ||
|
|
508b782c79 | ||
|
|
38d5e58e22 | ||
|
|
ee5bd670d4 | ||
|
|
fcb5e7c438 | ||
|
|
243cd41974 | ||
|
|
853cd32cfe | ||
|
|
f384e54fc6 | ||
|
|
9e12768cdb | ||
|
|
4b47e6a51d | ||
|
|
a5fb5edfc9 | ||
|
|
8bd32d330b | ||
|
|
00eb52cc85 | ||
|
|
ff006272b5 | ||
|
|
852c301c5c | ||
|
|
d270499cd8 | ||
|
|
6ac867bbb1 | ||
|
|
9052ca95be | ||
|
|
ef7edf6cf8 | ||
|
|
c65ec8a720 | ||
|
|
2d22e997e1 | ||
|
|
96dc968f18 | ||
|
|
8e846368e0 | ||
|
|
d6671c464f | ||
|
|
699dd3c82e | ||
|
|
9be360bcd1 | ||
|
|
593b8d0a2b | ||
|
|
890c1b6ef8 | ||
|
|
c127a3a87e | ||
|
|
bd5758186c | ||
|
|
cc472bc2cd | ||
|
|
6128296e5f | ||
|
|
d84c6a7e9f | ||
|
|
113ebd1f91 | ||
|
|
bf1450bf81 | ||
|
|
56b9c75056 | ||
|
|
2bdc9e075e | ||
|
|
923eee2393 | ||
|
|
f74746ff3f | ||
|
|
8401a59ed5 | ||
|
|
5b40cfa272 | ||
|
|
fcda28ba75 | ||
|
|
7cd434225f | ||
|
|
78e5ba89fa | ||
|
|
ebb8f209b0 | ||
|
|
73afd667e1 | ||
|
|
cc294a6cf1 | ||
|
|
458a9416c6 | ||
|
|
b9eeb89250 | ||
|
|
a6e68b481d | ||
|
|
a19a896e88 | ||
|
|
cdee5b7cde | ||
|
|
dec78c8ef1 | ||
|
|
fb62a5d42a | ||
|
|
a9b5081a08 | ||
|
|
3886a697b5 | ||
|
|
3dab2bd00a | ||
|
|
95f7a7eeef | ||
|
|
ca50c2153e | ||
|
|
c73d870f46 | ||
|
|
ab54cb3dc5 | ||
|
|
c33b11d09f | ||
|
|
4966423d96 | ||
|
|
2fb55d3874 | ||
|
|
d2238615e3 | ||
|
|
2fcbe6df52 | ||
|
|
467f9987a1 | ||
|
|
8fbecaee5e | ||
|
|
55d581481f | ||
|
|
a0b405f902 | ||
|
|
b37f9ac64a | ||
|
|
2dad42679d | ||
|
|
ea00f0f222 | ||
|
|
f3ae1b4116 | ||
|
|
67009170d1 | ||
|
|
2b399b1791 | ||
|
|
0bec9ec1ae | ||
|
|
25a4bd6d25 | ||
|
|
5755ac022f | ||
|
|
0158f52ee2 | ||
|
|
0db4a6beac | ||
|
|
575e5fc196 | ||
|
|
0e45dd9b8f | ||
|
|
ae516b6bd3 | ||
|
|
7137f6e261 | ||
|
|
92b241b560 | ||
|
|
2b3ab1799b | ||
|
|
4657e57766 | ||
|
|
21660334e4 | ||
|
|
97af8b6fdb | ||
|
|
934bd2682f | ||
|
|
b8e9628140 | ||
|
|
b3b7a91a64 | ||
|
|
ebc941f265 | ||
|
|
842a6ce5c8 |
105
.gitignore
vendored
Normal file
105
.gitignore
vendored
Normal file
@@ -0,0 +1,105 @@
|
||||
#
|
||||
# NOTE! Don't add files that are generated in specific
|
||||
# subdirectories here. Add them in the ".gitignore" file
|
||||
# in that subdirectory instead.
|
||||
#
|
||||
# NOTE! Please use 'git ls-files -i --exclude-standard'
|
||||
# command after changing this file, to see if there are
|
||||
# any tracked files which get ignored after the change.
|
||||
#
|
||||
# Normal rules
|
||||
#
|
||||
.*
|
||||
*.o
|
||||
*.o.*
|
||||
*.a
|
||||
*.s
|
||||
*.ko
|
||||
*.so
|
||||
*.so.dbg
|
||||
*.mod.c
|
||||
*.i
|
||||
*.lst
|
||||
*.symtypes
|
||||
*.order
|
||||
modules.builtin
|
||||
*.elf
|
||||
*.bin
|
||||
*.gz
|
||||
*.bz2
|
||||
*.lzma
|
||||
*.patch
|
||||
*.gcno
|
||||
|
||||
#
|
||||
# Top-level generic files
|
||||
#
|
||||
/tags
|
||||
/TAGS
|
||||
/linux
|
||||
/vmlinux
|
||||
/vmlinuz
|
||||
/System.map
|
||||
/Module.markers
|
||||
/Module.symvers
|
||||
|
||||
#
|
||||
# git files that we don't want to ignore even it they are dot-files
|
||||
#
|
||||
!.gitignore
|
||||
!.mailmap
|
||||
|
||||
#
|
||||
# Generated include files
|
||||
#
|
||||
include/config
|
||||
include/linux/version.h
|
||||
include/generated
|
||||
|
||||
# stgit generated dirs
|
||||
patches-*
|
||||
|
||||
# quilt's files
|
||||
patches
|
||||
series
|
||||
|
||||
# cscope files
|
||||
cscope.*
|
||||
ncscope.*
|
||||
|
||||
# gnu global files
|
||||
GPATH
|
||||
GRTAGS
|
||||
GSYMS
|
||||
GTAGS
|
||||
|
||||
*.orig
|
||||
*~
|
||||
\#*#
|
||||
*.lo
|
||||
*.la
|
||||
Makefile
|
||||
Makefile.in
|
||||
aclocal.m4
|
||||
autoconfig.h
|
||||
autoconfig.h.in
|
||||
autom4te.cache/
|
||||
build-aux/
|
||||
config.log
|
||||
config.status
|
||||
configure
|
||||
libtool
|
||||
libupnp.pc
|
||||
m4/libtool.m4
|
||||
m4/ltoptions.m4
|
||||
m4/ltsugar.m4
|
||||
m4/ltversion.m4
|
||||
m4/lt~obsolete.m4
|
||||
stamp-h1
|
||||
upnp/inc/stamp-h2
|
||||
upnp/inc/upnpconfig.h
|
||||
upnp/sample/tv_combo
|
||||
upnp/sample/tv_ctrlpt
|
||||
upnp/sample/tv_device
|
||||
docs/doxygen
|
||||
|
||||
399
ChangeLog
399
ChangeLog
@@ -1,7 +1,406 @@
|
||||
*******************************************************************************
|
||||
Version 1.6.10
|
||||
*******************************************************************************
|
||||
|
||||
2010-11-23 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Major bug fix in http_SendMessage.
|
||||
|
||||
Currently, http_SendMessage was not able to write to write a buffer
|
||||
due to a bad use of file_buf instead of buf. This bug was introduced by
|
||||
the 0197-Doxygen-reformating-compiler-warnings patch.
|
||||
|
||||
2010-11-23 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Returning the Sid in Upnp_Event_Subscribe.
|
||||
|
||||
Currently, Upnp_Event_Subscribe always contains an empty chain in the
|
||||
Sid parameter. This patch now saves the client Subscription ID in this
|
||||
parameter so Control Points can see and use the same SID in the
|
||||
Upnp_Event_Subscribe and in the Upnp_Event structures.
|
||||
|
||||
2010-11-22 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
Two fixes from Juergen Lock <nox(at)jelal.kn-bremen.de>:
|
||||
|
||||
1. varargs: pass size of CRLF as size_t not as int:
|
||||
|
||||
--- upnp/src/gena/gena_device.c.orig
|
||||
+++ upnp/src/gena/gena_device.c
|
||||
@@ -225,7 +225,7 @@ static UPNP_INLINE int notify_send_and_r
|
||||
"bbb",
|
||||
start_msg.buf, start_msg.length,
|
||||
propertySet, strlen(propertySet),
|
||||
- "\r\n", 2);
|
||||
+ "\r\n", sizeof "\r\n" - 1);
|
||||
if (ret_code) {
|
||||
membuffer_destroy(&start_msg);
|
||||
sock_destroy(&info, SD_BOTH);
|
||||
|
||||
2. Remove "b" arg here, there is no buffer passed: (this caused a pointer
|
||||
to be interpreted as a buffer size to be alloc'd/copied, hence the 32 GB.)
|
||||
|
||||
--- upnp/src/genlib/net/http/webserver.c.orig
|
||||
+++ upnp/src/genlib/net/http/webserver.c
|
||||
@@ -1262,7 +1262,7 @@ static int process_request(
|
||||
// Content-Range: bytes 222-3333/4000 HTTP_PARTIAL_CONTENT
|
||||
// Transfer-Encoding: chunked
|
||||
if (http_MakeMessage(headers, resp_major, resp_minor,
|
||||
- "R" "TLD" "s" "tcS" "b" "Xc" "sCc",
|
||||
+ "R" "TLD" "s" "tcS" "Xc" "sCc",
|
||||
HTTP_OK, // status code
|
||||
finfo.content_type, // content type
|
||||
RespInstr, // language info
|
||||
|
||||
2010-11-15 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
Added the convenience function UpnpResolveURL2() to upnptools.c.
|
||||
|
||||
This function avoids some unecessary memory allocation.
|
||||
The memory alloc'd by this function must be freed later by the caller.
|
||||
|
||||
2010-11-10 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Add GENA_NOTIFICATION_xxx_TIMEOUT variable.
|
||||
|
||||
Currently, in notify_send_and_recv function, pupnp waits for
|
||||
HTTP_DEFAULT_TIMEOUT seconds when trying to send a GENA notification.
|
||||
When there is a lot of notifications with CPs which was disconnected
|
||||
without unsusbcribing, all the pupnp threads are blocked on this
|
||||
timeout. To correct, this issue, this patch adds a new variable,
|
||||
GENA_NOTIFICATION_SENDING_TIMEOUT, which can be used to lower the
|
||||
timeout so GENA threads return quickly when writing is impossible. By
|
||||
the same mean, pupnp waits the CP's answer to the NOTIFY for
|
||||
HTTP_DEFAULT_TIMEOUT seconds, so this patch adds a new variable,
|
||||
GENA_NOTIFICATION_ANSWERING_TIMEOUT, to customize this value.
|
||||
|
||||
2010-11-10 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Add --disable-blocking-tcp-connections flag.
|
||||
|
||||
Currently, pupnp is using a blocking connect to sends GENA
|
||||
notifications. As a result, when there is a lot of notifications with
|
||||
CPs which were disconnected without unsusbcribing, all the pupnp
|
||||
threads are blocked for 20s (timeout). To correct this issue, this
|
||||
patch replace the call to connect with a call to private_connect and add
|
||||
a compilation flag to disable blocking TCP connections, so if we are not
|
||||
able to connect to the CP, the notification is lost.
|
||||
|
||||
2010-11-07 Stefan Sommerfeld <zerocom(at)cs.tu-berlin.de>
|
||||
|
||||
Several patches for windows compatibility and fixing warnings.
|
||||
|
||||
2010-11-07 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
PTHREAD_MUTEX_RECURSIVE on DragonFly is an enum.
|
||||
|
||||
SF Bug Tracker - ID: 3104527
|
||||
Submitted: OBATA Akio ( obache ) - 2010-11-07 07:10:28 BRST
|
||||
|
||||
In threadutil/inc/ithread.h, it is expected that
|
||||
PTHREAD_MUTEX_RECURSIVE is defined as macro. But on DragonFly BSD,
|
||||
it is defined as enum, so not works as expected.
|
||||
|
||||
Attachment patch treat that DragonFly BSD always
|
||||
have PTHREAD_MUTEX_RECURSIVE.
|
||||
|
||||
2010-11-07 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
ftime(3) in -lcompat should not be checked.
|
||||
|
||||
SF Bug Tracker - ID: 3104521
|
||||
Submitted: OBATA Akio ( obache ) - 2010-11-07 07:03:44 BRST
|
||||
|
||||
In configure.ac
|
||||
AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)])
|
||||
|
||||
But since version 1.6.3, ftime(3) is not used, so it should be
|
||||
removed, or introduce unwanted linkage with -lcompat.
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.6.9
|
||||
*******************************************************************************
|
||||
|
||||
2010-11-06 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
Fix for bug introduced in samples code in svn revision 502, commit
|
||||
git:25c908c558c8e60eb386c155a6b93add447ffec0
|
||||
|
||||
Sample device and combo were aborting with the message:
|
||||
"***** SampleUtil_Initialize was called multiple times!"
|
||||
|
||||
2010-11-06 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Make multiple SSDP advertisements faster.
|
||||
|
||||
Put the loop to send multiple copies of each SSDP advertisements in
|
||||
ssdp_server.c instead of ssdp_device.c so we have only one call to
|
||||
imillisleep ( SSDP_PAUSE ) to speed up advertisements.
|
||||
|
||||
2010-11-05 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Removing unused NUM_COPY variable.
|
||||
|
||||
Previously, NUM_COPY was used in ssdp_device.c to send multiple copies
|
||||
of each advertisements but also multiple replies to each M-SEARCH
|
||||
request. As sending multiple replies is not compliant with HTTPU/MU
|
||||
spec, NUM_COPY has been set to 1 in an older patch. However, as this
|
||||
variable is not needed and has been replaced with SSDP_COPY, it has
|
||||
been removed.
|
||||
|
||||
2010-11-05 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Use SSDP_COPY to send multiple SSDP advertisements.
|
||||
|
||||
Currently, SSDP_COPY is used only to send multiple M-SEARCH requests (in
|
||||
ssdp_ctrlpt.c). With this patch, SSDP_COPY is also used to send multiple
|
||||
copies of each advertisements packets (in ssdp_device.c).
|
||||
|
||||
2010-11-01 Carl Benson <carl.benson(at)windriver.com>
|
||||
|
||||
Fix for Android build.
|
||||
|
||||
I had to do some modifications myself though, because the Android
|
||||
build system insists on having a file named "util.h" taking precedence
|
||||
in its include path, libupnp gets confused because of the same filename
|
||||
in upnp/src/inc/util.h
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.6.8
|
||||
*******************************************************************************
|
||||
|
||||
2010-10-20 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
Fix a long date memory leak in webserver.c:StrStr().
|
||||
|
||||
2010-10-19 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
Bug fix in select of miniserver.c
|
||||
|
||||
Fix a bug in miniserver.c, in which maxMiniSock was wrongly declared as
|
||||
unsigned int and as a result it was beeng set to ((unsigned int)(-1)).
|
||||
As a result, after beeing incremented, it became zero, and this value
|
||||
was beeing used in the select() call.
|
||||
|
||||
Thanks to Fabrice Fontaine for helping and testing with this issue.
|
||||
|
||||
2010-10-15 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
Fix for 100% CPU issue in select() in miniserv.c. I have also removed
|
||||
the sleep() call, it was just a workaround.
|
||||
|
||||
SF Bug Tracker [ 3086852 ] 99% CPU loop in miniserver.c on a non ipv6
|
||||
system.
|
||||
|
||||
Submitted by: Jin ( jin_eld ) - 2010-10-13 19:29:13 UTC
|
||||
|
||||
I cross compiled libupnp 1.6.7 for ARM9 using the --disable-ipv6
|
||||
option, my system is an ipv4 only setup.
|
||||
|
||||
I do not know why this problem only appears when running the app in the
|
||||
background (for instance using nohup &), but then it starts using 99%
|
||||
CPU.
|
||||
|
||||
I traced the problem down to the select() call in miniserver.c in the
|
||||
RunMiniServer() function. Select returns code 1, but errno is set to
|
||||
"Socket operation on non-socket", I also see this when running my app
|
||||
under strace.
|
||||
|
||||
I set all ...Sock6 variables to INVALID_SOCKET to make sure that they
|
||||
do not get added to the FD_SET and the problem is gone.
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.6.7
|
||||
*******************************************************************************
|
||||
|
||||
2010-10-01 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Adding --disable-notification-reordering option
|
||||
|
||||
Adding a configure flag to disable GENA notification reordering as even
|
||||
with an imillisleep(1), this mechanism consumes too much CPU on embedded
|
||||
devices when there is a burst of notifications.
|
||||
|
||||
2010-09-30 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Bug fix when there is no service in embedded devices
|
||||
|
||||
When a device with embedded devices (like IGD) when created and one of
|
||||
the embedded devices did not have any service, there was a Segmentation
|
||||
Fault (see SF Tracker [ 2688125 ]).
|
||||
|
||||
Original SF Tracker issue follows:
|
||||
|
||||
SF Tracker [ 2688125 ] v1.6.6 crashes on subdevices without services
|
||||
Submitted by: Arno Willig ( akw ) - 2009-03-15 22:45:23 BRT
|
||||
|
||||
I discovered a bug, which will make libupnp (1.6.6) segfault, when you
|
||||
create a upnp description document with multiple devices which have
|
||||
subdevices, but no own services.
|
||||
|
||||
The crash occurs in genlib/service_table.c in line 977:
|
||||
end->next =
|
||||
getServiceList( currentDevice, &next_end, URLBase );
|
||||
|
||||
In this case "end" seems not to be defined, so end->next crashes.
|
||||
|
||||
Can anyone confirm this, please?
|
||||
|
||||
2010-09-28 Marc Essayan <marc.essayan(at)orange-ftgroup.com>
|
||||
|
||||
Bug fix on burst of GENA notification
|
||||
|
||||
When a lot of notifications were generated by a device in a short
|
||||
period of time then 100% of the CPU was used to reorder those
|
||||
notifications by pushing back the thread in the job queue. This
|
||||
mechanism has been modified so now thread sleep 1 ms before being
|
||||
pushed back into the job queue.
|
||||
|
||||
Removing DEFAULT_SCHED_PARAM parameter and use
|
||||
sched_get_priority_min(DEFAULT_POLICY) instead.
|
||||
|
||||
2010-09-22 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Bug fix on M-SEARCH response
|
||||
|
||||
Devices must respond to M-SEARCH requests for any supported version and the
|
||||
response should specify the same version as was contained in the search target.
|
||||
Previously, the device did not answer if the M-SEARCH request did not
|
||||
contain the same version number than the version number of the device.
|
||||
|
||||
2010-09-21 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Add Content-Language iff Accept-Language
|
||||
|
||||
Add Content-Language header in the response if and only if there is an
|
||||
Accept-Language header in the request.
|
||||
|
||||
2010-09-21 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Addition of WEB_SERVER_CONTENT_LANGUAGE parameter
|
||||
|
||||
This patch adds the WEB_SERVER_CONTENT_LANGUAGE parameter so the user can specify
|
||||
the language used by the device during Description and Presentation steps of UPnP
|
||||
through the HTTP CONTENT-LANGUAGE header.
|
||||
By default, the WEB_SERVER_CONTENT_LANGUAGE is an empty string so no
|
||||
CONTENT-LANGUAGE is added.
|
||||
|
||||
2010-09-18 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Customize the stack size of the threads used by pupnp through the new
|
||||
THREAD_STACK_SIZE variable.
|
||||
|
||||
This patch allows a user to customize the stack size of the threads used by
|
||||
pupnp through the new THREAD_STACK_SIZE variable. This is especially useful
|
||||
on embedded systems with limited memory where the user can set THREAD_STACK_SIZE
|
||||
to ITHREAD_STACK_MIN.
|
||||
|
||||
However, as this modification can have side effects, I set 0 as the default
|
||||
value, so threads will continue to use the default stack size of the system
|
||||
(which varies greatly as stated in
|
||||
https://computing.llnl.gov/tutorials/pthreads/).
|
||||
|
||||
2010-09-16 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Broken IPv6.
|
||||
IPv6 is currently broken in latest release of branch-1.6.x, so find a
|
||||
patch attached that correct the issue (small fixes on define, undef and
|
||||
retVal).
|
||||
|
||||
2010-09-10 Warwick Harvey <warwick.harvey(at)tieto.com>
|
||||
Patch to take notice of UPNP_USE_RWLOCK flag
|
||||
|
||||
The configure.ac file included with UPnP checks for the presence of the
|
||||
pthread_rwlock_t type, and then sets the value of the UPNP_USE_RWLOCK
|
||||
flag appropriately. However, this flag is not referenced at all in the
|
||||
source code, and thus the code does not compile on systems that don't
|
||||
have the pthread_rwlock_t type (such as Android).
|
||||
|
||||
Please find attached a patch (against the current 1.6.x head) that checks
|
||||
the value of this flag and falls back on using mutexes if read-write
|
||||
locks are not available.
|
||||
|
||||
2010-09-10 Jean Sigwald <jean.sigwald(at)orange-ftgroup.com>
|
||||
I discovered a reliable denial-of-service issue on the last stable
|
||||
release of libupnp (1.6.6) remotely triggerable by any
|
||||
unauthenticated user. The issue is related with a bad parsing of
|
||||
malformed XML.
|
||||
|
||||
2010-09-10 Chandra Penke <chandrapenke(at)mcntech.com>
|
||||
* SF Patch Tracker [ 2854711 ] Patch for Solaris10 compilation and usage
|
||||
Submitted By: zephyrus ( zephyrus00jp )
|
||||
|
||||
Patch for Solaris10 compilation and usage.
|
||||
|
||||
2010-09-10 Chandra Penke <chandrapenke(at)mcntech.com>
|
||||
Add support for conditionally enabling ipv6.
|
||||
|
||||
2010-09-10 Chandra Penke <chandrapenke(at)mcntech.com>
|
||||
Fix for compilation in debug builds.
|
||||
|
||||
Ensure internal methods are declared as static since debug builds don't inline.
|
||||
|
||||
2010-09-09 Chandra Penke <chandrapenke(at)mcntech.com>
|
||||
Fix for regression in SSDP code to send/receive messages over UDP
|
||||
|
||||
Sending messages over UDP is broken in some Apple OSes
|
||||
such as OS X and iOS. This might be broken in other OSes to but didn't
|
||||
verify.
|
||||
|
||||
The fix is to modify the socket lenght argument of sendto to use the correct
|
||||
sockaddr lenght dependng on whether the socket is IPV4 or IPV6.
|
||||
|
||||
Also added some error checks and debugging related to the issue
|
||||
|
||||
2010-09-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
Using UpnpReadHttpGet to download large files causes the application to
|
||||
crash. This happens when the file being downloaded exceeds the device
|
||||
memory - entirely possible when transferring video files.
|
||||
The programmatic cause is that the logic implemented in the function
|
||||
http_ReadHttpGet (which UpnpReadHttpGet calls) reads the entire file
|
||||
into memory. The fix modifies the existing logic to discard data after
|
||||
it's been read; there's no reason to keep it around since the caller
|
||||
of UpnpReadHttpGet already has a copy of it.
|
||||
|
||||
This issue exists in 1.6.6 as well as the latest sources.
|
||||
|
||||
Patch submitted by Chandra (inactiveneurons).
|
||||
|
||||
2010-09-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
In the latest sources, http_RequestAndResponse and other methods that
|
||||
use connect() are broken. More specifically, connect() in these methods
|
||||
is returning with an EINVAL. The programatic cause is that the address_len
|
||||
argument passed to connect() is different in IPV4 vs IPV6 (as described in:
|
||||
http://www.opengroup.org/onlinepubs/009695399/functions/connect.html).
|
||||
The current code always uses the IPV6 size. The fix modifies each use of
|
||||
connect() to use the correct size based on the address family being used.
|
||||
|
||||
Patch submitted by Chandra (inactiveneurons).
|
||||
|
||||
2010-09-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
Fix compilation error in upnp/src/gena/gena_ctrlpt.c (this is most
|
||||
likely an error on all platforms).
|
||||
|
||||
Patch submitted by Chandra (inactiveneurons).
|
||||
|
||||
2010-09-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
Fix compilation error in upnp/src/inc/ssdplib.h when compiling in OS X
|
||||
(the netinet/* headers are not available).
|
||||
|
||||
Patch submitted by Chandra (inactiveneurons).
|
||||
|
||||
2010-09-07 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
Fix compilation error in ixml/inc/ixml.h when compiling with an
|
||||
Objective-C compiler (when cross-compiling for iPhone devices).
|
||||
|
||||
Patch submitted by Chandra (inactiveneurons).
|
||||
|
||||
2010-08-21 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Issue regarding the GENA notifications. A string termination indicator
|
||||
was added at the end of the notification ("\r\n") in
|
||||
notify_send_and_recv() in upnp/src/gena/gena_device.c.
|
||||
Patch by Fabrice Fontaine.
|
||||
|
||||
2010-08-21 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* The last part of Ronan Menard's patch.
|
||||
|
||||
|
||||
2
Doxyfile
2
Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = libUPnP
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER = 1.6.7
|
||||
PROJECT_NUMBER = 1.6.10
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
|
||||
@@ -26,7 +26,6 @@ EXTRA_DIST = \
|
||||
build/libupnp.dsp \
|
||||
build/libupnp.dsw \
|
||||
build/inc/autoconfig.h \
|
||||
build/inc/config.h \
|
||||
build/inc/upnpconfig.h \
|
||||
build/msvc/inttypes.h \
|
||||
build/msvc/stdint.h \
|
||||
|
||||
2
README
2
README
@@ -1,7 +1,7 @@
|
||||
Portable SDK for UPnP* Devices (libupnp)
|
||||
|
||||
Copyright (c) 2000-2003 Intel Corporation - All Rights Reserved.
|
||||
Copyright (c) 2005-2006 R<EFBFBD>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.
|
||||
|
||||
8
THANKS
8
THANKS
@@ -13,11 +13,14 @@ exempt of errors.
|
||||
- Arno Willig
|
||||
- Bob Ciora
|
||||
- Carlo Parata
|
||||
- Carl Benson
|
||||
- Chandra (inactiveneurons)
|
||||
- Chaos
|
||||
- Charles Nepveu (cnepveu)
|
||||
- Chris Pickel
|
||||
- Chuck Thomason (cyt4)
|
||||
- Craig Nelson
|
||||
- David Blanchet
|
||||
- David Maass
|
||||
- Emil Ljungdahl
|
||||
- Erik Johansson
|
||||
@@ -27,12 +30,13 @@ exempt of errors.
|
||||
- Fabrice Fontaine
|
||||
- Fredrik Svensson
|
||||
- Glen Masgai
|
||||
- Hartmut Holzgraefe - hholzgra
|
||||
- Hartmut Holzgraefe (hholzgra)
|
||||
- Ingo Hofmann
|
||||
- Jiri Zouhar
|
||||
- John Dennis
|
||||
- Jonathan Casiot (no_dice)
|
||||
- Josh Carroll
|
||||
- Juergen Lock
|
||||
- Keith Brindley
|
||||
- Leuk_He
|
||||
- Loigu
|
||||
@@ -42,6 +46,7 @@ exempt of errors.
|
||||
- Nektarios K. Papadopoulos (npapadop)
|
||||
- Nicholas Kraft
|
||||
- Nick Leverton (leveret)
|
||||
- Obata Akio (obache)
|
||||
- Oskar Liljeblad
|
||||
- Michael (oxygenic)
|
||||
- Paul Vixie
|
||||
@@ -50,6 +55,7 @@ exempt of errors.
|
||||
- Robert Gingher (robsbox)
|
||||
- Ronan Menard
|
||||
- Siva Chandran
|
||||
- Stefan Sommerfeld (zerocom)
|
||||
- Stéphane Corthésy
|
||||
- Steve Bresson
|
||||
- Timothy Redaelli
|
||||
|
||||
23
TODO
23
TODO
@@ -2,28 +2,5 @@
|
||||
To Be Done
|
||||
==========
|
||||
|
||||
- add FreeBSD patches
|
||||
( http://sf.net/tracker/index.php?func=detail&aid=1332618&group_id=7189&atid=307189 ?)
|
||||
|
||||
- non-regression testing
|
||||
|
||||
- replace doc++ by Doxygen for documentation generation
|
||||
|
||||
- incorporate public patches and fix reported bugs :
|
||||
http://sourceforge.net/tracker/?group_id=7189&atid=107189 and
|
||||
http://sourceforge.net/tracker/?group_id=7189&atid=307189
|
||||
|
||||
- RPM packaging (a preliminary one here :
|
||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=176617 )
|
||||
|
||||
- make API clean for large files and 64 bits
|
||||
|
||||
|
||||
To Be Decided
|
||||
=============
|
||||
|
||||
- IPV6 support ?
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,15 +19,9 @@
|
||||
/* 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
|
||||
|
||||
@@ -67,9 +61,6 @@
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/timeb.h> header file. */
|
||||
#define HAVE_SYS_TIMEB_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/time.h> header file. */
|
||||
#define HAVE_SYS_TIME_H 1
|
||||
|
||||
@@ -82,6 +73,13 @@
|
||||
/* Define to 1 if you have the `vprintf' function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the <ws2tcpip.h> header file. */
|
||||
/* #undef HAVE_WS2TCPIP_H */
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Define to 1 to prevent compilation of assert() */
|
||||
#define NDEBUG 1
|
||||
|
||||
@@ -101,13 +99,13 @@
|
||||
#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.6.10"
|
||||
|
||||
/* 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.6.10"
|
||||
|
||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
||||
your system. */
|
||||
@@ -116,6 +114,15 @@
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_ENABLE_BLOCKING_TCP_CONNECTIONS 1
|
||||
|
||||
/* see upnpconfig.h */
|
||||
/* #undef UPNP_ENABLE_IPV6 */
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_ENABLE_NOTIFICATION_REORDERING 1
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_HAVE_CLIENT 1
|
||||
|
||||
@@ -131,29 +138,32 @@
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_HAVE_WEBSERVER 1
|
||||
|
||||
/* Do not use pthread_rwlock_t */
|
||||
#define UPNP_USE_RWLOCK 1
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_MAJOR 1
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_MINOR 4
|
||||
#define UPNP_VERSION_MINOR 6
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_PATCH 7
|
||||
#define UPNP_VERSION_PATCH 10
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_STRING "1.4.7"
|
||||
#define UPNP_VERSION_STRING "1.6.10"
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "1.4.7"
|
||||
#define VERSION "1.6.10"
|
||||
|
||||
/* File Offset size */
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
|
||||
/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
|
||||
/* #undef _LARGEFILE_SOURCE */
|
||||
#define _LARGEFILE_SOURCE 1
|
||||
|
||||
/* Large files support */
|
||||
#define _LARGE_FILE_SOURCE
|
||||
#define _LARGE_FILE_SOURCE /**/
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
@@ -164,5 +174,5 @@
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
||||
|
||||
/* Substitute for socklen_t */
|
||||
/* Type for storing the length of struct sockaddr */
|
||||
/* #undef socklen_t */
|
||||
|
||||
@@ -1,343 +0,0 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INTERNAL_CONFIG_H
|
||||
#define INTERNAL_CONFIG_H
|
||||
|
||||
#include "autoconfig.h"
|
||||
|
||||
|
||||
/** @name Compile time configuration options
|
||||
* The Linux SDK for UPnP Devices contains some compile-time parameters
|
||||
* that effect the behavior of the SDK. All configuration options are
|
||||
* located in {\tt src/inc/config.h}.
|
||||
*/
|
||||
|
||||
//@{
|
||||
|
||||
/** @name THREAD_IDLE_TIME
|
||||
* The {\tt THREAD_IDLE_TIME} constant determines when a thread will be
|
||||
* removed from the thread pool and returned to the operating system. When
|
||||
* a thread in the thread pool has been idle for this number of milliseconds
|
||||
* the thread will be released from the thread pool. The default value is
|
||||
* 5000 milliseconds (5 seconds).
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define THREAD_IDLE_TIME 5000
|
||||
//@}
|
||||
|
||||
/** @name JOBS_PER_THREAD
|
||||
* The {\tt JOBS_PER_THREAD} constant determines when a new thread will be
|
||||
* allocated to the thread pool inside the SDK. The thread pool will
|
||||
* try and maintain this jobs/thread ratio. When the jobs/thread ratio
|
||||
* becomes greater than this, then a new thread (up to the max) will be
|
||||
* allocated to the thread pool. The default ratio is 10 jobs/thread.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define JOBS_PER_THREAD 10
|
||||
//@}
|
||||
|
||||
/** @name MIN_THREADS
|
||||
* The {\tt MIN_THREADS} constant defines the minimum number of threads the
|
||||
* thread pool inside the SDK will create. The thread pool will
|
||||
* always have this number of threads. These threads are used
|
||||
* for both callbacks into applications built on top of the SDK and also
|
||||
* for making connections to other control points and devices. This number
|
||||
* includes persistent threads. The default value is two threads.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MIN_THREADS 2
|
||||
//@}
|
||||
|
||||
/** @name MAX_THREADS
|
||||
* The {\tt MAX_THREADS} constant defines the maximum number of threads the
|
||||
* thread pool inside the SDK will create. These threads are used
|
||||
* for both callbacks into applications built on top of the library and also
|
||||
* for making connections to other control points and devices. It is not
|
||||
* recommended that this value be below 10, since the threads are
|
||||
* necessary for correct operation. This value can be increased for greater
|
||||
* performance in operation at the expense of greater memory overhead. The
|
||||
* default value is 12.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MAX_THREADS 12
|
||||
//@}
|
||||
|
||||
/** @name MAX_JOBS_TOTAL
|
||||
* The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs
|
||||
* that can be queued. If this limit is reached further jobs will be thrown
|
||||
* to avoid memory exhaustion. The default value 100.
|
||||
* (Added by Axis.)
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MAX_JOBS_TOTAL 100
|
||||
//@}
|
||||
|
||||
/** @name DEFAULT_SOAP_CONTENT_LENGTH
|
||||
* SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.
|
||||
* This prevents devices that have a misbehaving web server to send
|
||||
* a large amount of data to the control point causing it to crash.
|
||||
* This can be adjusted dynamically with {\tt UpnpSetMaxContentLength}.
|
||||
*/
|
||||
//@{
|
||||
#define DEFAULT_SOAP_CONTENT_LENGTH 16000
|
||||
//@}
|
||||
|
||||
/** @name NUM_SSDP_COPY
|
||||
* This configuration parameter determines how many copies of each SSDP
|
||||
* advertisement and search packets will be sent. By default it will send two
|
||||
* copies of every packet.
|
||||
*/
|
||||
//@{
|
||||
#define NUM_SSDP_COPY 2
|
||||
//@}
|
||||
|
||||
/** @name SSDP_PAUSE
|
||||
* This configuration parameter determines the pause between identical SSDP
|
||||
* advertisement and search packets. The pause is measured in milliseconds
|
||||
* and defaults to 100.
|
||||
*/
|
||||
//@{
|
||||
#define SSDP_PAUSE 100
|
||||
//@}
|
||||
|
||||
/** @name WEB_SERVER_BUF_SIZE
|
||||
* This configuration parameter sets the maximum buffer size for the
|
||||
* webserver. The default value is 1MB.
|
||||
*/
|
||||
//@{
|
||||
#define WEB_SERVER_BUF_SIZE (1024*1024)
|
||||
//@}
|
||||
|
||||
/** @name AUTO_RENEW_TIME
|
||||
* The {\tt AUTO_RENEW_TIME} is the time, in seconds, before a subscription
|
||||
* expires that the SDK automatically resubscribes. The default
|
||||
* value is 10 seconds. Setting this value too low can result in the
|
||||
* subscription renewal not making it to the device in time, causing the
|
||||
* subscription to timeout. In order to avoid continually resubscribing
|
||||
* the minimum subscription time is five seconds more than the auto renew
|
||||
* time.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define AUTO_RENEW_TIME 10
|
||||
//@}
|
||||
|
||||
/** @name CP_MINIMUM_SUBSCRIPTION_TIME
|
||||
* The {\tt CP_MINIMUM_SUBSCRIPTION_TIME} is the minimum subscription time
|
||||
* allowed for a control point using the SDK. Subscribing for less than
|
||||
* this time automatically results in a subscription for this amount. The
|
||||
* default value is 5 seconds more than the {\tt AUTO_RENEW_TIME}, or 15
|
||||
* seconds.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define CP_MINIMUM_SUBSCRIPTION_TIME (AUTO_RENEW_TIME + 5)
|
||||
//@}
|
||||
|
||||
/** @name MAX_SEARCH_TIME
|
||||
* The {\tt MAX_SEARCH_TIME} is the maximum time
|
||||
* allowed for an SSDP search by a control point. Searching for greater than
|
||||
* this time automatically results in a search for this amount. The default
|
||||
* value is 80 seconds.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MAX_SEARCH_TIME 80
|
||||
//@}
|
||||
|
||||
/** @name MIN_SEARCH_TIME
|
||||
* The {\tt MIN_SEARCH_TIME} is the minimumm time
|
||||
* allowed for an SSDP search by a control point. Searching for less than
|
||||
* this time automatically results in a search for this amount. The default
|
||||
* value is 2 seconds.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MIN_SEARCH_TIME 2
|
||||
//@}
|
||||
|
||||
|
||||
/** @name AUTO_ADVERTISEMENT_TIME
|
||||
* The {\tt AUTO_ADVERTISEMENT_TIME} is the time, in seconds, before an
|
||||
* device advertisements expires before a renewed advertisement is sent.
|
||||
* The default time is 30 seconds.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define AUTO_ADVERTISEMENT_TIME 30
|
||||
//@}
|
||||
|
||||
/** @name SSDP_PACKET_DISTRIBUTE
|
||||
* The {\tt SSDP_PACKET_DISTRIBUTE} enables the SSDP packets to be sent
|
||||
* at an interval equal to half of the expiration time of SSDP packets
|
||||
* minus the AUTO_ADVERTISEMENT_TIME. This is used to increase
|
||||
* the probability of SSDP packets reaching to control points.
|
||||
* It is recommended that this flag be turned on for embedded wireless
|
||||
* devices.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define SSDP_PACKET_DISTRIBUTE 1
|
||||
//@}
|
||||
|
||||
/** @name Module Exclusion
|
||||
* Depending on the requirements, the user can selectively discard any of
|
||||
* the major modules like SOAP, GENA, SSDP or the Internal web server. By
|
||||
* default everything is included inside the SDK. By setting any of
|
||||
* the values below to 0, that component will not be included in the final
|
||||
* SDK.
|
||||
* \begin{itemize}
|
||||
* \item {\tt EXCLUDE_SOAP[0,1]}
|
||||
* \item {\tt EXCLUDE_GENA[0,1]}
|
||||
* \item {\tt EXCLUDE_SSDP[0,1]}
|
||||
* \item {\tt EXCLUDE_DOM [0,1]}
|
||||
* \item {\tt EXCLUDE_MINISERVER[0,1]}
|
||||
* \item {\tt EXCLUDE_WEB_SERVER[0,1]}
|
||||
* \item {\tt EXCLUDE_JNI[0,1]}
|
||||
* \end{itemize}
|
||||
*
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define EXCLUDE_SSDP 0
|
||||
#define EXCLUDE_SOAP 0
|
||||
#define EXCLUDE_GENA 0
|
||||
#define EXCLUDE_DOM 0
|
||||
#define EXCLUDE_MINISERVER 0
|
||||
#define EXCLUDE_WEB_SERVER 0
|
||||
#ifdef USE_JNI
|
||||
# define EXCLUDE_JNI 0
|
||||
#else
|
||||
# define EXCLUDE_JNI 1
|
||||
#endif
|
||||
//@}
|
||||
|
||||
|
||||
/** @name DEBUG_TARGET
|
||||
* The user has the option to redirect the library output debug messages
|
||||
* to either the screen or to a log file. All the output messages with
|
||||
* debug level 0 will go to {\tt upnp.err} and messages with debug level
|
||||
* greater than zero will be redirected to {\tt upnp.out}.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define DEBUG_TARGET 1
|
||||
//@}
|
||||
|
||||
|
||||
/** @name Other debugging features
|
||||
The UPnP SDK contains other features to aid in debugging:
|
||||
see <upnp/inc/upnpdebug.h>
|
||||
*/
|
||||
|
||||
#define DEBUG_ALL 1
|
||||
#define DEBUG_SSDP 0
|
||||
#define DEBUG_SOAP 0
|
||||
#define DEBUG_GENA 0
|
||||
#define DEBUG_TPOOL 0
|
||||
#define DEBUG_MSERV 0
|
||||
#define DEBUG_DOM 0
|
||||
#define DEBUG_HTTP 0
|
||||
#define DEBUG_API 0
|
||||
|
||||
//@} // Compile time configuration options
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Do not change, Internal purpose only!!!
|
||||
***************************************************************************/
|
||||
|
||||
//@{
|
||||
|
||||
/*
|
||||
* Set additional defines based on requested configuration
|
||||
*/
|
||||
|
||||
// configure --enable-client
|
||||
#if UPNP_HAVE_CLIENT
|
||||
# define INCLUDE_CLIENT_APIS 1
|
||||
#endif
|
||||
|
||||
// configure --enable-device
|
||||
#if UPNP_HAVE_DEVICE
|
||||
# define INCLUDE_DEVICE_APIS 1
|
||||
#endif
|
||||
|
||||
// configure --enable-webserver --enable-device
|
||||
#if UPNP_HAVE_WEBSERVER
|
||||
# define INTERNAL_WEB_SERVER 1
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#undef EXCLUDE_WEB_SERVER
|
||||
#undef EXCLUDE_MINISERVER
|
||||
#ifdef INTERNAL_WEB_SERVER
|
||||
# define EXCLUDE_WEB_SERVER 0
|
||||
# define EXCLUDE_MINISERVER 0
|
||||
#else
|
||||
# define EXCLUDE_WEB_SERVER 1
|
||||
# define EXCLUDE_MINISERVER 1
|
||||
#endif
|
||||
|
||||
#if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# define EXCLUDE_MINISERVER 1
|
||||
# if INTERNAL_WEB_SERVER
|
||||
# error "conflicting settings: use configure --disable-webserver"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# define EXCLUDE_MINISERVER 0
|
||||
# if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER
|
||||
# error "conflicting settings : use configure --enable-webserver"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
# define CLIENTONLY(x) x
|
||||
#else
|
||||
# define CLIENTONLY(x)
|
||||
#endif
|
||||
|
||||
//@}
|
||||
#endif
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
/* upnp/inc/upnpconfig.h. Generated from upnpconfig.h.in by configure. */
|
||||
// -*- C -*-
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2006 R<EFBFBD>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
|
||||
@@ -40,20 +40,20 @@
|
||||
***************************************************************************/
|
||||
|
||||
/** The library version (string) e.g. "1.3.0" */
|
||||
#define UPNP_VERSION_STRING "1.4.7"
|
||||
#define UPNP_VERSION_STRING "1.6.10"
|
||||
|
||||
/** Major version of the library */
|
||||
#define UPNP_VERSION_MAJOR 1
|
||||
|
||||
/** Minor version of the library */
|
||||
#define UPNP_VERSION_MINOR 4
|
||||
#define UPNP_VERSION_MINOR 6
|
||||
|
||||
/** Patch version of the library */
|
||||
#define UPNP_VERSION_PATCH 7
|
||||
#define UPNP_VERSION_PATCH 10
|
||||
|
||||
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
|
||||
#define UPNP_VERSION \
|
||||
((UPNP_VERSION_MAJOR*100 + UPNP_VERSION_MINOR)*100 + UPNP_VERSION_PATCH)
|
||||
((UPNP_VERSION_MAJOR * 100 + UPNP_VERSION_MINOR) * 100 + UPNP_VERSION_PATCH)
|
||||
|
||||
|
||||
|
||||
@@ -91,7 +91,9 @@
|
||||
* (i.e. configure --enable-tools) : <upnp/upnptools.h> file is available */
|
||||
#define UPNP_HAVE_TOOLS 1
|
||||
|
||||
/** Defined to 1 if the library has been compiled with ipv6 support
|
||||
* (i.e. configure --enable-ipv6) */
|
||||
/* #undef UPNP_ENABLE_IPV6 */
|
||||
|
||||
#endif // UPNP_CONFIG_H
|
||||
|
||||
#endif /* UPNP_CONFIG_H */
|
||||
|
||||
|
||||
@@ -5,17 +5,17 @@
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=libupnp - Win32 Debug
|
||||
!MESSAGE Dies ist kein g<EFBFBD>ltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
|
||||
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und f<EFBFBD>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<EFBFBD>nnen beim Ausf<EFBFBD>hren von NMAKE eine Konfiguration angeben
|
||||
!MESSAGE Sie können beim Ausf?hren von NMAKE eine Konfiguration angeben
|
||||
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "libupnp.mak" CFG="libupnp - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE F<EFBFBD>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")
|
||||
@@ -389,10 +389,6 @@ 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
|
||||
|
||||
@@ -603,10 +603,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
||||
>
|
||||
|
||||
@@ -599,10 +599,6 @@
|
||||
RelativePath="..\..\upnp\src\inc\upnpapi.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\src\inc\upnpclosesocket.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\upnp\inc\upnpdebug.h"
|
||||
>
|
||||
|
||||
92
configure.ac
92
configure.ac
@@ -9,7 +9,7 @@
|
||||
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
AC_INIT([libupnp], [1.6.7], [mroberto@users.sourceforge.net])
|
||||
AC_INIT([libupnp], [1.6.10], [mroberto@users.sourceforge.net])
|
||||
dnl ############################################################################
|
||||
dnl # *Independently* of the above libupnp package version, the libtool version
|
||||
dnl # of the 3 libraries need to be updated whenever there is a change released:
|
||||
@@ -147,22 +147,74 @@ dnl ############################################################################
|
||||
dnl # Release 1.6.7:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 5 -> 6
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 3 -> 4
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 5 -> 6
|
||||
dnl # - Interfaces have been changed, added and removed in upnp
|
||||
dnl # current: 4 -> 5
|
||||
dnl # revision: 4 -> 0
|
||||
dnl # current: 3 -> 4
|
||||
dnl # revision: 6 -> 0
|
||||
dnl # - Interfaces removed in upnp:
|
||||
dnl # age: -> 0
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:0:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [3:5:0])
|
||||
dnl #
|
||||
dnl # Obs.: 1.6.7 was released with a version error, the correct nubers should
|
||||
dnl # have been:
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:0:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
AC_SUBST([LT_VERSION_IXML], [2:4:0])
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [5:0:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [3:5:0])
|
||||
dnl # Release 1.6.8:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in ixml
|
||||
dnl # revision: 4 -> 5
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 0 -> 1
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 0 -> 1
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:1:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:1:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.9:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 1 -> 2
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 1 -> 2
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:2:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:2:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.10:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed inxml
|
||||
dnl # revision: 5 -> 6
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 2 -> 3
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 2 -> 3
|
||||
dnl # - interface has changed in upnp
|
||||
dnl # current: 4 -> 5
|
||||
dnl # revision: 3 -> 0
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:6:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:3:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [5:0:0])
|
||||
dnl #
|
||||
############################################################################
|
||||
AC_SUBST([LT_VERSION_IXML], [2:6:0])
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [5:3:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [5:0:0])
|
||||
dnl ############################################################################
|
||||
dnl # Repeating the algorithm to place it closer to the modificatin place:
|
||||
dnl # - library code modified: revision++
|
||||
@@ -256,6 +308,21 @@ if test "x$enable_tools" = xyes ; then
|
||||
AC_DEFINE(UPNP_HAVE_TOOLS, 1, [see upnpconfig.h])
|
||||
fi
|
||||
|
||||
RT_BOOL_ARG_ENABLE([ipv6], [no], [ipv6 support])
|
||||
if test "x$enable_ipv6" = xyes ; then
|
||||
AC_DEFINE(UPNP_ENABLE_IPV6, 1, [see upnpconfig.h])
|
||||
fi
|
||||
|
||||
RT_BOOL_ARG_ENABLE([notification_reordering], [yes], [GENA notification reordering in gena_device.c])
|
||||
if test "x$enable_notification_reordering" = xyes ; then
|
||||
AC_DEFINE(UPNP_ENABLE_NOTIFICATION_REORDERING, 1, [see upnpconfig.h])
|
||||
fi
|
||||
|
||||
RT_BOOL_ARG_ENABLE([blocking_tcp_connections], [yes], [blocking TCP connections])
|
||||
if test "x$enable_blocking_tcp_connections" = xyes ; then
|
||||
AC_DEFINE(UPNP_ENABLE_BLOCKING_TCP_CONNECTIONS, 1, [see upnpconfig.h])
|
||||
fi
|
||||
|
||||
|
||||
RT_BOOL_ARG_ENABLE([samples], [yes], [compilation of upnp/sample/ code])
|
||||
|
||||
@@ -420,7 +487,6 @@ fi
|
||||
#
|
||||
AC_FUNC_VPRINTF
|
||||
AC_FUNC_FSEEKO
|
||||
AC_CHECK_FUNCS(ftime,, [AC_CHECK_LIB(compat, ftime)])
|
||||
#
|
||||
# Solaris needs -lsocket -lnsl -lrt
|
||||
AC_SEARCH_LIBS([bind], [socket])
|
||||
@@ -482,3 +548,11 @@ AC_CONFIG_FILES([
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
#
|
||||
# Files copied for windows compilation.
|
||||
#
|
||||
echo "configure: copying \"autoconfig.h\" to \"build/inc/autoconfig.h\""
|
||||
cp autoconfig.h build/inc/autoconfig.h
|
||||
echo "configure: copying \"upnp/inc/upnpconfig.h\" to \"build/inc/upnpconfig.h\""
|
||||
cp upnp/inc/upnpconfig.h build/inc/upnpconfig.h
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# "Makefile.am" for "libupnp/ixml"
|
||||
#
|
||||
# (C) Copyright 2005 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
# (C) Copyright 2005 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
#
|
||||
|
||||
SUBDIRS = doc
|
||||
|
||||
@@ -45,9 +45,13 @@
|
||||
|
||||
#include "UpnpGlobal.h" /* For EXPORT_SPEC */
|
||||
|
||||
|
||||
typedef int BOOL;
|
||||
|
||||
/* Define BOOL. */
|
||||
#ifndef __OBJC__
|
||||
typedef int BOOL;
|
||||
#else
|
||||
/* For Objective C compilers, include objc.h which defines BOOL. */
|
||||
#include <objc/objc.h>
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \brief The type of DOM strings.
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
|
||||
#include "UpnpGlobal.h"
|
||||
#include "ixml.h"
|
||||
|
||||
|
||||
/*!
|
||||
@@ -20,6 +21,13 @@
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void IxmlPrintf(
|
||||
/*! [in] The file name, usually __FILE__. */
|
||||
const char *DbgFileName,
|
||||
/*! [in] The line number, usually __LINE__ or a variable that got the
|
||||
* __LINE__ at the appropriate place. */
|
||||
int DbgLineNo,
|
||||
/*! [in] The function name. */
|
||||
const char *FunctionName,
|
||||
/*! [in] Printf like format specification. */
|
||||
const char* FmtStr,
|
||||
/*! [in] Printf like Variable number of arguments that will go in the debug
|
||||
@@ -27,15 +35,38 @@ void IxmlPrintf(
|
||||
...)
|
||||
#if (__GNUC__ >= 3)
|
||||
/* This enables printf like format checking by the compiler */
|
||||
__attribute__((format (__printf__, 1, 2)))
|
||||
__attribute__((format (__printf__, 4, 5)))
|
||||
#endif
|
||||
;
|
||||
#else /* DEBUG */
|
||||
static UPNP_INLINE void IxmlPrintf(
|
||||
const char* FmtStr,
|
||||
...) {}
|
||||
const char *FmtStr,
|
||||
...)
|
||||
{
|
||||
FmtStr = FmtStr;
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Print the node names and values of a XML tree.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void printNodes(
|
||||
/*! [in] The root of the tree to print. */
|
||||
IXML_Node *tmpRoot,
|
||||
/*! [in] The depth to print. */
|
||||
int depth);
|
||||
#else
|
||||
static UPNP_INLINE void printNodes(
|
||||
IXML_Node *tmpRoot,
|
||||
int depth)
|
||||
{
|
||||
tmpRoot = tmpRoot;
|
||||
depth = depth;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* IXMLDEBUG_H */
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ int ixmlDocument_createElementEx(
|
||||
errCode = IXML_INSUFFICIENT_MEMORY;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
// set the node fields
|
||||
/* set the node fields */
|
||||
newElement->n.nodeType = eELEMENT_NODE;
|
||||
newElement->n.nodeName = strdup(tagName);
|
||||
if (newElement->n.nodeName == NULL) {
|
||||
@@ -229,7 +229,7 @@ int ixmlDocument_createTextNodeEx(
|
||||
rc = IXML_INSUFFICIENT_MEMORY;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
// initialize the node
|
||||
/* initialize the node */
|
||||
ixmlNode_init(returnNode);
|
||||
|
||||
returnNode->nodeName = strdup(TEXTNODENAME);
|
||||
@@ -239,7 +239,7 @@ int ixmlDocument_createTextNodeEx(
|
||||
rc = IXML_INSUFFICIENT_MEMORY;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
// add in node value
|
||||
/* add in node value */
|
||||
if (data != NULL) {
|
||||
returnNode->nodeValue = strdup(data);
|
||||
if (returnNode->nodeValue == NULL) {
|
||||
@@ -295,7 +295,7 @@ int ixmlDocument_createAttributeEx(
|
||||
ixmlAttr_init(attrNode);
|
||||
attrNode->n.nodeType = eATTRIBUTE_NODE;
|
||||
|
||||
// set the node fields
|
||||
/* set the node fields */
|
||||
attrNode->n.nodeName = strdup(name);
|
||||
if (attrNode->n.nodeName == NULL) {
|
||||
ixmlAttr_free(attrNode);
|
||||
@@ -343,7 +343,7 @@ int ixmlDocument_createAttributeNSEx(
|
||||
if (errCode != IXML_SUCCESS) {
|
||||
goto ErrorHandler;
|
||||
}
|
||||
// set the namespaceURI field
|
||||
/* set the namespaceURI field */
|
||||
attrNode->n.namespaceURI = strdup(namespaceURI);
|
||||
if (attrNode->n.namespaceURI == NULL) {
|
||||
ixmlAttr_free(attrNode);
|
||||
@@ -351,7 +351,7 @@ int ixmlDocument_createAttributeNSEx(
|
||||
errCode = IXML_INSUFFICIENT_MEMORY;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
// set the localName and prefix
|
||||
/* set the localName and prefix */
|
||||
errCode =
|
||||
ixmlNode_setNodeName((IXML_Node *)attrNode, qualifiedName);
|
||||
if (errCode != IXML_SUCCESS) {
|
||||
@@ -444,36 +444,36 @@ int ixmlDocument_createElementNSEx(
|
||||
IXML_Element **rtElement)
|
||||
{
|
||||
IXML_Element *newElement = NULL;
|
||||
int errCode = IXML_SUCCESS;
|
||||
int ret = IXML_SUCCESS;
|
||||
int line = 0;
|
||||
|
||||
if (doc == NULL || namespaceURI == NULL || qualifiedName == NULL) {
|
||||
line = __LINE__;
|
||||
errCode = IXML_INVALID_PARAMETER;
|
||||
ret = IXML_INVALID_PARAMETER;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
|
||||
errCode = ixmlDocument_createElementEx(doc, qualifiedName, &newElement);
|
||||
if (errCode != IXML_SUCCESS) {
|
||||
ret = ixmlDocument_createElementEx(doc, qualifiedName, &newElement);
|
||||
if (ret != IXML_SUCCESS) {
|
||||
line = __LINE__;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
// set the namespaceURI field
|
||||
/* set the namespaceURI field */
|
||||
newElement->n.namespaceURI = strdup(namespaceURI);
|
||||
if (newElement->n.namespaceURI == NULL) {
|
||||
line = __LINE__;
|
||||
ixmlElement_free(newElement);
|
||||
newElement = NULL;
|
||||
errCode = IXML_INSUFFICIENT_MEMORY;
|
||||
ret = IXML_INSUFFICIENT_MEMORY;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
// set the localName and prefix
|
||||
errCode = ixmlNode_setNodeName((IXML_Node *)newElement, qualifiedName);
|
||||
if (errCode != IXML_SUCCESS) {
|
||||
/* set the localName and prefix */
|
||||
ret = ixmlNode_setNodeName((IXML_Node *)newElement, qualifiedName);
|
||||
if (ret != IXML_SUCCESS) {
|
||||
line = __LINE__;
|
||||
ixmlElement_free(newElement);
|
||||
newElement = NULL;
|
||||
errCode = IXML_INSUFFICIENT_MEMORY;
|
||||
ret = IXML_INSUFFICIENT_MEMORY;
|
||||
goto ErrorHandler;
|
||||
}
|
||||
|
||||
@@ -481,12 +481,11 @@ int ixmlDocument_createElementNSEx(
|
||||
|
||||
ErrorHandler:
|
||||
*rtElement = newElement;
|
||||
if (errCode != IXML_SUCCESS) {
|
||||
IxmlPrintf("(%s::ixmlDocument_createElementNSEx): Error %d, line %d\n",
|
||||
__FILE__, errCode, line);
|
||||
if (ret != IXML_SUCCESS) {
|
||||
IxmlPrintf(__FILE__, line, "ixmlDocument_createElementNSEx", "Error %d\n", ret);
|
||||
}
|
||||
|
||||
return errCode;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ int ixmlElement_setAttribute(
|
||||
{
|
||||
IXML_Node *attrNode;
|
||||
IXML_Attr *newAttrNode;
|
||||
short errCode = IXML_SUCCESS;
|
||||
int errCode = IXML_SUCCESS;
|
||||
|
||||
if (element == NULL || name == NULL || value == NULL) {
|
||||
errCode = IXML_INVALID_PARAMETER;
|
||||
@@ -208,7 +208,8 @@ IXML_Attr *ixmlElement_getAttributeNode(IXML_Element *element, const DOMString n
|
||||
|
||||
attrNode = element->n.firstAttr;
|
||||
while (attrNode != NULL) {
|
||||
if (strcmp(attrNode->nodeName, name) == 0) { // found it
|
||||
if (strcmp(attrNode->nodeName, name) == 0) {
|
||||
/* found it */
|
||||
break;
|
||||
} else {
|
||||
attrNode = attrNode->nextSibling;
|
||||
@@ -555,8 +556,8 @@ IXML_Attr *ixmlElement_getAttributeNodeNS(
|
||||
while (attrNode != NULL) {
|
||||
if (strcmp(attrNode->localName, localName) == 0 &&
|
||||
strcmp(attrNode->namespaceURI, namespaceURI) == 0) {
|
||||
// found it
|
||||
break;
|
||||
/* found it */
|
||||
break;
|
||||
} else {
|
||||
attrNode = attrNode->nextSibling;
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ int ixml_membuf_insert(
|
||||
size_t buf_len,
|
||||
/*! [in] The point of insertion relative to the beggining of the
|
||||
* ixml_membuf internal buffer. */
|
||||
int index);
|
||||
size_t index);
|
||||
|
||||
|
||||
#endif /* IXML_MEMBUF_H */
|
||||
|
||||
@@ -54,37 +54,29 @@ static void copy_with_escape(
|
||||
/*! [in] The string to copy from. */
|
||||
const char *p)
|
||||
{
|
||||
int i;
|
||||
int plen;
|
||||
size_t i;
|
||||
size_t plen;
|
||||
|
||||
if (p == NULL) {
|
||||
if (p == NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
plen = strlen( p );
|
||||
|
||||
for (i = 0; i < plen; i++) {
|
||||
plen = strlen(p);
|
||||
for (i = 0; i < plen; ++i) {
|
||||
switch (p[i]) {
|
||||
case '<':
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
break;
|
||||
|
||||
case '>':
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
break;
|
||||
|
||||
case '&':
|
||||
ixml_membuf_append_str(buf, "&");
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
ixml_membuf_append_str(buf, "'");
|
||||
break;
|
||||
|
||||
case '\"':
|
||||
ixml_membuf_append_str(buf, """);
|
||||
break;
|
||||
|
||||
default:
|
||||
ixml_membuf_append(buf, &p[i]);
|
||||
break;
|
||||
@@ -161,11 +153,11 @@ static void ixmlPrintDomTreeRecursive(
|
||||
} else {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
}
|
||||
// output the children
|
||||
/* output the children */
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
/* Done with children. Output the end tag. */
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
|
||||
@@ -181,9 +173,9 @@ static void ixmlPrintDomTreeRecursive(
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf("(%s::ixmlPrintDomTreeRecursive) line %d: "
|
||||
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTreeRecursive",
|
||||
"Warning, unknown node type %d\n",
|
||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
||||
ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -242,20 +234,20 @@ static void ixmlPrintDomTree(
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
}
|
||||
|
||||
// output the children
|
||||
/* output the children */
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
/* 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");
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf("(%s::ixmlPrintDomTree) line %d: "
|
||||
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTree",
|
||||
"Warning, unknown node type %d\n",
|
||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
||||
ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -314,19 +306,19 @@ static void ixmlDomTreetoString(
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
}
|
||||
|
||||
// output the children
|
||||
/* output the children */
|
||||
ixmlPrintDomTreeRecursive(ixmlNode_getFirstChild(nodeptr), buf);
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
/* Done with children. Output the end tag. */
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf("(%s::ixmlDomTreetoString) line %d: "
|
||||
IxmlPrintf(__FILE__, __LINE__, "ixmlPrintDomTreeRecursive",
|
||||
"Warning, unknown node type %d\n",
|
||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
||||
ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,15 +17,54 @@
|
||||
|
||||
#ifdef DEBUG
|
||||
void IxmlPrintf(
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo,
|
||||
const char *FunctionName,
|
||||
const char *FmtStr,
|
||||
...)
|
||||
{
|
||||
va_list ArgList;
|
||||
|
||||
va_start(ArgList, FmtStr);
|
||||
vfprintf(stdout, FmtStr, ArgList);
|
||||
fflush(stdout);
|
||||
va_end(ArgList);
|
||||
FILE *fp = stdout;
|
||||
fprintf(fp, "(%s::%s), line %d", DbgFileName, FunctionName, DbgLineNo);
|
||||
if (FmtStr) {
|
||||
fprintf(fp, ": ");
|
||||
va_start(ArgList, FmtStr);
|
||||
vfprintf(fp, FmtStr, ArgList);
|
||||
fflush(fp);
|
||||
va_end(ArgList);
|
||||
} else {
|
||||
fprintf(fp, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void printNodes(IXML_Node *tmpRoot, int depth)
|
||||
{
|
||||
unsigned long i;
|
||||
IXML_NodeList *NodeList1;
|
||||
IXML_Node *ChildNode1;
|
||||
unsigned short NodeType;
|
||||
const DOMString NodeValue;
|
||||
const DOMString NodeName;
|
||||
NodeList1 = ixmlNode_getChildNodes(tmpRoot);
|
||||
for (i = 0; i < 100; ++i) {
|
||||
ChildNode1 = ixmlNodeList_item(NodeList1, i);
|
||||
if (ChildNode1 == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
printNodes(ChildNode1, depth+1);
|
||||
NodeType = ixmlNode_getNodeType(ChildNode1);
|
||||
NodeValue = ixmlNode_getNodeValue(ChildNode1);
|
||||
NodeName = ixmlNode_getNodeName(ChildNode1);
|
||||
IxmlPrintf(__FILE__, __LINE__, "printNodes",
|
||||
"DEPTH-%2d-IXML_Node Type %d, "
|
||||
"IXML_Node Name: %s, IXML_Node Value: %s\n",
|
||||
depth, NodeType, NodeName, NodeValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -75,10 +75,10 @@ static int ixml_membuf_set_size(
|
||||
diff = new_length - m->length;
|
||||
alloc_len = MAXVAL(m->size_inc, diff) + m->capacity;
|
||||
} else {
|
||||
// decrease length
|
||||
/* decrease length */
|
||||
assert(new_length <= m->length);
|
||||
|
||||
// if diff is 0..m->size_inc, don't free
|
||||
/* if diff is 0..m->size_inc, don't free */
|
||||
if ((m->capacity - new_length) <= m->size_inc) {
|
||||
return 0;
|
||||
}
|
||||
@@ -135,21 +135,21 @@ int ixml_membuf_assign(
|
||||
|
||||
assert(m != NULL);
|
||||
|
||||
// set value to null
|
||||
/* set value to null */
|
||||
if (buf == NULL) {
|
||||
ixml_membuf_destroy(m);
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
// alloc mem
|
||||
/* alloc mem */
|
||||
return_code = ixml_membuf_set_size(m, buf_len);
|
||||
if (return_code != 0) {
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// copy
|
||||
/* copy */
|
||||
memcpy(m->buf, buf, buf_len);
|
||||
|
||||
// null-terminate
|
||||
/* null-terminate */
|
||||
m->buf[buf_len] = 0;
|
||||
m->length = buf_len;
|
||||
|
||||
@@ -187,13 +187,13 @@ int ixml_membuf_insert(
|
||||
INOUT ixml_membuf *m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len,
|
||||
int index)
|
||||
size_t index)
|
||||
{
|
||||
int return_code = 0;
|
||||
|
||||
assert(m != NULL);
|
||||
|
||||
if (index < 0 || index > (int)m->length) {
|
||||
if (index > m->length) {
|
||||
return IXML_INDEX_SIZE_ERR;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -85,7 +85,7 @@ IXML_Node *ixmlNamedNodeMap_getNamedItem(
|
||||
IXML_NamedNodeMap *nnMap,
|
||||
const DOMString name)
|
||||
{
|
||||
long index;
|
||||
unsigned long index;
|
||||
|
||||
if (nnMap == NULL || name == NULL) {
|
||||
return NULL;
|
||||
@@ -95,7 +95,7 @@ IXML_Node *ixmlNamedNodeMap_getNamedItem(
|
||||
if (index == IXML_INVALID_ITEM_NUMBER) {
|
||||
return NULL;
|
||||
} else {
|
||||
return ixmlNamedNodeMap_item(nnMap, (unsigned long)index);
|
||||
return ixmlNamedNodeMap_item(nnMap, index);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ int ixmlNamedNodeMap_addToNamedNodeMap(
|
||||
}
|
||||
|
||||
if (*nnMap == NULL) {
|
||||
// nodelist is empty
|
||||
/* nodelist is empty */
|
||||
*nnMap = (IXML_NamedNodeMap *)malloc(sizeof (IXML_NamedNodeMap));
|
||||
if (*nnMap == NULL) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
|
||||
@@ -542,11 +542,11 @@ int ixmlNode_replaceChild(
|
||||
if (ixmlNode_allowChildren(nodeptr, newChild) == FALSE) {
|
||||
return IXML_HIERARCHY_REQUEST_ERR;
|
||||
}
|
||||
// if newChild was created from a different document
|
||||
/* if newChild was created from a different document */
|
||||
if (nodeptr->ownerDocument != newChild->ownerDocument) {
|
||||
return IXML_WRONG_DOCUMENT_ERR;
|
||||
}
|
||||
// if refChild is not a child of nodeptr
|
||||
/* if refChild is not a child of nodeptr */
|
||||
if (ixmlNode_isParent(nodeptr, oldChild) != TRUE) {
|
||||
return IXML_NOT_FOUND_ERR;
|
||||
}
|
||||
@@ -763,6 +763,10 @@ static IXML_Element *ixmlNode_cloneElement(
|
||||
/*!
|
||||
* \brief Returns a clone of a document node.
|
||||
*
|
||||
* Currently, the IXML_Document struct is just a node, so this function
|
||||
* just mallocs the IXML_Document, sets the node type and name. Curiously,
|
||||
* the parameter nodeptr is not actually used.
|
||||
*
|
||||
* \return A clone of a document node.
|
||||
*/
|
||||
static IXML_Document *ixmlNode_cloneDoc(
|
||||
@@ -781,7 +785,7 @@ static IXML_Document *ixmlNode_cloneDoc(
|
||||
}
|
||||
|
||||
ixmlDocument_init(newDoc);
|
||||
docNode = (IXML_Node *) newDoc;
|
||||
docNode = (IXML_Node *)newDoc;
|
||||
|
||||
rc = ixmlNode_setNodeName(docNode, DOCUMENTNODENAME);
|
||||
if (rc != IXML_SUCCESS) {
|
||||
@@ -792,6 +796,7 @@ static IXML_Document *ixmlNode_cloneDoc(
|
||||
newDoc->n.nodeType = eDOCUMENT_NODE;
|
||||
|
||||
return newDoc;
|
||||
nodeptr = nodeptr;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -57,11 +57,11 @@ IXML_Node *ixmlNodeList_item(
|
||||
IXML_NodeList *next;
|
||||
unsigned int i;
|
||||
|
||||
// if the list ptr is NULL
|
||||
/* if the list ptr is NULL */
|
||||
if (nList == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
// if index is more than list length
|
||||
/* if index is more than list length */
|
||||
if (index > ixmlNodeList_length(nList) - 1) {
|
||||
return NULL;
|
||||
}
|
||||
@@ -93,7 +93,7 @@ int ixmlNodeList_addToNodeList(
|
||||
}
|
||||
|
||||
if (*nList == NULL) {
|
||||
// nodelist is empty
|
||||
/* nodelist is empty */
|
||||
*nList = (IXML_NodeList *)malloc(sizeof (IXML_NodeList));
|
||||
if (*nList == NULL) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Version: 1.6.7
|
||||
Version: 1.6.10
|
||||
Summary: Universal Plug and Play (UPnP) SDK
|
||||
Name: libupnp
|
||||
Release: 1%{?dist}
|
||||
|
||||
@@ -32,105 +32,96 @@
|
||||
#ifndef FREE_LIST_H
|
||||
#define FREE_LIST_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ithread.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Name: FreeListNode
|
||||
*
|
||||
* Description:
|
||||
* free list node. points to next free item.
|
||||
* memory for node is borrowed from allocated items.
|
||||
* Internal Use Only.
|
||||
*****************************************************************************/
|
||||
/*!
|
||||
* Free list node. points to next free item.
|
||||
* Memory for node is borrowed from allocated items.
|
||||
* \internal
|
||||
*/
|
||||
typedef struct FREELISTNODE
|
||||
{
|
||||
struct FREELISTNODE *next;
|
||||
} FreeListNode;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: FreeList
|
||||
*
|
||||
* Description:
|
||||
* Stores head and size of free list, as well as mutex for protection.
|
||||
* Internal Use Only.
|
||||
*****************************************************************************/
|
||||
/*!
|
||||
* Stores head and size of free list, as well as mutex for protection.
|
||||
* \internal
|
||||
*/
|
||||
typedef struct FREELIST
|
||||
{
|
||||
FreeListNode *head;
|
||||
size_t element_size;
|
||||
int maxFreeListLength;
|
||||
int freeListLength;
|
||||
|
||||
}FreeList;
|
||||
} FreeList;
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListInit
|
||||
/*!
|
||||
* \brief Initializes Free List.
|
||||
*
|
||||
* Description:
|
||||
* Initializes Free List. Must be called first.
|
||||
* And only once for FreeList.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a linked list.
|
||||
* size_t - size of elements to store in free list
|
||||
* maxFreeListSize - max size that the free list can grow to
|
||||
* before returning memory to O.S.
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int FreeListInit(FreeList *free_list,
|
||||
size_t elementSize,
|
||||
int maxFreeListSize);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListAlloc
|
||||
* Must be called first and only once for FreeList.
|
||||
*
|
||||
* Description:
|
||||
* Allocates chunk of set size.
|
||||
* If a free item is available in the list, returnes the stored item.
|
||||
* Otherwise calls the O.S. to allocate memory.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a linked list.
|
||||
* Returns:
|
||||
* Non NULL on success. NULL on failure.
|
||||
*****************************************************************************/
|
||||
void * FreeListAlloc (FreeList *free_list);
|
||||
* \return:
|
||||
* \li \c 0 on success.
|
||||
* \li \c EINVAL on failure.
|
||||
*/
|
||||
int FreeListInit(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
FreeList *free_list,
|
||||
/*! Size of elements to store in free list. */
|
||||
size_t elementSize,
|
||||
/*! Max size that the free list can grow to before returning
|
||||
* memory to O.S. */
|
||||
int maxFreeListLength);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListFree
|
||||
/*!
|
||||
* \brief Allocates chunk of set size.
|
||||
*
|
||||
* Description:
|
||||
* Returns an item to the Free List.
|
||||
* If the free list is smaller than the max size than
|
||||
* adds the item to the free list.
|
||||
* Otherwise returns the item to the O.S.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a linked list.
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int FreeListFree (FreeList *free_list,void * element);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListDestroy
|
||||
* If a free item is available in the list, returnes the stored item,
|
||||
* otherwise calls the O.S. to allocate memory.
|
||||
*
|
||||
* Description:
|
||||
* Releases the resources stored with the free list.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a linked list.
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int FreeListDestroy (FreeList *free_list);
|
||||
* \return Non NULL on success. NULL on failure.
|
||||
*/
|
||||
void *FreeListAlloc(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
FreeList *free_list);
|
||||
|
||||
/*!
|
||||
* \brief Returns an item to the Free List.
|
||||
*
|
||||
* If the free list is smaller than the max size then adds the item to the
|
||||
* free list, otherwise returns the item to the O.S.
|
||||
*
|
||||
* \return:
|
||||
* \li \c 0 on success.
|
||||
* \li \c EINVAL on failure.
|
||||
*/
|
||||
int FreeListFree(
|
||||
/*! Must be valid, non null, pointer to a free list. */
|
||||
FreeList *free_list,
|
||||
/*! Must be a pointer allocated by FreeListAlloc. */
|
||||
void *element);
|
||||
|
||||
/*!
|
||||
* \brief Releases the resources stored with the free list.
|
||||
*
|
||||
* \return:
|
||||
* \li \c 0 on success.
|
||||
* \li \c EINVAL on failure.
|
||||
*/
|
||||
int FreeListDestroy(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
FreeList *free_list);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -32,6 +32,10 @@
|
||||
#ifndef LINKED_LIST_H
|
||||
#define LINKED_LIST_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "FreeList.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -44,284 +48,238 @@ extern "C" {
|
||||
#define LIST_SUCCESS 1
|
||||
#define LIST_FAIL 0
|
||||
|
||||
/****************************************************************************
|
||||
* Name: free_routine
|
||||
*
|
||||
* Description:
|
||||
* Function for freeing list items
|
||||
*****************************************************************************/
|
||||
/*! Function for freeing list items. */
|
||||
typedef void (*free_function)(void *arg);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: cmp_routine
|
||||
*
|
||||
* Description:
|
||||
* Function for comparing list items
|
||||
* Returns 1 if itemA==itemB
|
||||
*****************************************************************************/
|
||||
/*! Function for comparing list items. Returns 1 if itemA==itemB */
|
||||
typedef int (*cmp_routine)(void *itemA,void *itemB);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ListNode
|
||||
*
|
||||
* Description:
|
||||
* linked list node. stores generic item and pointers to next and prev.
|
||||
* Internal Use Only.
|
||||
*****************************************************************************/
|
||||
/*! Linked list node. Stores generic item and pointers to next and prev.
|
||||
* \internal
|
||||
*/
|
||||
typedef struct LISTNODE
|
||||
{
|
||||
struct LISTNODE *prev;
|
||||
struct LISTNODE *next;
|
||||
void *item;
|
||||
struct LISTNODE *prev;
|
||||
struct LISTNODE *next;
|
||||
void *item;
|
||||
} ListNode;
|
||||
|
||||
/****************************************************************************
|
||||
* Name: LinkedList
|
||||
/*!
|
||||
* Linked list (no protection).
|
||||
*
|
||||
* Description:
|
||||
* linked list (no protection). Internal Use Only.
|
||||
* Because this is for internal use, parameters are NOT checked for
|
||||
* validity.
|
||||
* The first item of the list is stored at node: head->next
|
||||
* The last item of the list is stored at node: tail->prev
|
||||
* If head->next=tail, then list is empty.
|
||||
* To iterate through the list:
|
||||
* Because this is for internal use, parameters are NOT checked for validity.
|
||||
* The first item of the list is stored at node: head->next
|
||||
* The last item of the list is stored at node: tail->prev
|
||||
* If head->next=tail, then list is empty.
|
||||
* To iterate through the list:
|
||||
*
|
||||
* LinkedList g;
|
||||
* ListNode *temp = NULL;
|
||||
* for (temp = ListHead(g);temp!=NULL;temp = ListNext(g,temp))
|
||||
* {
|
||||
* }
|
||||
* LinkedList g;
|
||||
* ListNode *temp = NULL;
|
||||
* for (temp = ListHead(g);temp!=NULL;temp = ListNext(g,temp)) {
|
||||
* }
|
||||
*
|
||||
*****************************************************************************/
|
||||
* \internal
|
||||
*/
|
||||
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 */
|
||||
/*! head, first item is stored at: head->next */
|
||||
ListNode head;
|
||||
/*! tail, last item is stored at: tail->prev */
|
||||
ListNode tail;
|
||||
/*! size of list */
|
||||
long size;
|
||||
/*! free list to use */
|
||||
FreeList freeNodeList;
|
||||
/*! free function to use */
|
||||
free_function free_func;
|
||||
/*! compare function to use */
|
||||
cmp_routine cmp_func;
|
||||
} LinkedList;
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListInit
|
||||
*
|
||||
* Description:
|
||||
* Initializes LinkedList. Must be called first.
|
||||
* And only once for List.
|
||||
* Parameters:
|
||||
* list - must be valid, non null, pointer to a linked list.
|
||||
* cmp_func - function used to compare items. (May be NULL)
|
||||
* free_func - function used to free items. (May be NULL)
|
||||
* Returns:
|
||||
* 0 on success, EOUTOFMEM on failure.
|
||||
*****************************************************************************/
|
||||
int ListInit(LinkedList *list,cmp_routine cmp_func, free_function free_func);
|
||||
/*!
|
||||
* \brief Initializes LinkedList. Must be called first and only once for List.
|
||||
*
|
||||
* \return
|
||||
* \li \c 0 on success.
|
||||
* \li \c EOUTOFMEM on failure.
|
||||
*/
|
||||
int ListInit(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Function used to compare items. (May be NULL). */
|
||||
cmp_routine cmp_func,
|
||||
/*! Function used to free items. (May be NULL). */
|
||||
free_function free_func);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddHead
|
||||
/*!
|
||||
* \brief Adds a node to the head of the list. Node gets immediately after
|
||||
* list head.
|
||||
*
|
||||
* Description:
|
||||
* Adds a node to the head of the list.
|
||||
* Node gets immediately after list.head.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* void * item - item to be added
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *ListAddHead(LinkedList *list, void *item);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddTail
|
||||
*
|
||||
* Description:
|
||||
* Adds a node to the tail of the list.
|
||||
* Node gets added immediately before list.tail.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* void * item - item to be added
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *ListAddTail(LinkedList *list, void *item);
|
||||
* \return The pointer to the ListNode on success, NULL on failure.
|
||||
*/
|
||||
ListNode *ListAddHead(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Item to be added. */
|
||||
void *item);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddAfter
|
||||
/*!
|
||||
* \brief Adds a node to the tail of the list. Node gets added immediately
|
||||
* before list.tail.
|
||||
*
|
||||
* Description:
|
||||
* Adds a node after the specified node.
|
||||
* Node gets added immediately after bnode.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* void * item - item to be added
|
||||
* ListNode * bnode - node to add after
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *ListAddAfter(LinkedList *list, void *item, ListNode *bnode);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddBefore
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* Description:
|
||||
* Adds a node before the specified node.
|
||||
* Node gets added immediately before anode.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* ListNode * anode - node to add the in front of.
|
||||
* void * item - item to be added
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *ListAddBefore(LinkedList *list,void *item, ListNode *anode);
|
||||
* \return The pointer to the ListNode on success, NULL on failure.
|
||||
*/
|
||||
ListNode *ListAddTail(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Item to be added. */
|
||||
void *item);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListDelNode
|
||||
/*!
|
||||
* \brief Adds a node after the specified node. Node gets added immediately
|
||||
* after bnode.
|
||||
*
|
||||
* Description:
|
||||
* Removes a node from the list
|
||||
* The memory for the node is freed.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* ListNode *dnode - done to delete.
|
||||
* freeItem - if !0 then item is freed using free function.
|
||||
* if 0 (or free function is NULL) then item is not freed
|
||||
* Returns:
|
||||
* The pointer to the item stored in the node or NULL if the item is freed.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
void *ListDelNode(LinkedList *list,ListNode *dnode, int freeItem);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListDestroy
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* Description:
|
||||
* Removes all memory associated with list nodes.
|
||||
* Does not free LinkedList *list.
|
||||
* \return The pointer to the ListNode on success, NULL on failure.
|
||||
*/
|
||||
ListNode *ListAddAfter(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Item to be added. */
|
||||
void *item,
|
||||
/*! Node to add after. */
|
||||
ListNode *bnode);
|
||||
|
||||
/*!
|
||||
* \brief Adds a node before the specified node. Node gets added immediately
|
||||
* before anode.
|
||||
*
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* \return The pointer to the ListNode on success, NULL on failure.
|
||||
*/
|
||||
ListNode *ListAddBefore(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Item to be added. */
|
||||
void *item,
|
||||
/*! Node to add in front of. */
|
||||
ListNode *anode);
|
||||
|
||||
/*!
|
||||
* \brief Removes a node from the list. The memory for the node is freed.
|
||||
*
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* \return The pointer to the item stored in the node or NULL if the item
|
||||
* is freed.
|
||||
*/
|
||||
void *ListDelNode(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Node to delete. */
|
||||
ListNode *dnode,
|
||||
/*! if !0 then item is freed using free function. If 0 (or free
|
||||
* function is NULL) then item is not freed. */
|
||||
int freeItem);
|
||||
|
||||
/*!
|
||||
* \brief Removes all memory associated with list nodes. Does not free
|
||||
* LinkedList *list.
|
||||
*
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* \return 0 on success, EINVAL on failure.
|
||||
*/
|
||||
int ListDestroy(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! if !0 then item is freed using free function. If 0 (or free
|
||||
* function is NULL) then item is not freed. */
|
||||
int freeItem);
|
||||
|
||||
/*!
|
||||
* \brief Returns the head of the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* freeItem - if !0 then items are freed using the free_function.
|
||||
* if 0 (or free function is NULL) then items are not freed.
|
||||
* Returns:
|
||||
* 0 on success. Always returns 0.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
int ListDestroy(LinkedList *list, int freeItem);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListHead
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* Description:
|
||||
* Returns the head of the list.
|
||||
* \return The head of the list. NULL if list is empty.
|
||||
*/
|
||||
ListNode *ListHead(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list);
|
||||
|
||||
/*!
|
||||
* \brief Returns the tail of the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The head of the list. NULL if list is empty.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode* ListHead(LinkedList *list);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListTail
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* Description:
|
||||
* Returns the tail of the list.
|
||||
* \return The tail of the list. NULL if list is empty.
|
||||
*/
|
||||
ListNode *ListTail(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list);
|
||||
|
||||
/*!
|
||||
* \brief Returns the next item in the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The tail of the list. NULL if list is empty.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode* ListTail(LinkedList *list);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListNext
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* Description:
|
||||
* Returns the next item in the list.
|
||||
* \return The next item in the list. NULL if there are no more items in list.
|
||||
*/
|
||||
ListNode *ListNext(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Node from the list. */
|
||||
ListNode *node);
|
||||
|
||||
/*!
|
||||
* \brief Returns the previous item in the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The next item in the list. NULL if there are no more items in list.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode* ListNext(LinkedList *list, ListNode * node);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListPrev
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* Description:
|
||||
* Returns the previous item in the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The previous item in the list. NULL if there are no more items in list.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode* ListPrev(LinkedList *list, ListNode * node);
|
||||
* \return The previous item in the list. NULL if there are no more items in list.
|
||||
*/
|
||||
ListNode *ListPrev(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! Node from the list. */
|
||||
ListNode *node);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListFind
|
||||
/*!
|
||||
* \brief Finds the specified item in the list.
|
||||
*
|
||||
* Description:
|
||||
* Finds the specified item in the list.
|
||||
* Uses the compare function specified in ListInit. If compare function
|
||||
* is NULL then compares items as pointers.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* ListNode *start - the node to start from, NULL if to start from
|
||||
* beginning.
|
||||
* void * item - the item to search for.
|
||||
* Returns:
|
||||
* The node containing the item. NULL if no node contains the item.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode* ListFind(LinkedList *list, ListNode *start, void * item);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListSize
|
||||
* Uses the compare function specified in ListInit. If compare function
|
||||
* is NULL then compares items as pointers.
|
||||
*
|
||||
* Description:
|
||||
* Returns the size of the list.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
|
||||
* Returns:
|
||||
* The number of items in the list.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
int ListSize(LinkedList* list);
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* \return The node containing the item. NULL if no node contains the item.
|
||||
*/
|
||||
ListNode* ListFind(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList *list,
|
||||
/*! The node to start from, NULL if to start from beginning. */
|
||||
ListNode *start,
|
||||
/*! The item to search for. */
|
||||
void *item);
|
||||
|
||||
/*!
|
||||
* \brief Returns the size of the list.
|
||||
*
|
||||
* Precondition: The list has been initialized.
|
||||
*
|
||||
* \return The number of items in the list.
|
||||
*/
|
||||
long ListSize(
|
||||
/*! Must be valid, non null, pointer to a linked list. */
|
||||
LinkedList* list);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -29,26 +29,21 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef THREADPOOL_H
|
||||
#define THREADPOOL_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "FreeList.h"
|
||||
#include "ithread.h"
|
||||
#include "LinkedList.h"
|
||||
#include "UpnpInet.h"
|
||||
#include "UpnpGlobal.h" /* for UPNP_INLINE, EXPORT_SPEC */
|
||||
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <time.h>
|
||||
struct timezone
|
||||
@@ -63,78 +58,63 @@
|
||||
#if defined(__OSX__) || defined(__APPLE__) || defined(__NetBSD__)
|
||||
#include <sys/resource.h> /* for setpriority() */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*! Size of job free list */
|
||||
#define JOBFREELISTSIZE 100
|
||||
|
||||
|
||||
#define INFINITE_THREADS -1
|
||||
|
||||
|
||||
#define EMAXTHREADS (-8 & 1<<29)
|
||||
|
||||
|
||||
/*! Invalid Policy */
|
||||
#define INVALID_POLICY (-9 & 1<<29)
|
||||
|
||||
|
||||
/*! Invalid JOB Id */
|
||||
#define INVALID_JOB_ID (-2 & 1<<29)
|
||||
|
||||
|
||||
typedef enum duration {
|
||||
SHORT_TERM,
|
||||
PERSISTENT
|
||||
} Duration;
|
||||
|
||||
|
||||
typedef enum priority {
|
||||
LOW_PRIORITY,
|
||||
MED_PRIORITY,
|
||||
HIGH_PRIORITY
|
||||
} ThreadPriority;
|
||||
|
||||
|
||||
/*! default priority used by TPJobInit */
|
||||
#define DEFAULT_PRIORITY MED_PRIORITY
|
||||
|
||||
|
||||
/*! default minimum used by TPAttrInit */
|
||||
#define DEFAULT_MIN_THREADS 1
|
||||
|
||||
|
||||
/*! default max used by TPAttrInit */
|
||||
#define DEFAULT_MAX_THREADS 10
|
||||
|
||||
/*! default stack size used by TPAttrInit */
|
||||
#define DEFAULT_STACK_SIZE 0
|
||||
|
||||
/*! default jobs per thread used by TPAttrInit */
|
||||
#define DEFAULT_JOBS_PER_THREAD 10
|
||||
|
||||
|
||||
/*! default starvation time used by TPAttrInit */
|
||||
#define DEFAULT_STARVATION_TIME 500
|
||||
|
||||
|
||||
/*! default idle time used by TPAttrInit */
|
||||
#define DEFAULT_IDLE_TIME 10 * 1000
|
||||
|
||||
|
||||
/*! default free routine used TPJobInit */
|
||||
#define DEFAULT_FREE_ROUTINE NULL
|
||||
|
||||
|
||||
/*! default max jobs used TPAttrInit */
|
||||
#define DEFAULT_MAX_JOBS_TOTAL 100
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Statistics.
|
||||
*
|
||||
@@ -142,71 +122,43 @@ typedef enum priority {
|
||||
*/
|
||||
#define STATS 1
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define DEBUG 1
|
||||
#endif
|
||||
|
||||
|
||||
typedef int PolicyType;
|
||||
|
||||
|
||||
#define DEFAULT_POLICY SCHED_OTHER
|
||||
|
||||
|
||||
/*! Default priority */
|
||||
#define DEFAULT_SCHED_PARAM 0
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: free_routine
|
||||
*
|
||||
* Description:
|
||||
* Function for freeing a thread argument
|
||||
*****************************************************************************/
|
||||
/*! Function for freeing a thread argument. */
|
||||
typedef void (*free_routine)(void *arg);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ThreadPoolAttr
|
||||
*
|
||||
* Description:
|
||||
* Attributes for thread pool. Used to set and change parameters of
|
||||
* thread pool
|
||||
*****************************************************************************/
|
||||
/*! Attributes for thread pool. Used to set and change parameters of thread
|
||||
* pool. */
|
||||
typedef struct THREADPOOLATTR
|
||||
{
|
||||
/* minThreads, ThreadPool will always maintain at least this many threads */
|
||||
/*! ThreadPool will always maintain at least this many threads. */
|
||||
int minThreads;
|
||||
|
||||
/* maxThreads, ThreadPool will never have more than this number of threads */
|
||||
/*! ThreadPool will never have more than this number of threads. */
|
||||
int maxThreads;
|
||||
|
||||
/* maxIdleTime (in milliseconds) this is the maximum time a thread will
|
||||
* remain idle before dying */
|
||||
/*! This is the minimum stack size allocated for each thread. */
|
||||
size_t stackSize;
|
||||
/*! This is the maximum time a thread will
|
||||
* remain idle before dying (in milliseconds). */
|
||||
int maxIdleTime;
|
||||
|
||||
/* jobs per thread to maintain */
|
||||
/*! Jobs per thread to maintain. */
|
||||
int jobsPerThread;
|
||||
|
||||
/* maximum number of jobs that can be queued totally. */
|
||||
/*! Maximum number of jobs that can be queued totally. */
|
||||
int maxJobsTotal;
|
||||
|
||||
/* the time a low priority or med priority job waits before getting bumped
|
||||
* up a priority (in milliseconds) */
|
||||
/*! the time a low priority or med priority job waits before getting
|
||||
* bumped up a priority (in milliseconds). */
|
||||
int starvationTime;
|
||||
|
||||
/* scheduling policy to use */
|
||||
/*! scheduling policy to use. */
|
||||
PolicyType schedPolicy;
|
||||
} ThreadPoolAttr;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ThreadPool
|
||||
*
|
||||
* Description:
|
||||
* Internal ThreadPool Job
|
||||
*****************************************************************************/
|
||||
/*! Internal ThreadPool Job. */
|
||||
typedef struct THREADPOOLJOB
|
||||
{
|
||||
start_routine func;
|
||||
@@ -217,13 +169,7 @@ typedef struct THREADPOOLJOB
|
||||
int jobId;
|
||||
} ThreadPoolJob;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: ThreadPoolStats
|
||||
*
|
||||
* Description:
|
||||
* Structure to hold statistics
|
||||
*****************************************************************************/
|
||||
/*! Structure to hold statistics. */
|
||||
typedef struct TPOOLSTATS
|
||||
{
|
||||
double totalTimeHQ;
|
||||
@@ -247,7 +193,6 @@ typedef struct TPOOLSTATS
|
||||
int currentJobsMQ;
|
||||
} ThreadPoolStats;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief A thread pool similar to the thread pool in the UPnP SDK.
|
||||
*
|
||||
@@ -265,360 +210,324 @@ 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 busyThreads; /* number of threads that are currently executing jobs */
|
||||
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 */
|
||||
|
||||
/* statistics */
|
||||
/*! Mutex to protect job qs. */
|
||||
ithread_mutex_t mutex;
|
||||
/*! Condition variable to signal Q. */
|
||||
ithread_cond_t condition;
|
||||
/*! Condition variable for start and stop. */
|
||||
ithread_cond_t start_and_shutdown;
|
||||
/*! ids for jobs */
|
||||
int lastJobId;
|
||||
/*! whether or not we are shutting down */
|
||||
int shutdown;
|
||||
/*! total number of threads */
|
||||
int totalThreads;
|
||||
/*! number of threads that are currently executing jobs */
|
||||
int busyThreads;
|
||||
/*! number of persistent threads */
|
||||
int persistentThreads;
|
||||
/*! free list of jobs */
|
||||
FreeList jobFreeList;
|
||||
/*! low priority job Q */
|
||||
LinkedList lowJobQ;
|
||||
/*! med priority job Q */
|
||||
LinkedList medJobQ;
|
||||
/*! high priority job Q */
|
||||
LinkedList highJobQ;
|
||||
/*! persistent job */
|
||||
ThreadPoolJob *persistentJob;
|
||||
/*! thread pool attributes */
|
||||
ThreadPoolAttr attr;
|
||||
/*! statistics */
|
||||
ThreadPoolStats stats;
|
||||
} ThreadPool;
|
||||
|
||||
/*!
|
||||
* \brief Initializes and starts ThreadPool. Must be called first and
|
||||
* only once for ThreadPool.
|
||||
*
|
||||
* \return
|
||||
* \li \c 0 on success.
|
||||
* \li \c EAGAIN if not enough system resources to create minimum threads.
|
||||
* \li \c INVALID_POLICY if schedPolicy can't be set.
|
||||
* \li \c EMAXTHREADS if minimum threads is greater than maximum threads.
|
||||
*/
|
||||
int ThreadPoolInit(
|
||||
/*! Must be valid, non null, pointer to ThreadPool. */
|
||||
ThreadPool *tp,
|
||||
/*! Can be null. if not null then attr contains the following fields:
|
||||
* \li \c minWorkerThreads - minimum number of worker threads thread
|
||||
* pool will never have less than this number of threads.
|
||||
* \li \c maxWorkerThreads - maximum number of worker threads thread
|
||||
* pool will never have more than this number of threads.
|
||||
* \li \c maxIdleTime - maximum time that a worker thread will spend
|
||||
* idle. If a worker is idle longer than this time and there are more
|
||||
* than the min number of workers running, then the worker thread
|
||||
* exits.
|
||||
* \li \c jobsPerThread - ratio of jobs to thread to try and maintain
|
||||
* if a job is scheduled and the number of jobs per thread is greater
|
||||
* than this number,and if less than the maximum number of workers are
|
||||
* running then a new thread is started to help out with efficiency.
|
||||
* \li \c schedPolicy - scheduling policy to try and set (OS dependent).
|
||||
*/
|
||||
ThreadPoolAttr *attr);
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolInit
|
||||
/*!
|
||||
* \brief Adds a persistent job to the thread pool.
|
||||
*
|
||||
* Description:
|
||||
* Initializes and starts ThreadPool. Must be called first.
|
||||
* And only once for ThreadPool.
|
||||
* Parameters:
|
||||
* tp - must be valid, non null, pointer to ThreadPool.
|
||||
* attr - can be null
|
||||
*
|
||||
* if not null then attr contains the following fields:
|
||||
*
|
||||
* minWorkerThreads - minimum number of worker threads
|
||||
* thread pool will never have less than this
|
||||
* number of threads.
|
||||
* maxWorkerThreads - maximum number of worker threads
|
||||
* thread pool will never have more than this
|
||||
* number of threads.
|
||||
* maxIdleTime - maximum time that a worker thread will spend
|
||||
* idle. If a worker is idle longer than this
|
||||
* time and there are more than the min
|
||||
* number of workers running, than the
|
||||
* worker thread exits.
|
||||
* jobsPerThread - ratio of jobs to thread to try and maintain
|
||||
* if a job is scheduled and the number of jobs per
|
||||
* thread is greater than this number,and
|
||||
* if less than the maximum number of
|
||||
* workers are running then a new thread is
|
||||
* started to help out with efficiency.
|
||||
* schedPolicy - scheduling policy to try and set (OS dependent)
|
||||
* Returns:
|
||||
* 0 on success, nonzero on failure.
|
||||
* EAGAIN if not enough system resources to create minimum threads.
|
||||
* INVALID_POLICY if schedPolicy can't be set
|
||||
* EMAXTHREADS if minimum threads is greater than maximum threads
|
||||
*****************************************************************************/
|
||||
int ThreadPoolInit(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolAddPersistent
|
||||
*
|
||||
* Description:
|
||||
* Adds a persistent job to the thread pool.
|
||||
* Job will be run as soon as possible.
|
||||
* Call will block until job is scheduled.
|
||||
* Parameters:
|
||||
* tp - valid thread pool pointer
|
||||
* ThreadPoolJob - valid thread pool job with the following fields:
|
||||
*
|
||||
* func - ThreadFunction to run
|
||||
* arg - argument to function.
|
||||
* priority - priority of job.
|
||||
* Job will be run as soon as possible. Call will block until job is scheduled.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, nonzero on failure
|
||||
* EOUTOFMEM not enough memory to add job.
|
||||
* EMAXTHREADS not enough threads to add persistent job.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolAddPersistent(ThreadPool*tp, ThreadPoolJob *job, int *jobId);
|
||||
* \return
|
||||
* \li \c 0 on success.
|
||||
* \li \c EOUTOFMEM not enough memory to add job.
|
||||
* \li \c EMAXTHREADS not enough threads to add persistent job.
|
||||
*/
|
||||
int ThreadPoolAddPersistent(
|
||||
/*! Valid thread pool pointer. */
|
||||
ThreadPool*tp,
|
||||
/*! Valid thread pool job. */
|
||||
ThreadPoolJob *job,
|
||||
/*! . */
|
||||
int *jobId);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolGetAttr
|
||||
/*!
|
||||
* \brief Gets the current set of attributes associated with the thread pool.
|
||||
*
|
||||
* Description:
|
||||
* Gets the current set of attributes
|
||||
* associated with the thread pool.
|
||||
* Parameters:
|
||||
* tp - valid thread pool pointer
|
||||
* out - non null pointer to store attributes
|
||||
* Returns:
|
||||
* 0 on success, nonzero on failure
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolGetAttr(ThreadPool *tp, ThreadPoolAttr *out);
|
||||
* \return
|
||||
* \li \c 0 on success, nonzero on failure.
|
||||
*/
|
||||
int ThreadPoolGetAttr(
|
||||
/*! valid thread pool pointer. */
|
||||
ThreadPool *tp,
|
||||
/*! non null pointer to store attributes. */
|
||||
ThreadPoolAttr *out);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolSetAttr
|
||||
/*!
|
||||
* \brief Sets the attributes for the thread pool.
|
||||
* Only affects future calculations.
|
||||
*
|
||||
* Description:
|
||||
* Sets the attributes for the thread pool.
|
||||
* Only affects future calculations.
|
||||
* Parameters:
|
||||
* tp - valid thread pool pointer
|
||||
* attr - pointer to attributes, null sets attributes to default.
|
||||
* Returns:
|
||||
* 0 on success, nonzero on failure
|
||||
* Returns INVALID_POLICY if policy can not be set.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolSetAttr(ThreadPool *tp, ThreadPoolAttr *attr);
|
||||
* \return
|
||||
* \li \c 0 on success, nonzero on failure.
|
||||
* \li \c INVALID_POLICY if policy can not be set.
|
||||
*/
|
||||
int ThreadPoolSetAttr(
|
||||
/*! valid thread pool pointer. */
|
||||
ThreadPool *tp,
|
||||
/*! pointer to attributes, null sets attributes to default. */
|
||||
ThreadPoolAttr *attr);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolAdd
|
||||
/*!
|
||||
* \brief Adds a job to the thread pool. Job will be run as soon as possible.
|
||||
*
|
||||
* Description:
|
||||
* Adds a job to the thread pool.
|
||||
* Job will be run as soon as possible.
|
||||
* Parameters:
|
||||
* tp - valid thread pool pointer
|
||||
* func - ThreadFunction to run
|
||||
* arg - argument to function.
|
||||
* priority - priority of job.
|
||||
* poolid - id of job
|
||||
* free_function - function to use when freeing argument
|
||||
* Returns:
|
||||
* 0 on success, nonzero on failure
|
||||
* EOUTOFMEM if not enough memory to add job.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolAdd (ThreadPool*tp, ThreadPoolJob *job, int *jobId);
|
||||
* \return
|
||||
* \li \c 0 on success, nonzero on failure.
|
||||
* \li \c EOUTOFMEM if not enough memory to add job.
|
||||
*/
|
||||
int ThreadPoolAdd(
|
||||
/*! valid thread pool pointer. */
|
||||
ThreadPool*tp,
|
||||
/*! . */
|
||||
ThreadPoolJob *job,
|
||||
/*! id of job. */
|
||||
int *jobId);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolRemove
|
||||
/*!
|
||||
* \brief Removes a job from the thread pool. Can only remove jobs which
|
||||
* are not currently running.
|
||||
*
|
||||
* Description:
|
||||
* Removes a job from the thread pool.
|
||||
* Can only remove jobs which are not
|
||||
* currently running.
|
||||
* Parameters:
|
||||
* tp - valid thread pool pointer
|
||||
* jobid - id of job
|
||||
* out - space for removed job.
|
||||
* Returns:
|
||||
* 0 on success, nonzero on failure.
|
||||
* INVALID_JOB_ID if job not found.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolRemove(ThreadPool *tp, int jobId, ThreadPoolJob *out);
|
||||
* \return
|
||||
* \li \c 0 on success, nonzero on failure.
|
||||
* \li \c INVALID_JOB_ID if job not found.
|
||||
*/
|
||||
int ThreadPoolRemove(
|
||||
/*! valid thread pool pointer. */
|
||||
ThreadPool *tp,
|
||||
/*! id of job. */
|
||||
int jobId,
|
||||
/*! space for removed job. */
|
||||
ThreadPoolJob *out);
|
||||
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolShutdown
|
||||
/*!
|
||||
* \brief Shuts the thread pool down. Waits for all threads to finish.
|
||||
* May block indefinitely if jobs do not exit.
|
||||
*
|
||||
* Description:
|
||||
* Shuts the thread pool down.
|
||||
* Waits for all threads to finish.
|
||||
* May block indefinitely if jobs do not
|
||||
* exit.
|
||||
* Parameters:
|
||||
* tp - must be valid tp
|
||||
* Returns:
|
||||
* 0 on success, nonzero on failure
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int ThreadPoolShutdown(ThreadPool *tp);
|
||||
* \return 0 on success, nonzero on failure
|
||||
*/
|
||||
int ThreadPoolShutdown(
|
||||
/*! must be valid tp. */
|
||||
ThreadPool *tp);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPJobInit
|
||||
/*!
|
||||
* \brief Initializes thread pool job. Sets the priority to default defined
|
||||
* in ThreadPool.h. Sets the free_routine to default defined in ThreadPool.h.
|
||||
*
|
||||
* Description:
|
||||
* Initializes thread pool job.
|
||||
* Sets the priority to default defined in ThreadPool.h.
|
||||
* Sets the free_routine to default defined in ThreadPool.h
|
||||
* Parameters:
|
||||
* ThreadPoolJob *job - must be valid thread pool attributes.
|
||||
* start_routine func - function to run, must be valid
|
||||
* void * arg - argument to pass to function.
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPJobInit(ThreadPoolJob *job, start_routine func, void *arg);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPJobInit(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolJob *job,
|
||||
/*! function to run, must be valid. */
|
||||
start_routine func,
|
||||
/*! argument to pass to function. */
|
||||
void *arg);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPJobSetPriority
|
||||
/*!
|
||||
* \brief Sets the max threads for the thread pool attributes.
|
||||
*
|
||||
* Description:
|
||||
* Sets the max threads for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* maxThreads - value to set
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPJobSetPriority(ThreadPoolJob *job, ThreadPriority priority);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPJobSetPriority(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolJob *job,
|
||||
/*! value to set. */
|
||||
ThreadPriority priority);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPJobSetFreeFunction
|
||||
/*!
|
||||
* \brief Sets the max threads for the thread pool attributes.
|
||||
*
|
||||
* Description:
|
||||
* Sets the max threads for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* maxThreads - value to set
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPJobSetFreeFunction(ThreadPoolJob *job, free_routine func);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPJobSetFreeFunction(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolJob *job,
|
||||
/*! value to set. */
|
||||
free_routine func);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrInit
|
||||
/*!
|
||||
* \brief Initializes thread pool attributes. Sets values to defaults defined
|
||||
* in ThreadPool.h.
|
||||
*
|
||||
* Description:
|
||||
* Initializes thread pool attributes.
|
||||
* Sets values to defaults defined in ThreadPool.h.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrInit(ThreadPoolAttr *attr);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrInit(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetMaxThreads
|
||||
/*!
|
||||
* \brief Sets the max threads for the thread pool attributes.
|
||||
*
|
||||
* Description:
|
||||
* Sets the max threads for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* maxThreads - value to set
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrSetMaxThreads(ThreadPoolAttr *attr, int maxThreads);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetMaxThreads(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! value to set. */
|
||||
int maxThreads);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetMinThreads
|
||||
/*!
|
||||
* \brief Sets the min threads for the thread pool attributes.
|
||||
*
|
||||
* Description:
|
||||
* Sets the min threads for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* minThreads - value to set
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrSetMinThreads(ThreadPoolAttr *attr, int minThreads);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetMinThreads(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! value to set. */
|
||||
int minThreads);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetIdleTime
|
||||
/*!
|
||||
* \brief Sets the stack size for the thread pool attributes.
|
||||
*
|
||||
* Description:
|
||||
* Sets the idle time for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrSetIdleTime(ThreadPoolAttr *attr, int idleTime);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetStackSize(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! value to set. */
|
||||
size_t stackSize);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetJobsPerThread
|
||||
/*!
|
||||
* \brief Sets the idle time for the thread pool attributes.
|
||||
*
|
||||
* Description:
|
||||
* Sets the jobs per thread ratio
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* jobsPerThread - number of jobs per thread to maintain
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrSetJobsPerThread(ThreadPoolAttr *attr, int jobsPerThread);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetIdleTime(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! . */
|
||||
int idleTime);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetStarvationTime
|
||||
/*!
|
||||
* \brief Sets the jobs per thread ratio
|
||||
*
|
||||
* Description:
|
||||
* Sets the starvation time for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* int starvationTime - milliseconds
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrSetStarvationTime(ThreadPoolAttr *attr, int starvationTime);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetJobsPerThread(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! number of jobs per thread to maintain. */
|
||||
int jobsPerThread);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetSchedPolicy
|
||||
/*!
|
||||
* \brief Sets the starvation time for the thread pool attributes.
|
||||
*
|
||||
* Description:
|
||||
* Sets the scheduling policy for the thread pool attributes.
|
||||
* Parameters:
|
||||
* attr - must be valid thread pool attributes.
|
||||
* PolicyType schedPolicy - must be a valid policy type.
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int TPAttrSetSchedPolicy(ThreadPoolAttr *attr, PolicyType schedPolicy);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetStarvationTime(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! milliseconds. */
|
||||
int starvationTime);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TPAttrSetMaxJobsTotal
|
||||
/*!
|
||||
* \brief Sets the scheduling policy for the thread pool attributes.
|
||||
*
|
||||
* 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);
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetSchedPolicy(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! must be a valid policy type. */
|
||||
PolicyType schedPolicy);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ThreadPoolGetStats
|
||||
/*!
|
||||
* \brief Sets the maximum number jobs that can be qeued totally.
|
||||
*
|
||||
* Description:
|
||||
* Returns various statistics about the
|
||||
* thread pool.
|
||||
* Only valid if STATS has been defined.
|
||||
* Parameters:
|
||||
* ThreadPool *tp - valid initialized threadpool
|
||||
* ThreadPoolStats *stats - valid stats, out parameter
|
||||
* Returns:
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
int TPAttrSetMaxJobsTotal(
|
||||
/*! must be valid thread pool attributes. */
|
||||
ThreadPoolAttr *attr,
|
||||
/*! maximum number of jobs. */
|
||||
int maxJobsTotal);
|
||||
|
||||
/*!
|
||||
* \brief Returns various statistics about the thread pool.
|
||||
*
|
||||
* Only valid if STATS has been defined.
|
||||
*
|
||||
* \return Always returns 0.
|
||||
*/
|
||||
#ifdef STATS
|
||||
EXPORT_SPEC int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats);
|
||||
|
||||
EXPORT_SPEC void ThreadPoolPrintStats(ThreadPoolStats *stats);
|
||||
EXPORT_SPEC int ThreadPoolGetStats(
|
||||
/*! Valid initialized threadpool. */
|
||||
ThreadPool *tp,
|
||||
/*! Valid stats, out parameter. */
|
||||
ThreadPoolStats *stats);
|
||||
#else
|
||||
static UPNP_INLINE int ThreadPoolGetStats(ThreadPool *tp, ThreadPoolStats *stats) {}
|
||||
|
||||
static UPNP_INLINE void ThreadPoolPrintStats(ThreadPoolStats *stats) {}
|
||||
static UPNP_INLINE int ThreadPoolGetStats(
|
||||
/*! Valid initialized threadpool. */
|
||||
ThreadPool *tp,
|
||||
/*! Valid stats, out parameter. */
|
||||
ThreadPoolStats *stats) {}
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
#ifdef STATS
|
||||
EXPORT_SPEC void ThreadPoolPrintStats(
|
||||
/*! . */
|
||||
ThreadPoolStats *stats);
|
||||
#else
|
||||
static UPNP_INLINE void ThreadPoolPrintStats(
|
||||
/*! . */
|
||||
ThreadPoolStats *stats) {}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* THREADPOOL_H */
|
||||
|
||||
|
||||
@@ -32,9 +32,13 @@
|
||||
#ifndef TIMERTHREAD_H
|
||||
#define TIMERTHREAD_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "FreeList.h"
|
||||
#include "ithread.h"
|
||||
#include "LinkedList.h"
|
||||
#include "FreeList.h"
|
||||
#include "ThreadPool.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -43,146 +47,111 @@ 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 */
|
||||
typedef enum timeoutType {ABS_SEC,REL_SEC} TimeoutType;
|
||||
/*! Timeout Types. */
|
||||
typedef enum timeoutType {
|
||||
/*! seconds from Jan 1, 1970. */
|
||||
ABS_SEC,
|
||||
/*! seconds from current time. */
|
||||
REL_SEC
|
||||
} TimeoutType;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: TimerThread
|
||||
*
|
||||
* Description:
|
||||
* A timer thread similar to the one in the Upnp SDK that allows
|
||||
* the scheduling of a job to run at a specified time in the future
|
||||
* Because the timer thread uses the thread pool there is no
|
||||
* gurantee of timing, only approximate timing.
|
||||
* Uses ThreadPool, Mutex, Condition, Thread
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*!
|
||||
* A timer thread similar to the one in the Upnp SDK that allows
|
||||
* the scheduling of a job to run at a specified time in the future.
|
||||
*
|
||||
* Because the timer thread uses the thread pool there is no
|
||||
* gurantee of timing, only approximate timing.
|
||||
*
|
||||
* Uses ThreadPool, Mutex, Condition, Thread.
|
||||
*/
|
||||
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;
|
||||
ithread_cond_t condition;
|
||||
int lastEventId;
|
||||
LinkedList eventQ;
|
||||
int shutdown;
|
||||
FreeList freeEvents;
|
||||
ThreadPool *tp;
|
||||
} TimerThread;
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Name: TimerEvent
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Struct to contain information for a timer event.
|
||||
* Internal to the TimerThread
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*!
|
||||
* Struct to contain information for a timer event.
|
||||
*
|
||||
* Internal to the 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;
|
||||
ThreadPoolJob job;
|
||||
/*! [in] Absolute time for event in seconds since Jan 1, 1970. */
|
||||
time_t eventTime;
|
||||
/*! [in] Long term or short term job. */
|
||||
Duration persistent;
|
||||
int id;
|
||||
} TimerEvent;
|
||||
|
||||
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadInit
|
||||
*
|
||||
* Description:
|
||||
* Initializes and starts timer thread.
|
||||
/*!
|
||||
* \brief Initializes and starts timer thread.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* tp - valid thread pool to use. Must be
|
||||
* started. Must be valid for lifetime
|
||||
* of timer. Timer must be shutdown
|
||||
* BEFORE thread pool.
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* Returns error from ThreadPoolAddPersistent on failure.
|
||||
*
|
||||
************************************************************************/
|
||||
int TimerThreadInit(TimerThread *timer,
|
||||
ThreadPool *tp);
|
||||
* \return 0 on success, nonzero on failure. Returns error from
|
||||
* ThreadPoolAddPersistent on failure.
|
||||
*/
|
||||
int TimerThreadInit(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread *timer,
|
||||
/*! [in] Valid thread pool to use. Must be started. Must be valid for
|
||||
* lifetime of timer. Timer must be shutdown BEFORE thread pool. */
|
||||
ThreadPool *tp);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadSchedule
|
||||
*
|
||||
* Description:
|
||||
* Schedules an event to run at a specified time.
|
||||
/*!
|
||||
* \brief Schedules an event to run at a specified time.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* time_t - time of event.
|
||||
* either in absolute seconds,
|
||||
* or relative seconds in the future.
|
||||
* timeoutType - either ABS_SEC, or REL_SEC.
|
||||
* if REL_SEC, then the event
|
||||
* will be scheduled at the
|
||||
* current time + REL_SEC.
|
||||
* job-> valid Thread pool job with following fields
|
||||
* func - function to schedule
|
||||
* arg - argument to function
|
||||
* priority - priority of job.
|
||||
*
|
||||
* id - id of timer event. (out, can be null)
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* EOUTOFMEM if not enough memory to schedule job.
|
||||
*
|
||||
************************************************************************/
|
||||
int TimerThreadSchedule(TimerThread* timer,
|
||||
time_t time,
|
||||
TimeoutType type,
|
||||
ThreadPoolJob *job,
|
||||
Duration duration,
|
||||
int *id);
|
||||
* \return 0 on success, nonzero on failure, EOUTOFMEM if not enough memory
|
||||
* to schedule job.
|
||||
*/
|
||||
int TimerThreadSchedule(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread* timer,
|
||||
/*! [in] time of event. Either in absolute seconds, or relative
|
||||
* seconds in the future. */
|
||||
time_t time,
|
||||
/*! [in] either ABS_SEC, or REL_SEC. If REL_SEC, then the event
|
||||
* will be scheduled at the current time + REL_SEC. */
|
||||
TimeoutType type,
|
||||
/*! [in] Valid Thread pool job with following fields. */
|
||||
ThreadPoolJob *job,
|
||||
/*! [in] . */
|
||||
Duration duration,
|
||||
/*! [in] Id of timer event. (out, can be null). */
|
||||
int *id);
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadRemove
|
||||
*
|
||||
* Description:
|
||||
* Removes an event from the timer Q.
|
||||
* Events can only be removed
|
||||
* before they have been placed in the
|
||||
* thread pool.
|
||||
/*!
|
||||
* \brief Removes an event from the timer Q.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* id - id of event to remove.
|
||||
* ThreadPoolJob *out - space for thread pool job.
|
||||
* Return:
|
||||
* 0 on success,
|
||||
* INVALID_EVENT_ID on failure
|
||||
*
|
||||
************************************************************************/
|
||||
int TimerThreadRemove(TimerThread *timer,
|
||||
int id,
|
||||
ThreadPoolJob *out);
|
||||
* Events can only be removed before they have been placed in the thread pool.
|
||||
*
|
||||
* \return 0 on success, INVALID_EVENT_ID on failure.
|
||||
*/
|
||||
int TimerThreadRemove(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread *timer,
|
||||
/*! [in] Id of event to remove. */
|
||||
int id,
|
||||
/*! [in] Space for thread pool job. */
|
||||
ThreadPoolJob *out);
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadShutdown
|
||||
*
|
||||
* Description:
|
||||
* Shutdown the timer thread
|
||||
* Events scheduled in the future will NOT be run.
|
||||
* Timer thread should be shutdown BEFORE it's associated
|
||||
* thread pool.
|
||||
* Returns:
|
||||
* returns 0 if succesfull,
|
||||
* nonzero otherwise.
|
||||
* Always returns 0.
|
||||
***********************************************************************/
|
||||
int TimerThreadShutdown(TimerThread *timer);
|
||||
/*!
|
||||
* \brief Shutdown the timer thread.
|
||||
*
|
||||
* Events scheduled in the future will NOT be run.
|
||||
*
|
||||
* Timer thread should be shutdown BEFORE it's associated thread pool.
|
||||
*
|
||||
* \return 0 if succesfull, nonzero otherwise. Always returns 0.
|
||||
*/
|
||||
int TimerThreadShutdown(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread *timer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef PTHREAD_MUTEX_RECURSIVE
|
||||
#if defined(PTHREAD_MUTEX_RECURSIVE) || defined(__DragonFly__)
|
||||
/* This system has SuS2-compliant mutex attributes.
|
||||
* E.g. on Cygwin, where we don't have the old nonportable (NP) symbols
|
||||
*/
|
||||
@@ -85,7 +85,10 @@ extern "C" {
|
||||
|
||||
#define ITHREAD_CANCELED PTHREAD_CANCELED
|
||||
|
||||
|
||||
|
||||
#define ITHREAD_STACK_MIN PTHREAD_STACK_MIN
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Name: ithread_t
|
||||
*
|
||||
@@ -171,7 +174,9 @@ typedef pthread_condattr_t ithread_condattr_t;
|
||||
* typedef to pthread_rwlockattr_t
|
||||
* Internal Use Only
|
||||
***************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
typedef pthread_rwlockattr_t ithread_rwlockattr_t;
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -182,7 +187,12 @@ typedef pthread_rwlockattr_t ithread_rwlockattr_t;
|
||||
* typedef to pthread_rwlock_t
|
||||
* Internal Use Only
|
||||
***************************************************************************/
|
||||
typedef pthread_rwlock_t ithread_rwlock_t;
|
||||
#if UPNP_USE_RWLOCK
|
||||
typedef pthread_rwlock_t ithread_rwlock_t;
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
typedef ithread_mutex_t ithread_rwlock_t;
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -326,11 +336,11 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Returns EINVAL if the kind is not supported.
|
||||
* See man page for pthread_mutexattr_setkind_np
|
||||
*****************************************************************************/
|
||||
#ifdef PTHREAD_MUTEX_RECURSIVE
|
||||
#if defined(PTHREAD_MUTEX_RECURSIVE) || defined(__DragonFly__)
|
||||
#define ithread_mutexattr_setkind_np pthread_mutexattr_settype
|
||||
#else
|
||||
#define ithread_mutexattr_setkind_np pthread_mutexattr_setkind_np
|
||||
#endif
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_mutexattr_getkind_np
|
||||
@@ -351,11 +361,11 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_mutexattr_getkind_np
|
||||
*****************************************************************************/
|
||||
#ifdef PTHREAD_MUTEX_RECURSIVE
|
||||
#if defined(PTHREAD_MUTEX_RECURSIVE) || defined(__DragonFly__)
|
||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
|
||||
#else
|
||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
|
||||
#endif
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -443,7 +453,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlockattr_init
|
||||
***************************************************************************/
|
||||
#define ithread_rwlockattr_init pthread_rwlockattr_init
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockattr_init pthread_rwlockattr_init
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -459,7 +471,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlockattr_destroy
|
||||
***************************************************************************/
|
||||
#define ithread_rwlockattr_destroy pthread_rwlockattr_destroy
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockattr_destroy pthread_rwlockattr_destroy
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -480,7 +494,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Returns EINVAL if the kind is not supported.
|
||||
* See man page for pthread_rwlockattr_setkind_np
|
||||
*****************************************************************************/
|
||||
#define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockatttr_setpshared pthread_rwlockatttr_setpshared
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -501,7 +517,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlockatttr_getpshared
|
||||
*****************************************************************************/
|
||||
#define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlockatttr_getpshared pthread_rwlockatttr_getpshared
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -519,8 +537,12 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_init
|
||||
*****************************************************************************/
|
||||
#define ithread_rwlock_init pthread_rwlock_init
|
||||
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_init pthread_rwlock_init
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_init ithread_mutex_init
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_rwlock_rdlock
|
||||
@@ -536,8 +558,12 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_rdlock
|
||||
*****************************************************************************/
|
||||
#define ithread_rwlock_rdlock pthread_rwlock_rdlock
|
||||
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_rdlock pthread_rwlock_rdlock
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_rdlock ithread_mutex_lock
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_rwlock_wrlock
|
||||
@@ -553,7 +579,12 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_wrlock
|
||||
*****************************************************************************/
|
||||
#define ithread_rwlock_wrlock pthread_rwlock_wrlock
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_wrlock pthread_rwlock_wrlock
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_wrlock ithread_mutex_lock
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -571,7 +602,12 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_unlock
|
||||
*****************************************************************************/
|
||||
#define ithread_rwlock_unlock pthread_rwlock_unlock
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_unlock pthread_rwlock_unlock
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_unlock ithread_mutex_unlock
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -590,7 +626,12 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* Always returns 0.
|
||||
* See man page for pthread_rwlock_destroy
|
||||
*****************************************************************************/
|
||||
#define ithread_rwlock_destroy pthread_rwlock_destroy
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_destroy pthread_rwlock_destroy
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_destroy ithread_mutex_destroy
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -704,6 +745,49 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
***************************************************************************/
|
||||
#define ithread_cond_destroy pthread_cond_destroy
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_attr_init
|
||||
*
|
||||
* Description:
|
||||
* Initialises thread attribute object.
|
||||
* Parameters:
|
||||
* ithread_attr_t *attr (must be valid non NULL pointer to
|
||||
* ithread_attr_t)
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* See man page for pthread_attr_init
|
||||
***************************************************************************/
|
||||
#define ithread_attr_init pthread_attr_init
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_attr_destroy
|
||||
*
|
||||
* Description:
|
||||
* Destroys thread attribute object.
|
||||
* Parameters:
|
||||
* ithread_attr_t *attr (must be valid non NULL pointer to
|
||||
* ithread_attr_t)
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* See man page for pthread_attr_destroy
|
||||
***************************************************************************/
|
||||
#define ithread_attr_destroy pthread_attr_destroy
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_attr_setstacksize
|
||||
*
|
||||
* Description:
|
||||
* Sets stack size of a thread attribute object.
|
||||
* Parameters:
|
||||
* ithread_attr_t *attr (must be valid non NULL pointer to
|
||||
* ithread_attr_t)
|
||||
* size_t stacksize (value of stacksize must be greater than
|
||||
* ITHREAD_STACK_MIN and lower than system-imposed limits
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* See man page for pthread_attr_setstacksize
|
||||
***************************************************************************/
|
||||
#define ithread_attr_setstacksize pthread_attr_setstacksize
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_create
|
||||
@@ -713,7 +797,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
* and argument.
|
||||
* Parameters:
|
||||
* ithread_t * thread (must be valid non NULL pointer to pthread_t)
|
||||
* ithread_attr_t *attr, IGNORED
|
||||
* ithread_attr_t *attr
|
||||
* void * (start_routine) (void *arg) (start routine)
|
||||
* void * arg - argument.
|
||||
* Returns:
|
||||
@@ -849,7 +933,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef PTHREAD_MUTEX_RECURSIVE
|
||||
#if !defined(PTHREAD_MUTEX_RECURSIVE) && !defined(__DragonFly__)
|
||||
/* NK: Added for satisfying the gcc compiler */
|
||||
EXPORT_SPEC int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind);
|
||||
#endif
|
||||
|
||||
@@ -1,177 +1,111 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "FreeList.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListInit
|
||||
*
|
||||
* Description:
|
||||
* Initializes Free List. Must be called first.
|
||||
* And only once for FreeList.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a linked list.
|
||||
* size_t - size of elements to store in free list
|
||||
* maxFreeListSize - max size that the free list can grow to
|
||||
* before returning memory to O.S.
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int
|
||||
FreeListInit( FreeList * free_list,
|
||||
size_t elementSize,
|
||||
int maxFreeListLength )
|
||||
int FreeListInit(FreeList *free_list, size_t elementSize, int maxFreeListLength)
|
||||
{
|
||||
assert( free_list != NULL );
|
||||
assert(free_list != NULL);
|
||||
|
||||
if( free_list == NULL )
|
||||
return EINVAL;
|
||||
if (free_list == NULL)
|
||||
return EINVAL;
|
||||
free_list->element_size = elementSize;
|
||||
free_list->maxFreeListLength = maxFreeListLength;
|
||||
free_list->head = NULL;
|
||||
free_list->freeListLength = 0;
|
||||
|
||||
free_list->element_size = elementSize;
|
||||
free_list->maxFreeListLength = maxFreeListLength;
|
||||
free_list->head = NULL;
|
||||
free_list->freeListLength = 0;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListAlloc
|
||||
*
|
||||
* Description:
|
||||
* Allocates chunk of set size.
|
||||
* If a free item is available in the list, returnes the stored item.
|
||||
* Otherwise calls the O.S. to allocate memory.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a linked list.
|
||||
* Returns:
|
||||
* Non NULL on success. NULL on failure.
|
||||
*****************************************************************************/
|
||||
void *
|
||||
FreeListAlloc( FreeList * free_list )
|
||||
void *FreeListAlloc(FreeList *free_list)
|
||||
{
|
||||
FreeListNode *ret = NULL;
|
||||
FreeListNode *ret = NULL;
|
||||
|
||||
assert( free_list != NULL );
|
||||
assert(free_list != NULL);
|
||||
|
||||
if( free_list == NULL )
|
||||
return NULL;
|
||||
if (free_list == NULL)
|
||||
return NULL;
|
||||
|
||||
if( free_list->head ) {
|
||||
ret = free_list->head;
|
||||
free_list->head = free_list->head->next;
|
||||
free_list->freeListLength--;
|
||||
} else {
|
||||
ret = malloc( free_list->element_size );
|
||||
}
|
||||
if (free_list->head) {
|
||||
ret = free_list->head;
|
||||
free_list->head = free_list->head->next;
|
||||
free_list->freeListLength--;
|
||||
} else {
|
||||
ret = malloc(free_list->element_size);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListFree
|
||||
*
|
||||
* Description:
|
||||
* Returns an item to the Free List.
|
||||
* If the free list is smaller than the max size than
|
||||
* adds the item to the free list.
|
||||
* Otherwise returns the item to the O.S.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a free list.
|
||||
* element - must be a pointer allocated by FreeListAlloc
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int
|
||||
FreeListFree( FreeList * free_list,
|
||||
void *element )
|
||||
int FreeListFree(FreeList *free_list, void *element)
|
||||
{
|
||||
FreeListNode *temp = NULL;
|
||||
|
||||
FreeListNode *temp = NULL;
|
||||
assert(free_list != NULL);
|
||||
|
||||
assert( free_list != NULL );
|
||||
if (free_list == NULL)
|
||||
return EINVAL;
|
||||
if (element != NULL &&
|
||||
free_list->freeListLength + 1 < free_list->maxFreeListLength) {
|
||||
free_list->freeListLength++;
|
||||
temp = (FreeListNode *)element;
|
||||
temp->next = free_list->head;
|
||||
free_list->head = temp;
|
||||
} else {
|
||||
free(element);
|
||||
}
|
||||
|
||||
if( free_list == NULL )
|
||||
return EINVAL;
|
||||
|
||||
if( ( element != NULL ) &&
|
||||
( ( free_list->freeListLength + 1 ) <
|
||||
free_list->maxFreeListLength ) ) {
|
||||
free_list->freeListLength++;
|
||||
temp = ( FreeListNode * ) element;
|
||||
temp->next = free_list->head;
|
||||
free_list->head = temp;
|
||||
|
||||
} else {
|
||||
|
||||
free( element );
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeListDestroy
|
||||
*
|
||||
* Description:
|
||||
* Releases the resources stored with the free list.
|
||||
* Parameters:
|
||||
* free_list - must be valid, non null, pointer to a linked list.
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* Always returns 0.
|
||||
*****************************************************************************/
|
||||
int
|
||||
FreeListDestroy( FreeList * free_list )
|
||||
int FreeListDestroy(FreeList *free_list)
|
||||
{
|
||||
FreeListNode *temp = NULL;
|
||||
int i = 0;
|
||||
FreeListNode *temp = NULL;
|
||||
int i = 0;
|
||||
|
||||
assert( free_list != NULL );
|
||||
assert(free_list != NULL);
|
||||
|
||||
if( free_list == NULL )
|
||||
return EINVAL;
|
||||
if (!free_list)
|
||||
return EINVAL;
|
||||
while (free_list->head) {
|
||||
i++;
|
||||
temp = free_list->head->next;
|
||||
free(free_list->head);
|
||||
free_list->head = temp;
|
||||
}
|
||||
free_list->freeListLength = 0;
|
||||
|
||||
while( free_list->head ) {
|
||||
i++;
|
||||
temp = free_list->head->next;
|
||||
free( free_list->head );
|
||||
free_list->head = temp;
|
||||
}
|
||||
|
||||
free_list->freeListLength = 0;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,537 +1,309 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 "LinkedList.h"
|
||||
#ifndef WIN32
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <sys/param.h> */
|
||||
#else
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#if (defined(BSD) && BSD >= 199306) || defined(__OSX__) || defined(__APPLE__)
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
#include <malloc.h>
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
static int
|
||||
freeListNode( ListNode * node,
|
||||
LinkedList * list )
|
||||
static int freeListNode(ListNode *node, LinkedList *list)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
return FreeListFree( &list->freeNodeList, node );
|
||||
return FreeListFree(&list->freeNodeList, node);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: CreateListNode
|
||||
*
|
||||
* Description:
|
||||
* Creates a list node. Dynamically.
|
||||
/*!
|
||||
* \brief Dynamically creates a list node.
|
||||
*
|
||||
* Parameters:
|
||||
* void * item - the item to store
|
||||
* Returns:
|
||||
* The new node, NULL on failure.
|
||||
*****************************************************************************/
|
||||
static ListNode *
|
||||
CreateListNode( void *item,
|
||||
LinkedList * list )
|
||||
*/
|
||||
static ListNode *CreateListNode(
|
||||
/*! the item to store. */
|
||||
void *item,
|
||||
/*! The list to add it to. */
|
||||
LinkedList *list)
|
||||
{
|
||||
ListNode *temp = NULL;
|
||||
|
||||
ListNode *temp = NULL;
|
||||
assert(list != NULL);
|
||||
|
||||
assert( list != NULL );
|
||||
temp = (ListNode *)FreeListAlloc(&list->freeNodeList);
|
||||
if (temp) {
|
||||
temp->prev = NULL;
|
||||
temp->next = NULL;
|
||||
temp->item = item;
|
||||
}
|
||||
|
||||
temp = ( ListNode * ) FreeListAlloc( &list->freeNodeList );
|
||||
if( temp ) {
|
||||
temp->prev = NULL;
|
||||
temp->next = NULL;
|
||||
temp->item = item;
|
||||
}
|
||||
return temp;
|
||||
return temp;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListInit
|
||||
*
|
||||
* Description:
|
||||
* Initializes LinkedList. Must be called first.
|
||||
* And only once for List.
|
||||
* Parameters:
|
||||
* list - must be valid, non null, pointer to a linked list.
|
||||
* cmp_func - function used to compare items. (May be NULL)
|
||||
* free_func - function used to free items. (May be NULL)
|
||||
* Returns:
|
||||
* 0 on success, EOUTOFMEM on failure.
|
||||
*****************************************************************************/
|
||||
int
|
||||
ListInit( LinkedList * list,
|
||||
cmp_routine cmp_func,
|
||||
free_function free_func )
|
||||
int ListInit(LinkedList *list, cmp_routine cmp_func, free_function free_func)
|
||||
{
|
||||
int retCode = 0;
|
||||
|
||||
int retCode = 0;
|
||||
assert(list != NULL);
|
||||
|
||||
assert( list != NULL );
|
||||
if (!list)
|
||||
return EINVAL;
|
||||
list->size = 0;
|
||||
list->cmp_func = cmp_func;
|
||||
list->free_func = free_func;
|
||||
retCode = FreeListInit(&list->freeNodeList, sizeof(ListNode), FREELISTSIZE);
|
||||
|
||||
if( list == NULL )
|
||||
return EINVAL;
|
||||
assert(retCode == 0);
|
||||
|
||||
list->size = 0;
|
||||
list->cmp_func = cmp_func;
|
||||
list->free_func = free_func;
|
||||
list->head.item = NULL;
|
||||
list->head.next = &list->tail;
|
||||
list->head.prev = NULL;
|
||||
list->tail.item = NULL;
|
||||
list->tail.prev = &list->head;
|
||||
list->tail.next = NULL;
|
||||
|
||||
retCode =
|
||||
FreeListInit( &list->freeNodeList, sizeof( ListNode ),
|
||||
FREELISTSIZE );
|
||||
|
||||
assert( retCode == 0 );
|
||||
|
||||
list->head.item = NULL;
|
||||
list->head.next = &list->tail;
|
||||
list->head.prev = NULL;
|
||||
|
||||
list->tail.item = NULL;
|
||||
list->tail.prev = &list->head;
|
||||
list->tail.next = NULL;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddHead
|
||||
*
|
||||
* Description:
|
||||
* Adds a node to the head of the list.
|
||||
* Node gets immediately after list.head.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* void * item - item to be added
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListAddHead( LinkedList * list,
|
||||
void *item )
|
||||
ListNode *ListAddHead(LinkedList *list, void *item)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
if( list == NULL )
|
||||
return NULL;
|
||||
if (list == NULL)
|
||||
return NULL;
|
||||
|
||||
return ListAddAfter( list, item, &list->head );
|
||||
return ListAddAfter(list, item, &list->head);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddTail
|
||||
*
|
||||
* Description:
|
||||
* Adds a node to the tail of the list.
|
||||
* Node gets added immediately before list.tail.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* void * item - item to be added
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListAddTail( LinkedList * list,
|
||||
void *item )
|
||||
ListNode *ListAddTail(LinkedList *list, void *item)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
if( list == NULL )
|
||||
return NULL;
|
||||
if (!list)
|
||||
return NULL;
|
||||
|
||||
return ListAddBefore( list, item, &list->tail );
|
||||
return ListAddBefore(list, item, &list->tail);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddAfter
|
||||
*
|
||||
* Description:
|
||||
* Adds a node after the specified node.
|
||||
* Node gets added immediately after bnode.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* void * item - item to be added
|
||||
* ListNode * bnode - node to add after
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListAddAfter( LinkedList * list,
|
||||
void *item,
|
||||
ListNode * bnode )
|
||||
ListNode *ListAddAfter(LinkedList *list, void *item, ListNode *bnode)
|
||||
{
|
||||
ListNode *newNode = NULL;
|
||||
ListNode *newNode = NULL;
|
||||
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
if( ( list == NULL ) || ( bnode == NULL ) )
|
||||
return NULL;
|
||||
if (!list || !bnode)
|
||||
return NULL;
|
||||
newNode = CreateListNode(item, list);
|
||||
if (newNode) {
|
||||
ListNode *temp = bnode->next;
|
||||
|
||||
newNode = CreateListNode( item, list );
|
||||
if( newNode ) {
|
||||
ListNode *temp = bnode->next;
|
||||
bnode->next = newNode;
|
||||
newNode->prev = bnode;
|
||||
newNode->next = temp;
|
||||
temp->prev = newNode;
|
||||
list->size++;
|
||||
|
||||
bnode->next = newNode;
|
||||
newNode->prev = bnode;
|
||||
newNode->next = temp;
|
||||
temp->prev = newNode;
|
||||
list->size++;
|
||||
return newNode;
|
||||
}
|
||||
return NULL;
|
||||
return newNode;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListAddBefore
|
||||
*
|
||||
* Description:
|
||||
* Adds a node before the specified node.
|
||||
* Node gets added immediately before anode.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* ListNode * anode - node to add the in front of.
|
||||
* void * item - item to be added
|
||||
* Returns:
|
||||
* The pointer to the ListNode on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListAddBefore( LinkedList * list,
|
||||
void *item,
|
||||
ListNode * anode )
|
||||
ListNode *ListAddBefore(LinkedList *list, void *item, ListNode *anode)
|
||||
{
|
||||
ListNode *newNode = NULL;
|
||||
ListNode *newNode = NULL;
|
||||
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
if( ( list == NULL ) || ( anode == NULL ) )
|
||||
return NULL;
|
||||
if (!list || !anode)
|
||||
return NULL;
|
||||
newNode = CreateListNode(item, list);
|
||||
if (newNode) {
|
||||
ListNode *temp = anode->prev;
|
||||
|
||||
newNode = CreateListNode( item, list );
|
||||
anode->prev = newNode;
|
||||
newNode->next = anode;
|
||||
newNode->prev = temp;
|
||||
temp->next = newNode;
|
||||
list->size++;
|
||||
|
||||
if( newNode ) {
|
||||
ListNode *temp = anode->prev;
|
||||
return newNode;
|
||||
}
|
||||
|
||||
anode->prev = newNode;
|
||||
newNode->next = anode;
|
||||
newNode->prev = temp;
|
||||
temp->next = newNode;
|
||||
list->size++;
|
||||
return newNode;
|
||||
}
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListDelNode
|
||||
*
|
||||
* Description:
|
||||
* Removes a node from the list
|
||||
* The memory for the node is freed but the
|
||||
* the memory for the items are not.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* ListNode *dnode - done to delete.
|
||||
* Returns:
|
||||
* The pointer to the item stored in node on success, NULL on failure.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
void *
|
||||
ListDelNode( LinkedList * list,
|
||||
ListNode * dnode,
|
||||
int freeItem )
|
||||
void *ListDelNode(LinkedList *list, ListNode *dnode, int freeItem)
|
||||
{
|
||||
void *temp;
|
||||
void *temp;
|
||||
|
||||
assert( list != NULL );
|
||||
assert( dnode != &list->head );
|
||||
assert( dnode != &list->tail );
|
||||
assert(list != NULL);
|
||||
assert(dnode != &list->head);
|
||||
assert(dnode != &list->tail);
|
||||
|
||||
if( ( list == NULL ) ||
|
||||
( dnode == &list->head ) ||
|
||||
( dnode == &list->tail ) || ( dnode == NULL ) ) {
|
||||
return NULL;
|
||||
}
|
||||
if (!list || dnode == &list->head || dnode == &list->tail || !dnode)
|
||||
return NULL;
|
||||
temp = dnode->item;
|
||||
dnode->prev->next = dnode->next;
|
||||
dnode->next->prev = dnode->prev;
|
||||
freeListNode(dnode, list);
|
||||
list->size--;
|
||||
if (freeItem && list->free_func) {
|
||||
list->free_func(temp);
|
||||
temp = NULL;
|
||||
}
|
||||
|
||||
temp = dnode->item;
|
||||
dnode->prev->next = dnode->next;
|
||||
dnode->next->prev = dnode->prev;
|
||||
|
||||
freeListNode( dnode, list );
|
||||
list->size--;
|
||||
|
||||
if( freeItem && list->free_func ) {
|
||||
list->free_func( temp );
|
||||
temp = NULL;
|
||||
}
|
||||
|
||||
return temp;
|
||||
return temp;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListDestroy
|
||||
*
|
||||
* Description:
|
||||
* Removes all memory associated with list nodes.
|
||||
* Does not free LinkedList *list.
|
||||
* Items stored in the list are not freed, only nodes are.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* Returns:
|
||||
* 0 on success. Nonzero on failure.
|
||||
* Always returns 0.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
int
|
||||
ListDestroy( LinkedList * list,
|
||||
int freeItem )
|
||||
int ListDestroy(LinkedList *list, int freeItem)
|
||||
{
|
||||
ListNode *dnode = NULL;
|
||||
ListNode *temp = NULL;
|
||||
ListNode *dnode = NULL;
|
||||
ListNode *temp = NULL;
|
||||
|
||||
if( list == NULL )
|
||||
return EINVAL;
|
||||
if(!list)
|
||||
return EINVAL;
|
||||
|
||||
for( dnode = list->head.next; dnode != &list->tail; ) {
|
||||
temp = dnode->next;
|
||||
ListDelNode( list, dnode, freeItem );
|
||||
dnode = temp;
|
||||
}
|
||||
for (dnode = list->head.next; dnode != &list->tail; ) {
|
||||
temp = dnode->next;
|
||||
ListDelNode(list, dnode, freeItem);
|
||||
dnode = temp;
|
||||
}
|
||||
list->size = 0;
|
||||
FreeListDestroy(&list->freeNodeList);
|
||||
|
||||
list->size = 0;
|
||||
FreeListDestroy( &list->freeNodeList );
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListHead
|
||||
*
|
||||
* Description:
|
||||
* Returns the head of the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The head of the list. NULL if list is empty.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListHead( LinkedList * list )
|
||||
ListNode *ListHead(LinkedList *list)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
if( list == NULL )
|
||||
return NULL;
|
||||
if (!list)
|
||||
return NULL;
|
||||
|
||||
if( list->size == 0 )
|
||||
return NULL;
|
||||
else
|
||||
return list->head.next;
|
||||
if (!list->size)
|
||||
return NULL;
|
||||
else
|
||||
return list->head.next;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListTail
|
||||
*
|
||||
* Description:
|
||||
* Returns the tail of the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The tail of the list. NULL if list is empty.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListTail( LinkedList * list )
|
||||
ListNode *ListTail(LinkedList *list)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
if( list == NULL )
|
||||
return NULL;
|
||||
if (!list)
|
||||
return NULL;
|
||||
|
||||
if( list->size == 0 )
|
||||
return NULL;
|
||||
else
|
||||
return list->tail.prev;
|
||||
if (!list->size)
|
||||
return NULL;
|
||||
else
|
||||
return list->tail.prev;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListNext
|
||||
*
|
||||
* Description:
|
||||
* Returns the next item in the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The next item in the list. NULL if there are no more items in list.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListNext( LinkedList * list,
|
||||
ListNode * node )
|
||||
ListNode *ListNext(LinkedList *list, ListNode *node)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert( node != NULL );
|
||||
assert(list != NULL);
|
||||
assert(node != NULL);
|
||||
|
||||
if( ( list == NULL ) || ( node == NULL ) )
|
||||
return NULL;
|
||||
|
||||
if( node->next == &list->tail )
|
||||
return NULL;
|
||||
else
|
||||
return node->next;
|
||||
if (!list || !node)
|
||||
return NULL;
|
||||
if (node->next == &list->tail)
|
||||
return NULL;
|
||||
else
|
||||
return node->next;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListPrev
|
||||
*
|
||||
* Description:
|
||||
* Returns the previous item in the list.
|
||||
*
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
*
|
||||
* Returns:
|
||||
* The previous item in the list. NULL if there are no more items in list.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListPrev( LinkedList * list,
|
||||
ListNode * node )
|
||||
ListNode *ListPrev(LinkedList *list, ListNode *node)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert( node != NULL );
|
||||
assert(list != NULL);
|
||||
assert(node != NULL);
|
||||
|
||||
if( ( list == NULL ) || ( node == NULL ) )
|
||||
return NULL;
|
||||
if (!list || !node)
|
||||
return NULL;
|
||||
|
||||
if( node->prev == &list->head )
|
||||
return NULL;
|
||||
else
|
||||
return node->prev;
|
||||
if (node->prev == &list->head)
|
||||
return NULL;
|
||||
else
|
||||
return node->prev;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListFind
|
||||
*
|
||||
* Description:
|
||||
* Finds the specified item in the list.
|
||||
* Uses the compare function specified in ListInit. If compare function
|
||||
* is NULL then compares items as pointers.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
* ListNode *start - the node to start from, NULL if to start from
|
||||
* beginning.
|
||||
* void * item - the item to search for.
|
||||
* Returns:
|
||||
* The node containing the item. NULL if no node contains the item.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
ListNode *
|
||||
ListFind( LinkedList * list,
|
||||
ListNode * start,
|
||||
void *item )
|
||||
ListNode *ListFind(LinkedList *list, ListNode *start, void *item)
|
||||
{
|
||||
ListNode *finger = NULL;
|
||||
|
||||
ListNode *finger = NULL;
|
||||
if (!list)
|
||||
return NULL;
|
||||
if (!start)
|
||||
start = &list->head;
|
||||
|
||||
if( list == NULL )
|
||||
return NULL;
|
||||
assert(start);
|
||||
|
||||
if( start == NULL )
|
||||
start = &list->head;
|
||||
finger = start->next;
|
||||
|
||||
assert( start );
|
||||
assert(finger);
|
||||
|
||||
finger = start->next;
|
||||
|
||||
assert( finger );
|
||||
|
||||
while( finger != &list->tail ) {
|
||||
if( list->cmp_func ) {
|
||||
if( list->cmp_func( item, finger->item ) )
|
||||
return finger;
|
||||
} else {
|
||||
if( item == finger->item )
|
||||
return finger;
|
||||
}
|
||||
finger = finger->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
while (finger != &list->tail) {
|
||||
if (list->cmp_func) {
|
||||
if (list->cmp_func(item, finger->item))
|
||||
return finger;
|
||||
} else {
|
||||
if (item == finger->item)
|
||||
return finger;
|
||||
}
|
||||
finger = finger->next;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ListSize
|
||||
*
|
||||
* Description:
|
||||
* Returns the size of the list.
|
||||
* Parameters:
|
||||
* LinkedList *list - must be valid, non null, pointer to a linked list.
|
||||
|
||||
* Returns:
|
||||
* The number of items in the list.
|
||||
* Precondition:
|
||||
* The list has been initialized.
|
||||
*****************************************************************************/
|
||||
int
|
||||
ListSize( LinkedList * list )
|
||||
long ListSize(LinkedList *list)
|
||||
{
|
||||
assert( list != NULL );
|
||||
assert(list != NULL);
|
||||
|
||||
if( list == NULL )
|
||||
return EINVAL;
|
||||
if (!list)
|
||||
return EINVAL;
|
||||
|
||||
return list->size;
|
||||
return list->size;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,203 +1,160 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "TimerThread.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Function: FreeTimerEvent
|
||||
*
|
||||
* Description:
|
||||
* Deallocates a dynamically allocated TimerEvent.
|
||||
* Parameters:
|
||||
* TimerEvent *event - must be allocated with CreateTimerEvent
|
||||
*****************************************************************************/
|
||||
static void
|
||||
FreeTimerEvent( TimerThread * timer,
|
||||
TimerEvent * event )
|
||||
/*!
|
||||
* \brief Deallocates a dynamically allocated TimerEvent.
|
||||
*/
|
||||
static void FreeTimerEvent(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread *timer,
|
||||
/*! [in] Must be allocated with CreateTimerEvent*/
|
||||
TimerEvent *event)
|
||||
{
|
||||
assert(timer != NULL);
|
||||
|
||||
assert( timer != NULL );
|
||||
|
||||
FreeListFree( &timer->freeEvents, event );
|
||||
FreeListFree(&timer->freeEvents, event);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: TimerThreadWorker
|
||||
/*!
|
||||
* \brief Implements timer thread.
|
||||
*
|
||||
* Description:
|
||||
* Implements timer thread.
|
||||
* Waits for next event to occur and schedules
|
||||
* associated job into threadpool.
|
||||
* Internal Only.
|
||||
* Parameters:
|
||||
* void * arg -> is cast to TimerThread *
|
||||
*****************************************************************************/
|
||||
static void *
|
||||
TimerThreadWorker( void *arg )
|
||||
* Waits for next event to occur and schedules associated job into threadpool.
|
||||
*/
|
||||
static void *TimerThreadWorker(
|
||||
/*! [in] arg is cast to (TimerThread *). */
|
||||
void *arg)
|
||||
{
|
||||
TimerThread *timer = ( TimerThread * ) arg;
|
||||
ListNode *head = NULL;
|
||||
|
||||
TimerEvent *nextEvent = NULL;
|
||||
|
||||
time_t currentTime = 0;
|
||||
time_t nextEventTime = 0;
|
||||
struct timespec timeToWait;
|
||||
|
||||
int tempId;
|
||||
|
||||
assert( timer != NULL );
|
||||
|
||||
ithread_mutex_lock( &timer->mutex );
|
||||
|
||||
while( 1 )
|
||||
{
|
||||
|
||||
//mutex should always be locked at top of loop
|
||||
|
||||
//Check for shutdown
|
||||
|
||||
if( timer->shutdown )
|
||||
{
|
||||
|
||||
while (1) {
|
||||
/* mutex should always be locked at top of loop */
|
||||
/* Check for shutdown. */
|
||||
if (timer->shutdown) {
|
||||
timer->shutdown = 0;
|
||||
ithread_cond_signal( &timer->condition );
|
||||
ithread_mutex_unlock( &timer->mutex );
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
nextEvent = NULL;
|
||||
|
||||
//Get the next event if possible
|
||||
if( timer->eventQ.size > 0 )
|
||||
{
|
||||
/* Get the next event if possible. */
|
||||
if (timer->eventQ.size > 0) {
|
||||
head = ListHead( &timer->eventQ );
|
||||
|
||||
nextEvent = ( TimerEvent * ) head->item;
|
||||
nextEventTime = nextEvent->eventTime;
|
||||
}
|
||||
|
||||
currentTime = time( NULL );
|
||||
|
||||
//If time has elapsed, schedule job
|
||||
|
||||
if( ( nextEvent != NULL ) && ( currentTime >= nextEventTime ) )
|
||||
{
|
||||
|
||||
currentTime = time(NULL);
|
||||
/* If time has elapsed, schedule job. */
|
||||
if (nextEvent && currentTime >= nextEventTime) {
|
||||
if( nextEvent->persistent ) {
|
||||
|
||||
ThreadPoolAddPersistent( timer->tp, &nextEvent->job,
|
||||
&tempId );
|
||||
} else {
|
||||
|
||||
ThreadPoolAdd( timer->tp, &nextEvent->job, &tempId );
|
||||
}
|
||||
|
||||
ListDelNode( &timer->eventQ, head, 0 );
|
||||
FreeTimerEvent( timer, nextEvent );
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
if( nextEvent != NULL ) {
|
||||
if (nextEvent) {
|
||||
timeToWait.tv_nsec = 0;
|
||||
timeToWait.tv_sec = nextEvent->eventTime;
|
||||
|
||||
ithread_cond_timedwait( &timer->condition, &timer->mutex,
|
||||
&timeToWait );
|
||||
|
||||
} else {
|
||||
ithread_cond_wait( &timer->condition, &timer->mutex );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: CalculateEventTime
|
||||
|
||||
/*!
|
||||
* \brief Calculates the appropriate timeout in absolute seconds
|
||||
* since Jan 1, 1970.
|
||||
*
|
||||
* Description:
|
||||
* Calculates the appropriate timeout in absolute seconds since
|
||||
* Jan 1, 1970
|
||||
* Internal Only.
|
||||
* Parameters:
|
||||
* time_t *timeout - timeout
|
||||
*
|
||||
*****************************************************************************/
|
||||
static int
|
||||
CalculateEventTime( time_t * timeout,
|
||||
TimeoutType type )
|
||||
* \return
|
||||
*/
|
||||
static int CalculateEventTime(
|
||||
/*! [in] Timeout. */
|
||||
time_t *timeout,
|
||||
/*! [in] Timeout type. */
|
||||
TimeoutType type)
|
||||
{
|
||||
time_t now;
|
||||
|
||||
assert( timeout != NULL );
|
||||
|
||||
if( type == ABS_SEC )
|
||||
if (type == ABS_SEC)
|
||||
return 0;
|
||||
else if( type == REL_SEC ) {
|
||||
time( &now );
|
||||
else /*if (type == REL_SEC) */{
|
||||
time(&now);
|
||||
( *timeout ) += now;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Function: CreateTimerEvent
|
||||
/*!
|
||||
* \brief Creates a Timer Event. (Dynamically allocated).
|
||||
*
|
||||
* Description:
|
||||
* Creates a Timer Event. (Dynamically allocated)
|
||||
* Internal to timer thread.
|
||||
* Parameters:
|
||||
* func - thread function to run.
|
||||
* arg - argument to function.
|
||||
* priority - priority of job.
|
||||
* eventTime - the absoule time of the event
|
||||
* in seconds from Jan, 1970
|
||||
* id - id of job
|
||||
*
|
||||
* Returns:
|
||||
* TimerEvent * on success, NULL on failure.
|
||||
****************************************************************************/
|
||||
static TimerEvent *
|
||||
CreateTimerEvent( TimerThread * timer,
|
||||
ThreadPoolJob * job,
|
||||
Duration persistent,
|
||||
time_t eventTime,
|
||||
int id )
|
||||
* \return (TimerEvent *) on success, NULL on failure.
|
||||
*/
|
||||
static TimerEvent *CreateTimerEvent(
|
||||
/*! [in] Valid timer thread pointer. */
|
||||
TimerThread *timer,
|
||||
/*! [in] . */
|
||||
ThreadPoolJob *job,
|
||||
/*! [in] . */
|
||||
Duration persistent,
|
||||
/*! [in] The absoule time of the event in seconds from Jan, 1970. */
|
||||
time_t eventTime,
|
||||
/*! [in] Id of job. */
|
||||
int id)
|
||||
{
|
||||
TimerEvent *temp = NULL;
|
||||
|
||||
@@ -215,25 +172,8 @@ CreateTimerEvent( TimerThread * timer,
|
||||
return temp;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadInit
|
||||
*
|
||||
* Description:
|
||||
* Initializes and starts timer thread.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* tp - valid thread pool to use. Must be
|
||||
* started. Must be valid for lifetime
|
||||
* of timer. Timer must be shutdown
|
||||
* BEFORE thread pool.
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* Returns error from ThreadPoolAddPersistent if failure.
|
||||
************************************************************************/
|
||||
int
|
||||
TimerThreadInit( TimerThread * timer,
|
||||
ThreadPool * tp )
|
||||
|
||||
int TimerThreadInit(TimerThread *timer, ThreadPool *tp)
|
||||
{
|
||||
|
||||
int rc = 0;
|
||||
@@ -287,42 +227,16 @@ TimerThreadInit( TimerThread * timer,
|
||||
}
|
||||
|
||||
return rc;
|
||||
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadSchedule
|
||||
*
|
||||
* Description:
|
||||
* Schedules an event to run at a specified time.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* time_t - time of event.
|
||||
* either in absolute seconds,
|
||||
* or relative seconds in the future.
|
||||
* timeoutType - either ABS_SEC, or REL_SEC.
|
||||
* if REL_SEC, then the event
|
||||
* will be scheduled at the
|
||||
* current time + REL_SEC.
|
||||
*
|
||||
* func - function to schedule
|
||||
* arg - argument to function
|
||||
* priority - priority of job.
|
||||
* id - id of timer event. (out)
|
||||
* Return:
|
||||
* 0 on success, nonzero on failure
|
||||
* EOUTOFMEM if not enough memory to schedule job
|
||||
************************************************************************/
|
||||
int
|
||||
TimerThreadSchedule( TimerThread * timer,
|
||||
time_t timeout,
|
||||
TimeoutType type,
|
||||
ThreadPoolJob * job,
|
||||
Duration duration,
|
||||
int *id )
|
||||
int TimerThreadSchedule(
|
||||
TimerThread *timer,
|
||||
time_t timeout,
|
||||
TimeoutType type,
|
||||
ThreadPoolJob *job,
|
||||
Duration duration,
|
||||
int *id)
|
||||
{
|
||||
|
||||
int rc = EOUTOFMEM;
|
||||
int found = 0;
|
||||
int tempId = 0;
|
||||
@@ -355,35 +269,25 @@ TimerThreadSchedule( TimerThread * timer,
|
||||
}
|
||||
|
||||
tempNode = ListHead( &timer->eventQ );
|
||||
//add job to Q
|
||||
//Q is ordered by eventTime
|
||||
//with the head of the Q being the next event
|
||||
|
||||
/* add job to Q. Q is ordered by eventTime with the head of the Q being
|
||||
* the next event. */
|
||||
while( tempNode != NULL ) {
|
||||
temp = ( TimerEvent * ) tempNode->item;
|
||||
if( temp->eventTime >= timeout )
|
||||
{
|
||||
|
||||
if( ListAddBefore( &timer->eventQ, newEvent, tempNode ) !=
|
||||
NULL )
|
||||
if( temp->eventTime >= timeout ) {
|
||||
if (ListAddBefore( &timer->eventQ, newEvent, tempNode))
|
||||
rc = 0;
|
||||
found = 1;
|
||||
break;
|
||||
|
||||
}
|
||||
tempNode = ListNext( &timer->eventQ, tempNode );
|
||||
}
|
||||
|
||||
//add to the end of Q
|
||||
if( !found ) {
|
||||
|
||||
/* add to the end of Q. */
|
||||
if (!found) {
|
||||
if( ListAddTail( &timer->eventQ, newEvent ) != NULL )
|
||||
rc = 0;
|
||||
|
||||
}
|
||||
//signal change in Q
|
||||
/* signal change in Q. */
|
||||
if( rc == 0 ) {
|
||||
|
||||
ithread_cond_signal( &timer->condition );
|
||||
} else {
|
||||
FreeTimerEvent( timer, newEvent );
|
||||
@@ -394,28 +298,10 @@ TimerThreadSchedule( TimerThread * timer,
|
||||
return rc;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadRemove
|
||||
*
|
||||
* Description:
|
||||
* Removes an event from the timer Q.
|
||||
* Events can only be removed
|
||||
* before they have been placed in the
|
||||
* thread pool.
|
||||
*
|
||||
* Parameters:
|
||||
* timer - valid timer thread pointer.
|
||||
* id - id of event to remove.
|
||||
* out - space for returned job (Can be NULL)
|
||||
* Return:
|
||||
* 0 on success.
|
||||
* INVALID_EVENT_ID on error.
|
||||
*
|
||||
************************************************************************/
|
||||
int
|
||||
TimerThreadRemove( TimerThread * timer,
|
||||
int id,
|
||||
ThreadPoolJob * out )
|
||||
int TimerThreadRemove(
|
||||
TimerThread *timer,
|
||||
int id,
|
||||
ThreadPoolJob *out)
|
||||
{
|
||||
int rc = INVALID_EVENT_ID;
|
||||
ListNode *tempNode = NULL;
|
||||
@@ -450,21 +336,7 @@ TimerThreadRemove( TimerThread * timer,
|
||||
return rc;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: TimerThreadShutdown
|
||||
*
|
||||
* Description:
|
||||
* Shutdown the timer thread
|
||||
* Events scheduled in the future will NOT be run.
|
||||
* Timer thread should be shutdown BEFORE it's associated
|
||||
* thread pool.
|
||||
* Returns:
|
||||
* returns 0 if succesfull,
|
||||
* nonzero otherwise.
|
||||
* Always returns 0.
|
||||
***********************************************************************/
|
||||
int
|
||||
TimerThreadShutdown( TimerThread * timer )
|
||||
int TimerThreadShutdown(TimerThread *timer)
|
||||
{
|
||||
ListNode *tempNode2 = NULL;
|
||||
ListNode *tempNode = NULL;
|
||||
@@ -480,9 +352,7 @@ TimerThreadShutdown( TimerThread * timer )
|
||||
timer->shutdown = 1;
|
||||
tempNode = ListHead( &timer->eventQ );
|
||||
|
||||
//Delete nodes in Q
|
||||
//call registered free function
|
||||
//on argument
|
||||
/* Delete nodes in Q. Call registered free function on argument. */
|
||||
while( tempNode != NULL ) {
|
||||
TimerEvent *temp = ( TimerEvent * ) tempNode->item;
|
||||
|
||||
@@ -500,20 +370,19 @@ TimerThreadShutdown( TimerThread * timer )
|
||||
|
||||
ithread_cond_broadcast( &timer->condition );
|
||||
|
||||
while( timer->shutdown ) //wait for timer thread to shutdown
|
||||
{
|
||||
while (timer->shutdown) {
|
||||
/* wait for timer thread to shutdown. */
|
||||
ithread_cond_wait( &timer->condition, &timer->mutex );
|
||||
}
|
||||
ithread_mutex_unlock(&timer->mutex);
|
||||
|
||||
ithread_mutex_unlock( &timer->mutex );
|
||||
|
||||
//destroy condition
|
||||
while( ithread_cond_destroy( &timer->condition ) != 0 ) {
|
||||
/* destroy condition. */
|
||||
while(ithread_cond_destroy(&timer->condition) != 0) {
|
||||
}
|
||||
|
||||
//destroy mutex
|
||||
while( ithread_mutex_destroy( &timer->mutex ) != 0 ) {
|
||||
/* destroy mutex. */
|
||||
while (ithread_mutex_destroy(&timer->mutex) != 0) {
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,12 +67,10 @@ libupnp_la_SOURCES = \
|
||||
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/upnputil.h \
|
||||
src/inc/uuid.h \
|
||||
src/inc/VirtualDir.h \
|
||||
src/inc/webserver.h
|
||||
|
||||
@@ -88,7 +88,11 @@
|
||||
* inline keyword. This definition makes the use of this keyword
|
||||
* portable to these systems.
|
||||
*/
|
||||
#define UPNP_INLINE inline
|
||||
#ifdef __STRICT_ANSI__
|
||||
#define UPNP_INLINE __inline__
|
||||
#else
|
||||
#define UPNP_INLINE inline
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \brief Supply the PRId64 printf() macro.
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
|
||||
|
||||
#ifndef UPNPINET_H
|
||||
#define UPNPINET_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief Provides a platform independent way to include TCP/IP types and functions.
|
||||
*/
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <iphlpapi.h>
|
||||
#include <winsock2.h>
|
||||
#include <Ws2tcpip.h>
|
||||
|
||||
#define UpnpCloseSocket closesocket
|
||||
#else
|
||||
#include <sys/param.h>
|
||||
#if (defined(BSD) && BSD >= 199306) || defined (__FreeBSD_kernel__)
|
||||
@@ -23,8 +23,18 @@
|
||||
#include <sys/socket.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
/* include <unistd.h> for close().
|
||||
* Do not include this file in win32. */
|
||||
#include <unistd.h>
|
||||
/* SOCKET is unsigned and is not a file descriptor on win32. */
|
||||
#define SOCKET int
|
||||
/* INVALID_SOCKET is unsigned on win32. */
|
||||
#define INVALID_SOCKET (-1)
|
||||
/* select() returns SOCKET_ERROR on win32. */
|
||||
#define SOCKET_ERROR (-1)
|
||||
#define UpnpCloseSocket close
|
||||
#endif
|
||||
|
||||
#endif /* UPNPINET_H */
|
||||
|
||||
|
||||
@@ -17,13 +17,16 @@
|
||||
*
|
||||
* \file
|
||||
*
|
||||
* \brief UpnpString object declarartion.
|
||||
* \brief UpnpString object declaration.
|
||||
*/
|
||||
|
||||
|
||||
#include "UpnpGlobal.h" /* for EXPORT_SPEC */
|
||||
|
||||
|
||||
#include <stdlib.h> /* for size_t */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
@@ -76,11 +79,22 @@ EXPORT_SPEC void UpnpString_assign(
|
||||
*
|
||||
* \return The length of the string.
|
||||
* */
|
||||
EXPORT_SPEC int UpnpString_get_Length(
|
||||
EXPORT_SPEC size_t UpnpString_get_Length(
|
||||
/*! [in] The \em \b this pointer. */
|
||||
const UpnpString *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Truncates the string to the specified lenght, or does nothing
|
||||
* if the current lenght is less than or equal to the requested length.
|
||||
* */
|
||||
EXPORT_SPEC void UpnpString_set_Length(
|
||||
/*! [in] The \em \b this pointer. */
|
||||
UpnpString *p,
|
||||
/*! [in] The requested length. */
|
||||
size_t n);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Returns the pointer to char.
|
||||
*
|
||||
@@ -94,7 +108,7 @@ EXPORT_SPEC const char *UpnpString_get_String(
|
||||
/*!
|
||||
* \brief Sets the string from a pointer to char.
|
||||
*/
|
||||
EXPORT_SPEC void UpnpString_set_String(
|
||||
EXPORT_SPEC int UpnpString_set_String(
|
||||
/*! [in] The \em \b this pointer. */
|
||||
UpnpString *p,
|
||||
/*! [in] (char *) to copy from. */
|
||||
@@ -104,13 +118,13 @@ EXPORT_SPEC void UpnpString_set_String(
|
||||
/*!
|
||||
* \brief Sets the string from a pointer to char using a maximum of N chars.
|
||||
*/
|
||||
EXPORT_SPEC void UpnpString_set_StringN(
|
||||
EXPORT_SPEC int UpnpString_set_StringN(
|
||||
/*! [in] The \em \b this pointer. */
|
||||
UpnpString *p,
|
||||
/*! [in] (char *) to copy from. */
|
||||
const char *s,
|
||||
/*! Maximum number of chars to copy.*/
|
||||
int n);
|
||||
size_t n);
|
||||
|
||||
|
||||
/*!
|
||||
@@ -121,6 +135,30 @@ EXPORT_SPEC void UpnpString_clear(
|
||||
UpnpString *p);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compares two strings for equality. Case matters.
|
||||
*
|
||||
* \return The result of strcmp().
|
||||
*/
|
||||
EXPORT_SPEC int UpnpString_cmp(
|
||||
/*! [in] The \em \b the first string. */
|
||||
UpnpString *p,
|
||||
/*! [in] The \em \b the second string. */
|
||||
UpnpString *q);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compares two strings for equality. Case does not matter.
|
||||
*
|
||||
* \return The result of strcasecmp().
|
||||
*/
|
||||
EXPORT_SPEC int UpnpString_casecmp(
|
||||
/*! [in] The \em \b the first string. */
|
||||
UpnpString *p,
|
||||
/*! [in] The \em \b the second string. */
|
||||
UpnpString *q);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
@@ -69,22 +69,6 @@
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#include <iphlpapi.h>
|
||||
#else
|
||||
#define SOCKET int
|
||||
#define INVALID_SOCKET (SOCKET)(~0)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define UpnpCloseSocket closesocket
|
||||
#define fseeko fseek
|
||||
#else
|
||||
#define UpnpCloseSocket close
|
||||
#endif
|
||||
|
||||
|
||||
#define LINE_SIZE 180
|
||||
#define NAME_SIZE 256
|
||||
#define MNFT_NAME_SIZE 64
|
||||
@@ -987,6 +971,7 @@ EXPORT_SPEC int UpnpInit(
|
||||
* \li \c UPNP_E_INVALID_INTERFACE: IfName is invalid or does not
|
||||
* have a valid IPv4 or IPv6 addresss configured.
|
||||
*/
|
||||
#ifdef UPNP_ENABLE_IPV6
|
||||
EXPORT_SPEC int UpnpInit2(
|
||||
/*! The interface name to use by the UPnP SDK operations.
|
||||
* Examples: "eth0", "xl0", "Local Area Connection", \c NULL to
|
||||
@@ -995,6 +980,7 @@ EXPORT_SPEC int UpnpInit2(
|
||||
/*! Local Port to listen for incoming connections.
|
||||
* \c NULL will pick an arbitrary free port. */
|
||||
unsigned short DestPort);
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
@@ -1044,8 +1030,9 @@ EXPORT_SPEC unsigned short UpnpGetServerPort(void);
|
||||
* related requests.
|
||||
* \li On error: 0 is returned if \b UpnpInit has not succeeded.
|
||||
*/
|
||||
#ifdef UPNP_ENABLE_IPV6
|
||||
EXPORT_SPEC unsigned short UpnpGetServerPort6(void);
|
||||
|
||||
#endif
|
||||
/*!
|
||||
* \brief Returns the local IPv4 listening ip address.
|
||||
*
|
||||
@@ -1071,10 +1058,11 @@ EXPORT_SPEC char *UpnpGetServerIpAddress(void);
|
||||
* listening for UPnP related requests.
|
||||
* \li On error: \c NULL is returned if \b UpnpInit has not succeeded.
|
||||
*/
|
||||
#ifdef UPNP_ENABLE_IPV6
|
||||
EXPORT_SPEC char *UpnpGetServerIp6Address(void);
|
||||
|
||||
EXPORT_SPEC char *UpnpGetServerUlaGuaIp6Address(void);
|
||||
|
||||
#endif
|
||||
/*!
|
||||
* \brief Registers a device application with the UPnP Library.
|
||||
*
|
||||
@@ -1340,7 +1328,7 @@ EXPORT_SPEC int UpnpSetContentLength(
|
||||
* length needs to be set. */
|
||||
UpnpClient_Handle Hnd,
|
||||
/*! [in] Permissible content length */
|
||||
int contentLength);
|
||||
size_t contentLength);
|
||||
|
||||
|
||||
/*!
|
||||
@@ -1351,6 +1339,8 @@ EXPORT_SPEC int UpnpSetContentLength(
|
||||
* behaviour if the size of the incoming SOAP message exceeds the memory that
|
||||
* device can allocate.
|
||||
*
|
||||
* If set to 0 then checking will be disabled.
|
||||
*
|
||||
* The default maximum content-length is \c DEFAULT_SOAP_CONTENT_LENGTH
|
||||
* = 16K bytes.
|
||||
*
|
||||
@@ -2422,7 +2412,7 @@ EXPORT_SPEC int UpnpReadHttpGet(
|
||||
/*! [in,out] The buffer to store the read item. */
|
||||
char *buf,
|
||||
/*! [in,out] The size of the buffer to be read. */
|
||||
unsigned int *size,
|
||||
size_t *size,
|
||||
/*! [in] The time out value sent with the request during which a response is
|
||||
* expected from the server, failing which, an error is reported back to
|
||||
* the user. */
|
||||
@@ -2441,9 +2431,9 @@ EXPORT_SPEC int UpnpHttpGetProgress(
|
||||
/*! [in] The token created by the call to \b UpnpOpenHttpGet. */
|
||||
void *handle,
|
||||
/*! [out] The number of bytes received. */
|
||||
unsigned int *length,
|
||||
size_t *length,
|
||||
/*! [out] The content length. */
|
||||
unsigned int *total);
|
||||
size_t *total);
|
||||
|
||||
|
||||
/*!
|
||||
@@ -2532,7 +2522,7 @@ EXPORT_SPEC int UpnpWriteHttpPost(
|
||||
/*! [in] The buffer to be posted. */
|
||||
char *buf,
|
||||
/*! [in] The size, in bytes of \b buf. */
|
||||
unsigned int *size,
|
||||
size_t *size,
|
||||
/*! [in] A timeout value sent with the request during which a response is
|
||||
* expected from the server, failing which, an error is reported. */
|
||||
int timeout);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* -*- C -*- */
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2006 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
* Copyright (c) 2006 Rémi Turboult <r3mi@users.sourceforge.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
|
||||
#define UPNP_VERSION \
|
||||
((UPNP_VERSION_MAJOR*100 + UPNP_VERSION_MINOR)*100 + UPNP_VERSION_PATCH)
|
||||
((UPNP_VERSION_MAJOR * 100 + UPNP_VERSION_MINOR) * 100 + UPNP_VERSION_PATCH)
|
||||
|
||||
|
||||
|
||||
@@ -90,6 +90,9 @@
|
||||
* (i.e. configure --enable-tools) : <upnp/upnptools.h> file is available */
|
||||
#undef UPNP_HAVE_TOOLS
|
||||
|
||||
/** Defined to 1 if the library has been compiled with ipv6 support
|
||||
* (i.e. configure --enable-ipv6) */
|
||||
#undef UPNP_ENABLE_IPV6
|
||||
|
||||
#endif /* UPNP_CONFIG_H */
|
||||
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* Copyright (c) 2006 R<EFBFBD>mi Turboult <r3mi@users.sourceforge.net>
|
||||
* All rights reserved.
|
||||
* 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:
|
||||
* 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
|
||||
* - 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
|
||||
*
|
||||
* 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
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
@@ -33,32 +33,27 @@
|
||||
#ifndef UPNP_DEBUG_H
|
||||
#define UPNP_DEBUG_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ThreadPool.h"
|
||||
#include "upnpconfig.h"
|
||||
#include "UpnpGlobal.h" /* for UPNP_INLINE */
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** \name Other debugging features
|
||||
/*! \name Other debugging features
|
||||
*
|
||||
* The UPnP SDK contains other features to aid in debugging.
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
/** \name Upnp_LogLevel
|
||||
/*! \name Upnp_LogLevel
|
||||
* The user has the option to select 4 different types of debugging levels,
|
||||
* see \c UpnpSetLogLevel.
|
||||
* The critical level will show only those messages
|
||||
@@ -85,7 +80,6 @@ typedef enum Upnp_Module {
|
||||
HTTP
|
||||
} Dbg_Module;
|
||||
|
||||
|
||||
/*@{*/
|
||||
typedef enum Upnp_LogLevel_e {
|
||||
UPNP_CRITICAL,
|
||||
@@ -95,14 +89,11 @@ typedef enum Upnp_LogLevel_e {
|
||||
} Upnp_LogLevel;
|
||||
/*@}*/
|
||||
|
||||
|
||||
/**
|
||||
/*!
|
||||
* Default log level : see \c Upnp_LogLevel
|
||||
*/
|
||||
#define UPNP_DEFAULT_LOG_LEVEL UPNP_ALL
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Initialize the log files.
|
||||
*
|
||||
@@ -117,7 +108,6 @@ static UPNP_INLINE int UpnpInitLog(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set the log level (see \c Upnp_LogLevel).
|
||||
*/
|
||||
@@ -126,10 +116,13 @@ void UpnpSetLogLevel(
|
||||
/*! [in] Log level. */
|
||||
Upnp_LogLevel log_level);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level) {}
|
||||
static UPNP_INLINE void UpnpSetLogLevel(Upnp_LogLevel log_level)
|
||||
{
|
||||
return;
|
||||
log_level = log_level;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Closes the log files.
|
||||
*/
|
||||
@@ -139,7 +132,6 @@ void UpnpCloseLog(void);
|
||||
static UPNP_INLINE void UpnpCloseLog(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set the name for error and information files, respectively.
|
||||
*/
|
||||
@@ -152,10 +144,14 @@ void UpnpSetLogFileNames(
|
||||
#else
|
||||
static UPNP_INLINE void UpnpSetLogFileNames(
|
||||
const char *ErrFileName,
|
||||
const char *InfoFileName) {}
|
||||
const char *InfoFileName)
|
||||
{
|
||||
return;
|
||||
ErrFileName = ErrFileName;
|
||||
InfoFileName = InfoFileName;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Check if the module is turned on for debug and returns the file
|
||||
* descriptor corresponding to the debug level
|
||||
@@ -174,6 +170,8 @@ FILE *UpnpGetDebugFile(
|
||||
static UPNP_INLINE FILE *UpnpGetDebugFile(Upnp_LogLevel level, Dbg_Module module)
|
||||
{
|
||||
return NULL;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -196,6 +194,8 @@ static UPNP_INLINE int DebugAtThisLevel(
|
||||
Dbg_Module Module)
|
||||
{
|
||||
return 0;
|
||||
DLevel = DLevel;
|
||||
Module = Module;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -234,6 +234,12 @@ static UPNP_INLINE void UpnpPrintf(
|
||||
const char* FmtStr,
|
||||
...)
|
||||
{
|
||||
return;
|
||||
DLevel = DLevel;
|
||||
Module = Module;
|
||||
DbgFileName = DbgFileName;
|
||||
DbgLineNo = DbgLineNo;
|
||||
FmtStr = FmtStr;
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
@@ -254,7 +260,13 @@ void UpnpDisplayFileAndLine(
|
||||
static UPNP_INLINE void UpnpDisplayFileAndLine(
|
||||
FILE *fd,
|
||||
const char *DbgFileName,
|
||||
int DbgLineNo) {}
|
||||
int DbgLineNo)
|
||||
{
|
||||
return;
|
||||
fd = fd;
|
||||
DbgFileName = DbgFileName;
|
||||
DbgLineNo = DbgLineNo;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -270,13 +282,20 @@ void UpnpDisplayBanner(
|
||||
/*! [in] Size of the buffer. */
|
||||
size_t size,
|
||||
/*! [in] This parameter provides the width of the banner. */
|
||||
int starlength);
|
||||
size_t starlength);
|
||||
#else
|
||||
static UPNP_INLINE void UpnpDisplayBanner(
|
||||
FILE *fd,
|
||||
const char **lines,
|
||||
size_t size,
|
||||
int starlength) {}
|
||||
int starlength)
|
||||
{
|
||||
return;
|
||||
fd = fd;
|
||||
lines = lines;
|
||||
size = size;
|
||||
starlength = starlength;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -300,28 +319,14 @@ static UPNP_INLINE void PrintThreadPoolStats(
|
||||
int DbgLineNo,
|
||||
const char *msg)
|
||||
{
|
||||
return;
|
||||
tp = tp;
|
||||
DbgFileName = DbgFileName;
|
||||
DbgLineNo = DbgLineNo;
|
||||
msg = msg;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Print the node names and values of a XML tree.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void printNodes(
|
||||
/*! [in] The root of the tree to print. */
|
||||
IXML_Node *tmpRoot,
|
||||
/*! [in] The depth to print. */
|
||||
int depth);
|
||||
#else
|
||||
static UPNP_INLINE void printNodes(
|
||||
IXML_Node *tmpRoot,
|
||||
int depth)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*@}*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -29,201 +29,261 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/** @name Optional Tool APIs
|
||||
* The Linux SDK for UPnP Devices contains some additional, optional
|
||||
* utility APIs that can be helpful in writing applications using the
|
||||
* SDK. These additional APIs can be compiled out in order to save code
|
||||
* size in the SDK. Refer to the README for details.
|
||||
*/
|
||||
|
||||
/*! @{ */
|
||||
|
||||
#ifndef UPNP_TOOLS_H
|
||||
#define UPNP_TOOLS_H
|
||||
|
||||
#include "upnp.h"
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \defgroup UPnPTools Optional Tool API
|
||||
*
|
||||
* \brief Additional, optional utility API that can be helpful in writing
|
||||
* applications.
|
||||
*
|
||||
* This additional API can be compiled out in order to save code size in the
|
||||
* library. Refer to the file README for details.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
#include "ixml.h" /* for IXML_Document */
|
||||
|
||||
|
||||
/* Function declarations only if tools compiled into the library */
|
||||
#if UPNP_HAVE_TOOLS
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** {\bf UpnpResolveURL} combines a base URL and a relative URL into
|
||||
* a single absolute URL. The memory for {\bf AbsURL} needs to be
|
||||
* allocated by the caller and must be large enough to hold the
|
||||
* {\bf BaseURL} and {\bf RelURL} combined.
|
||||
|
||||
/*!
|
||||
* \brief Converts an SDK error code into a string error message suitable for
|
||||
* display. The memory returned from this function should NOT be freed.
|
||||
*
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: {\bf RelURL} is {\tt NULL}.
|
||||
* \item {\tt UPNP_E_INVALID_URL}: The {\bf BaseURL} / {\bf RelURL}
|
||||
* \return An ASCII text string representation of the error message associated
|
||||
* with the error code or the string "Unknown error code"
|
||||
*/
|
||||
EXPORT_SPEC const char *UpnpGetErrorMessage(
|
||||
/*! [in] The SDK error code to convert. */
|
||||
int errorcode);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Combines a base URL and a relative URL into a single absolute URL.
|
||||
*
|
||||
* The memory for \b AbsURL needs to be allocated by the caller and must
|
||||
* be large enough to hold the \b BaseURL and \b RelURL combined.
|
||||
*
|
||||
* \return An integer representing one of the following:
|
||||
* \li <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: \b RelURL is <tt>NULL</tt>.
|
||||
* \li <tt>UPNP_E_INVALID_URL</tt>: The \b BaseURL / \b RelURL
|
||||
* combination does not form a valid URL.
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
*/
|
||||
|
||||
EXPORT_SPEC int UpnpResolveURL(
|
||||
IN const char * BaseURL, /** The base URL to combine. */
|
||||
IN const char * RelURL, /** The relative URL to {\bf BaseURL}. */
|
||||
OUT char * AbsURL /** A pointer to a buffer to store the
|
||||
absolute URL. */
|
||||
);
|
||||
/*! [in] The base URL to combine. */
|
||||
const char *BaseURL,
|
||||
/*! [in] The relative URL to \b BaseURL. */
|
||||
const char *RelURL,
|
||||
/*! [out] A pointer to a buffer to store the absolute URL. */
|
||||
char *AbsURL);
|
||||
|
||||
/** {\bf UpnpMakeAction} creates an action request packet based on its input
|
||||
* parameters (status variable name and value pair). Any number of input
|
||||
* parameters can be passed to this function but every input variable name
|
||||
* should have a matching value argument.
|
||||
*
|
||||
* @return [IXML_Document*] The action node of {\bf Upnp_Document} type or
|
||||
* {\tt NULL} if the operation failed.
|
||||
*/
|
||||
|
||||
EXPORT_SPEC IXML_Document* UpnpMakeAction(
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN int NumArg, /** Number of argument pairs to be passed. */
|
||||
IN const char * Arg, /** Status variable name and value pair. */
|
||||
IN ... /* Other status variable name and value pairs. */
|
||||
);
|
||||
|
||||
/** {\bf UpnpAddToAction} creates an action request packet based on its input
|
||||
* parameters (status variable name and value pair). This API is specially
|
||||
* suitable inside a loop to add any number input parameters into an existing
|
||||
* action. If no action document exists in the beginning then a
|
||||
* {\bf Upnp_Document} variable initialized with {\tt NULL} should be passed
|
||||
* as a parameter.
|
||||
/*!
|
||||
* \brief Combines a base URL and a relative URL into a single absolute URL.
|
||||
*
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
||||
* are invalid.
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* The memory for \b AbsURL becomes owned by the caller and should be freed
|
||||
* later.
|
||||
*
|
||||
* \return An integer representing one of the following:
|
||||
* \li <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: \b RelURL is <tt>NULL</tt>.
|
||||
* \li <tt>UPNP_E_INVALID_URL</tt>: The \b BaseURL / \b RelURL
|
||||
* combination does not form a valid URL.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
*/
|
||||
EXPORT_SPEC int UpnpResolveURL2(
|
||||
/*! [in] The base URL to combine. */
|
||||
const char *BaseURL,
|
||||
/*! [in] The relative URL to \b BaseURL. */
|
||||
const char *RelURL,
|
||||
/*! [out] A pointer to a pointer to a buffer to store the
|
||||
* absolute URL. Must be freed later by the caller. */
|
||||
char **AbsURL);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Creates an action request packet based on its input parameters
|
||||
* (status variable name and value pair).
|
||||
*
|
||||
* Any number of input parameters can be passed to this function but every
|
||||
* input variable name should have a matching value argument.
|
||||
*
|
||||
* It is a wrapper function that calls makeAction() function to create the
|
||||
* action request.
|
||||
*
|
||||
* \return The action node of \b Upnp_Document type or <tt>NULL</tt> if the
|
||||
* operation failed.
|
||||
*/
|
||||
EXPORT_SPEC IXML_Document *UpnpMakeAction(
|
||||
/*! [in] Name of the action request or response. */
|
||||
const char *ActionName,
|
||||
/*! [in] The service type. */
|
||||
const char *ServType,
|
||||
/*! [in] Number of argument pairs to be passed. */
|
||||
int NumArg,
|
||||
/*! [in] pointer to the first argument. */
|
||||
const char *Arg,
|
||||
/*! [in] Argument list. */
|
||||
...);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Ceates an action response packet based on its output parameters
|
||||
* (status variable name and value pair).
|
||||
*
|
||||
* Any number of input parameters can be passed to this function but every
|
||||
* output variable name should have a matching value argument.
|
||||
*
|
||||
* It is a wrapper function that calls makeAction() function to create the
|
||||
* action request.
|
||||
*
|
||||
* \return The action node of \b Upnp_Document type or <tt>NULL</tt> if the
|
||||
* operation failed.
|
||||
*/
|
||||
EXPORT_SPEC IXML_Document *UpnpMakeActionResponse(
|
||||
/*! [in] The action name. */
|
||||
const char *ActionName,
|
||||
/*! [in] The service type.. */
|
||||
const char *ServType,
|
||||
/*! [in] The number of argument pairs passed. */
|
||||
int NumArg,
|
||||
/*! [in] The status variable name and value pair. */
|
||||
const char *Arg,
|
||||
/*! [in] Other status variable name and value pairs. */
|
||||
...);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Adds the argument in the action request.
|
||||
*
|
||||
* This API is specially suitable inside a loop to add any number input
|
||||
* parameters into an existing action. If no action document exists in the
|
||||
* beginning then a <b>Upnp_Document variable initialized with <tt>NULL</tt></b>
|
||||
* should be passed as a parameter.
|
||||
*
|
||||
* It is a wrapper function that calls addToAction() function to add the
|
||||
* argument in the action request.
|
||||
*
|
||||
* \return An integer representing one of the following:
|
||||
* \li <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: One or more of the parameters are invalid.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
*/
|
||||
EXPORT_SPEC int UpnpAddToAction(
|
||||
IN OUT IXML_Document ** ActionDoc,
|
||||
/** A pointer to store the action
|
||||
document node. */
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN const char * ArgName, /** The status variable name. */
|
||||
IN const char * ArgVal /** The status variable value. */
|
||||
);
|
||||
/*! [in,out] A pointer to store the action document node. */
|
||||
IXML_Document **ActionDoc,
|
||||
/*! [in] The action name. */
|
||||
const char *ActionName,
|
||||
/*! [in] The service type. */
|
||||
const char *ServType,
|
||||
/*! [in] The status variable name. */
|
||||
const char *ArgName,
|
||||
/*! [in] The status variable value. */
|
||||
const char *ArgVal);
|
||||
|
||||
/** {\bf UpnpMakeActionResponse} creates an action response packet based
|
||||
* on its output parameters (status variable name and value pair). Any
|
||||
* number of input parameters can be passed to this function but every output
|
||||
* variable name should have a matching value argument.
|
||||
*
|
||||
* @return [IXML_Document*] The action node of {\bf Upnp_Document} type or
|
||||
* {\tt NULL} if the operation failed.
|
||||
*/
|
||||
|
||||
EXPORT_SPEC IXML_Document* UpnpMakeActionResponse(
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN int NumArg, /** The number of argument pairs passed. */
|
||||
IN const char * Arg, /** The status variable name and value pair. */
|
||||
IN ... /* Other status variable name and value pairs. */
|
||||
);
|
||||
|
||||
/** {\bf UpnpAddToActionResponse} creates an action response
|
||||
* packet based on its output parameters (status variable name
|
||||
* and value pair). This API is especially suitable inside
|
||||
* a loop to add any number of input parameters into an existing action
|
||||
* response. If no action document exists in the beginning, a
|
||||
* {\bf Upnp_Document} variable initialized with {\tt NULL} should be passed
|
||||
* as a parameter.
|
||||
/*!
|
||||
* \brief Creates an action response packet based on its output parameters
|
||||
* (status variable name and value pair).
|
||||
*
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
||||
* are invalid.
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
* This API is especially suitable inside a loop to add any number of input
|
||||
* parameters into an existing action response. If no action document exists
|
||||
* in the beginning, a \b Upnp_Document variable initialized with <tt>NULL</tt>
|
||||
* should be passed as a parameter.
|
||||
*
|
||||
* It is a wrapper function that calls addToAction() function to add the
|
||||
* argument in the action request.
|
||||
*
|
||||
* \return An integer representing one of the following:
|
||||
* \li <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: One or more of the parameters are invalid.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
*/
|
||||
|
||||
EXPORT_SPEC int UpnpAddToActionResponse(
|
||||
IN OUT IXML_Document ** ActionResponse,
|
||||
/** Pointer to a document to
|
||||
store the action document
|
||||
node. */
|
||||
IN const char * ActionName, /** The action name. */
|
||||
IN const char * ServType, /** The service type. */
|
||||
IN const char * ArgName, /** The status variable name. */
|
||||
IN const char * ArgVal /** The status variable value. */
|
||||
);
|
||||
/*! [in,out] Pointer to a document to store the action document node. */
|
||||
IXML_Document **ActionResponse,
|
||||
/*! [in] The action name. */
|
||||
const char *ActionName,
|
||||
/*! [in] The service type. */
|
||||
const char *ServType,
|
||||
/*! [in] The status variable name. */
|
||||
const char *ArgName,
|
||||
/*! [in] The status variable value. */
|
||||
const char *ArgVal);
|
||||
|
||||
/** {\bf UpnpAddToPropertySet} can be used when an application needs to
|
||||
* transfer the status of many variables at once. It can be used
|
||||
* (inside a loop) to add some extra status variables into an existing
|
||||
* property set. If the application does not already have a property
|
||||
* set document, the application should create a variable initialized
|
||||
* with {\tt NULL} and pass that as the first parameter.
|
||||
*
|
||||
* @return [int] An integer representing one of the following:
|
||||
* \begin{itemize}
|
||||
* \item {\tt UPNP_E_SUCCESS}: The operation completed successfully.
|
||||
* \item {\tt UPNP_E_INVALID_PARAM}: One or more of the parameters
|
||||
* are invalid.
|
||||
* \item {\tt UPNP_E_OUTOF_MEMORY}: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
* \end{itemize}
|
||||
|
||||
/*!
|
||||
* \brief Creates a property set message packet.
|
||||
*
|
||||
* Any number of input parameters can be passed to this function but every
|
||||
* input variable name should have a matching value input argument.
|
||||
*
|
||||
* \return <tt>NULL</tt> on failure, or the property-set document node.
|
||||
*/
|
||||
EXPORT_SPEC IXML_Document *UpnpCreatePropertySet(
|
||||
/*! [in] The number of argument pairs passed. */
|
||||
int NumArg,
|
||||
/*! [in] The status variable name and value pair. */
|
||||
const char *Arg,
|
||||
/*! [in] Variable sized list with the rest of the parameters. */
|
||||
...);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Can be used when an application needs to transfer the status of many
|
||||
* variables at once.
|
||||
*
|
||||
* It can be used (inside a loop) to add some extra status variables into an
|
||||
* existing property set. If the application does not already have a property
|
||||
* set document, the application should create a variable initialized with
|
||||
* <tt>NULL</tt> and pass that as the first parameter.
|
||||
*
|
||||
* \return An integer representing one of the following:
|
||||
* \li <tt>UPNP_E_SUCCESS</tt>: The operation completed successfully.
|
||||
* \li <tt>UPNP_E_INVALID_PARAM</tt>: One or more of the parameters are invalid.
|
||||
* \li <tt>UPNP_E_OUTOF_MEMORY</tt>: Insufficient resources exist to
|
||||
* complete this operation.
|
||||
*/
|
||||
EXPORT_SPEC int UpnpAddToPropertySet(
|
||||
IN OUT IXML_Document **PropSet,
|
||||
/** A pointer to the document containing
|
||||
the property set document node. */
|
||||
IN const char * ArgName, /** The status variable name. */
|
||||
IN const char * ArgVal /** The status variable value. */
|
||||
);
|
||||
/*! [in,out] A pointer to the document containing the property set document node. */
|
||||
IXML_Document **PropSet,
|
||||
/*! [in] The status variable name. */
|
||||
const char *ArgName,
|
||||
/*! [in] The status variable value. */
|
||||
const char *ArgVal);
|
||||
|
||||
/** {\bf UpnpCreatePropertySet} creates a property set
|
||||
* message packet. Any number of input parameters can be passed
|
||||
* to this function but every input variable name should have
|
||||
* a matching value input argument.
|
||||
*
|
||||
* @return [IXML_Document*] {\tt NULL} on failure, or the property-set
|
||||
* document node.
|
||||
*
|
||||
*/
|
||||
|
||||
EXPORT_SPEC IXML_Document* UpnpCreatePropertySet(
|
||||
IN int NumArg, /** The number of argument pairs passed. */
|
||||
IN const char* Arg, /** The status variable name and value pair. */
|
||||
IN ...
|
||||
);
|
||||
|
||||
/** {\bf UpnpGetErrorMessage} converts an SDK error code into a
|
||||
* string error message suitable for display. The memory returned
|
||||
* from this function should NOT be freed.
|
||||
*
|
||||
* @return [char*] An ASCII text string representation of the error message
|
||||
* associated with the error code.
|
||||
*/
|
||||
|
||||
EXPORT_SPEC const char * UpnpGetErrorMessage(
|
||||
int errorcode /** The SDK error code to convert. */
|
||||
);
|
||||
|
||||
/*! @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*! @} */
|
||||
|
||||
|
||||
#endif /* UPNP_HAVE_TOOLS */
|
||||
|
||||
|
||||
#endif /* UPNP_TOOLS_H */
|
||||
|
||||
|
||||
@@ -19,21 +19,21 @@ LDADD = \
|
||||
noinst_PROGRAMS =
|
||||
if ENABLE_SAMPLES
|
||||
if ENABLE_CLIENT
|
||||
noinst_PROGRAMS += upnp_tv_ctrlpt
|
||||
upnp_tv_ctrlpt_CPPFLAGS = \
|
||||
noinst_PROGRAMS += tv_ctrlpt
|
||||
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) \
|
||||
noinst_PROGRAMS += tv_combo
|
||||
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 = \
|
||||
noinst_PROGRAMS += tv_device
|
||||
tv_device_CPPFLAGS = \
|
||||
$(AM_CPPFLAGS) \
|
||||
-I$(srcdir)/common/ \
|
||||
-I$(srcdir)/tvdevice
|
||||
@@ -41,37 +41,37 @@ endif
|
||||
endif
|
||||
|
||||
|
||||
upnp_tv_device_SOURCES = \
|
||||
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
|
||||
common/tv_device.c \
|
||||
common/tv_device.h \
|
||||
linux/tv_device_main.c
|
||||
|
||||
|
||||
upnp_tv_ctrlpt_SOURCES = \
|
||||
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
|
||||
common/tv_ctrlpt.c \
|
||||
common/tv_ctrlpt.h \
|
||||
linux/tv_ctrlpt_main.c
|
||||
|
||||
upnp_tv_combo_SOURCES = \
|
||||
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
|
||||
common/tv_ctrlpt.c \
|
||||
common/tv_ctrlpt.h \
|
||||
common/tv_device.c \
|
||||
common/tv_device.h \
|
||||
linux/tv_combo_main.c
|
||||
|
||||
|
||||
if WITH_DOCUMENTATION
|
||||
examplesdir = $(docdir)/examples
|
||||
examples_DATA = \
|
||||
$(sort \
|
||||
$(upnp_tv_ctrlpt_SOURCES) \
|
||||
$(upnp_tv_device_SOURCES))
|
||||
$(tv_ctrlpt_SOURCES) \
|
||||
$(tv_device_SOURCES))
|
||||
endif
|
||||
|
||||
|
||||
|
||||
@@ -30,8 +30,11 @@
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#define SAMPLE_UTIL_C
|
||||
#include "sample_util.h"
|
||||
|
||||
#include "tv_ctrlpt.h"
|
||||
#include "tv_device.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
@@ -43,7 +46,8 @@
|
||||
#endif
|
||||
|
||||
|
||||
int initialize = 1;
|
||||
static int initialize_init = 1;
|
||||
static int initialize_register = 1;
|
||||
|
||||
/*! Function pointers to use for displaying formatted strings.
|
||||
* Set on Initialization of device. */
|
||||
@@ -53,21 +57,9 @@ state_update gStateUpdateFun = NULL;
|
||||
/*! mutex to control displaying of events */
|
||||
ithread_mutex_t display_mutex;
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_Initialize
|
||||
*
|
||||
* Description:
|
||||
* Initializes the sample util. Must be called before any sample util
|
||||
* functions. May be called multiple times.
|
||||
* But the initialization is done only once.
|
||||
*
|
||||
* Parameters:
|
||||
* print_function - print function to use in SampleUtil_Print
|
||||
*
|
||||
******************************************************************************/
|
||||
int SampleUtil_Initialize(print_string print_function)
|
||||
{
|
||||
if (initialize) {
|
||||
if (initialize_init) {
|
||||
ithread_mutexattr_t attr;
|
||||
|
||||
ithread_mutexattr_init(&attr);
|
||||
@@ -80,69 +72,34 @@ int SampleUtil_Initialize(print_string print_function)
|
||||
gPrintFun = print_function;
|
||||
ithread_mutex_unlock(&display_mutex);
|
||||
|
||||
initialize = 0;
|
||||
} else {
|
||||
SampleUtil_Print("***** SampleUtil_Initialize was called multiple times!\n");
|
||||
abort();
|
||||
initialize_init = 0;
|
||||
}
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_RegisterUpdateFunction
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
******************************************************************************/
|
||||
int SampleUtil_RegisterUpdateFunction(state_update update_function)
|
||||
{
|
||||
/* Intialize only once. */
|
||||
static int initialize = 1;
|
||||
|
||||
if (initialize) {
|
||||
if (initialize_register) {
|
||||
gStateUpdateFun = update_function;
|
||||
initialize = 0;
|
||||
initialize_register = 0;
|
||||
}
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_Finish
|
||||
*
|
||||
* Description:
|
||||
* Releases Resources held by sample util.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
******************************************************************************/
|
||||
int SampleUtil_Finish()
|
||||
{
|
||||
ithread_mutex_destroy(&display_mutex);
|
||||
gPrintFun = NULL;
|
||||
initialize = 1;
|
||||
gStateUpdateFun = NULL;
|
||||
initialize_init = 1;
|
||||
initialize_register = 1;
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_GetElementValue
|
||||
*
|
||||
* Description:
|
||||
* Given a DOM node such as <Channel>11</Channel>, this routine
|
||||
* extracts the value (e.g., 11) from the node and returns it as
|
||||
* a string. The string must be freed by the caller using
|
||||
* free.
|
||||
*
|
||||
* Parameters:
|
||||
* node -- The DOM node from which to extract the value
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *SampleUtil_GetElementValue(IN IXML_Element *element)
|
||||
char *SampleUtil_GetElementValue(IXML_Element *element)
|
||||
{
|
||||
IXML_Node *child = ixmlNode_getFirstChild((IXML_Node *)element);
|
||||
char *temp = NULL;
|
||||
@@ -154,20 +111,7 @@ char *SampleUtil_GetElementValue(IN IXML_Element *element)
|
||||
return temp;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_GetFirstServiceList
|
||||
*
|
||||
* Description:
|
||||
* Given a DOM node representing a UPnP Device Description Document,
|
||||
* this routine parses the document and finds the first service list
|
||||
* (i.e., the service list for the root device). The service list
|
||||
* is returned as a DOM node list.
|
||||
*
|
||||
* Parameters:
|
||||
* node -- The DOM node from which to extract the service list
|
||||
*
|
||||
******************************************************************************/
|
||||
IXML_NodeList *SampleUtil_GetFirstServiceList(IN IXML_Document *doc)
|
||||
IXML_NodeList *SampleUtil_GetFirstServiceList(IXML_Document *doc)
|
||||
{
|
||||
IXML_NodeList *ServiceList = NULL;
|
||||
IXML_NodeList *servlistnodelist = NULL;
|
||||
@@ -179,7 +123,6 @@ IXML_NodeList *SampleUtil_GetFirstServiceList(IN IXML_Document *doc)
|
||||
/* we only care about the first service list, from the root
|
||||
* device */
|
||||
servlistnode = ixmlNodeList_item(servlistnodelist, 0);
|
||||
|
||||
/* create as list of DOM nodes */
|
||||
ServiceList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)servlistnode, "service");
|
||||
@@ -195,23 +138,24 @@ IXML_NodeList *SampleUtil_GetFirstServiceList(IN IXML_Document *doc)
|
||||
* Obtain the service list
|
||||
* n == 0 the first
|
||||
* n == 1 the next in the device list, etc..
|
||||
*
|
||||
*/
|
||||
IXML_NodeList *SampleUtil_GetNthServiceList(IN IXML_Document *doc , int n)
|
||||
static IXML_NodeList *SampleUtil_GetNthServiceList(
|
||||
/*! [in] . */
|
||||
IXML_Document *doc,
|
||||
/*! [in] . */
|
||||
unsigned int n)
|
||||
{
|
||||
IXML_NodeList *ServiceList = NULL;
|
||||
IXML_NodeList *servlistnodelist = NULL;
|
||||
IXML_Node *servlistnode = NULL;
|
||||
|
||||
/*
|
||||
* ixmlDocument_getElementsByTagName()
|
||||
/* ixmlDocument_getElementsByTagName()
|
||||
* Returns a NodeList of all Elements that match the given
|
||||
* tag name in the order in which they were encountered in a preorder
|
||||
* traversal of the Document tree.
|
||||
*
|
||||
* return (NodeList*) A pointer to a NodeList containing the
|
||||
* matching items or NULL on an error.
|
||||
*/
|
||||
* matching items or NULL on an error. */
|
||||
SampleUtil_Print("SampleUtil_GetNthServiceList called : n = %d\n", n);
|
||||
servlistnodelist =
|
||||
ixmlDocument_getElementsByTagName(doc, "serviceList");
|
||||
@@ -226,8 +170,7 @@ IXML_NodeList *SampleUtil_GetNthServiceList(IN IXML_Document *doc , int n)
|
||||
* numerical index.
|
||||
*
|
||||
* return (Node*) A pointer to a Node or NULL if there was an
|
||||
* error.
|
||||
*/
|
||||
* error. */
|
||||
servlistnode = ixmlNodeList_item(servlistnodelist, n);
|
||||
|
||||
assert(servlistnode != 0);
|
||||
@@ -244,20 +187,7 @@ IXML_NodeList *SampleUtil_GetNthServiceList(IN IXML_Document *doc , int n)
|
||||
return ServiceList;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_GetFirstDocumentItem
|
||||
*
|
||||
* Description:
|
||||
* Given a document node, this routine searches for the first element
|
||||
* named by the input string item, and returns its value as a string.
|
||||
* String must be freed by caller using free.
|
||||
* Parameters:
|
||||
* doc -- The DOM document from which to extract the value
|
||||
* item -- The item to search for
|
||||
*
|
||||
******************************************************************************/
|
||||
char *SampleUtil_GetFirstDocumentItem(
|
||||
IN IXML_Document *doc, IN const char *item)
|
||||
char *SampleUtil_GetFirstDocumentItem(IXML_Document *doc, const char *item)
|
||||
{
|
||||
IXML_NodeList *nodeList = NULL;
|
||||
IXML_Node *textNode = NULL;
|
||||
@@ -302,20 +232,7 @@ epilogue:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_GetFirstElementItem
|
||||
*
|
||||
* Description:
|
||||
* Given a DOM element, this routine searches for the first element
|
||||
* named by the input string item, and returns its value as a string.
|
||||
* The string must be freed using free.
|
||||
* Parameters:
|
||||
* node -- The DOM element from which to extract the value
|
||||
* item -- The item to search for
|
||||
*
|
||||
******************************************************************************/
|
||||
char *SampleUtil_GetFirstElementItem(
|
||||
IN IXML_Element *element, IN const char *item)
|
||||
char *SampleUtil_GetFirstElementItem(IXML_Element *element, const char *item)
|
||||
{
|
||||
IXML_NodeList *nodeList = NULL;
|
||||
IXML_Node *textNode = NULL;
|
||||
@@ -349,17 +266,7 @@ char *SampleUtil_GetFirstElementItem(
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_PrintEventType
|
||||
*
|
||||
* Description:
|
||||
* Prints a callback event type as a string.
|
||||
*
|
||||
* Parameters:
|
||||
* S -- The callback event
|
||||
*
|
||||
******************************************************************************/
|
||||
void SampleUtil_PrintEventType(IN Upnp_EventType S)
|
||||
void SampleUtil_PrintEventType(Upnp_EventType S)
|
||||
{
|
||||
switch (S) {
|
||||
/* Discovery */
|
||||
@@ -413,23 +320,13 @@ void SampleUtil_PrintEventType(IN Upnp_EventType S)
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_PrintEvent
|
||||
*
|
||||
* Description:
|
||||
* Prints callback event structure details.
|
||||
*
|
||||
* Parameters:
|
||||
* EventType -- The type of callback event
|
||||
* Event -- The callback event structure
|
||||
*
|
||||
******************************************************************************/
|
||||
int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
||||
int SampleUtil_PrintEvent(Upnp_EventType EventType, void *Event)
|
||||
{
|
||||
ithread_mutex_lock(&display_mutex);
|
||||
|
||||
SampleUtil_Print("======================================================================\n");
|
||||
SampleUtil_Print("----------------------------------------------------------------------\n");
|
||||
SampleUtil_Print(
|
||||
"======================================================================\n"
|
||||
"----------------------------------------------------------------------\n");
|
||||
SampleUtil_PrintEventType(EventType);
|
||||
switch (EventType) {
|
||||
/* SSDP */
|
||||
@@ -467,7 +364,7 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
||||
SampleUtil_Print("ServiceID = %s\n", a_event->ServiceID);
|
||||
if (a_event->ActionRequest) {
|
||||
xmlbuff = ixmlPrintNode((IXML_Node *)a_event->ActionRequest);
|
||||
if ( xmlbuff ) {
|
||||
if (xmlbuff) {
|
||||
SampleUtil_Print("ActRequest = %s\n", xmlbuff);
|
||||
ixmlFreeDOMString(xmlbuff);
|
||||
}
|
||||
@@ -585,7 +482,6 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
||||
SampleUtil_Print("TimeOut = %d\n", es_event->TimeOut);
|
||||
break;
|
||||
}
|
||||
|
||||
case UPNP_EVENT_AUTORENEWAL_FAILED:
|
||||
case UPNP_EVENT_SUBSCRIPTION_EXPIRED: {
|
||||
struct Upnp_Event_Subscribe *es_event =
|
||||
@@ -599,39 +495,24 @@ int SampleUtil_PrintEvent(IN Upnp_EventType EventType, IN void *Event)
|
||||
break;
|
||||
}
|
||||
}
|
||||
SampleUtil_Print("----------------------------------------------------------------------\n");
|
||||
SampleUtil_Print("======================================================================\n");
|
||||
SampleUtil_Print(
|
||||
"----------------------------------------------------------------------\n"
|
||||
"======================================================================\n"
|
||||
"\n\n\n");
|
||||
|
||||
ithread_mutex_unlock(&display_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_FindAndParseService
|
||||
*
|
||||
* Description:
|
||||
* This routine finds the first occurance of a service in a DOM representation
|
||||
* of a description document and parses it.
|
||||
*
|
||||
* Parameters:
|
||||
* DescDoc -- The DOM description document
|
||||
* location -- The location of the description document
|
||||
* serviceSearchType -- The type of service to search for
|
||||
* serviceId -- OUT -- The service ID
|
||||
* eventURL -- OUT -- The event URL for the service
|
||||
* controlURL -- OUT -- The control URL for the service
|
||||
*
|
||||
******************************************************************************/
|
||||
int SampleUtil_FindAndParseService(
|
||||
IN IXML_Document *DescDoc, IN const char *location, IN char *serviceType,
|
||||
OUT char **serviceId, OUT char **eventURL, OUT char **controlURL)
|
||||
int SampleUtil_FindAndParseService(IXML_Document *DescDoc, const char *location,
|
||||
const char *serviceType, char **serviceId, char **eventURL, char **controlURL)
|
||||
{
|
||||
int i;
|
||||
int length;
|
||||
unsigned int i;
|
||||
unsigned long length;
|
||||
int found = 0;
|
||||
int ret;
|
||||
int sindex = 0;
|
||||
unsigned int sindex = 0;
|
||||
char *tempServiceType = NULL;
|
||||
char *baseURL = NULL;
|
||||
const char *base = NULL;
|
||||
@@ -650,7 +531,7 @@ int SampleUtil_FindAndParseService(
|
||||
/* Top level */
|
||||
for (sindex = 0;
|
||||
(serviceList = SampleUtil_GetNthServiceList(DescDoc , sindex)) != NULL;
|
||||
sindex ++) {
|
||||
sindex++) {
|
||||
tempServiceType = NULL;
|
||||
relcontrolURL = NULL;
|
||||
releventURL = NULL;
|
||||
@@ -711,20 +592,7 @@ int SampleUtil_FindAndParseService(
|
||||
return found;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_Print
|
||||
*
|
||||
* Description:
|
||||
* Provides platform-specific print functionality. This function should be
|
||||
* called when you want to print content suitable for console output (i.e.,
|
||||
* in a large text box or on a screen). If your device/operating system is
|
||||
* not supported here, you should add a port.
|
||||
*
|
||||
* Parameters:
|
||||
* Same as printf()
|
||||
*
|
||||
******************************************************************************/
|
||||
int SampleUtil_Print(char *fmt, ...)
|
||||
int SampleUtil_Print(const char *fmt, ...)
|
||||
{
|
||||
#define MAX_BUF (8 * 1024)
|
||||
va_list ap;
|
||||
@@ -737,9 +605,8 @@ int SampleUtil_Print(char *fmt, ...)
|
||||
va_start(ap, fmt);
|
||||
rc = vsnprintf(buf, MAX_BUF, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (gPrintFun) {
|
||||
gPrintFun(buf);
|
||||
gPrintFun("%s", buf);
|
||||
}
|
||||
|
||||
ithread_mutex_unlock(&display_mutex);
|
||||
@@ -747,14 +614,6 @@ int SampleUtil_Print(char *fmt, ...)
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* SampleUtil_StateUpdate
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
******************************************************************************/
|
||||
void SampleUtil_StateUpdate(const char *varName, const char *varValue,
|
||||
const char *UDN, eventType type)
|
||||
{
|
||||
@@ -764,3 +623,15 @@ void SampleUtil_StateUpdate(const char *varName, const char *varValue,
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Prints a string to standard out.
|
||||
*/
|
||||
void linux_print(const char *format, ...)
|
||||
{
|
||||
va_list argList;
|
||||
va_start(argList, format);
|
||||
vfprintf(stdout, format, argList);
|
||||
fflush(stdout);
|
||||
va_end(argList);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,54 +1,66 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 SAMPLE_UTIL_H
|
||||
#define SAMPLE_UTIL_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include "ithread.h"
|
||||
#include "ixml.h" /* for IXML_Document, IXML_Element */
|
||||
#include "upnp.h" /* for Upnp_EventType */
|
||||
#include "upnptools.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ithread.h"
|
||||
#include "ixml.h"
|
||||
#include "upnptools.h"
|
||||
#ifdef SAMPLE_UTIL_C
|
||||
/*! Service types for tv services. */
|
||||
const char *TvServiceType[] = {
|
||||
"urn:schemas-upnp-org:service:tvcontrol:1",
|
||||
"urn:schemas-upnp-org:service:tvpicture:1"
|
||||
};
|
||||
#else /* SAMPLE_UTIL_C */
|
||||
extern const char *TvServiceType[];
|
||||
#endif /* SAMPLE_UTIL_C */
|
||||
|
||||
|
||||
// mutex to control displaying of events
|
||||
/* mutex to control displaying of events */
|
||||
extern ithread_mutex_t display_mutex;
|
||||
|
||||
|
||||
typedef enum {
|
||||
STATE_UPDATE = 0,
|
||||
DEVICE_ADDED = 1,
|
||||
@@ -56,233 +68,196 @@ typedef enum {
|
||||
GET_VAR_COMPLETE = 3
|
||||
} eventType;
|
||||
|
||||
/*!
|
||||
* \brief Given a DOM node such as <Channel>11</Channel>, this routine
|
||||
* extracts the value (e.g., 11) from the node and returns it as
|
||||
* a string. The string must be freed by the caller using free.
|
||||
*
|
||||
* \return The DOM node as a string.
|
||||
*/
|
||||
char *SampleUtil_GetElementValue(
|
||||
/*! [in] The DOM node from which to extract the value. */
|
||||
IXML_Element *element);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_GetElementValue
|
||||
/*!
|
||||
* \brief Given a DOM node representing a UPnP Device Description Document,
|
||||
* this routine parses the document and finds the first service list
|
||||
* (i.e., the service list for the root device). The service list
|
||||
* is returned as a DOM node list. The NodeList must be freed using
|
||||
* NodeList_free.
|
||||
*
|
||||
* Description:
|
||||
* Given a DOM node such as <Channel>11</Channel>, this routine
|
||||
* extracts the value (e.g., 11) from the node and returns it as
|
||||
* a string. The string must be freed by the caller using
|
||||
* free.
|
||||
*
|
||||
* Parameters:
|
||||
* node -- The DOM node from which to extract the value
|
||||
*
|
||||
********************************************************************************/
|
||||
char *SampleUtil_GetElementValue(IN IXML_Element *element);
|
||||
* \return The service list is returned as a DOM node list.
|
||||
*/
|
||||
IXML_NodeList *SampleUtil_GetFirstServiceList(
|
||||
/*! [in] The DOM node from which to extract the service list. */
|
||||
IXML_Document *doc);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_GetFirstServiceList
|
||||
*
|
||||
* Description:
|
||||
* Given a DOM node representing a UPnP Device Description Document,
|
||||
* this routine parses the document and finds the first service list
|
||||
* (i.e., the service list for the root device). The service list
|
||||
* is returned as a DOM node list. The NodeList must be freed using
|
||||
* NodeList_free.
|
||||
*
|
||||
* Parameters:
|
||||
* node -- The DOM node from which to extract the service list
|
||||
*
|
||||
********************************************************************************/
|
||||
/*!
|
||||
* \brief Given a document node, this routine searches for the first element
|
||||
* named by the input string item, and returns its value as a string.
|
||||
* String must be freed by caller using free.
|
||||
*/
|
||||
char *SampleUtil_GetFirstDocumentItem(
|
||||
/*! [in] The DOM document from which to extract the value. */
|
||||
IXML_Document *doc,
|
||||
/*! [in] The item to search for. */
|
||||
const char *item);
|
||||
|
||||
IXML_NodeList *SampleUtil_GetFirstServiceList(IN IXML_Document *doc);
|
||||
/*!
|
||||
* \brief Given a DOM element, this routine searches for the first element
|
||||
* named by the input string item, and returns its value as a string.
|
||||
* The string must be freed using free.
|
||||
*/
|
||||
char *SampleUtil_GetFirstElementItem(
|
||||
/*! [in] The DOM element from which to extract the value. */
|
||||
IXML_Element *element,
|
||||
/*! [in] The item to search for. */
|
||||
const char *item);
|
||||
|
||||
/*!
|
||||
* \brief Prints a callback event type as a string.
|
||||
*/
|
||||
void SampleUtil_PrintEventType(
|
||||
/*! [in] The callback event. */
|
||||
Upnp_EventType S);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_GetFirstDocumentItem
|
||||
*
|
||||
* Description:
|
||||
* Given a document node, this routine searches for the first element
|
||||
* named by the input string item, and returns its value as a string.
|
||||
* String must be freed by caller using free.
|
||||
* Parameters:
|
||||
* doc -- The DOM document from which to extract the value
|
||||
* item -- The item to search for
|
||||
*
|
||||
********************************************************************************/
|
||||
char *SampleUtil_GetFirstDocumentItem(IN IXML_Document *doc, IN const char *item);
|
||||
/*!
|
||||
* \brief Prints callback event structure details.
|
||||
*/
|
||||
int SampleUtil_PrintEvent(
|
||||
/*! [in] The type of callback event. */
|
||||
Upnp_EventType EventType,
|
||||
/*! [in] The callback event structure. */
|
||||
void *Event);
|
||||
|
||||
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_GetFirstElementItem
|
||||
*
|
||||
* Description:
|
||||
* Given a DOM element, this routine searches for the first element
|
||||
* named by the input string item, and returns its value as a string.
|
||||
* The string must be freed using free.
|
||||
* Parameters:
|
||||
* node -- The DOM element from which to extract the value
|
||||
* item -- The item to search for
|
||||
*
|
||||
********************************************************************************/
|
||||
char *SampleUtil_GetFirstElementItem(IN IXML_Element *element, IN const char *item);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_PrintEventType
|
||||
*
|
||||
* Description:
|
||||
* Prints a callback event type as a string.
|
||||
*
|
||||
* Parameters:
|
||||
* S -- The callback event
|
||||
*
|
||||
********************************************************************************/
|
||||
void SampleUtil_PrintEventType(IN Upnp_EventType S);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_PrintEvent
|
||||
*
|
||||
* Description:
|
||||
* Prints callback event structure details.
|
||||
*
|
||||
* Parameters:
|
||||
* EventType -- The type of callback event
|
||||
* Event -- The callback event structure
|
||||
*
|
||||
********************************************************************************/
|
||||
int SampleUtil_PrintEvent(IN Upnp_EventType EventType,
|
||||
IN void *Event);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_FindAndParseService
|
||||
*
|
||||
* Description:
|
||||
* This routine finds the first occurance of a service in a DOM representation
|
||||
* of a description document and parses it. Note that this function currently
|
||||
* assumes that the eventURL and controlURL values in the service definitions
|
||||
* are full URLs. Relative URLs are not handled here.
|
||||
*
|
||||
* Parameters:
|
||||
* DescDoc -- The DOM description document
|
||||
* location -- The location of the description document
|
||||
* serviceSearchType -- The type of service to search for
|
||||
* serviceId -- OUT -- The service ID
|
||||
* eventURL -- OUT -- The event URL for the service
|
||||
* controlURL -- OUT -- The control URL for the service
|
||||
*
|
||||
********************************************************************************/
|
||||
/*!
|
||||
* \brief This routine finds the first occurance of a service in a DOM
|
||||
* representation of a description document and parses it. Note that this
|
||||
* function currently assumes that the eventURL and controlURL values in
|
||||
* the service definitions are full URLs. Relative URLs are not handled here.
|
||||
*/
|
||||
int SampleUtil_FindAndParseService (
|
||||
IN IXML_Document *DescDoc,
|
||||
IN const char *location,
|
||||
IN char *serviceType,
|
||||
OUT char **serviceId,
|
||||
OUT char **eventURL,
|
||||
OUT char **controlURL);
|
||||
/*! [in] The DOM description document. */
|
||||
IXML_Document *DescDoc,
|
||||
/*! [in] The location of the description document. */
|
||||
const char *location,
|
||||
/*! [in] The type of service to search for. */
|
||||
const char *serviceType,
|
||||
/*! [out] The service ID. */
|
||||
char **serviceId,
|
||||
/*! [out] The event URL for the service. */
|
||||
char **eventURL,
|
||||
/*! [out] The control URL for the service. */
|
||||
char **controlURL);
|
||||
|
||||
/*!
|
||||
* \brief Prototype for displaying strings. All printing done by the device,
|
||||
* control point, and sample util, ultimately use this to display strings
|
||||
* to the user.
|
||||
*/
|
||||
typedef void (*print_string)(
|
||||
/*! [in] Format. */
|
||||
const char *string,
|
||||
/*! [in] Arguments. */
|
||||
...)
|
||||
#if (__GNUC__ >= 3)
|
||||
/* This enables printf like format checking by the compiler */
|
||||
__attribute__((format (__printf__, 1, 2)))
|
||||
#endif
|
||||
;
|
||||
|
||||
/********************************************************************************
|
||||
* print_string
|
||||
*
|
||||
* Description:
|
||||
* Prototype for displaying strings. All printing done by the device,
|
||||
* control point, and sample util, ultimately use this to display strings
|
||||
* to the user.
|
||||
*
|
||||
* Parameters:
|
||||
* const char * string.
|
||||
*
|
||||
********************************************************************************/
|
||||
typedef void (*print_string)(const char *string);
|
||||
|
||||
//global print function used by sample util
|
||||
/*! global print function used by sample util */
|
||||
extern print_string gPrintFun;
|
||||
|
||||
/********************************************************************************
|
||||
* state_update
|
||||
*
|
||||
* Description:
|
||||
* Prototype for passing back state changes
|
||||
*
|
||||
* Parameters:
|
||||
* const char * varName
|
||||
* const char * varValue
|
||||
* const char * UDN
|
||||
* int newDevice
|
||||
********************************************************************************/
|
||||
/*!
|
||||
* \brief Prototype for passing back state changes.
|
||||
*/
|
||||
typedef void (*state_update)(
|
||||
/*! [in] . */
|
||||
const char *varName,
|
||||
/*! [in] . */
|
||||
const char *varValue,
|
||||
/*! [in] . */
|
||||
const char *UDN,
|
||||
/*! [in] . */
|
||||
eventType type);
|
||||
|
||||
//global state update function used by smaple util
|
||||
/*! global state update function used by smaple util */
|
||||
extern state_update gStateUpdateFun;
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_Initialize
|
||||
*
|
||||
* Description:
|
||||
* Initializes the sample util. Must be called before any sample util
|
||||
* functions. May be called multiple times.
|
||||
*
|
||||
* Parameters:
|
||||
* print_function - print function to use in SampleUtil_Print
|
||||
*
|
||||
********************************************************************************/
|
||||
int SampleUtil_Initialize(print_string print_function);
|
||||
/*!
|
||||
* \brief Initializes the sample util. Must be called before any sample util
|
||||
* functions. May be called multiple times.
|
||||
*/
|
||||
int SampleUtil_Initialize(
|
||||
/*! [in] Print function to use in SampleUtil_Print. */
|
||||
print_string print_function);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_Finish
|
||||
*
|
||||
* Description:
|
||||
* Releases Resources held by sample util.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
********************************************************************************/
|
||||
/*!
|
||||
* \brief Releases Resources held by sample util.
|
||||
*/
|
||||
int SampleUtil_Finish();
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_Print
|
||||
/*!
|
||||
* \brief Function emulating printf that ultimately calls the registered print
|
||||
* function with the formatted string.
|
||||
*
|
||||
* Description:
|
||||
* Function emulating printf that ultimately calls the registered print
|
||||
* function with the formatted string.
|
||||
* Provides platform-specific print functionality. This function should be
|
||||
* called when you want to print content suitable for console output (i.e.,
|
||||
* in a large text box or on a screen). If your device/operating system is
|
||||
* not supported here, you should add a port.
|
||||
*
|
||||
* Parameters:
|
||||
* fmt - format (see printf)
|
||||
* . . . - variable number of args. (see printf)
|
||||
*
|
||||
********************************************************************************/
|
||||
int SampleUtil_Print(char *fmt, ...);
|
||||
* \return The same as printf.
|
||||
*/
|
||||
int SampleUtil_Print(
|
||||
/*! [in] Format (see printf). */
|
||||
const char *fmt,
|
||||
/*! [in] Format data. */
|
||||
...)
|
||||
#if (__GNUC__ >= 3)
|
||||
/* This enables printf like format checking by the compiler */
|
||||
__attribute__((format (__printf__, 1, 2)))
|
||||
#endif
|
||||
;
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_RegisterUpdateFunction
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
********************************************************************************/
|
||||
int SampleUtil_RegisterUpdateFunction(state_update update_function);
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
int SampleUtil_RegisterUpdateFunction(
|
||||
/*! [in] . */
|
||||
state_update update_function);
|
||||
|
||||
/********************************************************************************
|
||||
* SampleUtil_StateUpdate
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
********************************************************************************/
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
void SampleUtil_StateUpdate(
|
||||
/*! [in] . */
|
||||
const char *varName,
|
||||
/*! [in] . */
|
||||
const char *varValue,
|
||||
/*! [in] . */
|
||||
const char *UDN,
|
||||
/*! [in] . */
|
||||
eventType type);
|
||||
|
||||
/*!
|
||||
* \brief Prints a string to standard out.
|
||||
*/
|
||||
void linux_print(const char *format, ...)
|
||||
#if (__GNUC__ >= 3)
|
||||
/* This enables printf like format checking by the compiler */
|
||||
__attribute__((format (__printf__, 1, 2)))
|
||||
#endif
|
||||
;
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define snprintf _snprintf
|
||||
#define strcasecmp stricmp
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* SAMPLE_UTIL_H */
|
||||
|
||||
|
||||
1570
upnp/sample/common/tv_ctrlpt.c
Normal file
1570
upnp/sample/common/tv_ctrlpt.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -29,66 +29,62 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef UPNP_TV_CTRLPT_H
|
||||
#define UPNP_TV_CTRLPT_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "sample_util.h"
|
||||
|
||||
|
||||
#include "ithread.h"
|
||||
#include "upnp.h"
|
||||
#include "UpnpString.h"
|
||||
#include "upnptools.h"
|
||||
|
||||
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <unistd.h> */
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
|
||||
#define TV_SERVICE_SERVCOUNT 2
|
||||
#define TV_SERVICE_CONTROL 0
|
||||
#define TV_SERVICE_PICTURE 1
|
||||
#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_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_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_MAX_VAL_LEN 5
|
||||
|
||||
#define TV_SUCCESS 0
|
||||
#define TV_ERROR (-1)
|
||||
#define TV_WARNING 1
|
||||
#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
|
||||
#define TV_MAXVARS TV_PICTURE_VARCOUNT
|
||||
|
||||
extern char TvDeviceType[];
|
||||
extern char *TvServiceType[];
|
||||
extern char *TvServiceName[];
|
||||
extern char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS];
|
||||
extern const char *TvServiceName[];
|
||||
extern const char *TvVarName[TV_SERVICE_SERVCOUNT][TV_MAXVARS];
|
||||
extern char TvVarCount[];
|
||||
|
||||
struct tv_service {
|
||||
@@ -120,15 +116,14 @@ extern ithread_mutex_t DeviceListMutex;
|
||||
|
||||
extern UpnpClient_Handle ctrlpt_handle;
|
||||
|
||||
void TvCtrlPointPrintHelp(void);
|
||||
int TvCtrlPointDeleteNode(struct TvDeviceNode*);
|
||||
void TvCtrlPointPrintHelp(void);
|
||||
int TvCtrlPointDeleteNode(struct TvDeviceNode *);
|
||||
int TvCtrlPointRemoveDevice(const 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 TvCtrlPointSendAction(int, int, const char *, const char **, char **, int);
|
||||
int TvCtrlPointSendActionNumericArg(int devnum, int service, const char *actionName, const char *paramName, int paramValue);
|
||||
int TvCtrlPointSendPowerOn(int devnum);
|
||||
int TvCtrlPointSendPowerOff(int devnum);
|
||||
int TvCtrlPointSendSetChannel(int, int);
|
||||
@@ -138,7 +133,7 @@ int TvCtrlPointSendSetTint(int, int);
|
||||
int TvCtrlPointSendSetContrast(int, int);
|
||||
int TvCtrlPointSendSetBrightness(int, int);
|
||||
|
||||
int TvCtrlPointGetVar(int, int, char*);
|
||||
int TvCtrlPointGetVar(int, int, const char *);
|
||||
int TvCtrlPointGetPower(int devnum);
|
||||
int TvCtrlPointGetChannel(int);
|
||||
int TvCtrlPointGetVolume(int);
|
||||
@@ -148,23 +143,80 @@ int TvCtrlPointGetContrast(int);
|
||||
int TvCtrlPointGetBrightness(int);
|
||||
|
||||
int TvCtrlPointGetDevice(int, struct TvDeviceNode **);
|
||||
int TvCtrlPointPrintList( void );
|
||||
int TvCtrlPointPrintList(void);
|
||||
int TvCtrlPointPrintDevice(int);
|
||||
void TvCtrlPointAddDevice(IXML_Document *, const char *, int);
|
||||
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
||||
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
||||
void TvCtrlPointHandleEvent(const Upnp_SID, int, IXML_Document *);
|
||||
|
||||
/*!
|
||||
* \brief Update a Tv state table. Called when an event is received.
|
||||
*
|
||||
* Note: this function is NOT thread save. It must be called from another
|
||||
* function that has locked the global device list.
|
||||
**/
|
||||
void TvStateUpdate(
|
||||
/*! [in] The UDN of the parent device. */
|
||||
char *UDN,
|
||||
/*! [in] The service state table to update. */
|
||||
int Service,
|
||||
/*! [out] DOM document representing the XML received with the event. */
|
||||
IXML_Document *ChangedVariables,
|
||||
/*! [out] pointer to the state table for the Tv service to update. */
|
||||
char **State);
|
||||
|
||||
void TvCtrlPointHandleEvent(const char *, int, IXML_Document *);
|
||||
void TvCtrlPointHandleSubscribeUpdate(const char *, const 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 );
|
||||
|
||||
/*!
|
||||
* \brief Checks the advertisement each device in the global device list.
|
||||
*
|
||||
* If an advertisement expires, the device is removed from the list.
|
||||
*
|
||||
* If an advertisement is about to expire, a search request is sent for that
|
||||
* device.
|
||||
*/
|
||||
void TvCtrlPointVerifyTimeouts(
|
||||
/*! [in] The increment to subtract from the timeouts each time the
|
||||
* function is called. */
|
||||
int incr);
|
||||
|
||||
void TvCtrlPointPrintCommands(void);
|
||||
void* TvCtrlPointCommandLoop(void *);
|
||||
int TvCtrlPointStart(print_string printFunctionPtr, state_update updateFunctionPtr, int combo);
|
||||
int TvCtrlPointStop(void);
|
||||
int TvCtrlPointProcessCommand(char *cmdline);
|
||||
|
||||
/*!
|
||||
* \brief Print help info for this application.
|
||||
*/
|
||||
void TvCtrlPointPrintShortHelp(void);
|
||||
|
||||
/*!
|
||||
* \brief Print long help info for this application.
|
||||
*/
|
||||
void TvCtrlPointPrintLongHelp(void);
|
||||
|
||||
/*!
|
||||
* \briefPrint the list of valid command line commands to the user
|
||||
*/
|
||||
void TvCtrlPointPrintCommands(void);
|
||||
|
||||
/*!
|
||||
* \brief Function that receives commands from the user at the command prompt
|
||||
* during the lifetime of the device, and calls the appropriate
|
||||
* functions for those commands.
|
||||
*/
|
||||
void *TvCtrlPointCommandLoop(void *args);
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*/
|
||||
int TvCtrlPointProcessCommand(char *cmdline);
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif //UPNP_TV_CTRLPT_H
|
||||
#endif /* UPNP_TV_CTRLPT_H */
|
||||
|
||||
1510
upnp/sample/common/tv_device.c
Normal file
1510
upnp/sample/common/tv_device.c
Normal file
File diff suppressed because it is too large
Load Diff
566
upnp/sample/common/tv_device.h
Normal file
566
upnp/sample/common/tv_device.h
Normal file
@@ -0,0 +1,566 @@
|
||||
/**************************************************************************
|
||||
*
|
||||
* 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
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "sample_util.h"
|
||||
|
||||
#include "ithread.h"
|
||||
#include "upnp.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <unistd.h> */
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
/*! Color constants */
|
||||
#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
|
||||
|
||||
/*!
|
||||
* \brief 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.
|
||||
*/
|
||||
typedef int (*upnp_action)(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *request,
|
||||
/*! [out] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] Error string in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*! Structure for storing Tv Service identifiers and state table. */
|
||||
struct TvService {
|
||||
/*! Universally Unique Device Name. */
|
||||
char UDN[NAME_SIZE];
|
||||
/*! . */
|
||||
char ServiceId[NAME_SIZE];
|
||||
/*! . */
|
||||
char ServiceType[NAME_SIZE];
|
||||
/*! . */
|
||||
const char *VariableName[TV_MAXVARS];
|
||||
/*! . */
|
||||
char *VariableStrVal[TV_MAXVARS];
|
||||
/*! . */
|
||||
const char *ActionNames[TV_MAXACTIONS];
|
||||
/*! . */
|
||||
upnp_action actions[TV_MAXACTIONS];
|
||||
/*! . */
|
||||
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;
|
||||
|
||||
/*!
|
||||
* \brief Initializes the action table for the specified service.
|
||||
*
|
||||
* Note that knowledge of the service description is assumed.
|
||||
* Action names are hardcoded.
|
||||
*/
|
||||
int SetActionTable(
|
||||
/*! [in] one of TV_SERVICE_CONTROL or, TV_SERVICE_PICTURE. */
|
||||
int serviceType,
|
||||
/*! [in,out] service containing action table to set. */
|
||||
struct TvService *out);
|
||||
|
||||
/*!
|
||||
* \brief 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.
|
||||
*/
|
||||
int TvDeviceStateTableInit(
|
||||
/*! [in] The description document URL. */
|
||||
char *DescDocURL);
|
||||
|
||||
/*!
|
||||
* \brief 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.
|
||||
*/
|
||||
int TvDeviceHandleSubscriptionRequest(
|
||||
/*! [in] The subscription request event structure. */
|
||||
struct Upnp_Subscription_Request *sr_event);
|
||||
|
||||
/*!
|
||||
* \brief 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.
|
||||
*/
|
||||
int TvDeviceHandleGetVarRequest(
|
||||
/*! [in,out] The control get variable request event structure. */
|
||||
struct Upnp_State_Var_Request *cgv_event);
|
||||
|
||||
/*!
|
||||
* \brief 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.
|
||||
*/
|
||||
int TvDeviceHandleActionRequest(
|
||||
/*! [in,out] The control action request event structure. */
|
||||
struct Upnp_Action_Request *ca_event);
|
||||
|
||||
/*!
|
||||
* \brief 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:
|
||||
* \li 1) Event Subscription requests.
|
||||
* \li 2) Get Variable requests.
|
||||
* \li 3) Action requests.
|
||||
*/
|
||||
int TvDeviceCallbackEventHandler(
|
||||
/*! [in] The type of callback event. */
|
||||
Upnp_EventType,
|
||||
/*! [in] Data structure containing event data. */
|
||||
void *Event,
|
||||
/*! [in] Optional data specified during callback registration. */
|
||||
void *Cookie);
|
||||
|
||||
/*!
|
||||
* \brief 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.
|
||||
*/
|
||||
int TvDeviceSetServiceTableVar(
|
||||
/*! [in] The service number (TV_SERVICE_CONTROL or TV_SERVICE_PICTURE). */
|
||||
unsigned int service,
|
||||
/*! [in] 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). */
|
||||
int variable,
|
||||
/*! [in] The string representation of the new value. */
|
||||
char *value);
|
||||
|
||||
/* Control Service Actions */
|
||||
|
||||
/*!
|
||||
* \brief Turn the power on.
|
||||
*/
|
||||
int TvDevicePowerOn(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Turn the power off.
|
||||
*/
|
||||
int TvDevicePowerOff(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Change the channel, update the TvDevice control service
|
||||
* state table, and notify all subscribed control points of the
|
||||
* updated state.
|
||||
*/
|
||||
int TvDeviceSetChannel(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Increase the channel.
|
||||
*/
|
||||
int TvDeviceIncreaseChannel(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Decrease the channel.
|
||||
*/
|
||||
int TvDeviceDecreaseChannel(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Change the volume, update the TvDevice control service
|
||||
* state table, and notify all subscribed control points of the
|
||||
* updated state.
|
||||
*/
|
||||
int TvDeviceSetVolume(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Increase the volume.
|
||||
*/
|
||||
int TvDeviceIncreaseVolume(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Decrease the volume.
|
||||
*/
|
||||
int TvDeviceDecreaseVolume(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*Picture Service Actions */
|
||||
|
||||
/*!
|
||||
* \brief Change the color, update the TvDevice picture service
|
||||
* state table, and notify all subscribed control points of the
|
||||
* updated state.
|
||||
*/
|
||||
int TvDeviceSetColor(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Increase the color.
|
||||
*/
|
||||
int TvDeviceIncreaseColor(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Decrease the color.
|
||||
*/
|
||||
int TvDeviceDecreaseColor(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Change the tint, update the TvDevice picture service
|
||||
* state table, and notify all subscribed control points of the
|
||||
* updated state.
|
||||
*/
|
||||
int TvDeviceSetTint(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Increase tint.
|
||||
*/
|
||||
int TvDeviceIncreaseTint(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Decrease tint.
|
||||
*/
|
||||
int TvDeviceDecreaseTint(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Change the contrast, update the TvDevice picture service
|
||||
* state table, and notify all subscribed control points of the
|
||||
* updated state.
|
||||
*/
|
||||
int TvDeviceSetContrast(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Increase the contrast.
|
||||
*/
|
||||
int TvDeviceIncreaseContrast(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Decrease the contrast.
|
||||
*/
|
||||
int TvDeviceDecreaseContrast(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Change the brightness, update the TvDevice picture service
|
||||
* state table, and notify all subscribed control points of the
|
||||
* updated state.
|
||||
*/
|
||||
int TvDeviceSetBrightness(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Increase brightnesss.
|
||||
*/
|
||||
int TvDeviceIncreaseBrightness(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Decrease brightnesss.
|
||||
*/
|
||||
int TvDeviceDecreaseBrightness(
|
||||
/*! [in] Document of action request. */
|
||||
IXML_Document *in,
|
||||
/*! [in] Action result. */
|
||||
IXML_Document **out,
|
||||
/*! [out] ErrorString in case action was unsuccessful. */
|
||||
const char **errorString);
|
||||
|
||||
/*!
|
||||
* \brief Initializes the UPnP Sdk, registers the device, and sends out
|
||||
* advertisements.
|
||||
*/
|
||||
int TvDeviceStart(
|
||||
/*! [in] ip address to initialize the sdk (may be NULL)
|
||||
* if null, then the first non null loopback address is used. */
|
||||
char *ip_address,
|
||||
/*! [in] port number to initialize the sdk (may be 0)
|
||||
* if zero, then a random number is used. */
|
||||
unsigned short port,
|
||||
/*! [in] name of description document.
|
||||
* may be NULL. Default is tvdevicedesc.xml. */
|
||||
const char *desc_doc_name,
|
||||
/*! [in] path of web directory.
|
||||
* may be NULL. Default is ./web (for Linux) or ../tvdevice/web. */
|
||||
const char *web_dir_path,
|
||||
/*! [in] print function to use. */
|
||||
print_string pfun,
|
||||
/*! [in] Non-zero if called from the combo application. */
|
||||
int combo);
|
||||
|
||||
/*!
|
||||
* \brief Stops the device. Uninitializes the sdk.
|
||||
*/
|
||||
int TvDeviceStop(void);
|
||||
|
||||
/*!
|
||||
* \brief Function that receives commands from the user at the command prompt
|
||||
* during the lifetime of the device, and calls the appropriate
|
||||
* functions for those commands. Only one command, exit, is currently
|
||||
* defined.
|
||||
*/
|
||||
void *TvDeviceCommandLoop(void *args);
|
||||
|
||||
/*!
|
||||
* \brief Main entry point for tv device application.
|
||||
*
|
||||
* Initializes and registers with the sdk.
|
||||
* Initializes the state stables of the service.
|
||||
* Starts the command loop.
|
||||
*
|
||||
* Accepts the following optional arguments:
|
||||
* \li \c -ip ipaddress
|
||||
* \li \c -port port
|
||||
* \li \c -desc desc_doc_name
|
||||
* \li \c -webdir web_dir_path
|
||||
* \li \c -help
|
||||
*/
|
||||
int device_main(int argc, char *argv[]);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
72
upnp/sample/linux/tv_combo_main.c
Normal file
72
upnp/sample/linux/tv_combo_main.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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 "tv_ctrlpt.h"
|
||||
#include "tv_device.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
int code;
|
||||
|
||||
device_main(argc, argv);
|
||||
rc = TvCtrlPointStart(linux_print, NULL, 1);
|
||||
if (rc != TV_SUCCESS) {
|
||||
SampleUtil_Print("Error starting UPnP TV Control Point\n");
|
||||
return rc;
|
||||
}
|
||||
/* start a command loop thread */
|
||||
code = ithread_create(&cmdloop_thread, NULL, TvCtrlPointCommandLoop, NULL);
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
/* 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...\n", sig);
|
||||
#endif
|
||||
TvDeviceStop();
|
||||
rc = TvCtrlPointStop();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
72
upnp/sample/linux/tv_ctrlpt_main.c
Normal file
72
upnp/sample/linux/tv_ctrlpt_main.c
Normal file
@@ -0,0 +1,72 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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 "tv_ctrlpt.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
int code;
|
||||
|
||||
rc = TvCtrlPointStart(linux_print, NULL, 0);
|
||||
if (rc != TV_SUCCESS) {
|
||||
SampleUtil_Print("Error starting UPnP TV Control Point\n");
|
||||
return rc;
|
||||
}
|
||||
/* start a command loop thread */
|
||||
code = ithread_create(&cmdloop_thread, NULL, TvCtrlPointCommandLoop, NULL);
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
/* 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...\n", sig);
|
||||
#endif
|
||||
rc = TvCtrlPointStop();
|
||||
|
||||
return rc;
|
||||
argc = argc;
|
||||
argv = argv;
|
||||
}
|
||||
|
||||
65
upnp/sample/linux/tv_device_main.c
Normal file
65
upnp/sample/linux/tv_device_main.c
Normal file
@@ -0,0 +1,65 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* 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 "tv_device.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
int code;
|
||||
|
||||
device_main(argc, argv);
|
||||
/* start a command loop thread */
|
||||
code = ithread_create(&cmdloop_thread, NULL, TvDeviceCommandLoop, NULL);
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
/* 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...\n", sig);
|
||||
#endif
|
||||
rc = TvDeviceStop();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1,491 +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, described in the tvdevicedesc.xml description document." );
|
||||
SampleUtil_Print( "It also registers itself as a tv device." );
|
||||
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;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
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 );
|
||||
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
/*
|
||||
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...\n", sig );
|
||||
#endif
|
||||
TvDeviceStop();
|
||||
rc = TvCtrlPointStop();
|
||||
return rc;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,160 +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"
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#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(const 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 *, const char *, int);
|
||||
void TvCtrlPointHandleGetVar(const char *, const char *, const DOMString);
|
||||
void TvStateUpdate(char*,int, IXML_Document * , char **);
|
||||
void TvCtrlPointHandleEvent(const Upnp_SID, int, IXML_Document *);
|
||||
void TvCtrlPointHandleSubscribeUpdate(const char *, const Upnp_SID, int);
|
||||
int TvCtrlPointCallbackEventHandler(Upnp_EventType, void *, void *);
|
||||
void TvCtrlPointVerifyTimeouts(int);
|
||||
void TvCtrlPointPrintCommands( void );
|
||||
void* TvCtrlPointCommandLoop( void* );
|
||||
int TvCtrlPointStart( print_string printFunctionPtr, state_update updateFunctionPtr );
|
||||
int TvCtrlPointStop( void );
|
||||
int TvCtrlPointProcessCommand( char *cmdline );
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif //UPNP_TV_CTRLPT_H
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,640 +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>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#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
|
||||
@@ -1,441 +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 <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, described in the tvdevicedesc.xml description document." );
|
||||
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 main( int argc, char **argv )
|
||||
{
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
int code;
|
||||
|
||||
|
||||
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 );
|
||||
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
/*
|
||||
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...\n", sig );
|
||||
#endif
|
||||
|
||||
rc = TvCtrlPointStop();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,198 +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_device.h"
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* linux_print
|
||||
*
|
||||
* Description:
|
||||
* Prints a string to standard out.
|
||||
*
|
||||
* Parameters:
|
||||
* None
|
||||
*
|
||||
*****************************************************************************/
|
||||
void
|
||||
linux_print( const char *string )
|
||||
{
|
||||
printf( "%s", string );
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* TvDeviceCommandLoop
|
||||
*
|
||||
* Description:
|
||||
* Function that receives commands from the user at the command prompt
|
||||
* during the lifetime of the device, and calls the appropriate
|
||||
* functions for those commands. Only one command, exit, is currently
|
||||
* defined.
|
||||
*
|
||||
* Parameters:
|
||||
* None
|
||||
*
|
||||
*****************************************************************************/
|
||||
void *
|
||||
TvDeviceCommandLoop( void *args )
|
||||
{
|
||||
int stoploop = 0;
|
||||
char cmdline[100];
|
||||
char cmd[100];
|
||||
|
||||
while( !stoploop ) {
|
||||
sprintf( cmdline, " " );
|
||||
sprintf( cmd, " " );
|
||||
|
||||
SampleUtil_Print( "\n>> " );
|
||||
|
||||
// Get a command line
|
||||
fgets( cmdline, 100, stdin );
|
||||
|
||||
sscanf( cmdline, "%s", cmd );
|
||||
|
||||
if( strcasecmp( cmd, "exit" ) == 0 ) {
|
||||
SampleUtil_Print( "Shutting down...\n" );
|
||||
TvDeviceStop();
|
||||
exit( 0 );
|
||||
} else {
|
||||
SampleUtil_Print( "\n Unknown command: %s\n\n", cmd );
|
||||
SampleUtil_Print( " Valid Commands:\n" );
|
||||
SampleUtil_Print( " Exit\n\n" );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* main
|
||||
*
|
||||
* Description:
|
||||
* Main entry point for tv device application.
|
||||
* Initializes and registers with the sdk.
|
||||
* Initializes the state stables of the service.
|
||||
* Starts the command loop.
|
||||
*
|
||||
* Parameters:
|
||||
* int argc - count of arguments
|
||||
* char ** argv -arguments. The application
|
||||
* accepts the following optional arguments:
|
||||
*
|
||||
* -ip ipaddress
|
||||
* -port port
|
||||
* -desc desc_doc_name
|
||||
* -webdir web_dir_path"
|
||||
* -help
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
int main( IN int argc, IN char **argv )
|
||||
{
|
||||
|
||||
unsigned int portTemp = 0;
|
||||
char *ip_address = NULL,
|
||||
*desc_doc_name = NULL,
|
||||
*web_dir_path = NULL;
|
||||
int rc;
|
||||
ithread_t cmdloop_thread;
|
||||
#ifdef WIN32
|
||||
#else
|
||||
int sig;
|
||||
sigset_t sigs_to_catch;
|
||||
#endif
|
||||
int code;
|
||||
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.: tvdevicedesc.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/tvdevice/web\n" );
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
port = ( unsigned short )portTemp;
|
||||
|
||||
TvDeviceStart( ip_address, port, desc_doc_name, web_dir_path, linux_print );
|
||||
|
||||
/* start a command loop thread */
|
||||
code = ithread_create( &cmdloop_thread, NULL, TvDeviceCommandLoop, NULL );
|
||||
|
||||
#ifdef WIN32
|
||||
ithread_join(cmdloop_thread, NULL);
|
||||
#else
|
||||
/*
|
||||
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...\n", sig );
|
||||
#endif
|
||||
rc = TvDeviceStop();
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,641 +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>
|
||||
#ifndef WIN32
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#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(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -28,6 +28,27 @@
|
||||
#include <string.h> /* for strlen(), strdup() */
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define strcasecmp stricmp
|
||||
#else
|
||||
/* Other systems have strncasecmp */
|
||||
#endif
|
||||
|
||||
|
||||
/* strndup() is a GNU extension. Other systems must fix it with elif's. */
|
||||
#ifdef __GNUC__
|
||||
extern char *strndup(__const char *__string, size_t __n);
|
||||
#elif defined(WIN32)
|
||||
static char *strndup(const char *__string, size_t __n)
|
||||
{
|
||||
size_t strsize = strnlen(__string,__n);
|
||||
char *newstr = (char *) malloc(strsize + 1);
|
||||
strncpy(newstr,__string,__n);
|
||||
return(newstr);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Internal implementation of the class UpnpString.
|
||||
*
|
||||
@@ -36,7 +57,7 @@
|
||||
struct SUpnpString
|
||||
{
|
||||
/*! \brief Length of the string. */
|
||||
int m_length;
|
||||
size_t m_length;
|
||||
/*! \brief Pointer to a dynamically allocated area that holds the NULL
|
||||
* terminated string. */
|
||||
char *m_string;
|
||||
@@ -45,7 +66,7 @@ struct SUpnpString
|
||||
|
||||
UpnpString *UpnpString_new()
|
||||
{
|
||||
// All bytes are zero, and so is the length of the string.
|
||||
/* All bytes are zero, and so is the length of the string. */
|
||||
struct SUpnpString *p = calloc(1, sizeof (struct SUpnpString));
|
||||
if (p == NULL) {
|
||||
goto error_handler1;
|
||||
@@ -54,7 +75,7 @@ UpnpString *UpnpString_new()
|
||||
p->m_length = 0;
|
||||
#endif
|
||||
|
||||
// This byte is zero, calloc does initialize it.
|
||||
/* This byte is zero, calloc does initialize it. */
|
||||
p->m_string = calloc(1, 1);
|
||||
if (p->m_string == NULL) {
|
||||
goto error_handler2;
|
||||
@@ -62,7 +83,7 @@ UpnpString *UpnpString_new()
|
||||
|
||||
return (UpnpString *)p;
|
||||
|
||||
//free(p->m_string);
|
||||
/*free(p->m_string); */
|
||||
error_handler2:
|
||||
free(p);
|
||||
error_handler1:
|
||||
@@ -99,7 +120,7 @@ UpnpString *UpnpString_dup(const UpnpString *p)
|
||||
|
||||
return (UpnpString *)q;
|
||||
|
||||
//free(q->m_string);
|
||||
/*free(q->m_string); */
|
||||
error_handler2:
|
||||
free(q);
|
||||
error_handler1:
|
||||
@@ -115,42 +136,78 @@ void UpnpString_assign(UpnpString *p, const UpnpString *q)
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_get_Length(const UpnpString *p)
|
||||
size_t UpnpString_get_Length(const UpnpString *p)
|
||||
{
|
||||
return ((struct SUpnpString *)p)->m_length;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_set_Length(UpnpString *p, size_t n)
|
||||
{
|
||||
if (((struct SUpnpString *)p)->m_length > n) {
|
||||
((struct SUpnpString *)p)->m_length = n;
|
||||
/* No need to realloc now, will do later when needed. */
|
||||
((struct SUpnpString *)p)->m_string[n] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const char *UpnpString_get_String(const UpnpString *p)
|
||||
{
|
||||
return ((struct SUpnpString *)p)->m_string;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_set_String(UpnpString *p, const char *s)
|
||||
int UpnpString_set_String(UpnpString *p, const char *s)
|
||||
{
|
||||
char *q = strdup(s);
|
||||
if (!q) goto error_handler1;
|
||||
free(((struct SUpnpString *)p)->m_string);
|
||||
((struct SUpnpString *)p)->m_length = strlen(s);
|
||||
((struct SUpnpString *)p)->m_string = strdup(s);
|
||||
((struct SUpnpString *)p)->m_length = strlen(q);
|
||||
((struct SUpnpString *)p)->m_string = q;
|
||||
|
||||
error_handler1:
|
||||
return q != NULL;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_set_StringN(UpnpString *p, const char *s, int n)
|
||||
int UpnpString_set_StringN(UpnpString *p, const char *s, size_t n)
|
||||
{
|
||||
char *q = strndup(s, n);
|
||||
if (!q) goto error_handler1;
|
||||
free(((struct SUpnpString *)p)->m_string);
|
||||
((struct SUpnpString *)p)->m_length = n;
|
||||
((struct SUpnpString *)p)->m_string = (char *)malloc(n+1);
|
||||
strncpy(((struct SUpnpString *)p)->m_string, s, n);
|
||||
((struct SUpnpString *)p)->m_string[n] = 0;
|
||||
((struct SUpnpString *)p)->m_length = strlen(q);
|
||||
((struct SUpnpString *)p)->m_string = q;
|
||||
|
||||
error_handler1:
|
||||
return q != NULL;
|
||||
}
|
||||
|
||||
|
||||
void UpnpString_clear(UpnpString *p)
|
||||
{
|
||||
((struct SUpnpString *)p)->m_length = 0;
|
||||
// No need to realloc now, will do later when needed
|
||||
/* No need to realloc now, will do later when needed. */
|
||||
((struct SUpnpString *)p)->m_string[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_cmp(UpnpString *p, UpnpString *q)
|
||||
{
|
||||
const char *cp = UpnpString_get_String(p);
|
||||
const char *cq = UpnpString_get_String(q);
|
||||
|
||||
return strcmp(cp, cq);
|
||||
}
|
||||
|
||||
|
||||
int UpnpString_casecmp(UpnpString *p, UpnpString *q)
|
||||
{
|
||||
const char *cp = UpnpString_get_String(p);
|
||||
const char *cq = UpnpString_get_String(q);
|
||||
|
||||
return strcasecmp(cp, cq);
|
||||
}
|
||||
|
||||
/* @} UpnpString */
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -149,7 +149,7 @@ void UpnpPrintf(
|
||||
ithread_mutex_lock(&GlobalDebugMutex);
|
||||
va_start(ArgList, FmtStr);
|
||||
if (!DEBUG_TARGET) {
|
||||
if( DbgFileName ) {
|
||||
if (DbgFileName) {
|
||||
UpnpDisplayFileAndLine(stdout, DbgFileName, DbgLineNo);
|
||||
}
|
||||
vfprintf(stdout, FmtStr, ArgList);
|
||||
@@ -229,51 +229,50 @@ void UpnpDisplayFileAndLine(
|
||||
fflush(fd);
|
||||
}
|
||||
|
||||
|
||||
void UpnpDisplayBanner(
|
||||
FILE * fd,
|
||||
const char **lines,
|
||||
size_t size,
|
||||
int starLength)
|
||||
size_t starLength)
|
||||
{
|
||||
int leftMarginLength = starLength / 2 + 1;
|
||||
int rightMarginLength = starLength / 2 + 1;
|
||||
int i = 0;
|
||||
int LineSize = 0;
|
||||
int starLengthMinus2 = starLength - 2;
|
||||
size_t leftMarginLength = starLength / 2 + 1;
|
||||
size_t rightMarginLength = starLength / 2 + 1;
|
||||
size_t i = 0;
|
||||
size_t LineSize = 0;
|
||||
size_t starLengthMinus2 = starLength - 2;
|
||||
|
||||
char *leftMargin = ( char * )malloc( leftMarginLength );
|
||||
char *rightMargin = ( char * )malloc( rightMarginLength );
|
||||
char *stars = ( char * )malloc( starLength + 1 );
|
||||
char *currentLine = ( char * )malloc( starLength + 1 );
|
||||
char *leftMargin = malloc(leftMarginLength);
|
||||
char *rightMargin = malloc(rightMarginLength);
|
||||
char *stars = malloc(starLength + 1);
|
||||
char *currentLine = malloc(starLength + 1);
|
||||
const char *line = NULL;
|
||||
|
||||
memset( stars, '*', starLength );
|
||||
memset(stars, '*', starLength);
|
||||
stars[starLength] = 0;
|
||||
memset( leftMargin, 0, leftMarginLength );
|
||||
memset( rightMargin, 0, rightMarginLength );
|
||||
fprintf( fd, "\n%s\n", stars );
|
||||
for( i = 0; i < size; i++ ) {
|
||||
LineSize = strlen( lines[i] );
|
||||
memset(leftMargin, 0, leftMarginLength);
|
||||
memset(rightMargin, 0, rightMarginLength);
|
||||
fprintf(fd, "\n%s\n", stars);
|
||||
for (i = 0; i < size; i++) {
|
||||
LineSize = strlen(lines[i]);
|
||||
line = lines[i];
|
||||
while( LineSize > starLengthMinus2 ) {
|
||||
memcpy( currentLine, line, starLengthMinus2 );
|
||||
while (LineSize > starLengthMinus2) {
|
||||
memcpy(currentLine, line, starLengthMinus2);
|
||||
currentLine[starLengthMinus2] = 0;
|
||||
fprintf( fd, "*%s*\n", currentLine );
|
||||
fprintf(fd, "*%s*\n", currentLine);
|
||||
LineSize -= starLengthMinus2;
|
||||
line += starLengthMinus2;
|
||||
}
|
||||
leftMarginLength = (starLengthMinus2 - LineSize)/2;
|
||||
if( LineSize % 2 == 0 ) {
|
||||
leftMarginLength = (starLengthMinus2 - LineSize) / 2;
|
||||
if (LineSize % 2 == 0) {
|
||||
rightMarginLength = leftMarginLength;
|
||||
} else {
|
||||
rightMarginLength = leftMarginLength + 1;
|
||||
}
|
||||
memset( leftMargin, ' ', leftMarginLength );
|
||||
memset( rightMargin, ' ', rightMarginLength );
|
||||
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);
|
||||
|
||||
@@ -283,7 +282,6 @@ void UpnpDisplayBanner(
|
||||
free(leftMargin);
|
||||
}
|
||||
|
||||
|
||||
void PrintThreadPoolStats(
|
||||
ThreadPool *tp,
|
||||
const char *DbgFileName,
|
||||
@@ -324,32 +322,5 @@ void PrintThreadPoolStats(
|
||||
}
|
||||
|
||||
|
||||
void printNodes(IXML_Node *tmpRoot, int depth)
|
||||
{
|
||||
int i;
|
||||
IXML_NodeList *NodeList1;
|
||||
IXML_Node *ChildNode1;
|
||||
unsigned short NodeType;
|
||||
const DOMString NodeValue;
|
||||
const DOMString NodeName;
|
||||
NodeList1 = ixmlNode_getChildNodes(tmpRoot);
|
||||
for (i = 0; i < 100; ++i) {
|
||||
ChildNode1 = ixmlNodeList_item(NodeList1, i);
|
||||
if (ChildNode1 == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
printNodes(ChildNode1, depth+1);
|
||||
NodeType = ixmlNode_getNodeType(ChildNode1);
|
||||
NodeValue = ixmlNode_getNodeValue(ChildNode1);
|
||||
NodeName = ixmlNode_getNodeName(ChildNode1);
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"DEPTH-%2d-IXML_Node Type %d, "
|
||||
"IXML_Node Name: %s, IXML_Node Value: %s\n",
|
||||
depth, NodeType, NodeName, NodeValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
@@ -119,10 +119,9 @@ struct ErrorString ErrorMessages[] = {
|
||||
{UPNP_E_INTERNAL_ERROR, "UPNP_E_INTERNAL_ERROR"},
|
||||
};
|
||||
|
||||
|
||||
const char *UpnpGetErrorMessage(int rc)
|
||||
{
|
||||
int i;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < sizeof (ErrorMessages) / sizeof (ErrorMessages[0]); ++i) {
|
||||
if (rc == ErrorMessages[i].rc) {
|
||||
@@ -133,7 +132,6 @@ const char *UpnpGetErrorMessage(int rc)
|
||||
return "Unknown error code";
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \todo There is some unnecessary allocation and deallocation going on here
|
||||
* because of the way resolve_rel_url() was originally written and used. In the
|
||||
@@ -147,18 +145,36 @@ int UpnpResolveURL(
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
char *tempRel = NULL;
|
||||
|
||||
if (RelURL == NULL) {
|
||||
if (!RelURL) {
|
||||
ret = UPNP_E_INVALID_PARAM;
|
||||
goto ExitFunction;
|
||||
}
|
||||
|
||||
tempRel = resolve_rel_url((char *)BaseURL, (char *)RelURL);
|
||||
if (tempRel) {
|
||||
strcpy(AbsURL, tempRel);
|
||||
free(tempRel);
|
||||
} else {
|
||||
} else
|
||||
ret = UPNP_E_INVALID_URL;
|
||||
|
||||
ExitFunction:
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int UpnpResolveURL2(
|
||||
const char *BaseURL,
|
||||
const char *RelURL,
|
||||
char **AbsURL)
|
||||
{
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
|
||||
if (!RelURL) {
|
||||
ret = UPNP_E_INVALID_PARAM;
|
||||
goto ExitFunction;
|
||||
}
|
||||
*AbsURL = resolve_rel_url((char *)BaseURL, (char *)RelURL);
|
||||
if (!*AbsURL)
|
||||
ret = UPNP_E_INVALID_URL;
|
||||
|
||||
ExitFunction:
|
||||
return UPNP_E_SUCCESS;
|
||||
@@ -296,7 +312,7 @@ static IXML_Document *makeAction(
|
||||
}
|
||||
|
||||
if (NumArg > 0) {
|
||||
//va_start(ArgList, Arg);
|
||||
/*va_start(ArgList, Arg); */
|
||||
ArgName = Arg;
|
||||
for ( ; ; ) {
|
||||
ArgValue = va_arg(ArgList, const char *);
|
||||
@@ -315,7 +331,7 @@ static IXML_Document *makeAction(
|
||||
break;
|
||||
}
|
||||
}
|
||||
//va_end(ArgList);
|
||||
/*va_end(ArgList); */
|
||||
}
|
||||
|
||||
return ActionDoc;
|
||||
|
||||
@@ -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 "config.h"
|
||||
#if EXCLUDE_GENA == 0
|
||||
@@ -63,7 +63,7 @@ error_respond( IN SOCKINFO * info,
|
||||
int major,
|
||||
minor;
|
||||
|
||||
// retrieve the minor and major version from the GENA request
|
||||
/* retrieve the minor and major version from the GENA request */
|
||||
http_CalcResponseVersion( hmsg->major_version,
|
||||
hmsg->minor_version, &major, &minor );
|
||||
|
||||
@@ -90,38 +90,40 @@ genaCallback( IN http_parser_t * parser,
|
||||
IN http_message_t * request,
|
||||
INOUT SOCKINFO * info )
|
||||
{
|
||||
xboolean found_function = FALSE;
|
||||
int found_function = FALSE;
|
||||
|
||||
if( request->method == HTTPMETHOD_SUBSCRIBE ) {
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
found_function = TRUE;
|
||||
if( httpmsg_find_hdr( request, HDR_NT, NULL ) == NULL ) {
|
||||
// renew subscription
|
||||
/* renew subscription */
|
||||
gena_process_subscription_renewal_request
|
||||
( info, request );
|
||||
} else {
|
||||
// subscribe
|
||||
/* subscribe */
|
||||
gena_process_subscription_request( info, request );
|
||||
}
|
||||
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
|
||||
"got subscription request\n" );
|
||||
} else if( request->method == HTTPMETHOD_UNSUBSCRIBE ) {
|
||||
found_function = TRUE;
|
||||
// unsubscribe
|
||||
/* unsubscribe */
|
||||
gena_process_unsubscribe_request( info, request );
|
||||
#endif
|
||||
} else if( request->method == HTTPMETHOD_NOTIFY ) {
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
found_function = TRUE;
|
||||
// notify
|
||||
/* notify */
|
||||
gena_process_notification_event( info, request );
|
||||
#endif
|
||||
}
|
||||
|
||||
if( !found_function ) {
|
||||
// handle missing functions of device or ctrl pt
|
||||
/* handle missing functions of device or ctrl pt */
|
||||
error_respond( info, HTTP_NOT_IMPLEMENTED, request );
|
||||
}
|
||||
return;
|
||||
parser = parser;
|
||||
}
|
||||
#endif // EXCLUDE_GENA
|
||||
#endif /* EXCLUDE_GENA */
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ static void GenaAutoRenewSubscription(
|
||||
}
|
||||
UpnpPrintf(UPNP_INFO, GENA, __FILE__, __LINE__, "HANDLE IS VALID");
|
||||
|
||||
// make callback
|
||||
/* make callback */
|
||||
callback_fun = handle_info->Callback;
|
||||
cookie = handle_info->Cookie;
|
||||
HandleUnlock();
|
||||
@@ -160,14 +160,14 @@ static int ScheduleGenaAutoRenew(
|
||||
goto end_function;
|
||||
}
|
||||
|
||||
// schedule expire event
|
||||
/* schedule expire event */
|
||||
RenewEventStruct->ErrCode = UPNP_E_SUCCESS;
|
||||
RenewEventStruct->TimeOut = TimeOut;
|
||||
strcpy(RenewEventStruct->Sid, UpnpString_get_String(tmpSID));
|
||||
strncpy(RenewEventStruct->PublisherUrl,
|
||||
UpnpString_get_String(tmpEventURL), NAME_SIZE - 1);
|
||||
|
||||
// RenewEvent->EventType=UPNP_EVENT_SUBSCRIPTION_EXPIRE;
|
||||
/* RenewEvent->EventType=UPNP_EVENT_SUBSCRIPTION_EXPIRE; */
|
||||
RenewEvent->handle = client_handle;
|
||||
RenewEvent->Event = RenewEventStruct;
|
||||
|
||||
@@ -175,7 +175,7 @@ static int ScheduleGenaAutoRenew(
|
||||
TPJobSetFreeFunction(&job, (free_routine)free_upnp_timeout);
|
||||
TPJobSetPriority(&job, MED_PRIORITY);
|
||||
|
||||
// Schedule the job
|
||||
/* Schedule the job */
|
||||
return_code = TimerThreadSchedule(
|
||||
&gTimerThread,
|
||||
TimeOut - AUTO_RENEW_TIME,
|
||||
@@ -215,7 +215,7 @@ static int gena_unsubscribe(
|
||||
uri_type dest_url;
|
||||
membuffer request;
|
||||
|
||||
// parse url
|
||||
/* parse url */
|
||||
return_code = http_FixStrUrl(
|
||||
UpnpString_get_String(url),
|
||||
UpnpString_get_Length(url),
|
||||
@@ -224,7 +224,7 @@ static int gena_unsubscribe(
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// make request msg
|
||||
/* make request msg */
|
||||
membuffer_init(&request);
|
||||
request.size_inc = 30;
|
||||
return_code = http_MakeMessage(
|
||||
@@ -233,14 +233,14 @@ static int gena_unsubscribe(
|
||||
HTTPMETHOD_UNSUBSCRIBE, &dest_url,
|
||||
"SID: ", UpnpString_get_String(sid));
|
||||
|
||||
// Not able to make the message so destroy the existing buffer
|
||||
/* Not able to make the message so destroy the existing buffer */
|
||||
if (return_code != 0) {
|
||||
membuffer_destroy(&request);
|
||||
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// send request and get reply
|
||||
/* send request and get reply */
|
||||
return_code = http_RequestAndResponse(
|
||||
&dest_url, request.buf, request.length,
|
||||
HTTPMETHOD_UNSUBSCRIBE, HTTP_DEFAULT_TIMEOUT, response);
|
||||
@@ -286,7 +286,7 @@ static int gena_subscribe(
|
||||
|
||||
UpnpString_clear(sid);
|
||||
|
||||
// request timeout to string
|
||||
/* request timeout to string */
|
||||
if (timeout == NULL) {
|
||||
timeout = &local_timeout;
|
||||
}
|
||||
@@ -298,7 +298,7 @@ static int gena_subscribe(
|
||||
sprintf(timeout_str, "%d", *timeout);
|
||||
}
|
||||
|
||||
// parse url
|
||||
/* parse url */
|
||||
return_code = http_FixStrUrl(
|
||||
UpnpString_get_String(url),
|
||||
UpnpString_get_Length(url),
|
||||
@@ -307,11 +307,11 @@ static int gena_subscribe(
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// make request msg
|
||||
/* make request msg */
|
||||
membuffer_init(&request);
|
||||
request.size_inc = 30;
|
||||
if (renewal_sid) {
|
||||
// renew subscription
|
||||
/* renew subscription */
|
||||
return_code = http_MakeMessage(
|
||||
&request, 1, 1,
|
||||
"q" "ssc" "sscc",
|
||||
@@ -319,19 +319,19 @@ static int gena_subscribe(
|
||||
"SID: ", UpnpString_get_String(renewal_sid),
|
||||
"TIMEOUT: Second-", timeout_str );
|
||||
} else {
|
||||
// subscribe
|
||||
if( dest_url.hostport.IPaddress.ss_family == AF_INET6 ) {
|
||||
/* subscribe */
|
||||
if (dest_url.hostport.IPaddress.ss_family == AF_INET6) {
|
||||
struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&dest_url.hostport.IPaddress;
|
||||
return_code = http_MakeMessage(
|
||||
&request, 1, 1,
|
||||
"q" "sssdsc" "sc" "sscc",
|
||||
HTTPMETHOD_SUBSCRIBE, &dest_url,
|
||||
"CALLBACK: <http://[",
|
||||
((IN6_IS_ADDR_LINKLOCAL(DestAddr6))||(strlen(gIF_IPV6_ULA_GUA) == 0 ))?
|
||||
gIF_IPV6 : gIF_IPV6_ULA_GUA,
|
||||
(IN6_IS_ADDR_LINKLOCAL(&DestAddr6->sin6_addr) || strlen(gIF_IPV6_ULA_GUA) == 0) ?
|
||||
gIF_IPV6 : gIF_IPV6_ULA_GUA,
|
||||
"]:", LOCAL_PORT_V6, "/>",
|
||||
"NT: upnp:event",
|
||||
"TIMEOUT: Second-", timeout_str );
|
||||
"TIMEOUT: Second-", timeout_str);
|
||||
} else {
|
||||
return_code = http_MakeMessage(
|
||||
&request, 1, 1,
|
||||
@@ -346,7 +346,7 @@ static int gena_subscribe(
|
||||
return return_code;
|
||||
}
|
||||
|
||||
// send request and get reply
|
||||
/* send request and get reply */
|
||||
return_code = http_RequestAndResponse(&dest_url, request.buf,
|
||||
request.length,
|
||||
HTTPMETHOD_SUBSCRIBE,
|
||||
@@ -365,7 +365,7 @@ static int gena_subscribe(
|
||||
return UPNP_E_SUBSCRIBE_UNACCEPTED;
|
||||
}
|
||||
|
||||
// get SID and TIMEOUT
|
||||
/* get SID and TIMEOUT */
|
||||
if (httpmsg_find_hdr(&response.msg, HDR_SID, &sid_hdr) == NULL ||
|
||||
sid_hdr.length == 0 ||
|
||||
httpmsg_find_hdr( &response.msg, HDR_TIMEOUT, &timeout_hdr ) == NULL ||
|
||||
@@ -375,10 +375,10 @@ static int gena_subscribe(
|
||||
return UPNP_E_BAD_RESPONSE;
|
||||
}
|
||||
|
||||
// save timeout
|
||||
/* save timeout */
|
||||
parse_ret = matchstr(timeout_hdr.buf, timeout_hdr.length, "%iSecond-%d%0", timeout);
|
||||
if (parse_ret == PARSE_OK) {
|
||||
// nothing to do
|
||||
/* nothing to do */
|
||||
} else if (memptr_cmp_nocase(&timeout_hdr, "Second-infinite") == 0) {
|
||||
*timeout = -1;
|
||||
} else {
|
||||
@@ -387,7 +387,7 @@ static int gena_subscribe(
|
||||
return UPNP_E_BAD_RESPONSE;
|
||||
}
|
||||
|
||||
// save SID
|
||||
/* save SID */
|
||||
UpnpString_set_StringN(sid, sid_hdr.buf, sid_hdr.length);
|
||||
if (UpnpString_get_String(sid) == NULL) {
|
||||
httpmsg_destroy(&response.msg);
|
||||
@@ -456,7 +456,7 @@ int genaUnSubscribe(
|
||||
ClientSubscription *sub_copy = UpnpClientSubscription_new();
|
||||
http_parser_t response;
|
||||
|
||||
// validate handle and sid
|
||||
/* validate handle and sid */
|
||||
HandleLock();
|
||||
if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) {
|
||||
HandleUnlock();
|
||||
@@ -518,7 +518,7 @@ int genaSubscribe(
|
||||
UpnpString_clear(out_sid);
|
||||
|
||||
HandleReadLock();
|
||||
// validate handle
|
||||
/* validate handle */
|
||||
if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) {
|
||||
HandleUnlock();
|
||||
|
||||
@@ -526,7 +526,7 @@ int genaSubscribe(
|
||||
}
|
||||
HandleUnlock();
|
||||
|
||||
// subscribe
|
||||
/* subscribe */
|
||||
SubscribeLock();
|
||||
return_code = gena_subscribe(PublisherURL, TimeOut, NULL, ActualSID);
|
||||
HandleLock();
|
||||
@@ -542,16 +542,16 @@ int genaSubscribe(
|
||||
goto error_handler;
|
||||
}
|
||||
|
||||
// generate client SID
|
||||
/* generate client SID */
|
||||
uuid_create(&uid );
|
||||
uuid_unpack(&uid, temp_sid);
|
||||
sprintf(temp_sid2, "uuid:%s", temp_sid);
|
||||
UpnpString_set_String(out_sid, temp_sid2);
|
||||
|
||||
// create event url
|
||||
/* create event url */
|
||||
UpnpString_assign(EventURL, PublisherURL);
|
||||
|
||||
// fill subscription
|
||||
/* fill subscription */
|
||||
if (newSubscription == NULL) {
|
||||
return_code = UPNP_E_OUTOF_MEMORY;
|
||||
goto error_handler;
|
||||
@@ -563,7 +563,7 @@ int genaSubscribe(
|
||||
UpnpClientSubscription_set_Next(newSubscription, handle_info->ClientSubList);
|
||||
handle_info->ClientSubList = newSubscription;
|
||||
|
||||
// schedule expiration event
|
||||
/* schedule expiration event */
|
||||
return_code = ScheduleGenaAutoRenew(client_handle, *TimeOut, newSubscription);
|
||||
|
||||
error_handler:
|
||||
@@ -594,7 +594,7 @@ int genaRenewSubscription(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// validate handle and sid
|
||||
/* validate handle and sid */
|
||||
if (GetHandleInfo(client_handle, &handle_info) != HND_CLIENT) {
|
||||
HandleUnlock();
|
||||
|
||||
@@ -610,7 +610,7 @@ int genaRenewSubscription(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// remove old events
|
||||
/* remove old events */
|
||||
if (TimerThreadRemove(
|
||||
&gTimerThread,
|
||||
UpnpClientSubscription_get_RenewEventId(sub),
|
||||
@@ -639,17 +639,17 @@ int genaRenewSubscription(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// we just called GetHandleInfo, so we don't check for return value
|
||||
//GetHandleInfo(client_handle, &handle_info);
|
||||
/* we just called GetHandleInfo, so we don't check for return value */
|
||||
/*GetHandleInfo(client_handle, &handle_info); */
|
||||
if (return_code != UPNP_E_SUCCESS) {
|
||||
// network failure (remove client sub)
|
||||
/* network failure (remove client sub) */
|
||||
RemoveClientSubClientSID(&handle_info->ClientSubList, in_sid);
|
||||
free_client_subscription(sub_copy);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// get subscription
|
||||
/* get subscription */
|
||||
sub = GetClientSubClientSID(handle_info->ClientSubList, in_sid);
|
||||
if (sub == NULL) {
|
||||
free_client_subscription(sub_copy);
|
||||
@@ -658,10 +658,10 @@ int genaRenewSubscription(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// store actual sid
|
||||
/* store actual sid */
|
||||
UpnpClientSubscription_set_ActualSID(sub, ActualSID);
|
||||
|
||||
// start renew subscription timer
|
||||
/* start renew subscription timer */
|
||||
return_code = ScheduleGenaAutoRenew(client_handle, *TimeOut, sub);
|
||||
if (return_code != GENA_SUCCESS) {
|
||||
RemoveClientSubClientSID(
|
||||
@@ -698,7 +698,7 @@ void gena_process_notification_event(
|
||||
nts_hdr;
|
||||
memptr seq_hdr;
|
||||
|
||||
// get SID
|
||||
/* get SID */
|
||||
if (httpmsg_find_hdr(event, HDR_SID, &sid_hdr) == NULL) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, event);
|
||||
goto exit_function;
|
||||
@@ -706,28 +706,28 @@ void gena_process_notification_event(
|
||||
sid.buff = sid_hdr.buf;
|
||||
sid.size = sid_hdr.length;
|
||||
|
||||
// get event key
|
||||
/* get event key */
|
||||
if (httpmsg_find_hdr(event, HDR_SEQ, &seq_hdr) == NULL ||
|
||||
matchstr(seq_hdr.buf, seq_hdr.length, "%d%0", &eventKey) != PARSE_OK) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, event );
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// get NT and NTS headers
|
||||
/* get NT and NTS headers */
|
||||
if (httpmsg_find_hdr(event, HDR_NT, &nt_hdr) == NULL ||
|
||||
httpmsg_find_hdr(event, HDR_NTS, &nts_hdr) == NULL) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, event );
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// verify NT and NTS headers
|
||||
/* verify NT and NTS headers */
|
||||
if (memptr_cmp(&nt_hdr, "upnp:event") != 0 ||
|
||||
memptr_cmp(&nts_hdr, "upnp:propchange") != 0) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, event);
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// parse the content (should be XML)
|
||||
/* parse the content (should be XML) */
|
||||
if (!has_xml_content_type(event) ||
|
||||
event->msg.length == 0 ||
|
||||
ixmlParseBufferEx(event->entity.buf, &ChangedVars) != IXML_SUCCESS) {
|
||||
@@ -737,28 +737,28 @@ void gena_process_notification_event(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// get client info
|
||||
/* get client info */
|
||||
if (GetClientHandleInfo(&client_handle, &handle_info) != HND_CLIENT) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, event);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// get subscription based on SID
|
||||
/* get subscription based on SID */
|
||||
subscription = GetClientSubActualSID(handle_info->ClientSubList, &sid);
|
||||
if (subscription == NULL) {
|
||||
if (eventKey == 0) {
|
||||
// wait until we've finished processing a subscription
|
||||
// (if we are in the middle)
|
||||
// this is to avoid mistakenly rejecting the first event if we
|
||||
// receive it before the subscription response
|
||||
/* wait until we've finished processing a subscription */
|
||||
/* (if we are in the middle) */
|
||||
/* this is to avoid mistakenly rejecting the first event if we */
|
||||
/* receive it before the subscription response */
|
||||
HandleUnlock();
|
||||
|
||||
// try and get Subscription Lock
|
||||
// (in case we are in the process of subscribing)
|
||||
/* try and get Subscription Lock */
|
||||
/* (in case we are in the process of subscribing) */
|
||||
SubscribeLock();
|
||||
|
||||
// get HandleLock again
|
||||
/* get HandleLock again */
|
||||
HandleLock();
|
||||
|
||||
if (GetClientHandleInfo(&client_handle, &handle_info) != HND_CLIENT) {
|
||||
@@ -784,25 +784,25 @@ void gena_process_notification_event(
|
||||
}
|
||||
}
|
||||
|
||||
// success
|
||||
/* success */
|
||||
error_respond(info, HTTP_OK, event);
|
||||
|
||||
// fill event struct
|
||||
/* fill event struct */
|
||||
tmpSID = UpnpClientSubscription_get_SID(subscription);
|
||||
strcpy(event_struct.Sid, UpnpString_get_String(tmpSID));
|
||||
event_struct.EventKey = eventKey;
|
||||
event_struct.ChangedVariables = ChangedVars;
|
||||
|
||||
// copy callback
|
||||
/* copy callback */
|
||||
callback = handle_info->Callback;
|
||||
cookie = handle_info->Cookie;
|
||||
|
||||
HandleUnlock();
|
||||
|
||||
// make callback with event struct
|
||||
// In future, should find a way of mainting
|
||||
// that the handle is not unregistered in the middle of a
|
||||
// callback
|
||||
/* make callback with event struct */
|
||||
/* In future, should find a way of mainting */
|
||||
/* that the handle is not unregistered in the middle of a */
|
||||
/* callback */
|
||||
callback(UPNP_EVENT_RECEIVED, &event_struct, cookie);
|
||||
|
||||
exit_function:
|
||||
|
||||
@@ -29,19 +29,15 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#if EXCLUDE_GENA == 0
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
|
||||
|
||||
#include "gena.h"
|
||||
#include "httpparser.h"
|
||||
#include "httpreadwrite.h"
|
||||
@@ -53,7 +49,6 @@
|
||||
#include "upnpapi.h"
|
||||
#include "uuid.h"
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Unregisters a device.
|
||||
*
|
||||
@@ -81,7 +76,6 @@ int genaUnregisterDevice(
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Generates XML property set for notifications.
|
||||
*
|
||||
@@ -102,7 +96,7 @@ static int GeneratePropertySet(
|
||||
{
|
||||
char *buffer;
|
||||
int counter = 0;
|
||||
int size = 0;
|
||||
size_t size = 0;
|
||||
int temp_counter = 0;
|
||||
|
||||
/*size += strlen(XML_VERSION);*/
|
||||
@@ -116,9 +110,8 @@ static int GeneratePropertySet(
|
||||
}
|
||||
|
||||
buffer = (char *)malloc(size + 1);
|
||||
if (buffer == NULL) {
|
||||
if (buffer == NULL)
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
memset(buffer, 0, size + 1);
|
||||
/*
|
||||
strcpy(buffer,XML_VERSION);
|
||||
@@ -140,7 +133,6 @@ static int GeneratePropertySet(
|
||||
return XML_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Frees memory used in notify_threads if the reference count is 0,
|
||||
* otherwise decrements the refrence count.
|
||||
@@ -160,7 +152,6 @@ static void free_notify_struct(
|
||||
free(input);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Sends the notify message and returns a reply.
|
||||
*
|
||||
@@ -178,73 +169,69 @@ static UPNP_INLINE int notify_send_and_recv(
|
||||
/*! [out] The response from the control point. */
|
||||
http_parser_t *response)
|
||||
{
|
||||
uri_type url;
|
||||
int conn_fd;
|
||||
membuffer start_msg;
|
||||
int ret_code;
|
||||
int err_code;
|
||||
int timeout;
|
||||
SOCKINFO info;
|
||||
uri_type url;
|
||||
SOCKET conn_fd;
|
||||
membuffer start_msg;
|
||||
int ret_code;
|
||||
int err_code;
|
||||
int timeout;
|
||||
SOCKINFO info;
|
||||
const char *CRLF = "\r\n";
|
||||
|
||||
// connect
|
||||
UpnpPrintf( UPNP_ALL, GENA, __FILE__, __LINE__,
|
||||
"gena notify to: %.*s\n",
|
||||
(int)destination_url->hostport.text.size,
|
||||
destination_url->hostport.text.buff );
|
||||
/* connect */
|
||||
UpnpPrintf(UPNP_ALL, GENA, __FILE__, __LINE__,
|
||||
"gena notify to: %.*s\n",
|
||||
(int)destination_url->hostport.text.size,
|
||||
destination_url->hostport.text.buff);
|
||||
|
||||
conn_fd = http_Connect( destination_url, &url );
|
||||
if( conn_fd < 0 ) {
|
||||
return conn_fd; // return UPNP error
|
||||
}
|
||||
conn_fd = http_Connect(destination_url, &url);
|
||||
if (conn_fd < 0)
|
||||
/* return UPNP error */
|
||||
return UPNP_E_SOCKET_CONNECT;
|
||||
ret_code = sock_init(&info, conn_fd);
|
||||
if (ret_code) {
|
||||
sock_destroy(&info, SD_BOTH);
|
||||
return ret_code;
|
||||
}
|
||||
/* make start line and HOST header */
|
||||
membuffer_init(&start_msg);
|
||||
if (http_MakeMessage(
|
||||
&start_msg, 1, 1,
|
||||
"q" "s",
|
||||
HTTPMETHOD_NOTIFY, &url,
|
||||
mid_msg->buf) != 0) {
|
||||
membuffer_destroy(&start_msg);
|
||||
sock_destroy(&info, SD_BOTH);
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
timeout = GENA_NOTIFICATION_SENDING_TIMEOUT;
|
||||
/* send msg (note: end of notification will contain "\r\n" twice) */
|
||||
ret_code = http_SendMessage(&info, &timeout,
|
||||
"bbb",
|
||||
start_msg.buf, start_msg.length,
|
||||
propertySet, strlen(propertySet),
|
||||
CRLF, sizeof CRLF);
|
||||
if (ret_code) {
|
||||
membuffer_destroy(&start_msg);
|
||||
sock_destroy(&info, SD_BOTH);
|
||||
return ret_code;
|
||||
}
|
||||
timeout = GENA_NOTIFICATION_ANSWERING_TIMEOUT;
|
||||
ret_code = http_RecvMessage(&info, response,
|
||||
HTTPMETHOD_NOTIFY, &timeout, &err_code);
|
||||
if (ret_code) {
|
||||
membuffer_destroy(&start_msg);
|
||||
sock_destroy(&info, SD_BOTH);
|
||||
httpmsg_destroy(&response->msg);
|
||||
return ret_code;
|
||||
}
|
||||
/* should shutdown completely when closing socket */
|
||||
sock_destroy(&info, SD_BOTH);
|
||||
membuffer_destroy(&start_msg);
|
||||
|
||||
if( ( ret_code = sock_init( &info, conn_fd ) ) != 0 ) {
|
||||
sock_destroy( &info, SD_BOTH );
|
||||
return ret_code;
|
||||
}
|
||||
// make start line and HOST header
|
||||
membuffer_init( &start_msg );
|
||||
if (http_MakeMessage(
|
||||
&start_msg, 1, 1,
|
||||
"q" "s",
|
||||
HTTPMETHOD_NOTIFY, &url,
|
||||
mid_msg->buf ) != 0 ) {
|
||||
membuffer_destroy( &start_msg );
|
||||
sock_destroy( &info, SD_BOTH );
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
|
||||
timeout = HTTP_DEFAULT_TIMEOUT;
|
||||
|
||||
// send msg (note +1 for propertyset; null-terminator is also sent)
|
||||
if( ( ret_code = http_SendMessage( &info, &timeout,
|
||||
"bb",
|
||||
start_msg.buf, start_msg.length,
|
||||
propertySet,
|
||||
strlen( propertySet ) + 1 ) ) !=
|
||||
0 ) {
|
||||
membuffer_destroy( &start_msg );
|
||||
sock_destroy( &info, SD_BOTH );
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
if( ( ret_code = http_RecvMessage( &info, response,
|
||||
HTTPMETHOD_NOTIFY, &timeout,
|
||||
&err_code ) ) != 0 ) {
|
||||
membuffer_destroy( &start_msg );
|
||||
sock_destroy( &info, SD_BOTH );
|
||||
httpmsg_destroy( &response->msg );
|
||||
return ret_code;
|
||||
}
|
||||
|
||||
sock_destroy( &info, SD_BOTH ); //should shutdown completely
|
||||
//when closing socket
|
||||
// sock_destroy( &info,SD_RECEIVE);
|
||||
membuffer_destroy( &start_msg );
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Function to Notify a particular subscription of a particular event.
|
||||
*
|
||||
@@ -264,55 +251,47 @@ static int genaNotify(
|
||||
/*! [in] subscription to be Notified, assumes this is valid for life of function. */
|
||||
subscription *sub)
|
||||
{
|
||||
int i;
|
||||
membuffer mid_msg;
|
||||
membuffer endmsg;
|
||||
uri_type *url;
|
||||
http_parser_t response;
|
||||
int return_code = -1;
|
||||
size_t i;
|
||||
membuffer mid_msg;
|
||||
membuffer endmsg;
|
||||
uri_type *url;
|
||||
http_parser_t response;
|
||||
int return_code = -1;
|
||||
|
||||
membuffer_init( &mid_msg );
|
||||
membuffer_init(&mid_msg);
|
||||
/* make 'end' msg (the part that won't vary with the destination) */
|
||||
endmsg.size_inc = 30;
|
||||
if (http_MakeMessage(&mid_msg, 1, 1,
|
||||
"s" "ssc" "sdcc",
|
||||
headers,
|
||||
"SID: ", sub->sid,
|
||||
"SEQ: ", sub->ToSendEventKey) != 0) {
|
||||
membuffer_destroy(&mid_msg);
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
/* send a notify to each url until one goes thru */
|
||||
for (i = 0; i < sub->DeliveryURLs.size; i++) {
|
||||
url = &sub->DeliveryURLs.parsedURLs[i];
|
||||
return_code = notify_send_and_recv(
|
||||
url, &mid_msg, propertySet, &response);
|
||||
if (return_code == UPNP_E_SUCCESS)
|
||||
break;
|
||||
}
|
||||
membuffer_destroy(&mid_msg);
|
||||
if (return_code == UPNP_E_SUCCESS) {
|
||||
if (response.msg.status_code == HTTP_OK)
|
||||
return_code = GENA_SUCCESS;
|
||||
else {
|
||||
if (response.msg.status_code == HTTP_PRECONDITION_FAILED)
|
||||
/*Invalid SID gets removed */
|
||||
return_code = GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB;
|
||||
else
|
||||
return_code = GENA_E_NOTIFY_UNACCEPTED;
|
||||
}
|
||||
httpmsg_destroy(&response.msg);
|
||||
}
|
||||
|
||||
// make 'end' msg (the part that won't vary with the destination)
|
||||
endmsg.size_inc = 30;
|
||||
if( http_MakeMessage(
|
||||
&mid_msg, 1, 1,
|
||||
"s" "ssc" "sdcc",
|
||||
headers,
|
||||
"SID: ", sub->sid,
|
||||
"SEQ: ", sub->ToSendEventKey ) != 0 ) {
|
||||
membuffer_destroy( &mid_msg );
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
// send a notify to each url until one goes thru
|
||||
for( i = 0; i < sub->DeliveryURLs.size; i++ ) {
|
||||
url = &sub->DeliveryURLs.parsedURLs[i];
|
||||
|
||||
if( ( return_code = notify_send_and_recv( url,
|
||||
&mid_msg, propertySet,
|
||||
&response ) ) ==
|
||||
UPNP_E_SUCCESS ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
membuffer_destroy( &mid_msg );
|
||||
|
||||
if( return_code == UPNP_E_SUCCESS ) {
|
||||
if( response.msg.status_code == HTTP_OK ) {
|
||||
return_code = GENA_SUCCESS;
|
||||
} else {
|
||||
if( response.msg.status_code == HTTP_PRECONDITION_FAILED ) {
|
||||
//Invalid SID gets removed
|
||||
return_code = GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB;
|
||||
} else {
|
||||
return_code = GENA_E_NOTIFY_UNACCEPTED;
|
||||
}
|
||||
}
|
||||
httpmsg_destroy( &response.msg );
|
||||
}
|
||||
|
||||
return return_code;
|
||||
return return_code;
|
||||
}
|
||||
|
||||
|
||||
@@ -328,80 +307,81 @@ static void genaNotifyThread(
|
||||
/*! [in] notify thread structure containing all the headers and property set info. */
|
||||
void *input)
|
||||
{
|
||||
subscription *sub;
|
||||
service_info *service;
|
||||
subscription sub_copy;
|
||||
notify_thread_struct *in = ( notify_thread_struct * ) input;
|
||||
int return_code;
|
||||
struct Handle_Info *handle_info;
|
||||
ThreadPoolJob job;
|
||||
subscription *sub;
|
||||
service_info *service;
|
||||
subscription sub_copy;
|
||||
notify_thread_struct *in = (notify_thread_struct *) input;
|
||||
int return_code;
|
||||
struct Handle_Info *handle_info;
|
||||
ThreadPoolJob job;
|
||||
|
||||
HandleReadLock();
|
||||
//validate context
|
||||
/* This should be a HandleLock and not a HandleReadLock otherwise if there
|
||||
* is a lot of notifications, then multiple threads will acquire a read
|
||||
* lock and the thread which sends the notification will be blocked forever
|
||||
* on the HandleLock at the end of this function. */
|
||||
/*HandleReadLock(); */
|
||||
HandleLock();
|
||||
/* validate context */
|
||||
|
||||
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
|
||||
free_notify_struct( in );
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
if (GetHandleInfo(in->device_handle, &handle_info) != HND_DEVICE) {
|
||||
free_notify_struct(in);
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
|
||||
if( ( ( service = FindServiceId( &handle_info->ServiceTable,
|
||||
in->servId, in->UDN ) ) == NULL )
|
||||
|| ( !service->active )
|
||||
|| ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL )
|
||||
|| ( ( copy_subscription( sub, &sub_copy ) != HTTP_SUCCESS ) ) ) {
|
||||
free_notify_struct( in );
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
//If the event is out of order push it back to the job queue
|
||||
if( in->eventKey != sub->ToSendEventKey ) {
|
||||
if (!(service = FindServiceId(&handle_info->ServiceTable, in->servId, in->UDN)) ||
|
||||
!service->active ||
|
||||
!(sub = GetSubscriptionSID(in->sid, service)) ||
|
||||
copy_subscription(sub, &sub_copy) != HTTP_SUCCESS) {
|
||||
free_notify_struct(in);
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
#ifdef UPNP_ENABLE_NOTIFICATION_REORDERING
|
||||
/*If the event is out of order push it back to the job queue */
|
||||
if (in->eventKey != sub->ToSendEventKey) {
|
||||
TPJobInit(&job, (start_routine) genaNotifyThread, input);
|
||||
TPJobSetFreeFunction(&job, (free_function) free_notify_struct);
|
||||
TPJobSetPriority(&job, MED_PRIORITY);
|
||||
/* Sleep a little before creating another thread otherwise if there is
|
||||
* a lot of notifications to send, the device will take 100% of the CPU
|
||||
* to create threads and push them back to the job queue. */
|
||||
imillisleep(1);
|
||||
ThreadPoolAdd(&gSendThreadPool, &job, NULL);
|
||||
freeSubscription(&sub_copy);
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
TPJobInit( &job, ( start_routine ) genaNotifyThread, input );
|
||||
TPJobSetFreeFunction( &job, ( free_function ) free_notify_struct );
|
||||
TPJobSetPriority( &job, MED_PRIORITY );
|
||||
ThreadPoolAdd( &gSendThreadPool, &job, NULL );
|
||||
HandleUnlock();
|
||||
|
||||
freeSubscription( &sub_copy );
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
/* send the notify */
|
||||
return_code = genaNotify(in->headers, in->propertySet, &sub_copy);
|
||||
freeSubscription(&sub_copy);
|
||||
HandleLock();
|
||||
if (GetHandleInfo(in->device_handle, &handle_info) != HND_DEVICE) {
|
||||
free_notify_struct(in);
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
/* validate context */
|
||||
if (!(service = FindServiceId(&handle_info->ServiceTable, in->servId, in->UDN)) ||
|
||||
!service->active ||
|
||||
!(sub = GetSubscriptionSID(in->sid, service))) {
|
||||
free_notify_struct(in);
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
sub->ToSendEventKey++;
|
||||
if (sub->ToSendEventKey < 0)
|
||||
/* wrap to 1 for overflow */
|
||||
sub->ToSendEventKey = 1;
|
||||
if (return_code == GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB)
|
||||
RemoveSubscriptionSID(in->sid, service);
|
||||
free_notify_struct(in);
|
||||
|
||||
HandleUnlock();
|
||||
|
||||
//send the notify
|
||||
return_code = genaNotify( in->headers, in->propertySet, &sub_copy );
|
||||
|
||||
freeSubscription( &sub_copy );
|
||||
|
||||
HandleLock();
|
||||
|
||||
if( GetHandleInfo( in->device_handle, &handle_info ) != HND_DEVICE ) {
|
||||
free_notify_struct( in );
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
//validate context
|
||||
if( ( ( service = FindServiceId( &handle_info->ServiceTable,
|
||||
in->servId, in->UDN ) ) == NULL )
|
||||
|| ( !service->active )
|
||||
|| ( ( sub = GetSubscriptionSID( in->sid, service ) ) == NULL ) ) {
|
||||
free_notify_struct( in );
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
|
||||
sub->ToSendEventKey++;
|
||||
|
||||
if( sub->ToSendEventKey < 0 ) //wrap to 1 for overflow
|
||||
sub->ToSendEventKey = 1;
|
||||
|
||||
if( return_code == GENA_E_NOTIFY_UNACCEPTED_REMOVE_SUB ) {
|
||||
RemoveSubscriptionSID( in->sid, service );
|
||||
}
|
||||
|
||||
free_notify_struct( in );
|
||||
HandleUnlock();
|
||||
HandleUnlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -428,7 +408,7 @@ static char *AllocGenaHeaders(
|
||||
static const char *HEADER_LINE_4 =
|
||||
"NTS: upnp:propchange\r\n";
|
||||
char *headers = NULL;
|
||||
int headers_size = 0;
|
||||
size_t headers_size = 0;
|
||||
int line = 0;
|
||||
|
||||
headers_size =
|
||||
@@ -1115,8 +1095,8 @@ static int create_url_list(
|
||||
/*! [out] . */
|
||||
URL_list *out)
|
||||
{
|
||||
int URLcount = 0;
|
||||
int i;
|
||||
size_t URLcount = 0;
|
||||
size_t i;
|
||||
int return_code = 0;
|
||||
uri_type temp;
|
||||
token urls;
|
||||
@@ -1146,12 +1126,11 @@ static int create_url_list(
|
||||
}
|
||||
|
||||
if( URLcount > 0 ) {
|
||||
out->URLs = ( char * )malloc( URLS->size + 1 );
|
||||
out->parsedURLs =
|
||||
( uri_type * ) malloc( sizeof( uri_type ) * URLcount );
|
||||
if( ( out->URLs == NULL ) || ( out->parsedURLs == NULL ) ) {
|
||||
free( out->URLs );
|
||||
free( out->parsedURLs );
|
||||
out->URLs = malloc(URLS->size + 1);
|
||||
out->parsedURLs = malloc(sizeof(uri_type) * URLcount);
|
||||
if (!out->URLs || !out->parsedURLs) {
|
||||
free(out->URLs);
|
||||
free(out->parsedURLs);
|
||||
out->URLs = NULL;
|
||||
out->parsedURLs = NULL;
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
@@ -1182,7 +1161,7 @@ static int create_url_list(
|
||||
}
|
||||
out->size = URLcount;
|
||||
|
||||
return URLcount;
|
||||
return (int)URLcount;
|
||||
}
|
||||
|
||||
|
||||
@@ -1214,20 +1193,20 @@ void gena_process_subscription_request(
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// check NT header
|
||||
// Windows Millenium Interoperability:
|
||||
// we accept either upnp:event, or upnp:propchange for the NT header
|
||||
/* check NT header */
|
||||
/* Windows Millenium Interoperability: */
|
||||
/* we accept either upnp:event, or upnp:propchange for the NT header */
|
||||
if (memptr_cmp_nocase(&nt_hdr, "upnp:event") != 0) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, request);
|
||||
goto exit_function;
|
||||
}
|
||||
|
||||
// if a SID is present then the we have a bad request "incompatible headers"
|
||||
/* if a SID is present then the we have a bad request "incompatible headers" */
|
||||
if (httpmsg_find_hdr(request, HDR_SID, NULL) != NULL) {
|
||||
error_respond(info, HTTP_BAD_REQUEST, request);
|
||||
goto exit_function;
|
||||
}
|
||||
// look up service by eventURL
|
||||
/* look up service by eventURL */
|
||||
event_url_path = str_alloc(request->uri.pathquery.buff, request->uri.pathquery.size);
|
||||
if (event_url_path == NULL) {
|
||||
error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request);
|
||||
@@ -1240,7 +1219,7 @@ void gena_process_subscription_request(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// CURRENTLY, ONLY ONE DEVICE
|
||||
/* CURRENTLY, ONLY ONE DEVICE */
|
||||
if (GetDeviceHandleInfo(info->foreign_sockaddr.ss_family ,
|
||||
&device_handle, &handle_info) != HND_DEVICE) {
|
||||
free(event_url_path);
|
||||
@@ -1263,14 +1242,14 @@ void gena_process_subscription_request(
|
||||
service->TotalSubscriptions,
|
||||
handle_info->MaxSubscriptions);
|
||||
|
||||
// too many subscriptions
|
||||
/* too many subscriptions */
|
||||
if (handle_info->MaxSubscriptions != -1 &&
|
||||
service->TotalSubscriptions >= handle_info->MaxSubscriptions) {
|
||||
error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
// generate new subscription
|
||||
/* generate new subscription */
|
||||
sub = (subscription *)malloc(sizeof (subscription));
|
||||
if (sub == NULL) {
|
||||
error_respond(info, HTTP_INTERNAL_SERVER_ERROR, request);
|
||||
@@ -1285,7 +1264,7 @@ void gena_process_subscription_request(
|
||||
sub->DeliveryURLs.URLs = NULL;
|
||||
sub->DeliveryURLs.parsedURLs = NULL;
|
||||
|
||||
// check for valid callbacks
|
||||
/* check for valid callbacks */
|
||||
if (httpmsg_find_hdr( request, HDR_CALLBACK, &callback_hdr) == NULL) {
|
||||
error_respond(info, HTTP_PRECONDITION_FAILED, request);
|
||||
freeSubscriptionList(sub);
|
||||
@@ -1305,20 +1284,20 @@ void gena_process_subscription_request(
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
// set the timeout
|
||||
/* set the timeout */
|
||||
if (httpmsg_find_hdr(request, HDR_TIMEOUT, &timeout_hdr) != NULL) {
|
||||
if (matchstr(timeout_hdr.buf, timeout_hdr.length,
|
||||
"%iSecond-%d%0", &time_out) == PARSE_OK) {
|
||||
// nothing
|
||||
/* nothing */
|
||||
} else if(memptr_cmp_nocase(&timeout_hdr, "Second-infinite") == 0) {
|
||||
// infinite timeout
|
||||
/* infinite timeout */
|
||||
time_out = -1;
|
||||
} else {
|
||||
// default is > 1800 seconds
|
||||
/* default is > 1800 seconds */
|
||||
time_out = DEFAULT_TIMEOUT;
|
||||
}
|
||||
}
|
||||
// replace infinite timeout with max timeout, if possible
|
||||
/* replace infinite timeout with max timeout, if possible */
|
||||
if (handle_info->MaxSubscriptionTimeOut != -1) {
|
||||
if (time_out == -1 ||
|
||||
time_out > handle_info->MaxSubscriptionTimeOut) {
|
||||
@@ -1328,40 +1307,40 @@ void gena_process_subscription_request(
|
||||
if (time_out >= 0) {
|
||||
sub->expireTime = time(NULL) + time_out;
|
||||
} else {
|
||||
// infinite time
|
||||
/* infinite time */
|
||||
sub->expireTime = 0;
|
||||
}
|
||||
|
||||
// generate SID
|
||||
/* generate SID */
|
||||
uuid_create(&uid);
|
||||
uuid_unpack(&uid, temp_sid);
|
||||
sprintf(sub->sid, "uuid:%s", temp_sid);
|
||||
|
||||
// respond OK
|
||||
/* respond OK */
|
||||
if (respond_ok(info, time_out, sub, request) != UPNP_E_SUCCESS) {
|
||||
freeSubscriptionList(sub);
|
||||
HandleUnlock();
|
||||
goto exit_function;
|
||||
}
|
||||
// add to subscription list
|
||||
/* add to subscription list */
|
||||
sub->next = service->subscriptionList;
|
||||
service->subscriptionList = sub;
|
||||
service->TotalSubscriptions++;
|
||||
|
||||
// finally generate callback for init table dump
|
||||
/* finally generate callback for init table dump */
|
||||
request_struct.ServiceId = service->serviceId;
|
||||
request_struct.UDN = service->UDN;
|
||||
strcpy((char *)request_struct.Sid, sub->sid);
|
||||
|
||||
// copy callback
|
||||
/* copy callback */
|
||||
callback_fun = handle_info->Callback;
|
||||
cookie = handle_info->Cookie;
|
||||
|
||||
HandleUnlock();
|
||||
|
||||
// make call back with request struct
|
||||
// in the future should find a way of mainting that the handle
|
||||
// is not unregistered in the middle of a callback
|
||||
/* make call back with request struct */
|
||||
/* in the future should find a way of mainting that the handle */
|
||||
/* is not unregistered in the middle of a callback */
|
||||
callback_fun(UPNP_EVENT_SUBSCRIPTION_REQUEST, &request_struct, cookie);
|
||||
|
||||
exit_function:
|
||||
@@ -1383,13 +1362,13 @@ void gena_process_subscription_renewal_request(
|
||||
membuffer event_url_path;
|
||||
memptr timeout_hdr;
|
||||
|
||||
// if a CALLBACK or NT header is present, then it is an error
|
||||
/* if a CALLBACK or NT header is present, then it is an error */
|
||||
if( httpmsg_find_hdr( request, HDR_CALLBACK, NULL ) != NULL ||
|
||||
httpmsg_find_hdr( request, HDR_NT, NULL ) != NULL ) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, request );
|
||||
return;
|
||||
}
|
||||
// get SID
|
||||
/* get SID */
|
||||
if( httpmsg_find_hdr( request, HDR_SID, &temp_hdr ) == NULL ||
|
||||
temp_hdr.length > SID_SIZE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@@ -1398,7 +1377,7 @@ void gena_process_subscription_renewal_request(
|
||||
memcpy( sid, temp_hdr.buf, temp_hdr.length );
|
||||
sid[temp_hdr.length] = '\0';
|
||||
|
||||
// lookup service by eventURL
|
||||
/* lookup service by eventURL */
|
||||
membuffer_init( &event_url_path );
|
||||
if( membuffer_append( &event_url_path, request->uri.pathquery.buff,
|
||||
request->uri.pathquery.size ) != 0 ) {
|
||||
@@ -1408,7 +1387,7 @@ void gena_process_subscription_renewal_request(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// CURRENTLY, ONLY SUPPORT ONE DEVICE
|
||||
/* CURRENTLY, ONLY SUPPORT ONE DEVICE */
|
||||
if( GetDeviceHandleInfo( info->foreign_sockaddr.ss_family,
|
||||
&device_handle, &handle_info ) != HND_DEVICE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@@ -1420,7 +1399,7 @@ void gena_process_subscription_renewal_request(
|
||||
event_url_path.buf );
|
||||
membuffer_destroy( &event_url_path );
|
||||
|
||||
// get subscription
|
||||
/* get subscription */
|
||||
if( service == NULL ||
|
||||
!service->active ||
|
||||
( ( sub = GetSubscriptionSID( sid, service ) ) == NULL ) ) {
|
||||
@@ -1434,7 +1413,7 @@ void gena_process_subscription_renewal_request(
|
||||
"Max Subscriptions allowed:%d\n",
|
||||
service->TotalSubscriptions,
|
||||
handle_info->MaxSubscriptions );
|
||||
// too many subscriptions
|
||||
/* too many subscriptions */
|
||||
if( handle_info->MaxSubscriptions != -1 &&
|
||||
service->TotalSubscriptions > handle_info->MaxSubscriptions ) {
|
||||
error_respond( info, HTTP_INTERNAL_SERVER_ERROR, request );
|
||||
@@ -1442,25 +1421,25 @@ void gena_process_subscription_renewal_request(
|
||||
HandleUnlock();
|
||||
return;
|
||||
}
|
||||
// set the timeout
|
||||
/* set the timeout */
|
||||
if( httpmsg_find_hdr( request, HDR_TIMEOUT, &timeout_hdr ) != NULL ) {
|
||||
if( matchstr( timeout_hdr.buf, timeout_hdr.length,
|
||||
"%iSecond-%d%0", &time_out ) == PARSE_OK ) {
|
||||
|
||||
//nothing
|
||||
/*nothing */
|
||||
|
||||
} else if( memptr_cmp_nocase( &timeout_hdr, "Second-infinite" ) ==
|
||||
0 ) {
|
||||
|
||||
time_out = -1; // inifinite timeout
|
||||
time_out = -1; /* inifinite timeout */
|
||||
|
||||
} else {
|
||||
time_out = DEFAULT_TIMEOUT; // default is > 1800 seconds
|
||||
time_out = DEFAULT_TIMEOUT; /* default is > 1800 seconds */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// replace infinite timeout with max timeout, if possible
|
||||
/* replace infinite timeout with max timeout, if possible */
|
||||
if( handle_info->MaxSubscriptionTimeOut != -1 ) {
|
||||
if( time_out == -1 ||
|
||||
time_out > handle_info->MaxSubscriptionTimeOut ) {
|
||||
@@ -1494,13 +1473,13 @@ void gena_process_unsubscribe_request(
|
||||
memptr temp_hdr;
|
||||
membuffer event_url_path;
|
||||
|
||||
// if a CALLBACK or NT header is present, then it is an error
|
||||
/* if a CALLBACK or NT header is present, then it is an error */
|
||||
if( httpmsg_find_hdr( request, HDR_CALLBACK, NULL ) != NULL ||
|
||||
httpmsg_find_hdr( request, HDR_NT, NULL ) != NULL ) {
|
||||
error_respond( info, HTTP_BAD_REQUEST, request );
|
||||
return;
|
||||
}
|
||||
// get SID
|
||||
/* get SID */
|
||||
if( httpmsg_find_hdr( request, HDR_SID, &temp_hdr ) == NULL ||
|
||||
temp_hdr.length > SID_SIZE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@@ -1509,7 +1488,7 @@ void gena_process_unsubscribe_request(
|
||||
memcpy( sid, temp_hdr.buf, temp_hdr.length );
|
||||
sid[temp_hdr.length] = '\0';
|
||||
|
||||
// lookup service by eventURL
|
||||
/* lookup service by eventURL */
|
||||
membuffer_init( &event_url_path );
|
||||
if( membuffer_append( &event_url_path, request->uri.pathquery.buff,
|
||||
request->uri.pathquery.size ) != 0 ) {
|
||||
@@ -1519,7 +1498,7 @@ void gena_process_unsubscribe_request(
|
||||
|
||||
HandleLock();
|
||||
|
||||
// CURRENTLY, ONLY SUPPORT ONE DEVICE
|
||||
/* CURRENTLY, ONLY SUPPORT ONE DEVICE */
|
||||
if( GetDeviceHandleInfo( info->foreign_sockaddr.ss_family,
|
||||
&device_handle, &handle_info ) != HND_DEVICE ) {
|
||||
error_respond( info, HTTP_PRECONDITION_FAILED, request );
|
||||
@@ -1531,7 +1510,7 @@ void gena_process_unsubscribe_request(
|
||||
event_url_path.buf );
|
||||
membuffer_destroy( &event_url_path );
|
||||
|
||||
// validate service
|
||||
/* validate service */
|
||||
if( service == NULL ||
|
||||
!service->active || GetSubscriptionSID( sid, service ) == NULL )
|
||||
{
|
||||
@@ -1541,7 +1520,7 @@ void gena_process_unsubscribe_request(
|
||||
}
|
||||
|
||||
RemoveSubscriptionSID(sid, service);
|
||||
error_respond(info, HTTP_OK, request); // success
|
||||
error_respond(info, HTTP_OK, request); /* success */
|
||||
|
||||
HandleUnlock();
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
|
||||
|
||||
#include <stdlib.h> // for calloc(), free()
|
||||
#include <stdlib.h> /* for calloc(), free() */
|
||||
|
||||
|
||||
struct SClientSubscription {
|
||||
@@ -113,12 +113,12 @@ ClientSubscription *UpnpClientSubscription_dup(const ClientSubscription *p)
|
||||
void UpnpClientSubscription_assign(ClientSubscription *q, const ClientSubscription *p)
|
||||
{
|
||||
if (q != p) {
|
||||
// Do not copy RenewEventId
|
||||
/* Do not copy RenewEventId */
|
||||
((struct SClientSubscription *)q)->m_renewEventId = -1;
|
||||
UpnpClientSubscription_set_SID(q, UpnpClientSubscription_get_SID(p));
|
||||
UpnpClientSubscription_set_ActualSID(q, UpnpClientSubscription_get_ActualSID(p));
|
||||
UpnpClientSubscription_set_EventURL(q, UpnpClientSubscription_get_EventURL(p));
|
||||
// Do not copy m_next
|
||||
/* Do not copy m_next */
|
||||
((struct SClientSubscription *)q)->m_next = NULL;
|
||||
}
|
||||
}
|
||||
@@ -238,8 +238,8 @@ void free_client_subscription(ClientSubscription *sub)
|
||||
UpnpClientSubscription_strcpy_ActualSID(sub, "");
|
||||
UpnpClientSubscription_strcpy_EventURL(sub, "");
|
||||
if (renewEventId != -1) {
|
||||
// do not remove timer event of copy
|
||||
// invalid timer event id
|
||||
/* do not remove timer event of copy */
|
||||
/* invalid timer event id */
|
||||
if (TimerThreadRemove(&gTimerThread, renewEventId, &tempJob) == 0) {
|
||||
event = (upnp_timeout *)tempJob.arg;
|
||||
free_upnp_timeout(event);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,71 +1,60 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file a function to extract the header information from *
|
||||
* an http message and then matches the data with XML data. *
|
||||
************************************************************************/
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* Purpose: This file a function to extract the header information from
|
||||
* an http message and then matches the data with XML data.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "membuffer.h"
|
||||
#include "httpparser.h"
|
||||
#include "statcodes.h"
|
||||
#include "parsetools.h"
|
||||
|
||||
/************************************************************************
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t* hmsg ; HTTP Message object
|
||||
*
|
||||
* Description: Find the header from the HTTP message and match the
|
||||
* header for xml data.
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
xboolean
|
||||
has_xml_content_type( IN http_message_t * hmsg )
|
||||
int has_xml_content_type(http_message_t *hmsg)
|
||||
{
|
||||
memptr hdr_value;
|
||||
memptr hdr_value;
|
||||
|
||||
assert( hmsg );
|
||||
assert(hmsg);
|
||||
|
||||
// find 'content-type' header which must have text/xml
|
||||
if( httpmsg_find_hdr( hmsg, HDR_CONTENT_TYPE, &hdr_value ) != NULL &&
|
||||
matchstr( hdr_value.buf, hdr_value.length,
|
||||
"%itext%w/%wxml" ) == PARSE_OK ) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
/* find 'content-type' header which must have text/xml */
|
||||
if (httpmsg_find_hdr(hmsg, HDR_CONTENT_TYPE, &hdr_value) &&
|
||||
matchstr(hdr_value.buf, hdr_value.length, "%itext%w/%wxml" ) == PARSE_OK) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file defines status codes, buffers to store the status *
|
||||
@@ -37,7 +37,7 @@
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "statcodes.h"
|
||||
|
||||
#ifdef WIN32
|
||||
@@ -96,7 +96,7 @@ static const char *Http5xxStr =
|
||||
"Service Unavailable\0"
|
||||
"Gateway Timeout\0" "HTTP Version Not Supported\0";
|
||||
|
||||
static xboolean gInitialized = FALSE;
|
||||
static int gInitialized = FALSE;
|
||||
|
||||
/************************************************************************
|
||||
************************* Functions *************************************
|
||||
@@ -128,7 +128,7 @@ init_table( IN const char *encoded_str,
|
||||
|
||||
for( i = 0; i < tbl_size; i++ ) {
|
||||
table[i] = s;
|
||||
s += strlen( s ) + 1; // next entry
|
||||
s += strlen( s ) + 1; /* next entry */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ init_tables( void )
|
||||
init_table( Http4xxStr, Http4xxCodes, NUM_4XX_CODES );
|
||||
init_table( Http5xxStr, Http5xxCodes, NUM_5XX_CODES );
|
||||
|
||||
gInitialized = TRUE; // mark only after complete
|
||||
gInitialized = TRUE; /* mark only after complete */
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -29,304 +29,181 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file implements the sockets functionality
|
||||
************************************************************************/
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief Implements the sockets functionality.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include "sock.h"
|
||||
|
||||
|
||||
#include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */
|
||||
#include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */
|
||||
#include "upnp.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifndef MSG_NOSIGNAL
|
||||
#define MSG_NOSIGNAL 0
|
||||
#define MSG_NOSIGNAL 0
|
||||
#endif
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_init
|
||||
*
|
||||
* Parameters :
|
||||
* OUT SOCKINFO* info ; Socket Information Object
|
||||
* IN SOCKET sockfd ; Socket Descriptor
|
||||
*
|
||||
* Description : Assign the passed in socket descriptor to socket
|
||||
* descriptor in the SOCKINFO structure.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
sock_init( OUT SOCKINFO * info,
|
||||
IN SOCKET sockfd )
|
||||
int sock_init(OUT SOCKINFO *info, IN SOCKET sockfd)
|
||||
{
|
||||
assert( info );
|
||||
assert(info);
|
||||
|
||||
memset( info, 0, sizeof( SOCKINFO ) );
|
||||
memset(info, 0, sizeof(SOCKINFO));
|
||||
info->socket = sockfd;
|
||||
|
||||
info->socket = sockfd;
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_init_with_ip
|
||||
*
|
||||
* Parameters :
|
||||
* OUT SOCKINFO* info ; Socket Information Object
|
||||
* IN SOCKET sockfd ; Socket Descriptor
|
||||
* IN struct sockaddr* foreign_sockaddr; remote socket address.
|
||||
*
|
||||
* Description : Calls the sock_init function and assigns the passed in
|
||||
* IP address and port to the IP address and port in the SOCKINFO
|
||||
* structure.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
sock_init_with_ip( OUT SOCKINFO * info,
|
||||
IN SOCKET sockfd,
|
||||
IN struct sockaddr* foreign_sockaddr )
|
||||
int sock_init_with_ip(OUT SOCKINFO *info, IN SOCKET sockfd,
|
||||
IN struct sockaddr *foreign_sockaddr)
|
||||
{
|
||||
int ret;
|
||||
int ret;
|
||||
|
||||
ret = sock_init( info, sockfd );
|
||||
if( ret != UPNP_E_SUCCESS ) {
|
||||
return ret;
|
||||
}
|
||||
ret = sock_init(info, sockfd);
|
||||
if (ret != UPNP_E_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
memcpy( &info->foreign_sockaddr, foreign_sockaddr,
|
||||
sizeof( info->foreign_sockaddr) );
|
||||
memcpy(&info->foreign_sockaddr, foreign_sockaddr,
|
||||
sizeof(info->foreign_sockaddr));
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_destroy
|
||||
*
|
||||
* Parameters :
|
||||
* INOUT SOCKINFO* info ; Socket Information Object
|
||||
* int ShutdownMethod ; How to shutdown the socket. Used by
|
||||
* sockets's shutdown()
|
||||
*
|
||||
* Description : Shutsdown the socket using the ShutdownMethod to
|
||||
* indicate whether sends and receives on the socket will be
|
||||
* dis-allowed. After shutting down the socket, closesocket is called
|
||||
* to release system resources used by the socket calls.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SOCKET_ERROR on failure
|
||||
* UPNP_E_SUCCESS on success
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
sock_destroy( INOUT SOCKINFO * info,
|
||||
int ShutdownMethod )
|
||||
int sock_destroy(INOUT SOCKINFO *info, int ShutdownMethod)
|
||||
{
|
||||
if( info->socket != INVALID_SOCKET ) {
|
||||
shutdown( info->socket, ShutdownMethod );
|
||||
if( UpnpCloseSocket( info->socket ) == -1 ) {
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
}
|
||||
int ret = UPNP_E_SUCCESS;
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
if (info->socket != -1) {
|
||||
shutdown(info->socket, ShutdownMethod);
|
||||
if (sock_close(info->socket) == -1) {
|
||||
ret = UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
info->socket = -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_read_write
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info ; Socket Information Object
|
||||
* OUT char* buffer ; Buffer to get data to or send data from
|
||||
* IN size_t bufsize ; Size of the buffer
|
||||
* IN int *timeoutSecs ; timeout value
|
||||
* IN xboolean bRead ; Boolean value specifying read or write option
|
||||
*
|
||||
* Description : Receives or sends data. Also returns the time taken
|
||||
* to receive or send data.
|
||||
*
|
||||
* Return :int ;
|
||||
* numBytes - On Success, no of bytes received or sent
|
||||
* UPNP_E_TIMEDOUT - Timeout
|
||||
* UPNP_E_SOCKET_ERROR - Error on socket calls
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
static int
|
||||
sock_read_write( IN SOCKINFO * info,
|
||||
OUT char *buffer,
|
||||
IN size_t bufsize,
|
||||
IN int *timeoutSecs,
|
||||
IN xboolean bRead )
|
||||
/*!
|
||||
* \brief Receives or sends data. Also returns the time taken to receive or
|
||||
* send data.
|
||||
*
|
||||
* \return
|
||||
* \li \c numBytes - On Success, no of bytes received or sent or
|
||||
* \li \c UPNP_E_TIMEDOUT - Timeout
|
||||
* \li \c UPNP_E_SOCKET_ERROR - Error on socket calls
|
||||
*/
|
||||
static int sock_read_write(
|
||||
/*! Socket Information Object. */
|
||||
IN SOCKINFO *info,
|
||||
/*! Buffer to get data to or send data from. */
|
||||
OUT char *buffer,
|
||||
/*! Size of the buffer. */
|
||||
IN int bufsize,
|
||||
/*! timeout value. */
|
||||
IN int *timeoutSecs,
|
||||
/*! Boolean value specifying read or write option. */
|
||||
IN int bRead)
|
||||
{
|
||||
int retCode;
|
||||
fd_set readSet;
|
||||
fd_set writeSet;
|
||||
struct timeval timeout;
|
||||
int numBytes;
|
||||
time_t start_time = time( NULL );
|
||||
SOCKET sockfd = info->socket;
|
||||
long bytes_sent = 0,
|
||||
byte_left = 0,
|
||||
num_written;
|
||||
|
||||
if( *timeoutSecs < 0 ) {
|
||||
return UPNP_E_TIMEDOUT;
|
||||
}
|
||||
|
||||
FD_ZERO( &readSet );
|
||||
FD_ZERO( &writeSet );
|
||||
if( bRead ) {
|
||||
FD_SET( sockfd, &readSet );
|
||||
} else {
|
||||
FD_SET( sockfd, &writeSet );
|
||||
}
|
||||
|
||||
timeout.tv_sec = *timeoutSecs;
|
||||
timeout.tv_usec = 0;
|
||||
|
||||
while( TRUE ) {
|
||||
if( *timeoutSecs == 0 ) {
|
||||
retCode =
|
||||
select( sockfd + 1, &readSet, &writeSet, NULL, NULL );
|
||||
} else {
|
||||
retCode =
|
||||
select( sockfd + 1, &readSet, &writeSet, NULL, &timeout );
|
||||
}
|
||||
|
||||
if( retCode == 0 ) {
|
||||
return UPNP_E_TIMEDOUT;
|
||||
}
|
||||
if( retCode == -1 ) {
|
||||
if( errno == EINTR )
|
||||
continue;
|
||||
return UPNP_E_SOCKET_ERROR; // error
|
||||
} else {
|
||||
break; // read or write
|
||||
}
|
||||
}
|
||||
int retCode;
|
||||
fd_set readSet;
|
||||
fd_set writeSet;
|
||||
struct timeval timeout;
|
||||
long numBytes;
|
||||
time_t start_time = time(NULL);
|
||||
SOCKET sockfd = info->socket;
|
||||
long bytes_sent = 0;
|
||||
long byte_left = 0;
|
||||
long num_written;
|
||||
|
||||
if (*timeoutSecs < 0)
|
||||
return UPNP_E_TIMEDOUT;
|
||||
FD_ZERO(&readSet);
|
||||
FD_ZERO(&writeSet);
|
||||
if (bRead)
|
||||
FD_SET(sockfd, &readSet);
|
||||
else
|
||||
FD_SET(sockfd, &writeSet);
|
||||
timeout.tv_sec = *timeoutSecs;
|
||||
timeout.tv_usec = 0;
|
||||
while (TRUE) {
|
||||
if (*timeoutSecs == 0)
|
||||
retCode = select(sockfd + 1, &readSet, &writeSet,
|
||||
NULL, NULL);
|
||||
else
|
||||
retCode = select(sockfd + 1, &readSet, &writeSet,
|
||||
NULL, &timeout);
|
||||
if (retCode == 0)
|
||||
return UPNP_E_TIMEDOUT;
|
||||
if (retCode == -1) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
} else
|
||||
/* read or write. */
|
||||
break;
|
||||
}
|
||||
#ifdef SO_NOSIGPIPE
|
||||
{
|
||||
int old;
|
||||
int set = 1;
|
||||
socklen_t olen = sizeof(old);
|
||||
getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen);
|
||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set));
|
||||
{
|
||||
int old;
|
||||
int set = 1;
|
||||
socklen_t olen = sizeof(old);
|
||||
getsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, &olen);
|
||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &set, sizeof(set));
|
||||
#endif
|
||||
|
||||
if( bRead ) {
|
||||
// read data
|
||||
numBytes = recv( sockfd, buffer, bufsize,MSG_NOSIGNAL);
|
||||
} else {
|
||||
byte_left = bufsize;
|
||||
bytes_sent = 0;
|
||||
while( byte_left > 0 ) {
|
||||
// write data
|
||||
num_written =
|
||||
send( sockfd, buffer + bytes_sent, byte_left,
|
||||
MSG_DONTROUTE|MSG_NOSIGNAL);
|
||||
if( num_written == -1 ) {
|
||||
if (bRead) {
|
||||
/* read data. */
|
||||
numBytes = (long)recv(sockfd, buffer, (size_t)bufsize, MSG_NOSIGNAL);
|
||||
} else {
|
||||
byte_left = bufsize;
|
||||
bytes_sent = 0;
|
||||
while (byte_left > 0) {
|
||||
/* write data. */
|
||||
num_written = send(sockfd,
|
||||
buffer + bytes_sent, (size_t)byte_left,
|
||||
MSG_DONTROUTE | MSG_NOSIGNAL);
|
||||
if (num_written == -1) {
|
||||
#ifdef SO_NOSIGPIPE
|
||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
||||
setsockopt(sockfd, SOL_SOCKET,
|
||||
SO_NOSIGPIPE, &old, olen);
|
||||
#endif
|
||||
return num_written;
|
||||
}
|
||||
|
||||
byte_left = byte_left - num_written;
|
||||
bytes_sent += num_written;
|
||||
}
|
||||
|
||||
numBytes = bytes_sent;
|
||||
}
|
||||
|
||||
return (int)num_written;
|
||||
}
|
||||
byte_left = byte_left - num_written;
|
||||
bytes_sent += num_written;
|
||||
}
|
||||
numBytes = bytes_sent;
|
||||
}
|
||||
#ifdef SO_NOSIGPIPE
|
||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
||||
}
|
||||
setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &old, olen);
|
||||
}
|
||||
#endif
|
||||
if (numBytes < 0)
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
/* subtract time used for reading/writing. */
|
||||
if (*timeoutSecs != 0)
|
||||
*timeoutSecs -= (int)(time(NULL) - start_time);
|
||||
|
||||
if( numBytes < 0 ) {
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
// subtract time used for reading/writing
|
||||
if( *timeoutSecs != 0 ) {
|
||||
*timeoutSecs -= time( NULL ) - start_time;
|
||||
}
|
||||
|
||||
return numBytes;
|
||||
return (int)numBytes;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_read
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info ; Socket Information Object
|
||||
* OUT char* buffer ; Buffer to get data to
|
||||
* IN size_t bufsize ; Size of the buffer
|
||||
* IN int *timeoutSecs ; timeout value
|
||||
*
|
||||
* Description : Calls sock_read_write() for reading data on the
|
||||
* socket
|
||||
*
|
||||
* Return : int;
|
||||
* Values returned by sock_read_write()
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
sock_read( IN SOCKINFO * info,
|
||||
OUT char *buffer,
|
||||
IN size_t bufsize,
|
||||
INOUT int *timeoutSecs )
|
||||
int sock_read(IN SOCKINFO *info, OUT char *buffer, IN int bufsize,
|
||||
INOUT int *timeoutSecs)
|
||||
{
|
||||
return sock_read_write( info, buffer, bufsize, timeoutSecs, TRUE );
|
||||
return sock_read_write(info, buffer, bufsize, timeoutSecs, TRUE);
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_write
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info ; Socket Information Object
|
||||
* IN char* buffer ; Buffer to send data from
|
||||
* IN size_t bufsize ; Size of the buffer
|
||||
* IN int *timeoutSecs ; timeout value
|
||||
*
|
||||
* Description : Calls sock_read_write() for writing data on the
|
||||
* socket
|
||||
*
|
||||
* Return : int;
|
||||
* sock_read_write()
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
sock_write( IN SOCKINFO * info,
|
||||
IN char *buffer,
|
||||
IN size_t bufsize,
|
||||
INOUT int *timeoutSecs )
|
||||
int sock_write(IN SOCKINFO *info, IN const char *buffer, IN int bufsize,
|
||||
INOUT int *timeoutSecs)
|
||||
{
|
||||
return sock_read_write( info, buffer, bufsize, timeoutSecs, FALSE );
|
||||
return sock_read_write(info, (char *)buffer, bufsize, timeoutSecs, FALSE);
|
||||
}
|
||||
|
||||
|
||||
@@ -128,13 +128,12 @@ int is_escaped(
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int replace_escaped(char *in, int index, size_t *max)
|
||||
int replace_escaped(char *in, size_t index, size_t *max)
|
||||
{
|
||||
int tempInt = 0;
|
||||
char tempChar = 0;
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
|
||||
if (in[index] == '%' && isxdigit(in[index + 1]) && isxdigit(in[index + 2])) {
|
||||
/* Note the "%2x", makes sure that we convert a maximum of two
|
||||
@@ -142,8 +141,7 @@ int replace_escaped(char *in, int index, size_t *max)
|
||||
if (sscanf(&in[index + 1], "%2x", &tempInt) != 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
tempChar = ( char )tempInt;
|
||||
tempChar = (char)tempInt;
|
||||
for (i = index + 3, j = index; j < *max; i++, j++) {
|
||||
in[j] = tempChar;
|
||||
if (i < *max) {
|
||||
@@ -166,15 +164,15 @@ int replace_escaped(char *in, int index, size_t *max)
|
||||
*
|
||||
* \return
|
||||
*/
|
||||
static int parse_uric(
|
||||
static size_t parse_uric(
|
||||
/*! [in] String of characters. */
|
||||
const char *in,
|
||||
/*! [in] Maximum limit. */
|
||||
int max,
|
||||
size_t max,
|
||||
/*! [out] Token object where the string of characters is copied. */
|
||||
token *out)
|
||||
{
|
||||
int i = 0;
|
||||
size_t i = 0;
|
||||
|
||||
while (i < max &&
|
||||
(is_unreserved(in[i]) ||
|
||||
@@ -211,28 +209,24 @@ static void copy_token(
|
||||
|
||||
int copy_URL_list(URL_list *in, URL_list *out)
|
||||
{
|
||||
int len = strlen( in->URLs ) + 1;
|
||||
int i = 0;
|
||||
size_t len = strlen(in->URLs) + 1;
|
||||
size_t i = 0;
|
||||
|
||||
out->URLs = NULL;
|
||||
out->parsedURLs = NULL;
|
||||
out->size = 0;
|
||||
|
||||
out->URLs = ( char * )malloc( len );
|
||||
out->parsedURLs =
|
||||
( uri_type * ) malloc( sizeof( uri_type ) * in->size );
|
||||
out->URLs = malloc(len);
|
||||
out->parsedURLs = malloc(sizeof(uri_type) * in->size);
|
||||
|
||||
if( ( out->URLs == NULL ) || ( out->parsedURLs == NULL ) )
|
||||
if ( !out->URLs || !out->parsedURLs)
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
|
||||
memcpy( out->URLs, in->URLs, len );
|
||||
|
||||
memcpy(out->URLs, in->URLs, len);
|
||||
for( i = 0; i < in->size; i++ ) {
|
||||
//copy the parsed uri
|
||||
/*copy the parsed uri */
|
||||
out->parsedURLs[i].type = in->parsedURLs[i].type;
|
||||
copy_token( &in->parsedURLs[i].scheme, in->URLs,
|
||||
&out->parsedURLs[i].scheme, out->URLs );
|
||||
|
||||
out->parsedURLs[i].path_type = in->parsedURLs[i].path_type;
|
||||
copy_token( &in->parsedURLs[i].pathquery, in->URLs,
|
||||
&out->parsedURLs[i].pathquery, out->URLs );
|
||||
@@ -241,7 +235,6 @@ int copy_URL_list(URL_list *in, URL_list *out)
|
||||
copy_token( &in->parsedURLs[i].hostport.text,
|
||||
in->URLs, &out->parsedURLs[i].hostport.text,
|
||||
out->URLs );
|
||||
|
||||
memcpy( &out->parsedURLs[i].hostport.IPaddress,
|
||||
&in->parsedURLs[i].hostport.IPaddress,
|
||||
sizeof(struct sockaddr_storage) );
|
||||
@@ -278,196 +271,170 @@ void print_uri(uri_type *in)
|
||||
#ifdef DEBUG
|
||||
void print_token(token * in)
|
||||
{
|
||||
int i = 0;
|
||||
printf( "Token Size : %"PRIzu"\n\'", in->size );
|
||||
for( i = 0; i < in->size; i++ ) {
|
||||
putchar( in->buff[i] );
|
||||
}
|
||||
putchar( '\'' );
|
||||
putchar( '\n' );
|
||||
size_t i = 0;
|
||||
|
||||
printf("Token Size : %" PRIzu "\n\'", in->size);
|
||||
for (i = 0; i < in->size; i++)
|
||||
putchar(in->buff[i]);
|
||||
putchar('\'');
|
||||
putchar('\n');
|
||||
}
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
int token_string_casecmp(token *in1, char *in2)
|
||||
int token_string_casecmp(token *in1, const char *in2)
|
||||
{
|
||||
int in2_length = strlen(in2);
|
||||
|
||||
if (in1->size != in2_length) {
|
||||
size_t in2_length = strlen(in2);
|
||||
if (in1->size != in2_length)
|
||||
return 1;
|
||||
} else {
|
||||
else
|
||||
return strncasecmp(in1->buff, in2, in1->size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int token_string_cmp(token * in1, char *in2)
|
||||
{
|
||||
int in2_length = strlen(in2);
|
||||
|
||||
if (in1->size != in2_length) {
|
||||
size_t in2_length = strlen(in2);
|
||||
if (in1->size != in2_length)
|
||||
return 1;
|
||||
} else {
|
||||
else
|
||||
return strncmp(in1->buff, in2, in1->size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int token_cmp(token *in1, token *in2)
|
||||
{
|
||||
if (in1->size != in2->size) {
|
||||
if (in1->size != in2->size)
|
||||
return 1;
|
||||
} else {
|
||||
else
|
||||
return memcmp(in1->buff, in2->buff, in1->size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int parse_hostport(
|
||||
const char *in,
|
||||
int max,
|
||||
size_t max,
|
||||
hostport_type *out)
|
||||
{
|
||||
char workbuf[256];
|
||||
char* c;
|
||||
struct sockaddr_in* sai4 = (struct sockaddr_in*)&out->IPaddress;
|
||||
struct sockaddr_in6* sai6 = (struct sockaddr_in6*)&out->IPaddress;
|
||||
char *srvname = NULL;
|
||||
char *srvport = NULL;
|
||||
char *last_dot = NULL;
|
||||
unsigned short int port;
|
||||
int af = AF_UNSPEC;
|
||||
int hostport_size;
|
||||
int has_port = 0;
|
||||
int ret;
|
||||
char workbuf[256];
|
||||
char *c;
|
||||
struct sockaddr_in *sai4 = (struct sockaddr_in *)&out->IPaddress;
|
||||
struct sockaddr_in6 *sai6 = (struct sockaddr_in6 *)&out->IPaddress;
|
||||
char *srvname = NULL;
|
||||
char *srvport = NULL;
|
||||
char *last_dot = NULL;
|
||||
unsigned short int port;
|
||||
int af = AF_UNSPEC;
|
||||
size_t hostport_size;
|
||||
int has_port = 0;
|
||||
int ret;
|
||||
|
||||
memset( out, 0, sizeof(hostport_type) );
|
||||
memset(out, 0, sizeof(hostport_type));
|
||||
/* Work on a copy of the input string. */
|
||||
strncpy(workbuf, in, sizeof(workbuf));
|
||||
c = workbuf;
|
||||
if (*c == '[') {
|
||||
/* IPv6 addresses are enclosed in square brackets. */
|
||||
srvname = ++c;
|
||||
while (*c != '\0' && *c != ']')
|
||||
c++;
|
||||
if (*c == '\0')
|
||||
/* did not find closing bracket. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
/* NULL terminate the srvname and then increment c. */
|
||||
*c++ = '\0'; /* overwrite the ']' */
|
||||
if (*c == ':') {
|
||||
has_port = 1;
|
||||
c++;
|
||||
}
|
||||
af = AF_INET6;
|
||||
} else {
|
||||
/* IPv4 address -OR- host name. */
|
||||
srvname = c;
|
||||
while (*c != ':' && *c != '/' &&
|
||||
(isalnum(*c) || *c == '.' || *c == '-')) {
|
||||
if (*c == '.')
|
||||
last_dot = c;
|
||||
c++;
|
||||
}
|
||||
has_port = (*c == ':') ? 1 : 0;
|
||||
/* NULL terminate the srvname */
|
||||
*c = '\0';
|
||||
if (has_port == 1)
|
||||
c++;
|
||||
if (last_dot != NULL && isdigit(*(last_dot + 1)))
|
||||
/* Must be an IPv4 address. */
|
||||
af = AF_INET;
|
||||
else {
|
||||
/* Must be a host name. */
|
||||
struct addrinfo hints, *res, *res0;
|
||||
|
||||
// Work on a copy of the input string.
|
||||
strncpy( workbuf, in, sizeof(workbuf) );
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
|
||||
c = workbuf;
|
||||
if( *c == '[' ) {
|
||||
// IPv6 addresses are enclosed in square brackets.
|
||||
srvname = ++c;
|
||||
while( *c != '\0' && *c != ']' ) {
|
||||
c++;
|
||||
}
|
||||
if( *c == '\0' ) {
|
||||
// did not find closing bracket.
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
// NULL terminate the srvname and then increment c.
|
||||
*c++ = '\0'; // overwrite the ']'
|
||||
if( *c == ':' ) {
|
||||
has_port = 1;
|
||||
c++;
|
||||
}
|
||||
af = AF_INET6;
|
||||
}
|
||||
else {
|
||||
// IPv4 address -OR- host name.
|
||||
srvname = c;
|
||||
while( (*c != ':') && (*c != '/') && ( (isalnum(*c)) || (*c == '.') || (*c == '-') ) ) {
|
||||
if( *c == '.' )
|
||||
last_dot = c;
|
||||
c++;
|
||||
}
|
||||
has_port = (*c == ':') ? 1 : 0;
|
||||
// NULL terminate the srvname
|
||||
*c = '\0';
|
||||
if( has_port == 1 )
|
||||
c++;
|
||||
ret = getaddrinfo(srvname, NULL, &hints, &res0);
|
||||
if (ret == 0) {
|
||||
for (res = res0; res; res = res->ai_next) {
|
||||
if (res->ai_family == AF_INET ||
|
||||
res->ai_family == AF_INET6) {
|
||||
/* Found a valid IPv4 or IPv6 address. */
|
||||
memcpy(&out->IPaddress,
|
||||
res->ai_addr,
|
||||
res->ai_addrlen);
|
||||
break;
|
||||
}
|
||||
}
|
||||
freeaddrinfo(res0);
|
||||
if (res == NULL)
|
||||
/* Didn't find an AF_INET or AF_INET6 address. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
} else
|
||||
/* getaddrinfo failed. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
}
|
||||
/* Check if a port is specified. */
|
||||
if (has_port == 1) {
|
||||
/* Port is specified. */
|
||||
srvport = c;
|
||||
while (*c != '\0' && isdigit(*c))
|
||||
c++;
|
||||
port = (unsigned short int)atoi(srvport);
|
||||
if (port == 0)
|
||||
/* Bad port number. */
|
||||
return UPNP_E_INVALID_URL;
|
||||
} else
|
||||
/* Port was not specified, use default port. */
|
||||
port = 80;
|
||||
/* The length of the host and port string can be calculated by */
|
||||
/* subtracting pointers. */
|
||||
hostport_size = (size_t)(c - workbuf);
|
||||
/* Fill in the 'out' information. */
|
||||
if (af == AF_INET) {
|
||||
sai4->sin_family = AF_INET;
|
||||
sai4->sin_port = htons(port);
|
||||
ret = inet_pton(AF_INET, srvname, &sai4->sin_addr);
|
||||
} else if (af == AF_INET6) {
|
||||
sai6->sin6_family = AF_INET6;
|
||||
sai6->sin6_port = htons(port);
|
||||
sai6->sin6_scope_id = gIF_INDEX;
|
||||
ret = inet_pton(AF_INET6, srvname, &sai6->sin6_addr);
|
||||
} else {
|
||||
/* IP address was set by the hostname (getaddrinfo). */
|
||||
/* Override port: */
|
||||
if (out->IPaddress.ss_family == AF_INET)
|
||||
sai4->sin_port = htons(port);
|
||||
else
|
||||
sai6->sin6_port = htons(port);
|
||||
ret = 1;
|
||||
}
|
||||
/* Check if address was converted successfully. */
|
||||
if (ret <= 0)
|
||||
return UPNP_E_INVALID_URL;
|
||||
out->text.size = hostport_size;
|
||||
out->text.buff = in;
|
||||
|
||||
if( last_dot != NULL && isdigit(*(last_dot+1)) ) {
|
||||
// Must be an IPv4 address.
|
||||
af = AF_INET;
|
||||
}
|
||||
else {
|
||||
// Must be a host name.
|
||||
struct addrinfo hints, *res, *res0;
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
|
||||
ret = getaddrinfo(srvname, NULL, &hints, &res0);
|
||||
if( ret == 0 ) {
|
||||
for (res = res0; res; res = res->ai_next) {
|
||||
if( res->ai_family == AF_INET ||
|
||||
res->ai_family == AF_INET6 ) {
|
||||
// Found a valid IPv4 or IPv6 address.
|
||||
memcpy( &out->IPaddress, res->ai_addr,
|
||||
res->ai_addrlen );
|
||||
break;
|
||||
}
|
||||
}
|
||||
freeaddrinfo(res0);
|
||||
|
||||
if( res == NULL ) {
|
||||
// Didn't find an AF_INET or AF_INET6 address.
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// getaddrinfo failed.
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if a port is specified.
|
||||
if( has_port == 1 ) {
|
||||
// Port is specified.
|
||||
srvport = c;
|
||||
while( *c != '\0' && isdigit(*c) ) {
|
||||
c++;
|
||||
}
|
||||
port = (unsigned short int)atoi(srvport);
|
||||
if( port == 0 ) {
|
||||
// Bad port number.
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Port was not specified, use default port.
|
||||
port = 80;
|
||||
}
|
||||
|
||||
// The length of the host and port string can be calculated by
|
||||
// subtracting pointers.
|
||||
hostport_size = (int)(c - workbuf);
|
||||
|
||||
// Fill in the 'out' information.
|
||||
if( af == AF_INET ) {
|
||||
sai4->sin_family = AF_INET;
|
||||
sai4->sin_port = htons(port);
|
||||
ret = inet_pton(AF_INET, srvname, &sai4->sin_addr);
|
||||
}
|
||||
else if( af == AF_INET6 ) {
|
||||
sai6->sin6_family = AF_INET6;
|
||||
sai6->sin6_port = htons(port);
|
||||
sai6->sin6_scope_id = gIF_INDEX;
|
||||
ret = inet_pton(AF_INET6, srvname, &sai6->sin6_addr);
|
||||
} else {
|
||||
// IP address was set by the hostname (getaddrinfo).
|
||||
// Override port:
|
||||
if( out->IPaddress.ss_family == AF_INET )
|
||||
sai4->sin_port = htons(port);
|
||||
else
|
||||
sai6->sin6_port = htons(port);
|
||||
ret = 1;
|
||||
}
|
||||
|
||||
/* Check if address was converted successfully. */
|
||||
if (ret <= 0) {
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
|
||||
out->text.size = hostport_size;
|
||||
out->text.buff = in;
|
||||
|
||||
return hostport_size;
|
||||
return (int)hostport_size;
|
||||
max = max;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -480,29 +447,27 @@ int parse_hostport(
|
||||
*
|
||||
* \return
|
||||
*/
|
||||
static int parse_scheme(
|
||||
static size_t parse_scheme(
|
||||
/*! [in] String of characters representing a scheme. */
|
||||
const char *in,
|
||||
/*! [in] Maximum number of characters. */
|
||||
int max,
|
||||
size_t max,
|
||||
/*! [out] Output parameter whose buffer is filled in with the scheme. */
|
||||
token *out)
|
||||
{
|
||||
int i = 0;
|
||||
size_t i = 0;
|
||||
|
||||
out->size = 0;
|
||||
out->buff = NULL;
|
||||
|
||||
if( ( max == 0 ) || ( !isalpha( in[0] ) ) )
|
||||
return FALSE;
|
||||
return 0;
|
||||
|
||||
i++;
|
||||
while( ( i < max ) && ( in[i] != ':' ) ) {
|
||||
|
||||
if( !( isalnum( in[i] ) || ( in[i] == '+' ) || ( in[i] == '-' )
|
||||
|| ( in[i] == '.' ) ) )
|
||||
return FALSE;
|
||||
|
||||
return 0;
|
||||
i++;
|
||||
}
|
||||
if( i < max ) {
|
||||
@@ -511,19 +476,19 @@ static int parse_scheme(
|
||||
return i;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int remove_escaped_chars(INOUT char *in, INOUT size_t *size )
|
||||
int remove_escaped_chars(INOUT char *in, INOUT size_t *size)
|
||||
{
|
||||
int i = 0;
|
||||
size_t i = 0;
|
||||
|
||||
for( i = 0; i < *size; i++ ) {
|
||||
replace_escaped( in, i, size );
|
||||
}
|
||||
return UPNP_E_SUCCESS;
|
||||
for (i = 0; i < *size; i++) {
|
||||
replace_escaped(in, i, size);
|
||||
}
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -562,7 +527,7 @@ int remove_dots(char *in, size_t size)
|
||||
copyTo = Segments[--lastSegment];
|
||||
} else {
|
||||
free( Segments );
|
||||
//TRACE("ERROR RESOLVING URL, ../ at ROOT");
|
||||
/*TRACE("ERROR RESOLVING URL, ../ at ROOT"); */
|
||||
return UPNP_E_INVALID_URL;
|
||||
}
|
||||
continue;
|
||||
@@ -599,7 +564,7 @@ char *resolve_rel_url(char *base_url, char *rel_url)
|
||||
uri_type rel;
|
||||
char temp_path = '/';
|
||||
|
||||
int i = 0;
|
||||
size_t i = 0;
|
||||
char *finger = NULL;
|
||||
|
||||
char *last_slash = NULL;
|
||||
@@ -665,7 +630,6 @@ char *resolve_rel_url(char *base_url, char *rel_url)
|
||||
finger = out_finger;
|
||||
last_slash = finger;
|
||||
i = 0;
|
||||
|
||||
while( ( i < base.pathquery.size ) &&
|
||||
( base.pathquery.buff[i] != '?' ) ) {
|
||||
( *finger ) = base.pathquery.buff[i];
|
||||
@@ -675,7 +639,6 @@ char *resolve_rel_url(char *base_url, char *rel_url)
|
||||
finger++;
|
||||
|
||||
}
|
||||
i = 0;
|
||||
strcpy( last_slash, rel_url );
|
||||
if( remove_dots( out_finger,
|
||||
strlen( out_finger ) ) !=
|
||||
@@ -705,58 +668,55 @@ char *resolve_rel_url(char *base_url, char *rel_url)
|
||||
}
|
||||
|
||||
|
||||
int parse_uri(const char *in, int max, uri_type *out)
|
||||
int parse_uri(const char *in, size_t max, uri_type *out)
|
||||
{
|
||||
int begin_path = 0;
|
||||
int begin_hostport = 0;
|
||||
int begin_fragment = 0;
|
||||
int begin_path = 0;
|
||||
size_t begin_hostport = 0;
|
||||
size_t begin_fragment = 0;
|
||||
|
||||
if( ( begin_hostport = parse_scheme( in, max, &out->scheme ) ) ) {
|
||||
out->type = ABSOLUTE;
|
||||
out->path_type = OPAQUE_PART;
|
||||
begin_hostport++;
|
||||
} else {
|
||||
out->type = RELATIVE;
|
||||
out->path_type = REL_PATH;
|
||||
}
|
||||
begin_hostport = parse_scheme(in, max, &out->scheme);
|
||||
if (begin_hostport) {
|
||||
out->type = ABSOLUTE;
|
||||
out->path_type = OPAQUE_PART;
|
||||
begin_hostport++;
|
||||
} else {
|
||||
out->type = RELATIVE;
|
||||
out->path_type = REL_PATH;
|
||||
}
|
||||
if (begin_hostport + 1 < max &&
|
||||
in[begin_hostport] == '/' &&
|
||||
in[begin_hostport + 1] == '/') {
|
||||
begin_hostport += 2;
|
||||
begin_path = parse_hostport(&in[begin_hostport],
|
||||
max - begin_hostport,
|
||||
&out->hostport);
|
||||
if (begin_path >= 0) {
|
||||
begin_path += (int)begin_hostport;
|
||||
} else
|
||||
return begin_path;
|
||||
} else {
|
||||
memset(&out->hostport, 0, sizeof(out->hostport));
|
||||
begin_path = (int)begin_hostport;
|
||||
}
|
||||
begin_fragment = parse_uric(&in[begin_path],
|
||||
max - (size_t)begin_path,
|
||||
&out->pathquery) + (size_t)begin_path;
|
||||
if (out->pathquery.size && out->pathquery.buff[0] == '/') {
|
||||
out->path_type = ABS_PATH;
|
||||
}
|
||||
if (begin_fragment < max && in[begin_fragment] == '#') {
|
||||
begin_fragment++;
|
||||
parse_uric(&in[begin_fragment], max - begin_fragment,
|
||||
&out->fragment);
|
||||
} else {
|
||||
out->fragment.buff = NULL;
|
||||
out->fragment.size = 0;
|
||||
}
|
||||
|
||||
if( ( ( begin_hostport + 1 ) < max ) && ( in[begin_hostport] == '/' )
|
||||
&& ( in[begin_hostport + 1] == '/' ) ) {
|
||||
begin_hostport += 2;
|
||||
|
||||
if( ( begin_path = parse_hostport( &in[begin_hostport],
|
||||
max - begin_hostport,
|
||||
&out->hostport ) ) >= 0 ) {
|
||||
begin_path += begin_hostport;
|
||||
} else
|
||||
return begin_path;
|
||||
|
||||
} else {
|
||||
memset( &out->hostport, 0, sizeof(out->hostport) );
|
||||
begin_path = begin_hostport;
|
||||
}
|
||||
|
||||
begin_fragment =
|
||||
parse_uric( &in[begin_path], max - begin_path,
|
||||
&out->pathquery ) + begin_path;
|
||||
|
||||
if( ( out->pathquery.size ) && ( out->pathquery.buff[0] == '/' ) ) {
|
||||
out->path_type = ABS_PATH;
|
||||
}
|
||||
|
||||
if( ( begin_fragment < max ) && ( in[begin_fragment] == '#' ) ) {
|
||||
begin_fragment++;
|
||||
parse_uric( &in[begin_fragment], max - begin_fragment,
|
||||
&out->fragment );
|
||||
} else {
|
||||
out->fragment.buff = NULL;
|
||||
out->fragment.size = 0;
|
||||
}
|
||||
return HTTP_SUCCESS;
|
||||
return HTTP_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int parse_uri_and_unescape(char *in, int max, uri_type *out)
|
||||
int parse_uri_and_unescape(char *in, size_t max, uri_type *out)
|
||||
{
|
||||
int ret = parse_uri(in, max, out);
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
* Description : Makes a copy of the subscription
|
||||
*
|
||||
* Return : int ;
|
||||
* HTTP_SUCCESS - On Sucess
|
||||
* HTTP_SUCCESS - On success
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
@@ -135,7 +135,7 @@ subscription *GetSubscriptionSID(const Upnp_SID sid, service_info *service)
|
||||
}
|
||||
}
|
||||
if( found ) {
|
||||
//get the current_time
|
||||
/*get the current_time */
|
||||
time( ¤t_time );
|
||||
if( ( found->expireTime != 0 )
|
||||
&& ( found->expireTime < current_time ) ) {
|
||||
@@ -153,31 +153,15 @@ subscription *GetSubscriptionSID(const Upnp_SID sid, service_info *service)
|
||||
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : GetNextSubscription
|
||||
*
|
||||
* Parameters :
|
||||
* service_info * service ; service object providing the list of
|
||||
* subscriptions
|
||||
* subscription *current ; current subscription object
|
||||
*
|
||||
* Description : Get current and valid subscription from the service
|
||||
* table.
|
||||
*
|
||||
* Return : subscription * - Pointer to the next subscription node;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
subscription *
|
||||
GetNextSubscription( service_info * service,
|
||||
subscription * current )
|
||||
|
||||
subscription *GetNextSubscription(service_info *service, subscription *current)
|
||||
{
|
||||
time_t current_time;
|
||||
subscription *next = NULL;
|
||||
subscription *previous = NULL;
|
||||
int notDone = 1;
|
||||
|
||||
//get the current_time
|
||||
/* get the current_time */
|
||||
time( ¤t_time );
|
||||
while( ( notDone ) && ( current ) ) {
|
||||
previous = current;
|
||||
@@ -202,52 +186,26 @@ GetNextSubscription( service_info * service,
|
||||
return next;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : GetFirstSubscription
|
||||
*
|
||||
* Parameters :
|
||||
* service_info *service ; service object providing the list of
|
||||
* subscriptions
|
||||
*
|
||||
* Description : Gets pointer to the first subscription node in the
|
||||
* service table.
|
||||
*
|
||||
* Return : subscription * - pointer to the first subscription node ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
subscription *
|
||||
GetFirstSubscription( service_info * service )
|
||||
{
|
||||
subscription temp;
|
||||
subscription *next = NULL;
|
||||
|
||||
temp.next = service->subscriptionList;
|
||||
next = GetNextSubscription( service, &temp );
|
||||
service->subscriptionList = temp.next;
|
||||
// service->subscriptionList=next;
|
||||
return next;
|
||||
subscription *GetFirstSubscription(service_info *service)
|
||||
{
|
||||
subscription temp;
|
||||
subscription *next = NULL;
|
||||
|
||||
temp.next = service->subscriptionList;
|
||||
next = GetNextSubscription(service, &temp);
|
||||
service->subscriptionList = temp.next;
|
||||
/* service->subscriptionList = next; */
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : freeSubscription
|
||||
*
|
||||
* Parameters :
|
||||
* subscription * sub ; subscription to be freed
|
||||
*
|
||||
* Description : Free's the memory allocated for storing the URL of
|
||||
* the subscription.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
freeSubscription( subscription * sub )
|
||||
|
||||
void freeSubscription(subscription *sub)
|
||||
{
|
||||
if( sub ) {
|
||||
free_URL_list( &sub->DeliveryURLs );
|
||||
}
|
||||
if (sub) {
|
||||
free_URL_list(&sub->DeliveryURLs);
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -760,162 +718,119 @@ getSubElement( const char *element_name,
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
service_info *
|
||||
getServiceList( IXML_Node * node,
|
||||
service_info ** end,
|
||||
char *URLBase )
|
||||
service_info *getServiceList(
|
||||
IXML_Node *node,
|
||||
service_info **end,
|
||||
char *URLBase)
|
||||
{
|
||||
IXML_Node *serviceList = NULL;
|
||||
IXML_Node *current_service = NULL;
|
||||
IXML_Node *UDN = NULL;
|
||||
IXML_Node *serviceList = NULL;
|
||||
IXML_Node *current_service = NULL;
|
||||
IXML_Node *UDN = NULL;
|
||||
|
||||
IXML_Node *serviceType = NULL;
|
||||
IXML_Node *serviceId = NULL;
|
||||
IXML_Node *SCPDURL = NULL;
|
||||
IXML_Node *controlURL = NULL;
|
||||
IXML_Node *eventURL = NULL;
|
||||
DOMString tempDOMString = NULL;
|
||||
service_info *head = NULL;
|
||||
service_info *current = NULL;
|
||||
service_info *previous = NULL;
|
||||
IXML_NodeList *serviceNodeList = NULL;
|
||||
int NumOfServices = 0;
|
||||
int i = 0;
|
||||
int fail = 0;
|
||||
|
||||
if( getSubElement( "UDN", node, &UDN ) &&
|
||||
getSubElement( "serviceList", node, &serviceList ) ) {
|
||||
|
||||
serviceNodeList = ixmlElement_getElementsByTagName( ( IXML_Element
|
||||
* )
|
||||
serviceList,
|
||||
"service" );
|
||||
|
||||
if( serviceNodeList != NULL ) {
|
||||
NumOfServices = ixmlNodeList_length( serviceNodeList );
|
||||
for( i = 0; i < NumOfServices; i++ ) {
|
||||
current_service = ixmlNodeList_item( serviceNodeList, i );
|
||||
fail = 0;
|
||||
|
||||
if( current ) {
|
||||
current->next =
|
||||
( service_info * )
|
||||
malloc( sizeof( service_info ) );
|
||||
|
||||
previous = current;
|
||||
current = current->next;
|
||||
} else {
|
||||
head =
|
||||
( service_info * )
|
||||
malloc( sizeof( service_info ) );
|
||||
current = head;
|
||||
}
|
||||
|
||||
if( !current ) {
|
||||
freeServiceList( head );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
current->next = NULL;
|
||||
current->controlURL = NULL;
|
||||
current->eventURL = NULL;
|
||||
current->serviceType = NULL;
|
||||
current->serviceId = NULL;
|
||||
current->SCPDURL = NULL;
|
||||
current->active = 1;
|
||||
current->subscriptionList = NULL;
|
||||
current->TotalSubscriptions = 0;
|
||||
|
||||
if( !( current->UDN = getElementValue( UDN ) ) )
|
||||
fail = 1;
|
||||
|
||||
if( ( !getSubElement( "serviceType", current_service,
|
||||
&serviceType ) ) ||
|
||||
( !( current->serviceType =
|
||||
getElementValue( serviceType ) ) ) )
|
||||
fail = 1;
|
||||
|
||||
if( ( !getSubElement( "serviceId", current_service,
|
||||
&serviceId ) ) ||
|
||||
( !
|
||||
( current->serviceId =
|
||||
getElementValue( serviceId ) ) ) )
|
||||
fail = 1;
|
||||
|
||||
if( ( !
|
||||
( getSubElement
|
||||
( "SCPDURL", current_service, &SCPDURL ) ) )
|
||||
|| ( !( tempDOMString = getElementValue( SCPDURL ) ) )
|
||||
||
|
||||
( !
|
||||
( current->SCPDURL =
|
||||
resolve_rel_url( URLBase, tempDOMString ) ) ) )
|
||||
fail = 1;
|
||||
|
||||
ixmlFreeDOMString( tempDOMString );
|
||||
tempDOMString = NULL;
|
||||
|
||||
if( ( !
|
||||
( getSubElement
|
||||
( "controlURL", current_service, &controlURL ) ) )
|
||||
||
|
||||
( !( tempDOMString = getElementValue( controlURL ) ) )
|
||||
||
|
||||
( !
|
||||
( 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" );
|
||||
current->controlURL = NULL;
|
||||
fail = 0;
|
||||
}
|
||||
|
||||
ixmlFreeDOMString( tempDOMString );
|
||||
tempDOMString = NULL;
|
||||
|
||||
if( ( !
|
||||
( getSubElement
|
||||
( "eventSubURL", current_service, &eventURL ) ) )
|
||||
|| ( !( tempDOMString = getElementValue( eventURL ) ) )
|
||||
||
|
||||
( !
|
||||
( 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" );
|
||||
current->eventURL = NULL;
|
||||
fail = 0;
|
||||
}
|
||||
|
||||
ixmlFreeDOMString( tempDOMString );
|
||||
tempDOMString = NULL;
|
||||
|
||||
if( fail ) {
|
||||
freeServiceList( current );
|
||||
|
||||
if( previous )
|
||||
previous->next = NULL;
|
||||
else
|
||||
head = NULL;
|
||||
|
||||
current = previous;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ixmlNodeList_free( serviceNodeList );
|
||||
}
|
||||
|
||||
( *end ) = current;
|
||||
|
||||
return head;
|
||||
} else
|
||||
return NULL;
|
||||
IXML_Node *serviceType = NULL;
|
||||
IXML_Node *serviceId = NULL;
|
||||
IXML_Node *SCPDURL = NULL;
|
||||
IXML_Node *controlURL = NULL;
|
||||
IXML_Node *eventURL = NULL;
|
||||
DOMString tempDOMString = NULL;
|
||||
service_info *head = NULL;
|
||||
service_info *current = NULL;
|
||||
service_info *previous = NULL;
|
||||
IXML_NodeList *serviceNodeList = NULL;
|
||||
long unsigned int NumOfServices = 0;
|
||||
long unsigned int i = 0;
|
||||
int fail = 0;
|
||||
|
||||
if (getSubElement("UDN", node, &UDN) &&
|
||||
getSubElement("serviceList", node, &serviceList)) {
|
||||
serviceNodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)serviceList, "service");
|
||||
if (serviceNodeList != NULL) {
|
||||
NumOfServices = ixmlNodeList_length(serviceNodeList);
|
||||
for (i = 0; i < NumOfServices; i++) {
|
||||
current_service =
|
||||
ixmlNodeList_item(serviceNodeList, i);
|
||||
fail = 0;
|
||||
if (current) {
|
||||
current->next = malloc(sizeof(service_info));
|
||||
previous = current;
|
||||
current = current->next;
|
||||
} else {
|
||||
head = malloc(sizeof(service_info));
|
||||
current = head;
|
||||
}
|
||||
if (!current) {
|
||||
freeServiceList(head);
|
||||
return NULL;
|
||||
}
|
||||
current->next = NULL;
|
||||
current->controlURL = NULL;
|
||||
current->eventURL = NULL;
|
||||
current->serviceType = NULL;
|
||||
current->serviceId = NULL;
|
||||
current->SCPDURL = NULL;
|
||||
current->active = 1;
|
||||
current->subscriptionList = NULL;
|
||||
current->TotalSubscriptions = 0;
|
||||
if (!(current->UDN = getElementValue(UDN)))
|
||||
fail = 1;
|
||||
if (!getSubElement("serviceType", current_service, &serviceType) ||
|
||||
!(current->serviceType = getElementValue(serviceType)))
|
||||
fail = 1;
|
||||
if (!getSubElement("serviceId", current_service, &serviceId) ||
|
||||
!(current->serviceId = getElementValue(serviceId)))
|
||||
fail = 1;
|
||||
if (!getSubElement("SCPDURL", current_service, &SCPDURL) ||
|
||||
!(tempDOMString = getElementValue(SCPDURL)) ||
|
||||
!(current->SCPDURL = resolve_rel_url(URLBase, tempDOMString)))
|
||||
fail = 1;
|
||||
ixmlFreeDOMString(tempDOMString);
|
||||
tempDOMString = NULL;
|
||||
if (!(getSubElement("controlURL", current_service, &controlURL)) ||
|
||||
!(tempDOMString = getElementValue(controlURL)) ||
|
||||
!(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");
|
||||
current->controlURL = NULL;
|
||||
fail = 0;
|
||||
}
|
||||
ixmlFreeDOMString(tempDOMString);
|
||||
tempDOMString = NULL;
|
||||
if (!getSubElement("eventSubURL", current_service, &eventURL) ||
|
||||
!(tempDOMString = getElementValue(eventURL)) ||
|
||||
!(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");
|
||||
current->eventURL = NULL;
|
||||
fail = 0;
|
||||
}
|
||||
ixmlFreeDOMString(tempDOMString);
|
||||
tempDOMString = NULL;
|
||||
if (fail) {
|
||||
freeServiceList(current);
|
||||
if (previous)
|
||||
previous->next = NULL;
|
||||
else
|
||||
head = NULL;
|
||||
current = previous;
|
||||
}
|
||||
}
|
||||
ixmlNodeList_free(serviceNodeList);
|
||||
}
|
||||
(*end) = current;
|
||||
return head;
|
||||
} else {
|
||||
(*end) = NULL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -939,38 +854,37 @@ getAllServiceList( IXML_Node * node,
|
||||
char *URLBase,
|
||||
service_info ** out_end )
|
||||
{
|
||||
service_info *head = NULL;
|
||||
service_info *end = NULL;
|
||||
service_info *next_end = NULL;
|
||||
IXML_NodeList *deviceList = NULL;
|
||||
IXML_Node *currentDevice = NULL;
|
||||
service_info *head = NULL;
|
||||
service_info *end = NULL;
|
||||
service_info *next_end = NULL;
|
||||
IXML_NodeList *deviceList = NULL;
|
||||
IXML_Node *currentDevice = NULL;
|
||||
|
||||
int NumOfDevices = 0;
|
||||
int i = 0;
|
||||
long unsigned int NumOfDevices = 0;
|
||||
long unsigned int i = 0;
|
||||
|
||||
( *out_end ) = NULL;
|
||||
(*out_end) = NULL;
|
||||
|
||||
deviceList =
|
||||
ixmlElement_getElementsByTagName( ( IXML_Element * ) node,
|
||||
"device" );
|
||||
if( deviceList != NULL ) {
|
||||
NumOfDevices = ixmlNodeList_length( deviceList );
|
||||
for( i = 0; i < NumOfDevices; i++ ) {
|
||||
currentDevice = ixmlNodeList_item( deviceList, i );
|
||||
if( head ) {
|
||||
end->next =
|
||||
getServiceList( currentDevice, &next_end, URLBase );
|
||||
end = next_end;
|
||||
} else
|
||||
head = getServiceList( currentDevice, &end, URLBase );
|
||||
deviceList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)node, "device");
|
||||
if (deviceList) {
|
||||
NumOfDevices = ixmlNodeList_length(deviceList);
|
||||
for (i = 0; i < NumOfDevices; i++) {
|
||||
currentDevice = ixmlNodeList_item(deviceList, i);
|
||||
if (head) {
|
||||
end->next = getServiceList(currentDevice,
|
||||
&next_end, URLBase);
|
||||
if (next_end)
|
||||
end = next_end;
|
||||
} else
|
||||
head = getServiceList(currentDevice, &end,
|
||||
URLBase);
|
||||
}
|
||||
ixmlNodeList_free(deviceList);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ixmlNodeList_free( deviceList );
|
||||
}
|
||||
|
||||
( *out_end ) = end;
|
||||
return head;
|
||||
(*out_end) = end;
|
||||
return head;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -1002,8 +916,8 @@ removeServiceTable( IXML_Node * node,
|
||||
service_info *current_service = NULL;
|
||||
service_info *start_search = NULL;
|
||||
service_info *prev_service = NULL;
|
||||
int NumOfDevices = 0;
|
||||
int i = 0;
|
||||
long unsigned int NumOfDevices = 0;
|
||||
long unsigned int i = 0;
|
||||
|
||||
if( getSubElement( "root", node, &root ) ) {
|
||||
current_service = in->serviceList;
|
||||
@@ -1019,9 +933,9 @@ removeServiceTable( IXML_Node * node,
|
||||
&& ( ( getSubElement( "UDN", node, ¤tUDN ) )
|
||||
&& ( UDN = getElementValue( currentUDN ) ) ) ) {
|
||||
current_service = start_search;
|
||||
//Services are put in the service table in the order in which they appear in the
|
||||
//description document, therefore we go through the list only once to remove a particular
|
||||
//root device
|
||||
/*Services are put in the service table in the order in which they appear in the */
|
||||
/*description document, therefore we go through the list only once to remove a particular */
|
||||
/*root device */
|
||||
while( ( current_service )
|
||||
&& ( strcmp( current_service->UDN, UDN ) ) ) {
|
||||
current_service = current_service->next;
|
||||
@@ -1147,4 +1061,5 @@ getServiceTable( IXML_Node * node,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // INCLUDE_DEVICE_APIS
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ str_alloc( IN const char *str,
|
||||
|
||||
s = ( char * )malloc( str_len + 1 );
|
||||
if( s == NULL ) {
|
||||
return NULL; // no mem
|
||||
return NULL; /* no mem */
|
||||
}
|
||||
|
||||
memcpy( s, str, str_len );
|
||||
@@ -111,8 +111,8 @@ memptr_cmp( IN memptr * m,
|
||||
cmp = strncmp( m->buf, s, m->length );
|
||||
|
||||
if( cmp == 0 && m->length < strlen( s ) ) {
|
||||
// both strings equal for 'm->length' chars
|
||||
// if m is shorter than s, then s is greater
|
||||
/* both strings equal for 'm->length' chars */
|
||||
/* if m is shorter than s, then s is greater */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -147,8 +147,8 @@ memptr_cmp_nocase( IN memptr * m,
|
||||
|
||||
cmp = strncasecmp( m->buf, s, m->length );
|
||||
if( cmp == 0 && m->length < strlen( s ) ) {
|
||||
// both strings equal for 'm->length' chars
|
||||
// if m is shorter than s, then s is greater
|
||||
/* both strings equal for 'm->length' chars */
|
||||
/* if m is shorter than s, then s is greater */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -204,20 +204,20 @@ membuffer_set_size( INOUT membuffer * m,
|
||||
size_t alloc_len;
|
||||
char *temp_buf;
|
||||
|
||||
if( new_length >= m->length ) // increase length
|
||||
if( new_length >= m->length ) /* increase length */
|
||||
{
|
||||
// need more mem?
|
||||
/* need more mem? */
|
||||
if( new_length <= m->capacity ) {
|
||||
return 0; // have enough mem; done
|
||||
return 0; /* have enough mem; done */
|
||||
}
|
||||
|
||||
diff = new_length - m->length;
|
||||
alloc_len = MAXVAL( m->size_inc, diff ) + m->capacity;
|
||||
} else // decrease length
|
||||
} else /* decrease length */
|
||||
{
|
||||
assert( new_length <= m->length );
|
||||
|
||||
// if diff is 0..m->size_inc, don't free
|
||||
/* if diff is 0..m->size_inc, don't free */
|
||||
if( ( m->capacity - new_length ) <= m->size_inc ) {
|
||||
return 0;
|
||||
}
|
||||
@@ -227,21 +227,21 @@ membuffer_set_size( INOUT membuffer * m,
|
||||
|
||||
assert( alloc_len >= new_length );
|
||||
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); //LEAK_FIX_MK
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); /*LEAK_FIX_MK */
|
||||
|
||||
//temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );//LEAK_FIX_MK
|
||||
/*temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );LEAK_FIX_MK */
|
||||
|
||||
if( temp_buf == NULL ) {
|
||||
// try smaller size
|
||||
/* try smaller size */
|
||||
alloc_len = new_length;
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); //LEAK_FIX_MK
|
||||
//temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );//LEAK_FIX_MK
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 ); /*LEAK_FIX_MK */
|
||||
/*temp_buf = Realloc( m->buf,m->length, alloc_len + 1 );LEAK_FIX_MK */
|
||||
|
||||
if( temp_buf == NULL ) {
|
||||
return UPNP_E_OUTOF_MEMORY;
|
||||
}
|
||||
}
|
||||
// save
|
||||
/* save */
|
||||
m->buf = temp_buf;
|
||||
m->capacity = alloc_len;
|
||||
return 0;
|
||||
@@ -311,33 +311,31 @@ membuffer_destroy( INOUT membuffer * m )
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
membuffer_assign( INOUT membuffer * m,
|
||||
int membuffer_assign( INOUT membuffer * m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len )
|
||||
{
|
||||
int return_code;
|
||||
int return_code;
|
||||
|
||||
assert( m != NULL );
|
||||
assert(m != NULL);
|
||||
|
||||
// set value to null
|
||||
if( buf == NULL ) {
|
||||
membuffer_destroy( m );
|
||||
return 0;
|
||||
}
|
||||
// alloc mem
|
||||
return_code = membuffer_set_size( m, buf_len );
|
||||
if( return_code != 0 ) {
|
||||
return return_code;
|
||||
}
|
||||
// copy
|
||||
if( buf_len ) {
|
||||
memcpy( m->buf, buf, buf_len );
|
||||
m->buf[buf_len] = 0; // null-terminate
|
||||
}
|
||||
m->length = buf_len;
|
||||
/* set value to null */
|
||||
if (buf == NULL) {
|
||||
membuffer_destroy(m);
|
||||
return 0;
|
||||
}
|
||||
/* alloc mem */
|
||||
return_code = membuffer_set_size(m, buf_len);
|
||||
if (return_code != 0)
|
||||
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;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -411,112 +409,62 @@ membuffer_append_str( INOUT membuffer * m,
|
||||
return membuffer_insert( m, c_str, strlen( c_str ), m->length );
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : membuffer_insert
|
||||
*
|
||||
* Parameters :
|
||||
* INOUT membuffer* m ; buffer whose memory size is to be increased
|
||||
* and appended.
|
||||
* IN const void* buf ; source buffer whose contents will be
|
||||
* copied
|
||||
* IN size_t buf_len ; size of the source buffer
|
||||
* int index ; index to determine the bounds while movinf the data
|
||||
*
|
||||
* Description : Allocates memory for the new data to be inserted. Does
|
||||
* memory management by moving the data from the existing memory to
|
||||
* the newly allocated memory and then appending the new data.
|
||||
*
|
||||
* Return : int ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int
|
||||
membuffer_insert( INOUT membuffer * m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len,
|
||||
int index )
|
||||
int membuffer_insert(membuffer *m, const void *buf, size_t buf_len, size_t index)
|
||||
{
|
||||
int return_code;
|
||||
int return_code;
|
||||
|
||||
assert( m != NULL );
|
||||
assert(m != NULL);
|
||||
|
||||
if( index < 0 || index > ( int )m->length )
|
||||
return UPNP_E_OUTOF_BOUNDS;
|
||||
if (index > m->length)
|
||||
return UPNP_E_OUTOF_BOUNDS;
|
||||
if (!buf || !buf_len) {
|
||||
return 0;
|
||||
}
|
||||
/* alloc mem */
|
||||
return_code = membuffer_set_size(m, m->length + buf_len);
|
||||
if (return_code) {
|
||||
return return_code;
|
||||
}
|
||||
/* insert data */
|
||||
/* move data to right of insertion point */
|
||||
memmove(m->buf + index + buf_len, m->buf + index, m->length - index);
|
||||
memcpy(m->buf + index, buf, buf_len);
|
||||
m->length += buf_len;
|
||||
/* null-terminate */
|
||||
m->buf[m->length] = 0;
|
||||
|
||||
if( buf == NULL || buf_len == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
// alloc mem
|
||||
return_code = membuffer_set_size( m, m->length + buf_len );
|
||||
if( return_code != 0 ) {
|
||||
return return_code;
|
||||
}
|
||||
// insert data
|
||||
|
||||
// move data to right of insertion point
|
||||
memmove( m->buf + index + buf_len, m->buf + index, m->length - index );
|
||||
memcpy( m->buf + index, buf, buf_len );
|
||||
m->length += buf_len;
|
||||
m->buf[m->length] = 0; // null-terminate
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : membuffer_delete
|
||||
*
|
||||
* Parameters :
|
||||
* INOUT membuffer* m ; buffer whose memory size is to be decreased
|
||||
* and copied to the odified location
|
||||
* IN int index ; index to determine bounds while moving data
|
||||
* IN size_t num_bytes ; number of bytes that the data needs to
|
||||
* shrink by
|
||||
*
|
||||
* Description : Shrink the size of the buffer depending on the current
|
||||
* size of the bufer and te input parameters. Move contents from the
|
||||
* old buffer to the new sized buffer.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
membuffer_delete( INOUT membuffer * m,
|
||||
IN int index,
|
||||
IN size_t num_bytes )
|
||||
void membuffer_delete(membuffer *m, size_t index, size_t num_bytes)
|
||||
{
|
||||
int return_value;
|
||||
int new_length;
|
||||
size_t copy_len;
|
||||
int return_value;
|
||||
size_t new_length;
|
||||
size_t copy_len;
|
||||
|
||||
assert( m != NULL );
|
||||
assert(m != NULL);
|
||||
|
||||
if (!m) return;
|
||||
if (!m || !m->length)
|
||||
return;
|
||||
/* shrink count if it goes beyond buffer */
|
||||
if (index + num_bytes > m->length) {
|
||||
num_bytes = m->length - index;
|
||||
/* every thing at and after index purged */
|
||||
copy_len = 0;
|
||||
} else {
|
||||
/* calc num bytes after deleted string */
|
||||
copy_len = m->length - (index + num_bytes);
|
||||
}
|
||||
memmove(m->buf + index, m->buf + index + num_bytes, copy_len);
|
||||
new_length = m->length - num_bytes;
|
||||
/* trim buffer */
|
||||
return_value = membuffer_set_size(m, new_length);
|
||||
/* shrinking should always work */
|
||||
assert(return_value == 0);
|
||||
|
||||
if( m->length == 0 ) {
|
||||
return;
|
||||
}
|
||||
|
||||
assert( index >= 0 && index < ( int )m->length );
|
||||
|
||||
// shrink count if it goes beyond buffer
|
||||
if( index + num_bytes > m->length ) {
|
||||
num_bytes = m->length - ( size_t ) index;
|
||||
copy_len = 0; // every thing at and after index purged
|
||||
} else {
|
||||
// calc num bytes after deleted string
|
||||
copy_len = m->length - ( index + num_bytes );
|
||||
}
|
||||
|
||||
memmove( m->buf + index, m->buf + index + num_bytes, copy_len );
|
||||
|
||||
new_length = m->length - num_bytes;
|
||||
return_value = membuffer_set_size( m, new_length ); // trim buffer
|
||||
assert( return_value == 0 ); // shrinking should always work
|
||||
|
||||
// don't modify until buffer is set
|
||||
m->length = new_length;
|
||||
m->buf[new_length] = 0;
|
||||
/* don't modify until buffer is set */
|
||||
m->length = new_length;
|
||||
m->buf[new_length] = 0;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@@ -543,7 +491,7 @@ membuffer_detach( INOUT membuffer * m )
|
||||
|
||||
buf = m->buf;
|
||||
|
||||
// free all
|
||||
/* free all */
|
||||
membuffer_initialize( m );
|
||||
|
||||
return buf;
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file contains string to integer and integer to string
|
||||
@@ -48,7 +48,7 @@
|
||||
* matched.
|
||||
* IN int num_entries ; number of entries in the table that need
|
||||
* to be searched.
|
||||
* IN xboolean case_sensitive ; whether the case should be case
|
||||
* IN int case_sensitive ; whether the case should be case
|
||||
* sensitive or not
|
||||
*
|
||||
* Description : Match the given name with names from the entries in the
|
||||
@@ -65,7 +65,7 @@ map_str_to_int( IN const char *name,
|
||||
IN size_t name_len,
|
||||
IN str_int_entry * table,
|
||||
IN int num_entries,
|
||||
IN xboolean case_sensitive )
|
||||
IN int case_sensitive )
|
||||
{
|
||||
int top,
|
||||
mid,
|
||||
@@ -82,24 +82,24 @@ map_str_to_int( IN const char *name,
|
||||
while( top <= bot ) {
|
||||
mid = ( top + bot ) / 2;
|
||||
if( case_sensitive ) {
|
||||
//cmp = strcmp( name, table[mid].name );
|
||||
/*cmp = strcmp( name, table[mid].name ); */
|
||||
cmp = memptr_cmp( &name_ptr, table[mid].name );
|
||||
} else {
|
||||
//cmp = strcasecmp( name, table[mid].name );
|
||||
/*cmp = strcasecmp( name, table[mid].name ); */
|
||||
cmp = memptr_cmp_nocase( &name_ptr, table[mid].name );
|
||||
}
|
||||
|
||||
if( cmp > 0 ) {
|
||||
top = mid + 1; // look below mid
|
||||
top = mid + 1; /* look below mid */
|
||||
} else if( cmp < 0 ) {
|
||||
bot = mid - 1; // look above mid
|
||||
} else // cmp == 0
|
||||
bot = mid - 1; /* look above mid */
|
||||
} else /* cmp == 0 */
|
||||
{
|
||||
return mid; // match; return table index
|
||||
return mid; /* match; return table index */
|
||||
}
|
||||
}
|
||||
|
||||
return -1; // header name not found
|
||||
return -1; /* header name not found */
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
||||
@@ -1,65 +1,59 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* \brief Contains a function for freeing the memory associated with a upnp
|
||||
* time out event.
|
||||
*/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file contains a function for freeing the memory associated
|
||||
* wuth a upnp time out event.
|
||||
************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include "upnp_timeout.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/************************************************************************
|
||||
* Function : free_upnp_timeout
|
||||
*
|
||||
* Parameters :
|
||||
* upnp_timeout *event ; Event which needs to be freed
|
||||
*
|
||||
* Description : Free memory associated with event and memory for any
|
||||
* sub-elements
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
free_upnp_timeout( upnp_timeout * event )
|
||||
#include <stdlib.h> /* for free() */
|
||||
|
||||
|
||||
void free_upnp_timeout(upnp_timeout *event)
|
||||
{
|
||||
|
||||
if( event ) {
|
||||
if( event->Event )
|
||||
free( event->Event );
|
||||
free( event );
|
||||
|
||||
}
|
||||
if (event) {
|
||||
if (event->Event) {
|
||||
free(event->Event);
|
||||
}
|
||||
free(event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,90 +29,39 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file contains functions for copying strings based on
|
||||
* different options.
|
||||
************************************************************************/
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
* Purpose: This file contains functions for copying strings based on
|
||||
* different options.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "upnp.h"
|
||||
#include "util.h"
|
||||
|
||||
#include "upnputil.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function : linecopy
|
||||
*
|
||||
* Parameters :
|
||||
* OUT char dest[LINE_SIZE] ; output buffer
|
||||
* IN const char* src ; input buffer
|
||||
*
|
||||
* Description : Copy no of bytes spcified by the LINE_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
linecopy( OUT char dest[LINE_SIZE],
|
||||
IN const char *src )
|
||||
void linecopy(char dest[LINE_SIZE], const char *src)
|
||||
{
|
||||
strncpy( dest, src, LINE_SIZE - 1 );
|
||||
dest[LINE_SIZE - 1] = '\0'; // null-terminate if len(src) >= LINE_SIZE
|
||||
strncpy(dest, src, LINE_SIZE - 1);
|
||||
/* null-terminate if len(src) >= LINE_SIZE. */
|
||||
dest[LINE_SIZE - 1] = '\0';
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : namecopy
|
||||
*
|
||||
* Parameters :
|
||||
* OUT char dest[NAME_SIZE] ; output buffer
|
||||
* IN const char* src ; input buffer
|
||||
*
|
||||
* Description : Copy no of bytes spcified by the NAME_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
namecopy( OUT char dest[NAME_SIZE],
|
||||
IN const char *src )
|
||||
void namecopy(char dest[NAME_SIZE], const char *src)
|
||||
{
|
||||
strncpy( dest, src, NAME_SIZE - 1 );
|
||||
dest[NAME_SIZE - 1] = '\0'; // null-terminate if len(src) >= NAME_SIZE
|
||||
strncpy(dest, src, NAME_SIZE - 1);
|
||||
/* null-terminate if len(src) >= NAME_SIZE. */
|
||||
dest[NAME_SIZE - 1] = '\0';
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : linecopylen
|
||||
*
|
||||
* Parameters :
|
||||
* OUT char dest[LINE_SIZE] ; output buffer
|
||||
* IN const char* src ; input buffer
|
||||
* IN size_t srclen ; bytes to be copied.
|
||||
*
|
||||
* Description : Determine if the srclen passed in paramter is less than
|
||||
* the permitted LINE_SIZE. If it is use the passed parameter, if not
|
||||
* use the permitted LINE_SIZE as the length parameter
|
||||
* Copy no of bytes spcified by the LINE_SIZE constant,
|
||||
* from the source buffer. Null terminate the destination buffer
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void
|
||||
linecopylen( OUT char dest[LINE_SIZE],
|
||||
IN const char *src,
|
||||
IN size_t srclen )
|
||||
void linecopylen(char dest[LINE_SIZE], const char *src, size_t srclen)
|
||||
{
|
||||
int len;
|
||||
size_t len;
|
||||
|
||||
len = srclen < ( LINE_SIZE - 1 ) ? srclen : ( LINE_SIZE - 1 );
|
||||
strncpy( dest, src, len );
|
||||
dest[len] = '\0';
|
||||
len = srclen < (LINE_SIZE - 1) ? srclen : (LINE_SIZE - 1);
|
||||
strncpy(dest, src, len);
|
||||
dest[len] = '\0';
|
||||
}
|
||||
|
||||
|
||||
@@ -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 INTERNAL_CONFIG_H
|
||||
#define INTERNAL_CONFIG_H
|
||||
@@ -36,114 +36,179 @@
|
||||
#include "autoconfig.h"
|
||||
|
||||
|
||||
/** @name Compile time configuration options
|
||||
/*!
|
||||
* \name Compile time configuration options
|
||||
*
|
||||
* The Linux SDK for UPnP Devices contains some compile-time parameters
|
||||
* that effect the behavior of the SDK. All configuration options are
|
||||
* located in {\tt src/inc/config.h}.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
|
||||
/** @name THREAD_IDLE_TIME
|
||||
|
||||
/*!
|
||||
* \name THREAD_IDLE_TIME
|
||||
*
|
||||
* The {\tt THREAD_IDLE_TIME} constant determines when a thread will be
|
||||
* removed from the thread pool and returned to the operating system. When
|
||||
* a thread in the thread pool has been idle for this number of milliseconds
|
||||
* the thread will be released from the thread pool. The default value is
|
||||
* 5000 milliseconds (5 seconds).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define THREAD_IDLE_TIME 5000
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name JOBS_PER_THREAD
|
||||
* The {\tt JOBS_PER_THREAD} constant determines when a new thread will be
|
||||
* allocated to the thread pool inside the SDK. The thread pool will
|
||||
* try and maintain this jobs/thread ratio. When the jobs/thread ratio
|
||||
* becomes greater than this, then a new thread (up to the max) will be
|
||||
* allocated to the thread pool. The default ratio is 10 jobs/thread.
|
||||
|
||||
/*!
|
||||
* \name JOBS_PER_THREAD
|
||||
*
|
||||
* The {\tt JOBS_PER_THREAD} constant determines when a new thread will be
|
||||
* allocated to the thread pool inside the SDK. The thread pool will
|
||||
* try and maintain this jobs/thread ratio. When the jobs/thread ratio
|
||||
* becomes greater than this, then a new thread (up to the max) will be
|
||||
* allocated to the thread pool. The default ratio is 10 jobs/thread.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define JOBS_PER_THREAD 10
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name MIN_THREADS
|
||||
* The {\tt MIN_THREADS} constant defines the minimum number of threads the
|
||||
* thread pool inside the SDK will create. The thread pool will
|
||||
* always have this number of threads. These threads are used
|
||||
* for both callbacks into applications built on top of the SDK and also
|
||||
* for making connections to other control points and devices. This number
|
||||
* includes persistent threads. The default value is two threads.
|
||||
|
||||
/*!
|
||||
* \name MIN_THREADS
|
||||
*
|
||||
* The {\tt MIN_THREADS} constant defines the minimum number of threads the
|
||||
* thread pool inside the SDK will create. The thread pool will
|
||||
* always have this number of threads. These threads are used
|
||||
* for both callbacks into applications built on top of the SDK and also
|
||||
* for making connections to other control points and devices. This number
|
||||
* includes persistent threads. The default value is two threads.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MIN_THREADS 2
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name MAX_THREADS
|
||||
* The {\tt MAX_THREADS} constant defines the maximum number of threads the
|
||||
* thread pool inside the SDK will create. These threads are used
|
||||
* for both callbacks into applications built on top of the library and also
|
||||
* for making connections to other control points and devices. It is not
|
||||
* recommended that this value be below 10, since the threads are
|
||||
* necessary for correct operation. This value can be increased for greater
|
||||
* performance in operation at the expense of greater memory overhead. The
|
||||
* default value is 12.
|
||||
|
||||
/*!
|
||||
* \name MAX_THREADS
|
||||
*
|
||||
* The {\tt MAX_THREADS} constant defines the maximum number of threads the
|
||||
* thread pool inside the SDK will create. These threads are used
|
||||
* for both callbacks into applications built on top of the library and also
|
||||
* for making connections to other control points and devices. It is not
|
||||
* recommended that this value be below 10, since the threads are
|
||||
* necessary for correct operation. This value can be increased for greater
|
||||
* performance in operation at the expense of greater memory overhead. The
|
||||
* default value is 12.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MAX_THREADS 12
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name MAX_JOBS_TOTAL
|
||||
|
||||
/*!
|
||||
* \name THREAD_STACK_SIZE
|
||||
*
|
||||
* The {\tt THREAD_STACK_SIZE} constant defines the minimum stack size (in
|
||||
* bytes) allocated for the stack of each thread the thread pool inside the
|
||||
* SDK will create. These threads are used for both callbacks into
|
||||
* applications built on top of the library and also for making connections
|
||||
* to other control points and devices. This value will not be used if it
|
||||
* is lower than ITHREAD_STACK_MIN or greater than a system-imposed limit.
|
||||
* This value can be used to lower memory overhead in embedded systems.
|
||||
* The default value is 0 (so it is not used by default).
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define THREAD_STACK_SIZE 0
|
||||
/* @} */
|
||||
|
||||
|
||||
/*! \name MAX_JOBS_TOTAL
|
||||
*
|
||||
* The {\tt MAX_JOBS_TOTAL} constant determines the maximum number of jobs
|
||||
* that can be queued. If this limit is reached further jobs will be thrown
|
||||
* to avoid memory exhaustion. The default value 100.
|
||||
* (Added by Axis.)
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MAX_JOBS_TOTAL 100
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name DEFAULT_SOAP_CONTENT_LENGTH
|
||||
|
||||
/*!
|
||||
* \name DEFAULT_SOAP_CONTENT_LENGTH
|
||||
*
|
||||
* SOAP messages will read at most {\tt DEFAULT_SOAP_CONTENT_LENGTH} bytes.
|
||||
* This prevents devices that have a misbehaving web server to send
|
||||
* a large amount of data to the control point causing it to crash.
|
||||
* This can be adjusted dynamically with {\tt UpnpSetMaxContentLength}.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
//@{
|
||||
#define DEFAULT_SOAP_CONTENT_LENGTH 16000
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name NUM_SSDP_COPY
|
||||
|
||||
/*!
|
||||
* \name NUM_SSDP_COPY
|
||||
*
|
||||
* This configuration parameter determines how many copies of each SSDP
|
||||
* advertisement and search packets will be sent. By default it will send two
|
||||
* copies of every packet.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
//@{
|
||||
#define NUM_SSDP_COPY 2
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name SSDP_PAUSE
|
||||
|
||||
/*!
|
||||
* \name SSDP_PAUSE
|
||||
*
|
||||
* This configuration parameter determines the pause between identical SSDP
|
||||
* advertisement and search packets. The pause is measured in milliseconds
|
||||
* and defaults to 100.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
//@{
|
||||
#define SSDP_PAUSE 100
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name WEB_SERVER_BUF_SIZE
|
||||
/*!
|
||||
* \name WEB_SERVER_BUF_SIZE
|
||||
*
|
||||
* This configuration parameter sets the maximum buffer size for the
|
||||
* webserver. The default value is 1MB.
|
||||
* webserver. The default value is 1MB.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
//@{
|
||||
#define WEB_SERVER_BUF_SIZE (1024*1024)
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name AUTO_RENEW_TIME
|
||||
/*!
|
||||
* \name WEB_SERVER_CONTENT_LANGUAGE
|
||||
*
|
||||
* This configuration parameter sets the value of the Content-Language
|
||||
* header for the webserver. Thanks to this parameter, the use can advertize
|
||||
* the language used by the device in the description (friendlyName) and
|
||||
* presentation steps of UPnP. The default value is empty string so no
|
||||
* Content-Language header is added.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define WEB_SERVER_CONTENT_LANGUAGE ""
|
||||
/* @} */
|
||||
|
||||
/*!
|
||||
* \name AUTO_RENEW_TIME
|
||||
*
|
||||
* The {\tt AUTO_RENEW_TIME} is the time, in seconds, before a subscription
|
||||
* expires that the SDK automatically resubscribes. The default
|
||||
* value is 10 seconds. Setting this value too low can result in the
|
||||
@@ -151,89 +216,148 @@
|
||||
* subscription to timeout. In order to avoid continually resubscribing
|
||||
* the minimum subscription time is five seconds more than the auto renew
|
||||
* time.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define AUTO_RENEW_TIME 10
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name CP_MINIMUM_SUBSCRIPTION_TIME
|
||||
/*!
|
||||
* \name CP_MINIMUM_SUBSCRIPTION_TIME
|
||||
*
|
||||
* The {\tt CP_MINIMUM_SUBSCRIPTION_TIME} is the minimum subscription time
|
||||
* allowed for a control point using the SDK. Subscribing for less than
|
||||
* this time automatically results in a subscription for this amount. The
|
||||
* default value is 5 seconds more than the {\tt AUTO_RENEW_TIME}, or 15
|
||||
* seconds.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define CP_MINIMUM_SUBSCRIPTION_TIME (AUTO_RENEW_TIME + 5)
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name MAX_SEARCH_TIME
|
||||
|
||||
/*!
|
||||
* \name MAX_SEARCH_TIME
|
||||
*
|
||||
* The {\tt MAX_SEARCH_TIME} is the maximum time
|
||||
* allowed for an SSDP search by a control point. Searching for greater than
|
||||
* this time automatically results in a search for this amount. The default
|
||||
* value is 80 seconds.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MAX_SEARCH_TIME 80
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
/** @name MIN_SEARCH_TIME
|
||||
|
||||
/*!
|
||||
* \name MIN_SEARCH_TIME
|
||||
*
|
||||
* The {\tt MIN_SEARCH_TIME} is the minimumm time
|
||||
* allowed for an SSDP search by a control point. Searching for less than
|
||||
* this time automatically results in a search for this amount. The default
|
||||
* value is 2 seconds.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define MIN_SEARCH_TIME 2
|
||||
//@}
|
||||
|
||||
|
||||
/** @name AUTO_ADVERTISEMENT_TIME
|
||||
* The {\tt AUTO_ADVERTISEMENT_TIME} is the time, in seconds, before an
|
||||
* device advertisements expires before a renewed advertisement is sent.
|
||||
* The default time is 30 seconds.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define AUTO_ADVERTISEMENT_TIME 30
|
||||
//@}
|
||||
|
||||
/** @name SSDP_PACKET_DISTRIBUTE
|
||||
* The {\tt SSDP_PACKET_DISTRIBUTE} enables the SSDP packets to be sent
|
||||
* at an interval equal to half of the expiration time of SSDP packets
|
||||
* minus the AUTO_ADVERTISEMENT_TIME. This is used to increase
|
||||
* the probability of SSDP packets reaching to control points.
|
||||
* It is recommended that this flag be turned on for embedded wireless
|
||||
* devices.
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define SSDP_PACKET_DISTRIBUTE 1
|
||||
//@}
|
||||
|
||||
/** @name Module Exclusion
|
||||
* Depending on the requirements, the user can selectively discard any of
|
||||
* the major modules like SOAP, GENA, SSDP or the Internal web server. By
|
||||
* default everything is included inside the SDK. By setting any of
|
||||
* the values below to 0, that component will not be included in the final
|
||||
* SDK.
|
||||
* \begin{itemize}
|
||||
* \item {\tt EXCLUDE_SOAP[0,1]}
|
||||
* \item {\tt EXCLUDE_GENA[0,1]}
|
||||
* \item {\tt EXCLUDE_SSDP[0,1]}
|
||||
* \item {\tt EXCLUDE_DOM [0,1]}
|
||||
* \item {\tt EXCLUDE_MINISERVER[0,1]}
|
||||
* \item {\tt EXCLUDE_WEB_SERVER[0,1]}
|
||||
* \item {\tt EXCLUDE_JNI[0,1]}
|
||||
* \end{itemize}
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define MIN_SEARCH_TIME 2
|
||||
/* @} */
|
||||
|
||||
//@{
|
||||
|
||||
/*!
|
||||
* \name AUTO_ADVERTISEMENT_TIME
|
||||
*
|
||||
* The {\tt AUTO_ADVERTISEMENT_TIME} is the time, in seconds, before an
|
||||
* device advertisements expires before a renewed advertisement is sent.
|
||||
* The default time is 30 seconds.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define AUTO_ADVERTISEMENT_TIME 30
|
||||
/* @} */
|
||||
|
||||
|
||||
/*!
|
||||
* \name SSDP_PACKET_DISTRIBUTE
|
||||
*
|
||||
* The {\tt SSDP_PACKET_DISTRIBUTE} enables the SSDP packets to be sent
|
||||
* at an interval equal to half of the expiration time of SSDP packets
|
||||
* minus the AUTO_ADVERTISEMENT_TIME. This is used to increase
|
||||
* the probability of SSDP packets reaching to control points.
|
||||
* It is recommended that this flag be turned on for embedded wireless
|
||||
* devices.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define SSDP_PACKET_DISTRIBUTE 1
|
||||
/* @} */
|
||||
|
||||
|
||||
/*!
|
||||
* \name GENA_NOTIFICATION_SENDING_TIMEOUT
|
||||
*
|
||||
* The {\tt GENA_NOTIFICATION_SENDING_TIMEOUT} specifies the number of seconds
|
||||
* to wait for sending GENA notifications to the Control Point.
|
||||
*
|
||||
* This timeout will be used to know how many seconds GENA notification threads
|
||||
* will wait to write on the socket to send the notification. By putting a
|
||||
* lower value than HTTP_DEFAULT_TIMEOUT, the thread will not wait too long and
|
||||
* will return quickly if writing is impossible. This is very useful as some
|
||||
* Control Points disconnect from the network without unsubscribing as a result
|
||||
* if HTTP_DEFAULT_TIMEOUT is used, all the GENA threads will be blocked to send
|
||||
* notifications to those disconnected Control Points until the subscription
|
||||
* expires.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define GENA_NOTIFICATION_SENDING_TIMEOUT HTTP_DEFAULT_TIMEOUT
|
||||
/* @} */
|
||||
|
||||
|
||||
/*!
|
||||
* \name GENA_NOTIFICATION_ANSWERING_TIMEOUT
|
||||
*
|
||||
* The {\tt GENA_NOTIFICATION_ANSWERING_TIMEOUT} specifies the number of seconds
|
||||
* to wait for receiving the answer to a GENA notification from the Control
|
||||
* Point.
|
||||
*
|
||||
* This timeout will be used to know how many seconds GENA notification threads
|
||||
* will wait on the socket to read for an answer from the CP. By putting a
|
||||
* lower value than HTTP_DEFAULT_TIMEOUT, the thread will not wait too long and
|
||||
* will return quickly if there is no answer from the CP. This is very useful as
|
||||
* some Control Points disconnect from the network without unsubscribing and if
|
||||
* HTTP_DEFAULT_TIMEOUT is used, all the GENA threads will be blocked to wait
|
||||
* for an answer from those disconnected Control Points until the subscription
|
||||
* expires. However, it should be noted that UDA specifies a value of 30s for
|
||||
* waiting the CP's answer.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define GENA_NOTIFICATION_ANSWERING_TIMEOUT HTTP_DEFAULT_TIMEOUT
|
||||
/* @} */
|
||||
|
||||
|
||||
/*!
|
||||
* \name Module Exclusion
|
||||
*
|
||||
* Depending on the requirements, the user can selectively discard any of
|
||||
* the major modules like SOAP, GENA, SSDP or the Internal web server. By
|
||||
* default everything is included inside the SDK. By setting any of
|
||||
* the values below to 0, that component will not be included in the final
|
||||
* SDK.
|
||||
* \begin{itemize}
|
||||
* \item {\tt EXCLUDE_SOAP[0,1]}
|
||||
* \item {\tt EXCLUDE_GENA[0,1]}
|
||||
* \item {\tt EXCLUDE_SSDP[0,1]}
|
||||
* \item {\tt EXCLUDE_DOM [0,1]}
|
||||
* \item {\tt EXCLUDE_MINISERVER[0,1]}
|
||||
* \item {\tt EXCLUDE_WEB_SERVER[0,1]}
|
||||
* \item {\tt EXCLUDE_JNI[0,1]}
|
||||
* \end{itemize}
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
#define EXCLUDE_SSDP 0
|
||||
#define EXCLUDE_SOAP 0
|
||||
#define EXCLUDE_GENA 0
|
||||
@@ -245,24 +369,28 @@
|
||||
#else
|
||||
# define EXCLUDE_JNI 1
|
||||
#endif
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
|
||||
/** @name DEBUG_TARGET
|
||||
* The user has the option to redirect the library output debug messages
|
||||
* to either the screen or to a log file. All the output messages with
|
||||
* debug level 0 will go to {\tt upnp.err} and messages with debug level
|
||||
* greater than zero will be redirected to {\tt upnp.out}.
|
||||
/*!
|
||||
* \name DEBUG_TARGET
|
||||
*
|
||||
* The user has the option to redirect the library output debug messages
|
||||
* to either the screen or to a log file. All the output messages with
|
||||
* debug level 0 will go to {\tt upnp.err} and messages with debug level
|
||||
* greater than zero will be redirected to {\tt upnp.out}.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
//@{
|
||||
#define DEBUG_TARGET 1
|
||||
//@}
|
||||
/* @} */
|
||||
|
||||
|
||||
/** @name Other debugging features
|
||||
The UPnP SDK contains other features to aid in debugging:
|
||||
see <upnp/inc/upnpdebug.h>
|
||||
/*!
|
||||
* \name Other debugging features
|
||||
*
|
||||
* The UPnP SDK contains other features to aid in debugging:
|
||||
* see <upnp/inc/upnpdebug.h>
|
||||
*/
|
||||
|
||||
#define DEBUG_ALL 1
|
||||
@@ -275,38 +403,46 @@
|
||||
#define DEBUG_HTTP 0
|
||||
#define DEBUG_API 0
|
||||
|
||||
//@} // Compile time configuration options
|
||||
|
||||
/*
|
||||
* @} Compile time configuration options
|
||||
*/
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
* Do not change, Internal purpose only!!!
|
||||
* Do not change, Internal purpose only!!!
|
||||
***************************************************************************/
|
||||
|
||||
//@{
|
||||
/*!
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Set additional defines based on requested configuration
|
||||
*/
|
||||
|
||||
// configure --enable-client
|
||||
|
||||
/* configure --enable-client */
|
||||
#if UPNP_HAVE_CLIENT
|
||||
# define INCLUDE_CLIENT_APIS 1
|
||||
#endif
|
||||
|
||||
// configure --enable-device
|
||||
|
||||
/* configure --enable-device */
|
||||
#if UPNP_HAVE_DEVICE
|
||||
# define INCLUDE_DEVICE_APIS 1
|
||||
#endif
|
||||
|
||||
// configure --enable-webserver --enable-device
|
||||
|
||||
/* configure --enable-webserver --enable-device */
|
||||
#if UPNP_HAVE_WEBSERVER
|
||||
# define INTERNAL_WEB_SERVER 1
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#undef EXCLUDE_WEB_SERVER
|
||||
#undef EXCLUDE_MINISERVER
|
||||
#undef EXCLUDE_WEB_SERVER
|
||||
#undef EXCLUDE_MINISERVER
|
||||
#ifdef INTERNAL_WEB_SERVER
|
||||
# define EXCLUDE_WEB_SERVER 0
|
||||
# define EXCLUDE_MINISERVER 0
|
||||
@@ -315,16 +451,18 @@
|
||||
# define EXCLUDE_MINISERVER 1
|
||||
#endif
|
||||
|
||||
|
||||
#if EXCLUDE_GENA == 1 && EXCLUDE_SOAP == 1 && EXCLUDE_WEB_SERVER == 1
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# define EXCLUDE_MINISERVER 1
|
||||
# if INTERNAL_WEB_SERVER
|
||||
# error "conflicting settings: use configure --disable-webserver"
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#if EXCLUDE_GENA == 0 || EXCLUDE_SOAP == 0 || EXCLUDE_WEB_SERVER == 0
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# undef EXCLUDE_MINISERVER
|
||||
# define EXCLUDE_MINISERVER 0
|
||||
# if EXCLUDE_WEB_SERVER == 0 && !defined INTERNAL_WEB_SERVER
|
||||
# error "conflicting settings : use configure --enable-webserver"
|
||||
@@ -332,13 +470,9 @@
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
# define CLIENTONLY(x) x
|
||||
#else
|
||||
# define CLIENTONLY(x)
|
||||
#endif
|
||||
|
||||
//@}
|
||||
#endif
|
||||
#endif /* INTERNAL_CONFIG_H */
|
||||
|
||||
|
||||
@@ -1,52 +1,64 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 GENA_CTRLPT_H
|
||||
#define GENA_CTRLPT_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "sock.h"
|
||||
|
||||
/************************************************************************
|
||||
* Function : gena_process_notification_event
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info: Socket structure containing the device socket
|
||||
* information
|
||||
* IN http_message_t* event: The http message contains the GENA
|
||||
* notification
|
||||
*
|
||||
* Description:
|
||||
* This function processes NOTIFY events that are sent by devices.
|
||||
* called by genacallback()
|
||||
*
|
||||
* Returns: void
|
||||
*
|
||||
* Note : called by genacallback()
|
||||
****************************************************************************/
|
||||
void gena_process_notification_event( INOUT SOCKINFO *info,
|
||||
IN http_message_t* request );
|
||||
|
||||
/*!
|
||||
* \brief This function processes NOTIFY events that are sent by devices.
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info: Socket structure containing the device socket
|
||||
* information
|
||||
* IN http_message_t *event: The http message contains the GENA
|
||||
* notification
|
||||
*
|
||||
* \note called by genacallback()
|
||||
*/
|
||||
void gena_process_notification_event(
|
||||
/*! [in] Socket info of the device. */
|
||||
SOCKINFO *info,
|
||||
/*! [in] The http message contains the GENA notification. */
|
||||
http_message_t *event);
|
||||
|
||||
|
||||
#endif /* GENA_CTRLPT_H */
|
||||
|
||||
|
||||
@@ -1,88 +1,79 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 GENA_DEVICE_H
|
||||
#define GENA_DEVICE_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "sock.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Function : gena_process_subscription_request
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info : socket info of the device
|
||||
* IN http_message_t* request : SUBSCRIPTION request from the control
|
||||
* point
|
||||
*
|
||||
* Description : This function handles a subscription request from a
|
||||
* ctrl point. The socket is not closed on return.
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
void gena_process_subscription_request( IN SOCKINFO *info,
|
||||
IN http_message_t* request );
|
||||
|
||||
/*!
|
||||
* \brief Handles a subscription request from a ctrl point. The socket is not
|
||||
* closed on return.
|
||||
*/
|
||||
void gena_process_subscription_request(
|
||||
/*! [in] Socket info of the device. */
|
||||
SOCKINFO *info,
|
||||
/*! [in] Subscription request from the control point. */
|
||||
http_message_t *request);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function : gena_process_subscription_renewal_request
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info : socket info of the device
|
||||
* IN http_message_t* request : subscription renewal request from the
|
||||
* control point
|
||||
*
|
||||
* Description : This function handles a subscription renewal request
|
||||
* from a ctrl point. The connection is not destroyed on return.
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
void gena_process_subscription_renewal_request( IN SOCKINFO *info,
|
||||
IN http_message_t* request );
|
||||
/*!
|
||||
* \brief Handles a subscription renewal request from a ctrl point.
|
||||
* The connection is not destroyed on return.
|
||||
*/
|
||||
void gena_process_subscription_renewal_request(
|
||||
/*! [in] Socket info of the device. */
|
||||
SOCKINFO *info,
|
||||
/*! [in] Subscription renewal request from the control point. */
|
||||
http_message_t *request);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function : gena_process_unsubscribe_request
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info : socket info of the device
|
||||
* IN http_message_t* request : UNSUBSCRIBE request from the control
|
||||
* point
|
||||
*
|
||||
* Description : This function Handles a subscription cancellation request
|
||||
* from a ctrl point. The connection is not destroyed on return.
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
void gena_process_unsubscribe_request( IN SOCKINFO *info,
|
||||
IN http_message_t* request );
|
||||
/*!
|
||||
* \brief Handles a subscription cancellation request from a ctrl point.
|
||||
* The connection is not destroyed on return.
|
||||
*/
|
||||
void gena_process_unsubscribe_request(
|
||||
/*! [in] Socket info of the device. */
|
||||
SOCKINFO *info,
|
||||
/*! [in] UNSUBSCRIBE request from the control point. */
|
||||
http_message_t *request);
|
||||
|
||||
|
||||
#endif /* GENA_DEVICE_H */
|
||||
|
||||
|
||||
@@ -29,11 +29,9 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef GLOBAL_H
|
||||
#define GLOBAL_H
|
||||
|
||||
|
||||
/* GLOBAL.H - RSAREF types and constants */
|
||||
/* PROTOTYPES should be set to one if and only if the compiler supports
|
||||
function argument prototyping.
|
||||
@@ -42,7 +40,6 @@
|
||||
been defined with C compiler flags.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef PROTOTYPES
|
||||
#define PROTOTYPES 1
|
||||
#endif
|
||||
|
||||
@@ -1,70 +1,73 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 GENLIB_NET_HTTP_HTTPPARSER_H
|
||||
#define GENLIB_NET_HTTP_HTTPPARSER_H
|
||||
|
||||
#include "util.h"
|
||||
#include "membuffer.h"
|
||||
#include "uri.h"
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "LinkedList.h"
|
||||
#include "membuffer.h"
|
||||
#include "uri.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
////// private types ////////////
|
||||
/* private types */
|
||||
|
||||
/* scanner */
|
||||
|
||||
//////////////////////
|
||||
// scanner
|
||||
///////////////////////
|
||||
// Used to represent different types of tokens in input
|
||||
typedef enum // token_type_t
|
||||
/* Used to represent different types of tokens in input. */
|
||||
typedef enum
|
||||
{
|
||||
TT_IDENTIFIER,
|
||||
TT_WHITESPACE,
|
||||
TT_CRLF,
|
||||
TT_CTRL, // needed ??
|
||||
TT_SEPARATOR, // ??
|
||||
TT_QUOTEDSTRING, // ??
|
||||
TT_CTRL,
|
||||
TT_SEPARATOR,
|
||||
TT_QUOTEDSTRING,
|
||||
} token_type_t;
|
||||
|
||||
typedef struct // scanner_t
|
||||
typedef struct
|
||||
{
|
||||
membuffer* msg; // raw http msg
|
||||
size_t cursor; // current position in buffer
|
||||
xboolean entire_msg_loaded; // set this to TRUE if the entire msg is loaded in
|
||||
// in 'msg'; else FALSE if only partial msg in 'msg'
|
||||
// (default is FALSE)
|
||||
/*! raw http msg. */
|
||||
membuffer* msg;
|
||||
/*! current position in buffer. */
|
||||
size_t cursor;
|
||||
/*! set this to TRUE if the entire msg is loaded in 'msg';
|
||||
* else FALSE if only partial msg in 'msg' (default is FALSE). */
|
||||
int entire_msg_loaded;
|
||||
} scanner_t;
|
||||
|
||||
typedef enum // parser_pos_t
|
||||
typedef enum
|
||||
{
|
||||
POS_REQUEST_LINE,
|
||||
POS_RESPONSE_LINE,
|
||||
@@ -73,21 +76,17 @@ typedef enum // parser_pos_t
|
||||
POS_COMPLETE,
|
||||
} parser_pos_t;
|
||||
|
||||
|
||||
#define ENTREAD_DETERMINE_READ_METHOD 1
|
||||
#define ENTREAD_USING_CLEN 2
|
||||
#define ENTREAD_USING_CHUNKED 3
|
||||
#define ENTREAD_UNTIL_CLOSE 4
|
||||
#define ENTREAD_CHUNKY_BODY 5
|
||||
#define ENTREAD_CHUNKY_HEADERS 6
|
||||
#define ENTREAD_USING_CLEN 2
|
||||
#define ENTREAD_USING_CHUNKED 3
|
||||
#define ENTREAD_UNTIL_CLOSE 4
|
||||
#define ENTREAD_CHUNKY_BODY 5
|
||||
#define ENTREAD_CHUNKY_HEADERS 6
|
||||
|
||||
/* end of private section. */
|
||||
|
||||
// end of private section
|
||||
//////////////////
|
||||
// ##################################################################################
|
||||
|
||||
// method in a HTTP request
|
||||
typedef enum // http_method_t
|
||||
/* method in a HTTP request. */
|
||||
typedef enum
|
||||
{
|
||||
HTTPMETHOD_POST,
|
||||
HTTPMETHOD_MPOST,
|
||||
@@ -98,115 +97,121 @@ typedef enum // http_method_t
|
||||
HTTPMETHOD_HEAD,
|
||||
HTTPMETHOD_MSEARCH,
|
||||
HTTPMETHOD_UNKNOWN,
|
||||
SOAPMETHOD_POST, //murari
|
||||
SOAPMETHOD_POST,
|
||||
HTTPMETHOD_SIMPLEGET
|
||||
} http_method_t;
|
||||
|
||||
// different types of HTTP headers
|
||||
#define HDR_UNKNOWN -1
|
||||
/* different types of HTTP headers */
|
||||
#define HDR_UNKNOWN -1
|
||||
#define HDR_CACHE_CONTROL 1
|
||||
#define HDR_CALLBACK 2
|
||||
#define HDR_CONTENT_LENGTH 3
|
||||
#define HDR_CONTENT_TYPE 4
|
||||
#define HDR_DATE 5
|
||||
#define HDR_EXT 6
|
||||
#define HDR_HOST 7
|
||||
//#define HDR_IF_MODIFIED_SINCE 8
|
||||
//#define HDR_IF_UNMODIFIED_SINCE 9
|
||||
//#define HDR_LAST_MODIFIED 10
|
||||
#define HDR_DATE 5
|
||||
#define HDR_EXT 6
|
||||
#define HDR_HOST 7
|
||||
/*define HDR_IF_MODIFIED_SINCE 8 */
|
||||
/*define HDR_IF_UNMODIFIED_SINCE 9 */
|
||||
/*define HDR_LAST_MODIFIED 10 */
|
||||
#define HDR_LOCATION 11
|
||||
#define HDR_MAN 12
|
||||
#define HDR_MX 13
|
||||
#define HDR_NT 14
|
||||
#define HDR_NTS 15
|
||||
#define HDR_SERVER 16
|
||||
#define HDR_SEQ 17
|
||||
#define HDR_SID 18
|
||||
#define HDR_MAN 12
|
||||
#define HDR_MX 13
|
||||
#define HDR_NT 14
|
||||
#define HDR_NTS 15
|
||||
#define HDR_SERVER 16
|
||||
#define HDR_SEQ 17
|
||||
#define HDR_SID 18
|
||||
#define HDR_SOAPACTION 19
|
||||
#define HDR_ST 20
|
||||
#define HDR_TIMEOUT 21
|
||||
#define HDR_TRANSFER_ENCODING 22
|
||||
#define HDR_USN 23
|
||||
#define HDR_ST 20
|
||||
#define HDR_TIMEOUT 21
|
||||
#define HDR_TRANSFER_ENCODING 22
|
||||
#define HDR_USN 23
|
||||
#define HDR_USER_AGENT 24
|
||||
|
||||
//Adding new header difinition//Beg_Murari
|
||||
#define HDR_ACCEPT 25
|
||||
#define HDR_ACCEPT_ENCODING 26
|
||||
#define HDR_ACCEPT_CHARSET 27
|
||||
#define HDR_ACCEPT_LANGUAGE 28
|
||||
#define HDR_ACCEPT_RANGE 29
|
||||
#define HDR_CONTENT_ENCODING 30
|
||||
#define HDR_CONTENT_LANGUAGE 31
|
||||
#define HDR_CONTENT_LOCATION 32
|
||||
#define HDR_CONTENT_RANGE 33
|
||||
#define HDR_IF_RANGE 34
|
||||
#define HDR_RANGE 35
|
||||
#define HDR_TE 36
|
||||
//End_Murari
|
||||
/* Adding new header difinition */
|
||||
#define HDR_ACCEPT 25
|
||||
#define HDR_ACCEPT_ENCODING 26
|
||||
#define HDR_ACCEPT_CHARSET 27
|
||||
#define HDR_ACCEPT_LANGUAGE 28
|
||||
#define HDR_ACCEPT_RANGE 29
|
||||
#define HDR_CONTENT_ENCODING 30
|
||||
#define HDR_CONTENT_LANGUAGE 31
|
||||
#define HDR_CONTENT_LOCATION 32
|
||||
#define HDR_CONTENT_RANGE 33
|
||||
#define HDR_IF_RANGE 34
|
||||
#define HDR_RANGE 35
|
||||
#define HDR_TE 36
|
||||
|
||||
// status of parsing
|
||||
typedef enum // parse_status_t
|
||||
{
|
||||
PARSE_SUCCESS = 0, // msg was parsed successfully
|
||||
PARSE_INCOMPLETE, // need more data to continue
|
||||
PARSE_INCOMPLETE_ENTITY, // for responses that don't have length specified
|
||||
PARSE_FAILURE, // parse failed; check status code for details
|
||||
PARSE_OK, // done partial
|
||||
PARSE_NO_MATCH, // token not matched
|
||||
|
||||
// private
|
||||
/*! status of parsing */
|
||||
typedef enum {
|
||||
/*! msg was parsed successfully. */
|
||||
PARSE_SUCCESS = 0,
|
||||
/*! need more data to continue. */
|
||||
PARSE_INCOMPLETE,
|
||||
/*! for responses that don't have length specified. */
|
||||
PARSE_INCOMPLETE_ENTITY,
|
||||
/*! parse failed; check status code for details. */
|
||||
PARSE_FAILURE,
|
||||
/*! done partial. */
|
||||
PARSE_OK,
|
||||
/*! token not matched. */
|
||||
PARSE_NO_MATCH,
|
||||
/*! private. */
|
||||
PARSE_CONTINUE_1
|
||||
} parse_status_t;
|
||||
|
||||
typedef struct // http_header_t
|
||||
{
|
||||
memptr name; // header name as a string
|
||||
int name_id; // header name id (for a selective group of headers only)
|
||||
membuffer value; // raw-value; could be multi-lined; min-length = 0
|
||||
|
||||
// private
|
||||
membuffer name_buf;
|
||||
typedef struct {
|
||||
/*! header name as a string. */
|
||||
memptr name;
|
||||
/*! header name id (for a selective group of headers only). */
|
||||
int name_id;
|
||||
/*! raw-value; could be multi-lined; min-length = 0. */
|
||||
membuffer value;
|
||||
/* private. */
|
||||
membuffer name_buf;
|
||||
} http_header_t;
|
||||
|
||||
typedef struct // http_message_t
|
||||
{
|
||||
int initialized;
|
||||
// request only
|
||||
typedef struct {
|
||||
int initialized;
|
||||
/*! request only. */
|
||||
http_method_t method;
|
||||
/*! request only. */
|
||||
uri_type uri;
|
||||
|
||||
// response only
|
||||
/*! response only. */
|
||||
http_method_t request_method;
|
||||
/*! response only. */
|
||||
int status_code;
|
||||
/*! response only. */
|
||||
membuffer status_msg;
|
||||
|
||||
// fields used in both request or response messages
|
||||
xboolean is_request; // if TRUE, msg is a request, else response
|
||||
|
||||
int major_version; // http major.minor version
|
||||
/* fields used in both request or response messages. */
|
||||
/*! if TRUE, msg is a request, else response. */
|
||||
int is_request;
|
||||
/* http major version. */
|
||||
int major_version;
|
||||
/* http minor version. */
|
||||
int minor_version;
|
||||
|
||||
|
||||
/*! . */
|
||||
LinkedList headers;
|
||||
//NNS: dlist headers; // dlist<http_header_t *>
|
||||
memptr entity; // message body(entity)
|
||||
|
||||
// private fields
|
||||
membuffer msg; // entire raw message
|
||||
char *urlbuf; // storage for url string
|
||||
/*! message body(entity). */
|
||||
memptr entity;
|
||||
/* private fields. */
|
||||
/*! entire raw message. */
|
||||
membuffer msg;
|
||||
/*! storage for url string. */
|
||||
char *urlbuf;
|
||||
/*! . */
|
||||
size_t entity_offset;
|
||||
} http_message_t;
|
||||
|
||||
typedef struct // http_parser_t
|
||||
{
|
||||
typedef struct {
|
||||
http_message_t msg;
|
||||
int http_error_code; // read-only; in case of parse error, this
|
||||
// contains the HTTP error code (4XX or 5XX)
|
||||
|
||||
// read-only; this is set to true if a NOTIFY request has no content-length.
|
||||
// used to read valid sspd notify msg.
|
||||
xboolean valid_ssdp_notify_hack;
|
||||
|
||||
// private data -- don't touch
|
||||
/*! read-only; in case of parse error, this
|
||||
* contains the HTTP error code (4XX or 5XX). */
|
||||
int http_error_code;
|
||||
/*! read-only; this is set to true if a NOTIFY request has no
|
||||
* content-length. used to read valid sspd notify msg. */
|
||||
int valid_ssdp_notify_hack;
|
||||
/* private data -- don't touch. */
|
||||
parser_pos_t position;
|
||||
int ent_position;
|
||||
unsigned int content_length;
|
||||
@@ -215,15 +220,9 @@ typedef struct // http_parser_t
|
||||
scanner_t scanner;
|
||||
} http_parser_t;
|
||||
|
||||
|
||||
//--------------------------------------------------
|
||||
//////////////// functions /////////////////////////
|
||||
//--------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/************************************************************************
|
||||
* Function : httpmsg_init
|
||||
@@ -264,8 +263,7 @@ void httpmsg_destroy( INOUT http_message_t* msg );
|
||||
* in the linked list of messages
|
||||
*
|
||||
* Return : http_header_t* - Pointer to a header on success;
|
||||
* NULL on failure
|
||||
*
|
||||
* NULL on failure
|
||||
* Note :
|
||||
************************************************************************/
|
||||
http_header_t* httpmsg_find_hdr_str( IN http_message_t* msg,
|
||||
@@ -281,8 +279,8 @@ http_header_t* 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; *
|
||||
* NULL on failure
|
||||
* Return : http_header_t* - Pointer to a header on success;
|
||||
* NULL on failure
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
@@ -396,9 +394,9 @@ parse_status_t parser_get_entity_read_method( INOUT http_parser_t* parser );
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT http_parser_t* parser ; HTTP Parser Object
|
||||
* IN const char* buf ; buffer to be appended to the parser
|
||||
* buffer
|
||||
* IN size_t buf_length ; Size of the buffer
|
||||
* IN const char* buf ; buffer to be appended to the parser
|
||||
* buffer
|
||||
* IN size_t buf_length ; Size of the buffer
|
||||
*
|
||||
* Description: The parser function. Depending on the position of the
|
||||
* parser object the actual parsing function is invoked
|
||||
@@ -414,8 +412,8 @@ parse_status_t parser_append( INOUT http_parser_t* parser,
|
||||
* Function: matchstr
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *str ; String to be matched
|
||||
* IN size_t slen ; Length of the string
|
||||
* IN char *str ; String to be matched
|
||||
* IN size_t slen ; Length of the string
|
||||
* IN const char* fmt ; Pattern format
|
||||
* ...
|
||||
*
|
||||
@@ -429,10 +427,6 @@ parse_status_t parser_append( INOUT http_parser_t* parser,
|
||||
************************************************************************/
|
||||
int matchstr( IN char *str, IN size_t slen, IN const char* fmt, ... );
|
||||
|
||||
// ====================================================
|
||||
// misc functions
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: raw_to_int
|
||||
*
|
||||
@@ -473,31 +467,28 @@ int raw_find_str( IN memptr* raw_value, IN const char* str );
|
||||
* 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 );
|
||||
|
||||
/************************************************************************
|
||||
* Function: print_http_headers
|
||||
*
|
||||
* Parameters:
|
||||
* http_message_t* hmsg ; HTTP Message object
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
/*!
|
||||
* \brief Print the HTTP headers.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
void print_http_headers( IN http_message_t *hmsg );
|
||||
void print_http_headers(
|
||||
/*! [in] HTTP Message object. */
|
||||
http_message_t *hmsg);
|
||||
#else
|
||||
static UPNP_INLINE void print_http_headers( IN http_message_t *hmsg ) {}
|
||||
static UPNP_INLINE void print_http_headers(http_message_t *hmsg)
|
||||
{
|
||||
return;
|
||||
hmsg = hmsg;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif // __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif // GENLIB_NET_HTTP_HTTPPARSER_H
|
||||
#endif /* GENLIB_NET_HTTP_HTTPPARSER_H */
|
||||
|
||||
|
||||
@@ -1,88 +1,82 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
#define GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
|
||||
/*
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
// timeout in secs
|
||||
/*! timeout in secs. */
|
||||
#define HTTP_DEFAULT_TIMEOUT 30
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
#extern "C" {
|
||||
#endif
|
||||
|
||||
int
|
||||
http_CancelHttpGet( IN void *Handle );
|
||||
int http_CancelHttpGet(IN void *Handle);
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_FixUrl
|
||||
/*!
|
||||
* \brief Validates URL.
|
||||
*
|
||||
* Parameters:
|
||||
* IN uri_type* url; URL to be validated and fixed
|
||||
* OUT uri_type* fixed_url; URL after being fixed.
|
||||
*
|
||||
* Description:
|
||||
* Validates URL
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
* UPNP_E_SUCCESS
|
||||
************************************************************************/
|
||||
int http_FixUrl( IN uri_type* url, OUT uri_type* fixed_url );
|
||||
* \return
|
||||
* \li \c UPNP_E_INVALID_URL
|
||||
* \li \c UPNP_E_SUCCESS
|
||||
*/
|
||||
int http_FixUrl(
|
||||
/*! [in] URL to be validated and fixed. */
|
||||
uri_type *url,
|
||||
/*! [out] URL after being fixed. */
|
||||
uri_type *fixed_url);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_FixStrUrl
|
||||
/*!
|
||||
* \brief Parses URL and then validates URL.
|
||||
*
|
||||
* Parameters:
|
||||
* IN char* urlstr ; Character string as a URL
|
||||
* IN int urlstrlen ; Length of the character string
|
||||
* OUT uri_type* fixed_url ; Fixed and corrected URL
|
||||
*
|
||||
* Description:
|
||||
* Parses URL and then validates URL
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_INVALID_URL
|
||||
* UPNP_E_SUCCESS
|
||||
************************************************************************/
|
||||
int http_FixStrUrl( IN const char* urlstr, IN int urlstrlen, OUT uri_type* fixed_url );
|
||||
|
||||
* \return
|
||||
* \li \c UPNP_E_INVALID_URL
|
||||
* \li \c UPNP_E_SUCCESS
|
||||
*/
|
||||
int http_FixStrUrl(
|
||||
/*! [in] Character string as a URL. */
|
||||
const char *urlstr,
|
||||
/*! [in] Length of the character string. */
|
||||
size_t urlstrlen,
|
||||
/*! [out] Fixed and corrected URL. */
|
||||
uri_type *fixed_url);
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_Connect
|
||||
@@ -95,7 +89,7 @@ int http_FixStrUrl( IN const char* urlstr, IN int urlstrlen, OUT uri_type* fixed
|
||||
* Gets destination address from URL and then connects to the remote end
|
||||
*
|
||||
* Returns:
|
||||
* socket descriptor on sucess
|
||||
* socket descriptor on success
|
||||
* UPNP_E_OUTOF_SOCKET
|
||||
* UPNP_E_SOCKET_CONNECT on error
|
||||
************************************************************************/
|
||||
@@ -128,37 +122,37 @@ int http_RecvMessage( IN SOCKINFO *info, OUT http_parser_t* parser,
|
||||
OUT int* http_error_code );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_SendMessage
|
||||
/*!
|
||||
* \brief Sends a message to the destination based on the format parameter.
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKINFO *info ; Socket information object
|
||||
* IN OUT int * TimeOut ; time out value
|
||||
* IN const char* fmt, ... Pattern format to take actions upon
|
||||
* fmt types:
|
||||
* \li \c 'f': arg = "const char *" file name
|
||||
* \li \c 'b': arg1 = "const char *" mem_buffer; arg2 = "size_t" buffer length.
|
||||
* \li \c 'I': arg = "struct SendInstruction *"
|
||||
*
|
||||
* Description:
|
||||
* Sends a message to the destination based on the
|
||||
* IN const char* fmt parameter
|
||||
* fmt types:
|
||||
* 'f': arg = const char * file name
|
||||
* 'm': arg1 = const char * mem_buffer; arg2= size_t buf_length
|
||||
* E.g.:
|
||||
* char *buf = "POST /xyz.cgi http/1.1\r\n\r\n";
|
||||
* char *filename = "foo.dat";
|
||||
* int status = http_SendMessage( tcpsock, "mf",
|
||||
* buf, strlen(buf), // args for memory buffer
|
||||
* filename ); // arg for file
|
||||
* E.g.:
|
||||
\verbatim
|
||||
char *buf = "POST /xyz.cgi http/1.1\r\n\r\n";
|
||||
char *filename = "foo.dat";
|
||||
int status = http_SendMessage(tcpsock, "bf",
|
||||
buf, strlen(buf), // args for memory buffer
|
||||
filename); // arg for file
|
||||
\endverbatim
|
||||
*
|
||||
* Returns:
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_FILE_READ_ERROR
|
||||
* UPNP_E_SUCCESS
|
||||
************************************************************************/
|
||||
* \return
|
||||
* \li \c UPNP_E_OUTOF_MEMORY
|
||||
* \li \c UPNP_E_FILE_READ_ERROR
|
||||
* \li \c UPNP_E_SUCCESS
|
||||
*/
|
||||
int http_SendMessage(
|
||||
IN SOCKINFO *info,
|
||||
IN OUT int* timeout_secs,
|
||||
IN const char* fmt, ... );
|
||||
|
||||
/* [in] Socket information object. */
|
||||
SOCKINFO *info,
|
||||
/* [in,out] Time out value. */
|
||||
int* timeout_secs,
|
||||
/* [in] Pattern format to take actions upon. */
|
||||
const char* fmt,
|
||||
/* [in] Variable parameter list. */
|
||||
...);
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_RequestAndResponse
|
||||
@@ -212,7 +206,7 @@ int http_RequestAndResponse(
|
||||
* IN int timeout_secs; time out value
|
||||
* OUT char** document; buffer to store the document extracted
|
||||
* from the donloaded message.
|
||||
* OUT int* doc_length; length of the extracted document
|
||||
* OUT size_t* doc_length; length of the extracted document
|
||||
* OUT char* content_type; Type of content
|
||||
*
|
||||
* Description:
|
||||
@@ -227,7 +221,7 @@ int http_Download(
|
||||
IN const char* url,
|
||||
IN int timeout_secs,
|
||||
OUT char** document,
|
||||
OUT int* doc_length,
|
||||
OUT size_t *doc_length,
|
||||
OUT char* content_type );
|
||||
|
||||
|
||||
@@ -238,7 +232,7 @@ int http_Download(
|
||||
* IN void *Handle: Handle to the http post object
|
||||
* IN char *buf: Buffer to send to peer, if format used
|
||||
* is not UPNP_USING_CHUNKED,
|
||||
* IN unsigned int *size: Size of the data to be sent.
|
||||
* IN size_t *size: Size of the data to be sent.
|
||||
* IN int timeout: time out value
|
||||
*
|
||||
* Description:
|
||||
@@ -252,7 +246,7 @@ int http_Download(
|
||||
************************************************************************/
|
||||
int http_WriteHttpPost(IN void *Handle,
|
||||
IN char *buf,
|
||||
IN unsigned int *size,
|
||||
IN size_t *size,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
@@ -271,7 +265,7 @@ int http_WriteHttpPost(IN void *Handle,
|
||||
* associated memory. Frees handle associated with the HTTP POST msg.
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_SUCCESS - On success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
************************************************************************/
|
||||
int http_CloseHttpPost(IN void *Handle,
|
||||
@@ -296,7 +290,7 @@ int http_CloseHttpPost(IN void *Handle,
|
||||
* such handles
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_SUCCESS - On success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
@@ -313,17 +307,17 @@ int http_OpenHttpPost(IN const char *url_str,
|
||||
* Function: http_ReadHttpGet
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* IN OUT char *buf; Buffer to get the read and parsed data
|
||||
* IN OUT unsigned int *size; Size of the buffer passed
|
||||
* IN int timeout; time out value
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* IN OUT char *buf; Buffer to get the read and parsed data
|
||||
* IN OUT size_t *size; Size of the buffer passed
|
||||
* IN int timeout; time out value
|
||||
*
|
||||
* Description:
|
||||
* Parses already existing data, then gets new data.
|
||||
* Parses and extracts information from the new data.
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Sucess
|
||||
* UPNP_E_SUCCESS - On success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Parameter
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
* UPNP_E_BAD_HTTPMSG
|
||||
@@ -332,7 +326,7 @@ int http_OpenHttpPost(IN const char *url_str,
|
||||
int http_ReadHttpGet(
|
||||
IN void *Handle,
|
||||
IN OUT char *buf,
|
||||
IN OUT unsigned int *size,
|
||||
IN OUT size_t *size,
|
||||
IN int timeout);
|
||||
|
||||
|
||||
@@ -340,9 +334,9 @@ int http_ReadHttpGet(
|
||||
* Function: http_HttpGetProgress
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* OUT unsigned int *length; Buffer to get the read and parsed data
|
||||
* OUT unsigned int *total; Size of tge buffer passed
|
||||
* IN void *Handle; Handle to the HTTP get object
|
||||
* OUT size_t *length; Buffer to get the read and parsed data
|
||||
* OUT size_t *total; Size of tge buffer passed
|
||||
*
|
||||
* Description:
|
||||
* Extracts information from the Handle to the HTTP get object.
|
||||
@@ -353,9 +347,8 @@ int http_ReadHttpGet(
|
||||
************************************************************************/
|
||||
int http_HttpGetProgress(
|
||||
IN void *Handle,
|
||||
OUT unsigned int *length,
|
||||
OUT unsigned int *total );
|
||||
|
||||
OUT size_t *length,
|
||||
OUT size_t *total);
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_CloseHttpGet
|
||||
@@ -373,74 +366,61 @@ int http_HttpGetProgress(
|
||||
************************************************************************/
|
||||
int http_CloseHttpGet(IN void *Handle);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_OpenHttpGet
|
||||
/*!
|
||||
* \brief Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the response.
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str: String as a URL
|
||||
* IN OUT void **Handle: Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN OUT char **contentType: Type of content
|
||||
* OUT int *contentLength: length of content
|
||||
* OUT int *httpStatus: HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout: time out value
|
||||
* If a proxy URL is defined then the connection is made there.
|
||||
*
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the
|
||||
* response.
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
* \return integer
|
||||
* \li \c UPNP_E_SUCCESS - On Success
|
||||
* \li \c UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* \li \c UPNP_E_OUTOF_MEMORY
|
||||
* \li \c UPNP_E_SOCKET_ERROR
|
||||
* \li \c UPNP_E_BAD_RESPONSE
|
||||
*/
|
||||
int http_OpenHttpGet(
|
||||
IN const char *url_str,
|
||||
IN OUT void **Handle,
|
||||
IN OUT char **contentType,
|
||||
OUT int *contentLength,
|
||||
OUT int *httpStatus,
|
||||
IN int timeout);
|
||||
/* [in] String as a URL. */
|
||||
const char *url_str,
|
||||
/* [in,out] Pointer to buffer to store HTTP post handle. */
|
||||
void **Handle,
|
||||
/* [in,out] Type of content. */
|
||||
char **contentType,
|
||||
/* [out] length of content. */
|
||||
int *contentLength,
|
||||
/* [out] HTTP status returned on receiving a response message. */
|
||||
int *httpStatus,
|
||||
/* [in] time out value. */
|
||||
int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_OpenHttpGetProxy
|
||||
/*!
|
||||
* \brief Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the response.
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char *url_str; String as a URL
|
||||
* IN const char *proxy_str; String as a URL
|
||||
* IN OUT void **Handle; Pointer to buffer to store HTTP
|
||||
* post handle
|
||||
* IN OUT char **contentType; Type of content
|
||||
* OUT int *contentLength; length of content
|
||||
* OUT int *httpStatus; HTTP status returned on receiving a
|
||||
* response message
|
||||
* IN int timeout: time out value
|
||||
* If a proxy URL is defined then the connection is made there.
|
||||
*
|
||||
* Description:
|
||||
* Makes the HTTP GET message, connects to the peer,
|
||||
* sends the HTTP GET request, gets the response and parses the response.
|
||||
* If a proxy URL is defined then the connection is made there.
|
||||
*
|
||||
* Return: int
|
||||
* UPNP_E_SUCCESS - On Success
|
||||
* UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* UPNP_E_BAD_RESPONSE
|
||||
************************************************************************/
|
||||
int http_OpenHttpGetProxy(IN const char *url_str,
|
||||
IN const char *proxy_str,
|
||||
IN OUT void **Handle,
|
||||
IN OUT char **contentType,
|
||||
OUT int *contentLength,
|
||||
OUT int *httpStatus,
|
||||
IN int timeout);
|
||||
* \return integer
|
||||
* \li \c UPNP_E_SUCCESS - On Success
|
||||
* \li \c UPNP_E_INVALID_PARAM - Invalid Paramters
|
||||
* \li \c UPNP_E_OUTOF_MEMORY
|
||||
* \li \c UPNP_E_SOCKET_ERROR
|
||||
* \li \c UPNP_E_BAD_RESPONSE
|
||||
*/
|
||||
int http_OpenHttpGetProxy(
|
||||
/* [in] String as a URL. */
|
||||
const char *url_str,
|
||||
/* [in] String as a URL. */
|
||||
const char *proxy_str,
|
||||
/* [in,out] Pointer to buffer to store HTTP post handle. */
|
||||
void **Handle,
|
||||
/* [in,out] Type of content. */
|
||||
char **contentType,
|
||||
/* [out] length of content. */
|
||||
int *contentLength,
|
||||
/* [out] HTTP status returned on receiving a response message. */
|
||||
int *httpStatus,
|
||||
/* [in] time out value. */
|
||||
int timeout);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
@@ -469,61 +449,55 @@ int http_SendStatusResponse(
|
||||
IN int request_major_version,
|
||||
IN int request_minor_version );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_MakeMessage
|
||||
/*!
|
||||
* \brief Generate an HTTP message based on the format that is specified in
|
||||
* the input parameters.
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT membuffer* buf; buffer with the contents of the
|
||||
* message
|
||||
* IN int http_major_version; HTTP major version
|
||||
* IN int http_minor_version; HTTP minor version
|
||||
* IN const char* fmt; Pattern format
|
||||
* ...;
|
||||
\verbatim
|
||||
Format 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
|
||||
'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
|
||||
'L': arg = language information -- add Content-Language header if Accept-Language header is not empty and if
|
||||
WEB_SERVER_CONTENT_LANGUAGE is not empty
|
||||
'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
|
||||
'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
|
||||
'X': arg = const char * -- useragent; "redsonic" HTTP X-User-Agent: useragent
|
||||
\endverbatim
|
||||
*
|
||||
* Description:
|
||||
* Generate an HTTP message based on the format that is 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
|
||||
* '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
|
||||
* '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
|
||||
* 'X': arg = const char useragent; "redsonic" HTTP X-User-Agent: useragent
|
||||
*
|
||||
* Return: int
|
||||
* 0 - On Success
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_INVALID_URL
|
||||
************************************************************************/
|
||||
* \return
|
||||
* \li \c 0 - On Success
|
||||
* \li \c UPNP_E_OUTOF_MEMORY
|
||||
* \li \c UPNP_E_INVALID_URL
|
||||
*/
|
||||
int http_MakeMessage(
|
||||
/* [in,out] Buffer with the contents of the message. */
|
||||
INOUT membuffer* buf,
|
||||
/* [in] HTTP major version. */
|
||||
IN int http_major_version,
|
||||
/* [in] HTTP minor version. */
|
||||
IN int http_minor_version,
|
||||
IN const char* fmt, ... );
|
||||
/* [in] Pattern format. */
|
||||
IN const char* fmt,
|
||||
/* [in] Format arguments. */
|
||||
... );
|
||||
|
||||
|
||||
/************************************************************************
|
||||
@@ -597,9 +571,9 @@ int http_OpenHttpGetEx(IN const char *url_str,
|
||||
void get_sdk_info( OUT char *info );
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // #extern "C"
|
||||
} /* #extern "C" */
|
||||
#endif
|
||||
|
||||
|
||||
#endif // GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
#endif /* GENLIB_NET_HTTP_HTTPREADWRITE_H */
|
||||
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#ifdef IPV6_
|
||||
#define INET_IPV6
|
||||
#endif
|
||||
|
||||
#include "unixutil.h"
|
||||
|
||||
@@ -37,7 +40,7 @@
|
||||
* \li (2) takes a u_char* not an in_addr as input
|
||||
*
|
||||
*/
|
||||
extern const char *inet_ntop4(const u_char src, char *dst, socklen_t size);
|
||||
extern const char *inet_ntop4(const u_char *src, char *dst, socklen_t size);
|
||||
|
||||
|
||||
/*!
|
||||
|
||||
@@ -1,72 +1,76 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 GENLIB_UTIL_MEMBUFFER_H
|
||||
#define GENLIB_UTIL_MEMBUFFER_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
#define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) )
|
||||
#define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) )
|
||||
|
||||
// pointer to a chunk of memory
|
||||
typedef struct // memptr
|
||||
/*! pointer to a chunk of memory. */
|
||||
typedef struct
|
||||
{
|
||||
char *buf; // start of memory (read/write)
|
||||
size_t length; // length of memory (read-only)
|
||||
/*! start of memory (read/write). */
|
||||
char *buf;
|
||||
/*! length of memory (read-only). */
|
||||
size_t length;
|
||||
} memptr;
|
||||
|
||||
|
||||
// maintains a block of dynamically allocated memory
|
||||
// note: Total length/capacity should not exceed MAX_INT
|
||||
typedef struct // membuffer
|
||||
/*! Maintains a block of dynamically allocated memory
|
||||
* note: Total length/capacity should not exceed MAX_INT */
|
||||
typedef struct
|
||||
{
|
||||
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)
|
||||
|
||||
// default value of size_inc
|
||||
#define MEMBUF_DEF_SIZE_INC 5
|
||||
/*! mem buffer; must not write beyond buf[length-1] (read/write). */
|
||||
char *buf;
|
||||
/*! length of buffer (read-only). */
|
||||
size_t length;
|
||||
/*! total allocated memory (read-only). */
|
||||
size_t capacity;
|
||||
/*! used to increase size; MUST be > 0; (read/write). */
|
||||
size_t size_inc;
|
||||
/*! default value of size_inc. */
|
||||
#define MEMBUF_DEF_SIZE_INC 5
|
||||
} membuffer;
|
||||
|
||||
//--------------------------------------------------
|
||||
//////////////// functions /////////////////////////
|
||||
//--------------------------------------------------
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/************************************************************************
|
||||
* Function : str_alloc
|
||||
@@ -84,7 +88,7 @@ extern "C" {
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
char* str_alloc( IN const char* str, IN size_t str_len );
|
||||
char *str_alloc( IN const char* str, IN size_t str_len );
|
||||
|
||||
/************************************************************************
|
||||
* Function : memptr_cmp
|
||||
@@ -253,47 +257,37 @@ int membuffer_append( INOUT membuffer* m, IN const void* buf, IN size_t buf_len
|
||||
************************************************************************/
|
||||
int membuffer_append_str( INOUT membuffer* m, IN const char* c_str );
|
||||
|
||||
/************************************************************************
|
||||
* Function : membuffer_insert
|
||||
*
|
||||
* Parameters :
|
||||
* INOUT membuffer* m ; buffer whose memory size is to be increased
|
||||
* and appended.
|
||||
* IN const void* buf ; source buffer whose contents will be
|
||||
* copied
|
||||
* IN size_t buf_len ; size of the source buffer
|
||||
* int index ; index to determine the bounds while movinf the data
|
||||
*
|
||||
* Description : Allocates memory for the new data to be inserted. Does
|
||||
* memory management by moving the data from the existing memory to
|
||||
* the newly allocated memory and then appending the new data.
|
||||
*
|
||||
* Return : int ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int membuffer_insert( INOUT membuffer* m, IN const void* buf, IN size_t buf_len, int index );
|
||||
/*!
|
||||
* \brief Allocates memory for the new data to be inserted. Does
|
||||
* memory management by moving the data from the existing memory to
|
||||
* the newly allocated memory and then appending the new data.
|
||||
*
|
||||
* \return 0 if successful, error code if error.
|
||||
*/
|
||||
int membuffer_insert(
|
||||
/* [in,out] Buffer whose memory size is to be increased and appended. */
|
||||
membuffer *m,
|
||||
/* [in] source buffer whose contents will be copied. */
|
||||
const void *buf,
|
||||
/* [in] size of the source buffer. */
|
||||
size_t buf_len,
|
||||
/* [in] index to determine the bounds while movinf the data. */
|
||||
size_t index);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function : membuffer_delete
|
||||
*
|
||||
* Parameters :
|
||||
* INOUT membuffer* m ; buffer whose memory size is to be decreased
|
||||
* and copied to the odified location
|
||||
* IN int index ; index to determine bounds while moving data
|
||||
* IN size_t num_bytes ; number of bytes that the data needs to
|
||||
* shrink by
|
||||
*
|
||||
* Description : Shrink the size of the buffer depending on the current
|
||||
* size of the bufer and te input parameters. Move contents from the
|
||||
* old buffer to the new sized buffer.
|
||||
*
|
||||
* Return : void ;
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
void membuffer_delete( INOUT membuffer* m, IN int index, IN size_t num_bytes );
|
||||
/*!
|
||||
* \brief Shrink the size of the buffer depending on the current size of the
|
||||
* bufer and te input parameters. Move contents from the old buffer to the
|
||||
* new sized buffer.
|
||||
*/
|
||||
void membuffer_delete(
|
||||
/* [in,out] Buffer whose memory size is to be decreased and copied
|
||||
* to the modified location. */
|
||||
INOUT membuffer *m,
|
||||
/* [in] Index to determine bounds while moving data. */
|
||||
IN size_t index,
|
||||
/* [in] Number of bytes that the data needs to shrink by. */
|
||||
IN size_t num_bytes);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
@@ -332,7 +326,8 @@ char* membuffer_detach( INOUT membuffer* m );
|
||||
************************************************************************/
|
||||
void membuffer_attach( INOUT membuffer* m, IN char* new_buf, IN size_t buf_len );
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif // __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* GENLIB_UTIL_H */
|
||||
|
||||
#endif // GENLIB_UTIL_H
|
||||
|
||||
@@ -1,38 +1,43 @@
|
||||
/************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
/**************************************************************************
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* * 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
|
||||
* 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
|
||||
*
|
||||
* 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
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
************************************************************************/
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef MINISERVER_H
|
||||
#define MINISERVER_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
@@ -41,30 +46,43 @@ extern SOCKET gMiniServerStopSock;
|
||||
|
||||
|
||||
typedef struct MServerSockArray {
|
||||
/* socket for listening for miniserver requests */
|
||||
/*! IPv4 socket for listening for miniserver requests. */
|
||||
SOCKET miniServerSock4;
|
||||
/*! IPv6 Socket for listening for miniserver requests. */
|
||||
SOCKET miniServerSock6;
|
||||
/* socket for stopping miniserver */
|
||||
/*! Socket for stopping miniserver */
|
||||
SOCKET miniServerStopSock;
|
||||
/* socket for incoming advertisments and search requests */
|
||||
/*! IPv4 SSDP Socket for incoming advertisments and search requests. */
|
||||
SOCKET ssdpSock4;
|
||||
/*! IPv6 SSDP Socket for incoming advertisments and search requests. */
|
||||
SOCKET ssdpSock6;
|
||||
/*! IPv6 SSDP Socket for incoming advertisments and search requests. */
|
||||
SOCKET ssdpSock6UlaGua;
|
||||
|
||||
SOCKET stopPort;
|
||||
SOCKET miniServerPort4;
|
||||
SOCKET miniServerPort6;
|
||||
|
||||
/* socket for sending search requests and receiving search replies */
|
||||
CLIENTONLY(SOCKET ssdpReqSock4;)
|
||||
CLIENTONLY(SOCKET ssdpReqSock6;)
|
||||
/* ! . */
|
||||
uint16_t stopPort;
|
||||
/* ! . */
|
||||
uint16_t miniServerPort4;
|
||||
/* ! . */
|
||||
uint16_t miniServerPort6;
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
/*! IPv4 SSDP socket for sending search requests and receiving search
|
||||
* replies */
|
||||
SOCKET ssdpReqSock4;
|
||||
/*! IPv6 SSDP socket for sending search requests and receiving search
|
||||
* replies */
|
||||
SOCKET ssdpReqSock6;
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
} MiniServerSockArray;
|
||||
|
||||
|
||||
/*! . */
|
||||
typedef void (*MiniServerCallback)(
|
||||
/* ! . */
|
||||
IN http_parser_t *parser,
|
||||
/* ! . */
|
||||
IN http_message_t* request,
|
||||
IN SOCKINFO *info );
|
||||
/* ! . */
|
||||
IN SOCKINFO *info);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -88,7 +106,7 @@ void SetSoapCallback(
|
||||
/*! [in] SOAP Callback to be invoked . */
|
||||
MiniServerCallback callback);
|
||||
#else /* INCLUDE_DEVICE_APIS */
|
||||
static inline void SetSoapCallback(MiniServerCallback callback) {}
|
||||
static UPNP_INLINE void SetSoapCallback(MiniServerCallback callback) {}
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
|
||||
@@ -116,9 +134,11 @@ void SetGenaCallback(
|
||||
* \li On error: UPNP_E_XXX.
|
||||
*/
|
||||
int StartMiniServer(
|
||||
/*! [in,out] Port on which the server listens for incoming IPv4 connections. */
|
||||
/*! [in,out] Port on which the server listens for incoming IPv4
|
||||
* connections. */
|
||||
unsigned short *listen_port4,
|
||||
/*! [in,out] Port on which the server listens for incoming IPv6 connections. */
|
||||
/*! [in,out] Port on which the server listens for incoming IPv6
|
||||
* connections. */
|
||||
unsigned short *listen_port6);
|
||||
|
||||
|
||||
|
||||
@@ -1,63 +1,61 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
#define GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
|
||||
#include "util.h"
|
||||
#include "httpparser.h"
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "upnputil.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t* hmsg ; HTTP Message object
|
||||
*
|
||||
* Description: Find the header from the HTTP message and match the
|
||||
* header for xml data.
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
xboolean has_xml_content_type( IN http_message_t* hmsg );
|
||||
/*!
|
||||
* \brief Find the header from the HTTP message and match the header for
|
||||
* xml data.
|
||||
*
|
||||
* \return boolean.
|
||||
*/
|
||||
int has_xml_content_type(
|
||||
/*! HTTP Message object. */
|
||||
IN http_message_t *hmsg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern C
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
#endif /* GENLIB_NET_HTTP_PARSETOOLS_H */
|
||||
|
||||
#endif // GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
|
||||
@@ -29,38 +29,30 @@
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#ifndef SERVICE_TABLE_H
|
||||
#define SERVICE_TABLE_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include "config.h"
|
||||
#include "uri.h"
|
||||
#include "ixml.h"
|
||||
#include "upnp.h"
|
||||
#include "upnpdebug.h"
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#define SID_SIZE 41
|
||||
|
||||
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
|
||||
|
||||
typedef struct SUBSCRIPTION {
|
||||
Upnp_SID sid;
|
||||
int eventKey;
|
||||
@@ -71,7 +63,6 @@ typedef struct SUBSCRIPTION {
|
||||
struct SUBSCRIPTION *next;
|
||||
} subscription;
|
||||
|
||||
|
||||
typedef struct SERVICE_INFO {
|
||||
DOMString serviceType;
|
||||
DOMString serviceId;
|
||||
@@ -85,21 +76,18 @@ typedef struct SERVICE_INFO {
|
||||
struct SERVICE_INFO *next;
|
||||
} service_info;
|
||||
|
||||
|
||||
typedef struct SERVICE_TABLE {
|
||||
DOMString URLBase;
|
||||
service_info *serviceList;
|
||||
service_info *endServiceList;
|
||||
} service_table;
|
||||
|
||||
|
||||
/* Functions for Subscriptions */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Makes a copy of the subscription.
|
||||
*
|
||||
* \return HTTP_SUCCESS on Sucess.
|
||||
* \return HTTP_SUCCESS on success.
|
||||
*/
|
||||
int copy_subscription(
|
||||
/*! [in] Source subscription. */
|
||||
@@ -107,7 +95,6 @@ int copy_subscription(
|
||||
/*! [in] Destination subscription. */
|
||||
subscription *out);
|
||||
|
||||
|
||||
/*
|
||||
* \brief Remove the subscription represented by the const Upnp_SID sid parameter
|
||||
* from the service table and update the service table.
|
||||
@@ -118,7 +105,6 @@ void RemoveSubscriptionSID(
|
||||
/*! [in] Service object providing the list of subscriptions. */
|
||||
service_info *service);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Return the subscription from the service table that matches
|
||||
* const Upnp_SID sid value.
|
||||
@@ -130,7 +116,6 @@ subscription *GetSubscriptionSID(
|
||||
const Upnp_SID sid,
|
||||
/*! [in] Service object providing the list of subscriptions. */
|
||||
service_info *service);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Gets pointer to the first subscription node in the service table.
|
||||
@@ -141,7 +126,6 @@ subscription *GetFirstSubscription(
|
||||
/*! [in] Service object providing the list of subscriptions. */
|
||||
service_info *service);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Get current and valid subscription from the service table.
|
||||
*
|
||||
@@ -153,7 +137,6 @@ subscription *GetNextSubscription(
|
||||
/*! [in] Current subscription object. */
|
||||
subscription *current);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's the memory allocated for storing the URL of the subscription.
|
||||
*/
|
||||
@@ -161,7 +144,6 @@ void freeSubscription(
|
||||
/*! [in] Subscription object to be freed. */
|
||||
subscription *sub);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's memory allocated for all the subscriptions in the service table.
|
||||
*/
|
||||
@@ -169,7 +151,6 @@ void freeSubscriptionList(
|
||||
/*! [in] Head of the subscription list. */
|
||||
subscription * head);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses through the service table and returns a pointer to the
|
||||
* service node that matches a known service id and a known UDN.
|
||||
@@ -186,7 +167,6 @@ service_info *FindServiceId(
|
||||
* table. */
|
||||
const char *UDN);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses the service table and finds the node whose event URL Path
|
||||
* matches a know value.
|
||||
@@ -200,7 +180,6 @@ service_info *FindServiceEventURLPath(
|
||||
/*! [in] Event URL path used to find a service from the table. */
|
||||
char *eventURLPath);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses the service table and finds the node whose control URL Path
|
||||
* matches a know value.
|
||||
@@ -214,7 +193,6 @@ service_info * FindServiceControlURLPath(
|
||||
/*! [in] Control URL path used to find a service from the table. */
|
||||
const char *controlURLPath);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief For debugging purposes prints information from the service passed
|
||||
* into the function.
|
||||
@@ -231,10 +209,15 @@ void printService(
|
||||
static UPNP_INLINE void printService(
|
||||
service_info *service,
|
||||
Upnp_LogLevel level,
|
||||
Dbg_Module module) {}
|
||||
Dbg_Module module)
|
||||
{
|
||||
return;
|
||||
service = service;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief For debugging purposes prints information of each service from the
|
||||
* service table passed into the function.
|
||||
@@ -251,10 +234,15 @@ void printServiceList(
|
||||
static UPNP_INLINE void printServiceList(
|
||||
service_info *service,
|
||||
Upnp_LogLevel level,
|
||||
Dbg_Module module) {}
|
||||
Dbg_Module module)
|
||||
{
|
||||
return;
|
||||
service = service;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief For debugging purposes prints the URL base of the table and information
|
||||
* of each service from the service table passed into the function.
|
||||
@@ -271,10 +259,15 @@ void printServiceTable(
|
||||
static UPNP_INLINE void printServiceTable(
|
||||
service_table *table,
|
||||
Upnp_LogLevel level,
|
||||
Dbg_Module module) {}
|
||||
Dbg_Module module)
|
||||
{
|
||||
return;
|
||||
table = table;
|
||||
level = level;
|
||||
module = module;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's memory allocated for the various components of the service
|
||||
* entry in the service table.
|
||||
@@ -283,7 +276,6 @@ void freeService(
|
||||
/*! [in] Service information that is to be freed. */
|
||||
service_info *in);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's memory allocated for the various components of each service
|
||||
* entry in the service table.
|
||||
@@ -292,7 +284,6 @@ void freeServiceList(
|
||||
/*! [in] Head of the service list to be freed. */
|
||||
service_info *head);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Free's dynamic memory in table (does not free table, only memory
|
||||
* within the structure).
|
||||
@@ -301,7 +292,6 @@ void freeServiceTable(
|
||||
/*! [in] Service table whose internal memory needs to be freed. */
|
||||
service_table *table);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief This function assumes that services for a particular root device are
|
||||
* placed linearly in the service table, and in the order in which they are
|
||||
@@ -316,7 +306,6 @@ int removeServiceTable(
|
||||
/*! [in] Service table from which services will be removed. */
|
||||
service_table *in);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Add Service to the table.
|
||||
*/
|
||||
@@ -329,7 +318,6 @@ int addServiceTable(
|
||||
* service list. */
|
||||
const char *DefaultURLBase);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Retrieve service from the table.
|
||||
*
|
||||
@@ -343,10 +331,8 @@ int getServiceTable(
|
||||
/*! [in] Default base URL on which the URL will be returned. */
|
||||
const char *DefaultURLBase);
|
||||
|
||||
|
||||
/* Misc helper functions */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Returns the clone of the element value.
|
||||
*
|
||||
@@ -358,7 +344,6 @@ DOMString getElementValue(
|
||||
/*! [in] Input node which provides the list of child nodes. */
|
||||
IXML_Node *node);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Traverses through a list of XML nodes to find the node with the
|
||||
* known element name.
|
||||
@@ -375,7 +360,6 @@ int getSubElement(
|
||||
/*! [out] Ouput node to which the matched child node is returned. */
|
||||
IXML_Node **out);
|
||||
|
||||
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -1,133 +1,129 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 SOAPLIB_H
|
||||
#define SOAPLIB_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
// SOAP module API to be called in Upnp-Dk API
|
||||
/****************************************************************************
|
||||
* Function : soap_device_callback
|
||||
*
|
||||
* Parameters :
|
||||
* IN http_parser_t *parser : Parsed request received by the device
|
||||
* IN http_message_t* request : HTTP request
|
||||
* INOUT SOCKINFO *info : socket info
|
||||
*
|
||||
* Description : This is a callback called by minisever after receiving
|
||||
* the request from the control point. This function will start
|
||||
* processing the request. It calls handle_invoke_action to handle the
|
||||
* SOAP action
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
/* SOAP module API to be called in Upnp-Dk API */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief This is a callback called by minisever after receiving the request
|
||||
* from the control point. This function will start processing the request.
|
||||
* It calls handle_invoke_action to handle the SOAP action.
|
||||
*/
|
||||
void soap_device_callback(
|
||||
IN http_parser_t *parser,
|
||||
IN http_message_t* request,
|
||||
INOUT SOCKINFO *info );
|
||||
/*! [in] Parsed request received by the device. */
|
||||
http_parser_t *parser,
|
||||
/*! [in] HTTP request. */
|
||||
http_message_t *request,
|
||||
/*! [in,out] Socket info. */
|
||||
SOCKINFO *info);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Function : SoapSendAction
|
||||
*
|
||||
* Parameters :
|
||||
* IN char* action_url : device contrl URL
|
||||
* IN char *service_type : device service type
|
||||
* IN IXML_Document *action_node : SOAP action node
|
||||
* OUT IXML_Document **response_node : SOAP response node
|
||||
*
|
||||
* Description : This function is called by UPnP API to send the SOAP
|
||||
* action request and waits till it gets the response from the device
|
||||
* pass the response to the API layer
|
||||
*
|
||||
* Return : int
|
||||
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
int SoapSendAction(
|
||||
IN char* action_url,
|
||||
IN char *service_type,
|
||||
IN IXML_Document *action_node,
|
||||
OUT IXML_Document **response_node );
|
||||
* Function: SoapSendAction
|
||||
*
|
||||
* Parameters:
|
||||
* IN char* action_url: device contrl URL
|
||||
* IN char *service_type: device service type
|
||||
* IN IXML_Document *action_node: SOAP action node
|
||||
* OUT IXML_Document **response_node: SOAP response node
|
||||
*
|
||||
* Description: This function is called by UPnP API to send the SOAP
|
||||
* action request and waits till it gets the response from the device
|
||||
* pass the response to the API layer
|
||||
*
|
||||
* Return: int
|
||||
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
* Note:
|
||||
****************************************************************************/
|
||||
int SoapSendAction(
|
||||
IN char* action_url,
|
||||
IN char *service_type,
|
||||
IN IXML_Document *action_node,
|
||||
OUT IXML_Document **response_node);
|
||||
|
||||
/****************************************************************************
|
||||
* Function : SoapSendActionEx
|
||||
*
|
||||
* Parameters :
|
||||
* IN char* action_url : device contrl URL
|
||||
* IN char *service_type : device service type
|
||||
IN IXML_Document *Header: Soap header
|
||||
* IN IXML_Document *action_node : SOAP action node ( SOAP body)
|
||||
* OUT IXML_Document **response_node : SOAP response node
|
||||
*
|
||||
* Description : This function is called by UPnP API to send the SOAP
|
||||
* action request and waits till it gets the response from the device
|
||||
* pass the response to the API layer. This action is similar to the
|
||||
* the SoapSendAction with only difference that it allows users to
|
||||
* pass the SOAP header along the SOAP body ( soap action request)
|
||||
*
|
||||
* Return : int
|
||||
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
* Function: SoapSendActionEx
|
||||
*
|
||||
* Parameters:
|
||||
* IN char* action_url: device contrl URL
|
||||
* IN char *service_type: device service type
|
||||
* IN IXML_Document *Header: Soap header
|
||||
* IN IXML_Document *action_node: SOAP action node (SOAP body)
|
||||
* OUT IXML_Document **response_node: SOAP response node
|
||||
*
|
||||
* Description: This function is called by UPnP API to send the SOAP
|
||||
* action request and waits till it gets the response from the device
|
||||
* pass the response to the API layer. This action is similar to the
|
||||
* the SoapSendAction with only difference that it allows users to
|
||||
* pass the SOAP header along the SOAP body ( soap action request)
|
||||
*
|
||||
* Return: int
|
||||
* returns UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
* Note:
|
||||
****************************************************************************/
|
||||
int SoapSendActionEx(
|
||||
IN char * ActionURL,
|
||||
IN char *ServiceType,
|
||||
IN IXML_Document *Header,
|
||||
IN IXML_Document *ActNode ,
|
||||
OUT IXML_Document **RespNode) ;
|
||||
IN char * ActionURL,
|
||||
IN char *ServiceType,
|
||||
IN IXML_Document *Header,
|
||||
IN IXML_Document *ActNode,
|
||||
OUT IXML_Document **RespNode);
|
||||
|
||||
/****************************************************************************
|
||||
* Function : SoapGetServiceVarStatus
|
||||
*
|
||||
* Parameters :
|
||||
* IN char * action_url : Address to send this variable
|
||||
* query message.
|
||||
* IN char *var_name : Name of the variable.
|
||||
* OUT char **var_value : Output value.
|
||||
*
|
||||
* Description : This function creates a status variable query message
|
||||
* send it to the specified URL. It also collect the response.
|
||||
*
|
||||
* Return : int
|
||||
*
|
||||
* Note :
|
||||
****************************************************************************/
|
||||
* Function: SoapGetServiceVarStatus
|
||||
*
|
||||
* Parameters:
|
||||
* IN char * action_url: Address to send this variable query message.
|
||||
* IN char *var_name: Name of the variable.
|
||||
* OUT char **var_value: Output value.
|
||||
*
|
||||
* Description: This function creates a status variable query message
|
||||
* send it to the specified URL. It also collect the response.
|
||||
*
|
||||
* Return: int
|
||||
*
|
||||
* Note:
|
||||
****************************************************************************/
|
||||
int SoapGetServiceVarStatus(
|
||||
IN char * ActionURL,
|
||||
IN DOMString VarName,
|
||||
OUT DOMString *StVar) ;
|
||||
IN char * ActionURL,
|
||||
IN DOMString VarName,
|
||||
OUT DOMString *StVar);
|
||||
|
||||
extern const char* ContentTypeHeader;
|
||||
|
||||
#endif //SOAPLIB_H
|
||||
#endif /* SOAPLIB_H */
|
||||
|
||||
|
||||
@@ -29,13 +29,14 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef GENLIB_NET_SOCK_H
|
||||
#define GENLIB_NET_SOCK_H
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "util.h"
|
||||
|
||||
#include "upnputil.h"
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <netinet/in.h> */
|
||||
@@ -43,135 +44,128 @@
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
|
||||
/* Following variable is not defined under winsock.h */
|
||||
/* The following are not defined under winsock.h */
|
||||
#ifndef SD_RECEIVE
|
||||
#define SD_RECEIVE 0x00
|
||||
#define SD_SEND 0x01
|
||||
#define SD_BOTH 0x02
|
||||
#define SD_RECEIVE 0x00
|
||||
#define SD_SEND 0x01
|
||||
#define SD_BOTH 0x02
|
||||
#endif
|
||||
|
||||
|
||||
/*! */
|
||||
typedef struct
|
||||
{
|
||||
/* handle/descriptor to a socket */
|
||||
/*! Handle/descriptor to a socket. */
|
||||
SOCKET socket;
|
||||
|
||||
/* the following two fields are filled only in incoming requests; */
|
||||
/*! The following two fields are filled only in incoming requests. */
|
||||
struct sockaddr_storage foreign_sockaddr;
|
||||
} SOCKINFO;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
#extern "C" {
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \brief Assign the passed in socket descriptor to socket descriptor in the
|
||||
* SOCKINFO structure.
|
||||
*
|
||||
* \return Integer:
|
||||
* \li \c UPNP_E_SUCCESS
|
||||
* \li \c UPNP_E_OUTOF_MEMORY
|
||||
* \li \c UPNP_E_SOCKET_ERROR
|
||||
*/
|
||||
int sock_init(
|
||||
/*! Socket Information Object. */
|
||||
OUT SOCKINFO *info,
|
||||
/*! Socket Descriptor. */
|
||||
IN SOCKET sockfd);
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_init
|
||||
*
|
||||
* Parameters :
|
||||
* OUT SOCKINFO* info ; Socket Information Object
|
||||
* IN SOCKET sockfd ; Socket Descriptor
|
||||
*
|
||||
* Description : Assign the passed in socket descriptor to socket
|
||||
* descriptor in the SOCKINFO structure.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int sock_init(OUT SOCKINFO* info, IN SOCKET sockfd);
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_init_with_ip
|
||||
*
|
||||
* Parameters :
|
||||
* OUT SOCKINFO* info ; Socket Information Object
|
||||
* IN SOCKET sockfd ; Socket Descriptor
|
||||
* IN struct sockaddr* foreign_sockaddr; Remote socket address
|
||||
*
|
||||
* Description : Calls the sock_init function and assigns the passed in
|
||||
* IP address and port to the IP address and port in the SOCKINFO
|
||||
* structure.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* UPNP_E_SOCKET_ERROR
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
/*!
|
||||
* \brief Calls the sock_init function and assigns the passed in IP address
|
||||
* and port to the IP address and port in the SOCKINFO structure.
|
||||
*
|
||||
* \return Integer:
|
||||
* \li \c UPNP_E_SUCCESS
|
||||
* \li \c UPNP_E_OUTOF_MEMORY
|
||||
* \li \c UPNP_E_SOCKET_ERROR
|
||||
*/
|
||||
int sock_init_with_ip(
|
||||
/*! Socket Information Object. */
|
||||
OUT SOCKINFO* info,
|
||||
/*! Socket Descriptor. */
|
||||
IN SOCKET sockfd,
|
||||
/*! Remote socket address. */
|
||||
IN struct sockaddr *foreign_sockaddr);
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_read
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info ; Socket Information Object
|
||||
* OUT char* buffer ; Buffer to get data to
|
||||
* IN size_t bufsize ; Size of the buffer
|
||||
* IN int *timeoutSecs ; timeout value
|
||||
*
|
||||
* Description : Reads data on socket in sockinfo
|
||||
*
|
||||
* Return : int;
|
||||
* numBytes - On Success, no of bytes received
|
||||
* UPNP_E_TIMEDOUT - Timeout
|
||||
* UPNP_E_SOCKET_ERROR - Error on socket calls
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int sock_read( IN SOCKINFO *info, OUT char* buffer, IN size_t bufsize,
|
||||
INOUT int *timeoutSecs );
|
||||
/*!
|
||||
* \brief Reads data on socket in sockinfo.
|
||||
*
|
||||
* \return Integer:
|
||||
* \li \c numBytes - On Success, no of bytes received.
|
||||
* \li \c UPNP_E_TIMEDOUT - Timeout.
|
||||
* \li \c UPNP_E_SOCKET_ERROR - Error on socket calls.
|
||||
*/
|
||||
int sock_read(
|
||||
/*! Socket Information Object. */
|
||||
IN SOCKINFO *info,
|
||||
/*! Buffer to get data to. */
|
||||
OUT char* buffer,
|
||||
/*! Size of the buffer. */
|
||||
IN int bufsize,
|
||||
/*! timeout value. */
|
||||
INOUT int *timeoutSecs);
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_write
|
||||
*
|
||||
* Parameters :
|
||||
* IN SOCKINFO *info ; Socket Information Object
|
||||
* IN char* buffer ; Buffer to send data from
|
||||
* IN size_t bufsize ; Size of the buffer
|
||||
* IN int *timeoutSecs ; timeout value
|
||||
*
|
||||
* Description : Writes data on the socket in sockinfo
|
||||
*
|
||||
* Return : int;
|
||||
* numBytes - On Success, no of bytes sent
|
||||
* UPNP_E_TIMEDOUT - Timeout
|
||||
* UPNP_E_SOCKET_ERROR - Error on socket calls
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int sock_write( IN SOCKINFO *info, IN char* buffer, IN size_t bufsize,
|
||||
INOUT int *timeoutSecs );
|
||||
/*!
|
||||
* \brief Writes data on the socket in sockinfo.
|
||||
*
|
||||
* \return Integer:
|
||||
* \li \c numBytes - On Success, no of bytes received.
|
||||
* \li \c UPNP_E_TIMEDOUT - Timeout.
|
||||
* \li \c UPNP_E_SOCKET_ERROR - Error on socket calls.
|
||||
*/
|
||||
int sock_write(
|
||||
/*! Socket Information Object. */
|
||||
IN SOCKINFO *info,
|
||||
/*! Buffer to send data from. */
|
||||
IN const char *buffer,
|
||||
/*! Size of the buffer. */
|
||||
IN int bufsize,
|
||||
/*! timeout value. */
|
||||
INOUT int *timeoutSecs);
|
||||
|
||||
/************************************************************************
|
||||
* Function : sock_destroy
|
||||
*
|
||||
* Parameters :
|
||||
* INOUT SOCKINFO* info ; Socket Information Object
|
||||
* int ShutdownMethod ; How to shutdown the socket. Used by
|
||||
* sockets's shutdown()
|
||||
*
|
||||
* Description : Shutsdown the socket using the ShutdownMethod to
|
||||
* indicate whether sends and receives on the socket will be
|
||||
* dis-allowed. After shutting down the socket, closesocket is called
|
||||
* to release system resources used by the socket calls.
|
||||
*
|
||||
* Return : int;
|
||||
* UPNP_E_SOCKET_ERROR on failure
|
||||
* UPNP_E_SUCCESS on success
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int sock_destroy(INOUT SOCKINFO* info, int);
|
||||
/*!
|
||||
* \brief Shutsdown the socket using the ShutdownMethod to indicate whether
|
||||
* sends and receives on the socket will be dis-allowed.
|
||||
*
|
||||
* After shutting down the socket, closesocket is called to release system
|
||||
* resources used by the socket calls.
|
||||
*
|
||||
* \return Integer:
|
||||
* \li \c UPNP_E_SOCKET_ERROR on failure.
|
||||
* \li \c UPNP_E_SUCCESS on success.
|
||||
*/
|
||||
int sock_destroy(
|
||||
/*! Socket Information Object. */
|
||||
INOUT SOCKINFO* info,
|
||||
/*! How to shutdown the socket. Used by sockets's shutdown(). */
|
||||
int ShutdownMethod);
|
||||
|
||||
/*!
|
||||
* \brief Closes the socket if it is different from -1.
|
||||
*
|
||||
* \return -1 if an error occurred or if the socket is -1.
|
||||
*/
|
||||
static UPNP_INLINE int sock_close(
|
||||
/*! Socket descriptor. */
|
||||
SOCKET sock)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
if (sock != -1) {
|
||||
ret = UpnpCloseSocket(sock);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* #extern "C" */
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef SSDPLIB_H
|
||||
#define SSDPLIB_H
|
||||
|
||||
@@ -47,15 +46,17 @@
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#else
|
||||
#else /* WIN32 */
|
||||
#include <syslog.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/ip_icmp.h>
|
||||
#ifndef __APPLE__
|
||||
#include <netinet/in_systm.h>
|
||||
#include <netinet/ip.h>
|
||||
#include <netinet/ip_icmp.h>
|
||||
#endif /* __APPLE__ */
|
||||
#include <sys/time.h>
|
||||
#include <arpa/inet.h>
|
||||
#endif
|
||||
#endif /* WIN32 */
|
||||
|
||||
|
||||
/* Enumeration to define all different types of ssdp searches */
|
||||
@@ -88,7 +89,6 @@ typedef enum SsdpCmdType{
|
||||
#define SSDP_IPV6_SITELOCAL "FF05::C"
|
||||
#define SSDP_PORT 1900
|
||||
#define NUM_TRY 3
|
||||
#define NUM_COPY 1
|
||||
#define THREAD_LIMIT 50
|
||||
#define COMMAND_LEN 300
|
||||
|
||||
@@ -112,11 +112,8 @@ typedef enum SsdpCmdType{
|
||||
#define E_SOCKET -7
|
||||
#define RQST_TIMEOUT 20
|
||||
|
||||
|
||||
|
||||
/* Structure to store the SSDP information */
|
||||
typedef struct SsdpEventStruct
|
||||
{
|
||||
/*! Structure to store the SSDP information */
|
||||
typedef struct SsdpEventStruct {
|
||||
enum SsdpCmdType Cmd;
|
||||
enum SsdpSearchType RequestType;
|
||||
int ErrCode;
|
||||
@@ -124,7 +121,8 @@ typedef struct SsdpEventStruct
|
||||
int Mx;
|
||||
char UDN[LINE_SIZE];
|
||||
char DeviceType[LINE_SIZE];
|
||||
char ServiceType[LINE_SIZE]; //NT or ST
|
||||
/* NT or ST */
|
||||
char ServiceType[LINE_SIZE];
|
||||
char Location[LINE_SIZE];
|
||||
char HostAddr[LINE_SIZE];
|
||||
char Os[LINE_SIZE];
|
||||
@@ -138,13 +136,13 @@ typedef void (* SsdpFunPtr)(Event *);
|
||||
|
||||
typedef Event SsdpEvent ;
|
||||
|
||||
//Structure to contain Discovery response
|
||||
/*! Structure to contain Discovery response. */
|
||||
typedef struct resultData
|
||||
{
|
||||
struct Upnp_Discovery param;
|
||||
void *cookie;
|
||||
Upnp_FunPtr ctrlpt_callback;
|
||||
}ResultData;
|
||||
struct Upnp_Discovery param;
|
||||
void *cookie;
|
||||
Upnp_FunPtr ctrlpt_callback;
|
||||
} ResultData;
|
||||
|
||||
|
||||
typedef struct TData
|
||||
@@ -154,7 +152,7 @@ typedef struct TData
|
||||
char * Data;
|
||||
struct sockaddr_storage DestAddr;
|
||||
|
||||
}ThreadData;
|
||||
} ThreadData;
|
||||
|
||||
typedef struct ssdpsearchreply
|
||||
{
|
||||
@@ -163,7 +161,7 @@ typedef struct ssdpsearchreply
|
||||
struct sockaddr_storage dest_addr;
|
||||
SsdpEvent event;
|
||||
|
||||
}SsdpSearchReply;
|
||||
} SsdpSearchReply;
|
||||
|
||||
typedef struct ssdpsearcharg
|
||||
{
|
||||
@@ -183,9 +181,12 @@ typedef struct
|
||||
|
||||
/* globals */
|
||||
|
||||
CLIENTONLY(extern SOCKET gSsdpReqSocket4;);
|
||||
CLIENTONLY(extern SOCKET gSsdpReqSocket6;);
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
extern SOCKET gSsdpReqSocket4;
|
||||
#ifdef UPNP_ENABLE_IPV6
|
||||
extern SOCKET gSsdpReqSocket6;
|
||||
#endif /* UPNP_ENABLE_IPV6 */
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
typedef int (*ParserFun)(char *, Event *);
|
||||
|
||||
|
||||
@@ -219,12 +220,12 @@ int Make_Socket_NoBlocking (int sock);
|
||||
***************************************************************************/
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
void ssdp_handle_device_request(
|
||||
IN http_message_t* hmsg,
|
||||
IN struct sockaddr* dest_addr );
|
||||
IN http_message_t *hmsg,
|
||||
IN struct sockaddr *dest_addr);
|
||||
#else
|
||||
static inline void ssdp_handle_device_request(
|
||||
IN http_message_t* hmsg,
|
||||
IN struct sockaddr* dest_addr ) {}
|
||||
IN http_message_t *hmsg,
|
||||
IN struct sockaddr* dest_addr) {}
|
||||
#endif
|
||||
|
||||
/************************************************************************
|
||||
@@ -233,7 +234,7 @@ static inline void ssdp_handle_device_request(
|
||||
* Parameters:
|
||||
* IN http_message_t* hmsg: SSDP message from the device
|
||||
* IN struct sockaddr* dest_addr: Address of the device
|
||||
* IN xboolean timeout: timeout kept by the control point while sending
|
||||
* IN int timeout: timeout kept by the control point while sending
|
||||
* search message
|
||||
* IN void* cookie: Cookie stored by the control point application.
|
||||
* This cookie will be returned to the control point
|
||||
@@ -248,10 +249,10 @@ static inline void ssdp_handle_device_request(
|
||||
*
|
||||
***************************************************************************/
|
||||
void ssdp_handle_ctrlpt_msg(
|
||||
IN http_message_t* hmsg,
|
||||
IN struct sockaddr* dest_addr,
|
||||
IN xboolean timeout,
|
||||
IN void* cookie );
|
||||
IN http_message_t *hmsg,
|
||||
IN struct sockaddr *dest_addr,
|
||||
IN int timeout,
|
||||
IN void *cookie);
|
||||
|
||||
/************************************************************************
|
||||
* Function : unique_service_name
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user