Merge of trunk into branch 1.6.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@263 119443c7-1b9e-41f8-b6fc-b9c35fce742c
This commit is contained in:
parent
0475a46680
commit
0a074d1989
20
ChangeLog
20
ChangeLog
@ -2,15 +2,23 @@
|
||||
Version 1.6.2
|
||||
*******************************************************************************
|
||||
|
||||
2007-12-10 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Fixed a compilation error due to a missing #ifdef in
|
||||
upnp/src/genlib/miniserver/miniserver.c. Thanks to Eugene Christensen.
|
||||
|
||||
2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* "make check" was failing because ixml/test/test_document.sh did not
|
||||
have the executable flag set. Thanks to Steve Bresson.
|
||||
|
||||
2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Fixed a memory leak in upnpapi.c to delete gMiniServerThreadPool in
|
||||
the call to UpnpFinish(). Thanks to Fabrice Fontaine.
|
||||
|
||||
2007-11-09 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Added a isleep() call to the error handler of select() in
|
||||
RunMiniServer(), so that it does not take 100% cpu in case select()
|
||||
fails repeatedly.
|
||||
|
||||
2007-11-12 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* "make check" was failing because ixml/test/test_document.sh did not
|
||||
have the executable flag set. Thanks to Steve Bresson.
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.6.1
|
||||
*******************************************************************************
|
||||
@ -129,6 +137,10 @@ Version 1.6.0
|
||||
an interface change in the library and the minor library version was
|
||||
bumped. Also, the libtool library numbers were changed accordingly.
|
||||
|
||||
*******************************************************************************
|
||||
Version 1.4.7
|
||||
*******************************************************************************
|
||||
|
||||
2007-05-26 Marcelo Jimenez <mroberto(at)users.sourceforge.net>
|
||||
* Added support for the Basic Device
|
||||
(http://www.upnp.org/standardizeddcps/basic.asp) as suggested by
|
||||
|
2
THANKS
2
THANKS
@ -16,6 +16,8 @@ exempt of errors.
|
||||
- Erik Johansson
|
||||
- Eric Tanguy
|
||||
- Erwan Velu
|
||||
- Eugene Christensen
|
||||
- Fabrice Fontaine
|
||||
- Fredrik Svensson
|
||||
- Glen Masgai
|
||||
- Jiri Zouhar
|
||||
|
@ -92,11 +92,9 @@ CLIENTONLY( ithread_mutex_t GlobalClientSubscribeMutex; )
|
||||
|
||||
TimerThread gTimerThread;
|
||||
|
||||
ThreadPool gRecvThreadPool;
|
||||
|
||||
ThreadPool gSendThreadPool;
|
||||
|
||||
ThreadPool gMiniServerThreadPool;
|
||||
ThreadPool gRecvThreadPool;
|
||||
ThreadPool gMiniServerThreadPool;
|
||||
|
||||
//Flag to indicate the state of web server
|
||||
WebServerState bWebServerState = WEB_SERVER_DISABLED;
|
||||
@ -415,8 +413,9 @@ UpnpFinish()
|
||||
UpnpPrintf( UPNP_INFO, API, __FILE__, __LINE__,
|
||||
"UpnpFinish : UpnpSdkInit is ONE\n" );
|
||||
}
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
|
||||
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
if( GetDeviceHandleInfo( &device_handle, &temp ) == HND_DEVICE )
|
||||
@ -435,11 +434,13 @@ UpnpFinish()
|
||||
web_server_destroy();
|
||||
#endif
|
||||
|
||||
ThreadPoolShutdown(&gSendThreadPool);
|
||||
ThreadPoolShutdown(&gMiniServerThreadPool);
|
||||
ThreadPoolShutdown(&gRecvThreadPool);
|
||||
ThreadPoolShutdown(&gSendThreadPool);
|
||||
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
PrintThreadPoolStats(&gSendThreadPool, __FILE__, __LINE__, "Send Thread Pool");
|
||||
PrintThreadPoolStats(&gRecvThreadPool, __FILE__, __LINE__, "Recv Thread Pool");
|
||||
PrintThreadPoolStats(&gMiniServerThreadPool, __FILE__, __LINE__, "MiniServer Thread Pool");
|
||||
|
||||
#ifdef INCLUDE_CLIENT_APIS
|
||||
ithread_mutex_destroy(&GlobalClientSubscribeMutex);
|
||||
|
@ -115,11 +115,13 @@ SetHTTPGetCallback( MiniServerCallback callback )
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
void
|
||||
SetSoapCallback( MiniServerCallback callback )
|
||||
{
|
||||
gSoapCallback = callback;
|
||||
}
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
/************************************************************************
|
||||
* Function: SetGenaCallback
|
||||
|
@ -29,10 +29,10 @@
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/************************************************************************
|
||||
* Purpose: This file defines the Web Server and has functions to carry out
|
||||
* operations of the Web Server.
|
||||
************************************************************************/
|
||||
/******************************************************************************
|
||||
* Purpose: This file defines the Web Server and has functions to carry out
|
||||
* operations of the Web Server.
|
||||
******************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include <assert.h>
|
||||
@ -64,8 +64,12 @@
|
||||
/*
|
||||
Response Types
|
||||
*/
|
||||
enum resp_type { RESP_FILEDOC, RESP_XMLDOC, RESP_HEADERS, RESP_WEBDOC,
|
||||
RESP_POST };
|
||||
enum resp_type {
|
||||
RESP_FILEDOC,
|
||||
RESP_XMLDOC,
|
||||
RESP_HEADERS,
|
||||
RESP_WEBDOC,
|
||||
RESP_POST };
|
||||
|
||||
// mapping of file extension to content-type of document
|
||||
struct document_type_t {
|
||||
@ -95,18 +99,18 @@ static const char *gMediaTypes[] = {
|
||||
*/
|
||||
|
||||
// index into 'gMediaTypes'
|
||||
#define AUDIO_STR "\1"
|
||||
#define VIDEO_STR "\2"
|
||||
#define IMAGE_STR "\3"
|
||||
#define APPLICATION_STR "\4"
|
||||
#define TEXT_STR "\5"
|
||||
#define AUDIO_STR "\1"
|
||||
#define VIDEO_STR "\2"
|
||||
#define IMAGE_STR "\3"
|
||||
#define APPLICATION_STR "\4"
|
||||
#define TEXT_STR "\5"
|
||||
|
||||
// int index
|
||||
#define APPLICATION_INDEX 4
|
||||
#define TEXT_INDEX 5
|
||||
#define APPLICATION_INDEX 4
|
||||
#define TEXT_INDEX 5
|
||||
|
||||
// general
|
||||
#define NUM_MEDIA_TYPES 69
|
||||
#define NUM_MEDIA_TYPES 69
|
||||
#define NUM_HTTP_HEADER_NAMES 33
|
||||
|
||||
// sorted by file extension; must have 'NUM_MEDIA_TYPES' extensions
|
||||
@ -182,12 +186,9 @@ static const char *gEncodedMediaTypes =
|
||||
"zip\0" APPLICATION_STR "zip\0" "\0";
|
||||
// *** end ***
|
||||
|
||||
/***********************************************************************/
|
||||
/*
|
||||
/************************************************************************
|
||||
module variables - Globals, static and externs
|
||||
*/
|
||||
|
||||
/***********************************************************************/
|
||||
************************************************************************/
|
||||
static struct document_type_t gMediaTypeList[NUM_MEDIA_TYPES];
|
||||
membuffer gDocumentRootDir; // a local dir which serves as webserver root
|
||||
static struct xml_alias_t gAliasDoc; // XML document
|
||||
@ -195,16 +196,16 @@ static ithread_mutex_t gWebMutex;
|
||||
extern str_int_entry Http_Header_Names[NUM_HTTP_HEADER_NAMES];
|
||||
|
||||
/************************************************************************
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: decodes list and stores it in gMediaTypeList
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: decodes list and stores it in gMediaTypeList
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
static UPNP_INLINE void
|
||||
media_list_init( void )
|
||||
{
|
||||
@ -229,20 +230,20 @@ media_list_init( void )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* extension ;
|
||||
* OUT const char** con_type,
|
||||
* OUT const char** con_subtype
|
||||
*
|
||||
* Description: Based on the extension, returns the content type and
|
||||
* content subtype
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success;
|
||||
* -1 on error
|
||||
************************************************************************/
|
||||
* Function: has_xml_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* extension ;
|
||||
* OUT const char** con_type,
|
||||
* OUT const char** con_subtype
|
||||
*
|
||||
* Description: Based on the extension, returns the content type and
|
||||
* content subtype
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success;
|
||||
* -1 on error
|
||||
************************************************************************/
|
||||
static UPNP_INLINE int
|
||||
search_extension( IN const char *extension,
|
||||
OUT const char **con_type,
|
||||
@ -276,20 +277,20 @@ search_extension( IN const char *extension,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: get_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* filename,
|
||||
* OUT DOMString* content_type
|
||||
*
|
||||
* Description: Based on the extension, clones an XML string based on
|
||||
* type and content subtype. If content type and sub type are not
|
||||
* found, unknown types are used
|
||||
*
|
||||
* Returns:
|
||||
* 0 - On Sucess
|
||||
* UPNP_E_OUTOF_MEMORY - on memory allocation failures
|
||||
************************************************************************/
|
||||
* Function: get_content_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* filename,
|
||||
* OUT DOMString* content_type
|
||||
*
|
||||
* Description: Based on the extension, clones an XML string based on
|
||||
* type and content subtype. If content type and sub type are not
|
||||
* found, unknown types are used
|
||||
*
|
||||
* Returns:
|
||||
* 0 - On Sucess
|
||||
* UPNP_E_OUTOF_MEMORY - on memory allocation failures
|
||||
************************************************************************/
|
||||
UPNP_INLINE int
|
||||
get_content_type( IN const char *filename,
|
||||
OUT DOMString * content_type )
|
||||
@ -337,17 +338,17 @@ get_content_type( IN const char *filename,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: glob_alias_init
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: Initialize the global XML document. Allocate buffers
|
||||
* for the XML document
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
* Function: glob_alias_init
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: Initialize the global XML document. Allocate buffers
|
||||
* for the XML document
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
static UPNP_INLINE void
|
||||
glob_alias_init( void )
|
||||
{
|
||||
@ -360,16 +361,16 @@ glob_alias_init( void )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: is_valid_alias
|
||||
*
|
||||
* Parameters:
|
||||
* IN const struct xml_alias_t* alias ; XML alias object
|
||||
*
|
||||
* Description: Check for the validity of the XML object buffer
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
* Function: is_valid_alias
|
||||
*
|
||||
* Parameters:
|
||||
* IN const struct xml_alias_t* alias ; XML alias object
|
||||
*
|
||||
* Description: Check for the validity of the XML object buffer
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
static UPNP_INLINE xboolean
|
||||
is_valid_alias( IN const struct xml_alias_t *alias )
|
||||
{
|
||||
@ -377,17 +378,17 @@ is_valid_alias( IN const struct xml_alias_t *alias )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: alias_grab
|
||||
*
|
||||
* Parameters:
|
||||
* OUT struct xml_alias_t* alias ; XML alias object
|
||||
*
|
||||
* Description: Copy the contents of the global XML document into the
|
||||
* local OUT parameter
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
* Function: alias_grab
|
||||
*
|
||||
* Parameters:
|
||||
* OUT struct xml_alias_t* alias ; XML alias object
|
||||
*
|
||||
* Description: Copy the contents of the global XML document into the
|
||||
* local OUT parameter
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
static void
|
||||
alias_grab( OUT struct xml_alias_t *alias )
|
||||
{
|
||||
@ -402,17 +403,17 @@ alias_grab( OUT struct xml_alias_t *alias )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: alias_release
|
||||
*
|
||||
* Parameters:
|
||||
* IN struct xml_alias_t* alias ; XML alias object
|
||||
*
|
||||
* Description: Release the XML document referred to by the IN parameter
|
||||
* Free the allocated buffers associated with this object
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
* Function: alias_release
|
||||
*
|
||||
* Parameters:
|
||||
* IN struct xml_alias_t* alias ; XML alias object
|
||||
*
|
||||
* Description: Release the XML document referred to by the IN parameter
|
||||
* Free the allocated buffers associated with this object
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
static void
|
||||
alias_release( IN struct xml_alias_t *alias )
|
||||
{
|
||||
@ -436,24 +437,24 @@ alias_release( IN struct xml_alias_t *alias )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: web_server_set_alias
|
||||
*
|
||||
* Parameters:
|
||||
* alias_name: webserver name of alias; created by caller and freed by
|
||||
* caller (doesn't even have to be malloc()d .)
|
||||
* alias_content: the xml doc; this is allocated by the caller; and
|
||||
* freed by the web server
|
||||
* alias_content_length: length of alias body in bytes
|
||||
* last_modified: time when the contents of alias were last
|
||||
* changed (local time)
|
||||
*
|
||||
* Description: Replaces current alias with the given alias. To remove
|
||||
* the current alias, set alias_name to NULL.
|
||||
*
|
||||
* Returns:
|
||||
* 0 - OK
|
||||
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
|
||||
************************************************************************/
|
||||
* Function: web_server_set_alias
|
||||
*
|
||||
* Parameters:
|
||||
* alias_name: webserver name of alias; created by caller and freed by
|
||||
* caller (doesn't even have to be malloc()d .)
|
||||
* alias_content: the xml doc; this is allocated by the caller; and
|
||||
* freed by the web server
|
||||
* alias_content_length: length of alias body in bytes
|
||||
* last_modified: time when the contents of alias were last
|
||||
* changed (local time)
|
||||
*
|
||||
* Description: Replaces current alias with the given alias. To remove
|
||||
* the current alias, set alias_name to NULL.
|
||||
*
|
||||
* Returns:
|
||||
* 0 - OK
|
||||
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
|
||||
************************************************************************/
|
||||
int
|
||||
web_server_set_alias( IN const char *alias_name,
|
||||
IN const char *alias_content,
|
||||
@ -516,19 +517,19 @@ web_server_set_alias( IN const char *alias_name,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: web_server_init
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: Initilialize the different documents. Initialize the
|
||||
* memory for root directory for web server. Call to initialize global
|
||||
* XML document. Sets bWebServerState to WEB_SERVER_ENABLED
|
||||
*
|
||||
* Returns:
|
||||
* 0 - OK
|
||||
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
|
||||
************************************************************************/
|
||||
* Function: web_server_init
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: Initilialize the different documents. Initialize the
|
||||
* memory for root directory for web server. Call to initialize global
|
||||
* XML document. Sets bWebServerState to WEB_SERVER_ENABLED
|
||||
*
|
||||
* Returns:
|
||||
* 0 - OK
|
||||
* UPNP_E_OUTOF_MEMORY: note: alias_content is not freed here
|
||||
************************************************************************/
|
||||
int
|
||||
web_server_init( void )
|
||||
{
|
||||
@ -552,18 +553,18 @@ web_server_init( void )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: web_server_destroy
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: Release memory allocated for the global web server root
|
||||
* directory and the global XML document
|
||||
* Resets the flag bWebServerState to WEB_SERVER_DISABLED
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
* Function: web_server_destroy
|
||||
*
|
||||
* Parameters:
|
||||
* none
|
||||
*
|
||||
* Description: Release memory allocated for the global web server root
|
||||
* directory and the global XML document
|
||||
* Resets the flag bWebServerState to WEB_SERVER_DISABLED
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
void
|
||||
web_server_destroy( void )
|
||||
{
|
||||
@ -584,23 +585,22 @@ web_server_destroy( void )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: get_file_info
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* filename ; Filename having the description document
|
||||
* OUT struct File_Info * info ; File information object having file
|
||||
* attributes such as filelength, when was
|
||||
* the file last modified, whether a file
|
||||
* or a directory and whether the file or
|
||||
* directory is readable.
|
||||
*
|
||||
* Description: Release memory allocated for the global web server root
|
||||
* directory and the global XML document
|
||||
* Resets the flag bWebServerState to WEB_SERVER_DISABLED
|
||||
*
|
||||
* Returns:
|
||||
* int
|
||||
************************************************************************/
|
||||
* Function: get_file_info
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* filename ; Filename having the description document
|
||||
* OUT struct File_Info * info ; File information object having file
|
||||
* attributes such as filelength, when was the file last
|
||||
* modified, whether a file or a directory and whether the
|
||||
* file or directory is readable.
|
||||
*
|
||||
* Description: Release memory allocated for the global web server root
|
||||
* directory and the global XML document
|
||||
* Resets the flag bWebServerState to WEB_SERVER_DISABLED
|
||||
*
|
||||
* Returns:
|
||||
* int
|
||||
************************************************************************/
|
||||
static int
|
||||
get_file_info( IN const char *filename,
|
||||
OUT struct File_Info *info )
|
||||
@ -647,19 +647,19 @@ get_file_info( IN const char *filename,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: web_server_set_root_dir
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* root_dir ; String having the root directory for the
|
||||
* document
|
||||
*
|
||||
* Description: Assign the path specfied by the IN const char* root_dir
|
||||
* parameter to the global Document root directory. Also check for
|
||||
* path names ending in '/'
|
||||
*
|
||||
* Returns:
|
||||
* int
|
||||
************************************************************************/
|
||||
* Function: web_server_set_root_dir
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* root_dir ; String having the root directory for the
|
||||
* document
|
||||
*
|
||||
* Description: Assign the path specfied by the IN const char* root_dir
|
||||
* parameter to the global Document root directory. Also check for
|
||||
* path names ending in '/'
|
||||
*
|
||||
* Returns:
|
||||
* int
|
||||
************************************************************************/
|
||||
int
|
||||
web_server_set_root_dir( IN const char *root_dir )
|
||||
{
|
||||
@ -682,24 +682,23 @@ web_server_set_root_dir( IN const char *root_dir )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: get_alias
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* request_file ; request file passed in to be compared with
|
||||
* OUT struct xml_alias_t* alias ; xml alias object which has a file name
|
||||
* stored
|
||||
* OUT struct File_Info * info ; File information object which will be
|
||||
* filled up if the file comparison
|
||||
* succeeds
|
||||
*
|
||||
* Description: Compare the files names between the one on the XML alias
|
||||
* the one passed in as the input parameter. If equal extract file
|
||||
* information
|
||||
*
|
||||
* Returns:
|
||||
* TRUE - On Success
|
||||
* FALSE if request is not an alias
|
||||
************************************************************************/
|
||||
* Function: get_alias
|
||||
*
|
||||
* Parameters:
|
||||
* IN const char* request_file ; request file passed in to be compared with
|
||||
* OUT struct xml_alias_t* alias ; xml alias object which has a file name
|
||||
* stored
|
||||
* OUT struct File_Info * info ; File information object which will be
|
||||
* filled up if the file comparison succeeds
|
||||
*
|
||||
* Description: Compare the files names between the one on the XML alias
|
||||
* the one passed in as the input parameter. If equal extract file
|
||||
* information
|
||||
*
|
||||
* Returns:
|
||||
* TRUE - On Success
|
||||
* FALSE if request is not an alias
|
||||
************************************************************************/
|
||||
static UPNP_INLINE xboolean
|
||||
get_alias( IN const char *request_file,
|
||||
OUT struct xml_alias_t *alias,
|
||||
@ -720,17 +719,17 @@ get_alias( IN const char *request_file,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: isFileInVirtualDir
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *filePath ; directory path to be tested for virtual directory
|
||||
*
|
||||
* Description: Compares filePath with paths from the list of virtual
|
||||
* directory lists
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
* Function: isFileInVirtualDir
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *filePath ; directory path to be tested for virtual directory
|
||||
*
|
||||
* Description: Compares filePath with paths from the list of virtual
|
||||
* directory lists
|
||||
*
|
||||
* Returns:
|
||||
* BOOLEAN
|
||||
************************************************************************/
|
||||
int
|
||||
isFileInVirtualDir( IN char *filePath )
|
||||
{
|
||||
@ -757,16 +756,16 @@ isFileInVirtualDir( IN char *filePath )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: ToUpperCase
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT char * Str ; Input string to be converted
|
||||
*
|
||||
* Description: Converts input string to upper case
|
||||
*
|
||||
* Returns:
|
||||
* int
|
||||
************************************************************************/
|
||||
* Function: ToUpperCase
|
||||
*
|
||||
* Parameters:
|
||||
* INOUT char * Str ; Input string to be converted
|
||||
*
|
||||
* Description: Converts input string to upper case
|
||||
*
|
||||
* Returns:
|
||||
* int
|
||||
************************************************************************/
|
||||
int
|
||||
ToUpperCase( char *Str )
|
||||
{
|
||||
@ -779,17 +778,17 @@ ToUpperCase( char *Str )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: StrStr
|
||||
*
|
||||
* Parameters:
|
||||
* IN char * S1 ; Input string
|
||||
* IN char * S2 ; Input sub-string
|
||||
*
|
||||
* Description: Finds a substring from a string
|
||||
*
|
||||
* Returns:
|
||||
* char * ptr - pointer to the first occurence of S2 in S1
|
||||
************************************************************************/
|
||||
* Function: StrStr
|
||||
*
|
||||
* Parameters:
|
||||
* IN char * S1 ; Input string
|
||||
* IN char * S2 ; Input sub-string
|
||||
*
|
||||
* Description: Finds a substring from a string
|
||||
*
|
||||
* Returns:
|
||||
* char * ptr - pointer to the first occurence of S2 in S1
|
||||
************************************************************************/
|
||||
char *
|
||||
StrStr( char *S1,
|
||||
char *S2 )
|
||||
@ -829,17 +828,17 @@ StrStr( char *S1,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: StrTok
|
||||
*
|
||||
* Parameters:
|
||||
* IN char ** Src ; String containing the token
|
||||
* IN char * del ; Set of delimiter characters
|
||||
*
|
||||
* Description: Finds next token in a string
|
||||
*
|
||||
* Returns:
|
||||
* char * ptr - pointer to the first occurence of S2 in S1
|
||||
************************************************************************/
|
||||
* Function: StrTok
|
||||
*
|
||||
* Parameters:
|
||||
* IN char ** Src ; String containing the token
|
||||
* IN char * del ; Set of delimiter characters
|
||||
*
|
||||
* Description: Finds next token in a string
|
||||
*
|
||||
* Returns:
|
||||
* char * ptr - pointer to the first occurence of S2 in S1
|
||||
************************************************************************/
|
||||
char *
|
||||
StrTok( char **Src,
|
||||
char *Del )
|
||||
@ -863,18 +862,18 @@ StrTok( char **Src,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: GetNextRange
|
||||
*
|
||||
* Parameters:
|
||||
* IN char ** SrcRangeStr ; string containing the token / range
|
||||
* OUT int * FirstByte ; gets the first byte of the token
|
||||
* OUT int * LastByte ; gets the last byte of the token
|
||||
*
|
||||
* Description: Returns a range of integers from a sring
|
||||
*
|
||||
* Returns: int ;
|
||||
* always returns 1;
|
||||
************************************************************************/
|
||||
* Function: GetNextRange
|
||||
*
|
||||
* Parameters:
|
||||
* IN char ** SrcRangeStr ; string containing the token / range
|
||||
* OUT int * FirstByte ; gets the first byte of the token
|
||||
* OUT int * LastByte ; gets the last byte of the token
|
||||
*
|
||||
* Description: Returns a range of integers from a string
|
||||
*
|
||||
* Returns: int ;
|
||||
* always returns 1;
|
||||
************************************************************************/
|
||||
int
|
||||
GetNextRange( char **SrcRangeStr,
|
||||
off_t *FirstByte,
|
||||
@ -924,23 +923,23 @@ GetNextRange( char **SrcRangeStr,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: CreateHTTPRangeResponseHeader
|
||||
*
|
||||
* Parameters:
|
||||
* char * ByteRangeSpecifier ; String containing the range
|
||||
* long FileLength ; Length of the file
|
||||
* OUT struct SendInstruction * Instr ; SendInstruction object where the
|
||||
* range operations will be stored
|
||||
*
|
||||
* Description: Fills in the Offset, read size and contents to send out
|
||||
* as an HTTP Range Response
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_BAD_REQUEST
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
* Function: CreateHTTPRangeResponseHeader
|
||||
*
|
||||
* Parameters:
|
||||
* char * ByteRangeSpecifier ; String containing the range
|
||||
* long FileLength ; Length of the file
|
||||
* OUT struct SendInstruction * Instr ; SendInstruction object
|
||||
* where the range operations will be stored
|
||||
*
|
||||
* Description: Fills in the Offset, read size and contents to send out
|
||||
* as an HTTP Range Response
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_BAD_REQUEST
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
int
|
||||
CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
|
||||
off_t FileLength,
|
||||
@ -1036,24 +1035,24 @@ CreateHTTPRangeResponseHeader( char *ByteRangeSpecifier,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: CheckOtherHTTPHeaders
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t * Req ; HTTP Request message
|
||||
* OUT struct SendInstruction * RespInstr ; Send Instruction object to
|
||||
* data for the response
|
||||
* int FileSize ; Size of the file containing the request document
|
||||
*
|
||||
* Description: Get header id from the request parameter and take
|
||||
* appropriate action based on the ids.
|
||||
* as an HTTP Range Response
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_BAD_REQUEST
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
* Function: CheckOtherHTTPHeaders
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t * Req ; HTTP Request message
|
||||
* OUT struct SendInstruction * RespInstr ; Send Instruction object to
|
||||
* data for the response
|
||||
* int FileSize ; Size of the file containing the request document
|
||||
*
|
||||
* Description: Get header id from the request parameter and take
|
||||
* appropriate action based on the ids.
|
||||
* as an HTTP Range Response
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_BAD_REQUEST
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
int
|
||||
CheckOtherHTTPHeaders( IN http_message_t * Req,
|
||||
OUT struct SendInstruction *RespInstr,
|
||||
@ -1167,27 +1166,27 @@ CheckOtherHTTPHeaders( IN http_message_t * Req,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: process_request
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t *req ; HTTP Request message
|
||||
* OUT enum resp_type *rtype ; Tpye of response
|
||||
* OUT membuffer *headers ;
|
||||
* OUT membuffer *filename ; Get filename from request document
|
||||
* OUT struct xml_alias_t *alias ; Xml alias document from the
|
||||
* request document,
|
||||
* OUT struct SendInstruction * RespInstr ; Send Instruction object
|
||||
* where the response is set up.
|
||||
*
|
||||
* Description: Processes the request and returns the result in the OUT
|
||||
* parameters
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_BAD_REQUEST
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
* Function: process_request
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_message_t *req ; HTTP Request message
|
||||
* OUT enum resp_type *rtype ; Tpye of response
|
||||
* OUT membuffer *headers ;
|
||||
* OUT membuffer *filename ; Get filename from request document
|
||||
* OUT struct xml_alias_t *alias ; Xml alias document from the
|
||||
* request document,
|
||||
* OUT struct SendInstruction * RespInstr ; Send Instruction object
|
||||
* where the response is set up.
|
||||
*
|
||||
* Description: Processes the request and returns the result in the OUT
|
||||
* parameters
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_BAD_REQUEST
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
static int
|
||||
process_request( IN http_message_t * req,
|
||||
OUT enum resp_type *rtype,
|
||||
@ -1495,23 +1494,23 @@ process_request( IN http_message_t * req,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: http_RecvPostMessage
|
||||
*
|
||||
* Parameters:
|
||||
* http_parser_t* parser ; HTTP Parser object
|
||||
* IN SOCKINFO *info ; Socket Information object
|
||||
* char * filename ; File where received data is copied to
|
||||
* struct SendInstruction * Instr ; Send Instruction object which gives
|
||||
* information whether the file is a virtual file or not.
|
||||
*
|
||||
* Description: Receives the HTTP post message
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_INTERNAL_SERVER_ERROR
|
||||
* HTTP_UNAUTHORIZED
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
* Function: http_RecvPostMessage
|
||||
*
|
||||
* Parameters:
|
||||
* http_parser_t* parser ; HTTP Parser object
|
||||
* IN SOCKINFO *info ; Socket Information object
|
||||
* char * filename ; File where received data is copied to
|
||||
* struct SendInstruction * Instr ; Send Instruction object which gives
|
||||
* information whether the file is a virtual file or not.
|
||||
*
|
||||
* Description: Receives the HTTP post message
|
||||
*
|
||||
* Returns:
|
||||
* HTTP_INTERNAL_SERVER_ERROR
|
||||
* HTTP_UNAUTHORIZED
|
||||
* HTTP_REQUEST_RANGE_NOT_SATISFIABLE
|
||||
* HTTP_OK
|
||||
************************************************************************/
|
||||
int
|
||||
http_RecvPostMessage( http_parser_t * parser,
|
||||
IN SOCKINFO * info,
|
||||
@ -1659,19 +1658,19 @@ http_RecvPostMessage( http_parser_t * parser,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function: web_server_callback
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_parser_t *parser ; HTTP Parser Object
|
||||
* INOUT http_message_t* req ; HTTP Message request
|
||||
* IN SOCKINFO *info ; Socket information object
|
||||
*
|
||||
* Description: main entry point into web server;
|
||||
* handles HTTP GET and HEAD requests
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
* Function: web_server_callback
|
||||
*
|
||||
* Parameters:
|
||||
* IN http_parser_t *parser ; HTTP Parser Object
|
||||
* INOUT http_message_t* req ; HTTP Message request
|
||||
* IN SOCKINFO *info ; Socket information object
|
||||
*
|
||||
* Description: main entry point into web server;
|
||||
* handles HTTP GET and HEAD requests
|
||||
*
|
||||
* Returns:
|
||||
* void
|
||||
************************************************************************/
|
||||
void
|
||||
web_server_callback( IN http_parser_t * parser,
|
||||
INOUT http_message_t * req,
|
||||
@ -1764,3 +1763,4 @@ web_server_callback( IN http_parser_t * parser,
|
||||
membuffer_destroy( &headers );
|
||||
membuffer_destroy( &filename );
|
||||
}
|
||||
|
||||
|
@ -1,154 +1,150 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// 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 MINISERVER_H
|
||||
#define MINISERVER_H
|
||||
|
||||
|
||||
#include "sock.h"
|
||||
#include "httpparser.h"
|
||||
|
||||
|
||||
extern SOCKET gMiniServerStopSock;
|
||||
|
||||
|
||||
typedef struct MServerSockArray {
|
||||
int miniServerSock; //socket for listening for miniserver
|
||||
//requests
|
||||
int miniServerStopSock; //socket for stopping miniserver
|
||||
int ssdpSock; //socket for incoming advertisments and search requests
|
||||
/* socket for listening for miniserver requests */
|
||||
int miniServerSock;
|
||||
/* socket for stopping miniserver */
|
||||
int miniServerStopSock;
|
||||
/* socket for incoming advertisments and search requests */
|
||||
int ssdpSock;
|
||||
|
||||
int stopPort;
|
||||
int miniServerPort;
|
||||
int stopPort;
|
||||
int miniServerPort;
|
||||
|
||||
CLIENTONLY(int ssdpReqSock;) //socket for sending search
|
||||
//requests and receiving
|
||||
// search replies
|
||||
|
||||
/* socket for sending search requests and receiving search replies */
|
||||
CLIENTONLY(int ssdpReqSock;)
|
||||
} MiniServerSockArray;
|
||||
|
||||
//typedef void (*MiniServerCallback) ( const char* document, int sockfd );
|
||||
|
||||
typedef void (*MiniServerCallback) ( IN http_parser_t *parser,
|
||||
IN http_message_t* request,
|
||||
IN SOCKINFO *info );
|
||||
typedef void (*MiniServerCallback)(
|
||||
IN http_parser_t *parser,
|
||||
IN http_message_t* request,
|
||||
IN SOCKINFO *info );
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/************************************************************************
|
||||
* Function : SetHTTPGetCallback
|
||||
*
|
||||
* Parameters :
|
||||
* MiniServerCallback callback ; - HTTP Callback to be invoked
|
||||
*
|
||||
* Description : Set HTTP Get Callback
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
* Function: SetHTTPGetCallback
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerCallback callback; - HTTP Callback to be invoked
|
||||
*
|
||||
* Description: Set HTTP Get Callback
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void SetHTTPGetCallback( MiniServerCallback callback );
|
||||
|
||||
/************************************************************************
|
||||
* Function : SetSoapCallback
|
||||
*
|
||||
* Parameters :
|
||||
* MiniServerCallback callback ; - SOAP Callback to be invoked
|
||||
*
|
||||
* Description : Set SOAP Callback
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
* Function: SetSoapCallback
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerCallback callback; - SOAP Callback to be invoked
|
||||
*
|
||||
* Description: Set SOAP Callback
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
void SetSoapCallback( MiniServerCallback callback );
|
||||
#else
|
||||
#else /* INCLUDE_DEVICE_APIS */
|
||||
static inline void SetSoapCallback( MiniServerCallback callback ) {}
|
||||
#endif
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
/************************************************************************
|
||||
* Function : SetGenaCallback
|
||||
*
|
||||
* Parameters :
|
||||
* MiniServerCallback callback ; - GENA Callback to be invoked
|
||||
*
|
||||
* Description : Set GENA Callback
|
||||
*
|
||||
* Return : void
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
* Function: SetGenaCallback
|
||||
*
|
||||
* Parameters:
|
||||
* MiniServerCallback callback; - GENA Callback to be invoked
|
||||
*
|
||||
* D6escription: Set GENA Callback
|
||||
*
|
||||
* Return: void
|
||||
************************************************************************/
|
||||
void SetGenaCallback( MiniServerCallback callback );
|
||||
|
||||
/************************************************************************
|
||||
* Function : StartMiniServer
|
||||
*
|
||||
* Parameters :
|
||||
* unsigned short listen_port ; Port on which the server listens for
|
||||
* incoming connections
|
||||
*
|
||||
* Description : Initialize the sockets functionality for the
|
||||
* Miniserver. Initialize a thread pool job to run the MiniServer
|
||||
* and the job to the thread pool. If listen port is 0, port is
|
||||
* dynamically picked
|
||||
*
|
||||
* Use timer mechanism to start the MiniServer, failure to meet the
|
||||
* allowed delay aborts the attempt to launch the MiniServer.
|
||||
*
|
||||
* Return : int ;
|
||||
* Actual port socket is bound to - On Success:
|
||||
* A negative number UPNP_E_XXX - On Error
|
||||
* Note :
|
||||
************************************************************************/
|
||||
* Function: StartMiniServer
|
||||
*
|
||||
* Parameters:
|
||||
* unsigned short listen_port ; Port on which the server listens for
|
||||
* incoming connections
|
||||
*
|
||||
* Description: Initialize the sockets functionality for the
|
||||
* Miniserver. Initialize a thread pool job to run the MiniServer
|
||||
* and the job to the thread pool. If listen port is 0, port is
|
||||
* dynamically picked
|
||||
*
|
||||
* Use timer mechanism to start the MiniServer, failure to meet the
|
||||
* allowed delay aborts the attempt to launch the MiniServer.
|
||||
*
|
||||
* Return: int;
|
||||
* Actual port socket is bound to - On Success:
|
||||
* A negative number UPNP_E_XXX - On Error
|
||||
************************************************************************/
|
||||
int StartMiniServer( unsigned short listen_port );
|
||||
|
||||
/************************************************************************
|
||||
* Function : StopMiniServer
|
||||
*
|
||||
* Parameters :
|
||||
* void ;
|
||||
*
|
||||
* Description : Stop and Shutdown the MiniServer and free socket
|
||||
* resources.
|
||||
*
|
||||
* Return : int ;
|
||||
* Always returns 0
|
||||
*
|
||||
* Note :
|
||||
************************************************************************/
|
||||
int StopMiniServer( void );
|
||||
* Function: StopMiniServer
|
||||
*
|
||||
* Parameters:
|
||||
* void;
|
||||
*
|
||||
* Description: Stop and Shutdown the MiniServer and free socket resources.
|
||||
*
|
||||
* Return : int;
|
||||
* Always returns 0
|
||||
************************************************************************/
|
||||
int StopMiniServer();
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* MINISERVER_H */
|
||||
|
||||
|
@ -43,56 +43,54 @@
|
||||
#include "httpreadwrite.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include "unixutil.h"
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include "unixutil.h"
|
||||
#endif
|
||||
|
||||
#define MAX_TIME_TOREAD 45
|
||||
|
||||
CLIENTONLY( SOCKET gSsdpReqSocket = 0;
|
||||
)
|
||||
CLIENTONLY( SOCKET gSsdpReqSocket = 0; )
|
||||
|
||||
void RequestHandler( );
|
||||
Event ErrotEvt;
|
||||
void RequestHandler();
|
||||
Event ErrotEvt;
|
||||
|
||||
enum Listener { Idle, Stopping, Running };
|
||||
enum Listener { Idle, Stopping, Running };
|
||||
|
||||
unsigned short ssdpStopPort;
|
||||
unsigned short ssdpStopPort;
|
||||
|
||||
struct SSDPSockArray {
|
||||
int ssdpSock; //socket for incoming advertisments and search requests
|
||||
CLIENTONLY( int ssdpReqSock;
|
||||
) //socket for sending search
|
||||
//requests and receiving
|
||||
// search replies
|
||||
};
|
||||
struct SSDPSockArray {
|
||||
// socket for incoming advertisments and search requests
|
||||
int ssdpSock;
|
||||
// socket for sending search requests and receiving search replies
|
||||
CLIENTONLY( int ssdpReqSock; )
|
||||
};
|
||||
|
||||
#ifdef INCLUDE_DEVICE_APIS
|
||||
#if EXCLUDE_SSDP == 0
|
||||
|
||||
/************************************************************************
|
||||
* Function : AdvertiseAndReply
|
||||
*
|
||||
* Parameters:
|
||||
* IN int AdFlag:
|
||||
* -1 = Send shutdown,
|
||||
* 0 = send reply,
|
||||
* 1 = Send Advertisement
|
||||
* IN UpnpDevice_Handle Hnd: Device handle
|
||||
* IN enum SsdpSearchType SearchType:Search type for sending replies
|
||||
* IN struct sockaddr_in *DestAddr:Destination address
|
||||
* IN char *DeviceType:Device type
|
||||
* IN char *DeviceUDN:Device UDN
|
||||
* IN char *ServiceType:Service type
|
||||
* IN int Exp:Advertisement age
|
||||
*
|
||||
* Description:
|
||||
* This function sends SSDP advertisements, replies and shutdown messages.
|
||||
*
|
||||
* Returns: int
|
||||
* UPNP_E_SUCCESS if successful else appropriate error
|
||||
***************************************************************************/
|
||||
* Function : AdvertiseAndReply
|
||||
*
|
||||
* Parameters:
|
||||
* IN int AdFlag:
|
||||
* -1 = Send shutdown,
|
||||
* 0 = send reply,
|
||||
* 1 = Send Advertisement
|
||||
* IN UpnpDevice_Handle Hnd: Device handle
|
||||
* IN enum SsdpSearchType SearchType:Search type for sending replies
|
||||
* IN struct sockaddr_in *DestAddr:Destination address
|
||||
* IN char *DeviceType:Device type
|
||||
* IN char *DeviceUDN:Device UDN
|
||||
* IN char *ServiceType:Service type
|
||||
* IN int Exp:Advertisement age
|
||||
*
|
||||
* Description:
|
||||
* This function sends SSDP advertisements, replies and shutdown messages.
|
||||
*
|
||||
* Returns: int
|
||||
* UPNP_E_SUCCESS if successful else appropriate error
|
||||
***************************************************************************/
|
||||
int AdvertiseAndReply( IN int AdFlag,
|
||||
IN UpnpDevice_Handle Hnd,
|
||||
IN enum SsdpSearchType SearchType,
|
||||
@ -129,7 +127,6 @@ int AdvertiseAndReply( IN int AdFlag,
|
||||
return UPNP_E_INVALID_HANDLE;
|
||||
}
|
||||
defaultExp = SInfo->MaxAge;
|
||||
nodeList = NULL;
|
||||
|
||||
//get server info
|
||||
|
||||
@ -398,21 +395,21 @@ int AdvertiseAndReply( IN int AdFlag,
|
||||
|
||||
} /****************** End of AdvertiseAndReply *********************/
|
||||
|
||||
#endif
|
||||
#endif
|
||||
#endif /* EXCLUDE_SSDP == 0 */
|
||||
#endif /* INCLUDE_DEVICE_APIS */
|
||||
|
||||
/************************************************************************
|
||||
* Function : Make_Socket_NoBlocking
|
||||
*
|
||||
* Parameters:
|
||||
* IN int sock: socket
|
||||
*
|
||||
* Description:
|
||||
* This function makes socket non-blocking.
|
||||
*
|
||||
* Returns: int
|
||||
* 0 if successful else -1
|
||||
***************************************************************************/
|
||||
* Function : Make_Socket_NoBlocking
|
||||
*
|
||||
* Parameters:
|
||||
* IN int sock: socket
|
||||
*
|
||||
* Description:
|
||||
* This function makes socket non-blocking.
|
||||
*
|
||||
* Returns: int
|
||||
* 0 if successful else -1
|
||||
***************************************************************************/
|
||||
int
|
||||
Make_Socket_NoBlocking( int sock )
|
||||
{
|
||||
@ -431,20 +428,20 @@ Make_Socket_NoBlocking( int sock )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : unique_service_name
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *cmd: Service Name string
|
||||
* OUT SsdpEvent *Evt: The SSDP event structure partially filled
|
||||
* by all the function.
|
||||
*
|
||||
* Description:
|
||||
* This function fills the fields of the event structure like DeviceType,
|
||||
* Device UDN and Service Type
|
||||
*
|
||||
* Returns: int
|
||||
* 0 if successful else -1
|
||||
***************************************************************************/
|
||||
* Function : unique_service_name
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *cmd: Service Name string
|
||||
* OUT SsdpEvent *Evt: The SSDP event structure partially filled
|
||||
* by all the function.
|
||||
*
|
||||
* Description:
|
||||
* This function fills the fields of the event structure like DeviceType,
|
||||
* Device UDN and Service Type
|
||||
*
|
||||
* Returns: int
|
||||
* 0 if successful else -1
|
||||
***************************************************************************/
|
||||
int
|
||||
unique_service_name( IN char *cmd,
|
||||
IN SsdpEvent * Evt )
|
||||
@ -526,18 +523,18 @@ unique_service_name( IN char *cmd,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : ssdp_request_type1
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *cmd: command came in the ssdp request
|
||||
*
|
||||
* Description:
|
||||
* This function figures out the type of the SSDP search in the
|
||||
* in the request.
|
||||
*
|
||||
* Returns: enum SsdpSearchType
|
||||
* return appropriate search type else returns SSDP_ERROR
|
||||
***************************************************************************/
|
||||
* Function : ssdp_request_type1
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *cmd: command came in the ssdp request
|
||||
*
|
||||
* Description:
|
||||
* This function figures out the type of the SSDP search in the
|
||||
* in the request.
|
||||
*
|
||||
* Returns: enum SsdpSearchType
|
||||
* return appropriate search type else returns SSDP_ERROR
|
||||
***************************************************************************/
|
||||
enum SsdpSearchType
|
||||
ssdp_request_type1( IN char *cmd )
|
||||
{
|
||||
@ -562,20 +559,20 @@ ssdp_request_type1( IN char *cmd )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : ssdp_request_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *cmd: command came in the ssdp request
|
||||
* OUT SsdpEvent *Evt: The event structure partially filled by
|
||||
* this function.
|
||||
*
|
||||
* Description:
|
||||
* This function starts filling the SSDP event structure based upon the
|
||||
* request received.
|
||||
*
|
||||
* Returns: int
|
||||
* 0 on success; -1 on error
|
||||
***************************************************************************/
|
||||
* Function : ssdp_request_type
|
||||
*
|
||||
* Parameters:
|
||||
* IN char *cmd: command came in the ssdp request
|
||||
* OUT SsdpEvent *Evt: The event structure partially filled by
|
||||
* this function.
|
||||
*
|
||||
* Description:
|
||||
* This function starts filling the SSDP event structure based upon the
|
||||
* request received.
|
||||
*
|
||||
* Returns: int
|
||||
* 0 on success; -1 on error
|
||||
***************************************************************************/
|
||||
int
|
||||
ssdp_request_type( IN char *cmd,
|
||||
OUT SsdpEvent * Evt )
|
||||
@ -593,18 +590,18 @@ ssdp_request_type( IN char *cmd,
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : free_ssdp_event_handler_data
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function frees the ssdp request
|
||||
*
|
||||
* Returns: VOID
|
||||
*
|
||||
***************************************************************************/
|
||||
* Function : free_ssdp_event_handler_data
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function frees the ssdp request
|
||||
*
|
||||
* Returns: VOID
|
||||
*
|
||||
***************************************************************************/
|
||||
static void
|
||||
free_ssdp_event_handler_data( void *the_data )
|
||||
{
|
||||
@ -620,18 +617,18 @@ free_ssdp_event_handler_data( void *the_data )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : valid_ssdp_msg
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function do some quick checking of the ssdp msg
|
||||
*
|
||||
* Returns: xboolean
|
||||
* returns TRUE if msg is valid else FALSE
|
||||
***************************************************************************/
|
||||
* Function : valid_ssdp_msg
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function do some quick checking of the ssdp msg
|
||||
*
|
||||
* Returns: xboolean
|
||||
* returns TRUE if msg is valid else FALSE
|
||||
***************************************************************************/
|
||||
static UPNP_INLINE xboolean
|
||||
valid_ssdp_msg( IN http_message_t * hmsg )
|
||||
{
|
||||
@ -661,19 +658,19 @@ valid_ssdp_msg( IN http_message_t * hmsg )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : start_event_handler
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function parses the message and dispatches it to a handler
|
||||
* which handles the ssdp request msg
|
||||
*
|
||||
* Returns: int
|
||||
* 0 if successful -1 if error
|
||||
***************************************************************************/
|
||||
* Function : start_event_handler
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function parses the message and dispatches it to a handler
|
||||
* which handles the ssdp request msg
|
||||
*
|
||||
* Returns: int
|
||||
* 0 if successful -1 if error
|
||||
***************************************************************************/
|
||||
static UPNP_INLINE int
|
||||
start_event_handler( void *Data )
|
||||
{
|
||||
@ -713,18 +710,18 @@ start_event_handler( void *Data )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : ssdp_event_handler_thread
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function is a thread that handles SSDP requests.
|
||||
*
|
||||
* Returns: void
|
||||
*
|
||||
***************************************************************************/
|
||||
* Function : ssdp_event_handler_thread
|
||||
*
|
||||
* Parameters:
|
||||
* IN void *the_data: ssdp_thread_data structure. This structure contains
|
||||
* SSDP request message.
|
||||
*
|
||||
* Description:
|
||||
* This function is a thread that handles SSDP requests.
|
||||
*
|
||||
* Returns: void
|
||||
*
|
||||
***************************************************************************/
|
||||
static void
|
||||
ssdp_event_handler_thread( void *the_data )
|
||||
{
|
||||
@ -737,8 +734,7 @@ ssdp_event_handler_thread( void *the_data )
|
||||
// send msg to device or ctrlpt
|
||||
if( ( hmsg->method == HTTPMETHOD_NOTIFY ) ||
|
||||
( hmsg->request_method == HTTPMETHOD_MSEARCH ) ) {
|
||||
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr,
|
||||
FALSE, NULL ););
|
||||
CLIENTONLY( ssdp_handle_ctrlpt_msg( hmsg, &data->dest_addr, FALSE, NULL );)
|
||||
} else {
|
||||
ssdp_handle_device_request( hmsg, &data->dest_addr );
|
||||
}
|
||||
@ -748,17 +744,17 @@ ssdp_event_handler_thread( void *the_data )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : readFromSSDPSocket
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKET socket: SSDP socket
|
||||
*
|
||||
* Description:
|
||||
* This function reads the data from the ssdp socket.
|
||||
*
|
||||
* Returns: void
|
||||
*
|
||||
***************************************************************************/
|
||||
* Function : readFromSSDPSocket
|
||||
*
|
||||
* Parameters:
|
||||
* IN SOCKET socket: SSDP socket
|
||||
*
|
||||
* Description:
|
||||
* This function reads the data from the ssdp socket.
|
||||
*
|
||||
* Returns: void
|
||||
*
|
||||
***************************************************************************/
|
||||
void
|
||||
readFromSSDPSocket( SOCKET socket )
|
||||
{
|
||||
@ -845,32 +841,31 @@ readFromSSDPSocket( SOCKET socket )
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Function : get_ssdp_sockets
|
||||
*
|
||||
* Parameters:
|
||||
* OUT MiniServerSockArray *out: Arrays of SSDP sockets
|
||||
*
|
||||
* Description:
|
||||
* This function creates the ssdp sockets. It set their option to listen
|
||||
* for multicast traffic.
|
||||
*
|
||||
* Returns: int
|
||||
* return UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
***************************************************************************/
|
||||
* Function : get_ssdp_sockets
|
||||
*
|
||||
* Parameters:
|
||||
* OUT MiniServerSockArray *out: Arrays of SSDP sockets
|
||||
*
|
||||
* Description:
|
||||
* This function creates the ssdp sockets. It set their option to listen
|
||||
* for multicast traffic.
|
||||
*
|
||||
* Returns: int
|
||||
* return UPNP_E_SUCCESS if successful else returns appropriate error
|
||||
***************************************************************************/
|
||||
int
|
||||
get_ssdp_sockets( MiniServerSockArray * out )
|
||||
{
|
||||
SOCKET ssdpSock;
|
||||
|
||||
CLIENTONLY( SOCKET ssdpReqSock; )
|
||||
int onOff = 1;
|
||||
u_char ttl = 4;
|
||||
struct ip_mreq ssdpMcastAddr;
|
||||
struct sockaddr_in ssdpAddr;
|
||||
int option = 1;
|
||||
struct in_addr addr;
|
||||
SOCKET ssdpSock;
|
||||
#if INCLUDE_CLIENT_APIS
|
||||
SOCKET ssdpReqSock;
|
||||
|
||||
CLIENTONLY(
|
||||
if( ( ssdpReqSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
@ -880,15 +875,15 @@ CLIENTONLY(
|
||||
setsockopt( ssdpReqSock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
||||
// just do it, regardless if fails or not.
|
||||
Make_Socket_NoBlocking( ssdpReqSock );
|
||||
gSsdpReqSocket = ssdpReqSock; )
|
||||
// END CLIENTONLY
|
||||
gSsdpReqSocket = ssdpReqSock;
|
||||
#endif /* INCLUDE_CLIENT_APIS */
|
||||
|
||||
if( ( ssdpSock = socket( AF_INET, SOCK_DGRAM, 0 ) ) == UPNP_INVALID_SOCKET ) {
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in socket operation !!!\n" );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_OUTOF_SOCKET;
|
||||
}
|
||||
|
||||
@ -898,26 +893,26 @@ CLIENTONLY(
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in set reuse addr !!!\n" );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#ifdef __FreeBSD__
|
||||
if( setsockopt( ssdpSock, SOL_SOCKET, SO_REUSEPORT,
|
||||
( char * )&onOff, sizeof( onOff ) ) != 0 ) {
|
||||
UpnpPrintf( UPNP_CRITICAL,
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in set reuse port !!!\n" );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
#endif
|
||||
#endif /* __FreeBSD__ */
|
||||
|
||||
memset( ( void * )&ssdpAddr, 0, sizeof( struct sockaddr_in ) );
|
||||
ssdpAddr.sin_family = AF_INET;
|
||||
@ -931,8 +926,8 @@ CLIENTONLY(
|
||||
"Error in binding !!!\n" );
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_SOCKET_BIND;
|
||||
}
|
||||
|
||||
@ -945,9 +940,9 @@ CLIENTONLY(
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in joining" " multicast group !!!\n" );
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_SOCKET_ERROR;
|
||||
}
|
||||
|
||||
@ -961,7 +956,7 @@ CLIENTONLY(
|
||||
/* This is probably not a critical error, so let's continue. */
|
||||
}
|
||||
|
||||
// result is not checked becuase it will fail in WinMe and Win9x.
|
||||
/* result is not checked becuase it will fail in WinMe and Win9x. */
|
||||
setsockopt( ssdpSock, IPPROTO_IP,
|
||||
IP_MULTICAST_TTL, &ttl, sizeof( ttl ) );
|
||||
if( setsockopt( ssdpSock, SOL_SOCKET, SO_BROADCAST,
|
||||
@ -970,16 +965,16 @@ CLIENTONLY(
|
||||
SSDP, __FILE__, __LINE__,
|
||||
"Error in setting broadcast !!!\n" );
|
||||
shutdown( ssdpSock, SD_BOTH );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ) );
|
||||
CLIENTONLY( shutdown( ssdpReqSock, SD_BOTH ); )
|
||||
UpnpCloseSocket( ssdpSock );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ) );
|
||||
CLIENTONLY( UpnpCloseSocket( ssdpReqSock ); )
|
||||
return UPNP_E_NETWORK_ERROR;
|
||||
}
|
||||
|
||||
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; );
|
||||
CLIENTONLY( out->ssdpReqSock = ssdpReqSock; )
|
||||
out->ssdpSock = ssdpSock;
|
||||
return UPNP_E_SUCCESS;
|
||||
}
|
||||
|
||||
#endif // EXCLUDE_SSDP
|
||||
#endif /* EXCLUDE_SSDP */
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user