Compare commits
10 Commits
release-1.
...
release-1.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6ac867bbb1 | ||
![]() |
9052ca95be | ||
![]() |
ef7edf6cf8 | ||
![]() |
c65ec8a720 | ||
![]() |
2d22e997e1 | ||
![]() |
96dc968f18 | ||
![]() |
8e846368e0 | ||
![]() |
d6671c464f | ||
![]() |
699dd3c82e | ||
![]() |
9be360bcd1 |
48
ChangeLog
48
ChangeLog
@@ -1,3 +1,51 @@
|
||||
*******************************************************************************
|
||||
Version 1.6.9
|
||||
*******************************************************************************
|
||||
|
||||
2010-10-20 Marcelo Roberto Jimenez <mroberto(at)users.sourceforge.net>
|
||||
|
||||
Fix for bug introduced in samples code in svn revision 502, commit
|
||||
git:25c908c558c8e60eb386c155a6b93add447ffec0
|
||||
|
||||
Sample device and combo were aborting with the message:
|
||||
"***** SampleUtil_Initialize was called multiple times!"
|
||||
|
||||
2010-11-08 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Make multiple SSDP advertisements faster.
|
||||
|
||||
Put the loop to send multiple copies of each SSDP advertisements in
|
||||
ssdp_server.c instead of ssdp_device.c so we have only one call to
|
||||
imillisleep ( SSDP_PAUSE ) to speed up advertisements.
|
||||
|
||||
2010-11-05 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Removing unused NUM_COPY variable.
|
||||
|
||||
Previously, NUM_COPY was used in ssdp_device.c to send multiple copies
|
||||
of each advertisements but also multiple replies to each M-SEARCH
|
||||
request. As sending multiple replies is not compliant with HTTPU/MU
|
||||
spec, NUM_COPY has been set to 1 in an older patch. However, as this
|
||||
variable is not needed and has been replaced with SSDP_COPY, it has
|
||||
been removed.
|
||||
|
||||
2010-11-05 Fabrice Fontaine <fabrice.fontaine(at)orange-ftgroup.com>
|
||||
|
||||
Use SSDP_COPY to send multiple SSDP advertisements.
|
||||
|
||||
Currently, SSDP_COPY is used only to send multiple M-SEARCH requests (in
|
||||
ssdp_ctrlpt.c). With this patch, SSDP_COPY is also used to send multiple
|
||||
copies of each advertisements packets (in ssdp_device.c).
|
||||
|
||||
2010-11-01 Carl Benson <carl.benson(at)windriver.com>
|
||||
|
||||
Fix for Android build.
|
||||
|
||||
I had to do some modifications myself though, because the Android
|
||||
build system insists on having a file named "util.h" taking precedence
|
||||
in its include path, libupnp gets confused because of the same filename
|
||||
in upnp/src/inc/util.h
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.6.8
|
||||
*******************************************************************************
|
||||
|
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.8
|
||||
PROJECT_NUMBER = 1.6.9
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
|
1
THANKS
1
THANKS
@@ -13,6 +13,7 @@ exempt of errors.
|
||||
- Arno Willig
|
||||
- Bob Ciora
|
||||
- Carlo Parata
|
||||
- Carl Benson
|
||||
- Chandra (inactiveneurons)
|
||||
- Chaos
|
||||
- Charles Nepveu (cnepveu)
|
||||
|
@@ -105,13 +105,13 @@
|
||||
#define PACKAGE_NAME "libupnp"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "libupnp 1.6.8"
|
||||
#define PACKAGE_STRING "libupnp 1.6.9"
|
||||
|
||||
/* 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.6.8"
|
||||
#define PACKAGE_VERSION "1.6.9"
|
||||
|
||||
/* Define to necessary symbol if this constant uses a non-standard name on
|
||||
your system. */
|
||||
@@ -151,13 +151,13 @@
|
||||
#define UPNP_VERSION_MINOR 6
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_PATCH 8
|
||||
#define UPNP_VERSION_PATCH 9
|
||||
|
||||
/* see upnpconfig.h */
|
||||
#define UPNP_VERSION_STRING "1.6.8"
|
||||
#define UPNP_VERSION_STRING "1.6.9"
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "1.6.8"
|
||||
#define VERSION "1.6.9"
|
||||
|
||||
/* File Offset size */
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
|
@@ -40,7 +40,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
/** The library version (string) e.g. "1.3.0" */
|
||||
#define UPNP_VERSION_STRING "1.6.8"
|
||||
#define UPNP_VERSION_STRING "1.6.9"
|
||||
|
||||
/** Major version of the library */
|
||||
#define UPNP_VERSION_MAJOR 1
|
||||
@@ -49,7 +49,7 @@
|
||||
#define UPNP_VERSION_MINOR 6
|
||||
|
||||
/** Patch version of the library */
|
||||
#define UPNP_VERSION_PATCH 8
|
||||
#define UPNP_VERSION_PATCH 9
|
||||
|
||||
/** The library version (numeric) e.g. 10300 means version 1.3.0 */
|
||||
#define UPNP_VERSION \
|
||||
|
20
configure.ac
20
configure.ac
@@ -9,7 +9,7 @@
|
||||
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
AC_INIT([libupnp], [1.6.8], [mroberto@users.sourceforge.net])
|
||||
AC_INIT([libupnp], [1.6.9], [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:
|
||||
@@ -175,14 +175,28 @@ dnl # - Code has changed in threadutil
|
||||
dnl # revision: 0 -> 1
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 0 -> 1
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:1:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:1:0])
|
||||
dnl #
|
||||
dnl ############################################################################
|
||||
dnl # Release 1.6.9:
|
||||
dnl # "current:revision:age"
|
||||
dnl #
|
||||
dnl # - Code has changed in threadutil
|
||||
dnl # revision: 1 -> 2
|
||||
dnl # - Code has changed in upnp
|
||||
dnl # revision: 1 -> 2
|
||||
dnl #
|
||||
dnl #AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
dnl #AC_SUBST([LT_VERSION_THREADUTIL], [5:2:2])
|
||||
dnl #AC_SUBST([LT_VERSION_UPNP], [4:2:0])
|
||||
dnl #
|
||||
############################################################################
|
||||
AC_SUBST([LT_VERSION_IXML], [2:5:0])
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [5:1:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [4:1:0])
|
||||
AC_SUBST([LT_VERSION_THREADUTIL], [5:2:2])
|
||||
AC_SUBST([LT_VERSION_UPNP], [4:2:0])
|
||||
dnl ############################################################################
|
||||
dnl # Repeating the algorithm to place it closer to the modificatin place:
|
||||
dnl # - library code modified: revision++
|
||||
|
@@ -1,4 +1,4 @@
|
||||
Version: 1.6.8
|
||||
Version: 1.6.9
|
||||
Summary: Universal Plug and Play (UPnP) SDK
|
||||
Name: libupnp
|
||||
Release: 1%{?dist}
|
||||
|
@@ -188,7 +188,10 @@ typedef pthread_rwlockattr_t ithread_rwlockattr_t;
|
||||
* Internal Use Only
|
||||
***************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
typedef pthread_rwlock_t ithread_rwlock_t;
|
||||
typedef pthread_rwlock_t ithread_rwlock_t;
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
typedef ithread_mutex_t ithread_rwlock_t;
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
@@ -337,7 +340,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
#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
|
||||
@@ -362,7 +365,7 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_gettype
|
||||
#else
|
||||
#define ithread_mutexattr_getkind_np pthread_mutexattr_getkind_np
|
||||
#endif
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
@@ -536,8 +539,10 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
*****************************************************************************/
|
||||
#if UPNP_USE_RWLOCK
|
||||
#define ithread_rwlock_init pthread_rwlock_init
|
||||
#endif /* UPNP_USE_RWLOCK */
|
||||
|
||||
#else
|
||||
/* Read-write locks aren't available: use mutex instead. */
|
||||
#define ithread_rwlock_init ithread_mutex_init
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Function: ithread_rwlock_rdlock
|
||||
@@ -555,9 +560,11 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
*****************************************************************************/
|
||||
#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
|
||||
*
|
||||
@@ -574,6 +581,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
*****************************************************************************/
|
||||
#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 */
|
||||
|
||||
|
||||
@@ -594,6 +604,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
*****************************************************************************/
|
||||
#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 */
|
||||
|
||||
|
||||
@@ -615,6 +628,9 @@ static UPNP_INLINE int ithread_cleanup_thread(void) {
|
||||
*****************************************************************************/
|
||||
#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 */
|
||||
|
||||
|
||||
|
@@ -70,8 +70,7 @@ libupnp_la_SOURCES = \
|
||||
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
|
||||
|
@@ -82,9 +82,6 @@ int SampleUtil_Initialize(print_string print_function)
|
||||
ithread_mutex_unlock(&display_mutex);
|
||||
|
||||
initialize_init = 0;
|
||||
} else {
|
||||
SampleUtil_Print("***** SampleUtil_Initialize was called multiple times!\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
return UPNP_E_SUCCESS;
|
||||
|
@@ -122,6 +122,7 @@ ithread_mutex_t GlobalClientSubscribeMutex;
|
||||
/*! rwlock to synchronize handles (root device or control point handle). */
|
||||
ithread_rwlock_t GlobalHndRWLock;
|
||||
|
||||
|
||||
/*! Mutex to synchronize the uuid creation process. */
|
||||
ithread_mutex_t gUUIDMutex;
|
||||
|
||||
|
@@ -57,7 +57,7 @@
|
||||
#include "ThreadPool.h"
|
||||
#include "unixutil.h" /* for socklen_t, EAFNOSUPPORT */
|
||||
#include "upnpapi.h"
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
|
@@ -36,7 +36,7 @@
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "membuffer.h"
|
||||
#include "httpparser.h"
|
||||
#include "statcodes.h"
|
||||
|
@@ -37,7 +37,7 @@
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "statcodes.h"
|
||||
|
||||
#ifdef WIN32
|
||||
|
@@ -51,7 +51,7 @@
|
||||
#include "unixutil.h"
|
||||
#include "upnp.h"
|
||||
#include "upnpapi.h"
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "VirtualDir.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
@@ -37,7 +37,7 @@
|
||||
|
||||
#include "config.h"
|
||||
#include "upnp.h"
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
|
||||
#include <string.h>
|
||||
|
@@ -42,7 +42,7 @@
|
||||
#include "LinkedList.h"
|
||||
#include "membuffer.h"
|
||||
#include "uri.h"
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
|
||||
////// private types ////////////
|
||||
|
@@ -33,7 +33,7 @@
|
||||
#define GENLIB_NET_HTTP_HTTPREADWRITE_H
|
||||
|
||||
#include "config.h"
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
|
@@ -34,7 +34,7 @@
|
||||
|
||||
|
||||
#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) )
|
||||
|
@@ -32,7 +32,7 @@
|
||||
#ifndef GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
#define GENLIB_NET_HTTP_PARSETOOLS_H
|
||||
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
|
||||
|
@@ -36,7 +36,7 @@
|
||||
* \file
|
||||
*/
|
||||
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
#ifdef WIN32
|
||||
/* Do not #include <netinet/in.h> */
|
||||
|
@@ -90,7 +90,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
|
||||
|
||||
|
@@ -33,7 +33,7 @@
|
||||
#define GENLIB_UTIL_STRINTMAP_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
// Util to map from a string to an integer and vice versa
|
||||
|
||||
|
@@ -109,10 +109,8 @@ struct Handle_Info
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
extern ithread_rwlock_t GlobalHndRWLock;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Get handle information.
|
||||
*
|
||||
|
@@ -1,34 +0,0 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <genlib/util/util.h>
|
||||
#include <genlib/util/xstring.h>
|
||||
|
@@ -33,7 +33,7 @@
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
|
@@ -223,7 +223,6 @@ NewRequestHandler( IN struct sockaddr *DestAddr,
|
||||
char errorBuffer[ERROR_BUFFER_LEN];
|
||||
SOCKET ReplySock;
|
||||
int socklen = sizeof( struct sockaddr_storage );
|
||||
int NumCopy;
|
||||
int Index;
|
||||
unsigned long replyAddr = inet_addr( gIF_IPV4 );
|
||||
int ttl = 4; // a/c to UPNP Spec
|
||||
@@ -265,38 +264,20 @@ NewRequestHandler( IN struct sockaddr *DestAddr,
|
||||
|
||||
for( Index = 0; Index < NumPacket; Index++ ) {
|
||||
int rc;
|
||||
// The reason to keep this loop is purely historical/documentation,
|
||||
// according to section 9.2 of HTTPU spec:
|
||||
//
|
||||
// "If a multicast resource would send a response(s) to any copy of the
|
||||
// request, it SHOULD send its response(s) to each copy of the request
|
||||
// it receives. It MUST NOT repeat its response(s) per copy of the
|
||||
// request."
|
||||
//
|
||||
// http://www.upnp.org/download/draft-goland-http-udp-04.txt
|
||||
//
|
||||
// So, NUM_COPY has been changed from 2 to 1.
|
||||
NumCopy = 0;
|
||||
while( NumCopy < NUM_COPY ) {
|
||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||
">>> SSDP SEND to %s >>>\n%s\n",
|
||||
buf_ntop, *( RqPacket + Index ) );
|
||||
rc = sendto( ReplySock, *( RqPacket + Index ),
|
||||
strlen( *( RqPacket + Index ) ),
|
||||
0, DestAddr, socklen );
|
||||
|
||||
if (rc == -1) {
|
||||
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
|
||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||
">>> SSDP SEND to %s >>>\n%s\n",
|
||||
buf_ntop, *( RqPacket + Index ) );
|
||||
rc = sendto( ReplySock, *( RqPacket + Index ),
|
||||
strlen( *( RqPacket + Index ) ),
|
||||
0, DestAddr, socklen );
|
||||
|
||||
if (rc == -1) {
|
||||
strerror_r(errno, errorBuffer, ERROR_BUFFER_LEN);
|
||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||
"SSDP_LIB: New Request Handler:"
|
||||
"Error in socket(): %s\n", errorBuffer );
|
||||
ret = UPNP_E_SOCKET_WRITE;
|
||||
goto end_NewRequestHandler;
|
||||
}
|
||||
|
||||
imillisleep( SSDP_PAUSE );
|
||||
|
||||
++NumCopy;
|
||||
"SSDP_LIB: New Request Handler:"
|
||||
"Error in socket(): %s\n", errorBuffer );
|
||||
ret = UPNP_E_SOCKET_WRITE;
|
||||
goto end_NewRequestHandler;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -502,7 +483,7 @@ DeviceAdvertisement( IN char *DevType,
|
||||
//char Mil_Nt[LINE_SIZE]
|
||||
char Mil_Usn[LINE_SIZE];
|
||||
char *msgs[3];
|
||||
int ret_code;
|
||||
int ret_code = UPNP_E_SUCCESS;
|
||||
|
||||
UpnpPrintf( UPNP_INFO, SSDP, __FILE__, __LINE__,
|
||||
"In function DeviceAdvertisement\n" );
|
||||
@@ -751,7 +732,7 @@ ServiceAdvertisement( IN char *Udn,
|
||||
{
|
||||
char Mil_Usn[LINE_SIZE];
|
||||
char *szReq[1];
|
||||
int RetVal;
|
||||
int RetVal = UPNP_E_SUCCESS;
|
||||
struct sockaddr_storage __ss;
|
||||
struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss;
|
||||
struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss;
|
||||
@@ -860,7 +841,7 @@ ServiceShutdown( IN char *Udn,
|
||||
struct sockaddr_storage __ss;
|
||||
struct sockaddr_in* DestAddr4 = (struct sockaddr_in*)&__ss;
|
||||
struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss;
|
||||
int RetVal;
|
||||
int RetVal = UPNP_E_SUCCESS;
|
||||
|
||||
memset( &__ss, 0, sizeof(__ss) );
|
||||
if( AddressFamily == AF_INET ) {
|
||||
@@ -926,7 +907,7 @@ DeviceShutdown( IN char *DevType,
|
||||
struct sockaddr_in6* DestAddr6 = (struct sockaddr_in6*)&__ss;
|
||||
char *msgs[3];
|
||||
char Mil_Usn[LINE_SIZE];
|
||||
int ret_code;
|
||||
int ret_code = UPNP_E_SUCCESS;
|
||||
|
||||
msgs[0] = NULL;
|
||||
msgs[1] = NULL;
|
||||
|
@@ -135,6 +135,7 @@ int AdvertiseAndReply(
|
||||
const DOMString tmpStr;
|
||||
char SERVER[200];
|
||||
const DOMString dbgStr;
|
||||
int NumCopy = 0;
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Inside AdvertiseAndReply with AdFlag = %d\n", AdFlag);
|
||||
@@ -152,245 +153,251 @@ int AdvertiseAndReply(
|
||||
get_sdk_info(SERVER);
|
||||
|
||||
/* parse the device list and send advertisements/replies */
|
||||
for (i = 0;; i++) {
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Entering new device list with i = %d\n\n", i);
|
||||
tmpNode = ixmlNodeList_item(SInfo->DeviceList, i);
|
||||
if (!tmpNode) {
|
||||
while (NumCopy == 0 || (AdFlag && NumCopy < NUM_SSDP_COPY)) {
|
||||
if (NumCopy != 0)
|
||||
imillisleep(SSDP_PAUSE);
|
||||
NumCopy++;
|
||||
|
||||
for (i = 0;; i++) {
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Exiting new device list with i = %d\n\n", i);
|
||||
break;
|
||||
}
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Extracting device type once for %s\n", dbgStr);
|
||||
ixmlNodeList_free(nodeList);
|
||||
nodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "deviceType");
|
||||
if (!nodeList) continue;
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting UDN for %s\n", dbgStr);
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting device type\n");
|
||||
tmpNode2 = ixmlNodeList_item(nodeList, 0);
|
||||
if (!tmpNode2) continue;
|
||||
|
||||
textNode = ixmlNode_getFirstChild(tmpNode2);
|
||||
if (!textNode) continue;
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting device type \n");
|
||||
tmpStr = ixmlNode_getNodeValue(textNode);
|
||||
if (!tmpStr) continue;
|
||||
|
||||
strcpy(devType, tmpStr);
|
||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting device type = %s\n", devType);
|
||||
if (!tmpNode) {
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"TempNode is NULL\n");
|
||||
}
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting UDN for %s\n", dbgStr);
|
||||
ixmlNodeList_free(nodeList);
|
||||
nodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "UDN");
|
||||
if (!nodeList) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__,
|
||||
__LINE__, "UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
tmpNode2 = ixmlNodeList_item(nodeList, 0);
|
||||
if (!tmpNode2) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__,
|
||||
__LINE__, "UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
textNode = ixmlNode_getFirstChild(tmpNode2);
|
||||
if (!textNode) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__,
|
||||
__LINE__, "UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
tmpStr = ixmlNode_getNodeValue(textNode);
|
||||
if (!tmpStr) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
strcpy(UDNstr, tmpStr);
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Sending UDNStr = %s \n", UDNstr);
|
||||
if (AdFlag) {
|
||||
/* send the device advertisement */
|
||||
if (AdFlag == 1) {
|
||||
DeviceAdvertisement(devType, i == 0,
|
||||
UDNstr, SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
} else {
|
||||
/* AdFlag == -1 */
|
||||
DeviceShutdown(devType, i == 0, UDNstr,
|
||||
SERVER, SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
"Entering new device list with i = %d\n\n", i);
|
||||
tmpNode = ixmlNodeList_item(SInfo->DeviceList, i);
|
||||
if (!tmpNode) {
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Exiting new device list with i = %d\n\n", i);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (SearchType) {
|
||||
case SSDP_ALL:
|
||||
DeviceReply(DestAddr, devType, i == 0,
|
||||
UDNstr, SInfo->DescURL, defaultExp);
|
||||
break;
|
||||
case SSDP_ROOTDEVICE:
|
||||
if (i == 0) {
|
||||
SendReply(DestAddr, devType, 1,
|
||||
UDNstr, SInfo->DescURL, defaultExp, 0);
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Extracting device type once for %s\n", dbgStr);
|
||||
ixmlNodeList_free(nodeList);
|
||||
nodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "deviceType");
|
||||
if (!nodeList) continue;
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting UDN for %s\n", dbgStr);
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting device type\n");
|
||||
tmpNode2 = ixmlNodeList_item(nodeList, 0);
|
||||
if (!tmpNode2) continue;
|
||||
|
||||
textNode = ixmlNode_getFirstChild(tmpNode2);
|
||||
if (!textNode) continue;
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting device type \n");
|
||||
tmpStr = ixmlNode_getNodeValue(textNode);
|
||||
if (!tmpStr) continue;
|
||||
|
||||
strcpy(devType, tmpStr);
|
||||
UpnpPrintf( UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting device type = %s\n", devType);
|
||||
if (!tmpNode) {
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"TempNode is NULL\n");
|
||||
}
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
|
||||
UpnpPrintf(UPNP_ALL, API, __FILE__, __LINE__,
|
||||
"Extracting UDN for %s\n", dbgStr);
|
||||
ixmlNodeList_free(nodeList);
|
||||
nodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "UDN");
|
||||
if (!nodeList) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__,
|
||||
__LINE__, "UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
tmpNode2 = ixmlNodeList_item(nodeList, 0);
|
||||
if (!tmpNode2) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__,
|
||||
__LINE__, "UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
textNode = ixmlNode_getFirstChild(tmpNode2);
|
||||
if (!textNode) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__,
|
||||
__LINE__, "UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
tmpStr = ixmlNode_getNodeValue(textNode);
|
||||
if (!tmpStr) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"UDN not found!\n");
|
||||
continue;
|
||||
}
|
||||
strcpy(UDNstr, tmpStr);
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Sending UDNStr = %s \n", UDNstr);
|
||||
if (AdFlag) {
|
||||
/* send the device advertisement */
|
||||
if (AdFlag == 1) {
|
||||
DeviceAdvertisement(devType, i == 0,
|
||||
UDNstr, SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
} else {
|
||||
/* AdFlag == -1 */
|
||||
DeviceShutdown(devType, i == 0, UDNstr,
|
||||
SERVER, SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
}
|
||||
break;
|
||||
case SSDP_DEVICEUDN: {
|
||||
if (DeviceUDN && strlen(DeviceUDN) != 0) {
|
||||
if (strcasecmp(DeviceUDN, UDNstr)) {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceUDN=%s and search UDN=%s DID NOT match\n",
|
||||
UDNstr, DeviceUDN);
|
||||
break;
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceUDN=%s and search UDN=%s MATCH\n",
|
||||
UDNstr, DeviceUDN);
|
||||
SendReply(DestAddr, devType, 0,
|
||||
UDNstr, SInfo->DescURL,
|
||||
defaultExp, 0);
|
||||
break;
|
||||
} else {
|
||||
switch (SearchType) {
|
||||
case SSDP_ALL:
|
||||
DeviceReply(DestAddr, devType, i == 0,
|
||||
UDNstr, SInfo->DescURL, defaultExp);
|
||||
break;
|
||||
case SSDP_ROOTDEVICE:
|
||||
if (i == 0) {
|
||||
SendReply(DestAddr, devType, 1,
|
||||
UDNstr, SInfo->DescURL, defaultExp, 0);
|
||||
}
|
||||
break;
|
||||
case SSDP_DEVICEUDN: {
|
||||
if (DeviceUDN && strlen(DeviceUDN) != 0) {
|
||||
if (strcasecmp(DeviceUDN, UDNstr)) {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceUDN=%s and search UDN=%s DID NOT match\n",
|
||||
UDNstr, DeviceUDN);
|
||||
break;
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceUDN=%s and search UDN=%s MATCH\n",
|
||||
UDNstr, DeviceUDN);
|
||||
SendReply(DestAddr, devType, 0,
|
||||
UDNstr, SInfo->DescURL,
|
||||
defaultExp, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case SSDP_DEVICETYPE: {
|
||||
if (!strncasecmp(DeviceType, devType, strlen(DeviceType)-2)) {
|
||||
if (atoi(&DeviceType[strlen(DeviceType)-1]) <= atoi(&devType[strlen(devType)-1])) {
|
||||
/* the requested version is lower than the device version
|
||||
* must reply with the lower version number */
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceType=%s and search devType=%s MATCH\n",
|
||||
devType, DeviceType);
|
||||
SendReply(DestAddr, DeviceType, 0, UDNstr, SInfo->DescURL, defaultExp, 1);
|
||||
case SSDP_DEVICETYPE: {
|
||||
if (!strncasecmp(DeviceType, devType, strlen(DeviceType)-2)) {
|
||||
if (atoi(&DeviceType[strlen(DeviceType)-1]) <= atoi(&devType[strlen(devType)-1])) {
|
||||
/* the requested version is lower than the device version
|
||||
* must reply with the lower version number */
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceType=%s and search devType=%s MATCH\n",
|
||||
devType, DeviceType);
|
||||
SendReply(DestAddr, DeviceType, 0, UDNstr, SInfo->DescURL, defaultExp, 1);
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceType=%s and search devType=%s DID NOT MATCH\n",
|
||||
devType, DeviceType);
|
||||
}
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceType=%s and search devType=%s DID NOT MATCH\n",
|
||||
devType, DeviceType);
|
||||
}
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"DeviceType=%s and search devType=%s DID NOT MATCH\n",
|
||||
devType, DeviceType);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* send service advertisements for services corresponding
|
||||
* to the same device */
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Sending service Advertisement\n");
|
||||
/* send service advertisements for services corresponding
|
||||
* to the same device */
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Sending service Advertisement\n");
|
||||
|
||||
/* Correct service traversal such that each device's serviceList
|
||||
* is directly traversed as a child of its parent device. This
|
||||
* ensures that the service's alive message uses the UDN of
|
||||
* the parent device. */
|
||||
tmpNode = ixmlNode_getFirstChild(tmpNode);
|
||||
while (tmpNode) {
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
if (!strncmp(dbgStr, SERVICELIST_STR, sizeof SERVICELIST_STR)) {
|
||||
break;
|
||||
/* Correct service traversal such that each device's serviceList
|
||||
* is directly traversed as a child of its parent device. This
|
||||
* ensures that the service's alive message uses the UDN of
|
||||
* the parent device. */
|
||||
tmpNode = ixmlNode_getFirstChild(tmpNode);
|
||||
while (tmpNode) {
|
||||
dbgStr = ixmlNode_getNodeName(tmpNode);
|
||||
if (!strncmp(dbgStr, SERVICELIST_STR, sizeof SERVICELIST_STR)) {
|
||||
break;
|
||||
}
|
||||
tmpNode = ixmlNode_getNextSibling(tmpNode);
|
||||
}
|
||||
tmpNode = ixmlNode_getNextSibling(tmpNode);
|
||||
}
|
||||
ixmlNodeList_free(nodeList);
|
||||
if (!tmpNode) {
|
||||
nodeList = NULL;
|
||||
continue;
|
||||
}
|
||||
nodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "service");
|
||||
if (!nodeList) {
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Service not found 3\n" );
|
||||
continue;
|
||||
}
|
||||
for (j = 0;; j++) {
|
||||
tmpNode = ixmlNodeList_item(nodeList, j);
|
||||
ixmlNodeList_free(nodeList);
|
||||
if (!tmpNode) {
|
||||
break;
|
||||
}
|
||||
ixmlNodeList_free(tmpNodeList);
|
||||
tmpNodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "serviceType");
|
||||
if (!tmpNodeList) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"ServiceType not found \n");
|
||||
nodeList = NULL;
|
||||
continue;
|
||||
}
|
||||
tmpNode2 = ixmlNodeList_item(tmpNodeList, 0);
|
||||
if (!tmpNode2) continue;
|
||||
textNode = ixmlNode_getFirstChild(tmpNode2);
|
||||
if (!textNode) continue;
|
||||
/* servType is of format Servicetype:ServiceVersion */
|
||||
tmpStr = ixmlNode_getNodeValue(textNode);
|
||||
if (!tmpStr) continue;
|
||||
strcpy(servType, tmpStr);
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"ServiceType = %s\n", servType);
|
||||
if (AdFlag) {
|
||||
if (AdFlag == 1) {
|
||||
ServiceAdvertisement(UDNstr, servType,
|
||||
SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
} else {
|
||||
/* AdFlag == -1 */
|
||||
ServiceShutdown(UDNstr, servType,
|
||||
SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
}
|
||||
} else {
|
||||
switch (SearchType) {
|
||||
case SSDP_ALL:
|
||||
ServiceReply(DestAddr, servType,
|
||||
UDNstr, SInfo->DescURL,
|
||||
defaultExp);
|
||||
nodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "service");
|
||||
if (!nodeList) {
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"Service not found 3\n" );
|
||||
continue;
|
||||
}
|
||||
for (j = 0;; j++) {
|
||||
tmpNode = ixmlNodeList_item(nodeList, j);
|
||||
if (!tmpNode) {
|
||||
break;
|
||||
case SSDP_SERVICE:
|
||||
if (ServiceType) {
|
||||
if (!strncasecmp(ServiceType, servType, strlen(ServiceType) - 2)) {
|
||||
if (atoi(&ServiceType[strlen(ServiceType)-1]) <= atoi(&servType[strlen(servType)-1])) {
|
||||
/* the requested version is lower than the service version
|
||||
* must reply with the lower version number */
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"ServiceType=%s and search servType=%s MATCH\n",
|
||||
ServiceType, servType);
|
||||
SendReply(DestAddr, ServiceType, 0, UDNstr, SInfo->DescURL, defaultExp, 1);
|
||||
}
|
||||
ixmlNodeList_free(tmpNodeList);
|
||||
tmpNodeList = ixmlElement_getElementsByTagName(
|
||||
(IXML_Element *)tmpNode, "serviceType");
|
||||
if (!tmpNodeList) {
|
||||
UpnpPrintf(UPNP_CRITICAL, API, __FILE__, __LINE__,
|
||||
"ServiceType not found \n");
|
||||
continue;
|
||||
}
|
||||
tmpNode2 = ixmlNodeList_item(tmpNodeList, 0);
|
||||
if (!tmpNode2) continue;
|
||||
textNode = ixmlNode_getFirstChild(tmpNode2);
|
||||
if (!textNode) continue;
|
||||
/* servType is of format Servicetype:ServiceVersion */
|
||||
tmpStr = ixmlNode_getNodeValue(textNode);
|
||||
if (!tmpStr) continue;
|
||||
strcpy(servType, tmpStr);
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"ServiceType = %s\n", servType);
|
||||
if (AdFlag) {
|
||||
if (AdFlag == 1) {
|
||||
ServiceAdvertisement(UDNstr, servType,
|
||||
SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
} else {
|
||||
/* AdFlag == -1 */
|
||||
ServiceShutdown(UDNstr, servType,
|
||||
SInfo->DescURL, Exp, SInfo->DeviceAf );
|
||||
}
|
||||
} else {
|
||||
switch (SearchType) {
|
||||
case SSDP_ALL:
|
||||
ServiceReply(DestAddr, servType,
|
||||
UDNstr, SInfo->DescURL,
|
||||
defaultExp);
|
||||
break;
|
||||
case SSDP_SERVICE:
|
||||
if (ServiceType) {
|
||||
if (!strncasecmp(ServiceType, servType, strlen(ServiceType) - 2)) {
|
||||
if (atoi(&ServiceType[strlen(ServiceType)-1]) <= atoi(&servType[strlen(servType)-1])) {
|
||||
/* the requested version is lower than the service version
|
||||
* must reply with the lower version number */
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"ServiceType=%s and search servType=%s MATCH\n",
|
||||
ServiceType, servType);
|
||||
SendReply(DestAddr, ServiceType, 0, UDNstr, SInfo->DescURL, defaultExp, 1);
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"ServiceType=%s and search servType=%s DID NOT MATCH\n",
|
||||
ServiceType, servType);
|
||||
}
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"ServiceType=%s and search servType=%s DID NOT MATCH\n",
|
||||
ServiceType, servType);
|
||||
}
|
||||
} else {
|
||||
UpnpPrintf(UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"ServiceType=%s and search servType=%s DID NOT MATCH\n",
|
||||
ServiceType, servType);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
ixmlNodeList_free(tmpNodeList);
|
||||
tmpNodeList = NULL;
|
||||
ixmlNodeList_free(nodeList);
|
||||
nodeList = NULL;
|
||||
}
|
||||
ixmlNodeList_free(tmpNodeList);
|
||||
tmpNodeList = NULL;
|
||||
ixmlNodeList_free(nodeList);
|
||||
nodeList = NULL;
|
||||
}
|
||||
|
||||
end_function:
|
||||
|
@@ -40,7 +40,7 @@
|
||||
#include "UpnpInet.h"
|
||||
#include "uri.h"
|
||||
#include "urlconfig.h"
|
||||
#include "util.h"
|
||||
#include "upnputil.h"
|
||||
#include "webserver.h"
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user